From 5b3193d59105949952dee43c73362f33608ccbbd Mon Sep 17 00:00:00 2001 From: Nareshkumar Rao Date: Fri, 23 Jul 2021 19:03:15 +0200 Subject: [PATCH] initial expressjs --- __pycache__/api.cpython-38.pyc | Bin 325 -> 0 bytes api.py | 18 - venv/bin/Activate.ps1 | 241 - venv/bin/activate | 76 - venv/bin/activate.csh | 37 - venv/bin/activate.fish | 75 - venv/bin/easy_install | 8 - venv/bin/easy_install-3.8 | 8 - venv/bin/flask | 8 - venv/bin/pip | 8 - venv/bin/pip3 | 8 - venv/bin/pip3.8 | 8 - venv/bin/python | 1 - venv/bin/python3 | 1 - .../Flask-2.0.1.dist-info/INSTALLER | 1 - .../Flask-2.0.1.dist-info/LICENSE.rst | 28 - .../Flask-2.0.1.dist-info/METADATA | 124 - .../Flask-2.0.1.dist-info/RECORD | 51 - .../site-packages/Flask-2.0.1.dist-info/WHEEL | 5 - .../Flask-2.0.1.dist-info/entry_points.txt | 3 - .../Flask-2.0.1.dist-info/top_level.txt | 1 - .../Jinja2-3.0.1.dist-info/INSTALLER | 1 - .../Jinja2-3.0.1.dist-info/LICENSE.rst | 28 - .../Jinja2-3.0.1.dist-info/METADATA | 112 - .../Jinja2-3.0.1.dist-info/RECORD | 58 - .../Jinja2-3.0.1.dist-info/WHEEL | 5 - .../Jinja2-3.0.1.dist-info/entry_points.txt | 3 - .../Jinja2-3.0.1.dist-info/top_level.txt | 1 - .../MarkupSafe-2.0.1.dist-info/INSTALLER | 1 - .../MarkupSafe-2.0.1.dist-info/LICENSE.rst | 28 - .../MarkupSafe-2.0.1.dist-info/METADATA | 100 - .../MarkupSafe-2.0.1.dist-info/RECORD | 14 - .../MarkupSafe-2.0.1.dist-info/WHEEL | 5 - .../MarkupSafe-2.0.1.dist-info/top_level.txt | 1 - .../Werkzeug-2.0.1.dist-info/INSTALLER | 1 - .../Werkzeug-2.0.1.dist-info/LICENSE.rst | 28 - .../Werkzeug-2.0.1.dist-info/METADATA | 128 - .../Werkzeug-2.0.1.dist-info/RECORD | 111 - .../Werkzeug-2.0.1.dist-info/WHEEL | 5 - .../Werkzeug-2.0.1.dist-info/top_level.txt | 1 - .../__pycache__/easy_install.cpython-38.pyc | Bin 281 -> 0 bytes .../click-8.0.1.dist-info/INSTALLER | 1 - .../click-8.0.1.dist-info/LICENSE.rst | 28 - .../click-8.0.1.dist-info/METADATA | 110 - .../click-8.0.1.dist-info/RECORD | 41 - .../site-packages/click-8.0.1.dist-info/WHEEL | 5 - .../click-8.0.1.dist-info/top_level.txt | 1 - .../python3.8/site-packages/click/__init__.py | 75 - .../click/__pycache__/__init__.cpython-38.pyc | Bin 2659 -> 0 bytes .../click/__pycache__/_compat.cpython-38.pyc | Bin 16072 -> 0 bytes .../__pycache__/_termui_impl.cpython-38.pyc | Bin 15738 -> 0 bytes .../__pycache__/_textwrap.cpython-38.pyc | Bin 1485 -> 0 bytes .../__pycache__/_unicodefun.cpython-38.pyc | Bin 2302 -> 0 bytes .../__pycache__/_winconsole.cpython-38.pyc | Bin 7766 -> 0 bytes .../click/__pycache__/core.cpython-38.pyc | Bin 88011 -> 0 bytes .../__pycache__/decorators.cpython-38.pyc | Bin 14233 -> 0 bytes .../__pycache__/exceptions.cpython-38.pyc | Bin 10116 -> 0 bytes .../__pycache__/formatting.cpython-38.pyc | Bin 9366 -> 0 bytes .../click/__pycache__/globals.cpython-38.pyc | Bin 2379 -> 0 bytes .../click/__pycache__/parser.cpython-38.pyc | Bin 13598 -> 0 bytes .../shell_completion.cpython-38.pyc | Bin 16645 -> 0 bytes .../click/__pycache__/termui.cpython-38.pyc | Bin 26495 -> 0 bytes .../click/__pycache__/testing.cpython-38.pyc | Bin 14822 -> 0 bytes .../click/__pycache__/types.cpython-38.pyc | Bin 33062 -> 0 bytes .../click/__pycache__/utils.cpython-38.pyc | Bin 17750 -> 0 bytes .../python3.8/site-packages/click/_compat.py | 627 -- .../site-packages/click/_termui_impl.py | 717 -- .../site-packages/click/_textwrap.py | 49 - .../site-packages/click/_unicodefun.py | 100 - .../site-packages/click/_winconsole.py | 279 - .../lib/python3.8/site-packages/click/core.py | 2957 --------- .../site-packages/click/decorators.py | 437 -- .../site-packages/click/exceptions.py | 287 - .../site-packages/click/formatting.py | 301 - .../python3.8/site-packages/click/globals.py | 69 - .../python3.8/site-packages/click/parser.py | 529 -- .../python3.8/site-packages/click/py.typed | 0 .../site-packages/click/shell_completion.py | 574 -- .../python3.8/site-packages/click/termui.py | 807 --- .../python3.8/site-packages/click/testing.py | 479 -- .../python3.8/site-packages/click/types.py | 1052 --- .../python3.8/site-packages/click/utils.py | 579 -- .../python3.8/site-packages/easy_install.py | 5 - .../python3.8/site-packages/flask/__init__.py | 46 - .../python3.8/site-packages/flask/__main__.py | 3 - .../flask/__pycache__/__init__.cpython-38.pyc | Bin 1850 -> 0 bytes .../flask/__pycache__/__main__.cpython-38.pyc | Bin 181 -> 0 bytes .../flask/__pycache__/app.cpython-38.pyc | Bin 63448 -> 0 bytes .../__pycache__/blueprints.cpython-38.pyc | Bin 21713 -> 0 bytes .../flask/__pycache__/cli.cpython-38.pyc | Bin 26941 -> 0 bytes .../flask/__pycache__/config.cpython-38.pyc | Bin 11418 -> 0 bytes .../flask/__pycache__/ctx.cpython-38.pyc | Bin 15415 -> 0 bytes .../__pycache__/debughelpers.cpython-38.pyc | Bin 6416 -> 0 bytes .../flask/__pycache__/globals.cpython-38.pyc | Bin 1802 -> 0 bytes .../flask/__pycache__/helpers.cpython-38.pyc | Bin 27168 -> 0 bytes .../flask/__pycache__/logging.cpython-38.pyc | Bin 2421 -> 0 bytes .../flask/__pycache__/scaffold.cpython-38.pyc | Bin 24651 -> 0 bytes .../flask/__pycache__/sessions.cpython-38.pyc | Bin 13086 -> 0 bytes .../flask/__pycache__/signals.cpython-38.pyc | Bin 2333 -> 0 bytes .../__pycache__/templating.cpython-38.pyc | Bin 5526 -> 0 bytes .../flask/__pycache__/testing.cpython-38.pyc | Bin 8935 -> 0 bytes .../flask/__pycache__/typing.cpython-38.pyc | Bin 1265 -> 0 bytes .../flask/__pycache__/views.cpython-38.pyc | Bin 4893 -> 0 bytes .../flask/__pycache__/wrappers.cpython-38.pyc | Bin 4990 -> 0 bytes venv/lib/python3.8/site-packages/flask/app.py | 2088 ------ .../site-packages/flask/blueprints.py | 603 -- venv/lib/python3.8/site-packages/flask/cli.py | 994 --- .../python3.8/site-packages/flask/config.py | 291 - venv/lib/python3.8/site-packages/flask/ctx.py | 480 -- .../site-packages/flask/debughelpers.py | 171 - .../python3.8/site-packages/flask/globals.py | 59 - .../python3.8/site-packages/flask/helpers.py | 836 --- .../site-packages/flask/json/__init__.py | 350 - .../json/__pycache__/__init__.cpython-38.pyc | Bin 11297 -> 0 bytes .../flask/json/__pycache__/tag.cpython-38.pyc | Bin 11446 -> 0 bytes .../python3.8/site-packages/flask/json/tag.py | 312 - .../python3.8/site-packages/flask/logging.py | 74 - .../python3.8/site-packages/flask/py.typed | 0 .../python3.8/site-packages/flask/scaffold.py | 864 --- .../python3.8/site-packages/flask/sessions.py | 404 -- .../python3.8/site-packages/flask/signals.py | 56 - .../site-packages/flask/templating.py | 165 - .../python3.8/site-packages/flask/testing.py | 280 - .../python3.8/site-packages/flask/typing.py | 46 - .../python3.8/site-packages/flask/views.py | 157 - .../python3.8/site-packages/flask/wrappers.py | 167 - .../itsdangerous-2.0.1.dist-info/INSTALLER | 1 - .../itsdangerous-2.0.1.dist-info/LICENSE.rst | 28 - .../itsdangerous-2.0.1.dist-info/METADATA | 96 - .../itsdangerous-2.0.1.dist-info/RECORD | 25 - .../itsdangerous-2.0.1.dist-info/WHEEL | 5 - .../top_level.txt | 1 - .../site-packages/itsdangerous/__init__.py | 22 - .../__pycache__/__init__.cpython-38.pyc | Bin 976 -> 0 bytes .../__pycache__/_json.cpython-38.pyc | Bin 1506 -> 0 bytes .../__pycache__/encoding.cpython-38.pyc | Bin 1830 -> 0 bytes .../__pycache__/exc.cpython-38.pyc | Bin 3403 -> 0 bytes .../__pycache__/jws.cpython-38.pyc | Bin 7534 -> 0 bytes .../__pycache__/serializer.cpython-38.pyc | Bin 9689 -> 0 bytes .../__pycache__/signer.cpython-38.pyc | Bin 8412 -> 0 bytes .../__pycache__/timed.cpython-38.pyc | Bin 6329 -> 0 bytes .../__pycache__/url_safe.cpython-38.pyc | Bin 2661 -> 0 bytes .../site-packages/itsdangerous/_json.py | 34 - .../site-packages/itsdangerous/encoding.py | 54 - .../site-packages/itsdangerous/exc.py | 107 - .../site-packages/itsdangerous/jws.py | 259 - .../site-packages/itsdangerous/py.typed | 0 .../site-packages/itsdangerous/serializer.py | 295 - .../site-packages/itsdangerous/signer.py | 257 - .../site-packages/itsdangerous/timed.py | 227 - .../site-packages/itsdangerous/url_safe.py | 80 - .../site-packages/jinja2/__init__.py | 45 - .../__pycache__/__init__.cpython-38.pyc | Bin 1875 -> 0 bytes .../__pycache__/_identifier.cpython-38.pyc | Bin 1862 -> 0 bytes .../__pycache__/async_utils.cpython-38.pyc | Bin 2271 -> 0 bytes .../jinja2/__pycache__/bccache.cpython-38.pyc | Bin 13226 -> 0 bytes .../__pycache__/compiler.cpython-38.pyc | Bin 54204 -> 0 bytes .../__pycache__/constants.cpython-38.pyc | Bin 1506 -> 0 bytes .../jinja2/__pycache__/debug.cpython-38.pyc | Bin 5529 -> 0 bytes .../__pycache__/defaults.cpython-38.pyc | Bin 1308 -> 0 bytes .../__pycache__/environment.cpython-38.pyc | Bin 53448 -> 0 bytes .../__pycache__/exceptions.cpython-38.pyc | Bin 5549 -> 0 bytes .../jinja2/__pycache__/ext.cpython-38.pyc | Bin 26339 -> 0 bytes .../jinja2/__pycache__/filters.cpython-38.pyc | Bin 50116 -> 0 bytes .../__pycache__/idtracking.cpython-38.pyc | Bin 11043 -> 0 bytes .../jinja2/__pycache__/lexer.cpython-38.pyc | Bin 20334 -> 0 bytes .../jinja2/__pycache__/loaders.cpython-38.pyc | Bin 20155 -> 0 bytes .../jinja2/__pycache__/meta.cpython-38.pyc | Bin 3766 -> 0 bytes .../__pycache__/nativetypes.cpython-38.pyc | Bin 4775 -> 0 bytes .../jinja2/__pycache__/nodes.cpython-38.pyc | Bin 40842 -> 0 bytes .../__pycache__/optimizer.cpython-38.pyc | Bin 1895 -> 0 bytes .../jinja2/__pycache__/parser.cpython-38.pyc | Bin 27501 -> 0 bytes .../jinja2/__pycache__/runtime.cpython-38.pyc | Bin 33142 -> 0 bytes .../jinja2/__pycache__/sandbox.cpython-38.pyc | Bin 11907 -> 0 bytes .../jinja2/__pycache__/tests.cpython-38.pyc | Bin 6542 -> 0 bytes .../jinja2/__pycache__/utils.cpython-38.pyc | Bin 27380 -> 0 bytes .../jinja2/__pycache__/visitor.cpython-38.pyc | Bin 3824 -> 0 bytes .../site-packages/jinja2/_identifier.py | 6 - .../site-packages/jinja2/async_utils.py | 68 - .../python3.8/site-packages/jinja2/bccache.py | 364 -- .../site-packages/jinja2/compiler.py | 1954 ------ .../site-packages/jinja2/constants.py | 20 - .../python3.8/site-packages/jinja2/debug.py | 279 - .../site-packages/jinja2/defaults.py | 48 - .../site-packages/jinja2/environment.py | 1674 ----- .../site-packages/jinja2/exceptions.py | 166 - .../lib/python3.8/site-packages/jinja2/ext.py | 879 --- .../python3.8/site-packages/jinja2/filters.py | 1824 ------ .../site-packages/jinja2/idtracking.py | 318 - .../python3.8/site-packages/jinja2/lexer.py | 869 --- .../python3.8/site-packages/jinja2/loaders.py | 642 -- .../python3.8/site-packages/jinja2/meta.py | 111 - .../site-packages/jinja2/nativetypes.py | 118 - .../python3.8/site-packages/jinja2/nodes.py | 1205 ---- .../site-packages/jinja2/optimizer.py | 47 - .../python3.8/site-packages/jinja2/parser.py | 1040 --- .../python3.8/site-packages/jinja2/py.typed | 0 .../python3.8/site-packages/jinja2/runtime.py | 1103 ---- .../python3.8/site-packages/jinja2/sandbox.py | 428 -- .../python3.8/site-packages/jinja2/tests.py | 255 - .../python3.8/site-packages/jinja2/utils.py | 854 --- .../python3.8/site-packages/jinja2/visitor.py | 92 - .../site-packages/markupsafe/__init__.py | 288 - .../__pycache__/__init__.cpython-38.pyc | Bin 10683 -> 0 bytes .../__pycache__/_native.cpython-38.pyc | Bin 2308 -> 0 bytes .../site-packages/markupsafe/_native.py | 75 - .../site-packages/markupsafe/_speedups.c | 339 - .../_speedups.cpython-38-x86_64-linux-gnu.so | Bin 53208 -> 0 bytes .../site-packages/markupsafe/_speedups.pyi | 9 - .../site-packages/markupsafe/py.typed | 0 .../pip-20.0.2.dist-info/INSTALLER | 1 - .../pip-20.0.2.dist-info/LICENSE.txt | 20 - .../pip-20.0.2.dist-info/METADATA | 84 - .../site-packages/pip-20.0.2.dist-info/RECORD | 246 - .../site-packages/pip-20.0.2.dist-info/WHEEL | 6 - .../pip-20.0.2.dist-info/entry_points.txt | 5 - .../pip-20.0.2.dist-info/top_level.txt | 1 - .../python3.8/site-packages/pip/__init__.py | 18 - .../python3.8/site-packages/pip/__main__.py | 19 - .../pip/__pycache__/__init__.cpython-38.pyc | Bin 629 -> 0 bytes .../pip/__pycache__/__main__.cpython-38.pyc | Bin 422 -> 0 bytes .../site-packages/pip/_internal/__init__.py | 18 - .../__pycache__/__init__.cpython-38.pyc | Bin 678 -> 0 bytes .../__pycache__/build_env.cpython-38.pyc | Bin 7483 -> 0 bytes .../__pycache__/cache.cpython-38.pyc | Bin 8700 -> 0 bytes .../__pycache__/configuration.cpython-38.pyc | Bin 10645 -> 0 bytes .../__pycache__/exceptions.cpython-38.pyc | Bin 12482 -> 0 bytes .../__pycache__/legacy_resolve.cpython-38.pyc | Bin 9898 -> 0 bytes .../__pycache__/locations.cpython-38.pyc | Bin 4492 -> 0 bytes .../_internal/__pycache__/main.cpython-38.pyc | Bin 615 -> 0 bytes .../__pycache__/pep425tags.cpython-38.pyc | Bin 3584 -> 0 bytes .../__pycache__/pyproject.cpython-38.pyc | Bin 3732 -> 0 bytes .../self_outdated_check.cpython-38.pyc | Bin 5493 -> 0 bytes .../__pycache__/wheel_builder.cpython-38.pyc | Bin 6699 -> 0 bytes .../site-packages/pip/_internal/build_env.py | 221 - .../site-packages/pip/_internal/cache.py | 329 - .../pip/_internal/cli/__init__.py | 4 - .../cli/__pycache__/__init__.cpython-38.pyc | Bin 236 -> 0 bytes .../__pycache__/autocompletion.cpython-38.pyc | Bin 4953 -> 0 bytes .../__pycache__/base_command.cpython-38.pyc | Bin 5847 -> 0 bytes .../cli/__pycache__/cmdoptions.cpython-38.pyc | Bin 20328 -> 0 bytes .../command_context.cpython-38.pyc | Bin 1311 -> 0 bytes .../cli/__pycache__/main.cpython-38.pyc | Bin 1406 -> 0 bytes .../__pycache__/main_parser.cpython-38.pyc | Bin 2159 -> 0 bytes .../cli/__pycache__/parser.cpython-38.pyc | Bin 8977 -> 0 bytes .../__pycache__/req_command.cpython-38.pyc | Bin 8289 -> 0 bytes .../__pycache__/status_codes.cpython-38.pyc | Bin 365 -> 0 bytes .../pip/_internal/cli/autocompletion.py | 164 - .../pip/_internal/cli/base_command.py | 226 - .../pip/_internal/cli/cmdoptions.py | 957 --- .../pip/_internal/cli/command_context.py | 36 - .../site-packages/pip/_internal/cli/main.py | 75 - .../pip/_internal/cli/main_parser.py | 99 - .../site-packages/pip/_internal/cli/parser.py | 265 - .../pip/_internal/cli/req_command.py | 333 - .../pip/_internal/cli/status_codes.py | 8 - .../pip/_internal/commands/__init__.py | 114 - .../__pycache__/__init__.cpython-38.pyc | Bin 2852 -> 0 bytes .../commands/__pycache__/check.cpython-38.pyc | Bin 1312 -> 0 bytes .../__pycache__/completion.cpython-38.pyc | Bin 3013 -> 0 bytes .../__pycache__/configuration.cpython-38.pyc | Bin 6575 -> 0 bytes .../commands/__pycache__/debug.cpython-38.pyc | Bin 4089 -> 0 bytes .../__pycache__/download.cpython-38.pyc | Bin 3921 -> 0 bytes .../__pycache__/freeze.cpython-38.pyc | Bin 2929 -> 0 bytes .../commands/__pycache__/hash.cpython-38.pyc | Bin 1990 -> 0 bytes .../commands/__pycache__/help.cpython-38.pyc | Bin 1186 -> 0 bytes .../__pycache__/install.cpython-38.pyc | Bin 16661 -> 0 bytes .../commands/__pycache__/list.cpython-38.pyc | Bin 9042 -> 0 bytes .../__pycache__/search.cpython-38.pyc | Bin 4484 -> 0 bytes .../commands/__pycache__/show.cpython-38.pyc | Bin 6325 -> 0 bytes .../__pycache__/uninstall.cpython-38.pyc | Bin 2694 -> 0 bytes .../commands/__pycache__/wheel.cpython-38.pyc | Bin 5246 -> 0 bytes .../pip/_internal/commands/check.py | 45 - .../pip/_internal/commands/completion.py | 96 - .../pip/_internal/commands/configuration.py | 233 - .../pip/_internal/commands/debug.py | 142 - .../pip/_internal/commands/download.py | 147 - .../pip/_internal/commands/freeze.py | 103 - .../pip/_internal/commands/hash.py | 58 - .../pip/_internal/commands/help.py | 41 - .../pip/_internal/commands/install.py | 727 --- .../pip/_internal/commands/list.py | 315 - .../pip/_internal/commands/search.py | 145 - .../pip/_internal/commands/show.py | 180 - .../pip/_internal/commands/uninstall.py | 82 - .../pip/_internal/commands/wheel.py | 197 - .../pip/_internal/configuration.py | 422 -- .../pip/_internal/distributions/__init__.py | 24 - .../__pycache__/__init__.cpython-38.pyc | Bin 812 -> 0 bytes .../__pycache__/base.cpython-38.pyc | Bin 1928 -> 0 bytes .../__pycache__/installed.cpython-38.pyc | Bin 1208 -> 0 bytes .../__pycache__/sdist.cpython-38.pyc | Bin 3471 -> 0 bytes .../__pycache__/wheel.cpython-38.pyc | Bin 1560 -> 0 bytes .../pip/_internal/distributions/base.py | 45 - .../pip/_internal/distributions/installed.py | 24 - .../pip/_internal/distributions/sdist.py | 104 - .../pip/_internal/distributions/wheel.py | 36 - .../site-packages/pip/_internal/exceptions.py | 308 - .../pip/_internal/index/__init__.py | 2 - .../index/__pycache__/__init__.cpython-38.pyc | Bin 190 -> 0 bytes .../__pycache__/collector.cpython-38.pyc | Bin 14156 -> 0 bytes .../__pycache__/package_finder.cpython-38.pyc | Bin 25749 -> 0 bytes .../pip/_internal/index/collector.py | 544 -- .../pip/_internal/index/package_finder.py | 1013 --- .../pip/_internal/legacy_resolve.py | 430 -- .../site-packages/pip/_internal/locations.py | 194 - .../site-packages/pip/_internal/main.py | 16 - .../pip/_internal/models/__init__.py | 2 - .../__pycache__/__init__.cpython-38.pyc | Bin 224 -> 0 bytes .../__pycache__/candidate.cpython-38.pyc | Bin 1421 -> 0 bytes .../__pycache__/format_control.cpython-38.pyc | Bin 2416 -> 0 bytes .../models/__pycache__/index.cpython-38.pyc | Bin 1146 -> 0 bytes .../models/__pycache__/link.cpython-38.pyc | Bin 6659 -> 0 bytes .../models/__pycache__/scheme.cpython-38.pyc | Bin 862 -> 0 bytes .../__pycache__/search_scope.cpython-38.pyc | Bin 3253 -> 0 bytes .../selection_prefs.cpython-38.pyc | Bin 1596 -> 0 bytes .../__pycache__/target_python.cpython-38.pyc | Bin 3219 -> 0 bytes .../models/__pycache__/wheel.cpython-38.pyc | Bin 3182 -> 0 bytes .../pip/_internal/models/candidate.py | 36 - .../pip/_internal/models/format_control.py | 84 - .../pip/_internal/models/index.py | 31 - .../pip/_internal/models/link.py | 227 - .../pip/_internal/models/scheme.py | 25 - .../pip/_internal/models/search_scope.py | 114 - .../pip/_internal/models/selection_prefs.py | 47 - .../pip/_internal/models/target_python.py | 107 - .../pip/_internal/models/wheel.py | 78 - .../pip/_internal/network/__init__.py | 2 - .../__pycache__/__init__.cpython-38.pyc | Bin 212 -> 0 bytes .../network/__pycache__/auth.cpython-38.pyc | Bin 6978 -> 0 bytes .../network/__pycache__/cache.cpython-38.pyc | Bin 2691 -> 0 bytes .../__pycache__/download.cpython-38.pyc | Bin 4370 -> 0 bytes .../__pycache__/session.cpython-38.pyc | Bin 8851 -> 0 bytes .../network/__pycache__/utils.cpython-38.pyc | Bin 706 -> 0 bytes .../network/__pycache__/xmlrpc.cpython-38.pyc | Bin 1574 -> 0 bytes .../pip/_internal/network/auth.py | 298 - .../pip/_internal/network/cache.py | 81 - .../pip/_internal/network/download.py | 200 - .../pip/_internal/network/session.py | 405 -- .../pip/_internal/network/utils.py | 48 - .../pip/_internal/network/xmlrpc.py | 44 - .../pip/_internal/operations/__init__.py | 0 .../__pycache__/__init__.cpython-38.pyc | Bin 160 -> 0 bytes .../__pycache__/check.cpython-38.pyc | Bin 3656 -> 0 bytes .../__pycache__/freeze.cpython-38.pyc | Bin 5803 -> 0 bytes .../__pycache__/prepare.cpython-38.pyc | Bin 11162 -> 0 bytes .../_internal/operations/build/__init__.py | 0 .../build/__pycache__/__init__.cpython-38.pyc | Bin 166 -> 0 bytes .../build/__pycache__/metadata.cpython-38.pyc | Bin 1208 -> 0 bytes .../metadata_legacy.cpython-38.pyc | Bin 3268 -> 0 bytes .../build/__pycache__/wheel.cpython-38.pyc | Bin 1306 -> 0 bytes .../__pycache__/wheel_legacy.cpython-38.pyc | Bin 2567 -> 0 bytes .../_internal/operations/build/metadata.py | 40 - .../operations/build/metadata_legacy.py | 122 - .../pip/_internal/operations/build/wheel.py | 46 - .../operations/build/wheel_legacy.py | 115 - .../pip/_internal/operations/check.py | 163 - .../pip/_internal/operations/freeze.py | 265 - .../_internal/operations/install/__init__.py | 2 - .../__pycache__/__init__.cpython-38.pyc | Bin 224 -> 0 bytes .../editable_legacy.cpython-38.pyc | Bin 1302 -> 0 bytes .../install/__pycache__/legacy.cpython-38.pyc | Bin 3048 -> 0 bytes .../install/__pycache__/wheel.cpython-38.pyc | Bin 14582 -> 0 bytes .../operations/install/editable_legacy.py | 52 - .../_internal/operations/install/legacy.py | 129 - .../pip/_internal/operations/install/wheel.py | 615 -- .../pip/_internal/operations/prepare.py | 591 -- .../site-packages/pip/_internal/pep425tags.py | 167 - .../site-packages/pip/_internal/pyproject.py | 196 - .../pip/_internal/req/__init__.py | 92 - .../req/__pycache__/__init__.cpython-38.pyc | Bin 2194 -> 0 bytes .../__pycache__/constructors.cpython-38.pyc | Bin 10363 -> 0 bytes .../req/__pycache__/req_file.cpython-38.pyc | Bin 12702 -> 0 bytes .../__pycache__/req_install.cpython-38.pyc | Bin 21338 -> 0 bytes .../req/__pycache__/req_set.cpython-38.pyc | Bin 6021 -> 0 bytes .../__pycache__/req_tracker.cpython-38.pyc | Bin 4041 -> 0 bytes .../__pycache__/req_uninstall.cpython-38.pyc | Bin 17427 -> 0 bytes .../pip/_internal/req/constructors.py | 436 -- .../pip/_internal/req/req_file.py | 546 -- .../pip/_internal/req/req_install.py | 830 --- .../pip/_internal/req/req_set.py | 209 - .../pip/_internal/req/req_tracker.py | 150 - .../pip/_internal/req/req_uninstall.py | 644 -- .../pip/_internal/self_outdated_check.py | 242 - .../pip/_internal/utils/__init__.py | 0 .../utils/__pycache__/__init__.cpython-38.pyc | Bin 155 -> 0 bytes .../utils/__pycache__/appdirs.cpython-38.pyc | Bin 1351 -> 0 bytes .../utils/__pycache__/compat.cpython-38.pyc | Bin 6120 -> 0 bytes .../__pycache__/deprecation.cpython-38.pyc | Bin 2826 -> 0 bytes .../__pycache__/distutils_args.cpython-38.pyc | Bin 1139 -> 0 bytes .../utils/__pycache__/encoding.cpython-38.pyc | Bin 1247 -> 0 bytes .../__pycache__/entrypoints.cpython-38.pyc | Bin 1299 -> 0 bytes .../__pycache__/filesystem.cpython-38.pyc | Bin 4035 -> 0 bytes .../__pycache__/filetypes.cpython-38.pyc | Bin 556 -> 0 bytes .../utils/__pycache__/glibc.cpython-38.pyc | Bin 1708 -> 0 bytes .../utils/__pycache__/hashes.cpython-38.pyc | Bin 4144 -> 0 bytes .../inject_securetransport.cpython-38.pyc | Bin 932 -> 0 bytes .../utils/__pycache__/logging.cpython-38.pyc | Bin 9159 -> 0 bytes .../__pycache__/marker_files.cpython-38.pyc | Bin 928 -> 0 bytes .../utils/__pycache__/misc.cpython-38.pyc | Bin 23778 -> 0 bytes .../utils/__pycache__/models.cpython-38.pyc | Bin 1924 -> 0 bytes .../__pycache__/packaging.cpython-38.pyc | Bin 2608 -> 0 bytes .../__pycache__/pkg_resources.cpython-38.pyc | Bin 1822 -> 0 bytes .../setuptools_build.cpython-38.pyc | Bin 2927 -> 0 bytes .../__pycache__/subprocess.cpython-38.pyc | Bin 5598 -> 0 bytes .../utils/__pycache__/temp_dir.cpython-38.pyc | Bin 6711 -> 0 bytes .../utils/__pycache__/typing.cpython-38.pyc | Bin 1437 -> 0 bytes .../utils/__pycache__/ui.cpython-38.pyc | Bin 11802 -> 0 bytes .../__pycache__/unpacking.cpython-38.pyc | Bin 6075 -> 0 bytes .../utils/__pycache__/urls.cpython-38.pyc | Bin 1465 -> 0 bytes .../__pycache__/virtualenv.cpython-38.pyc | Bin 3280 -> 0 bytes .../utils/__pycache__/wheel.cpython-38.pyc | Bin 6325 -> 0 bytes .../pip/_internal/utils/appdirs.py | 44 - .../pip/_internal/utils/compat.py | 269 - .../pip/_internal/utils/deprecation.py | 104 - .../pip/_internal/utils/distutils_args.py | 48 - .../pip/_internal/utils/encoding.py | 42 - .../pip/_internal/utils/entrypoints.py | 31 - .../pip/_internal/utils/filesystem.py | 171 - .../pip/_internal/utils/filetypes.py | 16 - .../pip/_internal/utils/glibc.py | 98 - .../pip/_internal/utils/hashes.py | 131 - .../_internal/utils/inject_securetransport.py | 36 - .../pip/_internal/utils/logging.py | 398 -- .../pip/_internal/utils/marker_files.py | 25 - .../site-packages/pip/_internal/utils/misc.py | 904 --- .../pip/_internal/utils/models.py | 42 - .../pip/_internal/utils/packaging.py | 94 - .../pip/_internal/utils/pkg_resources.py | 44 - .../pip/_internal/utils/setuptools_build.py | 181 - .../pip/_internal/utils/subprocess.py | 278 - .../pip/_internal/utils/temp_dir.py | 250 - .../pip/_internal/utils/typing.py | 38 - .../site-packages/pip/_internal/utils/ui.py | 428 -- .../pip/_internal/utils/unpacking.py | 272 - .../site-packages/pip/_internal/utils/urls.py | 54 - .../pip/_internal/utils/virtualenv.py | 115 - .../pip/_internal/utils/wheel.py | 225 - .../pip/_internal/vcs/__init__.py | 15 - .../vcs/__pycache__/__init__.cpython-38.pyc | Bin 448 -> 0 bytes .../vcs/__pycache__/bazaar.cpython-38.pyc | Bin 3747 -> 0 bytes .../vcs/__pycache__/git.cpython-38.pyc | Bin 9559 -> 0 bytes .../vcs/__pycache__/mercurial.cpython-38.pyc | Bin 4888 -> 0 bytes .../vcs/__pycache__/subversion.cpython-38.pyc | Bin 8487 -> 0 bytes .../__pycache__/versioncontrol.cpython-38.pyc | Bin 19216 -> 0 bytes .../site-packages/pip/_internal/vcs/bazaar.py | 120 - .../site-packages/pip/_internal/vcs/git.py | 395 -- .../pip/_internal/vcs/mercurial.py | 155 - .../pip/_internal/vcs/subversion.py | 333 - .../pip/_internal/vcs/versioncontrol.py | 700 -- .../pip/_internal/wheel_builder.py | 305 - .../site-packages/pip/_vendor/__init__.py | 119 - .../__pycache__/__init__.cpython-38.pyc | Bin 3039 -> 0 bytes .../pkg_resources-0.0.0.dist-info/AUTHORS.txt | 562 -- .../pkg_resources-0.0.0.dist-info/INSTALLER | 1 - .../pkg_resources-0.0.0.dist-info/LICENSE.txt | 20 - .../pkg_resources-0.0.0.dist-info/METADATA | 13 - .../pkg_resources-0.0.0.dist-info/RECORD | 38 - .../pkg_resources-0.0.0.dist-info/WHEEL | 6 - .../site-packages/pkg_resources/__init__.py | 3296 ---------- .../__pycache__/__init__.cpython-38.pyc | Bin 100356 -> 0 bytes .../__pycache__/py31compat.cpython-38.pyc | Bin 600 -> 0 bytes .../pkg_resources/_vendor/__init__.py | 0 .../__pycache__/__init__.cpython-38.pyc | Bin 157 -> 0 bytes .../__pycache__/appdirs.cpython-38.pyc | Bin 20510 -> 0 bytes .../__pycache__/pyparsing.cpython-38.pyc | Bin 201634 -> 0 bytes .../_vendor/__pycache__/six.cpython-38.pyc | Bin 24430 -> 0 bytes .../pkg_resources/_vendor/appdirs.py | 608 -- .../_vendor/packaging/__about__.py | 21 - .../_vendor/packaging/__init__.py | 14 - .../__pycache__/__about__.cpython-38.pyc | Bin 707 -> 0 bytes .../__pycache__/__init__.cpython-38.pyc | Bin 545 -> 0 bytes .../__pycache__/_compat.cpython-38.pyc | Bin 981 -> 0 bytes .../__pycache__/_structures.cpython-38.pyc | Bin 2763 -> 0 bytes .../__pycache__/markers.cpython-38.pyc | Bin 8919 -> 0 bytes .../__pycache__/requirements.cpython-38.pyc | Bin 3878 -> 0 bytes .../__pycache__/specifiers.cpython-38.pyc | Bin 19787 -> 0 bytes .../__pycache__/utils.cpython-38.pyc | Bin 466 -> 0 bytes .../__pycache__/version.cpython-38.pyc | Bin 10634 -> 0 bytes .../_vendor/packaging/_compat.py | 30 - .../_vendor/packaging/_structures.py | 68 - .../_vendor/packaging/markers.py | 301 - .../_vendor/packaging/requirements.py | 127 - .../_vendor/packaging/specifiers.py | 774 --- .../pkg_resources/_vendor/packaging/utils.py | 14 - .../_vendor/packaging/version.py | 393 -- .../pkg_resources/_vendor/pyparsing.py | 5742 ----------------- .../pkg_resources/_vendor/six.py | 868 --- .../pkg_resources/extern/__init__.py | 73 - .../__pycache__/__init__.cpython-38.pyc | Bin 2406 -> 0 bytes .../site-packages/pkg_resources/py31compat.py | 23 - .../setuptools-44.0.0.dist-info/AUTHORS.txt | 562 -- .../setuptools-44.0.0.dist-info/INSTALLER | 1 - .../setuptools-44.0.0.dist-info/LICENSE.txt | 20 - .../setuptools-44.0.0.dist-info/METADATA | 82 - .../setuptools-44.0.0.dist-info/RECORD | 163 - .../setuptools-44.0.0.dist-info/WHEEL | 6 - .../dependency_links.txt | 2 - .../entry_points.txt | 68 - .../setuptools-44.0.0.dist-info/top_level.txt | 3 - .../setuptools-44.0.0.dist-info/zip-safe | 1 - .../site-packages/setuptools/__init__.py | 228 - .../__pycache__/__init__.cpython-38.pyc | Bin 7768 -> 0 bytes .../_deprecation_warning.cpython-38.pyc | Bin 516 -> 0 bytes .../__pycache__/_imp.cpython-38.pyc | Bin 1890 -> 0 bytes .../__pycache__/archive_util.cpython-38.pyc | Bin 5128 -> 0 bytes .../__pycache__/build_meta.cpython-38.pyc | Bin 8495 -> 0 bytes .../__pycache__/config.cpython-38.pyc | Bin 17896 -> 0 bytes .../__pycache__/dep_util.cpython-38.pyc | Bin 819 -> 0 bytes .../__pycache__/depends.cpython-38.pyc | Bin 5216 -> 0 bytes .../__pycache__/dist.cpython-38.pyc | Bin 42326 -> 0 bytes .../__pycache__/errors.cpython-38.pyc | Bin 816 -> 0 bytes .../__pycache__/extension.cpython-38.pyc | Bin 1961 -> 0 bytes .../__pycache__/glob.cpython-38.pyc | Bin 3733 -> 0 bytes .../__pycache__/installer.cpython-38.pyc | Bin 4102 -> 0 bytes .../__pycache__/launch.cpython-38.pyc | Bin 824 -> 0 bytes .../__pycache__/lib2to3_ex.cpython-38.pyc | Bin 2411 -> 0 bytes .../__pycache__/monkey.cpython-38.pyc | Bin 4644 -> 0 bytes .../__pycache__/msvc.cpython-38.pyc | Bin 39631 -> 0 bytes .../__pycache__/namespaces.cpython-38.pyc | Bin 3616 -> 0 bytes .../__pycache__/package_index.cpython-38.pyc | Bin 32970 -> 0 bytes .../__pycache__/py27compat.cpython-38.pyc | Bin 1749 -> 0 bytes .../__pycache__/py31compat.cpython-38.pyc | Bin 1191 -> 0 bytes .../__pycache__/py33compat.cpython-38.pyc | Bin 1408 -> 0 bytes .../__pycache__/py34compat.cpython-38.pyc | Bin 450 -> 0 bytes .../__pycache__/sandbox.cpython-38.pyc | Bin 15536 -> 0 bytes .../__pycache__/site-patch.cpython-38.pyc | Bin 1474 -> 0 bytes .../__pycache__/ssl_support.cpython-38.pyc | Bin 6855 -> 0 bytes .../__pycache__/unicode_utils.cpython-38.pyc | Bin 1151 -> 0 bytes .../__pycache__/version.cpython-38.pyc | Bin 292 -> 0 bytes .../__pycache__/wheel.cpython-38.pyc | Bin 7383 -> 0 bytes .../windows_support.cpython-38.pyc | Bin 989 -> 0 bytes .../setuptools/_deprecation_warning.py | 7 - .../site-packages/setuptools/_imp.py | 73 - .../setuptools/_vendor/__init__.py | 0 .../__pycache__/__init__.cpython-38.pyc | Bin 154 -> 0 bytes .../__pycache__/ordered_set.cpython-38.pyc | Bin 16412 -> 0 bytes .../__pycache__/pyparsing.cpython-38.pyc | Bin 201631 -> 0 bytes .../_vendor/__pycache__/six.cpython-38.pyc | Bin 24427 -> 0 bytes .../setuptools/_vendor/ordered_set.py | 488 -- .../setuptools/_vendor/packaging/__about__.py | 27 - .../setuptools/_vendor/packaging/__init__.py | 26 - .../__pycache__/__about__.cpython-38.pyc | Bin 704 -> 0 bytes .../__pycache__/__init__.cpython-38.pyc | Bin 542 -> 0 bytes .../__pycache__/_compat.cpython-38.pyc | Bin 978 -> 0 bytes .../__pycache__/_structures.cpython-38.pyc | Bin 2760 -> 0 bytes .../__pycache__/markers.cpython-38.pyc | Bin 8927 -> 0 bytes .../__pycache__/requirements.cpython-38.pyc | Bin 3995 -> 0 bytes .../__pycache__/specifiers.cpython-38.pyc | Bin 19734 -> 0 bytes .../packaging/__pycache__/tags.cpython-38.pyc | Bin 10811 -> 0 bytes .../__pycache__/utils.cpython-38.pyc | Bin 1435 -> 0 bytes .../__pycache__/version.cpython-38.pyc | Bin 12065 -> 0 bytes .../setuptools/_vendor/packaging/_compat.py | 31 - .../_vendor/packaging/_structures.py | 68 - .../setuptools/_vendor/packaging/markers.py | 296 - .../_vendor/packaging/requirements.py | 138 - .../_vendor/packaging/specifiers.py | 749 --- .../setuptools/_vendor/packaging/tags.py | 404 -- .../setuptools/_vendor/packaging/utils.py | 57 - .../setuptools/_vendor/packaging/version.py | 420 -- .../setuptools/_vendor/pyparsing.py | 5742 ----------------- .../site-packages/setuptools/_vendor/six.py | 868 --- .../site-packages/setuptools/archive_util.py | 173 - .../site-packages/setuptools/build_meta.py | 257 - .../site-packages/setuptools/cli-32.exe | Bin 65536 -> 0 bytes .../site-packages/setuptools/cli-64.exe | Bin 74752 -> 0 bytes .../site-packages/setuptools/cli.exe | Bin 65536 -> 0 bytes .../setuptools/command/__init__.py | 17 - .../__pycache__/__init__.cpython-38.pyc | Bin 712 -> 0 bytes .../command/__pycache__/alias.cpython-38.pyc | Bin 2392 -> 0 bytes .../__pycache__/bdist_egg.cpython-38.pyc | Bin 14182 -> 0 bytes .../__pycache__/bdist_rpm.cpython-38.pyc | Bin 1784 -> 0 bytes .../__pycache__/bdist_wininst.cpython-38.pyc | Bin 954 -> 0 bytes .../__pycache__/build_clib.cpython-38.pyc | Bin 2437 -> 0 bytes .../__pycache__/build_ext.cpython-38.pyc | Bin 9895 -> 0 bytes .../__pycache__/build_py.cpython-38.pyc | Bin 8641 -> 0 bytes .../__pycache__/develop.cpython-38.pyc | Bin 6501 -> 0 bytes .../__pycache__/dist_info.cpython-38.pyc | Bin 1361 -> 0 bytes .../__pycache__/easy_install.cpython-38.pyc | Bin 66694 -> 0 bytes .../__pycache__/egg_info.cpython-38.pyc | Bin 21773 -> 0 bytes .../__pycache__/install.cpython-38.pyc | Bin 4016 -> 0 bytes .../install_egg_info.cpython-38.pyc | Bin 2900 -> 0 bytes .../__pycache__/install_lib.cpython-38.pyc | Bin 5083 -> 0 bytes .../install_scripts.cpython-38.pyc | Bin 2273 -> 0 bytes .../__pycache__/py36compat.cpython-38.pyc | Bin 4610 -> 0 bytes .../__pycache__/register.cpython-38.pyc | Bin 811 -> 0 bytes .../command/__pycache__/rotate.cpython-38.pyc | Bin 2520 -> 0 bytes .../__pycache__/saveopts.cpython-38.pyc | Bin 889 -> 0 bytes .../command/__pycache__/sdist.cpython-38.pyc | Bin 7859 -> 0 bytes .../command/__pycache__/setopt.cpython-38.pyc | Bin 4537 -> 0 bytes .../command/__pycache__/test.cpython-38.pyc | Bin 8475 -> 0 bytes .../command/__pycache__/upload.cpython-38.pyc | Bin 784 -> 0 bytes .../__pycache__/upload_docs.cpython-38.pyc | Bin 6140 -> 0 bytes .../site-packages/setuptools/command/alias.py | 80 - .../setuptools/command/bdist_egg.py | 502 -- .../setuptools/command/bdist_rpm.py | 43 - .../setuptools/command/bdist_wininst.py | 21 - .../setuptools/command/build_clib.py | 98 - .../setuptools/command/build_ext.py | 327 - .../setuptools/command/build_py.py | 270 - .../setuptools/command/develop.py | 221 - .../setuptools/command/dist_info.py | 36 - .../setuptools/command/easy_install.py | 2402 ------- .../setuptools/command/egg_info.py | 717 -- .../setuptools/command/install.py | 125 - .../setuptools/command/install_egg_info.py | 82 - .../setuptools/command/install_lib.py | 147 - .../setuptools/command/install_scripts.py | 65 - .../setuptools/command/launcher manifest.xml | 15 - .../setuptools/command/py36compat.py | 136 - .../setuptools/command/register.py | 18 - .../setuptools/command/rotate.py | 66 - .../setuptools/command/saveopts.py | 22 - .../site-packages/setuptools/command/sdist.py | 252 - .../setuptools/command/setopt.py | 149 - .../site-packages/setuptools/command/test.py | 279 - .../setuptools/command/upload.py | 17 - .../setuptools/command/upload_docs.py | 206 - .../site-packages/setuptools/config.py | 659 -- .../site-packages/setuptools/dep_util.py | 23 - .../site-packages/setuptools/depends.py | 176 - .../site-packages/setuptools/dist.py | 1274 ---- .../site-packages/setuptools/errors.py | 16 - .../site-packages/setuptools/extension.py | 57 - .../setuptools/extern/__init__.py | 73 - .../__pycache__/__init__.cpython-38.pyc | Bin 2420 -> 0 bytes .../site-packages/setuptools/glob.py | 174 - .../site-packages/setuptools/gui-32.exe | Bin 65536 -> 0 bytes .../site-packages/setuptools/gui-64.exe | Bin 75264 -> 0 bytes .../site-packages/setuptools/gui.exe | Bin 65536 -> 0 bytes .../site-packages/setuptools/installer.py | 150 - .../site-packages/setuptools/launch.py | 35 - .../site-packages/setuptools/lib2to3_ex.py | 62 - .../site-packages/setuptools/monkey.py | 179 - .../site-packages/setuptools/msvc.py | 1679 ----- .../site-packages/setuptools/namespaces.py | 107 - .../site-packages/setuptools/package_index.py | 1136 ---- .../site-packages/setuptools/py27compat.py | 60 - .../site-packages/setuptools/py31compat.py | 32 - .../site-packages/setuptools/py33compat.py | 59 - .../site-packages/setuptools/py34compat.py | 13 - .../site-packages/setuptools/sandbox.py | 491 -- .../setuptools/script (dev).tmpl | 6 - .../site-packages/setuptools/script.tmpl | 3 - .../site-packages/setuptools/site-patch.py | 74 - .../site-packages/setuptools/ssl_support.py | 260 - .../site-packages/setuptools/unicode_utils.py | 44 - .../site-packages/setuptools/version.py | 6 - .../site-packages/setuptools/wheel.py | 220 - .../setuptools/windows_support.py | 29 - .../site-packages/werkzeug/__init__.py | 6 - .../__pycache__/__init__.cpython-38.pyc | Bin 318 -> 0 bytes .../__pycache__/_internal.cpython-38.pyc | Bin 18502 -> 0 bytes .../__pycache__/_reloader.cpython-38.pyc | Bin 11975 -> 0 bytes .../__pycache__/datastructures.cpython-38.pyc | Bin 106520 -> 0 bytes .../__pycache__/exceptions.cpython-38.pyc | Bin 30175 -> 0 bytes .../__pycache__/filesystem.cpython-38.pyc | Bin 2051 -> 0 bytes .../__pycache__/formparser.cpython-38.pyc | Bin 13907 -> 0 bytes .../werkzeug/__pycache__/http.cpython-38.pyc | Bin 38172 -> 0 bytes .../werkzeug/__pycache__/local.cpython-38.pyc | Bin 22268 -> 0 bytes .../__pycache__/routing.cpython-38.pyc | Bin 73063 -> 0 bytes .../__pycache__/security.cpython-38.pyc | Bin 8161 -> 0 bytes .../__pycache__/serving.cpython-38.pyc | Bin 30702 -> 0 bytes .../werkzeug/__pycache__/test.cpython-38.pyc | Bin 39002 -> 0 bytes .../__pycache__/testapp.cpython-38.pyc | Bin 9588 -> 0 bytes .../werkzeug/__pycache__/urls.cpython-38.pyc | Bin 36682 -> 0 bytes .../__pycache__/user_agent.cpython-38.pyc | Bin 1799 -> 0 bytes .../__pycache__/useragents.cpython-38.pyc | Bin 6837 -> 0 bytes .../werkzeug/__pycache__/utils.cpython-38.pyc | Bin 32885 -> 0 bytes .../werkzeug/__pycache__/wsgi.cpython-38.pyc | Bin 30230 -> 0 bytes .../site-packages/werkzeug/_internal.py | 626 -- .../site-packages/werkzeug/_reloader.py | 430 -- .../site-packages/werkzeug/datastructures.py | 3051 --------- .../site-packages/werkzeug/datastructures.pyi | 906 --- .../site-packages/werkzeug/debug/__init__.py | 501 -- .../debug/__pycache__/__init__.cpython-38.pyc | Bin 12948 -> 0 bytes .../debug/__pycache__/console.cpython-38.pyc | Bin 7887 -> 0 bytes .../debug/__pycache__/repr.cpython-38.pyc | Bin 8820 -> 0 bytes .../debug/__pycache__/tbtools.cpython-38.pyc | Bin 18020 -> 0 bytes .../site-packages/werkzeug/debug/console.py | 211 - .../site-packages/werkzeug/debug/repr.py | 284 - .../werkzeug/debug/shared/FONT_LICENSE | 96 - .../werkzeug/debug/shared/ICON_LICENSE.md | 6 - .../werkzeug/debug/shared/console.png | Bin 507 -> 0 bytes .../werkzeug/debug/shared/debugger.js | 359 -- .../werkzeug/debug/shared/less.png | Bin 191 -> 0 bytes .../werkzeug/debug/shared/more.png | Bin 200 -> 0 bytes .../werkzeug/debug/shared/source.png | Bin 818 -> 0 bytes .../werkzeug/debug/shared/style.css | 163 - .../werkzeug/debug/shared/ubuntu.ttf | Bin 70220 -> 0 bytes .../site-packages/werkzeug/debug/tbtools.py | 595 -- .../site-packages/werkzeug/exceptions.py | 943 --- .../site-packages/werkzeug/filesystem.py | 55 - .../site-packages/werkzeug/formparser.py | 495 -- .../python3.8/site-packages/werkzeug/http.py | 1388 ---- .../python3.8/site-packages/werkzeug/local.py | 666 -- .../werkzeug/middleware/__init__.py | 22 - .../__pycache__/__init__.cpython-38.pyc | Bin 663 -> 0 bytes .../__pycache__/dispatcher.cpython-38.pyc | Bin 2724 -> 0 bytes .../__pycache__/http_proxy.cpython-38.pyc | Bin 6783 -> 0 bytes .../__pycache__/lint.cpython-38.pyc | Bin 12686 -> 0 bytes .../__pycache__/profiler.cpython-38.pyc | Bin 4921 -> 0 bytes .../__pycache__/proxy_fix.cpython-38.pyc | Bin 6150 -> 0 bytes .../__pycache__/shared_data.cpython-38.pyc | Bin 9826 -> 0 bytes .../werkzeug/middleware/dispatcher.py | 78 - .../werkzeug/middleware/http_proxy.py | 230 - .../site-packages/werkzeug/middleware/lint.py | 420 -- .../werkzeug/middleware/profiler.py | 139 - .../werkzeug/middleware/proxy_fix.py | 187 - .../werkzeug/middleware/shared_data.py | 320 - .../python3.8/site-packages/werkzeug/py.typed | 0 .../site-packages/werkzeug/routing.py | 2332 ------- .../site-packages/werkzeug/sansio/__init__.py | 0 .../__pycache__/__init__.cpython-38.pyc | Bin 151 -> 0 bytes .../__pycache__/multipart.cpython-38.pyc | Bin 6506 -> 0 bytes .../sansio/__pycache__/request.cpython-38.pyc | Bin 17161 -> 0 bytes .../__pycache__/response.cpython-38.pyc | Bin 21082 -> 0 bytes .../sansio/__pycache__/utils.cpython-38.pyc | Bin 3859 -> 0 bytes .../werkzeug/sansio/multipart.py | 260 - .../site-packages/werkzeug/sansio/request.py | 548 -- .../site-packages/werkzeug/sansio/response.py | 656 -- .../site-packages/werkzeug/sansio/utils.py | 142 - .../site-packages/werkzeug/security.py | 247 - .../site-packages/werkzeug/serving.py | 1079 ---- .../python3.8/site-packages/werkzeug/test.py | 1324 ---- .../site-packages/werkzeug/testapp.py | 240 - .../python3.8/site-packages/werkzeug/urls.py | 1211 ---- .../site-packages/werkzeug/user_agent.py | 47 - .../site-packages/werkzeug/useragents.py | 215 - .../python3.8/site-packages/werkzeug/utils.py | 1091 ---- .../werkzeug/wrappers/__init__.py | 16 - .../__pycache__/__init__.cpython-38.pyc | Bin 874 -> 0 bytes .../__pycache__/accept.cpython-38.pyc | Bin 776 -> 0 bytes .../wrappers/__pycache__/auth.cpython-38.pyc | Bin 1250 -> 0 bytes .../__pycache__/base_request.cpython-38.pyc | Bin 1729 -> 0 bytes .../__pycache__/base_response.cpython-38.pyc | Bin 1740 -> 0 bytes .../common_descriptors.cpython-38.pyc | Bin 1327 -> 0 bytes .../wrappers/__pycache__/cors.cpython-38.pyc | Bin 1235 -> 0 bytes .../wrappers/__pycache__/etag.cpython-38.pyc | Bin 1235 -> 0 bytes .../wrappers/__pycache__/json.cpython-38.pyc | Bin 768 -> 0 bytes .../__pycache__/request.cpython-38.pyc | Bin 21227 -> 0 bytes .../__pycache__/response.cpython-38.pyc | Bin 29681 -> 0 bytes .../__pycache__/user_agent.cpython-38.pyc | Bin 789 -> 0 bytes .../site-packages/werkzeug/wrappers/accept.py | 14 - .../site-packages/werkzeug/wrappers/auth.py | 26 - .../werkzeug/wrappers/base_request.py | 36 - .../werkzeug/wrappers/base_response.py | 36 - .../werkzeug/wrappers/common_descriptors.py | 26 - .../site-packages/werkzeug/wrappers/cors.py | 26 - .../site-packages/werkzeug/wrappers/etag.py | 26 - .../site-packages/werkzeug/wrappers/json.py | 13 - .../werkzeug/wrappers/request.py | 660 -- .../werkzeug/wrappers/response.py | 890 --- .../werkzeug/wrappers/user_agent.py | 14 - .../python3.8/site-packages/werkzeug/wsgi.py | 982 --- venv/lib64 | 1 - venv/pyvenv.cfg | 3 - .../CacheControl-0.12.6-py2.py3-none-any.whl | Bin 28023 -> 0 bytes .../appdirs-1.4.3-py2.py3-none-any.whl | Bin 18776 -> 0 bytes .../certifi-2019.11.28-py2.py3-none-any.whl | Bin 164552 -> 0 bytes .../chardet-3.0.4-py2.py3-none-any.whl | Bin 141487 -> 0 bytes .../colorama-0.4.3-py2.py3-none-any.whl | Bin 25094 -> 0 bytes .../contextlib2-0.6.0-py2.py3-none-any.whl | Bin 17188 -> 0 bytes .../distlib-0.3.0-py2.py3-none-any.whl | Bin 152027 -> 0 bytes .../distro-1.4.0-py2.py3-none-any.whl | Bin 23898 -> 0 bytes .../html5lib-1.0.1-py2.py3-none-any.whl | Bin 120020 -> 0 bytes .../idna-2.8-py2.py3-none-any.whl | Bin 66836 -> 0 bytes .../ipaddr-2.2.0-py2.py3-none-any.whl | Bin 24287 -> 0 bytes .../lockfile-0.12.2-py2.py3-none-any.whl | Bin 21972 -> 0 bytes .../msgpack-0.6.2-py2.py3-none-any.whl | Bin 92927 -> 0 bytes .../packaging-20.3-py2.py3-none-any.whl | Bin 42242 -> 0 bytes .../pep517-0.8.2-py2.py3-none-any.whl | Bin 26686 -> 0 bytes .../pip-20.0.2-py2.py3-none-any.whl | Bin 262434 -> 0 bytes .../pkg_resources-0.0.0-py2.py3-none-any.whl | Bin 127312 -> 0 bytes .../progress-1.5-py2.py3-none-any.whl | Bin 17547 -> 0 bytes .../pyparsing-2.4.6-py2.py3-none-any.whl | Bin 77093 -> 0 bytes .../requests-2.22.0-py2.py3-none-any.whl | Bin 67470 -> 0 bytes .../retrying-1.3.3-py2.py3-none-any.whl | Bin 16358 -> 0 bytes .../setuptools-44.0.0-py2.py3-none-any.whl | Bin 477446 -> 0 bytes .../six-1.14.0-py2.py3-none-any.whl | Bin 20256 -> 0 bytes .../toml-0.10.0-py2.py3-none-any.whl | Bin 24106 -> 0 bytes .../urllib3-1.25.8-py2.py3-none-any.whl | Bin 127041 -> 0 bytes .../webencodings-0.5.1-py2.py3-none-any.whl | Bin 20484 -> 0 bytes .../wheel-0.34.2-py2.py3-none-any.whl | Bin 35611 -> 0 bytes 784 files changed, 121090 deletions(-) delete mode 100644 __pycache__/api.cpython-38.pyc delete mode 100644 api.py delete mode 100644 venv/bin/Activate.ps1 delete mode 100644 venv/bin/activate delete mode 100644 venv/bin/activate.csh delete mode 100644 venv/bin/activate.fish delete mode 100755 venv/bin/easy_install delete mode 100755 venv/bin/easy_install-3.8 delete mode 100755 venv/bin/flask delete mode 100755 venv/bin/pip delete mode 100755 venv/bin/pip3 delete mode 100755 venv/bin/pip3.8 delete mode 120000 venv/bin/python delete mode 120000 venv/bin/python3 delete mode 100644 venv/lib/python3.8/site-packages/Flask-2.0.1.dist-info/INSTALLER delete mode 100644 venv/lib/python3.8/site-packages/Flask-2.0.1.dist-info/LICENSE.rst delete mode 100644 venv/lib/python3.8/site-packages/Flask-2.0.1.dist-info/METADATA delete mode 100644 venv/lib/python3.8/site-packages/Flask-2.0.1.dist-info/RECORD delete mode 100644 venv/lib/python3.8/site-packages/Flask-2.0.1.dist-info/WHEEL delete mode 100644 venv/lib/python3.8/site-packages/Flask-2.0.1.dist-info/entry_points.txt delete mode 100644 venv/lib/python3.8/site-packages/Flask-2.0.1.dist-info/top_level.txt delete mode 100644 venv/lib/python3.8/site-packages/Jinja2-3.0.1.dist-info/INSTALLER delete mode 100644 venv/lib/python3.8/site-packages/Jinja2-3.0.1.dist-info/LICENSE.rst delete mode 100644 venv/lib/python3.8/site-packages/Jinja2-3.0.1.dist-info/METADATA delete mode 100644 venv/lib/python3.8/site-packages/Jinja2-3.0.1.dist-info/RECORD delete mode 100644 venv/lib/python3.8/site-packages/Jinja2-3.0.1.dist-info/WHEEL delete mode 100644 venv/lib/python3.8/site-packages/Jinja2-3.0.1.dist-info/entry_points.txt delete mode 100644 venv/lib/python3.8/site-packages/Jinja2-3.0.1.dist-info/top_level.txt delete mode 100644 venv/lib/python3.8/site-packages/MarkupSafe-2.0.1.dist-info/INSTALLER delete mode 100644 venv/lib/python3.8/site-packages/MarkupSafe-2.0.1.dist-info/LICENSE.rst delete mode 100644 venv/lib/python3.8/site-packages/MarkupSafe-2.0.1.dist-info/METADATA delete mode 100644 venv/lib/python3.8/site-packages/MarkupSafe-2.0.1.dist-info/RECORD delete mode 100644 venv/lib/python3.8/site-packages/MarkupSafe-2.0.1.dist-info/WHEEL delete mode 100644 venv/lib/python3.8/site-packages/MarkupSafe-2.0.1.dist-info/top_level.txt delete mode 100644 venv/lib/python3.8/site-packages/Werkzeug-2.0.1.dist-info/INSTALLER delete mode 100644 venv/lib/python3.8/site-packages/Werkzeug-2.0.1.dist-info/LICENSE.rst delete mode 100644 venv/lib/python3.8/site-packages/Werkzeug-2.0.1.dist-info/METADATA delete mode 100644 venv/lib/python3.8/site-packages/Werkzeug-2.0.1.dist-info/RECORD delete mode 100644 venv/lib/python3.8/site-packages/Werkzeug-2.0.1.dist-info/WHEEL delete mode 100644 venv/lib/python3.8/site-packages/Werkzeug-2.0.1.dist-info/top_level.txt delete mode 100644 venv/lib/python3.8/site-packages/__pycache__/easy_install.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/click-8.0.1.dist-info/INSTALLER delete mode 100644 venv/lib/python3.8/site-packages/click-8.0.1.dist-info/LICENSE.rst delete mode 100644 venv/lib/python3.8/site-packages/click-8.0.1.dist-info/METADATA delete mode 100644 venv/lib/python3.8/site-packages/click-8.0.1.dist-info/RECORD delete mode 100644 venv/lib/python3.8/site-packages/click-8.0.1.dist-info/WHEEL delete mode 100644 venv/lib/python3.8/site-packages/click-8.0.1.dist-info/top_level.txt delete mode 100644 venv/lib/python3.8/site-packages/click/__init__.py delete mode 100644 venv/lib/python3.8/site-packages/click/__pycache__/__init__.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/click/__pycache__/_compat.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/click/__pycache__/_termui_impl.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/click/__pycache__/_textwrap.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/click/__pycache__/_unicodefun.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/click/__pycache__/_winconsole.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/click/__pycache__/core.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/click/__pycache__/decorators.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/click/__pycache__/exceptions.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/click/__pycache__/formatting.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/click/__pycache__/globals.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/click/__pycache__/parser.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/click/__pycache__/shell_completion.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/click/__pycache__/termui.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/click/__pycache__/testing.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/click/__pycache__/types.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/click/__pycache__/utils.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/click/_compat.py delete mode 100644 venv/lib/python3.8/site-packages/click/_termui_impl.py delete mode 100644 venv/lib/python3.8/site-packages/click/_textwrap.py delete mode 100644 venv/lib/python3.8/site-packages/click/_unicodefun.py delete mode 100644 venv/lib/python3.8/site-packages/click/_winconsole.py delete mode 100644 venv/lib/python3.8/site-packages/click/core.py delete mode 100644 venv/lib/python3.8/site-packages/click/decorators.py delete mode 100644 venv/lib/python3.8/site-packages/click/exceptions.py delete mode 100644 venv/lib/python3.8/site-packages/click/formatting.py delete mode 100644 venv/lib/python3.8/site-packages/click/globals.py delete mode 100644 venv/lib/python3.8/site-packages/click/parser.py delete mode 100644 venv/lib/python3.8/site-packages/click/py.typed delete mode 100644 venv/lib/python3.8/site-packages/click/shell_completion.py delete mode 100644 venv/lib/python3.8/site-packages/click/termui.py delete mode 100644 venv/lib/python3.8/site-packages/click/testing.py delete mode 100644 venv/lib/python3.8/site-packages/click/types.py delete mode 100644 venv/lib/python3.8/site-packages/click/utils.py delete mode 100644 venv/lib/python3.8/site-packages/easy_install.py delete mode 100644 venv/lib/python3.8/site-packages/flask/__init__.py delete mode 100644 venv/lib/python3.8/site-packages/flask/__main__.py delete mode 100644 venv/lib/python3.8/site-packages/flask/__pycache__/__init__.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/flask/__pycache__/__main__.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/flask/__pycache__/app.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/flask/__pycache__/blueprints.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/flask/__pycache__/cli.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/flask/__pycache__/config.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/flask/__pycache__/ctx.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/flask/__pycache__/debughelpers.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/flask/__pycache__/globals.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/flask/__pycache__/helpers.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/flask/__pycache__/logging.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/flask/__pycache__/scaffold.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/flask/__pycache__/sessions.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/flask/__pycache__/signals.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/flask/__pycache__/templating.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/flask/__pycache__/testing.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/flask/__pycache__/typing.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/flask/__pycache__/views.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/flask/__pycache__/wrappers.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/flask/app.py delete mode 100644 venv/lib/python3.8/site-packages/flask/blueprints.py delete mode 100644 venv/lib/python3.8/site-packages/flask/cli.py delete mode 100644 venv/lib/python3.8/site-packages/flask/config.py delete mode 100644 venv/lib/python3.8/site-packages/flask/ctx.py delete mode 100644 venv/lib/python3.8/site-packages/flask/debughelpers.py delete mode 100644 venv/lib/python3.8/site-packages/flask/globals.py delete mode 100644 venv/lib/python3.8/site-packages/flask/helpers.py delete mode 100644 venv/lib/python3.8/site-packages/flask/json/__init__.py delete mode 100644 venv/lib/python3.8/site-packages/flask/json/__pycache__/__init__.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/flask/json/__pycache__/tag.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/flask/json/tag.py delete mode 100644 venv/lib/python3.8/site-packages/flask/logging.py delete mode 100644 venv/lib/python3.8/site-packages/flask/py.typed delete mode 100644 venv/lib/python3.8/site-packages/flask/scaffold.py delete mode 100644 venv/lib/python3.8/site-packages/flask/sessions.py delete mode 100644 venv/lib/python3.8/site-packages/flask/signals.py delete mode 100644 venv/lib/python3.8/site-packages/flask/templating.py delete mode 100644 venv/lib/python3.8/site-packages/flask/testing.py delete mode 100644 venv/lib/python3.8/site-packages/flask/typing.py delete mode 100644 venv/lib/python3.8/site-packages/flask/views.py delete mode 100644 venv/lib/python3.8/site-packages/flask/wrappers.py delete mode 100644 venv/lib/python3.8/site-packages/itsdangerous-2.0.1.dist-info/INSTALLER delete mode 100644 venv/lib/python3.8/site-packages/itsdangerous-2.0.1.dist-info/LICENSE.rst delete mode 100644 venv/lib/python3.8/site-packages/itsdangerous-2.0.1.dist-info/METADATA delete mode 100644 venv/lib/python3.8/site-packages/itsdangerous-2.0.1.dist-info/RECORD delete mode 100644 venv/lib/python3.8/site-packages/itsdangerous-2.0.1.dist-info/WHEEL delete mode 100644 venv/lib/python3.8/site-packages/itsdangerous-2.0.1.dist-info/top_level.txt delete mode 100644 venv/lib/python3.8/site-packages/itsdangerous/__init__.py delete mode 100644 venv/lib/python3.8/site-packages/itsdangerous/__pycache__/__init__.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/itsdangerous/__pycache__/_json.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/itsdangerous/__pycache__/encoding.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/itsdangerous/__pycache__/exc.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/itsdangerous/__pycache__/jws.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/itsdangerous/__pycache__/serializer.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/itsdangerous/__pycache__/signer.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/itsdangerous/__pycache__/timed.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/itsdangerous/__pycache__/url_safe.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/itsdangerous/_json.py delete mode 100644 venv/lib/python3.8/site-packages/itsdangerous/encoding.py delete mode 100644 venv/lib/python3.8/site-packages/itsdangerous/exc.py delete mode 100644 venv/lib/python3.8/site-packages/itsdangerous/jws.py delete mode 100644 venv/lib/python3.8/site-packages/itsdangerous/py.typed delete mode 100644 venv/lib/python3.8/site-packages/itsdangerous/serializer.py delete mode 100644 venv/lib/python3.8/site-packages/itsdangerous/signer.py delete mode 100644 venv/lib/python3.8/site-packages/itsdangerous/timed.py delete mode 100644 venv/lib/python3.8/site-packages/itsdangerous/url_safe.py delete mode 100644 venv/lib/python3.8/site-packages/jinja2/__init__.py delete mode 100644 venv/lib/python3.8/site-packages/jinja2/__pycache__/__init__.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/jinja2/__pycache__/_identifier.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/jinja2/__pycache__/async_utils.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/jinja2/__pycache__/bccache.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/jinja2/__pycache__/compiler.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/jinja2/__pycache__/constants.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/jinja2/__pycache__/debug.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/jinja2/__pycache__/defaults.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/jinja2/__pycache__/environment.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/jinja2/__pycache__/exceptions.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/jinja2/__pycache__/ext.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/jinja2/__pycache__/filters.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/jinja2/__pycache__/idtracking.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/jinja2/__pycache__/lexer.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/jinja2/__pycache__/loaders.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/jinja2/__pycache__/meta.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/jinja2/__pycache__/nativetypes.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/jinja2/__pycache__/nodes.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/jinja2/__pycache__/optimizer.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/jinja2/__pycache__/parser.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/jinja2/__pycache__/runtime.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/jinja2/__pycache__/sandbox.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/jinja2/__pycache__/tests.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/jinja2/__pycache__/utils.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/jinja2/__pycache__/visitor.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/jinja2/_identifier.py delete mode 100644 venv/lib/python3.8/site-packages/jinja2/async_utils.py delete mode 100644 venv/lib/python3.8/site-packages/jinja2/bccache.py delete mode 100644 venv/lib/python3.8/site-packages/jinja2/compiler.py delete mode 100644 venv/lib/python3.8/site-packages/jinja2/constants.py delete mode 100644 venv/lib/python3.8/site-packages/jinja2/debug.py delete mode 100644 venv/lib/python3.8/site-packages/jinja2/defaults.py delete mode 100644 venv/lib/python3.8/site-packages/jinja2/environment.py delete mode 100644 venv/lib/python3.8/site-packages/jinja2/exceptions.py delete mode 100644 venv/lib/python3.8/site-packages/jinja2/ext.py delete mode 100644 venv/lib/python3.8/site-packages/jinja2/filters.py delete mode 100644 venv/lib/python3.8/site-packages/jinja2/idtracking.py delete mode 100644 venv/lib/python3.8/site-packages/jinja2/lexer.py delete mode 100644 venv/lib/python3.8/site-packages/jinja2/loaders.py delete mode 100644 venv/lib/python3.8/site-packages/jinja2/meta.py delete mode 100644 venv/lib/python3.8/site-packages/jinja2/nativetypes.py delete mode 100644 venv/lib/python3.8/site-packages/jinja2/nodes.py delete mode 100644 venv/lib/python3.8/site-packages/jinja2/optimizer.py delete mode 100644 venv/lib/python3.8/site-packages/jinja2/parser.py delete mode 100644 venv/lib/python3.8/site-packages/jinja2/py.typed delete mode 100644 venv/lib/python3.8/site-packages/jinja2/runtime.py delete mode 100644 venv/lib/python3.8/site-packages/jinja2/sandbox.py delete mode 100644 venv/lib/python3.8/site-packages/jinja2/tests.py delete mode 100644 venv/lib/python3.8/site-packages/jinja2/utils.py delete mode 100644 venv/lib/python3.8/site-packages/jinja2/visitor.py delete mode 100644 venv/lib/python3.8/site-packages/markupsafe/__init__.py delete mode 100644 venv/lib/python3.8/site-packages/markupsafe/__pycache__/__init__.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/markupsafe/__pycache__/_native.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/markupsafe/_native.py delete mode 100644 venv/lib/python3.8/site-packages/markupsafe/_speedups.c delete mode 100755 venv/lib/python3.8/site-packages/markupsafe/_speedups.cpython-38-x86_64-linux-gnu.so delete mode 100644 venv/lib/python3.8/site-packages/markupsafe/_speedups.pyi delete mode 100644 venv/lib/python3.8/site-packages/markupsafe/py.typed delete mode 100644 venv/lib/python3.8/site-packages/pip-20.0.2.dist-info/INSTALLER delete mode 100644 venv/lib/python3.8/site-packages/pip-20.0.2.dist-info/LICENSE.txt delete mode 100644 venv/lib/python3.8/site-packages/pip-20.0.2.dist-info/METADATA delete mode 100644 venv/lib/python3.8/site-packages/pip-20.0.2.dist-info/RECORD delete mode 100644 venv/lib/python3.8/site-packages/pip-20.0.2.dist-info/WHEEL delete mode 100644 venv/lib/python3.8/site-packages/pip-20.0.2.dist-info/entry_points.txt delete mode 100644 venv/lib/python3.8/site-packages/pip-20.0.2.dist-info/top_level.txt delete mode 100644 venv/lib/python3.8/site-packages/pip/__init__.py delete mode 100644 venv/lib/python3.8/site-packages/pip/__main__.py delete mode 100644 venv/lib/python3.8/site-packages/pip/__pycache__/__init__.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/__pycache__/__main__.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/__init__.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/__pycache__/__init__.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/__pycache__/build_env.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/__pycache__/cache.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/__pycache__/configuration.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/__pycache__/exceptions.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/__pycache__/legacy_resolve.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/__pycache__/locations.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/__pycache__/main.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/__pycache__/pep425tags.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/__pycache__/pyproject.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/__pycache__/self_outdated_check.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/__pycache__/wheel_builder.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/build_env.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/cache.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/cli/__init__.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/cli/__pycache__/__init__.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/cli/__pycache__/autocompletion.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/cli/__pycache__/base_command.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/cli/__pycache__/cmdoptions.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/cli/__pycache__/command_context.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/cli/__pycache__/main.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/cli/__pycache__/main_parser.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/cli/__pycache__/parser.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/cli/__pycache__/req_command.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/cli/__pycache__/status_codes.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/cli/autocompletion.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/cli/base_command.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/cli/cmdoptions.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/cli/command_context.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/cli/main.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/cli/main_parser.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/cli/parser.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/cli/req_command.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/cli/status_codes.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/commands/__init__.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/commands/__pycache__/__init__.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/commands/__pycache__/check.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/commands/__pycache__/completion.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/commands/__pycache__/configuration.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/commands/__pycache__/debug.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/commands/__pycache__/download.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/commands/__pycache__/freeze.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/commands/__pycache__/hash.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/commands/__pycache__/help.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/commands/__pycache__/install.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/commands/__pycache__/list.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/commands/__pycache__/search.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/commands/__pycache__/show.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/commands/__pycache__/uninstall.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/commands/__pycache__/wheel.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/commands/check.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/commands/completion.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/commands/configuration.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/commands/debug.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/commands/download.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/commands/freeze.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/commands/hash.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/commands/help.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/commands/install.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/commands/list.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/commands/search.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/commands/show.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/commands/uninstall.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/commands/wheel.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/configuration.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/distributions/__init__.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/distributions/__pycache__/__init__.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/distributions/__pycache__/base.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/distributions/__pycache__/installed.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/distributions/__pycache__/sdist.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/distributions/__pycache__/wheel.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/distributions/base.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/distributions/installed.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/distributions/sdist.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/distributions/wheel.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/exceptions.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/index/__init__.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/index/__pycache__/__init__.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/index/__pycache__/collector.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/index/__pycache__/package_finder.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/index/collector.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/index/package_finder.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/legacy_resolve.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/locations.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/main.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/models/__init__.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/models/__pycache__/__init__.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/models/__pycache__/candidate.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/models/__pycache__/format_control.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/models/__pycache__/index.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/models/__pycache__/link.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/models/__pycache__/scheme.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/models/__pycache__/search_scope.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/models/__pycache__/selection_prefs.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/models/__pycache__/target_python.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/models/__pycache__/wheel.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/models/candidate.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/models/format_control.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/models/index.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/models/link.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/models/scheme.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/models/search_scope.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/models/selection_prefs.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/models/target_python.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/models/wheel.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/network/__init__.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/network/__pycache__/__init__.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/network/__pycache__/auth.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/network/__pycache__/cache.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/network/__pycache__/download.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/network/__pycache__/session.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/network/__pycache__/utils.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/network/__pycache__/xmlrpc.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/network/auth.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/network/cache.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/network/download.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/network/session.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/network/utils.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/network/xmlrpc.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/operations/__init__.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/operations/__pycache__/__init__.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/operations/__pycache__/check.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/operations/__pycache__/freeze.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/operations/__pycache__/prepare.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/operations/build/__init__.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/operations/build/__pycache__/__init__.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/operations/build/__pycache__/metadata.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/operations/build/__pycache__/metadata_legacy.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/operations/build/__pycache__/wheel.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/operations/build/__pycache__/wheel_legacy.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/operations/build/metadata.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/operations/build/metadata_legacy.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/operations/build/wheel.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/operations/build/wheel_legacy.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/operations/check.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/operations/freeze.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/operations/install/__init__.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/operations/install/__pycache__/__init__.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/operations/install/__pycache__/editable_legacy.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/operations/install/__pycache__/legacy.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/operations/install/__pycache__/wheel.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/operations/install/editable_legacy.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/operations/install/legacy.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/operations/install/wheel.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/operations/prepare.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/pep425tags.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/pyproject.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/req/__init__.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/req/__pycache__/__init__.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/req/__pycache__/constructors.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/req/__pycache__/req_file.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/req/__pycache__/req_install.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/req/__pycache__/req_set.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/req/__pycache__/req_tracker.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/req/__pycache__/req_uninstall.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/req/constructors.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/req/req_file.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/req/req_install.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/req/req_set.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/req/req_tracker.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/req/req_uninstall.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/self_outdated_check.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/utils/__init__.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/__init__.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/appdirs.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/compat.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/deprecation.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/distutils_args.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/encoding.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/entrypoints.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/filesystem.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/filetypes.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/glibc.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/hashes.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/inject_securetransport.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/logging.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/marker_files.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/misc.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/models.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/packaging.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/pkg_resources.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/setuptools_build.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/subprocess.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/temp_dir.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/typing.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/ui.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/unpacking.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/urls.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/virtualenv.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/wheel.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/utils/appdirs.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/utils/compat.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/utils/deprecation.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/utils/distutils_args.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/utils/encoding.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/utils/entrypoints.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/utils/filesystem.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/utils/filetypes.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/utils/glibc.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/utils/hashes.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/utils/inject_securetransport.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/utils/logging.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/utils/marker_files.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/utils/misc.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/utils/models.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/utils/packaging.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/utils/pkg_resources.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/utils/setuptools_build.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/utils/subprocess.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/utils/temp_dir.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/utils/typing.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/utils/ui.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/utils/unpacking.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/utils/urls.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/utils/virtualenv.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/utils/wheel.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/vcs/__init__.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/vcs/__pycache__/__init__.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/vcs/__pycache__/bazaar.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/vcs/__pycache__/git.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/vcs/__pycache__/mercurial.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/vcs/__pycache__/subversion.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/vcs/__pycache__/versioncontrol.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/vcs/bazaar.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/vcs/git.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/vcs/mercurial.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/vcs/subversion.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/vcs/versioncontrol.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/wheel_builder.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_vendor/__init__.py delete mode 100644 venv/lib/python3.8/site-packages/pip/_vendor/__pycache__/__init__.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pkg_resources-0.0.0.dist-info/AUTHORS.txt delete mode 100644 venv/lib/python3.8/site-packages/pkg_resources-0.0.0.dist-info/INSTALLER delete mode 100644 venv/lib/python3.8/site-packages/pkg_resources-0.0.0.dist-info/LICENSE.txt delete mode 100644 venv/lib/python3.8/site-packages/pkg_resources-0.0.0.dist-info/METADATA delete mode 100644 venv/lib/python3.8/site-packages/pkg_resources-0.0.0.dist-info/RECORD delete mode 100644 venv/lib/python3.8/site-packages/pkg_resources-0.0.0.dist-info/WHEEL delete mode 100644 venv/lib/python3.8/site-packages/pkg_resources/__init__.py delete mode 100644 venv/lib/python3.8/site-packages/pkg_resources/__pycache__/__init__.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pkg_resources/__pycache__/py31compat.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pkg_resources/_vendor/__init__.py delete mode 100644 venv/lib/python3.8/site-packages/pkg_resources/_vendor/__pycache__/__init__.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pkg_resources/_vendor/__pycache__/appdirs.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pkg_resources/_vendor/__pycache__/pyparsing.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pkg_resources/_vendor/__pycache__/six.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pkg_resources/_vendor/appdirs.py delete mode 100644 venv/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/__about__.py delete mode 100644 venv/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/__init__.py delete mode 100644 venv/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/__pycache__/__about__.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/__pycache__/__init__.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/__pycache__/_compat.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/__pycache__/_structures.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/__pycache__/markers.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/__pycache__/requirements.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/__pycache__/specifiers.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/__pycache__/utils.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/__pycache__/version.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/_compat.py delete mode 100644 venv/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/_structures.py delete mode 100644 venv/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/markers.py delete mode 100644 venv/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/requirements.py delete mode 100644 venv/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/specifiers.py delete mode 100644 venv/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/utils.py delete mode 100644 venv/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/version.py delete mode 100644 venv/lib/python3.8/site-packages/pkg_resources/_vendor/pyparsing.py delete mode 100644 venv/lib/python3.8/site-packages/pkg_resources/_vendor/six.py delete mode 100644 venv/lib/python3.8/site-packages/pkg_resources/extern/__init__.py delete mode 100644 venv/lib/python3.8/site-packages/pkg_resources/extern/__pycache__/__init__.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/pkg_resources/py31compat.py delete mode 100644 venv/lib/python3.8/site-packages/setuptools-44.0.0.dist-info/AUTHORS.txt delete mode 100644 venv/lib/python3.8/site-packages/setuptools-44.0.0.dist-info/INSTALLER delete mode 100644 venv/lib/python3.8/site-packages/setuptools-44.0.0.dist-info/LICENSE.txt delete mode 100644 venv/lib/python3.8/site-packages/setuptools-44.0.0.dist-info/METADATA delete mode 100644 venv/lib/python3.8/site-packages/setuptools-44.0.0.dist-info/RECORD delete mode 100644 venv/lib/python3.8/site-packages/setuptools-44.0.0.dist-info/WHEEL delete mode 100644 venv/lib/python3.8/site-packages/setuptools-44.0.0.dist-info/dependency_links.txt delete mode 100644 venv/lib/python3.8/site-packages/setuptools-44.0.0.dist-info/entry_points.txt delete mode 100644 venv/lib/python3.8/site-packages/setuptools-44.0.0.dist-info/top_level.txt delete mode 100644 venv/lib/python3.8/site-packages/setuptools-44.0.0.dist-info/zip-safe delete mode 100644 venv/lib/python3.8/site-packages/setuptools/__init__.py delete mode 100644 venv/lib/python3.8/site-packages/setuptools/__pycache__/__init__.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/setuptools/__pycache__/_deprecation_warning.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/setuptools/__pycache__/_imp.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/setuptools/__pycache__/archive_util.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/setuptools/__pycache__/build_meta.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/setuptools/__pycache__/config.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/setuptools/__pycache__/dep_util.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/setuptools/__pycache__/depends.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/setuptools/__pycache__/dist.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/setuptools/__pycache__/errors.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/setuptools/__pycache__/extension.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/setuptools/__pycache__/glob.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/setuptools/__pycache__/installer.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/setuptools/__pycache__/launch.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/setuptools/__pycache__/lib2to3_ex.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/setuptools/__pycache__/monkey.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/setuptools/__pycache__/msvc.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/setuptools/__pycache__/namespaces.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/setuptools/__pycache__/package_index.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/setuptools/__pycache__/py27compat.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/setuptools/__pycache__/py31compat.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/setuptools/__pycache__/py33compat.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/setuptools/__pycache__/py34compat.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/setuptools/__pycache__/sandbox.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/setuptools/__pycache__/site-patch.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/setuptools/__pycache__/ssl_support.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/setuptools/__pycache__/unicode_utils.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/setuptools/__pycache__/version.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/setuptools/__pycache__/wheel.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/setuptools/__pycache__/windows_support.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/setuptools/_deprecation_warning.py delete mode 100644 venv/lib/python3.8/site-packages/setuptools/_imp.py delete mode 100644 venv/lib/python3.8/site-packages/setuptools/_vendor/__init__.py delete mode 100644 venv/lib/python3.8/site-packages/setuptools/_vendor/__pycache__/__init__.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/setuptools/_vendor/__pycache__/ordered_set.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/setuptools/_vendor/__pycache__/pyparsing.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/setuptools/_vendor/__pycache__/six.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/setuptools/_vendor/ordered_set.py delete mode 100644 venv/lib/python3.8/site-packages/setuptools/_vendor/packaging/__about__.py delete mode 100644 venv/lib/python3.8/site-packages/setuptools/_vendor/packaging/__init__.py delete mode 100644 venv/lib/python3.8/site-packages/setuptools/_vendor/packaging/__pycache__/__about__.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/setuptools/_vendor/packaging/__pycache__/__init__.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/setuptools/_vendor/packaging/__pycache__/_compat.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/setuptools/_vendor/packaging/__pycache__/_structures.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/setuptools/_vendor/packaging/__pycache__/markers.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/setuptools/_vendor/packaging/__pycache__/requirements.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/setuptools/_vendor/packaging/__pycache__/specifiers.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/setuptools/_vendor/packaging/__pycache__/tags.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/setuptools/_vendor/packaging/__pycache__/utils.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/setuptools/_vendor/packaging/__pycache__/version.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/setuptools/_vendor/packaging/_compat.py delete mode 100644 venv/lib/python3.8/site-packages/setuptools/_vendor/packaging/_structures.py delete mode 100644 venv/lib/python3.8/site-packages/setuptools/_vendor/packaging/markers.py delete mode 100644 venv/lib/python3.8/site-packages/setuptools/_vendor/packaging/requirements.py delete mode 100644 venv/lib/python3.8/site-packages/setuptools/_vendor/packaging/specifiers.py delete mode 100644 venv/lib/python3.8/site-packages/setuptools/_vendor/packaging/tags.py delete mode 100644 venv/lib/python3.8/site-packages/setuptools/_vendor/packaging/utils.py delete mode 100644 venv/lib/python3.8/site-packages/setuptools/_vendor/packaging/version.py delete mode 100644 venv/lib/python3.8/site-packages/setuptools/_vendor/pyparsing.py delete mode 100644 venv/lib/python3.8/site-packages/setuptools/_vendor/six.py delete mode 100644 venv/lib/python3.8/site-packages/setuptools/archive_util.py delete mode 100644 venv/lib/python3.8/site-packages/setuptools/build_meta.py delete mode 100644 venv/lib/python3.8/site-packages/setuptools/cli-32.exe delete mode 100644 venv/lib/python3.8/site-packages/setuptools/cli-64.exe delete mode 100644 venv/lib/python3.8/site-packages/setuptools/cli.exe delete mode 100644 venv/lib/python3.8/site-packages/setuptools/command/__init__.py delete mode 100644 venv/lib/python3.8/site-packages/setuptools/command/__pycache__/__init__.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/setuptools/command/__pycache__/alias.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/setuptools/command/__pycache__/bdist_egg.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/setuptools/command/__pycache__/bdist_rpm.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/setuptools/command/__pycache__/bdist_wininst.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/setuptools/command/__pycache__/build_clib.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/setuptools/command/__pycache__/build_ext.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/setuptools/command/__pycache__/build_py.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/setuptools/command/__pycache__/develop.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/setuptools/command/__pycache__/dist_info.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/setuptools/command/__pycache__/easy_install.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/setuptools/command/__pycache__/egg_info.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/setuptools/command/__pycache__/install.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/setuptools/command/__pycache__/install_egg_info.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/setuptools/command/__pycache__/install_lib.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/setuptools/command/__pycache__/install_scripts.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/setuptools/command/__pycache__/py36compat.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/setuptools/command/__pycache__/register.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/setuptools/command/__pycache__/rotate.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/setuptools/command/__pycache__/saveopts.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/setuptools/command/__pycache__/sdist.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/setuptools/command/__pycache__/setopt.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/setuptools/command/__pycache__/test.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/setuptools/command/__pycache__/upload.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/setuptools/command/__pycache__/upload_docs.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/setuptools/command/alias.py delete mode 100644 venv/lib/python3.8/site-packages/setuptools/command/bdist_egg.py delete mode 100644 venv/lib/python3.8/site-packages/setuptools/command/bdist_rpm.py delete mode 100644 venv/lib/python3.8/site-packages/setuptools/command/bdist_wininst.py delete mode 100644 venv/lib/python3.8/site-packages/setuptools/command/build_clib.py delete mode 100644 venv/lib/python3.8/site-packages/setuptools/command/build_ext.py delete mode 100644 venv/lib/python3.8/site-packages/setuptools/command/build_py.py delete mode 100644 venv/lib/python3.8/site-packages/setuptools/command/develop.py delete mode 100644 venv/lib/python3.8/site-packages/setuptools/command/dist_info.py delete mode 100644 venv/lib/python3.8/site-packages/setuptools/command/easy_install.py delete mode 100644 venv/lib/python3.8/site-packages/setuptools/command/egg_info.py delete mode 100644 venv/lib/python3.8/site-packages/setuptools/command/install.py delete mode 100644 venv/lib/python3.8/site-packages/setuptools/command/install_egg_info.py delete mode 100644 venv/lib/python3.8/site-packages/setuptools/command/install_lib.py delete mode 100644 venv/lib/python3.8/site-packages/setuptools/command/install_scripts.py delete mode 100644 venv/lib/python3.8/site-packages/setuptools/command/launcher manifest.xml delete mode 100644 venv/lib/python3.8/site-packages/setuptools/command/py36compat.py delete mode 100644 venv/lib/python3.8/site-packages/setuptools/command/register.py delete mode 100644 venv/lib/python3.8/site-packages/setuptools/command/rotate.py delete mode 100644 venv/lib/python3.8/site-packages/setuptools/command/saveopts.py delete mode 100644 venv/lib/python3.8/site-packages/setuptools/command/sdist.py delete mode 100644 venv/lib/python3.8/site-packages/setuptools/command/setopt.py delete mode 100644 venv/lib/python3.8/site-packages/setuptools/command/test.py delete mode 100644 venv/lib/python3.8/site-packages/setuptools/command/upload.py delete mode 100644 venv/lib/python3.8/site-packages/setuptools/command/upload_docs.py delete mode 100644 venv/lib/python3.8/site-packages/setuptools/config.py delete mode 100644 venv/lib/python3.8/site-packages/setuptools/dep_util.py delete mode 100644 venv/lib/python3.8/site-packages/setuptools/depends.py delete mode 100644 venv/lib/python3.8/site-packages/setuptools/dist.py delete mode 100644 venv/lib/python3.8/site-packages/setuptools/errors.py delete mode 100644 venv/lib/python3.8/site-packages/setuptools/extension.py delete mode 100644 venv/lib/python3.8/site-packages/setuptools/extern/__init__.py delete mode 100644 venv/lib/python3.8/site-packages/setuptools/extern/__pycache__/__init__.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/setuptools/glob.py delete mode 100644 venv/lib/python3.8/site-packages/setuptools/gui-32.exe delete mode 100644 venv/lib/python3.8/site-packages/setuptools/gui-64.exe delete mode 100644 venv/lib/python3.8/site-packages/setuptools/gui.exe delete mode 100644 venv/lib/python3.8/site-packages/setuptools/installer.py delete mode 100644 venv/lib/python3.8/site-packages/setuptools/launch.py delete mode 100644 venv/lib/python3.8/site-packages/setuptools/lib2to3_ex.py delete mode 100644 venv/lib/python3.8/site-packages/setuptools/monkey.py delete mode 100644 venv/lib/python3.8/site-packages/setuptools/msvc.py delete mode 100644 venv/lib/python3.8/site-packages/setuptools/namespaces.py delete mode 100644 venv/lib/python3.8/site-packages/setuptools/package_index.py delete mode 100644 venv/lib/python3.8/site-packages/setuptools/py27compat.py delete mode 100644 venv/lib/python3.8/site-packages/setuptools/py31compat.py delete mode 100644 venv/lib/python3.8/site-packages/setuptools/py33compat.py delete mode 100644 venv/lib/python3.8/site-packages/setuptools/py34compat.py delete mode 100644 venv/lib/python3.8/site-packages/setuptools/sandbox.py delete mode 100644 venv/lib/python3.8/site-packages/setuptools/script (dev).tmpl delete mode 100644 venv/lib/python3.8/site-packages/setuptools/script.tmpl delete mode 100644 venv/lib/python3.8/site-packages/setuptools/site-patch.py delete mode 100644 venv/lib/python3.8/site-packages/setuptools/ssl_support.py delete mode 100644 venv/lib/python3.8/site-packages/setuptools/unicode_utils.py delete mode 100644 venv/lib/python3.8/site-packages/setuptools/version.py delete mode 100644 venv/lib/python3.8/site-packages/setuptools/wheel.py delete mode 100644 venv/lib/python3.8/site-packages/setuptools/windows_support.py delete mode 100644 venv/lib/python3.8/site-packages/werkzeug/__init__.py delete mode 100644 venv/lib/python3.8/site-packages/werkzeug/__pycache__/__init__.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/werkzeug/__pycache__/_internal.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/werkzeug/__pycache__/_reloader.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/werkzeug/__pycache__/datastructures.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/werkzeug/__pycache__/exceptions.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/werkzeug/__pycache__/filesystem.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/werkzeug/__pycache__/formparser.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/werkzeug/__pycache__/http.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/werkzeug/__pycache__/local.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/werkzeug/__pycache__/routing.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/werkzeug/__pycache__/security.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/werkzeug/__pycache__/serving.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/werkzeug/__pycache__/test.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/werkzeug/__pycache__/testapp.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/werkzeug/__pycache__/urls.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/werkzeug/__pycache__/user_agent.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/werkzeug/__pycache__/useragents.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/werkzeug/__pycache__/utils.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/werkzeug/__pycache__/wsgi.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/werkzeug/_internal.py delete mode 100644 venv/lib/python3.8/site-packages/werkzeug/_reloader.py delete mode 100644 venv/lib/python3.8/site-packages/werkzeug/datastructures.py delete mode 100644 venv/lib/python3.8/site-packages/werkzeug/datastructures.pyi delete mode 100644 venv/lib/python3.8/site-packages/werkzeug/debug/__init__.py delete mode 100644 venv/lib/python3.8/site-packages/werkzeug/debug/__pycache__/__init__.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/werkzeug/debug/__pycache__/console.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/werkzeug/debug/__pycache__/repr.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/werkzeug/debug/__pycache__/tbtools.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/werkzeug/debug/console.py delete mode 100644 venv/lib/python3.8/site-packages/werkzeug/debug/repr.py delete mode 100644 venv/lib/python3.8/site-packages/werkzeug/debug/shared/FONT_LICENSE delete mode 100644 venv/lib/python3.8/site-packages/werkzeug/debug/shared/ICON_LICENSE.md delete mode 100644 venv/lib/python3.8/site-packages/werkzeug/debug/shared/console.png delete mode 100644 venv/lib/python3.8/site-packages/werkzeug/debug/shared/debugger.js delete mode 100644 venv/lib/python3.8/site-packages/werkzeug/debug/shared/less.png delete mode 100644 venv/lib/python3.8/site-packages/werkzeug/debug/shared/more.png delete mode 100644 venv/lib/python3.8/site-packages/werkzeug/debug/shared/source.png delete mode 100644 venv/lib/python3.8/site-packages/werkzeug/debug/shared/style.css delete mode 100644 venv/lib/python3.8/site-packages/werkzeug/debug/shared/ubuntu.ttf delete mode 100644 venv/lib/python3.8/site-packages/werkzeug/debug/tbtools.py delete mode 100644 venv/lib/python3.8/site-packages/werkzeug/exceptions.py delete mode 100644 venv/lib/python3.8/site-packages/werkzeug/filesystem.py delete mode 100644 venv/lib/python3.8/site-packages/werkzeug/formparser.py delete mode 100644 venv/lib/python3.8/site-packages/werkzeug/http.py delete mode 100644 venv/lib/python3.8/site-packages/werkzeug/local.py delete mode 100644 venv/lib/python3.8/site-packages/werkzeug/middleware/__init__.py delete mode 100644 venv/lib/python3.8/site-packages/werkzeug/middleware/__pycache__/__init__.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/werkzeug/middleware/__pycache__/dispatcher.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/werkzeug/middleware/__pycache__/http_proxy.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/werkzeug/middleware/__pycache__/lint.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/werkzeug/middleware/__pycache__/profiler.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/werkzeug/middleware/__pycache__/proxy_fix.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/werkzeug/middleware/__pycache__/shared_data.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/werkzeug/middleware/dispatcher.py delete mode 100644 venv/lib/python3.8/site-packages/werkzeug/middleware/http_proxy.py delete mode 100644 venv/lib/python3.8/site-packages/werkzeug/middleware/lint.py delete mode 100644 venv/lib/python3.8/site-packages/werkzeug/middleware/profiler.py delete mode 100644 venv/lib/python3.8/site-packages/werkzeug/middleware/proxy_fix.py delete mode 100644 venv/lib/python3.8/site-packages/werkzeug/middleware/shared_data.py delete mode 100644 venv/lib/python3.8/site-packages/werkzeug/py.typed delete mode 100644 venv/lib/python3.8/site-packages/werkzeug/routing.py delete mode 100644 venv/lib/python3.8/site-packages/werkzeug/sansio/__init__.py delete mode 100644 venv/lib/python3.8/site-packages/werkzeug/sansio/__pycache__/__init__.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/werkzeug/sansio/__pycache__/multipart.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/werkzeug/sansio/__pycache__/request.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/werkzeug/sansio/__pycache__/response.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/werkzeug/sansio/__pycache__/utils.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/werkzeug/sansio/multipart.py delete mode 100644 venv/lib/python3.8/site-packages/werkzeug/sansio/request.py delete mode 100644 venv/lib/python3.8/site-packages/werkzeug/sansio/response.py delete mode 100644 venv/lib/python3.8/site-packages/werkzeug/sansio/utils.py delete mode 100644 venv/lib/python3.8/site-packages/werkzeug/security.py delete mode 100644 venv/lib/python3.8/site-packages/werkzeug/serving.py delete mode 100644 venv/lib/python3.8/site-packages/werkzeug/test.py delete mode 100644 venv/lib/python3.8/site-packages/werkzeug/testapp.py delete mode 100644 venv/lib/python3.8/site-packages/werkzeug/urls.py delete mode 100644 venv/lib/python3.8/site-packages/werkzeug/user_agent.py delete mode 100644 venv/lib/python3.8/site-packages/werkzeug/useragents.py delete mode 100644 venv/lib/python3.8/site-packages/werkzeug/utils.py delete mode 100644 venv/lib/python3.8/site-packages/werkzeug/wrappers/__init__.py delete mode 100644 venv/lib/python3.8/site-packages/werkzeug/wrappers/__pycache__/__init__.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/werkzeug/wrappers/__pycache__/accept.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/werkzeug/wrappers/__pycache__/auth.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/werkzeug/wrappers/__pycache__/base_request.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/werkzeug/wrappers/__pycache__/base_response.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/werkzeug/wrappers/__pycache__/common_descriptors.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/werkzeug/wrappers/__pycache__/cors.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/werkzeug/wrappers/__pycache__/etag.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/werkzeug/wrappers/__pycache__/json.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/werkzeug/wrappers/__pycache__/request.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/werkzeug/wrappers/__pycache__/response.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/werkzeug/wrappers/__pycache__/user_agent.cpython-38.pyc delete mode 100644 venv/lib/python3.8/site-packages/werkzeug/wrappers/accept.py delete mode 100644 venv/lib/python3.8/site-packages/werkzeug/wrappers/auth.py delete mode 100644 venv/lib/python3.8/site-packages/werkzeug/wrappers/base_request.py delete mode 100644 venv/lib/python3.8/site-packages/werkzeug/wrappers/base_response.py delete mode 100644 venv/lib/python3.8/site-packages/werkzeug/wrappers/common_descriptors.py delete mode 100644 venv/lib/python3.8/site-packages/werkzeug/wrappers/cors.py delete mode 100644 venv/lib/python3.8/site-packages/werkzeug/wrappers/etag.py delete mode 100644 venv/lib/python3.8/site-packages/werkzeug/wrappers/json.py delete mode 100644 venv/lib/python3.8/site-packages/werkzeug/wrappers/request.py delete mode 100644 venv/lib/python3.8/site-packages/werkzeug/wrappers/response.py delete mode 100644 venv/lib/python3.8/site-packages/werkzeug/wrappers/user_agent.py delete mode 100644 venv/lib/python3.8/site-packages/werkzeug/wsgi.py delete mode 120000 venv/lib64 delete mode 100644 venv/pyvenv.cfg delete mode 100644 venv/share/python-wheels/CacheControl-0.12.6-py2.py3-none-any.whl delete mode 100644 venv/share/python-wheels/appdirs-1.4.3-py2.py3-none-any.whl delete mode 100644 venv/share/python-wheels/certifi-2019.11.28-py2.py3-none-any.whl delete mode 100644 venv/share/python-wheels/chardet-3.0.4-py2.py3-none-any.whl delete mode 100644 venv/share/python-wheels/colorama-0.4.3-py2.py3-none-any.whl delete mode 100644 venv/share/python-wheels/contextlib2-0.6.0-py2.py3-none-any.whl delete mode 100644 venv/share/python-wheels/distlib-0.3.0-py2.py3-none-any.whl delete mode 100644 venv/share/python-wheels/distro-1.4.0-py2.py3-none-any.whl delete mode 100644 venv/share/python-wheels/html5lib-1.0.1-py2.py3-none-any.whl delete mode 100644 venv/share/python-wheels/idna-2.8-py2.py3-none-any.whl delete mode 100644 venv/share/python-wheels/ipaddr-2.2.0-py2.py3-none-any.whl delete mode 100644 venv/share/python-wheels/lockfile-0.12.2-py2.py3-none-any.whl delete mode 100644 venv/share/python-wheels/msgpack-0.6.2-py2.py3-none-any.whl delete mode 100644 venv/share/python-wheels/packaging-20.3-py2.py3-none-any.whl delete mode 100644 venv/share/python-wheels/pep517-0.8.2-py2.py3-none-any.whl delete mode 100644 venv/share/python-wheels/pip-20.0.2-py2.py3-none-any.whl delete mode 100644 venv/share/python-wheels/pkg_resources-0.0.0-py2.py3-none-any.whl delete mode 100644 venv/share/python-wheels/progress-1.5-py2.py3-none-any.whl delete mode 100644 venv/share/python-wheels/pyparsing-2.4.6-py2.py3-none-any.whl delete mode 100644 venv/share/python-wheels/requests-2.22.0-py2.py3-none-any.whl delete mode 100644 venv/share/python-wheels/retrying-1.3.3-py2.py3-none-any.whl delete mode 100644 venv/share/python-wheels/setuptools-44.0.0-py2.py3-none-any.whl delete mode 100644 venv/share/python-wheels/six-1.14.0-py2.py3-none-any.whl delete mode 100644 venv/share/python-wheels/toml-0.10.0-py2.py3-none-any.whl delete mode 100644 venv/share/python-wheels/urllib3-1.25.8-py2.py3-none-any.whl delete mode 100644 venv/share/python-wheels/webencodings-0.5.1-py2.py3-none-any.whl delete mode 100644 venv/share/python-wheels/wheel-0.34.2-py2.py3-none-any.whl diff --git a/__pycache__/api.cpython-38.pyc b/__pycache__/api.cpython-38.pyc deleted file mode 100644 index 810adc17dabe01672457dd4481e49d8e6a44642f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 325 zcmYjLF;2uV5ZtxnC_>yr0y_Kwgpfd#*C3iS!NkiYy2Od>J0xh~Ay88B4F2GjiZ5Kn z`Y7&3+OcP}JG*zY*%2_lzqa>=-=8E7Az556U<@~`kD{@wwsXLpVquOm#DOfOp@Hz9M%q#Vn?(xZuMO`~HP+do9 irYR~vZq~Hx-0%JWrKDJ#52M}mbdin@DezbnqQF1-rbAQ! diff --git a/api.py b/api.py deleted file mode 100644 index 5ffadfa..0000000 --- a/api.py +++ /dev/null @@ -1,18 +0,0 @@ -from flask import Flask -from flask import request - -app = Flask(__name__) - -def checkLogin(email, password): - if email == "inaresh.online@gmail.com" and password == "test": - return True - return False - -@app.route("/login", methods=['POST']) -def login(): - if request.method == "POST": - if checkLogin(request.form['email'], request.form['password']): - return "LOGGEDIN" - else: - return "FAILED" - return "ERROR" \ No newline at end of file diff --git a/venv/bin/Activate.ps1 b/venv/bin/Activate.ps1 deleted file mode 100644 index 2fb3852..0000000 --- a/venv/bin/Activate.ps1 +++ /dev/null @@ -1,241 +0,0 @@ -<# -.Synopsis -Activate a Python virtual environment for the current PowerShell session. - -.Description -Pushes the python executable for a virtual environment to the front of the -$Env:PATH environment variable and sets the prompt to signify that you are -in a Python virtual environment. Makes use of the command line switches as -well as the `pyvenv.cfg` file values present in the virtual environment. - -.Parameter VenvDir -Path to the directory that contains the virtual environment to activate. The -default value for this is the parent of the directory that the Activate.ps1 -script is located within. - -.Parameter Prompt -The prompt prefix to display when this virtual environment is activated. By -default, this prompt is the name of the virtual environment folder (VenvDir) -surrounded by parentheses and followed by a single space (ie. '(.venv) '). - -.Example -Activate.ps1 -Activates the Python virtual environment that contains the Activate.ps1 script. - -.Example -Activate.ps1 -Verbose -Activates the Python virtual environment that contains the Activate.ps1 script, -and shows extra information about the activation as it executes. - -.Example -Activate.ps1 -VenvDir C:\Users\MyUser\Common\.venv -Activates the Python virtual environment located in the specified location. - -.Example -Activate.ps1 -Prompt "MyPython" -Activates the Python virtual environment that contains the Activate.ps1 script, -and prefixes the current prompt with the specified string (surrounded in -parentheses) while the virtual environment is active. - -.Notes -On Windows, it may be required to enable this Activate.ps1 script by setting the -execution policy for the user. You can do this by issuing the following PowerShell -command: - -PS C:\> Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser - -For more information on Execution Policies: -https://go.microsoft.com/fwlink/?LinkID=135170 - -#> -Param( - [Parameter(Mandatory = $false)] - [String] - $VenvDir, - [Parameter(Mandatory = $false)] - [String] - $Prompt -) - -<# Function declarations --------------------------------------------------- #> - -<# -.Synopsis -Remove all shell session elements added by the Activate script, including the -addition of the virtual environment's Python executable from the beginning of -the PATH variable. - -.Parameter NonDestructive -If present, do not remove this function from the global namespace for the -session. - -#> -function global:deactivate ([switch]$NonDestructive) { - # Revert to original values - - # The prior prompt: - if (Test-Path -Path Function:_OLD_VIRTUAL_PROMPT) { - Copy-Item -Path Function:_OLD_VIRTUAL_PROMPT -Destination Function:prompt - Remove-Item -Path Function:_OLD_VIRTUAL_PROMPT - } - - # The prior PYTHONHOME: - if (Test-Path -Path Env:_OLD_VIRTUAL_PYTHONHOME) { - Copy-Item -Path Env:_OLD_VIRTUAL_PYTHONHOME -Destination Env:PYTHONHOME - Remove-Item -Path Env:_OLD_VIRTUAL_PYTHONHOME - } - - # The prior PATH: - if (Test-Path -Path Env:_OLD_VIRTUAL_PATH) { - Copy-Item -Path Env:_OLD_VIRTUAL_PATH -Destination Env:PATH - Remove-Item -Path Env:_OLD_VIRTUAL_PATH - } - - # Just remove the VIRTUAL_ENV altogether: - if (Test-Path -Path Env:VIRTUAL_ENV) { - Remove-Item -Path env:VIRTUAL_ENV - } - - # Just remove the _PYTHON_VENV_PROMPT_PREFIX altogether: - if (Get-Variable -Name "_PYTHON_VENV_PROMPT_PREFIX" -ErrorAction SilentlyContinue) { - Remove-Variable -Name _PYTHON_VENV_PROMPT_PREFIX -Scope Global -Force - } - - # Leave deactivate function in the global namespace if requested: - if (-not $NonDestructive) { - Remove-Item -Path function:deactivate - } -} - -<# -.Description -Get-PyVenvConfig parses the values from the pyvenv.cfg file located in the -given folder, and returns them in a map. - -For each line in the pyvenv.cfg file, if that line can be parsed into exactly -two strings separated by `=` (with any amount of whitespace surrounding the =) -then it is considered a `key = value` line. The left hand string is the key, -the right hand is the value. - -If the value starts with a `'` or a `"` then the first and last character is -stripped from the value before being captured. - -.Parameter ConfigDir -Path to the directory that contains the `pyvenv.cfg` file. -#> -function Get-PyVenvConfig( - [String] - $ConfigDir -) { - Write-Verbose "Given ConfigDir=$ConfigDir, obtain values in pyvenv.cfg" - - # Ensure the file exists, and issue a warning if it doesn't (but still allow the function to continue). - $pyvenvConfigPath = Join-Path -Resolve -Path $ConfigDir -ChildPath 'pyvenv.cfg' -ErrorAction Continue - - # An empty map will be returned if no config file is found. - $pyvenvConfig = @{ } - - if ($pyvenvConfigPath) { - - Write-Verbose "File exists, parse `key = value` lines" - $pyvenvConfigContent = Get-Content -Path $pyvenvConfigPath - - $pyvenvConfigContent | ForEach-Object { - $keyval = $PSItem -split "\s*=\s*", 2 - if ($keyval[0] -and $keyval[1]) { - $val = $keyval[1] - - # Remove extraneous quotations around a string value. - if ("'""".Contains($val.Substring(0, 1))) { - $val = $val.Substring(1, $val.Length - 2) - } - - $pyvenvConfig[$keyval[0]] = $val - Write-Verbose "Adding Key: '$($keyval[0])'='$val'" - } - } - } - return $pyvenvConfig -} - - -<# Begin Activate script --------------------------------------------------- #> - -# Determine the containing directory of this script -$VenvExecPath = Split-Path -Parent $MyInvocation.MyCommand.Definition -$VenvExecDir = Get-Item -Path $VenvExecPath - -Write-Verbose "Activation script is located in path: '$VenvExecPath'" -Write-Verbose "VenvExecDir Fullname: '$($VenvExecDir.FullName)" -Write-Verbose "VenvExecDir Name: '$($VenvExecDir.Name)" - -# Set values required in priority: CmdLine, ConfigFile, Default -# First, get the location of the virtual environment, it might not be -# VenvExecDir if specified on the command line. -if ($VenvDir) { - Write-Verbose "VenvDir given as parameter, using '$VenvDir' to determine values" -} -else { - Write-Verbose "VenvDir not given as a parameter, using parent directory name as VenvDir." - $VenvDir = $VenvExecDir.Parent.FullName.TrimEnd("\\/") - Write-Verbose "VenvDir=$VenvDir" -} - -# Next, read the `pyvenv.cfg` file to determine any required value such -# as `prompt`. -$pyvenvCfg = Get-PyVenvConfig -ConfigDir $VenvDir - -# Next, set the prompt from the command line, or the config file, or -# just use the name of the virtual environment folder. -if ($Prompt) { - Write-Verbose "Prompt specified as argument, using '$Prompt'" -} -else { - Write-Verbose "Prompt not specified as argument to script, checking pyvenv.cfg value" - if ($pyvenvCfg -and $pyvenvCfg['prompt']) { - Write-Verbose " Setting based on value in pyvenv.cfg='$($pyvenvCfg['prompt'])'" - $Prompt = $pyvenvCfg['prompt']; - } - else { - Write-Verbose " Setting prompt based on parent's directory's name. (Is the directory name passed to venv module when creating the virutal environment)" - Write-Verbose " Got leaf-name of $VenvDir='$(Split-Path -Path $venvDir -Leaf)'" - $Prompt = Split-Path -Path $venvDir -Leaf - } -} - -Write-Verbose "Prompt = '$Prompt'" -Write-Verbose "VenvDir='$VenvDir'" - -# Deactivate any currently active virtual environment, but leave the -# deactivate function in place. -deactivate -nondestructive - -# Now set the environment variable VIRTUAL_ENV, used by many tools to determine -# that there is an activated venv. -$env:VIRTUAL_ENV = $VenvDir - -if (-not $Env:VIRTUAL_ENV_DISABLE_PROMPT) { - - Write-Verbose "Setting prompt to '$Prompt'" - - # Set the prompt to include the env name - # Make sure _OLD_VIRTUAL_PROMPT is global - function global:_OLD_VIRTUAL_PROMPT { "" } - Copy-Item -Path function:prompt -Destination function:_OLD_VIRTUAL_PROMPT - New-Variable -Name _PYTHON_VENV_PROMPT_PREFIX -Description "Python virtual environment prompt prefix" -Scope Global -Option ReadOnly -Visibility Public -Value $Prompt - - function global:prompt { - Write-Host -NoNewline -ForegroundColor Green "($_PYTHON_VENV_PROMPT_PREFIX) " - _OLD_VIRTUAL_PROMPT - } -} - -# Clear PYTHONHOME -if (Test-Path -Path Env:PYTHONHOME) { - Copy-Item -Path Env:PYTHONHOME -Destination Env:_OLD_VIRTUAL_PYTHONHOME - Remove-Item -Path Env:PYTHONHOME -} - -# Add the venv to the PATH -Copy-Item -Path Env:PATH -Destination Env:_OLD_VIRTUAL_PATH -$Env:PATH = "$VenvExecDir$([System.IO.Path]::PathSeparator)$Env:PATH" diff --git a/venv/bin/activate b/venv/bin/activate deleted file mode 100644 index ffbdb36..0000000 --- a/venv/bin/activate +++ /dev/null @@ -1,76 +0,0 @@ -# This file must be used with "source bin/activate" *from bash* -# you cannot run it directly - -deactivate () { - # reset old environment variables - if [ -n "${_OLD_VIRTUAL_PATH:-}" ] ; then - PATH="${_OLD_VIRTUAL_PATH:-}" - export PATH - unset _OLD_VIRTUAL_PATH - fi - if [ -n "${_OLD_VIRTUAL_PYTHONHOME:-}" ] ; then - PYTHONHOME="${_OLD_VIRTUAL_PYTHONHOME:-}" - export PYTHONHOME - unset _OLD_VIRTUAL_PYTHONHOME - fi - - # This should detect bash and zsh, which have a hash command that must - # be called to get it to forget past commands. Without forgetting - # past commands the $PATH changes we made may not be respected - if [ -n "${BASH:-}" -o -n "${ZSH_VERSION:-}" ] ; then - hash -r - fi - - if [ -n "${_OLD_VIRTUAL_PS1:-}" ] ; then - PS1="${_OLD_VIRTUAL_PS1:-}" - export PS1 - unset _OLD_VIRTUAL_PS1 - fi - - unset VIRTUAL_ENV - if [ ! "${1:-}" = "nondestructive" ] ; then - # Self destruct! - unset -f deactivate - fi -} - -# unset irrelevant variables -deactivate nondestructive - -VIRTUAL_ENV="/home/naresh/Dev/ssr-tracing-backend/venv" -export VIRTUAL_ENV - -_OLD_VIRTUAL_PATH="$PATH" -PATH="$VIRTUAL_ENV/bin:$PATH" -export PATH - -# unset PYTHONHOME if set -# this will fail if PYTHONHOME is set to the empty string (which is bad anyway) -# could use `if (set -u; : $PYTHONHOME) ;` in bash -if [ -n "${PYTHONHOME:-}" ] ; then - _OLD_VIRTUAL_PYTHONHOME="${PYTHONHOME:-}" - unset PYTHONHOME -fi - -if [ -z "${VIRTUAL_ENV_DISABLE_PROMPT:-}" ] ; then - _OLD_VIRTUAL_PS1="${PS1:-}" - if [ "x(venv) " != x ] ; then - PS1="(venv) ${PS1:-}" - else - if [ "`basename \"$VIRTUAL_ENV\"`" = "__" ] ; then - # special case for Aspen magic directories - # see https://aspen.io/ - PS1="[`basename \`dirname \"$VIRTUAL_ENV\"\``] $PS1" - else - PS1="(`basename \"$VIRTUAL_ENV\"`)$PS1" - fi - fi - export PS1 -fi - -# This should detect bash and zsh, which have a hash command that must -# be called to get it to forget past commands. Without forgetting -# past commands the $PATH changes we made may not be respected -if [ -n "${BASH:-}" -o -n "${ZSH_VERSION:-}" ] ; then - hash -r -fi diff --git a/venv/bin/activate.csh b/venv/bin/activate.csh deleted file mode 100644 index 6c8cb80..0000000 --- a/venv/bin/activate.csh +++ /dev/null @@ -1,37 +0,0 @@ -# This file must be used with "source bin/activate.csh" *from csh*. -# You cannot run it directly. -# Created by Davide Di Blasi . -# Ported to Python 3.3 venv by Andrew Svetlov - -alias deactivate 'test $?_OLD_VIRTUAL_PATH != 0 && setenv PATH "$_OLD_VIRTUAL_PATH" && unset _OLD_VIRTUAL_PATH; rehash; test $?_OLD_VIRTUAL_PROMPT != 0 && set prompt="$_OLD_VIRTUAL_PROMPT" && unset _OLD_VIRTUAL_PROMPT; unsetenv VIRTUAL_ENV; test "\!:*" != "nondestructive" && unalias deactivate' - -# Unset irrelevant variables. -deactivate nondestructive - -setenv VIRTUAL_ENV "/home/naresh/Dev/ssr-tracing-backend/venv" - -set _OLD_VIRTUAL_PATH="$PATH" -setenv PATH "$VIRTUAL_ENV/bin:$PATH" - - -set _OLD_VIRTUAL_PROMPT="$prompt" - -if (! "$?VIRTUAL_ENV_DISABLE_PROMPT") then - if ("venv" != "") then - set env_name = "venv" - else - if (`basename "VIRTUAL_ENV"` == "__") then - # special case for Aspen magic directories - # see https://aspen.io/ - set env_name = `basename \`dirname "$VIRTUAL_ENV"\`` - else - set env_name = `basename "$VIRTUAL_ENV"` - endif - endif - set prompt = "[$env_name] $prompt" - unset env_name -endif - -alias pydoc python -m pydoc - -rehash diff --git a/venv/bin/activate.fish b/venv/bin/activate.fish deleted file mode 100644 index 1183cc8..0000000 --- a/venv/bin/activate.fish +++ /dev/null @@ -1,75 +0,0 @@ -# This file must be used with ". bin/activate.fish" *from fish* (http://fishshell.org) -# you cannot run it directly - -function deactivate -d "Exit virtualenv and return to normal shell environment" - # reset old environment variables - if test -n "$_OLD_VIRTUAL_PATH" - set -gx PATH $_OLD_VIRTUAL_PATH - set -e _OLD_VIRTUAL_PATH - end - if test -n "$_OLD_VIRTUAL_PYTHONHOME" - set -gx PYTHONHOME $_OLD_VIRTUAL_PYTHONHOME - set -e _OLD_VIRTUAL_PYTHONHOME - end - - if test -n "$_OLD_FISH_PROMPT_OVERRIDE" - functions -e fish_prompt - set -e _OLD_FISH_PROMPT_OVERRIDE - functions -c _old_fish_prompt fish_prompt - functions -e _old_fish_prompt - end - - set -e VIRTUAL_ENV - if test "$argv[1]" != "nondestructive" - # Self destruct! - functions -e deactivate - end -end - -# unset irrelevant variables -deactivate nondestructive - -set -gx VIRTUAL_ENV "/home/naresh/Dev/ssr-tracing-backend/venv" - -set -gx _OLD_VIRTUAL_PATH $PATH -set -gx PATH "$VIRTUAL_ENV/bin" $PATH - -# unset PYTHONHOME if set -if set -q PYTHONHOME - set -gx _OLD_VIRTUAL_PYTHONHOME $PYTHONHOME - set -e PYTHONHOME -end - -if test -z "$VIRTUAL_ENV_DISABLE_PROMPT" - # fish uses a function instead of an env var to generate the prompt. - - # save the current fish_prompt function as the function _old_fish_prompt - functions -c fish_prompt _old_fish_prompt - - # with the original prompt function renamed, we can override with our own. - function fish_prompt - # Save the return status of the last command - set -l old_status $status - - # Prompt override? - if test -n "(venv) " - printf "%s%s" "(venv) " (set_color normal) - else - # ...Otherwise, prepend env - set -l _checkbase (basename "$VIRTUAL_ENV") - if test $_checkbase = "__" - # special case for Aspen magic directories - # see https://aspen.io/ - printf "%s[%s]%s " (set_color -b blue white) (basename (dirname "$VIRTUAL_ENV")) (set_color normal) - else - printf "%s(%s)%s" (set_color -b blue white) (basename "$VIRTUAL_ENV") (set_color normal) - end - end - - # Restore the return status of the previous command. - echo "exit $old_status" | . - _old_fish_prompt - end - - set -gx _OLD_FISH_PROMPT_OVERRIDE "$VIRTUAL_ENV" -end diff --git a/venv/bin/easy_install b/venv/bin/easy_install deleted file mode 100755 index 32bcbc8..0000000 --- a/venv/bin/easy_install +++ /dev/null @@ -1,8 +0,0 @@ -#!/home/naresh/Dev/ssr-tracing-backend/venv/bin/python3 -# -*- coding: utf-8 -*- -import re -import sys -from setuptools.command.easy_install import main -if __name__ == '__main__': - sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) - sys.exit(main()) diff --git a/venv/bin/easy_install-3.8 b/venv/bin/easy_install-3.8 deleted file mode 100755 index 32bcbc8..0000000 --- a/venv/bin/easy_install-3.8 +++ /dev/null @@ -1,8 +0,0 @@ -#!/home/naresh/Dev/ssr-tracing-backend/venv/bin/python3 -# -*- coding: utf-8 -*- -import re -import sys -from setuptools.command.easy_install import main -if __name__ == '__main__': - sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) - sys.exit(main()) diff --git a/venv/bin/flask b/venv/bin/flask deleted file mode 100755 index cc0e148..0000000 --- a/venv/bin/flask +++ /dev/null @@ -1,8 +0,0 @@ -#!/home/naresh/Dev/ssr-tracing-backend/venv/bin/python3 -# -*- coding: utf-8 -*- -import re -import sys -from flask.cli import main -if __name__ == '__main__': - sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) - sys.exit(main()) diff --git a/venv/bin/pip b/venv/bin/pip deleted file mode 100755 index 65fbd19..0000000 --- a/venv/bin/pip +++ /dev/null @@ -1,8 +0,0 @@ -#!/home/naresh/Dev/ssr-tracing-backend/venv/bin/python3 -# -*- coding: utf-8 -*- -import re -import sys -from pip._internal.cli.main import main -if __name__ == '__main__': - sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) - sys.exit(main()) diff --git a/venv/bin/pip3 b/venv/bin/pip3 deleted file mode 100755 index 65fbd19..0000000 --- a/venv/bin/pip3 +++ /dev/null @@ -1,8 +0,0 @@ -#!/home/naresh/Dev/ssr-tracing-backend/venv/bin/python3 -# -*- coding: utf-8 -*- -import re -import sys -from pip._internal.cli.main import main -if __name__ == '__main__': - sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) - sys.exit(main()) diff --git a/venv/bin/pip3.8 b/venv/bin/pip3.8 deleted file mode 100755 index 65fbd19..0000000 --- a/venv/bin/pip3.8 +++ /dev/null @@ -1,8 +0,0 @@ -#!/home/naresh/Dev/ssr-tracing-backend/venv/bin/python3 -# -*- coding: utf-8 -*- -import re -import sys -from pip._internal.cli.main import main -if __name__ == '__main__': - sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) - sys.exit(main()) diff --git a/venv/bin/python b/venv/bin/python deleted file mode 120000 index b8a0adb..0000000 --- a/venv/bin/python +++ /dev/null @@ -1 +0,0 @@ -python3 \ No newline at end of file diff --git a/venv/bin/python3 b/venv/bin/python3 deleted file mode 120000 index ae65fda..0000000 --- a/venv/bin/python3 +++ /dev/null @@ -1 +0,0 @@ -/usr/bin/python3 \ No newline at end of file diff --git a/venv/lib/python3.8/site-packages/Flask-2.0.1.dist-info/INSTALLER b/venv/lib/python3.8/site-packages/Flask-2.0.1.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/venv/lib/python3.8/site-packages/Flask-2.0.1.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/venv/lib/python3.8/site-packages/Flask-2.0.1.dist-info/LICENSE.rst b/venv/lib/python3.8/site-packages/Flask-2.0.1.dist-info/LICENSE.rst deleted file mode 100644 index 9d227a0..0000000 --- a/venv/lib/python3.8/site-packages/Flask-2.0.1.dist-info/LICENSE.rst +++ /dev/null @@ -1,28 +0,0 @@ -Copyright 2010 Pallets - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - -2. 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. - -3. Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED -TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/venv/lib/python3.8/site-packages/Flask-2.0.1.dist-info/METADATA b/venv/lib/python3.8/site-packages/Flask-2.0.1.dist-info/METADATA deleted file mode 100644 index 2b881c2..0000000 --- a/venv/lib/python3.8/site-packages/Flask-2.0.1.dist-info/METADATA +++ /dev/null @@ -1,124 +0,0 @@ -Metadata-Version: 2.1 -Name: Flask -Version: 2.0.1 -Summary: A simple framework for building complex web applications. -Home-page: https://palletsprojects.com/p/flask -Author: Armin Ronacher -Author-email: armin.ronacher@active-4.com -Maintainer: Pallets -Maintainer-email: contact@palletsprojects.com -License: BSD-3-Clause -Project-URL: Donate, https://palletsprojects.com/donate -Project-URL: Documentation, https://flask.palletsprojects.com/ -Project-URL: Changes, https://flask.palletsprojects.com/changes/ -Project-URL: Source Code, https://github.com/pallets/flask/ -Project-URL: Issue Tracker, https://github.com/pallets/flask/issues/ -Project-URL: Twitter, https://twitter.com/PalletsTeam -Project-URL: Chat, https://discord.gg/pallets -Platform: UNKNOWN -Classifier: Development Status :: 5 - Production/Stable -Classifier: Environment :: Web Environment -Classifier: Framework :: Flask -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: BSD License -Classifier: Operating System :: OS Independent -Classifier: Programming Language :: Python -Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content -Classifier: Topic :: Internet :: WWW/HTTP :: WSGI -Classifier: Topic :: Internet :: WWW/HTTP :: WSGI :: Application -Classifier: Topic :: Software Development :: Libraries :: Application Frameworks -Requires-Python: >=3.6 -Description-Content-Type: text/x-rst -Requires-Dist: Werkzeug (>=2.0) -Requires-Dist: Jinja2 (>=3.0) -Requires-Dist: itsdangerous (>=2.0) -Requires-Dist: click (>=7.1.2) -Provides-Extra: async -Requires-Dist: asgiref (>=3.2) ; extra == 'async' -Provides-Extra: dotenv -Requires-Dist: python-dotenv ; extra == 'dotenv' - -Flask -===== - -Flask is a lightweight `WSGI`_ web application framework. It is designed -to make getting started quick and easy, with the ability to scale up to -complex applications. It began as a simple wrapper around `Werkzeug`_ -and `Jinja`_ and has become one of the most popular Python web -application frameworks. - -Flask offers suggestions, but doesn't enforce any dependencies or -project layout. It is up to the developer to choose the tools and -libraries they want to use. There are many extensions provided by the -community that make adding new functionality easy. - -.. _WSGI: https://wsgi.readthedocs.io/ -.. _Werkzeug: https://werkzeug.palletsprojects.com/ -.. _Jinja: https://jinja.palletsprojects.com/ - - -Installing ----------- - -Install and update using `pip`_: - -.. code-block:: text - - $ pip install -U Flask - -.. _pip: https://pip.pypa.io/en/stable/quickstart/ - - -A Simple Example ----------------- - -.. code-block:: python - - # save this as app.py - from flask import Flask - - app = Flask(__name__) - - @app.route("/") - def hello(): - return "Hello, World!" - -.. code-block:: text - - $ flask run - * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit) - - -Contributing ------------- - -For guidance on setting up a development environment and how to make a -contribution to Flask, see the `contributing guidelines`_. - -.. _contributing guidelines: https://github.com/pallets/flask/blob/main/CONTRIBUTING.rst - - -Donate ------- - -The Pallets organization develops and supports Flask and the libraries -it uses. In order to grow the community of contributors and users, and -allow the maintainers to devote more time to the projects, `please -donate today`_. - -.. _please donate today: https://palletsprojects.com/donate - - -Links ------ - -- Documentation: https://flask.palletsprojects.com/ -- Changes: https://flask.palletsprojects.com/changes/ -- PyPI Releases: https://pypi.org/project/Flask/ -- Source Code: https://github.com/pallets/flask/ -- Issue Tracker: https://github.com/pallets/flask/issues/ -- Website: https://palletsprojects.com/p/flask/ -- Twitter: https://twitter.com/PalletsTeam -- Chat: https://discord.gg/pallets - - diff --git a/venv/lib/python3.8/site-packages/Flask-2.0.1.dist-info/RECORD b/venv/lib/python3.8/site-packages/Flask-2.0.1.dist-info/RECORD deleted file mode 100644 index 61a1d94..0000000 --- a/venv/lib/python3.8/site-packages/Flask-2.0.1.dist-info/RECORD +++ /dev/null @@ -1,51 +0,0 @@ -../../../bin/flask,sha256=zIrztxERuROObwxpKwNy3Jw1ugFzq1uWtdKuPVSwoe8,245 -Flask-2.0.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -Flask-2.0.1.dist-info/LICENSE.rst,sha256=SJqOEQhQntmKN7uYPhHg9-HTHwvY-Zp5yESOf_N9B-o,1475 -Flask-2.0.1.dist-info/METADATA,sha256=50Jm1647RKw98p4RF64bCqRh0wajk-n3hQ7av2-pniA,3808 -Flask-2.0.1.dist-info/RECORD,, -Flask-2.0.1.dist-info/WHEEL,sha256=OqRkF0eY5GHssMorFjlbTIq072vpHpF60fIQA6lS9xA,92 -Flask-2.0.1.dist-info/entry_points.txt,sha256=gBLA1aKg0OYR8AhbAfg8lnburHtKcgJLDU52BBctN0k,42 -Flask-2.0.1.dist-info/top_level.txt,sha256=dvi65F6AeGWVU0TBpYiC04yM60-FX1gJFkK31IKQr5c,6 -flask/__init__.py,sha256=w5v6GCNm8eLDMNWqs2ue7HLHo75aslAwz1h3k3YO9HY,2251 -flask/__main__.py,sha256=bYt9eEaoRQWdejEHFD8REx9jxVEdZptECFsV7F49Ink,30 -flask/__pycache__/__init__.cpython-38.pyc,, -flask/__pycache__/__main__.cpython-38.pyc,, -flask/__pycache__/app.cpython-38.pyc,, -flask/__pycache__/blueprints.cpython-38.pyc,, -flask/__pycache__/cli.cpython-38.pyc,, -flask/__pycache__/config.cpython-38.pyc,, -flask/__pycache__/ctx.cpython-38.pyc,, -flask/__pycache__/debughelpers.cpython-38.pyc,, -flask/__pycache__/globals.cpython-38.pyc,, -flask/__pycache__/helpers.cpython-38.pyc,, -flask/__pycache__/logging.cpython-38.pyc,, -flask/__pycache__/scaffold.cpython-38.pyc,, -flask/__pycache__/sessions.cpython-38.pyc,, -flask/__pycache__/signals.cpython-38.pyc,, -flask/__pycache__/templating.cpython-38.pyc,, -flask/__pycache__/testing.cpython-38.pyc,, -flask/__pycache__/typing.cpython-38.pyc,, -flask/__pycache__/views.cpython-38.pyc,, -flask/__pycache__/wrappers.cpython-38.pyc,, -flask/app.py,sha256=q6lpiiWVxjljQRwjjneUBpfllXYPEq0CFAUpTQ5gIeA,82376 -flask/blueprints.py,sha256=OjI-dkwx96ZNMUGDDFMKzgcpUJf240WRuMlHkmgI1Lc,23541 -flask/cli.py,sha256=iN1pL2SevE5Nmvey-0WwnxG3nipZXIiE__Ed4lx3IuM,32036 -flask/config.py,sha256=jj_7JGen_kYuTlKrx8ZPBsZddb8mihC0ODg4gcjXBX8,11068 -flask/ctx.py,sha256=EM3W0v1ctuFQAGk_HWtQdoJEg_r2f5Le4xcmElxFwwk,17428 -flask/debughelpers.py,sha256=wk5HtLwENsQ4e8tkxfBn6ykUeVRDuMbQCKgtEVe6jxk,6171 -flask/globals.py,sha256=cWd-R2hUH3VqPhnmQNww892tQS6Yjqg_wg8UvW1M7NM,1723 -flask/helpers.py,sha256=00WqA3wYeyjMrnAOPZTUyrnUf7H8ik3CVT0kqGl_qjk,30589 -flask/json/__init__.py,sha256=d-db2DJMASq0G7CI-JvobehRE1asNRGX1rIDQ1GF9WM,11580 -flask/json/__pycache__/__init__.cpython-38.pyc,, -flask/json/__pycache__/tag.cpython-38.pyc,, -flask/json/tag.py,sha256=fys3HBLssWHuMAIJuTcf2K0bCtosePBKXIWASZEEjnU,8857 -flask/logging.py,sha256=1o_hirVGqdj7SBdETnhX7IAjklG89RXlrwz_2CjzQQE,2273 -flask/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -flask/scaffold.py,sha256=EhQuiFrdcmJHxqPGQkEpqLsEUZ7ULZD0rtED2NrduvM,32400 -flask/sessions.py,sha256=Kb7zY4qBIOU2cw1xM5mQ_KmgYUBDFbUYWjlkq0EFYis,15189 -flask/signals.py,sha256=HQWgBEXlrLbHwLBoWqAStJKcN-rsB1_AMO8-VZ7LDOo,2126 -flask/templating.py,sha256=l96VD39JQ0nue4Bcj7wZ4-FWWs-ppLxvgBCpwDQ4KAk,5626 -flask/testing.py,sha256=OsHT-2B70abWH3ulY9IbhLchXIeyj3L-cfcDa88wv5E,10281 -flask/typing.py,sha256=zVqhz53KklncAv-WxbpxGZfaRGOqeWAsLdP1tTMaCuE,1684 -flask/views.py,sha256=F2PpWPloe4x0906IUjnPcsOqg5YvmQIfk07_lFeAD4s,5865 -flask/wrappers.py,sha256=VndbHPRBSUUOejmd2Y3ydkoCVUtsS2OJIdJEVIkBVD8,5604 diff --git a/venv/lib/python3.8/site-packages/Flask-2.0.1.dist-info/WHEEL b/venv/lib/python3.8/site-packages/Flask-2.0.1.dist-info/WHEEL deleted file mode 100644 index 385faab..0000000 --- a/venv/lib/python3.8/site-packages/Flask-2.0.1.dist-info/WHEEL +++ /dev/null @@ -1,5 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.36.2) -Root-Is-Purelib: true -Tag: py3-none-any - diff --git a/venv/lib/python3.8/site-packages/Flask-2.0.1.dist-info/entry_points.txt b/venv/lib/python3.8/site-packages/Flask-2.0.1.dist-info/entry_points.txt deleted file mode 100644 index 1eb0252..0000000 --- a/venv/lib/python3.8/site-packages/Flask-2.0.1.dist-info/entry_points.txt +++ /dev/null @@ -1,3 +0,0 @@ -[console_scripts] -flask = flask.cli:main - diff --git a/venv/lib/python3.8/site-packages/Flask-2.0.1.dist-info/top_level.txt b/venv/lib/python3.8/site-packages/Flask-2.0.1.dist-info/top_level.txt deleted file mode 100644 index 7e10602..0000000 --- a/venv/lib/python3.8/site-packages/Flask-2.0.1.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -flask diff --git a/venv/lib/python3.8/site-packages/Jinja2-3.0.1.dist-info/INSTALLER b/venv/lib/python3.8/site-packages/Jinja2-3.0.1.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/venv/lib/python3.8/site-packages/Jinja2-3.0.1.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/venv/lib/python3.8/site-packages/Jinja2-3.0.1.dist-info/LICENSE.rst b/venv/lib/python3.8/site-packages/Jinja2-3.0.1.dist-info/LICENSE.rst deleted file mode 100644 index c37cae4..0000000 --- a/venv/lib/python3.8/site-packages/Jinja2-3.0.1.dist-info/LICENSE.rst +++ /dev/null @@ -1,28 +0,0 @@ -Copyright 2007 Pallets - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - -2. 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. - -3. Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED -TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/venv/lib/python3.8/site-packages/Jinja2-3.0.1.dist-info/METADATA b/venv/lib/python3.8/site-packages/Jinja2-3.0.1.dist-info/METADATA deleted file mode 100644 index afd84cb..0000000 --- a/venv/lib/python3.8/site-packages/Jinja2-3.0.1.dist-info/METADATA +++ /dev/null @@ -1,112 +0,0 @@ -Metadata-Version: 2.1 -Name: Jinja2 -Version: 3.0.1 -Summary: A very fast and expressive template engine. -Home-page: https://palletsprojects.com/p/jinja/ -Author: Armin Ronacher -Author-email: armin.ronacher@active-4.com -Maintainer: Pallets -Maintainer-email: contact@palletsprojects.com -License: BSD-3-Clause -Project-URL: Donate, https://palletsprojects.com/donate -Project-URL: Documentation, https://jinja.palletsprojects.com/ -Project-URL: Changes, https://jinja.palletsprojects.com/changes/ -Project-URL: Source Code, https://github.com/pallets/jinja/ -Project-URL: Issue Tracker, https://github.com/pallets/jinja/issues/ -Project-URL: Twitter, https://twitter.com/PalletsTeam -Project-URL: Chat, https://discord.gg/pallets -Platform: UNKNOWN -Classifier: Development Status :: 5 - Production/Stable -Classifier: Environment :: Web Environment -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: BSD License -Classifier: Operating System :: OS Independent -Classifier: Programming Language :: Python -Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content -Classifier: Topic :: Text Processing :: Markup :: HTML -Requires-Python: >=3.6 -Description-Content-Type: text/x-rst -Requires-Dist: MarkupSafe (>=2.0) -Provides-Extra: i18n -Requires-Dist: Babel (>=2.7) ; extra == 'i18n' - -Jinja -===== - -Jinja is a fast, expressive, extensible templating engine. Special -placeholders in the template allow writing code similar to Python -syntax. Then the template is passed data to render the final document. - -It includes: - -- Template inheritance and inclusion. -- Define and import macros within templates. -- HTML templates can use autoescaping to prevent XSS from untrusted - user input. -- A sandboxed environment can safely render untrusted templates. -- AsyncIO support for generating templates and calling async - functions. -- I18N support with Babel. -- Templates are compiled to optimized Python code just-in-time and - cached, or can be compiled ahead-of-time. -- Exceptions point to the correct line in templates to make debugging - easier. -- Extensible filters, tests, functions, and even syntax. - -Jinja's philosophy is that while application logic belongs in Python if -possible, it shouldn't make the template designer's job difficult by -restricting functionality too much. - - -Installing ----------- - -Install and update using `pip`_: - -.. code-block:: text - - $ pip install -U Jinja2 - -.. _pip: https://pip.pypa.io/en/stable/quickstart/ - - -In A Nutshell -------------- - -.. code-block:: jinja - - {% extends "base.html" %} - {% block title %}Members{% endblock %} - {% block content %} - - {% endblock %} - - -Donate ------- - -The Pallets organization develops and supports Jinja and other popular -packages. In order to grow the community of contributors and users, and -allow the maintainers to devote more time to the projects, `please -donate today`_. - -.. _please donate today: https://palletsprojects.com/donate - - -Links ------ - -- Documentation: https://jinja.palletsprojects.com/ -- Changes: https://jinja.palletsprojects.com/changes/ -- PyPI Releases: https://pypi.org/project/Jinja2/ -- Source Code: https://github.com/pallets/jinja/ -- Issue Tracker: https://github.com/pallets/jinja/issues/ -- Website: https://palletsprojects.com/p/jinja/ -- Twitter: https://twitter.com/PalletsTeam -- Chat: https://discord.gg/pallets - - diff --git a/venv/lib/python3.8/site-packages/Jinja2-3.0.1.dist-info/RECORD b/venv/lib/python3.8/site-packages/Jinja2-3.0.1.dist-info/RECORD deleted file mode 100644 index b4692b4..0000000 --- a/venv/lib/python3.8/site-packages/Jinja2-3.0.1.dist-info/RECORD +++ /dev/null @@ -1,58 +0,0 @@ -Jinja2-3.0.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -Jinja2-3.0.1.dist-info/LICENSE.rst,sha256=O0nc7kEF6ze6wQ-vG-JgQI_oXSUrjp3y4JefweCUQ3s,1475 -Jinja2-3.0.1.dist-info/METADATA,sha256=k6STiOONbGESP2rEKmjhznuG10vm9sNCHCUQL9AQFM4,3508 -Jinja2-3.0.1.dist-info/RECORD,, -Jinja2-3.0.1.dist-info/WHEEL,sha256=OqRkF0eY5GHssMorFjlbTIq072vpHpF60fIQA6lS9xA,92 -Jinja2-3.0.1.dist-info/entry_points.txt,sha256=Qy_DkVo6Xj_zzOtmErrATe8lHZhOqdjpt3e4JJAGyi8,61 -Jinja2-3.0.1.dist-info/top_level.txt,sha256=PkeVWtLb3-CqjWi1fO29OCbj55EhX_chhKrCdrVe_zs,7 -jinja2/__init__.py,sha256=fd8jaCRsCATgC7ahuUTD8CyfQoc4aRfALEIny4mwfog,2205 -jinja2/__pycache__/__init__.cpython-38.pyc,, -jinja2/__pycache__/_identifier.cpython-38.pyc,, -jinja2/__pycache__/async_utils.cpython-38.pyc,, -jinja2/__pycache__/bccache.cpython-38.pyc,, -jinja2/__pycache__/compiler.cpython-38.pyc,, -jinja2/__pycache__/constants.cpython-38.pyc,, -jinja2/__pycache__/debug.cpython-38.pyc,, -jinja2/__pycache__/defaults.cpython-38.pyc,, -jinja2/__pycache__/environment.cpython-38.pyc,, -jinja2/__pycache__/exceptions.cpython-38.pyc,, -jinja2/__pycache__/ext.cpython-38.pyc,, -jinja2/__pycache__/filters.cpython-38.pyc,, -jinja2/__pycache__/idtracking.cpython-38.pyc,, -jinja2/__pycache__/lexer.cpython-38.pyc,, -jinja2/__pycache__/loaders.cpython-38.pyc,, -jinja2/__pycache__/meta.cpython-38.pyc,, -jinja2/__pycache__/nativetypes.cpython-38.pyc,, -jinja2/__pycache__/nodes.cpython-38.pyc,, -jinja2/__pycache__/optimizer.cpython-38.pyc,, -jinja2/__pycache__/parser.cpython-38.pyc,, -jinja2/__pycache__/runtime.cpython-38.pyc,, -jinja2/__pycache__/sandbox.cpython-38.pyc,, -jinja2/__pycache__/tests.cpython-38.pyc,, -jinja2/__pycache__/utils.cpython-38.pyc,, -jinja2/__pycache__/visitor.cpython-38.pyc,, -jinja2/_identifier.py,sha256=EdgGJKi7O1yvr4yFlvqPNEqV6M1qHyQr8Gt8GmVTKVM,1775 -jinja2/async_utils.py,sha256=bY2nCUfBA_4FSnNUsIsJgljBq3hACr6fzLi7LiyMTn8,1751 -jinja2/bccache.py,sha256=smAvSDgDSvXdvJzCN_9s0XfkVpQEu8be-QwgeMlrwiM,12677 -jinja2/compiler.py,sha256=qq0Fo9EpDAEwHPLAs3sAP7dindUvDrFrbx4AcB8xV5M,72046 -jinja2/constants.py,sha256=GMoFydBF_kdpaRKPoM5cl5MviquVRLVyZtfp5-16jg0,1433 -jinja2/debug.py,sha256=uBmrsiwjYH5l14R9STn5mydOOyriBYol5lDGvEqAb3A,9238 -jinja2/defaults.py,sha256=boBcSw78h-lp20YbaXSJsqkAI2uN_mD_TtCydpeq5wU,1267 -jinja2/environment.py,sha256=T6U4be9mY1CUXXin_EQFwpvpFqCiryweGqzXGRYIoSA,61573 -jinja2/exceptions.py,sha256=ioHeHrWwCWNaXX1inHmHVblvc4haO7AXsjCp3GfWvx0,5071 -jinja2/ext.py,sha256=44SjDjeYkkxQTpmC2BetOTxEFMgQ42p2dfSwXmPFcSo,32122 -jinja2/filters.py,sha256=LslRsJd0JVFBHtdfU_WraM1eQitotciwawiW-seR42U,52577 -jinja2/idtracking.py,sha256=KdFVohVNK-baOwt_INPMco19D7AfLDEN8i3_JoiYnGQ,10713 -jinja2/lexer.py,sha256=D5qOKB3KnRqK9gPAZFQvRguomYsQok5-14TKiWTN8Jw,29923 -jinja2/loaders.py,sha256=ePpWB0xDrILgLVqNFcxqqSbPizsI0T-JlkNEUFqq9fo,22350 -jinja2/meta.py,sha256=GNPEvifmSaU3CMxlbheBOZjeZ277HThOPUTf1RkppKQ,4396 -jinja2/nativetypes.py,sha256=62hvvsAxAj0YaxylOHoREYVogJ5JqOlJISgGY3OKd_o,3675 -jinja2/nodes.py,sha256=LHF97fu6GW4r2Z9UaOX92MOT1wZpdS9Nx4N-5Fp5ti8,34509 -jinja2/optimizer.py,sha256=tHkMwXxfZkbfA1KmLcqmBMSaz7RLIvvItrJcPoXTyD8,1650 -jinja2/parser.py,sha256=kHnU8v92GwMYkfr0MVakWv8UlSf_kJPx8LUsgQMof70,39767 -jinja2/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -jinja2/runtime.py,sha256=bSWdawLjReKpKHhF3-96OIuWYpUy1yxFJCN3jBYyoXc,35013 -jinja2/sandbox.py,sha256=-8zxR6TO9kUkciAVFsIKu8Oq-C7PTeYEdZ5TtA55-gw,14600 -jinja2/tests.py,sha256=Am5Z6Lmfr2XaH_npIfJJ8MdXtWsbLjMULZJulTAj30E,5905 -jinja2/utils.py,sha256=0wGkxDbxlW10y0ac4-kEiy1Bn0AsWXqz8uomK9Ugy1Q,26961 -jinja2/visitor.py,sha256=ZmeLuTj66ic35-uFH-1m0EKXiw4ObDDb_WuE6h5vPFg,3572 diff --git a/venv/lib/python3.8/site-packages/Jinja2-3.0.1.dist-info/WHEEL b/venv/lib/python3.8/site-packages/Jinja2-3.0.1.dist-info/WHEEL deleted file mode 100644 index 385faab..0000000 --- a/venv/lib/python3.8/site-packages/Jinja2-3.0.1.dist-info/WHEEL +++ /dev/null @@ -1,5 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.36.2) -Root-Is-Purelib: true -Tag: py3-none-any - diff --git a/venv/lib/python3.8/site-packages/Jinja2-3.0.1.dist-info/entry_points.txt b/venv/lib/python3.8/site-packages/Jinja2-3.0.1.dist-info/entry_points.txt deleted file mode 100644 index 3619483..0000000 --- a/venv/lib/python3.8/site-packages/Jinja2-3.0.1.dist-info/entry_points.txt +++ /dev/null @@ -1,3 +0,0 @@ -[babel.extractors] -jinja2 = jinja2.ext:babel_extract [i18n] - diff --git a/venv/lib/python3.8/site-packages/Jinja2-3.0.1.dist-info/top_level.txt b/venv/lib/python3.8/site-packages/Jinja2-3.0.1.dist-info/top_level.txt deleted file mode 100644 index 7f7afbf..0000000 --- a/venv/lib/python3.8/site-packages/Jinja2-3.0.1.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -jinja2 diff --git a/venv/lib/python3.8/site-packages/MarkupSafe-2.0.1.dist-info/INSTALLER b/venv/lib/python3.8/site-packages/MarkupSafe-2.0.1.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/venv/lib/python3.8/site-packages/MarkupSafe-2.0.1.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/venv/lib/python3.8/site-packages/MarkupSafe-2.0.1.dist-info/LICENSE.rst b/venv/lib/python3.8/site-packages/MarkupSafe-2.0.1.dist-info/LICENSE.rst deleted file mode 100644 index 9d227a0..0000000 --- a/venv/lib/python3.8/site-packages/MarkupSafe-2.0.1.dist-info/LICENSE.rst +++ /dev/null @@ -1,28 +0,0 @@ -Copyright 2010 Pallets - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - -2. 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. - -3. Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED -TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/venv/lib/python3.8/site-packages/MarkupSafe-2.0.1.dist-info/METADATA b/venv/lib/python3.8/site-packages/MarkupSafe-2.0.1.dist-info/METADATA deleted file mode 100644 index ef44e2b..0000000 --- a/venv/lib/python3.8/site-packages/MarkupSafe-2.0.1.dist-info/METADATA +++ /dev/null @@ -1,100 +0,0 @@ -Metadata-Version: 2.1 -Name: MarkupSafe -Version: 2.0.1 -Summary: Safely add untrusted strings to HTML/XML markup. -Home-page: https://palletsprojects.com/p/markupsafe/ -Author: Armin Ronacher -Author-email: armin.ronacher@active-4.com -Maintainer: Pallets -Maintainer-email: contact@palletsprojects.com -License: BSD-3-Clause -Project-URL: Donate, https://palletsprojects.com/donate -Project-URL: Documentation, https://markupsafe.palletsprojects.com/ -Project-URL: Changes, https://markupsafe.palletsprojects.com/changes/ -Project-URL: Source Code, https://github.com/pallets/markupsafe/ -Project-URL: Issue Tracker, https://github.com/pallets/markupsafe/issues/ -Project-URL: Twitter, https://twitter.com/PalletsTeam -Project-URL: Chat, https://discord.gg/pallets -Platform: UNKNOWN -Classifier: Development Status :: 5 - Production/Stable -Classifier: Environment :: Web Environment -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: BSD License -Classifier: Operating System :: OS Independent -Classifier: Programming Language :: Python -Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content -Classifier: Topic :: Text Processing :: Markup :: HTML -Requires-Python: >=3.6 -Description-Content-Type: text/x-rst - -MarkupSafe -========== - -MarkupSafe implements a text object that escapes characters so it is -safe to use in HTML and XML. Characters that have special meanings are -replaced so that they display as the actual characters. This mitigates -injection attacks, meaning untrusted user input can safely be displayed -on a page. - - -Installing ----------- - -Install and update using `pip`_: - -.. code-block:: text - - pip install -U MarkupSafe - -.. _pip: https://pip.pypa.io/en/stable/quickstart/ - - -Examples --------- - -.. code-block:: pycon - - >>> from markupsafe import Markup, escape - - >>> # escape replaces special characters and wraps in Markup - >>> escape("") - Markup('<script>alert(document.cookie);</script>') - - >>> # wrap in Markup to mark text "safe" and prevent escaping - >>> Markup("Hello") - Markup('hello') - - >>> escape(Markup("Hello")) - Markup('hello') - - >>> # Markup is a str subclass - >>> # methods and operators escape their arguments - >>> template = Markup("Hello {name}") - >>> template.format(name='"World"') - Markup('Hello "World"') - - -Donate ------- - -The Pallets organization develops and supports MarkupSafe and other -popular packages. In order to grow the community of contributors and -users, and allow the maintainers to devote more time to the projects, -`please donate today`_. - -.. _please donate today: https://palletsprojects.com/donate - - -Links ------ - -- Documentation: https://markupsafe.palletsprojects.com/ -- Changes: https://markupsafe.palletsprojects.com/changes/ -- PyPI Releases: https://pypi.org/project/MarkupSafe/ -- Source Code: https://github.com/pallets/markupsafe/ -- Issue Tracker: https://github.com/pallets/markupsafe/issues/ -- Website: https://palletsprojects.com/p/markupsafe/ -- Twitter: https://twitter.com/PalletsTeam -- Chat: https://discord.gg/pallets - - diff --git a/venv/lib/python3.8/site-packages/MarkupSafe-2.0.1.dist-info/RECORD b/venv/lib/python3.8/site-packages/MarkupSafe-2.0.1.dist-info/RECORD deleted file mode 100644 index 768efa3..0000000 --- a/venv/lib/python3.8/site-packages/MarkupSafe-2.0.1.dist-info/RECORD +++ /dev/null @@ -1,14 +0,0 @@ -MarkupSafe-2.0.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -MarkupSafe-2.0.1.dist-info/LICENSE.rst,sha256=SJqOEQhQntmKN7uYPhHg9-HTHwvY-Zp5yESOf_N9B-o,1475 -MarkupSafe-2.0.1.dist-info/METADATA,sha256=FmPpxBdaqCCjF-XKqoxeEzqAzhetQnrkkSsd3V3X-Jc,3211 -MarkupSafe-2.0.1.dist-info/RECORD,, -MarkupSafe-2.0.1.dist-info/WHEEL,sha256=RIeRBYNNiNK3sXfnenIjXDrR2Tzyz05xCMpKF2hJ1iA,111 -MarkupSafe-2.0.1.dist-info/top_level.txt,sha256=qy0Plje5IJuvsCBjejJyhDCjEAdcDLK_2agVcex8Z6U,11 -markupsafe/__init__.py,sha256=9Tez4UIlI7J6_sQcUFK1dKniT_b_8YefpGIyYJ3Sr2Q,8923 -markupsafe/__pycache__/__init__.cpython-38.pyc,, -markupsafe/__pycache__/_native.cpython-38.pyc,, -markupsafe/_native.py,sha256=GTKEV-bWgZuSjklhMHOYRHU9k0DMewTf5mVEZfkbuns,1986 -markupsafe/_speedups.c,sha256=CDDtwaV21D2nYtypnMQzxvvpZpcTvIs8OZ6KDa1g4t0,7400 -markupsafe/_speedups.cpython-38-x86_64-linux-gnu.so,sha256=rHWt9NIO4rSSHq0XYjwkiar1C-p7RB198xLDI5Aji0E,53208 -markupsafe/_speedups.pyi,sha256=vfMCsOgbAXRNLUXkyuyonG8uEWKYU4PDqNuMaDELAYw,229 -markupsafe/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 diff --git a/venv/lib/python3.8/site-packages/MarkupSafe-2.0.1.dist-info/WHEEL b/venv/lib/python3.8/site-packages/MarkupSafe-2.0.1.dist-info/WHEEL deleted file mode 100644 index b1fcc33..0000000 --- a/venv/lib/python3.8/site-packages/MarkupSafe-2.0.1.dist-info/WHEEL +++ /dev/null @@ -1,5 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.36.2) -Root-Is-Purelib: false -Tag: cp38-cp38-manylinux2010_x86_64 - diff --git a/venv/lib/python3.8/site-packages/MarkupSafe-2.0.1.dist-info/top_level.txt b/venv/lib/python3.8/site-packages/MarkupSafe-2.0.1.dist-info/top_level.txt deleted file mode 100644 index 75bf729..0000000 --- a/venv/lib/python3.8/site-packages/MarkupSafe-2.0.1.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -markupsafe diff --git a/venv/lib/python3.8/site-packages/Werkzeug-2.0.1.dist-info/INSTALLER b/venv/lib/python3.8/site-packages/Werkzeug-2.0.1.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/venv/lib/python3.8/site-packages/Werkzeug-2.0.1.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/venv/lib/python3.8/site-packages/Werkzeug-2.0.1.dist-info/LICENSE.rst b/venv/lib/python3.8/site-packages/Werkzeug-2.0.1.dist-info/LICENSE.rst deleted file mode 100644 index c37cae4..0000000 --- a/venv/lib/python3.8/site-packages/Werkzeug-2.0.1.dist-info/LICENSE.rst +++ /dev/null @@ -1,28 +0,0 @@ -Copyright 2007 Pallets - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - -2. 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. - -3. Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED -TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/venv/lib/python3.8/site-packages/Werkzeug-2.0.1.dist-info/METADATA b/venv/lib/python3.8/site-packages/Werkzeug-2.0.1.dist-info/METADATA deleted file mode 100644 index f991d5a..0000000 --- a/venv/lib/python3.8/site-packages/Werkzeug-2.0.1.dist-info/METADATA +++ /dev/null @@ -1,128 +0,0 @@ -Metadata-Version: 2.1 -Name: Werkzeug -Version: 2.0.1 -Summary: The comprehensive WSGI web application library. -Home-page: https://palletsprojects.com/p/werkzeug/ -Author: Armin Ronacher -Author-email: armin.ronacher@active-4.com -Maintainer: Pallets -Maintainer-email: contact@palletsprojects.com -License: BSD-3-Clause -Project-URL: Donate, https://palletsprojects.com/donate -Project-URL: Documentation, https://werkzeug.palletsprojects.com/ -Project-URL: Changes, https://werkzeug.palletsprojects.com/changes/ -Project-URL: Source Code, https://github.com/pallets/werkzeug/ -Project-URL: Issue Tracker, https://github.com/pallets/werkzeug/issues/ -Project-URL: Twitter, https://twitter.com/PalletsTeam -Project-URL: Chat, https://discord.gg/pallets -Platform: UNKNOWN -Classifier: Development Status :: 5 - Production/Stable -Classifier: Environment :: Web Environment -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: BSD License -Classifier: Operating System :: OS Independent -Classifier: Programming Language :: Python -Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content -Classifier: Topic :: Internet :: WWW/HTTP :: WSGI -Classifier: Topic :: Internet :: WWW/HTTP :: WSGI :: Application -Classifier: Topic :: Internet :: WWW/HTTP :: WSGI :: Middleware -Classifier: Topic :: Software Development :: Libraries :: Application Frameworks -Requires-Python: >=3.6 -Description-Content-Type: text/x-rst -Requires-Dist: dataclasses ; python_version < "3.7" -Provides-Extra: watchdog -Requires-Dist: watchdog ; extra == 'watchdog' - -Werkzeug -======== - -*werkzeug* German noun: "tool". Etymology: *werk* ("work"), *zeug* ("stuff") - -Werkzeug is a comprehensive `WSGI`_ web application library. It began as -a simple collection of various utilities for WSGI applications and has -become one of the most advanced WSGI utility libraries. - -It includes: - -- An interactive debugger that allows inspecting stack traces and - source code in the browser with an interactive interpreter for any - frame in the stack. -- A full-featured request object with objects to interact with - headers, query args, form data, files, and cookies. -- A response object that can wrap other WSGI applications and handle - streaming data. -- A routing system for matching URLs to endpoints and generating URLs - for endpoints, with an extensible system for capturing variables - from URLs. -- HTTP utilities to handle entity tags, cache control, dates, user - agents, cookies, files, and more. -- A threaded WSGI server for use while developing applications - locally. -- A test client for simulating HTTP requests during testing without - requiring running a server. - -Werkzeug doesn't enforce any dependencies. It is up to the developer to -choose a template engine, database adapter, and even how to handle -requests. It can be used to build all sorts of end user applications -such as blogs, wikis, or bulletin boards. - -`Flask`_ wraps Werkzeug, using it to handle the details of WSGI while -providing more structure and patterns for defining powerful -applications. - -.. _WSGI: https://wsgi.readthedocs.io/en/latest/ -.. _Flask: https://www.palletsprojects.com/p/flask/ - - -Installing ----------- - -Install and update using `pip`_: - -.. code-block:: text - - pip install -U Werkzeug - -.. _pip: https://pip.pypa.io/en/stable/quickstart/ - - -A Simple Example ----------------- - -.. code-block:: python - - from werkzeug.wrappers import Request, Response - - @Request.application - def application(request): - return Response('Hello, World!') - - if __name__ == '__main__': - from werkzeug.serving import run_simple - run_simple('localhost', 4000, application) - - -Donate ------- - -The Pallets organization develops and supports Werkzeug and other -popular packages. In order to grow the community of contributors and -users, and allow the maintainers to devote more time to the projects, -`please donate today`_. - -.. _please donate today: https://palletsprojects.com/donate - - -Links ------ - -- Documentation: https://werkzeug.palletsprojects.com/ -- Changes: https://werkzeug.palletsprojects.com/changes/ -- PyPI Releases: https://pypi.org/project/Werkzeug/ -- Source Code: https://github.com/pallets/werkzeug/ -- Issue Tracker: https://github.com/pallets/werkzeug/issues/ -- Website: https://palletsprojects.com/p/werkzeug/ -- Twitter: https://twitter.com/PalletsTeam -- Chat: https://discord.gg/pallets - - diff --git a/venv/lib/python3.8/site-packages/Werkzeug-2.0.1.dist-info/RECORD b/venv/lib/python3.8/site-packages/Werkzeug-2.0.1.dist-info/RECORD deleted file mode 100644 index b691f8d..0000000 --- a/venv/lib/python3.8/site-packages/Werkzeug-2.0.1.dist-info/RECORD +++ /dev/null @@ -1,111 +0,0 @@ -Werkzeug-2.0.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -Werkzeug-2.0.1.dist-info/LICENSE.rst,sha256=O0nc7kEF6ze6wQ-vG-JgQI_oXSUrjp3y4JefweCUQ3s,1475 -Werkzeug-2.0.1.dist-info/METADATA,sha256=8-W33EMnGqnCCi-d8Dv63IQQuyELRIsXhwOJNXbNgL0,4421 -Werkzeug-2.0.1.dist-info/RECORD,, -Werkzeug-2.0.1.dist-info/WHEEL,sha256=OqRkF0eY5GHssMorFjlbTIq072vpHpF60fIQA6lS9xA,92 -Werkzeug-2.0.1.dist-info/top_level.txt,sha256=QRyj2VjwJoQkrwjwFIOlB8Xg3r9un0NtqVHQF-15xaw,9 -werkzeug/__init__.py,sha256=_CCsfdeqNllFNRJx8cvqYrwBsQQQXJaMmnk2sAZnDng,188 -werkzeug/__pycache__/__init__.cpython-38.pyc,, -werkzeug/__pycache__/_internal.cpython-38.pyc,, -werkzeug/__pycache__/_reloader.cpython-38.pyc,, -werkzeug/__pycache__/datastructures.cpython-38.pyc,, -werkzeug/__pycache__/exceptions.cpython-38.pyc,, -werkzeug/__pycache__/filesystem.cpython-38.pyc,, -werkzeug/__pycache__/formparser.cpython-38.pyc,, -werkzeug/__pycache__/http.cpython-38.pyc,, -werkzeug/__pycache__/local.cpython-38.pyc,, -werkzeug/__pycache__/routing.cpython-38.pyc,, -werkzeug/__pycache__/security.cpython-38.pyc,, -werkzeug/__pycache__/serving.cpython-38.pyc,, -werkzeug/__pycache__/test.cpython-38.pyc,, -werkzeug/__pycache__/testapp.cpython-38.pyc,, -werkzeug/__pycache__/urls.cpython-38.pyc,, -werkzeug/__pycache__/user_agent.cpython-38.pyc,, -werkzeug/__pycache__/useragents.cpython-38.pyc,, -werkzeug/__pycache__/utils.cpython-38.pyc,, -werkzeug/__pycache__/wsgi.cpython-38.pyc,, -werkzeug/_internal.py,sha256=_QKkvdaG4pDFwK68c0EpPzYJGe9Y7toRAT1cBbC-CxU,18572 -werkzeug/_reloader.py,sha256=B1hEfgsUOz2IginBQM5Zak_eaIF7gr3GS5-0x2OHvAE,13950 -werkzeug/datastructures.py,sha256=KahVPSLOapbNbKh1ppr9K8_DgWJv1EGgA9DhTEGMHcg,97886 -werkzeug/datastructures.pyi,sha256=5DTPF8P8Zvi458eK27Qcj7eNUlLM_AC0jBNkj6uQpds,33774 -werkzeug/debug/__init__.py,sha256=CUFrPEYAaotHRkmjOieqd3EasXDii2JVC1HdmEzMwqM,17924 -werkzeug/debug/__pycache__/__init__.cpython-38.pyc,, -werkzeug/debug/__pycache__/console.cpython-38.pyc,, -werkzeug/debug/__pycache__/repr.cpython-38.pyc,, -werkzeug/debug/__pycache__/tbtools.cpython-38.pyc,, -werkzeug/debug/console.py,sha256=E1nBMEvFkX673ShQjPtVY-byYatfX9MN-dBMjRI8a8E,5897 -werkzeug/debug/repr.py,sha256=QCSHENKsChEZDCIApkVi_UNjhJ77v8BMXK1OfxO189M,9483 -werkzeug/debug/shared/FONT_LICENSE,sha256=LwAVEI1oYnvXiNMT9SnCH_TaLCxCpeHziDrMg0gPkAI,4673 -werkzeug/debug/shared/ICON_LICENSE.md,sha256=DhA6Y1gUl5Jwfg0NFN9Rj4VWITt8tUx0IvdGf0ux9-s,222 -werkzeug/debug/shared/console.png,sha256=bxax6RXXlvOij_KeqvSNX0ojJf83YbnZ7my-3Gx9w2A,507 -werkzeug/debug/shared/debugger.js,sha256=dYbUmFmb3YZb5YpWpYPOQArdrN7NPeY0ODawL7ihzDI,10524 -werkzeug/debug/shared/less.png,sha256=-4-kNRaXJSONVLahrQKUxMwXGm9R4OnZ9SxDGpHlIR4,191 -werkzeug/debug/shared/more.png,sha256=GngN7CioHQoV58rH6ojnkYi8c_qED2Aka5FO5UXrReY,200 -werkzeug/debug/shared/source.png,sha256=RoGcBTE4CyCB85GBuDGTFlAnUqxwTBiIfDqW15EpnUQ,818 -werkzeug/debug/shared/style.css,sha256=vyp1RnB227Fuw8LIyM5C-bBCBQN5hvZSCApY2oeJ9ik,6705 -werkzeug/debug/shared/ubuntu.ttf,sha256=1eaHFyepmy4FyDvjLVzpITrGEBu_CZYY94jE0nED1c0,70220 -werkzeug/debug/tbtools.py,sha256=TfReusPbM3yjm3xvOFkH45V7-5JnNqB9x1EQPnVC6Xo,19189 -werkzeug/exceptions.py,sha256=CUwx0pBiNbk4f9cON17ekgKnmLi6HIVFjUmYZc2x0wM,28681 -werkzeug/filesystem.py,sha256=JS2Dv2QF98WILxY4_thHl-WMcUcwluF_4igkDPaP1l4,1956 -werkzeug/formparser.py,sha256=GIKfzuQ_khuBXnf3N7_LzOEruYwNc3m4bI02BgtT5jg,17385 -werkzeug/http.py,sha256=oUCXFFMnkOQ-cHbUY_aiqitshcrSzNDq3fEMf1VI_yk,45141 -werkzeug/local.py,sha256=WsR6H-2XOtPigpimjORbLsS3h9WI0lCdZjGI2LHDDxA,22733 -werkzeug/middleware/__init__.py,sha256=qfqgdT5npwG9ses3-FXQJf3aB95JYP1zchetH_T3PUw,500 -werkzeug/middleware/__pycache__/__init__.cpython-38.pyc,, -werkzeug/middleware/__pycache__/dispatcher.cpython-38.pyc,, -werkzeug/middleware/__pycache__/http_proxy.cpython-38.pyc,, -werkzeug/middleware/__pycache__/lint.cpython-38.pyc,, -werkzeug/middleware/__pycache__/profiler.cpython-38.pyc,, -werkzeug/middleware/__pycache__/proxy_fix.cpython-38.pyc,, -werkzeug/middleware/__pycache__/shared_data.cpython-38.pyc,, -werkzeug/middleware/dispatcher.py,sha256=Fh_w-KyWnTSYF-Lfv5dimQ7THSS7afPAZMmvc4zF1gg,2580 -werkzeug/middleware/http_proxy.py,sha256=HE8VyhS7CR-E1O6_9b68huv8FLgGGR1DLYqkS3Xcp3Q,7558 -werkzeug/middleware/lint.py,sha256=yMzMdm4xI2_N-Wv2j1yoaVI3ltHOYS6yZyA-wUv1sKw,13962 -werkzeug/middleware/profiler.py,sha256=G2JieUMv4QPamtCY6ibIK7P-piPRdPybav7bm2MSFvs,4898 -werkzeug/middleware/proxy_fix.py,sha256=uRgQ3dEvFV8JxUqajHYYYOPEeA_BFqaa51Yp8VW0uzA,6849 -werkzeug/middleware/shared_data.py,sha256=eOCGr-i6BCexDfL7xdPRWMwPJPgp0NE2B416Gl67Q78,10959 -werkzeug/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -werkzeug/routing.py,sha256=FDRtvCfaZSmXnQ0cUYxowb3P0y0dxlUlMSUmerY5sb0,84147 -werkzeug/sansio/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -werkzeug/sansio/__pycache__/__init__.cpython-38.pyc,, -werkzeug/sansio/__pycache__/multipart.cpython-38.pyc,, -werkzeug/sansio/__pycache__/request.cpython-38.pyc,, -werkzeug/sansio/__pycache__/response.cpython-38.pyc,, -werkzeug/sansio/__pycache__/utils.cpython-38.pyc,, -werkzeug/sansio/multipart.py,sha256=bJMCNC2f5xyAaylahNViJ0JqmV4ThLRbDVGVzKwcqrQ,8751 -werkzeug/sansio/request.py,sha256=aA9rABkWiG4MhYMByanst2NXkEclsq8SIxhb0LQf0e0,20228 -werkzeug/sansio/response.py,sha256=HSG6t-tyPZd3awzWqr7qL9IV4HYAvDgON1c0YPU2RXw,24117 -werkzeug/sansio/utils.py,sha256=V5v-UUnX8pm4RehP9Tt_NiUSOJGJGUvKjlW0eOIQldM,4164 -werkzeug/security.py,sha256=gPDRuCjkjWrcqj99tBMq8_nHFZLFQjgoW5Ga5XIw9jo,8158 -werkzeug/serving.py,sha256=_RG2dCclOQcdjJ2NE8tzCRybGePlwcs8kTypiWRP2gY,38030 -werkzeug/test.py,sha256=EJXJy-b_JriHrlfs5VNCkwbki8Kn_xUDkOYOCx_6Q7Q,48096 -werkzeug/testapp.py,sha256=f48prWSGJhbSrvYb8e1fnAah4BkrLb0enHSdChgsjBY,9471 -werkzeug/urls.py,sha256=3o_aUcr5Ou13XihSU6VvX6RHMhoWkKpXuCCia9SSAb8,41021 -werkzeug/user_agent.py,sha256=WclZhpvgLurMF45hsioSbS75H1Zb4iMQGKN3_yZ2oKo,1420 -werkzeug/useragents.py,sha256=G8tmv_6vxJaPrLQH3eODNgIYe0_V6KETROQlJI-WxDE,7264 -werkzeug/utils.py,sha256=WrU-LbwemyGd8zBHBgQyLaIxing4QLEChiP0qnzr2sc,36771 -werkzeug/wrappers/__init__.py,sha256=-s75nPbyXHzU_rwmLPDhoMuGbEUk0jZT_n0ZQAOFGf8,654 -werkzeug/wrappers/__pycache__/__init__.cpython-38.pyc,, -werkzeug/wrappers/__pycache__/accept.cpython-38.pyc,, -werkzeug/wrappers/__pycache__/auth.cpython-38.pyc,, -werkzeug/wrappers/__pycache__/base_request.cpython-38.pyc,, -werkzeug/wrappers/__pycache__/base_response.cpython-38.pyc,, -werkzeug/wrappers/__pycache__/common_descriptors.cpython-38.pyc,, -werkzeug/wrappers/__pycache__/cors.cpython-38.pyc,, -werkzeug/wrappers/__pycache__/etag.cpython-38.pyc,, -werkzeug/wrappers/__pycache__/json.cpython-38.pyc,, -werkzeug/wrappers/__pycache__/request.cpython-38.pyc,, -werkzeug/wrappers/__pycache__/response.cpython-38.pyc,, -werkzeug/wrappers/__pycache__/user_agent.cpython-38.pyc,, -werkzeug/wrappers/accept.py,sha256=_oZtAQkahvsrPRkNj2fieg7_St9P0NFC3SgZbJKS6xU,429 -werkzeug/wrappers/auth.py,sha256=rZPCzGxHk9R55PRkmS90kRywUVjjuMWzCGtH68qCq8U,856 -werkzeug/wrappers/base_request.py,sha256=saz9RyNQkvI_XLPYVm29KijNHmD1YzgxDqa0qHTbgss,1174 -werkzeug/wrappers/base_response.py,sha256=q_-TaYywT5G4zA-DWDRDJhJSat2_4O7gOPob6ye4_9A,1186 -werkzeug/wrappers/common_descriptors.py,sha256=v_kWLH3mvCiSRVJ1FNw7nO3w2UJfzY57UKKB5J4zCvE,898 -werkzeug/wrappers/cors.py,sha256=c5UndlZsZvYkbPrp6Gj5iSXxw_VOJDJHskO6-jRmNyQ,846 -werkzeug/wrappers/etag.py,sha256=XHWQQs7Mdd1oWezgBIsl-bYe8ydKkRZVil2Qd01D0Mo,846 -werkzeug/wrappers/json.py,sha256=HM1btPseGeXca0vnwQN_MvZl6h-qNsFY5YBKXKXFwus,410 -werkzeug/wrappers/request.py,sha256=0zAkCUwJbUBzioGy2UKxE6XpuXPAZbEhhML4WErzeBo,24818 -werkzeug/wrappers/response.py,sha256=95hXIysZTeNC0bqhvGB2fLBRKxedR_cgI5szZZWfyzw,35177 -werkzeug/wrappers/user_agent.py,sha256=Wl1-A0-1r8o7cHIZQTB55O4Ged6LpCKENaQDlOY5pXA,435 -werkzeug/wsgi.py,sha256=7psV3SHLtCzk1KSuGmIK5uP2QTDXyfCCDclyqCmIUO4,33715 diff --git a/venv/lib/python3.8/site-packages/Werkzeug-2.0.1.dist-info/WHEEL b/venv/lib/python3.8/site-packages/Werkzeug-2.0.1.dist-info/WHEEL deleted file mode 100644 index 385faab..0000000 --- a/venv/lib/python3.8/site-packages/Werkzeug-2.0.1.dist-info/WHEEL +++ /dev/null @@ -1,5 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.36.2) -Root-Is-Purelib: true -Tag: py3-none-any - diff --git a/venv/lib/python3.8/site-packages/Werkzeug-2.0.1.dist-info/top_level.txt b/venv/lib/python3.8/site-packages/Werkzeug-2.0.1.dist-info/top_level.txt deleted file mode 100644 index 6fe8da8..0000000 --- a/venv/lib/python3.8/site-packages/Werkzeug-2.0.1.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -werkzeug diff --git a/venv/lib/python3.8/site-packages/__pycache__/easy_install.cpython-38.pyc b/venv/lib/python3.8/site-packages/__pycache__/easy_install.cpython-38.pyc deleted file mode 100644 index 738ebe25d2472e0732dac4c38fa621673f0244e0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 281 zcmYj}y-LJT5QXng)FAE?2pa5CBoPEF5gQ8|3m2O-`-+MWJ7+lsbF}qc9bLV2OjL8~rt#W!y0jz2rz!%|I&c|e$_jxiN0BGL;OeaoR z1gK9V_Cx5sH?jN<@r$|EQfL#yjiwseWU7UiCIqp$*00f@)T%i}e!G6c>x=3.6 -Description-Content-Type: text/x-rst -Requires-Dist: colorama ; platform_system == "Windows" -Requires-Dist: importlib-metadata ; python_version < "3.8" - -\$ click\_ -========== - -Click is a Python package for creating beautiful command line interfaces -in a composable way with as little code as necessary. It's the "Command -Line Interface Creation Kit". It's highly configurable but comes with -sensible defaults out of the box. - -It aims to make the process of writing command line tools quick and fun -while also preventing any frustration caused by the inability to -implement an intended CLI API. - -Click in three points: - -- Arbitrary nesting of commands -- Automatic help page generation -- Supports lazy loading of subcommands at runtime - - -Installing ----------- - -Install and update using `pip`_: - -.. code-block:: text - - $ pip install -U click - -.. _pip: https://pip.pypa.io/en/stable/quickstart/ - - -A Simple Example ----------------- - -.. code-block:: python - - import click - - @click.command() - @click.option("--count", default=1, help="Number of greetings.") - @click.option("--name", prompt="Your name", help="The person to greet.") - def hello(count, name): - """Simple program that greets NAME for a total of COUNT times.""" - for _ in range(count): - click.echo(f"Hello, {name}!") - - if __name__ == '__main__': - hello() - -.. code-block:: text - - $ python hello.py --count=3 - Your name: Click - Hello, Click! - Hello, Click! - Hello, Click! - - -Donate ------- - -The Pallets organization develops and supports Click and other popular -packages. In order to grow the community of contributors and users, and -allow the maintainers to devote more time to the projects, `please -donate today`_. - -.. _please donate today: https://palletsprojects.com/donate - - -Links ------ - -- Documentation: https://click.palletsprojects.com/ -- Changes: https://click.palletsprojects.com/changes/ -- PyPI Releases: https://pypi.org/project/click/ -- Source Code: https://github.com/pallets/click -- Issue Tracker: https://github.com/pallets/click/issues -- Website: https://palletsprojects.com/p/click -- Twitter: https://twitter.com/PalletsTeam -- Chat: https://discord.gg/pallets - - diff --git a/venv/lib/python3.8/site-packages/click-8.0.1.dist-info/RECORD b/venv/lib/python3.8/site-packages/click-8.0.1.dist-info/RECORD deleted file mode 100644 index d146fd8..0000000 --- a/venv/lib/python3.8/site-packages/click-8.0.1.dist-info/RECORD +++ /dev/null @@ -1,41 +0,0 @@ -click-8.0.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -click-8.0.1.dist-info/LICENSE.rst,sha256=morRBqOU6FO_4h9C9OctWSgZoigF2ZG18ydQKSkrZY0,1475 -click-8.0.1.dist-info/METADATA,sha256=Q_8tjC_Ps-9OmIDcovMWvqzrNlmYNwJ7yZxyeJ-SIsk,3216 -click-8.0.1.dist-info/RECORD,, -click-8.0.1.dist-info/WHEEL,sha256=OqRkF0eY5GHssMorFjlbTIq072vpHpF60fIQA6lS9xA,92 -click-8.0.1.dist-info/top_level.txt,sha256=J1ZQogalYS4pphY_lPECoNMfw0HzTSrZglC4Yfwo4xA,6 -click/__init__.py,sha256=TweMqq3qEdmxSl3M_O0H1crtKtd7_oS7PDd0WlLote0,3243 -click/__pycache__/__init__.cpython-38.pyc,, -click/__pycache__/_compat.cpython-38.pyc,, -click/__pycache__/_termui_impl.cpython-38.pyc,, -click/__pycache__/_textwrap.cpython-38.pyc,, -click/__pycache__/_unicodefun.cpython-38.pyc,, -click/__pycache__/_winconsole.cpython-38.pyc,, -click/__pycache__/core.cpython-38.pyc,, -click/__pycache__/decorators.cpython-38.pyc,, -click/__pycache__/exceptions.cpython-38.pyc,, -click/__pycache__/formatting.cpython-38.pyc,, -click/__pycache__/globals.cpython-38.pyc,, -click/__pycache__/parser.cpython-38.pyc,, -click/__pycache__/shell_completion.cpython-38.pyc,, -click/__pycache__/termui.cpython-38.pyc,, -click/__pycache__/testing.cpython-38.pyc,, -click/__pycache__/types.cpython-38.pyc,, -click/__pycache__/utils.cpython-38.pyc,, -click/_compat.py,sha256=P15KQumAZC2F2MFe_JSRbvVOJcNosQfMDrdZq0ReCLM,18814 -click/_termui_impl.py,sha256=3IBc-wR8art7cOIN3y4vQ3ftyCs4GNLMjDcrSalUD9c,23423 -click/_textwrap.py,sha256=10fQ64OcBUMuK7mFvh8363_uoOxPlRItZBmKzRJDgoY,1353 -click/_unicodefun.py,sha256=JKSh1oSwG_zbjAu4TBCa9tQde2P9FiYcf4MBfy5NdT8,3201 -click/_winconsole.py,sha256=5ju3jQkcZD0W27WEMGqmEP4y_crUVzPCqsX_FYb7BO0,7860 -click/core.py,sha256=xYDxID7ShkgY2Lbw7vKOMjP5ImT1NLCTqMJphUicAQ0,111335 -click/decorators.py,sha256=u_Ehdo3PA2nzCoud9z6fGhxwtMI8vVNG_SL8Bl9lsnY,14871 -click/exceptions.py,sha256=7gDaLGuFZBeCNwY9ERMsF2-Z3R9Fvq09Zc6IZSKjseo,9167 -click/formatting.py,sha256=Frf0-5W33-loyY_i9qrwXR8-STnW3m5gvyxLVUdyxyk,9706 -click/globals.py,sha256=9pcmaNfGS1bJV5DoFYhfv51BPeHP8dWaya7rP3kcrY4,1973 -click/parser.py,sha256=x5DbnBV9O8kXiMdJAdtpdTO2eRUXw2ab5PRMLxo0po4,19043 -click/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -click/shell_completion.py,sha256=F0CHHFOP4ulDsYoqTMm9FXih_OVKsg3mzD-XBzMN79c,17881 -click/termui.py,sha256=MJNkEntRiNZvwa0z9SVK0d6X9BvUcFhvxKky5M-kBGY,28809 -click/testing.py,sha256=kLR5Qcny1OlgxaGB3gweTr0gQe1yVlmgQRn2esA2Fz4,16020 -click/types.py,sha256=ngn3qOaHcDvyeMF2UT5QJNNpJAAVrA9BRj4t8x1xOZM,35375 -click/utils.py,sha256=q7xUTlebAnIENo2Uv-REArW_erqGFm_8yMW241mMjzQ,18752 diff --git a/venv/lib/python3.8/site-packages/click-8.0.1.dist-info/WHEEL b/venv/lib/python3.8/site-packages/click-8.0.1.dist-info/WHEEL deleted file mode 100644 index 385faab..0000000 --- a/venv/lib/python3.8/site-packages/click-8.0.1.dist-info/WHEEL +++ /dev/null @@ -1,5 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.36.2) -Root-Is-Purelib: true -Tag: py3-none-any - diff --git a/venv/lib/python3.8/site-packages/click-8.0.1.dist-info/top_level.txt b/venv/lib/python3.8/site-packages/click-8.0.1.dist-info/top_level.txt deleted file mode 100644 index dca9a90..0000000 --- a/venv/lib/python3.8/site-packages/click-8.0.1.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -click diff --git a/venv/lib/python3.8/site-packages/click/__init__.py b/venv/lib/python3.8/site-packages/click/__init__.py deleted file mode 100644 index 9e0afb2..0000000 --- a/venv/lib/python3.8/site-packages/click/__init__.py +++ /dev/null @@ -1,75 +0,0 @@ -""" -Click is a simple Python module inspired by the stdlib optparse to make -writing command line scripts fun. Unlike other modules, it's based -around a simple API that does not come with too much magic and is -composable. -""" -from .core import Argument as Argument -from .core import BaseCommand as BaseCommand -from .core import Command as Command -from .core import CommandCollection as CommandCollection -from .core import Context as Context -from .core import Group as Group -from .core import MultiCommand as MultiCommand -from .core import Option as Option -from .core import Parameter as Parameter -from .decorators import argument as argument -from .decorators import command as command -from .decorators import confirmation_option as confirmation_option -from .decorators import group as group -from .decorators import help_option as help_option -from .decorators import make_pass_decorator as make_pass_decorator -from .decorators import option as option -from .decorators import pass_context as pass_context -from .decorators import pass_obj as pass_obj -from .decorators import password_option as password_option -from .decorators import version_option as version_option -from .exceptions import Abort as Abort -from .exceptions import BadArgumentUsage as BadArgumentUsage -from .exceptions import BadOptionUsage as BadOptionUsage -from .exceptions import BadParameter as BadParameter -from .exceptions import ClickException as ClickException -from .exceptions import FileError as FileError -from .exceptions import MissingParameter as MissingParameter -from .exceptions import NoSuchOption as NoSuchOption -from .exceptions import UsageError as UsageError -from .formatting import HelpFormatter as HelpFormatter -from .formatting import wrap_text as wrap_text -from .globals import get_current_context as get_current_context -from .parser import OptionParser as OptionParser -from .termui import clear as clear -from .termui import confirm as confirm -from .termui import echo_via_pager as echo_via_pager -from .termui import edit as edit -from .termui import get_terminal_size as get_terminal_size -from .termui import getchar as getchar -from .termui import launch as launch -from .termui import pause as pause -from .termui import progressbar as progressbar -from .termui import prompt as prompt -from .termui import secho as secho -from .termui import style as style -from .termui import unstyle as unstyle -from .types import BOOL as BOOL -from .types import Choice as Choice -from .types import DateTime as DateTime -from .types import File as File -from .types import FLOAT as FLOAT -from .types import FloatRange as FloatRange -from .types import INT as INT -from .types import IntRange as IntRange -from .types import ParamType as ParamType -from .types import Path as Path -from .types import STRING as STRING -from .types import Tuple as Tuple -from .types import UNPROCESSED as UNPROCESSED -from .types import UUID as UUID -from .utils import echo as echo -from .utils import format_filename as format_filename -from .utils import get_app_dir as get_app_dir -from .utils import get_binary_stream as get_binary_stream -from .utils import get_os_args as get_os_args -from .utils import get_text_stream as get_text_stream -from .utils import open_file as open_file - -__version__ = "8.0.1" diff --git a/venv/lib/python3.8/site-packages/click/__pycache__/__init__.cpython-38.pyc b/venv/lib/python3.8/site-packages/click/__pycache__/__init__.cpython-38.pyc deleted file mode 100644 index b44c953cebff01b219db6c137443004e9126ce12..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2659 zcmd7U$yVD)6b4`eo-y+fW)uh^Og3YfM>B+k=>*u^jarrpyBbZWN)91U(67>`7yUlo z_Nrf@SAFj_L;4LG4nJR&R8`V-+45~mOE!i-=|BJZ<&Rt}_7^pN{%OR<9{%b1rdZ60 zLCk4z8r=r35gHrFP3R_QV#m>Oh_e&u1SHr=bP|&66gmYdb{d_AG&_UNK!%+~XCcdO zcALE%JJ6lb$?imVK^MCV-3{IBZgday zuzS$G(97<1-*|n{$9{wEhkkY+dH@F4{pdj$WDlT+V2C}49)@A|5PAeg*u&^i7-f&3 z4KUcF?ptpR#@GgW9LCvi-FMyuOt8n?_ueE-vd7&I-V{u+-=U{rnmvJ@ff@FD^eoJ> zC(&~-$NqrML!Lc_E6Z;V@I1?R3|IPivaMtoY2&Wy=Z#z6mG{C3a2EA6 zyPh>LbF8-5Vc>9l?B5OexiHmGOYf_4)f0Y%Za%<;iuEhRX6lt4Pb>zmE9^)He*L%~iSINr zae@~YB68#8aHWyLN#@b9GZEE;2C5$g*j%1^U5 zSA-kB_IFWf&Ct@?bc7u!D+*}xo=kFe^=fw z1&VI4{lIdbD|M@_vcSGp?5p42b59O?e!k6C-abd)ZSj07nPcgSBc=F4+s~!exGR1h zlDi15@r8RSTbAd39?|j%3ve7zh3bXOJSZzPpKh%Qdz9LARd5PP@XBBwefO+ZF6g zgjQA4(dJMEWhJyO)z84D7xFgIv<#i9qeqt~s`}52A6#CZ;jv_~5=fg4rVp)1+(?fc zr^3<5t4f#iQ%%qeE=QZ*Nce|I?+m-Eq0iJ6zw#4NN1bBvu%jj-)bjg-Tc+^=Rry z3CnvvC(tHtbdAlndKJG%uV-X}Q20FUkHlJjKEH4=bx}*1rW4qvS&QR-7K$F=3ZLCE z6{kp0Bq>r9X^IR5eGP!@%bP%}X6nVS1Tob@(Mr)q(N57p(Mi!o(M{2VQOkl)j8iGao+I(p&Y%2|gL|%i3=k@no*yfAHJ* EFSrrB+5i9m diff --git a/venv/lib/python3.8/site-packages/click/__pycache__/_compat.cpython-38.pyc b/venv/lib/python3.8/site-packages/click/__pycache__/_compat.cpython-38.pyc deleted file mode 100644 index 570bf10e369ee742821b0cb21013ecfc8b7bbbc1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16072 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 diff --git a/venv/lib/python3.8/site-packages/click/__pycache__/core.cpython-38.pyc b/venv/lib/python3.8/site-packages/click/__pycache__/core.cpython-38.pyc deleted file mode 100644 index 23269aaa42a5d3b9f9b3b31d5123bd518b3cfbf3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 88011 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

XOoyU|{fmyu-aoV<;Gl(p*h0`54E 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 NYvap5)cfB`^nbc61~&iz diff --git a/venv/lib/python3.8/site-packages/click/__pycache__/exceptions.cpython-38.pyc b/venv/lib/python3.8/site-packages/click/__pycache__/exceptions.cpython-38.pyc deleted file mode 100644 index dd03c11fb810f1fd2c6bea99320560a2c836a90d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10116 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 diff --git a/venv/lib/python3.8/site-packages/click/__pycache__/formatting.cpython-38.pyc b/venv/lib/python3.8/site-packages/click/__pycache__/formatting.cpython-38.pyc deleted file mode 100644 index 66400392017b95a68739c5fba95f3103ceec16a1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9366 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 DActVo diff --git a/venv/lib/python3.8/site-packages/click/__pycache__/parser.cpython-38.pyc b/venv/lib/python3.8/site-packages/click/__pycache__/parser.cpython-38.pyc deleted file mode 100644 index c690080e6aa14fb2b70ee059d7bc3ecd542e289d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13598 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 diff --git a/venv/lib/python3.8/site-packages/click/__pycache__/termui.cpython-38.pyc b/venv/lib/python3.8/site-packages/click/__pycache__/termui.cpython-38.pyc deleted file mode 100644 index 7968298bd6e1455601cd4becda66069a73490ec4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26495 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 str: - return sys.getfilesystemencoding() or sys.getdefaultencoding() - - -def _make_text_stream( - stream: t.BinaryIO, - encoding: t.Optional[str], - errors: t.Optional[str], - force_readable: bool = False, - force_writable: bool = False, -) -> t.TextIO: - if encoding is None: - encoding = get_best_encoding(stream) - if errors is None: - errors = "replace" - return _NonClosingTextIOWrapper( - stream, - encoding, - errors, - line_buffering=True, - force_readable=force_readable, - force_writable=force_writable, - ) - - -def is_ascii_encoding(encoding: str) -> bool: - """Checks if a given encoding is ascii.""" - try: - return codecs.lookup(encoding).name == "ascii" - except LookupError: - return False - - -def get_best_encoding(stream: t.IO) -> str: - """Returns the default stream encoding if not found.""" - rv = getattr(stream, "encoding", None) or sys.getdefaultencoding() - if is_ascii_encoding(rv): - return "utf-8" - return rv - - -class _NonClosingTextIOWrapper(io.TextIOWrapper): - def __init__( - self, - stream: t.BinaryIO, - encoding: t.Optional[str], - errors: t.Optional[str], - force_readable: bool = False, - force_writable: bool = False, - **extra: t.Any, - ) -> None: - self._stream = stream = t.cast( - t.BinaryIO, _FixupStream(stream, force_readable, force_writable) - ) - super().__init__(stream, encoding, errors, **extra) - - def __del__(self) -> None: - try: - self.detach() - except Exception: - pass - - def isatty(self) -> bool: - # https://bitbucket.org/pypy/pypy/issue/1803 - return self._stream.isatty() - - -class _FixupStream: - """The new io interface needs more from streams than streams - traditionally implement. As such, this fix-up code is necessary in - some circumstances. - - The forcing of readable and writable flags are there because some tools - put badly patched objects on sys (one such offender are certain version - of jupyter notebook). - """ - - def __init__( - self, - stream: t.BinaryIO, - force_readable: bool = False, - force_writable: bool = False, - ): - self._stream = stream - self._force_readable = force_readable - self._force_writable = force_writable - - def __getattr__(self, name: str) -> t.Any: - return getattr(self._stream, name) - - def read1(self, size: int) -> bytes: - f = getattr(self._stream, "read1", None) - - if f is not None: - return t.cast(bytes, f(size)) - - return self._stream.read(size) - - def readable(self) -> bool: - if self._force_readable: - return True - x = getattr(self._stream, "readable", None) - if x is not None: - return t.cast(bool, x()) - try: - self._stream.read(0) - except Exception: - return False - return True - - def writable(self) -> bool: - if self._force_writable: - return True - x = getattr(self._stream, "writable", None) - if x is not None: - return t.cast(bool, x()) - try: - self._stream.write("") # type: ignore - except Exception: - try: - self._stream.write(b"") - except Exception: - return False - return True - - def seekable(self) -> bool: - x = getattr(self._stream, "seekable", None) - if x is not None: - return t.cast(bool, x()) - try: - self._stream.seek(self._stream.tell()) - except Exception: - return False - return True - - -def _is_binary_reader(stream: t.IO, default: bool = False) -> bool: - try: - return isinstance(stream.read(0), bytes) - except Exception: - return default - # This happens in some cases where the stream was already - # closed. In this case, we assume the default. - - -def _is_binary_writer(stream: t.IO, default: bool = False) -> bool: - try: - stream.write(b"") - except Exception: - try: - stream.write("") - return False - except Exception: - pass - return default - return True - - -def _find_binary_reader(stream: t.IO) -> t.Optional[t.BinaryIO]: - # We need to figure out if the given stream is already binary. - # This can happen because the official docs recommend detaching - # the streams to get binary streams. Some code might do this, so - # we need to deal with this case explicitly. - if _is_binary_reader(stream, False): - return t.cast(t.BinaryIO, stream) - - buf = getattr(stream, "buffer", None) - - # Same situation here; this time we assume that the buffer is - # actually binary in case it's closed. - if buf is not None and _is_binary_reader(buf, True): - return t.cast(t.BinaryIO, buf) - - return None - - -def _find_binary_writer(stream: t.IO) -> t.Optional[t.BinaryIO]: - # We need to figure out if the given stream is already binary. - # This can happen because the official docs recommend detaching - # the streams to get binary streams. Some code might do this, so - # we need to deal with this case explicitly. - if _is_binary_writer(stream, False): - return t.cast(t.BinaryIO, stream) - - buf = getattr(stream, "buffer", None) - - # Same situation here; this time we assume that the buffer is - # actually binary in case it's closed. - if buf is not None and _is_binary_writer(buf, True): - return t.cast(t.BinaryIO, buf) - - return None - - -def _stream_is_misconfigured(stream: t.TextIO) -> bool: - """A stream is misconfigured if its encoding is ASCII.""" - # If the stream does not have an encoding set, we assume it's set - # to ASCII. This appears to happen in certain unittest - # environments. It's not quite clear what the correct behavior is - # but this at least will force Click to recover somehow. - return is_ascii_encoding(getattr(stream, "encoding", None) or "ascii") - - -def _is_compat_stream_attr(stream: t.TextIO, attr: str, value: t.Optional[str]) -> bool: - """A stream attribute is compatible if it is equal to the - desired value or the desired value is unset and the attribute - has a value. - """ - stream_value = getattr(stream, attr, None) - return stream_value == value or (value is None and stream_value is not None) - - -def _is_compatible_text_stream( - stream: t.TextIO, encoding: t.Optional[str], errors: t.Optional[str] -) -> bool: - """Check if a stream's encoding and errors attributes are - compatible with the desired values. - """ - return _is_compat_stream_attr( - stream, "encoding", encoding - ) and _is_compat_stream_attr(stream, "errors", errors) - - -def _force_correct_text_stream( - text_stream: t.IO, - encoding: t.Optional[str], - errors: t.Optional[str], - is_binary: t.Callable[[t.IO, bool], bool], - find_binary: t.Callable[[t.IO], t.Optional[t.BinaryIO]], - force_readable: bool = False, - force_writable: bool = False, -) -> t.TextIO: - if is_binary(text_stream, False): - binary_reader = t.cast(t.BinaryIO, text_stream) - else: - text_stream = t.cast(t.TextIO, text_stream) - # If the stream looks compatible, and won't default to a - # misconfigured ascii encoding, return it as-is. - if _is_compatible_text_stream(text_stream, encoding, errors) and not ( - encoding is None and _stream_is_misconfigured(text_stream) - ): - return text_stream - - # Otherwise, get the underlying binary reader. - possible_binary_reader = find_binary(text_stream) - - # If that's not possible, silently use the original reader - # and get mojibake instead of exceptions. - if possible_binary_reader is None: - return text_stream - - binary_reader = possible_binary_reader - - # Default errors to replace instead of strict in order to get - # something that works. - if errors is None: - errors = "replace" - - # Wrap the binary stream in a text stream with the correct - # encoding parameters. - return _make_text_stream( - binary_reader, - encoding, - errors, - force_readable=force_readable, - force_writable=force_writable, - ) - - -def _force_correct_text_reader( - text_reader: t.IO, - encoding: t.Optional[str], - errors: t.Optional[str], - force_readable: bool = False, -) -> t.TextIO: - return _force_correct_text_stream( - text_reader, - encoding, - errors, - _is_binary_reader, - _find_binary_reader, - force_readable=force_readable, - ) - - -def _force_correct_text_writer( - text_writer: t.IO, - encoding: t.Optional[str], - errors: t.Optional[str], - force_writable: bool = False, -) -> t.TextIO: - return _force_correct_text_stream( - text_writer, - encoding, - errors, - _is_binary_writer, - _find_binary_writer, - force_writable=force_writable, - ) - - -def get_binary_stdin() -> t.BinaryIO: - reader = _find_binary_reader(sys.stdin) - if reader is None: - raise RuntimeError("Was not able to determine binary stream for sys.stdin.") - return reader - - -def get_binary_stdout() -> t.BinaryIO: - writer = _find_binary_writer(sys.stdout) - if writer is None: - raise RuntimeError("Was not able to determine binary stream for sys.stdout.") - return writer - - -def get_binary_stderr() -> t.BinaryIO: - writer = _find_binary_writer(sys.stderr) - if writer is None: - raise RuntimeError("Was not able to determine binary stream for sys.stderr.") - return writer - - -def get_text_stdin( - encoding: t.Optional[str] = None, errors: t.Optional[str] = None -) -> t.TextIO: - rv = _get_windows_console_stream(sys.stdin, encoding, errors) - if rv is not None: - return rv - return _force_correct_text_reader(sys.stdin, encoding, errors, force_readable=True) - - -def get_text_stdout( - encoding: t.Optional[str] = None, errors: t.Optional[str] = None -) -> t.TextIO: - rv = _get_windows_console_stream(sys.stdout, encoding, errors) - if rv is not None: - return rv - return _force_correct_text_writer(sys.stdout, encoding, errors, force_writable=True) - - -def get_text_stderr( - encoding: t.Optional[str] = None, errors: t.Optional[str] = None -) -> t.TextIO: - rv = _get_windows_console_stream(sys.stderr, encoding, errors) - if rv is not None: - return rv - return _force_correct_text_writer(sys.stderr, encoding, errors, force_writable=True) - - -def _wrap_io_open( - file: t.Union[str, os.PathLike, int], - mode: str, - encoding: t.Optional[str], - errors: t.Optional[str], -) -> t.IO: - """Handles not passing ``encoding`` and ``errors`` in binary mode.""" - if "b" in mode: - return open(file, mode) - - return open(file, mode, encoding=encoding, errors=errors) - - -def open_stream( - filename: str, - mode: str = "r", - encoding: t.Optional[str] = None, - errors: t.Optional[str] = "strict", - atomic: bool = False, -) -> t.Tuple[t.IO, bool]: - binary = "b" in mode - - # Standard streams first. These are simple because they don't need - # special handling for the atomic flag. It's entirely ignored. - if filename == "-": - if any(m in mode for m in ["w", "a", "x"]): - if binary: - return get_binary_stdout(), False - return get_text_stdout(encoding=encoding, errors=errors), False - if binary: - return get_binary_stdin(), False - return get_text_stdin(encoding=encoding, errors=errors), False - - # Non-atomic writes directly go out through the regular open functions. - if not atomic: - return _wrap_io_open(filename, mode, encoding, errors), True - - # Some usability stuff for atomic writes - if "a" in mode: - raise ValueError( - "Appending to an existing file is not supported, because that" - " would involve an expensive `copy`-operation to a temporary" - " file. Open the file in normal `w`-mode and copy explicitly" - " if that's what you're after." - ) - if "x" in mode: - raise ValueError("Use the `overwrite`-parameter instead.") - if "w" not in mode: - raise ValueError("Atomic writes only make sense with `w`-mode.") - - # Atomic writes are more complicated. They work by opening a file - # as a proxy in the same folder and then using the fdopen - # functionality to wrap it in a Python file. Then we wrap it in an - # atomic file that moves the file over on close. - import errno - import random - - try: - perm: t.Optional[int] = os.stat(filename).st_mode - except OSError: - perm = None - - flags = os.O_RDWR | os.O_CREAT | os.O_EXCL - - if binary: - flags |= getattr(os, "O_BINARY", 0) - - while True: - tmp_filename = os.path.join( - os.path.dirname(filename), - f".__atomic-write{random.randrange(1 << 32):08x}", - ) - try: - fd = os.open(tmp_filename, flags, 0o666 if perm is None else perm) - break - except OSError as e: - if e.errno == errno.EEXIST or ( - os.name == "nt" - and e.errno == errno.EACCES - and os.path.isdir(e.filename) - and os.access(e.filename, os.W_OK) - ): - continue - raise - - if perm is not None: - os.chmod(tmp_filename, perm) # in case perm includes bits in umask - - f = _wrap_io_open(fd, mode, encoding, errors) - af = _AtomicFile(f, tmp_filename, os.path.realpath(filename)) - return t.cast(t.IO, af), True - - -class _AtomicFile: - def __init__(self, f: t.IO, tmp_filename: str, real_filename: str) -> None: - self._f = f - self._tmp_filename = tmp_filename - self._real_filename = real_filename - self.closed = False - - @property - def name(self) -> str: - return self._real_filename - - def close(self, delete: bool = False) -> None: - if self.closed: - return - self._f.close() - os.replace(self._tmp_filename, self._real_filename) - self.closed = True - - def __getattr__(self, name: str) -> t.Any: - return getattr(self._f, name) - - def __enter__(self) -> "_AtomicFile": - return self - - def __exit__(self, exc_type, exc_value, tb): # type: ignore - self.close(delete=exc_type is not None) - - def __repr__(self) -> str: - return repr(self._f) - - -def strip_ansi(value: str) -> str: - return _ansi_re.sub("", value) - - -def _is_jupyter_kernel_output(stream: t.IO) -> bool: - while isinstance(stream, (_FixupStream, _NonClosingTextIOWrapper)): - stream = stream._stream - - return stream.__class__.__module__.startswith("ipykernel.") - - -def should_strip_ansi( - stream: t.Optional[t.IO] = None, color: t.Optional[bool] = None -) -> bool: - if color is None: - if stream is None: - stream = sys.stdin - return not isatty(stream) and not _is_jupyter_kernel_output(stream) - return not color - - -# On Windows, wrap the output streams with colorama to support ANSI -# color codes. -# NOTE: double check is needed so mypy does not analyze this on Linux -if sys.platform.startswith("win") and WIN: - from ._winconsole import _get_windows_console_stream - - def _get_argv_encoding() -> str: - import locale - - return locale.getpreferredencoding() - - _ansi_stream_wrappers: t.MutableMapping[t.TextIO, t.TextIO] = WeakKeyDictionary() - - def auto_wrap_for_ansi( - stream: t.TextIO, color: t.Optional[bool] = None - ) -> t.TextIO: - """Support ANSI color and style codes on Windows by wrapping a - stream with colorama. - """ - try: - cached = _ansi_stream_wrappers.get(stream) - except Exception: - cached = None - - if cached is not None: - return cached - - import colorama - - strip = should_strip_ansi(stream, color) - ansi_wrapper = colorama.AnsiToWin32(stream, strip=strip) - rv = t.cast(t.TextIO, ansi_wrapper.stream) - _write = rv.write - - def _safe_write(s): - try: - return _write(s) - except BaseException: - ansi_wrapper.reset_all() - raise - - rv.write = _safe_write - - try: - _ansi_stream_wrappers[stream] = rv - except Exception: - pass - - return rv - - -else: - - def _get_argv_encoding() -> str: - return getattr(sys.stdin, "encoding", None) or get_filesystem_encoding() - - def _get_windows_console_stream( - f: t.TextIO, encoding: t.Optional[str], errors: t.Optional[str] - ) -> t.Optional[t.TextIO]: - return None - - -def term_len(x: str) -> int: - return len(strip_ansi(x)) - - -def isatty(stream: t.IO) -> bool: - try: - return stream.isatty() - except Exception: - return False - - -def _make_cached_stream_func( - src_func: t.Callable[[], t.TextIO], wrapper_func: t.Callable[[], t.TextIO] -) -> t.Callable[[], t.TextIO]: - cache: t.MutableMapping[t.TextIO, t.TextIO] = WeakKeyDictionary() - - def func() -> t.TextIO: - stream = src_func() - try: - rv = cache.get(stream) - except Exception: - rv = None - if rv is not None: - return rv - rv = wrapper_func() - try: - cache[stream] = rv - except Exception: - pass - return rv - - return func - - -_default_text_stdin = _make_cached_stream_func(lambda: sys.stdin, get_text_stdin) -_default_text_stdout = _make_cached_stream_func(lambda: sys.stdout, get_text_stdout) -_default_text_stderr = _make_cached_stream_func(lambda: sys.stderr, get_text_stderr) - - -binary_streams: t.Mapping[str, t.Callable[[], t.BinaryIO]] = { - "stdin": get_binary_stdin, - "stdout": get_binary_stdout, - "stderr": get_binary_stderr, -} - -text_streams: t.Mapping[ - str, t.Callable[[t.Optional[str], t.Optional[str]], t.TextIO] -] = { - "stdin": get_text_stdin, - "stdout": get_text_stdout, - "stderr": get_text_stderr, -} diff --git a/venv/lib/python3.8/site-packages/click/_termui_impl.py b/venv/lib/python3.8/site-packages/click/_termui_impl.py deleted file mode 100644 index 06cf2b7..0000000 --- a/venv/lib/python3.8/site-packages/click/_termui_impl.py +++ /dev/null @@ -1,717 +0,0 @@ -""" -This module contains implementations for the termui module. To keep the -import time of Click down, some infrequently used functionality is -placed in this module and only imported as needed. -""" -import contextlib -import math -import os -import sys -import time -import typing as t -from gettext import gettext as _ - -from ._compat import _default_text_stdout -from ._compat import CYGWIN -from ._compat import get_best_encoding -from ._compat import isatty -from ._compat import open_stream -from ._compat import strip_ansi -from ._compat import term_len -from ._compat import WIN -from .exceptions import ClickException -from .utils import echo - -V = t.TypeVar("V") - -if os.name == "nt": - BEFORE_BAR = "\r" - AFTER_BAR = "\n" -else: - BEFORE_BAR = "\r\033[?25l" - AFTER_BAR = "\033[?25h\n" - - -class ProgressBar(t.Generic[V]): - def __init__( - self, - iterable: t.Optional[t.Iterable[V]], - length: t.Optional[int] = None, - fill_char: str = "#", - empty_char: str = " ", - bar_template: str = "%(bar)s", - info_sep: str = " ", - show_eta: bool = True, - show_percent: t.Optional[bool] = None, - show_pos: bool = False, - item_show_func: t.Optional[t.Callable[[t.Optional[V]], t.Optional[str]]] = None, - label: t.Optional[str] = None, - file: t.Optional[t.TextIO] = None, - color: t.Optional[bool] = None, - update_min_steps: int = 1, - width: int = 30, - ) -> None: - self.fill_char = fill_char - self.empty_char = empty_char - self.bar_template = bar_template - self.info_sep = info_sep - self.show_eta = show_eta - self.show_percent = show_percent - self.show_pos = show_pos - self.item_show_func = item_show_func - self.label = label or "" - if file is None: - file = _default_text_stdout() - self.file = file - self.color = color - self.update_min_steps = update_min_steps - self._completed_intervals = 0 - self.width = width - self.autowidth = width == 0 - - if length is None: - from operator import length_hint - - length = length_hint(iterable, -1) - - if length == -1: - length = None - if iterable is None: - if length is None: - raise TypeError("iterable or length is required") - iterable = t.cast(t.Iterable[V], range(length)) - self.iter = iter(iterable) - self.length = length - self.pos = 0 - self.avg: t.List[float] = [] - self.start = self.last_eta = time.time() - self.eta_known = False - self.finished = False - self.max_width: t.Optional[int] = None - self.entered = False - self.current_item: t.Optional[V] = None - self.is_hidden = not isatty(self.file) - self._last_line: t.Optional[str] = None - - def __enter__(self) -> "ProgressBar": - self.entered = True - self.render_progress() - return self - - def __exit__(self, exc_type, exc_value, tb): # type: ignore - self.render_finish() - - def __iter__(self) -> t.Iterator[V]: - if not self.entered: - raise RuntimeError("You need to use progress bars in a with block.") - self.render_progress() - return self.generator() - - def __next__(self) -> V: - # Iteration is defined in terms of a generator function, - # returned by iter(self); use that to define next(). This works - # because `self.iter` is an iterable consumed by that generator, - # so it is re-entry safe. Calling `next(self.generator())` - # twice works and does "what you want". - return next(iter(self)) - - def render_finish(self) -> None: - if self.is_hidden: - return - self.file.write(AFTER_BAR) - self.file.flush() - - @property - def pct(self) -> float: - if self.finished: - return 1.0 - return min(self.pos / (float(self.length or 1) or 1), 1.0) - - @property - def time_per_iteration(self) -> float: - if not self.avg: - return 0.0 - return sum(self.avg) / float(len(self.avg)) - - @property - def eta(self) -> float: - if self.length is not None and not self.finished: - return self.time_per_iteration * (self.length - self.pos) - return 0.0 - - def format_eta(self) -> str: - if self.eta_known: - t = int(self.eta) - seconds = t % 60 - t //= 60 - minutes = t % 60 - t //= 60 - hours = t % 24 - t //= 24 - if t > 0: - return f"{t}d {hours:02}:{minutes:02}:{seconds:02}" - else: - return f"{hours:02}:{minutes:02}:{seconds:02}" - return "" - - def format_pos(self) -> str: - pos = str(self.pos) - if self.length is not None: - pos += f"/{self.length}" - return pos - - def format_pct(self) -> str: - return f"{int(self.pct * 100): 4}%"[1:] - - def format_bar(self) -> str: - if self.length is not None: - bar_length = int(self.pct * self.width) - bar = self.fill_char * bar_length - bar += self.empty_char * (self.width - bar_length) - elif self.finished: - bar = self.fill_char * self.width - else: - chars = list(self.empty_char * (self.width or 1)) - if self.time_per_iteration != 0: - chars[ - int( - (math.cos(self.pos * self.time_per_iteration) / 2.0 + 0.5) - * self.width - ) - ] = self.fill_char - bar = "".join(chars) - return bar - - def format_progress_line(self) -> str: - show_percent = self.show_percent - - info_bits = [] - if self.length is not None and show_percent is None: - show_percent = not self.show_pos - - if self.show_pos: - info_bits.append(self.format_pos()) - if show_percent: - info_bits.append(self.format_pct()) - if self.show_eta and self.eta_known and not self.finished: - info_bits.append(self.format_eta()) - if self.item_show_func is not None: - item_info = self.item_show_func(self.current_item) - if item_info is not None: - info_bits.append(item_info) - - return ( - self.bar_template - % { - "label": self.label, - "bar": self.format_bar(), - "info": self.info_sep.join(info_bits), - } - ).rstrip() - - def render_progress(self) -> None: - import shutil - - if self.is_hidden: - # Only output the label as it changes if the output is not a - # TTY. Use file=stderr if you expect to be piping stdout. - if self._last_line != self.label: - self._last_line = self.label - echo(self.label, file=self.file, color=self.color) - - return - - buf = [] - # Update width in case the terminal has been resized - if self.autowidth: - old_width = self.width - self.width = 0 - clutter_length = term_len(self.format_progress_line()) - new_width = max(0, shutil.get_terminal_size().columns - clutter_length) - if new_width < old_width: - buf.append(BEFORE_BAR) - buf.append(" " * self.max_width) # type: ignore - self.max_width = new_width - self.width = new_width - - clear_width = self.width - if self.max_width is not None: - clear_width = self.max_width - - buf.append(BEFORE_BAR) - line = self.format_progress_line() - line_len = term_len(line) - if self.max_width is None or self.max_width < line_len: - self.max_width = line_len - - buf.append(line) - buf.append(" " * (clear_width - line_len)) - line = "".join(buf) - # Render the line only if it changed. - - if line != self._last_line: - self._last_line = line - echo(line, file=self.file, color=self.color, nl=False) - self.file.flush() - - def make_step(self, n_steps: int) -> None: - self.pos += n_steps - if self.length is not None and self.pos >= self.length: - self.finished = True - - if (time.time() - self.last_eta) < 1.0: - return - - self.last_eta = time.time() - - # self.avg is a rolling list of length <= 7 of steps where steps are - # defined as time elapsed divided by the total progress through - # self.length. - if self.pos: - step = (time.time() - self.start) / self.pos - else: - step = time.time() - self.start - - self.avg = self.avg[-6:] + [step] - - self.eta_known = self.length is not None - - def update(self, n_steps: int, current_item: t.Optional[V] = None) -> None: - """Update the progress bar by advancing a specified number of - steps, and optionally set the ``current_item`` for this new - position. - - :param n_steps: Number of steps to advance. - :param current_item: Optional item to set as ``current_item`` - for the updated position. - - .. versionchanged:: 8.0 - Added the ``current_item`` optional parameter. - - .. versionchanged:: 8.0 - Only render when the number of steps meets the - ``update_min_steps`` threshold. - """ - if current_item is not None: - self.current_item = current_item - - self._completed_intervals += n_steps - - if self._completed_intervals >= self.update_min_steps: - self.make_step(self._completed_intervals) - self.render_progress() - self._completed_intervals = 0 - - def finish(self) -> None: - self.eta_known = False - self.current_item = None - self.finished = True - - def generator(self) -> t.Iterator[V]: - """Return a generator which yields the items added to the bar - during construction, and updates the progress bar *after* the - yielded block returns. - """ - # WARNING: the iterator interface for `ProgressBar` relies on - # this and only works because this is a simple generator which - # doesn't create or manage additional state. If this function - # changes, the impact should be evaluated both against - # `iter(bar)` and `next(bar)`. `next()` in particular may call - # `self.generator()` repeatedly, and this must remain safe in - # order for that interface to work. - if not self.entered: - raise RuntimeError("You need to use progress bars in a with block.") - - if self.is_hidden: - yield from self.iter - else: - for rv in self.iter: - self.current_item = rv - - # This allows show_item_func to be updated before the - # item is processed. Only trigger at the beginning of - # the update interval. - if self._completed_intervals == 0: - self.render_progress() - - yield rv - self.update(1) - - self.finish() - self.render_progress() - - -def pager(generator: t.Iterable[str], color: t.Optional[bool] = None) -> None: - """Decide what method to use for paging through text.""" - stdout = _default_text_stdout() - if not isatty(sys.stdin) or not isatty(stdout): - return _nullpager(stdout, generator, color) - pager_cmd = (os.environ.get("PAGER", None) or "").strip() - if pager_cmd: - if WIN: - return _tempfilepager(generator, pager_cmd, color) - return _pipepager(generator, pager_cmd, color) - if os.environ.get("TERM") in ("dumb", "emacs"): - return _nullpager(stdout, generator, color) - if WIN or sys.platform.startswith("os2"): - return _tempfilepager(generator, "more <", color) - if hasattr(os, "system") and os.system("(less) 2>/dev/null") == 0: - return _pipepager(generator, "less", color) - - import tempfile - - fd, filename = tempfile.mkstemp() - os.close(fd) - try: - if hasattr(os, "system") and os.system(f'more "{filename}"') == 0: - return _pipepager(generator, "more", color) - return _nullpager(stdout, generator, color) - finally: - os.unlink(filename) - - -def _pipepager(generator: t.Iterable[str], cmd: str, color: t.Optional[bool]) -> None: - """Page through text by feeding it to another program. Invoking a - pager through this might support colors. - """ - import subprocess - - env = dict(os.environ) - - # If we're piping to less we might support colors under the - # condition that - cmd_detail = cmd.rsplit("/", 1)[-1].split() - if color is None and cmd_detail[0] == "less": - less_flags = f"{os.environ.get('LESS', '')}{' '.join(cmd_detail[1:])}" - if not less_flags: - env["LESS"] = "-R" - color = True - elif "r" in less_flags or "R" in less_flags: - color = True - - c = subprocess.Popen(cmd, shell=True, stdin=subprocess.PIPE, env=env) - stdin = t.cast(t.BinaryIO, c.stdin) - encoding = get_best_encoding(stdin) - try: - for text in generator: - if not color: - text = strip_ansi(text) - - stdin.write(text.encode(encoding, "replace")) - except (OSError, KeyboardInterrupt): - pass - else: - stdin.close() - - # Less doesn't respect ^C, but catches it for its own UI purposes (aborting - # search or other commands inside less). - # - # That means when the user hits ^C, the parent process (click) terminates, - # but less is still alive, paging the output and messing up the terminal. - # - # If the user wants to make the pager exit on ^C, they should set - # `LESS='-K'`. It's not our decision to make. - while True: - try: - c.wait() - except KeyboardInterrupt: - pass - else: - break - - -def _tempfilepager( - generator: t.Iterable[str], cmd: str, color: t.Optional[bool] -) -> None: - """Page through text by invoking a program on a temporary file.""" - import tempfile - - _, filename = tempfile.mkstemp() - # TODO: This never terminates if the passed generator never terminates. - text = "".join(generator) - if not color: - text = strip_ansi(text) - encoding = get_best_encoding(sys.stdout) - with open_stream(filename, "wb")[0] as f: - f.write(text.encode(encoding)) - try: - os.system(f'{cmd} "{filename}"') - finally: - os.unlink(filename) - - -def _nullpager( - stream: t.TextIO, generator: t.Iterable[str], color: t.Optional[bool] -) -> None: - """Simply print unformatted text. This is the ultimate fallback.""" - for text in generator: - if not color: - text = strip_ansi(text) - stream.write(text) - - -class Editor: - def __init__( - self, - editor: t.Optional[str] = None, - env: t.Optional[t.Mapping[str, str]] = None, - require_save: bool = True, - extension: str = ".txt", - ) -> None: - self.editor = editor - self.env = env - self.require_save = require_save - self.extension = extension - - def get_editor(self) -> str: - if self.editor is not None: - return self.editor - for key in "VISUAL", "EDITOR": - rv = os.environ.get(key) - if rv: - return rv - if WIN: - return "notepad" - for editor in "sensible-editor", "vim", "nano": - if os.system(f"which {editor} >/dev/null 2>&1") == 0: - return editor - return "vi" - - def edit_file(self, filename: str) -> None: - import subprocess - - editor = self.get_editor() - environ: t.Optional[t.Dict[str, str]] = None - - if self.env: - environ = os.environ.copy() - environ.update(self.env) - - try: - c = subprocess.Popen(f'{editor} "{filename}"', env=environ, shell=True) - exit_code = c.wait() - if exit_code != 0: - raise ClickException( - _("{editor}: Editing failed").format(editor=editor) - ) - except OSError as e: - raise ClickException( - _("{editor}: Editing failed: {e}").format(editor=editor, e=e) - ) - - def edit(self, text: t.Optional[t.AnyStr]) -> t.Optional[t.AnyStr]: - import tempfile - - if not text: - data = b"" - elif isinstance(text, (bytes, bytearray)): - data = text - else: - if text and not text.endswith("\n"): - text += "\n" - - if WIN: - data = text.replace("\n", "\r\n").encode("utf-8-sig") - else: - data = text.encode("utf-8") - - fd, name = tempfile.mkstemp(prefix="editor-", suffix=self.extension) - f: t.BinaryIO - - try: - with os.fdopen(fd, "wb") as f: - f.write(data) - - # If the filesystem resolution is 1 second, like Mac OS - # 10.12 Extended, or 2 seconds, like FAT32, and the editor - # closes very fast, require_save can fail. Set the modified - # time to be 2 seconds in the past to work around this. - os.utime(name, (os.path.getatime(name), os.path.getmtime(name) - 2)) - # Depending on the resolution, the exact value might not be - # recorded, so get the new recorded value. - timestamp = os.path.getmtime(name) - - self.edit_file(name) - - if self.require_save and os.path.getmtime(name) == timestamp: - return None - - with open(name, "rb") as f: - rv = f.read() - - if isinstance(text, (bytes, bytearray)): - return rv - - return rv.decode("utf-8-sig").replace("\r\n", "\n") # type: ignore - finally: - os.unlink(name) - - -def open_url(url: str, wait: bool = False, locate: bool = False) -> int: - import subprocess - - def _unquote_file(url: str) -> str: - from urllib.parse import unquote - - if url.startswith("file://"): - url = unquote(url[7:]) - - return url - - if sys.platform == "darwin": - args = ["open"] - if wait: - args.append("-W") - if locate: - args.append("-R") - args.append(_unquote_file(url)) - null = open("/dev/null", "w") - try: - return subprocess.Popen(args, stderr=null).wait() - finally: - null.close() - elif WIN: - if locate: - url = _unquote_file(url.replace('"', "")) - args = f'explorer /select,"{url}"' - else: - url = url.replace('"', "") - wait_str = "/WAIT" if wait else "" - args = f'start {wait_str} "" "{url}"' - return os.system(args) - elif CYGWIN: - if locate: - url = os.path.dirname(_unquote_file(url).replace('"', "")) - args = f'cygstart "{url}"' - else: - url = url.replace('"', "") - wait_str = "-w" if wait else "" - args = f'cygstart {wait_str} "{url}"' - return os.system(args) - - try: - if locate: - url = os.path.dirname(_unquote_file(url)) or "." - else: - url = _unquote_file(url) - c = subprocess.Popen(["xdg-open", url]) - if wait: - return c.wait() - return 0 - except OSError: - if url.startswith(("http://", "https://")) and not locate and not wait: - import webbrowser - - webbrowser.open(url) - return 0 - return 1 - - -def _translate_ch_to_exc(ch: str) -> t.Optional[BaseException]: - if ch == "\x03": - raise KeyboardInterrupt() - - if ch == "\x04" and not WIN: # Unix-like, Ctrl+D - raise EOFError() - - if ch == "\x1a" and WIN: # Windows, Ctrl+Z - raise EOFError() - - return None - - -if WIN: - import msvcrt - - @contextlib.contextmanager - def raw_terminal() -> t.Iterator[int]: - yield -1 - - def getchar(echo: bool) -> str: - # The function `getch` will return a bytes object corresponding to - # the pressed character. Since Windows 10 build 1803, it will also - # return \x00 when called a second time after pressing a regular key. - # - # `getwch` does not share this probably-bugged behavior. Moreover, it - # returns a Unicode object by default, which is what we want. - # - # Either of these functions will return \x00 or \xe0 to indicate - # a special key, and you need to call the same function again to get - # the "rest" of the code. The fun part is that \u00e0 is - # "latin small letter a with grave", so if you type that on a French - # keyboard, you _also_ get a \xe0. - # E.g., consider the Up arrow. This returns \xe0 and then \x48. The - # resulting Unicode string reads as "a with grave" + "capital H". - # This is indistinguishable from when the user actually types - # "a with grave" and then "capital H". - # - # When \xe0 is returned, we assume it's part of a special-key sequence - # and call `getwch` again, but that means that when the user types - # the \u00e0 character, `getchar` doesn't return until a second - # character is typed. - # The alternative is returning immediately, but that would mess up - # cross-platform handling of arrow keys and others that start with - # \xe0. Another option is using `getch`, but then we can't reliably - # read non-ASCII characters, because return values of `getch` are - # limited to the current 8-bit codepage. - # - # Anyway, Click doesn't claim to do this Right(tm), and using `getwch` - # is doing the right thing in more situations than with `getch`. - func: t.Callable[[], str] - - if echo: - func = msvcrt.getwche # type: ignore - else: - func = msvcrt.getwch # type: ignore - - rv = func() - - if rv in ("\x00", "\xe0"): - # \x00 and \xe0 are control characters that indicate special key, - # see above. - rv += func() - - _translate_ch_to_exc(rv) - return rv - - -else: - import tty - import termios - - @contextlib.contextmanager - def raw_terminal() -> t.Iterator[int]: - f: t.Optional[t.TextIO] - fd: int - - if not isatty(sys.stdin): - f = open("/dev/tty") - fd = f.fileno() - else: - fd = sys.stdin.fileno() - f = None - - try: - old_settings = termios.tcgetattr(fd) - - try: - tty.setraw(fd) - yield fd - finally: - termios.tcsetattr(fd, termios.TCSADRAIN, old_settings) - sys.stdout.flush() - - if f is not None: - f.close() - except termios.error: - pass - - def getchar(echo: bool) -> str: - with raw_terminal() as fd: - ch = os.read(fd, 32).decode(get_best_encoding(sys.stdin), "replace") - - if echo and isatty(sys.stdout): - sys.stdout.write(ch) - - _translate_ch_to_exc(ch) - return ch diff --git a/venv/lib/python3.8/site-packages/click/_textwrap.py b/venv/lib/python3.8/site-packages/click/_textwrap.py deleted file mode 100644 index b47dcbd..0000000 --- a/venv/lib/python3.8/site-packages/click/_textwrap.py +++ /dev/null @@ -1,49 +0,0 @@ -import textwrap -import typing as t -from contextlib import contextmanager - - -class TextWrapper(textwrap.TextWrapper): - def _handle_long_word( - self, - reversed_chunks: t.List[str], - cur_line: t.List[str], - cur_len: int, - width: int, - ) -> None: - space_left = max(width - cur_len, 1) - - if self.break_long_words: - last = reversed_chunks[-1] - cut = last[:space_left] - res = last[space_left:] - cur_line.append(cut) - reversed_chunks[-1] = res - elif not cur_line: - cur_line.append(reversed_chunks.pop()) - - @contextmanager - def extra_indent(self, indent: str) -> t.Iterator[None]: - old_initial_indent = self.initial_indent - old_subsequent_indent = self.subsequent_indent - self.initial_indent += indent - self.subsequent_indent += indent - - try: - yield - finally: - self.initial_indent = old_initial_indent - self.subsequent_indent = old_subsequent_indent - - def indent_only(self, text: str) -> str: - rv = [] - - for idx, line in enumerate(text.splitlines()): - indent = self.initial_indent - - if idx > 0: - indent = self.subsequent_indent - - rv.append(f"{indent}{line}") - - return "\n".join(rv) diff --git a/venv/lib/python3.8/site-packages/click/_unicodefun.py b/venv/lib/python3.8/site-packages/click/_unicodefun.py deleted file mode 100644 index 9cb30c3..0000000 --- a/venv/lib/python3.8/site-packages/click/_unicodefun.py +++ /dev/null @@ -1,100 +0,0 @@ -import codecs -import os -from gettext import gettext as _ - - -def _verify_python_env() -> None: - """Ensures that the environment is good for Unicode.""" - try: - from locale import getpreferredencoding - - fs_enc = codecs.lookup(getpreferredencoding()).name - except Exception: - fs_enc = "ascii" - - if fs_enc != "ascii": - return - - extra = [ - _( - "Click will abort further execution because Python was" - " configured to use ASCII as encoding for the environment." - " Consult https://click.palletsprojects.com/unicode-support/" - " for mitigation steps." - ) - ] - - if os.name == "posix": - import subprocess - - try: - rv = subprocess.Popen( - ["locale", "-a"], - stdout=subprocess.PIPE, - stderr=subprocess.PIPE, - encoding="ascii", - errors="replace", - ).communicate()[0] - except OSError: - rv = "" - - good_locales = set() - has_c_utf8 = False - - for line in rv.splitlines(): - locale = line.strip() - - if locale.lower().endswith((".utf-8", ".utf8")): - good_locales.add(locale) - - if locale.lower() in ("c.utf8", "c.utf-8"): - has_c_utf8 = True - - if not good_locales: - extra.append( - _( - "Additional information: on this system no suitable" - " UTF-8 locales were discovered. This most likely" - " requires resolving by reconfiguring the locale" - " system." - ) - ) - elif has_c_utf8: - extra.append( - _( - "This system supports the C.UTF-8 locale which is" - " recommended. You might be able to resolve your" - " issue by exporting the following environment" - " variables:" - ) - ) - extra.append(" export LC_ALL=C.UTF-8\n export LANG=C.UTF-8") - else: - extra.append( - _( - "This system lists some UTF-8 supporting locales" - " that you can pick from. The following suitable" - " locales were discovered: {locales}" - ).format(locales=", ".join(sorted(good_locales))) - ) - - bad_locale = None - - for env_locale in os.environ.get("LC_ALL"), os.environ.get("LANG"): - if env_locale and env_locale.lower().endswith((".utf-8", ".utf8")): - bad_locale = env_locale - - if env_locale is not None: - break - - if bad_locale is not None: - extra.append( - _( - "Click discovered that you exported a UTF-8 locale" - " but the locale system could not pick up from it" - " because it does not exist. The exported locale is" - " {locale!r} but it is not supported." - ).format(locale=bad_locale) - ) - - raise RuntimeError("\n\n".join(extra)) diff --git a/venv/lib/python3.8/site-packages/click/_winconsole.py b/venv/lib/python3.8/site-packages/click/_winconsole.py deleted file mode 100644 index 6b20df3..0000000 --- a/venv/lib/python3.8/site-packages/click/_winconsole.py +++ /dev/null @@ -1,279 +0,0 @@ -# This module is based on the excellent work by Adam Bartoš who -# provided a lot of what went into the implementation here in -# the discussion to issue1602 in the Python bug tracker. -# -# There are some general differences in regards to how this works -# compared to the original patches as we do not need to patch -# the entire interpreter but just work in our little world of -# echo and prompt. -import io -import sys -import time -import typing as t -from ctypes import byref -from ctypes import c_char -from ctypes import c_char_p -from ctypes import c_int -from ctypes import c_ssize_t -from ctypes import c_ulong -from ctypes import c_void_p -from ctypes import POINTER -from ctypes import py_object -from ctypes import Structure -from ctypes.wintypes import DWORD -from ctypes.wintypes import HANDLE -from ctypes.wintypes import LPCWSTR -from ctypes.wintypes import LPWSTR - -from ._compat import _NonClosingTextIOWrapper - -assert sys.platform == "win32" -import msvcrt # noqa: E402 -from ctypes import windll # noqa: E402 -from ctypes import WINFUNCTYPE # noqa: E402 - -c_ssize_p = POINTER(c_ssize_t) - -kernel32 = windll.kernel32 -GetStdHandle = kernel32.GetStdHandle -ReadConsoleW = kernel32.ReadConsoleW -WriteConsoleW = kernel32.WriteConsoleW -GetConsoleMode = kernel32.GetConsoleMode -GetLastError = kernel32.GetLastError -GetCommandLineW = WINFUNCTYPE(LPWSTR)(("GetCommandLineW", windll.kernel32)) -CommandLineToArgvW = WINFUNCTYPE(POINTER(LPWSTR), LPCWSTR, POINTER(c_int))( - ("CommandLineToArgvW", windll.shell32) -) -LocalFree = WINFUNCTYPE(c_void_p, c_void_p)(("LocalFree", windll.kernel32)) - -STDIN_HANDLE = GetStdHandle(-10) -STDOUT_HANDLE = GetStdHandle(-11) -STDERR_HANDLE = GetStdHandle(-12) - -PyBUF_SIMPLE = 0 -PyBUF_WRITABLE = 1 - -ERROR_SUCCESS = 0 -ERROR_NOT_ENOUGH_MEMORY = 8 -ERROR_OPERATION_ABORTED = 995 - -STDIN_FILENO = 0 -STDOUT_FILENO = 1 -STDERR_FILENO = 2 - -EOF = b"\x1a" -MAX_BYTES_WRITTEN = 32767 - -try: - from ctypes import pythonapi -except ImportError: - # On PyPy we cannot get buffers so our ability to operate here is - # severely limited. - get_buffer = None -else: - - class Py_buffer(Structure): - _fields_ = [ - ("buf", c_void_p), - ("obj", py_object), - ("len", c_ssize_t), - ("itemsize", c_ssize_t), - ("readonly", c_int), - ("ndim", c_int), - ("format", c_char_p), - ("shape", c_ssize_p), - ("strides", c_ssize_p), - ("suboffsets", c_ssize_p), - ("internal", c_void_p), - ] - - PyObject_GetBuffer = pythonapi.PyObject_GetBuffer - PyBuffer_Release = pythonapi.PyBuffer_Release - - def get_buffer(obj, writable=False): - buf = Py_buffer() - flags = PyBUF_WRITABLE if writable else PyBUF_SIMPLE - PyObject_GetBuffer(py_object(obj), byref(buf), flags) - - try: - buffer_type = c_char * buf.len - return buffer_type.from_address(buf.buf) - finally: - PyBuffer_Release(byref(buf)) - - -class _WindowsConsoleRawIOBase(io.RawIOBase): - def __init__(self, handle): - self.handle = handle - - def isatty(self): - super().isatty() - return True - - -class _WindowsConsoleReader(_WindowsConsoleRawIOBase): - def readable(self): - return True - - def readinto(self, b): - bytes_to_be_read = len(b) - if not bytes_to_be_read: - return 0 - elif bytes_to_be_read % 2: - raise ValueError( - "cannot read odd number of bytes from UTF-16-LE encoded console" - ) - - buffer = get_buffer(b, writable=True) - code_units_to_be_read = bytes_to_be_read // 2 - code_units_read = c_ulong() - - rv = ReadConsoleW( - HANDLE(self.handle), - buffer, - code_units_to_be_read, - byref(code_units_read), - None, - ) - if GetLastError() == ERROR_OPERATION_ABORTED: - # wait for KeyboardInterrupt - time.sleep(0.1) - if not rv: - raise OSError(f"Windows error: {GetLastError()}") - - if buffer[0] == EOF: - return 0 - return 2 * code_units_read.value - - -class _WindowsConsoleWriter(_WindowsConsoleRawIOBase): - def writable(self): - return True - - @staticmethod - def _get_error_message(errno): - if errno == ERROR_SUCCESS: - return "ERROR_SUCCESS" - elif errno == ERROR_NOT_ENOUGH_MEMORY: - return "ERROR_NOT_ENOUGH_MEMORY" - return f"Windows error {errno}" - - def write(self, b): - bytes_to_be_written = len(b) - buf = get_buffer(b) - code_units_to_be_written = min(bytes_to_be_written, MAX_BYTES_WRITTEN) // 2 - code_units_written = c_ulong() - - WriteConsoleW( - HANDLE(self.handle), - buf, - code_units_to_be_written, - byref(code_units_written), - None, - ) - bytes_written = 2 * code_units_written.value - - if bytes_written == 0 and bytes_to_be_written > 0: - raise OSError(self._get_error_message(GetLastError())) - return bytes_written - - -class ConsoleStream: - def __init__(self, text_stream: t.TextIO, byte_stream: t.BinaryIO) -> None: - self._text_stream = text_stream - self.buffer = byte_stream - - @property - def name(self) -> str: - return self.buffer.name - - def write(self, x: t.AnyStr) -> int: - if isinstance(x, str): - return self._text_stream.write(x) - try: - self.flush() - except Exception: - pass - return self.buffer.write(x) - - def writelines(self, lines: t.Iterable[t.AnyStr]) -> None: - for line in lines: - self.write(line) - - def __getattr__(self, name: str) -> t.Any: - return getattr(self._text_stream, name) - - def isatty(self) -> bool: - return self.buffer.isatty() - - def __repr__(self): - return f"" - - -def _get_text_stdin(buffer_stream: t.BinaryIO) -> t.TextIO: - text_stream = _NonClosingTextIOWrapper( - io.BufferedReader(_WindowsConsoleReader(STDIN_HANDLE)), - "utf-16-le", - "strict", - line_buffering=True, - ) - return t.cast(t.TextIO, ConsoleStream(text_stream, buffer_stream)) - - -def _get_text_stdout(buffer_stream: t.BinaryIO) -> t.TextIO: - text_stream = _NonClosingTextIOWrapper( - io.BufferedWriter(_WindowsConsoleWriter(STDOUT_HANDLE)), - "utf-16-le", - "strict", - line_buffering=True, - ) - return t.cast(t.TextIO, ConsoleStream(text_stream, buffer_stream)) - - -def _get_text_stderr(buffer_stream: t.BinaryIO) -> t.TextIO: - text_stream = _NonClosingTextIOWrapper( - io.BufferedWriter(_WindowsConsoleWriter(STDERR_HANDLE)), - "utf-16-le", - "strict", - line_buffering=True, - ) - return t.cast(t.TextIO, ConsoleStream(text_stream, buffer_stream)) - - -_stream_factories: t.Mapping[int, t.Callable[[t.BinaryIO], t.TextIO]] = { - 0: _get_text_stdin, - 1: _get_text_stdout, - 2: _get_text_stderr, -} - - -def _is_console(f: t.TextIO) -> bool: - if not hasattr(f, "fileno"): - return False - - try: - fileno = f.fileno() - except (OSError, io.UnsupportedOperation): - return False - - handle = msvcrt.get_osfhandle(fileno) - return bool(GetConsoleMode(handle, byref(DWORD()))) - - -def _get_windows_console_stream( - f: t.TextIO, encoding: t.Optional[str], errors: t.Optional[str] -) -> t.Optional[t.TextIO]: - if ( - get_buffer is not None - and encoding in {"utf-16-le", None} - and errors in {"strict", None} - and _is_console(f) - ): - func = _stream_factories.get(f.fileno()) - if func is not None: - b = getattr(f, "buffer", None) - - if b is None: - return None - - return func(b) diff --git a/venv/lib/python3.8/site-packages/click/core.py b/venv/lib/python3.8/site-packages/click/core.py deleted file mode 100644 index e2ccf59..0000000 --- a/venv/lib/python3.8/site-packages/click/core.py +++ /dev/null @@ -1,2957 +0,0 @@ -import enum -import errno -import os -import sys -import typing -import typing as t -from collections import abc -from contextlib import contextmanager -from contextlib import ExitStack -from functools import partial -from functools import update_wrapper -from gettext import gettext as _ -from gettext import ngettext -from itertools import repeat - -from . import types -from ._unicodefun import _verify_python_env -from .exceptions import Abort -from .exceptions import BadParameter -from .exceptions import ClickException -from .exceptions import Exit -from .exceptions import MissingParameter -from .exceptions import UsageError -from .formatting import HelpFormatter -from .formatting import join_options -from .globals import pop_context -from .globals import push_context -from .parser import _flag_needs_value -from .parser import OptionParser -from .parser import split_opt -from .termui import confirm -from .termui import prompt -from .termui import style -from .utils import _detect_program_name -from .utils import _expand_args -from .utils import echo -from .utils import make_default_short_help -from .utils import make_str -from .utils import PacifyFlushWrapper - -if t.TYPE_CHECKING: - import typing_extensions as te - from .shell_completion import CompletionItem - -F = t.TypeVar("F", bound=t.Callable[..., t.Any]) -V = t.TypeVar("V") - - -def _fast_exit(code: int) -> "te.NoReturn": - """Low-level exit that skips Python's cleanup but speeds up exit by - about 10ms for things like shell completion. - - :param code: Exit code. - """ - sys.stdout.flush() - sys.stderr.flush() - os._exit(code) - - -def _complete_visible_commands( - ctx: "Context", incomplete: str -) -> t.Iterator[t.Tuple[str, "Command"]]: - """List all the subcommands of a group that start with the - incomplete value and aren't hidden. - - :param ctx: Invocation context for the group. - :param incomplete: Value being completed. May be empty. - """ - multi = t.cast(MultiCommand, ctx.command) - - for name in multi.list_commands(ctx): - if name.startswith(incomplete): - command = multi.get_command(ctx, name) - - if command is not None and not command.hidden: - yield name, command - - -def _check_multicommand( - base_command: "MultiCommand", cmd_name: str, cmd: "Command", register: bool = False -) -> None: - if not base_command.chain or not isinstance(cmd, MultiCommand): - return - if register: - hint = ( - "It is not possible to add multi commands as children to" - " another multi command that is in chain mode." - ) - else: - hint = ( - "Found a multi command as subcommand to a multi command" - " that is in chain mode. This is not supported." - ) - raise RuntimeError( - f"{hint}. Command {base_command.name!r} is set to chain and" - f" {cmd_name!r} was added as a subcommand but it in itself is a" - f" multi command. ({cmd_name!r} is a {type(cmd).__name__}" - f" within a chained {type(base_command).__name__} named" - f" {base_command.name!r})." - ) - - -def batch(iterable: t.Iterable[V], batch_size: int) -> t.List[t.Tuple[V, ...]]: - return list(zip(*repeat(iter(iterable), batch_size))) - - -@contextmanager -def augment_usage_errors( - ctx: "Context", param: t.Optional["Parameter"] = None -) -> t.Iterator[None]: - """Context manager that attaches extra information to exceptions.""" - try: - yield - except BadParameter as e: - if e.ctx is None: - e.ctx = ctx - if param is not None and e.param is None: - e.param = param - raise - except UsageError as e: - if e.ctx is None: - e.ctx = ctx - raise - - -def iter_params_for_processing( - invocation_order: t.Sequence["Parameter"], - declaration_order: t.Sequence["Parameter"], -) -> t.List["Parameter"]: - """Given a sequence of parameters in the order as should be considered - for processing and an iterable of parameters that exist, this returns - a list in the correct order as they should be processed. - """ - - def sort_key(item: "Parameter") -> t.Tuple[bool, float]: - try: - idx: float = invocation_order.index(item) - except ValueError: - idx = float("inf") - - return not item.is_eager, idx - - return sorted(declaration_order, key=sort_key) - - -class ParameterSource(enum.Enum): - """This is an :class:`~enum.Enum` that indicates the source of a - parameter's value. - - Use :meth:`click.Context.get_parameter_source` to get the - source for a parameter by name. - - .. versionchanged:: 8.0 - Use :class:`~enum.Enum` and drop the ``validate`` method. - - .. versionchanged:: 8.0 - Added the ``PROMPT`` value. - """ - - COMMANDLINE = enum.auto() - """The value was provided by the command line args.""" - ENVIRONMENT = enum.auto() - """The value was provided with an environment variable.""" - DEFAULT = enum.auto() - """Used the default specified by the parameter.""" - DEFAULT_MAP = enum.auto() - """Used a default provided by :attr:`Context.default_map`.""" - PROMPT = enum.auto() - """Used a prompt to confirm a default or provide a value.""" - - -class Context: - """The context is a special internal object that holds state relevant - for the script execution at every single level. It's normally invisible - to commands unless they opt-in to getting access to it. - - The context is useful as it can pass internal objects around and can - control special execution features such as reading data from - environment variables. - - A context can be used as context manager in which case it will call - :meth:`close` on teardown. - - :param command: the command class for this context. - :param parent: the parent context. - :param info_name: the info name for this invocation. Generally this - is the most descriptive name for the script or - command. For the toplevel script it is usually - the name of the script, for commands below it it's - the name of the script. - :param obj: an arbitrary object of user data. - :param auto_envvar_prefix: the prefix to use for automatic environment - variables. If this is `None` then reading - from environment variables is disabled. This - does not affect manually set environment - variables which are always read. - :param default_map: a dictionary (like object) with default values - for parameters. - :param terminal_width: the width of the terminal. The default is - inherit from parent context. If no context - defines the terminal width then auto - detection will be applied. - :param max_content_width: the maximum width for content rendered by - Click (this currently only affects help - pages). This defaults to 80 characters if - not overridden. In other words: even if the - terminal is larger than that, Click will not - format things wider than 80 characters by - default. In addition to that, formatters might - add some safety mapping on the right. - :param resilient_parsing: if this flag is enabled then Click will - parse without any interactivity or callback - invocation. Default values will also be - ignored. This is useful for implementing - things such as completion support. - :param allow_extra_args: if this is set to `True` then extra arguments - at the end will not raise an error and will be - kept on the context. The default is to inherit - from the command. - :param allow_interspersed_args: if this is set to `False` then options - and arguments cannot be mixed. The - default is to inherit from the command. - :param ignore_unknown_options: instructs click to ignore options it does - not know and keeps them for later - processing. - :param help_option_names: optionally a list of strings that define how - the default help parameter is named. The - default is ``['--help']``. - :param token_normalize_func: an optional function that is used to - normalize tokens (options, choices, - etc.). This for instance can be used to - implement case insensitive behavior. - :param color: controls if the terminal supports ANSI colors or not. The - default is autodetection. This is only needed if ANSI - codes are used in texts that Click prints which is by - default not the case. This for instance would affect - help output. - :param show_default: Show defaults for all options. If not set, - defaults to the value from a parent context. Overrides an - option's ``show_default`` argument. - - .. versionchanged:: 8.0 - The ``show_default`` parameter defaults to the value from the - parent context. - - .. versionchanged:: 7.1 - Added the ``show_default`` parameter. - - .. versionchanged:: 4.0 - Added the ``color``, ``ignore_unknown_options``, and - ``max_content_width`` parameters. - - .. versionchanged:: 3.0 - Added the ``allow_extra_args`` and ``allow_interspersed_args`` - parameters. - - .. versionchanged:: 2.0 - Added the ``resilient_parsing``, ``help_option_names``, and - ``token_normalize_func`` parameters. - """ - - #: The formatter class to create with :meth:`make_formatter`. - #: - #: .. versionadded:: 8.0 - formatter_class: t.Type["HelpFormatter"] = HelpFormatter - - def __init__( - self, - command: "Command", - parent: t.Optional["Context"] = None, - info_name: t.Optional[str] = None, - obj: t.Optional[t.Any] = None, - auto_envvar_prefix: t.Optional[str] = None, - default_map: t.Optional[t.Dict[str, t.Any]] = None, - terminal_width: t.Optional[int] = None, - max_content_width: t.Optional[int] = None, - resilient_parsing: bool = False, - allow_extra_args: t.Optional[bool] = None, - allow_interspersed_args: t.Optional[bool] = None, - ignore_unknown_options: t.Optional[bool] = None, - help_option_names: t.Optional[t.List[str]] = None, - token_normalize_func: t.Optional[t.Callable[[str], str]] = None, - color: t.Optional[bool] = None, - show_default: t.Optional[bool] = None, - ) -> None: - #: the parent context or `None` if none exists. - self.parent = parent - #: the :class:`Command` for this context. - self.command = command - #: the descriptive information name - self.info_name = info_name - #: Map of parameter names to their parsed values. Parameters - #: with ``expose_value=False`` are not stored. - self.params: t.Dict[str, t.Any] = {} - #: the leftover arguments. - self.args: t.List[str] = [] - #: protected arguments. These are arguments that are prepended - #: to `args` when certain parsing scenarios are encountered but - #: must be never propagated to another arguments. This is used - #: to implement nested parsing. - self.protected_args: t.List[str] = [] - - if obj is None and parent is not None: - obj = parent.obj - - #: the user object stored. - self.obj: t.Any = obj - self._meta: t.Dict[str, t.Any] = getattr(parent, "meta", {}) - - #: A dictionary (-like object) with defaults for parameters. - if ( - default_map is None - and info_name is not None - and parent is not None - and parent.default_map is not None - ): - default_map = parent.default_map.get(info_name) - - self.default_map: t.Optional[t.Dict[str, t.Any]] = default_map - - #: This flag indicates if a subcommand is going to be executed. A - #: group callback can use this information to figure out if it's - #: being executed directly or because the execution flow passes - #: onwards to a subcommand. By default it's None, but it can be - #: the name of the subcommand to execute. - #: - #: If chaining is enabled this will be set to ``'*'`` in case - #: any commands are executed. It is however not possible to - #: figure out which ones. If you require this knowledge you - #: should use a :func:`result_callback`. - self.invoked_subcommand: t.Optional[str] = None - - if terminal_width is None and parent is not None: - terminal_width = parent.terminal_width - - #: The width of the terminal (None is autodetection). - self.terminal_width: t.Optional[int] = terminal_width - - if max_content_width is None and parent is not None: - max_content_width = parent.max_content_width - - #: The maximum width of formatted content (None implies a sensible - #: default which is 80 for most things). - self.max_content_width: t.Optional[int] = max_content_width - - if allow_extra_args is None: - allow_extra_args = command.allow_extra_args - - #: Indicates if the context allows extra args or if it should - #: fail on parsing. - #: - #: .. versionadded:: 3.0 - self.allow_extra_args = allow_extra_args - - if allow_interspersed_args is None: - allow_interspersed_args = command.allow_interspersed_args - - #: Indicates if the context allows mixing of arguments and - #: options or not. - #: - #: .. versionadded:: 3.0 - self.allow_interspersed_args: bool = allow_interspersed_args - - if ignore_unknown_options is None: - ignore_unknown_options = command.ignore_unknown_options - - #: Instructs click to ignore options that a command does not - #: understand and will store it on the context for later - #: processing. This is primarily useful for situations where you - #: want to call into external programs. Generally this pattern is - #: strongly discouraged because it's not possibly to losslessly - #: forward all arguments. - #: - #: .. versionadded:: 4.0 - self.ignore_unknown_options: bool = ignore_unknown_options - - if help_option_names is None: - if parent is not None: - help_option_names = parent.help_option_names - else: - help_option_names = ["--help"] - - #: The names for the help options. - self.help_option_names: t.List[str] = help_option_names - - if token_normalize_func is None and parent is not None: - token_normalize_func = parent.token_normalize_func - - #: An optional normalization function for tokens. This is - #: options, choices, commands etc. - self.token_normalize_func: t.Optional[ - t.Callable[[str], str] - ] = token_normalize_func - - #: Indicates if resilient parsing is enabled. In that case Click - #: will do its best to not cause any failures and default values - #: will be ignored. Useful for completion. - self.resilient_parsing: bool = resilient_parsing - - # If there is no envvar prefix yet, but the parent has one and - # the command on this level has a name, we can expand the envvar - # prefix automatically. - if auto_envvar_prefix is None: - if ( - parent is not None - and parent.auto_envvar_prefix is not None - and self.info_name is not None - ): - auto_envvar_prefix = ( - f"{parent.auto_envvar_prefix}_{self.info_name.upper()}" - ) - else: - auto_envvar_prefix = auto_envvar_prefix.upper() - - if auto_envvar_prefix is not None: - auto_envvar_prefix = auto_envvar_prefix.replace("-", "_") - - self.auto_envvar_prefix: t.Optional[str] = auto_envvar_prefix - - if color is None and parent is not None: - color = parent.color - - #: Controls if styling output is wanted or not. - self.color: t.Optional[bool] = color - - if show_default is None and parent is not None: - show_default = parent.show_default - - #: Show option default values when formatting help text. - self.show_default: t.Optional[bool] = show_default - - self._close_callbacks: t.List[t.Callable[[], t.Any]] = [] - self._depth = 0 - self._parameter_source: t.Dict[str, ParameterSource] = {} - self._exit_stack = ExitStack() - - def to_info_dict(self) -> t.Dict[str, t.Any]: - """Gather information that could be useful for a tool generating - user-facing documentation. This traverses the entire CLI - structure. - - .. code-block:: python - - with Context(cli) as ctx: - info = ctx.to_info_dict() - - .. versionadded:: 8.0 - """ - return { - "command": self.command.to_info_dict(self), - "info_name": self.info_name, - "allow_extra_args": self.allow_extra_args, - "allow_interspersed_args": self.allow_interspersed_args, - "ignore_unknown_options": self.ignore_unknown_options, - "auto_envvar_prefix": self.auto_envvar_prefix, - } - - def __enter__(self) -> "Context": - self._depth += 1 - push_context(self) - return self - - def __exit__(self, exc_type, exc_value, tb): # type: ignore - self._depth -= 1 - if self._depth == 0: - self.close() - pop_context() - - @contextmanager - def scope(self, cleanup: bool = True) -> t.Iterator["Context"]: - """This helper method can be used with the context object to promote - it to the current thread local (see :func:`get_current_context`). - The default behavior of this is to invoke the cleanup functions which - can be disabled by setting `cleanup` to `False`. The cleanup - functions are typically used for things such as closing file handles. - - If the cleanup is intended the context object can also be directly - used as a context manager. - - Example usage:: - - with ctx.scope(): - assert get_current_context() is ctx - - This is equivalent:: - - with ctx: - assert get_current_context() is ctx - - .. versionadded:: 5.0 - - :param cleanup: controls if the cleanup functions should be run or - not. The default is to run these functions. In - some situations the context only wants to be - temporarily pushed in which case this can be disabled. - Nested pushes automatically defer the cleanup. - """ - if not cleanup: - self._depth += 1 - try: - with self as rv: - yield rv - finally: - if not cleanup: - self._depth -= 1 - - @property - def meta(self) -> t.Dict[str, t.Any]: - """This is a dictionary which is shared with all the contexts - that are nested. It exists so that click utilities can store some - state here if they need to. It is however the responsibility of - that code to manage this dictionary well. - - The keys are supposed to be unique dotted strings. For instance - module paths are a good choice for it. What is stored in there is - irrelevant for the operation of click. However what is important is - that code that places data here adheres to the general semantics of - the system. - - Example usage:: - - LANG_KEY = f'{__name__}.lang' - - def set_language(value): - ctx = get_current_context() - ctx.meta[LANG_KEY] = value - - def get_language(): - return get_current_context().meta.get(LANG_KEY, 'en_US') - - .. versionadded:: 5.0 - """ - return self._meta - - def make_formatter(self) -> HelpFormatter: - """Creates the :class:`~click.HelpFormatter` for the help and - usage output. - - To quickly customize the formatter class used without overriding - this method, set the :attr:`formatter_class` attribute. - - .. versionchanged:: 8.0 - Added the :attr:`formatter_class` attribute. - """ - return self.formatter_class( - width=self.terminal_width, max_width=self.max_content_width - ) - - def with_resource(self, context_manager: t.ContextManager[V]) -> V: - """Register a resource as if it were used in a ``with`` - statement. The resource will be cleaned up when the context is - popped. - - Uses :meth:`contextlib.ExitStack.enter_context`. It calls the - resource's ``__enter__()`` method and returns the result. When - the context is popped, it closes the stack, which calls the - resource's ``__exit__()`` method. - - To register a cleanup function for something that isn't a - context manager, use :meth:`call_on_close`. Or use something - from :mod:`contextlib` to turn it into a context manager first. - - .. code-block:: python - - @click.group() - @click.option("--name") - @click.pass_context - def cli(ctx): - ctx.obj = ctx.with_resource(connect_db(name)) - - :param context_manager: The context manager to enter. - :return: Whatever ``context_manager.__enter__()`` returns. - - .. versionadded:: 8.0 - """ - return self._exit_stack.enter_context(context_manager) - - def call_on_close(self, f: t.Callable[..., t.Any]) -> t.Callable[..., t.Any]: - """Register a function to be called when the context tears down. - - This can be used to close resources opened during the script - execution. Resources that support Python's context manager - protocol which would be used in a ``with`` statement should be - registered with :meth:`with_resource` instead. - - :param f: The function to execute on teardown. - """ - return self._exit_stack.callback(f) - - def close(self) -> None: - """Invoke all close callbacks registered with - :meth:`call_on_close`, and exit all context managers entered - with :meth:`with_resource`. - """ - self._exit_stack.close() - # In case the context is reused, create a new exit stack. - self._exit_stack = ExitStack() - - @property - def command_path(self) -> str: - """The computed command path. This is used for the ``usage`` - information on the help page. It's automatically created by - combining the info names of the chain of contexts to the root. - """ - rv = "" - if self.info_name is not None: - rv = self.info_name - if self.parent is not None: - parent_command_path = [self.parent.command_path] - - if isinstance(self.parent.command, Command): - for param in self.parent.command.get_params(self): - parent_command_path.extend(param.get_usage_pieces(self)) - - rv = f"{' '.join(parent_command_path)} {rv}" - return rv.lstrip() - - def find_root(self) -> "Context": - """Finds the outermost context.""" - node = self - while node.parent is not None: - node = node.parent - return node - - def find_object(self, object_type: t.Type[V]) -> t.Optional[V]: - """Finds the closest object of a given type.""" - node: t.Optional["Context"] = self - - while node is not None: - if isinstance(node.obj, object_type): - return node.obj - - node = node.parent - - return None - - def ensure_object(self, object_type: t.Type[V]) -> V: - """Like :meth:`find_object` but sets the innermost object to a - new instance of `object_type` if it does not exist. - """ - rv = self.find_object(object_type) - if rv is None: - self.obj = rv = object_type() - return rv - - @typing.overload - def lookup_default( - self, name: str, call: "te.Literal[True]" = True - ) -> t.Optional[t.Any]: - ... - - @typing.overload - def lookup_default( - self, name: str, call: "te.Literal[False]" = ... - ) -> t.Optional[t.Union[t.Any, t.Callable[[], t.Any]]]: - ... - - def lookup_default(self, name: str, call: bool = True) -> t.Optional[t.Any]: - """Get the default for a parameter from :attr:`default_map`. - - :param name: Name of the parameter. - :param call: If the default is a callable, call it. Disable to - return the callable instead. - - .. versionchanged:: 8.0 - Added the ``call`` parameter. - """ - if self.default_map is not None: - value = self.default_map.get(name) - - if call and callable(value): - return value() - - return value - - return None - - def fail(self, message: str) -> "te.NoReturn": - """Aborts the execution of the program with a specific error - message. - - :param message: the error message to fail with. - """ - raise UsageError(message, self) - - def abort(self) -> "te.NoReturn": - """Aborts the script.""" - raise Abort() - - def exit(self, code: int = 0) -> "te.NoReturn": - """Exits the application with a given exit code.""" - raise Exit(code) - - def get_usage(self) -> str: - """Helper method to get formatted usage string for the current - context and command. - """ - return self.command.get_usage(self) - - def get_help(self) -> str: - """Helper method to get formatted help page for the current - context and command. - """ - return self.command.get_help(self) - - def _make_sub_context(self, command: "Command") -> "Context": - """Create a new context of the same type as this context, but - for a new command. - - :meta private: - """ - return type(self)(command, info_name=command.name, parent=self) - - def invoke( - __self, # noqa: B902 - __callback: t.Union["Command", t.Callable[..., t.Any]], - *args: t.Any, - **kwargs: t.Any, - ) -> t.Any: - """Invokes a command callback in exactly the way it expects. There - are two ways to invoke this method: - - 1. the first argument can be a callback and all other arguments and - keyword arguments are forwarded directly to the function. - 2. the first argument is a click command object. In that case all - arguments are forwarded as well but proper click parameters - (options and click arguments) must be keyword arguments and Click - will fill in defaults. - - Note that before Click 3.2 keyword arguments were not properly filled - in against the intention of this code and no context was created. For - more information about this change and why it was done in a bugfix - release see :ref:`upgrade-to-3.2`. - - .. versionchanged:: 8.0 - All ``kwargs`` are tracked in :attr:`params` so they will be - passed if :meth:`forward` is called at multiple levels. - """ - if isinstance(__callback, Command): - other_cmd = __callback - - if other_cmd.callback is None: - raise TypeError( - "The given command does not have a callback that can be invoked." - ) - else: - __callback = other_cmd.callback - - ctx = __self._make_sub_context(other_cmd) - - for param in other_cmd.params: - if param.name not in kwargs and param.expose_value: - kwargs[param.name] = param.get_default(ctx) # type: ignore - - # Track all kwargs as params, so that forward() will pass - # them on in subsequent calls. - ctx.params.update(kwargs) - else: - ctx = __self - - with augment_usage_errors(__self): - with ctx: - return __callback(*args, **kwargs) - - def forward( - __self, __cmd: "Command", *args: t.Any, **kwargs: t.Any # noqa: B902 - ) -> t.Any: - """Similar to :meth:`invoke` but fills in default keyword - arguments from the current context if the other command expects - it. This cannot invoke callbacks directly, only other commands. - - .. versionchanged:: 8.0 - All ``kwargs`` are tracked in :attr:`params` so they will be - passed if ``forward`` is called at multiple levels. - """ - # Can only forward to other commands, not direct callbacks. - if not isinstance(__cmd, Command): - raise TypeError("Callback is not a command.") - - for param in __self.params: - if param not in kwargs: - kwargs[param] = __self.params[param] - - return __self.invoke(__cmd, *args, **kwargs) - - def set_parameter_source(self, name: str, source: ParameterSource) -> None: - """Set the source of a parameter. This indicates the location - from which the value of the parameter was obtained. - - :param name: The name of the parameter. - :param source: A member of :class:`~click.core.ParameterSource`. - """ - self._parameter_source[name] = source - - def get_parameter_source(self, name: str) -> t.Optional[ParameterSource]: - """Get the source of a parameter. This indicates the location - from which the value of the parameter was obtained. - - This can be useful for determining when a user specified a value - on the command line that is the same as the default value. It - will be :attr:`~click.core.ParameterSource.DEFAULT` only if the - value was actually taken from the default. - - :param name: The name of the parameter. - :rtype: ParameterSource - - .. versionchanged:: 8.0 - Returns ``None`` if the parameter was not provided from any - source. - """ - return self._parameter_source.get(name) - - -class BaseCommand: - """The base command implements the minimal API contract of commands. - Most code will never use this as it does not implement a lot of useful - functionality but it can act as the direct subclass of alternative - parsing methods that do not depend on the Click parser. - - For instance, this can be used to bridge Click and other systems like - argparse or docopt. - - Because base commands do not implement a lot of the API that other - parts of Click take for granted, they are not supported for all - operations. For instance, they cannot be used with the decorators - usually and they have no built-in callback system. - - .. versionchanged:: 2.0 - Added the `context_settings` parameter. - - :param name: the name of the command to use unless a group overrides it. - :param context_settings: an optional dictionary with defaults that are - passed to the context object. - """ - - #: The context class to create with :meth:`make_context`. - #: - #: .. versionadded:: 8.0 - context_class: t.Type[Context] = Context - #: the default for the :attr:`Context.allow_extra_args` flag. - allow_extra_args = False - #: the default for the :attr:`Context.allow_interspersed_args` flag. - allow_interspersed_args = True - #: the default for the :attr:`Context.ignore_unknown_options` flag. - ignore_unknown_options = False - - def __init__( - self, - name: t.Optional[str], - context_settings: t.Optional[t.Dict[str, t.Any]] = None, - ) -> None: - #: the name the command thinks it has. Upon registering a command - #: on a :class:`Group` the group will default the command name - #: with this information. You should instead use the - #: :class:`Context`\'s :attr:`~Context.info_name` attribute. - self.name = name - - if context_settings is None: - context_settings = {} - - #: an optional dictionary with defaults passed to the context. - self.context_settings: t.Dict[str, t.Any] = context_settings - - def to_info_dict(self, ctx: Context) -> t.Dict[str, t.Any]: - """Gather information that could be useful for a tool generating - user-facing documentation. This traverses the entire structure - below this command. - - Use :meth:`click.Context.to_info_dict` to traverse the entire - CLI structure. - - :param ctx: A :class:`Context` representing this command. - - .. versionadded:: 8.0 - """ - return {"name": self.name} - - def __repr__(self) -> str: - return f"<{self.__class__.__name__} {self.name}>" - - def get_usage(self, ctx: Context) -> str: - raise NotImplementedError("Base commands cannot get usage") - - def get_help(self, ctx: Context) -> str: - raise NotImplementedError("Base commands cannot get help") - - def make_context( - self, - info_name: t.Optional[str], - args: t.List[str], - parent: t.Optional[Context] = None, - **extra: t.Any, - ) -> Context: - """This function when given an info name and arguments will kick - off the parsing and create a new :class:`Context`. It does not - invoke the actual command callback though. - - To quickly customize the context class used without overriding - this method, set the :attr:`context_class` attribute. - - :param info_name: the info name for this invocation. Generally this - is the most descriptive name for the script or - command. For the toplevel script it's usually - the name of the script, for commands below it it's - the name of the command. - :param args: the arguments to parse as list of strings. - :param parent: the parent context if available. - :param extra: extra keyword arguments forwarded to the context - constructor. - - .. versionchanged:: 8.0 - Added the :attr:`context_class` attribute. - """ - for key, value in self.context_settings.items(): - if key not in extra: - extra[key] = value - - ctx = self.context_class( - self, info_name=info_name, parent=parent, **extra # type: ignore - ) - - with ctx.scope(cleanup=False): - self.parse_args(ctx, args) - return ctx - - def parse_args(self, ctx: Context, args: t.List[str]) -> t.List[str]: - """Given a context and a list of arguments this creates the parser - and parses the arguments, then modifies the context as necessary. - This is automatically invoked by :meth:`make_context`. - """ - raise NotImplementedError("Base commands do not know how to parse arguments.") - - def invoke(self, ctx: Context) -> t.Any: - """Given a context, this invokes the command. The default - implementation is raising a not implemented error. - """ - raise NotImplementedError("Base commands are not invokable by default") - - def shell_complete(self, ctx: Context, incomplete: str) -> t.List["CompletionItem"]: - """Return a list of completions for the incomplete value. Looks - at the names of chained multi-commands. - - Any command could be part of a chained multi-command, so sibling - commands are valid at any point during command completion. Other - command classes will return more completions. - - :param ctx: Invocation context for this command. - :param incomplete: Value being completed. May be empty. - - .. versionadded:: 8.0 - """ - from click.shell_completion import CompletionItem - - results: t.List["CompletionItem"] = [] - - while ctx.parent is not None: - ctx = ctx.parent - - if isinstance(ctx.command, MultiCommand) and ctx.command.chain: - results.extend( - CompletionItem(name, help=command.get_short_help_str()) - for name, command in _complete_visible_commands(ctx, incomplete) - if name not in ctx.protected_args - ) - - return results - - @typing.overload - def main( - self, - args: t.Optional[t.Sequence[str]] = None, - prog_name: t.Optional[str] = None, - complete_var: t.Optional[str] = None, - standalone_mode: "te.Literal[True]" = True, - **extra: t.Any, - ) -> "te.NoReturn": - ... - - @typing.overload - def main( - self, - args: t.Optional[t.Sequence[str]] = None, - prog_name: t.Optional[str] = None, - complete_var: t.Optional[str] = None, - standalone_mode: bool = ..., - **extra: t.Any, - ) -> t.Any: - ... - - def main( - self, - args: t.Optional[t.Sequence[str]] = None, - prog_name: t.Optional[str] = None, - complete_var: t.Optional[str] = None, - standalone_mode: bool = True, - windows_expand_args: bool = True, - **extra: t.Any, - ) -> t.Any: - """This is the way to invoke a script with all the bells and - whistles as a command line application. This will always terminate - the application after a call. If this is not wanted, ``SystemExit`` - needs to be caught. - - This method is also available by directly calling the instance of - a :class:`Command`. - - :param args: the arguments that should be used for parsing. If not - provided, ``sys.argv[1:]`` is used. - :param prog_name: the program name that should be used. By default - the program name is constructed by taking the file - name from ``sys.argv[0]``. - :param complete_var: the environment variable that controls the - bash completion support. The default is - ``"__COMPLETE"`` with prog_name in - uppercase. - :param standalone_mode: the default behavior is to invoke the script - in standalone mode. Click will then - handle exceptions and convert them into - error messages and the function will never - return but shut down the interpreter. If - this is set to `False` they will be - propagated to the caller and the return - value of this function is the return value - of :meth:`invoke`. - :param windows_expand_args: Expand glob patterns, user dir, and - env vars in command line args on Windows. - :param extra: extra keyword arguments are forwarded to the context - constructor. See :class:`Context` for more information. - - .. versionchanged:: 8.0.1 - Added the ``windows_expand_args`` parameter to allow - disabling command line arg expansion on Windows. - - .. versionchanged:: 8.0 - When taking arguments from ``sys.argv`` on Windows, glob - patterns, user dir, and env vars are expanded. - - .. versionchanged:: 3.0 - Added the ``standalone_mode`` parameter. - """ - # Verify that the environment is configured correctly, or reject - # further execution to avoid a broken script. - _verify_python_env() - - if args is None: - args = sys.argv[1:] - - if os.name == "nt" and windows_expand_args: - args = _expand_args(args) - else: - args = list(args) - - if prog_name is None: - prog_name = _detect_program_name() - - # Process shell completion requests and exit early. - self._main_shell_completion(extra, prog_name, complete_var) - - try: - try: - with self.make_context(prog_name, args, **extra) as ctx: - rv = self.invoke(ctx) - if not standalone_mode: - return rv - # it's not safe to `ctx.exit(rv)` here! - # note that `rv` may actually contain data like "1" which - # has obvious effects - # more subtle case: `rv=[None, None]` can come out of - # chained commands which all returned `None` -- so it's not - # even always obvious that `rv` indicates success/failure - # by its truthiness/falsiness - ctx.exit() - except (EOFError, KeyboardInterrupt): - echo(file=sys.stderr) - raise Abort() - except ClickException as e: - if not standalone_mode: - raise - e.show() - sys.exit(e.exit_code) - except OSError as e: - if e.errno == errno.EPIPE: - sys.stdout = t.cast(t.TextIO, PacifyFlushWrapper(sys.stdout)) - sys.stderr = t.cast(t.TextIO, PacifyFlushWrapper(sys.stderr)) - sys.exit(1) - else: - raise - except Exit as e: - if standalone_mode: - sys.exit(e.exit_code) - else: - # in non-standalone mode, return the exit code - # note that this is only reached if `self.invoke` above raises - # an Exit explicitly -- thus bypassing the check there which - # would return its result - # the results of non-standalone execution may therefore be - # somewhat ambiguous: if there are codepaths which lead to - # `ctx.exit(1)` and to `return 1`, the caller won't be able to - # tell the difference between the two - return e.exit_code - except Abort: - if not standalone_mode: - raise - echo(_("Aborted!"), file=sys.stderr) - sys.exit(1) - - def _main_shell_completion( - self, - ctx_args: t.Dict[str, t.Any], - prog_name: str, - complete_var: t.Optional[str] = None, - ) -> None: - """Check if the shell is asking for tab completion, process - that, then exit early. Called from :meth:`main` before the - program is invoked. - - :param prog_name: Name of the executable in the shell. - :param complete_var: Name of the environment variable that holds - the completion instruction. Defaults to - ``_{PROG_NAME}_COMPLETE``. - """ - if complete_var is None: - complete_var = f"_{prog_name}_COMPLETE".replace("-", "_").upper() - - instruction = os.environ.get(complete_var) - - if not instruction: - return - - from .shell_completion import shell_complete - - rv = shell_complete(self, ctx_args, prog_name, complete_var, instruction) - _fast_exit(rv) - - def __call__(self, *args: t.Any, **kwargs: t.Any) -> t.Any: - """Alias for :meth:`main`.""" - return self.main(*args, **kwargs) - - -class Command(BaseCommand): - """Commands are the basic building block of command line interfaces in - Click. A basic command handles command line parsing and might dispatch - more parsing to commands nested below it. - - .. versionchanged:: 2.0 - Added the `context_settings` parameter. - .. versionchanged:: 8.0 - Added repr showing the command name - .. versionchanged:: 7.1 - Added the `no_args_is_help` parameter. - - :param name: the name of the command to use unless a group overrides it. - :param context_settings: an optional dictionary with defaults that are - passed to the context object. - :param callback: the callback to invoke. This is optional. - :param params: the parameters to register with this command. This can - be either :class:`Option` or :class:`Argument` objects. - :param help: the help string to use for this command. - :param epilog: like the help string but it's printed at the end of the - help page after everything else. - :param short_help: the short help to use for this command. This is - shown on the command listing of the parent command. - :param add_help_option: by default each command registers a ``--help`` - option. This can be disabled by this parameter. - :param no_args_is_help: this controls what happens if no arguments are - provided. This option is disabled by default. - If enabled this will add ``--help`` as argument - if no arguments are passed - :param hidden: hide this command from help outputs. - - :param deprecated: issues a message indicating that - the command is deprecated. - """ - - def __init__( - self, - name: t.Optional[str], - context_settings: t.Optional[t.Dict[str, t.Any]] = None, - callback: t.Optional[t.Callable[..., t.Any]] = None, - params: t.Optional[t.List["Parameter"]] = None, - help: t.Optional[str] = None, - epilog: t.Optional[str] = None, - short_help: t.Optional[str] = None, - options_metavar: t.Optional[str] = "[OPTIONS]", - add_help_option: bool = True, - no_args_is_help: bool = False, - hidden: bool = False, - deprecated: bool = False, - ) -> None: - super().__init__(name, context_settings) - #: the callback to execute when the command fires. This might be - #: `None` in which case nothing happens. - self.callback = callback - #: the list of parameters for this command in the order they - #: should show up in the help page and execute. Eager parameters - #: will automatically be handled before non eager ones. - self.params: t.List["Parameter"] = params or [] - - # if a form feed (page break) is found in the help text, truncate help - # text to the content preceding the first form feed - if help and "\f" in help: - help = help.split("\f", 1)[0] - - self.help = help - self.epilog = epilog - self.options_metavar = options_metavar - self.short_help = short_help - self.add_help_option = add_help_option - self.no_args_is_help = no_args_is_help - self.hidden = hidden - self.deprecated = deprecated - - def to_info_dict(self, ctx: Context) -> t.Dict[str, t.Any]: - info_dict = super().to_info_dict(ctx) - info_dict.update( - params=[param.to_info_dict() for param in self.get_params(ctx)], - help=self.help, - epilog=self.epilog, - short_help=self.short_help, - hidden=self.hidden, - deprecated=self.deprecated, - ) - return info_dict - - def get_usage(self, ctx: Context) -> str: - """Formats the usage line into a string and returns it. - - Calls :meth:`format_usage` internally. - """ - formatter = ctx.make_formatter() - self.format_usage(ctx, formatter) - return formatter.getvalue().rstrip("\n") - - def get_params(self, ctx: Context) -> t.List["Parameter"]: - rv = self.params - help_option = self.get_help_option(ctx) - - if help_option is not None: - rv = [*rv, help_option] - - return rv - - def format_usage(self, ctx: Context, formatter: HelpFormatter) -> None: - """Writes the usage line into the formatter. - - This is a low-level method called by :meth:`get_usage`. - """ - pieces = self.collect_usage_pieces(ctx) - formatter.write_usage(ctx.command_path, " ".join(pieces)) - - def collect_usage_pieces(self, ctx: Context) -> t.List[str]: - """Returns all the pieces that go into the usage line and returns - it as a list of strings. - """ - rv = [self.options_metavar] if self.options_metavar else [] - - for param in self.get_params(ctx): - rv.extend(param.get_usage_pieces(ctx)) - - return rv - - def get_help_option_names(self, ctx: Context) -> t.List[str]: - """Returns the names for the help option.""" - all_names = set(ctx.help_option_names) - for param in self.params: - all_names.difference_update(param.opts) - all_names.difference_update(param.secondary_opts) - return list(all_names) - - def get_help_option(self, ctx: Context) -> t.Optional["Option"]: - """Returns the help option object.""" - help_options = self.get_help_option_names(ctx) - - if not help_options or not self.add_help_option: - return None - - def show_help(ctx: Context, param: "Parameter", value: str) -> None: - if value and not ctx.resilient_parsing: - echo(ctx.get_help(), color=ctx.color) - ctx.exit() - - return Option( - help_options, - is_flag=True, - is_eager=True, - expose_value=False, - callback=show_help, - help=_("Show this message and exit."), - ) - - def make_parser(self, ctx: Context) -> OptionParser: - """Creates the underlying option parser for this command.""" - parser = OptionParser(ctx) - for param in self.get_params(ctx): - param.add_to_parser(parser, ctx) - return parser - - def get_help(self, ctx: Context) -> str: - """Formats the help into a string and returns it. - - Calls :meth:`format_help` internally. - """ - formatter = ctx.make_formatter() - self.format_help(ctx, formatter) - return formatter.getvalue().rstrip("\n") - - def get_short_help_str(self, limit: int = 45) -> str: - """Gets short help for the command or makes it by shortening the - long help string. - """ - text = self.short_help or "" - - if not text and self.help: - text = make_default_short_help(self.help, limit) - - if self.deprecated: - text = _("(Deprecated) {text}").format(text=text) - - return text.strip() - - def format_help(self, ctx: Context, formatter: HelpFormatter) -> None: - """Writes the help into the formatter if it exists. - - This is a low-level method called by :meth:`get_help`. - - This calls the following methods: - - - :meth:`format_usage` - - :meth:`format_help_text` - - :meth:`format_options` - - :meth:`format_epilog` - """ - self.format_usage(ctx, formatter) - self.format_help_text(ctx, formatter) - self.format_options(ctx, formatter) - self.format_epilog(ctx, formatter) - - def format_help_text(self, ctx: Context, formatter: HelpFormatter) -> None: - """Writes the help text to the formatter if it exists.""" - text = self.help or "" - - if self.deprecated: - text = _("(Deprecated) {text}").format(text=text) - - if text: - formatter.write_paragraph() - - with formatter.indentation(): - formatter.write_text(text) - - def format_options(self, ctx: Context, formatter: HelpFormatter) -> None: - """Writes all the options into the formatter if they exist.""" - opts = [] - for param in self.get_params(ctx): - rv = param.get_help_record(ctx) - if rv is not None: - opts.append(rv) - - if opts: - with formatter.section(_("Options")): - formatter.write_dl(opts) - - def format_epilog(self, ctx: Context, formatter: HelpFormatter) -> None: - """Writes the epilog into the formatter if it exists.""" - if self.epilog: - formatter.write_paragraph() - with formatter.indentation(): - formatter.write_text(self.epilog) - - def parse_args(self, ctx: Context, args: t.List[str]) -> t.List[str]: - if not args and self.no_args_is_help and not ctx.resilient_parsing: - echo(ctx.get_help(), color=ctx.color) - ctx.exit() - - parser = self.make_parser(ctx) - opts, args, param_order = parser.parse_args(args=args) - - for param in iter_params_for_processing(param_order, self.get_params(ctx)): - value, args = param.handle_parse_result(ctx, opts, args) - - if args and not ctx.allow_extra_args and not ctx.resilient_parsing: - ctx.fail( - ngettext( - "Got unexpected extra argument ({args})", - "Got unexpected extra arguments ({args})", - len(args), - ).format(args=" ".join(map(str, args))) - ) - - ctx.args = args - return args - - def invoke(self, ctx: Context) -> t.Any: - """Given a context, this invokes the attached callback (if it exists) - in the right way. - """ - if self.deprecated: - message = _( - "DeprecationWarning: The command {name!r} is deprecated." - ).format(name=self.name) - echo(style(message, fg="red"), err=True) - - if self.callback is not None: - return ctx.invoke(self.callback, **ctx.params) - - def shell_complete(self, ctx: Context, incomplete: str) -> t.List["CompletionItem"]: - """Return a list of completions for the incomplete value. Looks - at the names of options and chained multi-commands. - - :param ctx: Invocation context for this command. - :param incomplete: Value being completed. May be empty. - - .. versionadded:: 8.0 - """ - from click.shell_completion import CompletionItem - - results: t.List["CompletionItem"] = [] - - if incomplete and not incomplete[0].isalnum(): - for param in self.get_params(ctx): - if ( - not isinstance(param, Option) - or param.hidden - or ( - not param.multiple - and ctx.get_parameter_source(param.name) # type: ignore - is ParameterSource.COMMANDLINE - ) - ): - continue - - results.extend( - CompletionItem(name, help=param.help) - for name in [*param.opts, *param.secondary_opts] - if name.startswith(incomplete) - ) - - results.extend(super().shell_complete(ctx, incomplete)) - return results - - -class MultiCommand(Command): - """A multi command is the basic implementation of a command that - dispatches to subcommands. The most common version is the - :class:`Group`. - - :param invoke_without_command: this controls how the multi command itself - is invoked. By default it's only invoked - if a subcommand is provided. - :param no_args_is_help: this controls what happens if no arguments are - provided. This option is enabled by default if - `invoke_without_command` is disabled or disabled - if it's enabled. If enabled this will add - ``--help`` as argument if no arguments are - passed. - :param subcommand_metavar: the string that is used in the documentation - to indicate the subcommand place. - :param chain: if this is set to `True` chaining of multiple subcommands - is enabled. This restricts the form of commands in that - they cannot have optional arguments but it allows - multiple commands to be chained together. - :param result_callback: The result callback to attach to this multi - command. This can be set or changed later with the - :meth:`result_callback` decorator. - """ - - allow_extra_args = True - allow_interspersed_args = False - - def __init__( - self, - name: t.Optional[str] = None, - invoke_without_command: bool = False, - no_args_is_help: t.Optional[bool] = None, - subcommand_metavar: t.Optional[str] = None, - chain: bool = False, - result_callback: t.Optional[t.Callable[..., t.Any]] = None, - **attrs: t.Any, - ) -> None: - super().__init__(name, **attrs) - - if no_args_is_help is None: - no_args_is_help = not invoke_without_command - - self.no_args_is_help = no_args_is_help - self.invoke_without_command = invoke_without_command - - if subcommand_metavar is None: - if chain: - subcommand_metavar = "COMMAND1 [ARGS]... [COMMAND2 [ARGS]...]..." - else: - subcommand_metavar = "COMMAND [ARGS]..." - - self.subcommand_metavar = subcommand_metavar - self.chain = chain - # The result callback that is stored. This can be set or - # overridden with the :func:`result_callback` decorator. - self._result_callback = result_callback - - if self.chain: - for param in self.params: - if isinstance(param, Argument) and not param.required: - raise RuntimeError( - "Multi commands in chain mode cannot have" - " optional arguments." - ) - - def to_info_dict(self, ctx: Context) -> t.Dict[str, t.Any]: - info_dict = super().to_info_dict(ctx) - commands = {} - - for name in self.list_commands(ctx): - command = self.get_command(ctx, name) - - if command is None: - continue - - sub_ctx = ctx._make_sub_context(command) - - with sub_ctx.scope(cleanup=False): - commands[name] = command.to_info_dict(sub_ctx) - - info_dict.update(commands=commands, chain=self.chain) - return info_dict - - def collect_usage_pieces(self, ctx: Context) -> t.List[str]: - rv = super().collect_usage_pieces(ctx) - rv.append(self.subcommand_metavar) - return rv - - def format_options(self, ctx: Context, formatter: HelpFormatter) -> None: - super().format_options(ctx, formatter) - self.format_commands(ctx, formatter) - - def result_callback(self, replace: bool = False) -> t.Callable[[F], F]: - """Adds a result callback to the command. By default if a - result callback is already registered this will chain them but - this can be disabled with the `replace` parameter. The result - callback is invoked with the return value of the subcommand - (or the list of return values from all subcommands if chaining - is enabled) as well as the parameters as they would be passed - to the main callback. - - Example:: - - @click.group() - @click.option('-i', '--input', default=23) - def cli(input): - return 42 - - @cli.result_callback() - def process_result(result, input): - return result + input - - :param replace: if set to `True` an already existing result - callback will be removed. - - .. versionchanged:: 8.0 - Renamed from ``resultcallback``. - - .. versionadded:: 3.0 - """ - - def decorator(f: F) -> F: - old_callback = self._result_callback - - if old_callback is None or replace: - self._result_callback = f - return f - - def function(__value, *args, **kwargs): # type: ignore - inner = old_callback(__value, *args, **kwargs) # type: ignore - return f(inner, *args, **kwargs) - - self._result_callback = rv = update_wrapper(t.cast(F, function), f) - return rv - - return decorator - - def resultcallback(self, replace: bool = False) -> t.Callable[[F], F]: - import warnings - - warnings.warn( - "'resultcallback' has been renamed to 'result_callback'." - " The old name will be removed in Click 8.1.", - DeprecationWarning, - stacklevel=2, - ) - return self.result_callback(replace=replace) - - def format_commands(self, ctx: Context, formatter: HelpFormatter) -> None: - """Extra format methods for multi methods that adds all the commands - after the options. - """ - commands = [] - for subcommand in self.list_commands(ctx): - cmd = self.get_command(ctx, subcommand) - # What is this, the tool lied about a command. Ignore it - if cmd is None: - continue - if cmd.hidden: - continue - - commands.append((subcommand, cmd)) - - # allow for 3 times the default spacing - if len(commands): - limit = formatter.width - 6 - max(len(cmd[0]) for cmd in commands) - - rows = [] - for subcommand, cmd in commands: - help = cmd.get_short_help_str(limit) - rows.append((subcommand, help)) - - if rows: - with formatter.section(_("Commands")): - formatter.write_dl(rows) - - def parse_args(self, ctx: Context, args: t.List[str]) -> t.List[str]: - if not args and self.no_args_is_help and not ctx.resilient_parsing: - echo(ctx.get_help(), color=ctx.color) - ctx.exit() - - rest = super().parse_args(ctx, args) - - if self.chain: - ctx.protected_args = rest - ctx.args = [] - elif rest: - ctx.protected_args, ctx.args = rest[:1], rest[1:] - - return ctx.args - - def invoke(self, ctx: Context) -> t.Any: - def _process_result(value: t.Any) -> t.Any: - if self._result_callback is not None: - value = ctx.invoke(self._result_callback, value, **ctx.params) - return value - - if not ctx.protected_args: - if self.invoke_without_command: - # No subcommand was invoked, so the result callback is - # invoked with None for regular groups, or an empty list - # for chained groups. - with ctx: - super().invoke(ctx) - return _process_result([] if self.chain else None) - ctx.fail(_("Missing command.")) - - # Fetch args back out - args = [*ctx.protected_args, *ctx.args] - ctx.args = [] - ctx.protected_args = [] - - # If we're not in chain mode, we only allow the invocation of a - # single command but we also inform the current context about the - # name of the command to invoke. - if not self.chain: - # Make sure the context is entered so we do not clean up - # resources until the result processor has worked. - with ctx: - cmd_name, cmd, args = self.resolve_command(ctx, args) - assert cmd is not None - ctx.invoked_subcommand = cmd_name - super().invoke(ctx) - sub_ctx = cmd.make_context(cmd_name, args, parent=ctx) - with sub_ctx: - return _process_result(sub_ctx.command.invoke(sub_ctx)) - - # In chain mode we create the contexts step by step, but after the - # base command has been invoked. Because at that point we do not - # know the subcommands yet, the invoked subcommand attribute is - # set to ``*`` to inform the command that subcommands are executed - # but nothing else. - with ctx: - ctx.invoked_subcommand = "*" if args else None - super().invoke(ctx) - - # Otherwise we make every single context and invoke them in a - # chain. In that case the return value to the result processor - # is the list of all invoked subcommand's results. - contexts = [] - while args: - cmd_name, cmd, args = self.resolve_command(ctx, args) - assert cmd is not None - sub_ctx = cmd.make_context( - cmd_name, - args, - parent=ctx, - allow_extra_args=True, - allow_interspersed_args=False, - ) - contexts.append(sub_ctx) - args, sub_ctx.args = sub_ctx.args, [] - - rv = [] - for sub_ctx in contexts: - with sub_ctx: - rv.append(sub_ctx.command.invoke(sub_ctx)) - return _process_result(rv) - - def resolve_command( - self, ctx: Context, args: t.List[str] - ) -> t.Tuple[t.Optional[str], t.Optional[Command], t.List[str]]: - cmd_name = make_str(args[0]) - original_cmd_name = cmd_name - - # Get the command - cmd = self.get_command(ctx, cmd_name) - - # If we can't find the command but there is a normalization - # function available, we try with that one. - if cmd is None and ctx.token_normalize_func is not None: - cmd_name = ctx.token_normalize_func(cmd_name) - cmd = self.get_command(ctx, cmd_name) - - # If we don't find the command we want to show an error message - # to the user that it was not provided. However, there is - # something else we should do: if the first argument looks like - # an option we want to kick off parsing again for arguments to - # resolve things like --help which now should go to the main - # place. - if cmd is None and not ctx.resilient_parsing: - if split_opt(cmd_name)[0]: - self.parse_args(ctx, ctx.args) - ctx.fail(_("No such command {name!r}.").format(name=original_cmd_name)) - return cmd_name if cmd else None, cmd, args[1:] - - def get_command(self, ctx: Context, cmd_name: str) -> t.Optional[Command]: - """Given a context and a command name, this returns a - :class:`Command` object if it exists or returns `None`. - """ - raise NotImplementedError - - def list_commands(self, ctx: Context) -> t.List[str]: - """Returns a list of subcommand names in the order they should - appear. - """ - return [] - - def shell_complete(self, ctx: Context, incomplete: str) -> t.List["CompletionItem"]: - """Return a list of completions for the incomplete value. Looks - at the names of options, subcommands, and chained - multi-commands. - - :param ctx: Invocation context for this command. - :param incomplete: Value being completed. May be empty. - - .. versionadded:: 8.0 - """ - from click.shell_completion import CompletionItem - - results = [ - CompletionItem(name, help=command.get_short_help_str()) - for name, command in _complete_visible_commands(ctx, incomplete) - ] - results.extend(super().shell_complete(ctx, incomplete)) - return results - - -class Group(MultiCommand): - """A group allows a command to have subcommands attached. This is - the most common way to implement nesting in Click. - - :param name: The name of the group command. - :param commands: A dict mapping names to :class:`Command` objects. - Can also be a list of :class:`Command`, which will use - :attr:`Command.name` to create the dict. - :param attrs: Other command arguments described in - :class:`MultiCommand`, :class:`Command`, and - :class:`BaseCommand`. - - .. versionchanged:: 8.0 - The ``commmands`` argument can be a list of command objects. - """ - - #: If set, this is used by the group's :meth:`command` decorator - #: as the default :class:`Command` class. This is useful to make all - #: subcommands use a custom command class. - #: - #: .. versionadded:: 8.0 - command_class: t.Optional[t.Type[Command]] = None - - #: If set, this is used by the group's :meth:`group` decorator - #: as the default :class:`Group` class. This is useful to make all - #: subgroups use a custom group class. - #: - #: If set to the special value :class:`type` (literally - #: ``group_class = type``), this group's class will be used as the - #: default class. This makes a custom group class continue to make - #: custom groups. - #: - #: .. versionadded:: 8.0 - group_class: t.Optional[t.Union[t.Type["Group"], t.Type[type]]] = None - # Literal[type] isn't valid, so use Type[type] - - def __init__( - self, - name: t.Optional[str] = None, - commands: t.Optional[t.Union[t.Dict[str, Command], t.Sequence[Command]]] = None, - **attrs: t.Any, - ) -> None: - super().__init__(name, **attrs) - - if commands is None: - commands = {} - elif isinstance(commands, abc.Sequence): - commands = {c.name: c for c in commands if c.name is not None} - - #: The registered subcommands by their exported names. - self.commands: t.Dict[str, Command] = commands - - def add_command(self, cmd: Command, name: t.Optional[str] = None) -> None: - """Registers another :class:`Command` with this group. If the name - is not provided, the name of the command is used. - """ - name = name or cmd.name - if name is None: - raise TypeError("Command has no name.") - _check_multicommand(self, name, cmd, register=True) - self.commands[name] = cmd - - def command( - self, *args: t.Any, **kwargs: t.Any - ) -> t.Callable[[t.Callable[..., t.Any]], Command]: - """A shortcut decorator for declaring and attaching a command to - the group. This takes the same arguments as :func:`command` and - immediately registers the created command with this group by - calling :meth:`add_command`. - - To customize the command class used, set the - :attr:`command_class` attribute. - - .. versionchanged:: 8.0 - Added the :attr:`command_class` attribute. - """ - from .decorators import command - - if self.command_class is not None and "cls" not in kwargs: - kwargs["cls"] = self.command_class - - def decorator(f: t.Callable[..., t.Any]) -> Command: - cmd = command(*args, **kwargs)(f) - self.add_command(cmd) - return cmd - - return decorator - - def group( - self, *args: t.Any, **kwargs: t.Any - ) -> t.Callable[[t.Callable[..., t.Any]], "Group"]: - """A shortcut decorator for declaring and attaching a group to - the group. This takes the same arguments as :func:`group` and - immediately registers the created group with this group by - calling :meth:`add_command`. - - To customize the group class used, set the :attr:`group_class` - attribute. - - .. versionchanged:: 8.0 - Added the :attr:`group_class` attribute. - """ - from .decorators import group - - if self.group_class is not None and "cls" not in kwargs: - if self.group_class is type: - kwargs["cls"] = type(self) - else: - kwargs["cls"] = self.group_class - - def decorator(f: t.Callable[..., t.Any]) -> "Group": - cmd = group(*args, **kwargs)(f) - self.add_command(cmd) - return cmd - - return decorator - - def get_command(self, ctx: Context, cmd_name: str) -> t.Optional[Command]: - return self.commands.get(cmd_name) - - def list_commands(self, ctx: Context) -> t.List[str]: - return sorted(self.commands) - - -class CommandCollection(MultiCommand): - """A command collection is a multi command that merges multiple multi - commands together into one. This is a straightforward implementation - that accepts a list of different multi commands as sources and - provides all the commands for each of them. - """ - - def __init__( - self, - name: t.Optional[str] = None, - sources: t.Optional[t.List[MultiCommand]] = None, - **attrs: t.Any, - ) -> None: - super().__init__(name, **attrs) - #: The list of registered multi commands. - self.sources: t.List[MultiCommand] = sources or [] - - def add_source(self, multi_cmd: MultiCommand) -> None: - """Adds a new multi command to the chain dispatcher.""" - self.sources.append(multi_cmd) - - def get_command(self, ctx: Context, cmd_name: str) -> t.Optional[Command]: - for source in self.sources: - rv = source.get_command(ctx, cmd_name) - - if rv is not None: - if self.chain: - _check_multicommand(self, cmd_name, rv) - - return rv - - return None - - def list_commands(self, ctx: Context) -> t.List[str]: - rv: t.Set[str] = set() - - for source in self.sources: - rv.update(source.list_commands(ctx)) - - return sorted(rv) - - -def _check_iter(value: t.Any) -> t.Iterator[t.Any]: - """Check if the value is iterable but not a string. Raises a type - error, or return an iterator over the value. - """ - if isinstance(value, str): - raise TypeError - - return iter(value) - - -class Parameter: - r"""A parameter to a command comes in two versions: they are either - :class:`Option`\s or :class:`Argument`\s. Other subclasses are currently - not supported by design as some of the internals for parsing are - intentionally not finalized. - - Some settings are supported by both options and arguments. - - :param param_decls: the parameter declarations for this option or - argument. This is a list of flags or argument - names. - :param type: the type that should be used. Either a :class:`ParamType` - or a Python type. The later is converted into the former - automatically if supported. - :param required: controls if this is optional or not. - :param default: the default value if omitted. This can also be a callable, - in which case it's invoked when the default is needed - without any arguments. - :param callback: A function to further process or validate the value - after type conversion. It is called as ``f(ctx, param, value)`` - and must return the value. It is called for all sources, - including prompts. - :param nargs: the number of arguments to match. If not ``1`` the return - value is a tuple instead of single value. The default for - nargs is ``1`` (except if the type is a tuple, then it's - the arity of the tuple). If ``nargs=-1``, all remaining - parameters are collected. - :param metavar: how the value is represented in the help page. - :param expose_value: if this is `True` then the value is passed onwards - to the command callback and stored on the context, - otherwise it's skipped. - :param is_eager: eager values are processed before non eager ones. This - should not be set for arguments or it will inverse the - order of processing. - :param envvar: a string or list of strings that are environment variables - that should be checked. - :param shell_complete: A function that returns custom shell - completions. Used instead of the param's type completion if - given. Takes ``ctx, param, incomplete`` and must return a list - of :class:`~click.shell_completion.CompletionItem` or a list of - strings. - - .. versionchanged:: 8.0 - ``process_value`` validates required parameters and bounded - ``nargs``, and invokes the parameter callback before returning - the value. This allows the callback to validate prompts. - ``full_process_value`` is removed. - - .. versionchanged:: 8.0 - ``autocompletion`` is renamed to ``shell_complete`` and has new - semantics described above. The old name is deprecated and will - be removed in 8.1, until then it will be wrapped to match the - new requirements. - - .. versionchanged:: 8.0 - For ``multiple=True, nargs>1``, the default must be a list of - tuples. - - .. versionchanged:: 8.0 - Setting a default is no longer required for ``nargs>1``, it will - default to ``None``. ``multiple=True`` or ``nargs=-1`` will - default to ``()``. - - .. versionchanged:: 7.1 - Empty environment variables are ignored rather than taking the - empty string value. This makes it possible for scripts to clear - variables if they can't unset them. - - .. versionchanged:: 2.0 - Changed signature for parameter callback to also be passed the - parameter. The old callback format will still work, but it will - raise a warning to give you a chance to migrate the code easier. - """ - - param_type_name = "parameter" - - def __init__( - self, - param_decls: t.Optional[t.Sequence[str]] = None, - type: t.Optional[t.Union[types.ParamType, t.Any]] = None, - required: bool = False, - default: t.Optional[t.Union[t.Any, t.Callable[[], t.Any]]] = None, - callback: t.Optional[t.Callable[[Context, "Parameter", t.Any], t.Any]] = None, - nargs: t.Optional[int] = None, - multiple: bool = False, - metavar: t.Optional[str] = None, - expose_value: bool = True, - is_eager: bool = False, - envvar: t.Optional[t.Union[str, t.Sequence[str]]] = None, - shell_complete: t.Optional[ - t.Callable[ - [Context, "Parameter", str], - t.Union[t.List["CompletionItem"], t.List[str]], - ] - ] = None, - autocompletion: t.Optional[ - t.Callable[ - [Context, t.List[str], str], t.List[t.Union[t.Tuple[str, str], str]] - ] - ] = None, - ) -> None: - self.name, self.opts, self.secondary_opts = self._parse_decls( - param_decls or (), expose_value - ) - self.type = types.convert_type(type, default) - - # Default nargs to what the type tells us if we have that - # information available. - if nargs is None: - if self.type.is_composite: - nargs = self.type.arity - else: - nargs = 1 - - self.required = required - self.callback = callback - self.nargs = nargs - self.multiple = multiple - self.expose_value = expose_value - self.default = default - self.is_eager = is_eager - self.metavar = metavar - self.envvar = envvar - - if autocompletion is not None: - import warnings - - warnings.warn( - "'autocompletion' is renamed to 'shell_complete'. The old name is" - " deprecated and will be removed in Click 8.1. See the docs about" - " 'Parameter' for information about new behavior.", - DeprecationWarning, - stacklevel=2, - ) - - def shell_complete( - ctx: Context, param: "Parameter", incomplete: str - ) -> t.List["CompletionItem"]: - from click.shell_completion import CompletionItem - - out = [] - - for c in autocompletion(ctx, [], incomplete): # type: ignore - if isinstance(c, tuple): - c = CompletionItem(c[0], help=c[1]) - elif isinstance(c, str): - c = CompletionItem(c) - - if c.value.startswith(incomplete): - out.append(c) - - return out - - self._custom_shell_complete = shell_complete - - if __debug__: - if self.type.is_composite and nargs != self.type.arity: - raise ValueError( - f"'nargs' must be {self.type.arity} (or None) for" - f" type {self.type!r}, but it was {nargs}." - ) - - # Skip no default or callable default. - check_default = default if not callable(default) else None - - if check_default is not None: - if multiple: - try: - # Only check the first value against nargs. - check_default = next(_check_iter(check_default), None) - except TypeError: - raise ValueError( - "'default' must be a list when 'multiple' is true." - ) from None - - # Can be None for multiple with empty default. - if nargs != 1 and check_default is not None: - try: - _check_iter(check_default) - except TypeError: - if multiple: - message = ( - "'default' must be a list of lists when 'multiple' is" - " true and 'nargs' != 1." - ) - else: - message = "'default' must be a list when 'nargs' != 1." - - raise ValueError(message) from None - - if nargs > 1 and len(check_default) != nargs: - subject = "item length" if multiple else "length" - raise ValueError( - f"'default' {subject} must match nargs={nargs}." - ) - - def to_info_dict(self) -> t.Dict[str, t.Any]: - """Gather information that could be useful for a tool generating - user-facing documentation. - - Use :meth:`click.Context.to_info_dict` to traverse the entire - CLI structure. - - .. versionadded:: 8.0 - """ - return { - "name": self.name, - "param_type_name": self.param_type_name, - "opts": self.opts, - "secondary_opts": self.secondary_opts, - "type": self.type.to_info_dict(), - "required": self.required, - "nargs": self.nargs, - "multiple": self.multiple, - "default": self.default, - "envvar": self.envvar, - } - - def __repr__(self) -> str: - return f"<{self.__class__.__name__} {self.name}>" - - def _parse_decls( - self, decls: t.Sequence[str], expose_value: bool - ) -> t.Tuple[t.Optional[str], t.List[str], t.List[str]]: - raise NotImplementedError() - - @property - def human_readable_name(self) -> str: - """Returns the human readable name of this parameter. This is the - same as the name for options, but the metavar for arguments. - """ - return self.name # type: ignore - - def make_metavar(self) -> str: - if self.metavar is not None: - return self.metavar - - metavar = self.type.get_metavar(self) - - if metavar is None: - metavar = self.type.name.upper() - - if self.nargs != 1: - metavar += "..." - - return metavar - - @typing.overload - def get_default( - self, ctx: Context, call: "te.Literal[True]" = True - ) -> t.Optional[t.Any]: - ... - - @typing.overload - def get_default( - self, ctx: Context, call: bool = ... - ) -> t.Optional[t.Union[t.Any, t.Callable[[], t.Any]]]: - ... - - def get_default( - self, ctx: Context, call: bool = True - ) -> t.Optional[t.Union[t.Any, t.Callable[[], t.Any]]]: - """Get the default for the parameter. Tries - :meth:`Context.lookup_value` first, then the local default. - - :param ctx: Current context. - :param call: If the default is a callable, call it. Disable to - return the callable instead. - - .. versionchanged:: 8.0.1 - Type casting can fail in resilient parsing mode. Invalid - defaults will not prevent showing help text. - - .. versionchanged:: 8.0 - Looks at ``ctx.default_map`` first. - - .. versionchanged:: 8.0 - Added the ``call`` parameter. - """ - value = ctx.lookup_default(self.name, call=False) # type: ignore - - if value is None: - value = self.default - - if callable(value): - if not call: - # Don't type cast the callable. - return value - - value = value() - - try: - return self.type_cast_value(ctx, value) - except BadParameter: - if ctx.resilient_parsing: - return value - - raise - - def add_to_parser(self, parser: OptionParser, ctx: Context) -> None: - raise NotImplementedError() - - def consume_value( - self, ctx: Context, opts: t.Mapping[str, t.Any] - ) -> t.Tuple[t.Any, ParameterSource]: - value = opts.get(self.name) # type: ignore - source = ParameterSource.COMMANDLINE - - if value is None: - value = self.value_from_envvar(ctx) - source = ParameterSource.ENVIRONMENT - - if value is None: - value = ctx.lookup_default(self.name) # type: ignore - source = ParameterSource.DEFAULT_MAP - - if value is None: - value = self.get_default(ctx) - source = ParameterSource.DEFAULT - - return value, source - - def type_cast_value(self, ctx: Context, value: t.Any) -> t.Any: - """Convert and validate a value against the option's - :attr:`type`, :attr:`multiple`, and :attr:`nargs`. - """ - if value is None: - return () if self.multiple or self.nargs == -1 else None - - def check_iter(value: t.Any) -> t.Iterator: - try: - return _check_iter(value) - except TypeError: - # This should only happen when passing in args manually, - # the parser should construct an iterable when parsing - # the command line. - raise BadParameter( - _("Value must be an iterable."), ctx=ctx, param=self - ) from None - - if self.nargs == 1 or self.type.is_composite: - convert: t.Callable[[t.Any], t.Any] = partial( - self.type, param=self, ctx=ctx - ) - elif self.nargs == -1: - - def convert(value: t.Any) -> t.Tuple: - return tuple(self.type(x, self, ctx) for x in check_iter(value)) - - else: # nargs > 1 - - def convert(value: t.Any) -> t.Tuple: - value = tuple(check_iter(value)) - - if len(value) != self.nargs: - raise BadParameter( - ngettext( - "Takes {nargs} values but 1 was given.", - "Takes {nargs} values but {len} were given.", - len(value), - ).format(nargs=self.nargs, len=len(value)), - ctx=ctx, - param=self, - ) - - return tuple(self.type(x, self, ctx) for x in value) - - if self.multiple: - return tuple(convert(x) for x in check_iter(value)) - - return convert(value) - - def value_is_missing(self, value: t.Any) -> bool: - if value is None: - return True - - if (self.nargs != 1 or self.multiple) and value == (): - return True - - return False - - def process_value(self, ctx: Context, value: t.Any) -> t.Any: - if value is not None: - value = self.type_cast_value(ctx, value) - - if self.required and self.value_is_missing(value): - raise MissingParameter(ctx=ctx, param=self) - - if self.callback is not None: - value = self.callback(ctx, self, value) - - return value - - def resolve_envvar_value(self, ctx: Context) -> t.Optional[str]: - if self.envvar is None: - return None - - if isinstance(self.envvar, str): - rv = os.environ.get(self.envvar) - - if rv: - return rv - else: - for envvar in self.envvar: - rv = os.environ.get(envvar) - - if rv: - return rv - - return None - - def value_from_envvar(self, ctx: Context) -> t.Optional[t.Any]: - rv: t.Optional[t.Any] = self.resolve_envvar_value(ctx) - - if rv is not None and self.nargs != 1: - rv = self.type.split_envvar_value(rv) - - return rv - - def handle_parse_result( - self, ctx: Context, opts: t.Mapping[str, t.Any], args: t.List[str] - ) -> t.Tuple[t.Any, t.List[str]]: - with augment_usage_errors(ctx, param=self): - value, source = self.consume_value(ctx, opts) - ctx.set_parameter_source(self.name, source) # type: ignore - - try: - value = self.process_value(ctx, value) - except Exception: - if not ctx.resilient_parsing: - raise - - value = None - - if self.expose_value: - ctx.params[self.name] = value # type: ignore - - return value, args - - def get_help_record(self, ctx: Context) -> t.Optional[t.Tuple[str, str]]: - pass - - def get_usage_pieces(self, ctx: Context) -> t.List[str]: - return [] - - def get_error_hint(self, ctx: Context) -> str: - """Get a stringified version of the param for use in error messages to - indicate which param caused the error. - """ - hint_list = self.opts or [self.human_readable_name] - return " / ".join(f"'{x}'" for x in hint_list) - - def shell_complete(self, ctx: Context, incomplete: str) -> t.List["CompletionItem"]: - """Return a list of completions for the incomplete value. If a - ``shell_complete`` function was given during init, it is used. - Otherwise, the :attr:`type` - :meth:`~click.types.ParamType.shell_complete` function is used. - - :param ctx: Invocation context for this command. - :param incomplete: Value being completed. May be empty. - - .. versionadded:: 8.0 - """ - if self._custom_shell_complete is not None: - results = self._custom_shell_complete(ctx, self, incomplete) - - if results and isinstance(results[0], str): - from click.shell_completion import CompletionItem - - results = [CompletionItem(c) for c in results] - - return t.cast(t.List["CompletionItem"], results) - - return self.type.shell_complete(ctx, self, incomplete) - - -class Option(Parameter): - """Options are usually optional values on the command line and - have some extra features that arguments don't have. - - All other parameters are passed onwards to the parameter constructor. - - :param show_default: controls if the default value should be shown on the - help page. Normally, defaults are not shown. If this - value is a string, it shows the string instead of the - value. This is particularly useful for dynamic options. - :param show_envvar: controls if an environment variable should be shown on - the help page. Normally, environment variables - are not shown. - :param prompt: if set to `True` or a non empty string then the user will be - prompted for input. If set to `True` the prompt will be the - option name capitalized. - :param confirmation_prompt: Prompt a second time to confirm the - value if it was prompted for. Can be set to a string instead of - ``True`` to customize the message. - :param prompt_required: If set to ``False``, the user will be - prompted for input only when the option was specified as a flag - without a value. - :param hide_input: if this is `True` then the input on the prompt will be - hidden from the user. This is useful for password - input. - :param is_flag: forces this option to act as a flag. The default is - auto detection. - :param flag_value: which value should be used for this flag if it's - enabled. This is set to a boolean automatically if - the option string contains a slash to mark two options. - :param multiple: if this is set to `True` then the argument is accepted - multiple times and recorded. This is similar to ``nargs`` - in how it works but supports arbitrary number of - arguments. - :param count: this flag makes an option increment an integer. - :param allow_from_autoenv: if this is enabled then the value of this - parameter will be pulled from an environment - variable in case a prefix is defined on the - context. - :param help: the help string. - :param hidden: hide this option from help outputs. - - .. versionchanged:: 8.0.1 - ``type`` is detected from ``flag_value`` if given. - """ - - param_type_name = "option" - - def __init__( - self, - param_decls: t.Optional[t.Sequence[str]] = None, - show_default: bool = False, - prompt: t.Union[bool, str] = False, - confirmation_prompt: t.Union[bool, str] = False, - prompt_required: bool = True, - hide_input: bool = False, - is_flag: t.Optional[bool] = None, - flag_value: t.Optional[t.Any] = None, - multiple: bool = False, - count: bool = False, - allow_from_autoenv: bool = True, - type: t.Optional[t.Union[types.ParamType, t.Any]] = None, - help: t.Optional[str] = None, - hidden: bool = False, - show_choices: bool = True, - show_envvar: bool = False, - **attrs: t.Any, - ) -> None: - default_is_missing = "default" not in attrs - super().__init__(param_decls, type=type, multiple=multiple, **attrs) - - if prompt is True: - if self.name is None: - raise TypeError("'name' is required with 'prompt=True'.") - - prompt_text: t.Optional[str] = self.name.replace("_", " ").capitalize() - elif prompt is False: - prompt_text = None - else: - prompt_text = t.cast(str, prompt) - - self.prompt = prompt_text - self.confirmation_prompt = confirmation_prompt - self.prompt_required = prompt_required - self.hide_input = hide_input - self.hidden = hidden - - # If prompt is enabled but not required, then the option can be - # used as a flag to indicate using prompt or flag_value. - self._flag_needs_value = self.prompt is not None and not self.prompt_required - - if is_flag is None: - if flag_value is not None: - # Implicitly a flag because flag_value was set. - is_flag = True - elif self._flag_needs_value: - # Not a flag, but when used as a flag it shows a prompt. - is_flag = False - else: - # Implicitly a flag because flag options were given. - is_flag = bool(self.secondary_opts) - elif is_flag is False and not self._flag_needs_value: - # Not a flag, and prompt is not enabled, can be used as a - # flag if flag_value is set. - self._flag_needs_value = flag_value is not None - - if is_flag and default_is_missing: - self.default: t.Union[t.Any, t.Callable[[], t.Any]] = False - - if flag_value is None: - flag_value = not self.default - - if is_flag and type is None: - # Re-guess the type from the flag value instead of the - # default. - self.type = types.convert_type(None, flag_value) - - self.is_flag: bool = is_flag - self.is_bool_flag = isinstance(self.type, types.BoolParamType) - self.flag_value: t.Any = flag_value - - # Counting - self.count = count - if count: - if type is None: - self.type = types.IntRange(min=0) - if default_is_missing: - self.default = 0 - - self.allow_from_autoenv = allow_from_autoenv - self.help = help - self.show_default = show_default - self.show_choices = show_choices - self.show_envvar = show_envvar - - if __debug__: - if self.nargs == -1: - raise TypeError("nargs=-1 is not supported for options.") - - if self.prompt and self.is_flag and not self.is_bool_flag: - raise TypeError("'prompt' is not valid for non-boolean flag.") - - if not self.is_bool_flag and self.secondary_opts: - raise TypeError("Secondary flag is not valid for non-boolean flag.") - - if self.is_bool_flag and self.hide_input and self.prompt is not None: - raise TypeError( - "'prompt' with 'hide_input' is not valid for boolean flag." - ) - - if self.count: - if self.multiple: - raise TypeError("'count' is not valid with 'multiple'.") - - if self.is_flag: - raise TypeError("'count' is not valid with 'is_flag'.") - - def to_info_dict(self) -> t.Dict[str, t.Any]: - info_dict = super().to_info_dict() - info_dict.update( - help=self.help, - prompt=self.prompt, - is_flag=self.is_flag, - flag_value=self.flag_value, - count=self.count, - hidden=self.hidden, - ) - return info_dict - - def _parse_decls( - self, decls: t.Sequence[str], expose_value: bool - ) -> t.Tuple[t.Optional[str], t.List[str], t.List[str]]: - opts = [] - secondary_opts = [] - name = None - possible_names = [] - - for decl in decls: - if decl.isidentifier(): - if name is not None: - raise TypeError("Name defined twice") - name = decl - else: - split_char = ";" if decl[:1] == "/" else "/" - if split_char in decl: - first, second = decl.split(split_char, 1) - first = first.rstrip() - if first: - possible_names.append(split_opt(first)) - opts.append(first) - second = second.lstrip() - if second: - secondary_opts.append(second.lstrip()) - if first == second: - raise ValueError( - f"Boolean option {decl!r} cannot use the" - " same flag for true/false." - ) - else: - possible_names.append(split_opt(decl)) - opts.append(decl) - - if name is None and possible_names: - possible_names.sort(key=lambda x: -len(x[0])) # group long options first - name = possible_names[0][1].replace("-", "_").lower() - if not name.isidentifier(): - name = None - - if name is None: - if not expose_value: - return None, opts, secondary_opts - raise TypeError("Could not determine name for option") - - if not opts and not secondary_opts: - raise TypeError( - f"No options defined but a name was passed ({name})." - " Did you mean to declare an argument instead? Did" - f" you mean to pass '--{name}'?" - ) - - return name, opts, secondary_opts - - def add_to_parser(self, parser: OptionParser, ctx: Context) -> None: - if self.multiple: - action = "append" - elif self.count: - action = "count" - else: - action = "store" - - if self.is_flag: - action = f"{action}_const" - - if self.is_bool_flag and self.secondary_opts: - parser.add_option( - obj=self, opts=self.opts, dest=self.name, action=action, const=True - ) - parser.add_option( - obj=self, - opts=self.secondary_opts, - dest=self.name, - action=action, - const=False, - ) - else: - parser.add_option( - obj=self, - opts=self.opts, - dest=self.name, - action=action, - const=self.flag_value, - ) - else: - parser.add_option( - obj=self, - opts=self.opts, - dest=self.name, - action=action, - nargs=self.nargs, - ) - - def get_help_record(self, ctx: Context) -> t.Optional[t.Tuple[str, str]]: - if self.hidden: - return None - - any_prefix_is_slash = False - - def _write_opts(opts: t.Sequence[str]) -> str: - nonlocal any_prefix_is_slash - - rv, any_slashes = join_options(opts) - - if any_slashes: - any_prefix_is_slash = True - - if not self.is_flag and not self.count: - rv += f" {self.make_metavar()}" - - return rv - - rv = [_write_opts(self.opts)] - - if self.secondary_opts: - rv.append(_write_opts(self.secondary_opts)) - - help = self.help or "" - extra = [] - - if self.show_envvar: - envvar = self.envvar - - if envvar is None: - if ( - self.allow_from_autoenv - and ctx.auto_envvar_prefix is not None - and self.name is not None - ): - envvar = f"{ctx.auto_envvar_prefix}_{self.name.upper()}" - - if envvar is not None: - var_str = ( - envvar - if isinstance(envvar, str) - else ", ".join(str(d) for d in envvar) - ) - extra.append(_("env var: {var}").format(var=var_str)) - - # Temporarily enable resilient parsing to avoid type casting - # failing for the default. Might be possible to extend this to - # help formatting in general. - resilient = ctx.resilient_parsing - ctx.resilient_parsing = True - - try: - default_value = self.get_default(ctx, call=False) - finally: - ctx.resilient_parsing = resilient - - show_default_is_str = isinstance(self.show_default, str) - - if show_default_is_str or ( - default_value is not None and (self.show_default or ctx.show_default) - ): - if show_default_is_str: - default_string = f"({self.show_default})" - elif isinstance(default_value, (list, tuple)): - default_string = ", ".join(str(d) for d in default_value) - elif callable(default_value): - default_string = _("(dynamic)") - elif self.is_bool_flag and self.secondary_opts: - # For boolean flags that have distinct True/False opts, - # use the opt without prefix instead of the value. - default_string = split_opt( - (self.opts if self.default else self.secondary_opts)[0] - )[1] - else: - default_string = str(default_value) - - extra.append(_("default: {default}").format(default=default_string)) - - if isinstance(self.type, types._NumberRangeBase): - range_str = self.type._describe_range() - - if range_str: - extra.append(range_str) - - if self.required: - extra.append(_("required")) - - if extra: - extra_str = ";".join(extra) - help = f"{help} [{extra_str}]" if help else f"[{extra_str}]" - - return ("; " if any_prefix_is_slash else " / ").join(rv), help - - @typing.overload - def get_default( - self, ctx: Context, call: "te.Literal[True]" = True - ) -> t.Optional[t.Any]: - ... - - @typing.overload - def get_default( - self, ctx: Context, call: bool = ... - ) -> t.Optional[t.Union[t.Any, t.Callable[[], t.Any]]]: - ... - - def get_default( - self, ctx: Context, call: bool = True - ) -> t.Optional[t.Union[t.Any, t.Callable[[], t.Any]]]: - # If we're a non boolean flag our default is more complex because - # we need to look at all flags in the same group to figure out - # if we're the the default one in which case we return the flag - # value as default. - if self.is_flag and not self.is_bool_flag: - for param in ctx.command.params: - if param.name == self.name and param.default: - return param.flag_value # type: ignore - - return None - - return super().get_default(ctx, call=call) - - def prompt_for_value(self, ctx: Context) -> t.Any: - """This is an alternative flow that can be activated in the full - value processing if a value does not exist. It will prompt the - user until a valid value exists and then returns the processed - value as result. - """ - assert self.prompt is not None - - # Calculate the default before prompting anything to be stable. - default = self.get_default(ctx) - - # If this is a prompt for a flag we need to handle this - # differently. - if self.is_bool_flag: - return confirm(self.prompt, default) - - return prompt( - self.prompt, - default=default, - type=self.type, - hide_input=self.hide_input, - show_choices=self.show_choices, - confirmation_prompt=self.confirmation_prompt, - value_proc=lambda x: self.process_value(ctx, x), - ) - - def resolve_envvar_value(self, ctx: Context) -> t.Optional[str]: - rv = super().resolve_envvar_value(ctx) - - if rv is not None: - return rv - - if ( - self.allow_from_autoenv - and ctx.auto_envvar_prefix is not None - and self.name is not None - ): - envvar = f"{ctx.auto_envvar_prefix}_{self.name.upper()}" - rv = os.environ.get(envvar) - - return rv - - def value_from_envvar(self, ctx: Context) -> t.Optional[t.Any]: - rv: t.Optional[t.Any] = self.resolve_envvar_value(ctx) - - if rv is None: - return None - - value_depth = (self.nargs != 1) + bool(self.multiple) - - if value_depth > 0: - rv = self.type.split_envvar_value(rv) - - if self.multiple and self.nargs != 1: - rv = batch(rv, self.nargs) - - return rv - - def consume_value( - self, ctx: Context, opts: t.Mapping[str, "Parameter"] - ) -> t.Tuple[t.Any, ParameterSource]: - value, source = super().consume_value(ctx, opts) - - # The parser will emit a sentinel value if the option can be - # given as a flag without a value. This is different from None - # to distinguish from the flag not being given at all. - if value is _flag_needs_value: - if self.prompt is not None and not ctx.resilient_parsing: - value = self.prompt_for_value(ctx) - source = ParameterSource.PROMPT - else: - value = self.flag_value - source = ParameterSource.COMMANDLINE - - # The value wasn't set, or used the param's default, prompt if - # prompting is enabled. - elif ( - source in {None, ParameterSource.DEFAULT} - and self.prompt is not None - and (self.required or self.prompt_required) - and not ctx.resilient_parsing - ): - value = self.prompt_for_value(ctx) - source = ParameterSource.PROMPT - - return value, source - - -class Argument(Parameter): - """Arguments are positional parameters to a command. They generally - provide fewer features than options but can have infinite ``nargs`` - and are required by default. - - All parameters are passed onwards to the parameter constructor. - """ - - param_type_name = "argument" - - def __init__( - self, - param_decls: t.Sequence[str], - required: t.Optional[bool] = None, - **attrs: t.Any, - ) -> None: - if required is None: - if attrs.get("default") is not None: - required = False - else: - required = attrs.get("nargs", 1) > 0 - - if "multiple" in attrs: - raise TypeError("__init__() got an unexpected keyword argument 'multiple'.") - - super().__init__(param_decls, required=required, **attrs) - - if __debug__: - if self.default is not None and self.nargs == -1: - raise TypeError("'default' is not supported for nargs=-1.") - - @property - def human_readable_name(self) -> str: - if self.metavar is not None: - return self.metavar - return self.name.upper() # type: ignore - - def make_metavar(self) -> str: - if self.metavar is not None: - return self.metavar - var = self.type.get_metavar(self) - if not var: - var = self.name.upper() # type: ignore - if not self.required: - var = f"[{var}]" - if self.nargs != 1: - var += "..." - return var - - def _parse_decls( - self, decls: t.Sequence[str], expose_value: bool - ) -> t.Tuple[t.Optional[str], t.List[str], t.List[str]]: - if not decls: - if not expose_value: - return None, [], [] - raise TypeError("Could not determine name for argument") - if len(decls) == 1: - name = arg = decls[0] - name = name.replace("-", "_").lower() - else: - raise TypeError( - "Arguments take exactly one parameter declaration, got" - f" {len(decls)}." - ) - return name, [arg], [] - - def get_usage_pieces(self, ctx: Context) -> t.List[str]: - return [self.make_metavar()] - - def get_error_hint(self, ctx: Context) -> str: - return f"'{self.make_metavar()}'" - - def add_to_parser(self, parser: OptionParser, ctx: Context) -> None: - parser.add_argument(dest=self.name, nargs=self.nargs, obj=self) diff --git a/venv/lib/python3.8/site-packages/click/decorators.py b/venv/lib/python3.8/site-packages/click/decorators.py deleted file mode 100644 index 5940e69..0000000 --- a/venv/lib/python3.8/site-packages/click/decorators.py +++ /dev/null @@ -1,437 +0,0 @@ -import inspect -import types -import typing as t -from functools import update_wrapper -from gettext import gettext as _ - -from .core import Argument -from .core import Command -from .core import Context -from .core import Group -from .core import Option -from .core import Parameter -from .globals import get_current_context -from .utils import echo - -F = t.TypeVar("F", bound=t.Callable[..., t.Any]) -FC = t.TypeVar("FC", t.Callable[..., t.Any], Command) - - -def pass_context(f: F) -> F: - """Marks a callback as wanting to receive the current context - object as first argument. - """ - - def new_func(*args, **kwargs): # type: ignore - return f(get_current_context(), *args, **kwargs) - - return update_wrapper(t.cast(F, new_func), f) - - -def pass_obj(f: F) -> F: - """Similar to :func:`pass_context`, but only pass the object on the - context onwards (:attr:`Context.obj`). This is useful if that object - represents the state of a nested system. - """ - - def new_func(*args, **kwargs): # type: ignore - return f(get_current_context().obj, *args, **kwargs) - - return update_wrapper(t.cast(F, new_func), f) - - -def make_pass_decorator( - object_type: t.Type, ensure: bool = False -) -> "t.Callable[[F], F]": - """Given an object type this creates a decorator that will work - similar to :func:`pass_obj` but instead of passing the object of the - current context, it will find the innermost context of type - :func:`object_type`. - - This generates a decorator that works roughly like this:: - - from functools import update_wrapper - - def decorator(f): - @pass_context - def new_func(ctx, *args, **kwargs): - obj = ctx.find_object(object_type) - return ctx.invoke(f, obj, *args, **kwargs) - return update_wrapper(new_func, f) - return decorator - - :param object_type: the type of the object to pass. - :param ensure: if set to `True`, a new object will be created and - remembered on the context if it's not there yet. - """ - - def decorator(f: F) -> F: - def new_func(*args, **kwargs): # type: ignore - ctx = get_current_context() - - if ensure: - obj = ctx.ensure_object(object_type) - else: - obj = ctx.find_object(object_type) - - if obj is None: - raise RuntimeError( - "Managed to invoke callback without a context" - f" object of type {object_type.__name__!r}" - " existing." - ) - - return ctx.invoke(f, obj, *args, **kwargs) - - return update_wrapper(t.cast(F, new_func), f) - - return decorator - - -def pass_meta_key( - key: str, *, doc_description: t.Optional[str] = None -) -> "t.Callable[[F], F]": - """Create a decorator that passes a key from - :attr:`click.Context.meta` as the first argument to the decorated - function. - - :param key: Key in ``Context.meta`` to pass. - :param doc_description: Description of the object being passed, - inserted into the decorator's docstring. Defaults to "the 'key' - key from Context.meta". - - .. versionadded:: 8.0 - """ - - def decorator(f: F) -> F: - def new_func(*args, **kwargs): # type: ignore - ctx = get_current_context() - obj = ctx.meta[key] - return ctx.invoke(f, obj, *args, **kwargs) - - return update_wrapper(t.cast(F, new_func), f) - - if doc_description is None: - doc_description = f"the {key!r} key from :attr:`click.Context.meta`" - - decorator.__doc__ = ( - f"Decorator that passes {doc_description} as the first argument" - " to the decorated function." - ) - return decorator - - -def _make_command( - f: F, - name: t.Optional[str], - attrs: t.MutableMapping[str, t.Any], - cls: t.Type[Command], -) -> Command: - if isinstance(f, Command): - raise TypeError("Attempted to convert a callback into a command twice.") - - try: - params = f.__click_params__ # type: ignore - params.reverse() - del f.__click_params__ # type: ignore - except AttributeError: - params = [] - - help = attrs.get("help") - - if help is None: - help = inspect.getdoc(f) - else: - help = inspect.cleandoc(help) - - attrs["help"] = help - return cls( - name=name or f.__name__.lower().replace("_", "-"), - callback=f, - params=params, - **attrs, - ) - - -def command( - name: t.Optional[str] = None, - cls: t.Optional[t.Type[Command]] = None, - **attrs: t.Any, -) -> t.Callable[[F], Command]: - r"""Creates a new :class:`Command` and uses the decorated function as - callback. This will also automatically attach all decorated - :func:`option`\s and :func:`argument`\s as parameters to the command. - - The name of the command defaults to the name of the function with - underscores replaced by dashes. If you want to change that, you can - pass the intended name as the first argument. - - All keyword arguments are forwarded to the underlying command class. - - Once decorated the function turns into a :class:`Command` instance - that can be invoked as a command line utility or be attached to a - command :class:`Group`. - - :param name: the name of the command. This defaults to the function - name with underscores replaced by dashes. - :param cls: the command class to instantiate. This defaults to - :class:`Command`. - """ - if cls is None: - cls = Command - - def decorator(f: t.Callable[..., t.Any]) -> Command: - cmd = _make_command(f, name, attrs, cls) # type: ignore - cmd.__doc__ = f.__doc__ - return cmd - - return decorator - - -def group(name: t.Optional[str] = None, **attrs: t.Any) -> t.Callable[[F], Group]: - """Creates a new :class:`Group` with a function as callback. This - works otherwise the same as :func:`command` just that the `cls` - parameter is set to :class:`Group`. - """ - attrs.setdefault("cls", Group) - return t.cast(Group, command(name, **attrs)) - - -def _param_memo(f: FC, param: Parameter) -> None: - if isinstance(f, Command): - f.params.append(param) - else: - if not hasattr(f, "__click_params__"): - f.__click_params__ = [] # type: ignore - - f.__click_params__.append(param) # type: ignore - - -def argument(*param_decls: str, **attrs: t.Any) -> t.Callable[[FC], FC]: - """Attaches an argument to the command. All positional arguments are - passed as parameter declarations to :class:`Argument`; all keyword - arguments are forwarded unchanged (except ``cls``). - This is equivalent to creating an :class:`Argument` instance manually - and attaching it to the :attr:`Command.params` list. - - :param cls: the argument class to instantiate. This defaults to - :class:`Argument`. - """ - - def decorator(f: FC) -> FC: - ArgumentClass = attrs.pop("cls", Argument) - _param_memo(f, ArgumentClass(param_decls, **attrs)) - return f - - return decorator - - -def option(*param_decls: str, **attrs: t.Any) -> t.Callable[[FC], FC]: - """Attaches an option to the command. All positional arguments are - passed as parameter declarations to :class:`Option`; all keyword - arguments are forwarded unchanged (except ``cls``). - This is equivalent to creating an :class:`Option` instance manually - and attaching it to the :attr:`Command.params` list. - - :param cls: the option class to instantiate. This defaults to - :class:`Option`. - """ - - def decorator(f: FC) -> FC: - # Issue 926, copy attrs, so pre-defined options can re-use the same cls= - option_attrs = attrs.copy() - - if "help" in option_attrs: - option_attrs["help"] = inspect.cleandoc(option_attrs["help"]) - OptionClass = option_attrs.pop("cls", Option) - _param_memo(f, OptionClass(param_decls, **option_attrs)) - return f - - return decorator - - -def confirmation_option(*param_decls: str, **kwargs: t.Any) -> t.Callable[[FC], FC]: - """Add a ``--yes`` option which shows a prompt before continuing if - not passed. If the prompt is declined, the program will exit. - - :param param_decls: One or more option names. Defaults to the single - value ``"--yes"``. - :param kwargs: Extra arguments are passed to :func:`option`. - """ - - def callback(ctx: Context, param: Parameter, value: bool) -> None: - if not value: - ctx.abort() - - if not param_decls: - param_decls = ("--yes",) - - kwargs.setdefault("is_flag", True) - kwargs.setdefault("callback", callback) - kwargs.setdefault("expose_value", False) - kwargs.setdefault("prompt", "Do you want to continue?") - kwargs.setdefault("help", "Confirm the action without prompting.") - return option(*param_decls, **kwargs) - - -def password_option(*param_decls: str, **kwargs: t.Any) -> t.Callable[[FC], FC]: - """Add a ``--password`` option which prompts for a password, hiding - input and asking to enter the value again for confirmation. - - :param param_decls: One or more option names. Defaults to the single - value ``"--password"``. - :param kwargs: Extra arguments are passed to :func:`option`. - """ - if not param_decls: - param_decls = ("--password",) - - kwargs.setdefault("prompt", True) - kwargs.setdefault("confirmation_prompt", True) - kwargs.setdefault("hide_input", True) - return option(*param_decls, **kwargs) - - -def version_option( - version: t.Optional[str] = None, - *param_decls: str, - package_name: t.Optional[str] = None, - prog_name: t.Optional[str] = None, - message: t.Optional[str] = None, - **kwargs: t.Any, -) -> t.Callable[[FC], FC]: - """Add a ``--version`` option which immediately prints the version - number and exits the program. - - If ``version`` is not provided, Click will try to detect it using - :func:`importlib.metadata.version` to get the version for the - ``package_name``. On Python < 3.8, the ``importlib_metadata`` - backport must be installed. - - If ``package_name`` is not provided, Click will try to detect it by - inspecting the stack frames. This will be used to detect the - version, so it must match the name of the installed package. - - :param version: The version number to show. If not provided, Click - will try to detect it. - :param param_decls: One or more option names. Defaults to the single - value ``"--version"``. - :param package_name: The package name to detect the version from. If - not provided, Click will try to detect it. - :param prog_name: The name of the CLI to show in the message. If not - provided, it will be detected from the command. - :param message: The message to show. The values ``%(prog)s``, - ``%(package)s``, and ``%(version)s`` are available. Defaults to - ``"%(prog)s, version %(version)s"``. - :param kwargs: Extra arguments are passed to :func:`option`. - :raise RuntimeError: ``version`` could not be detected. - - .. versionchanged:: 8.0 - Add the ``package_name`` parameter, and the ``%(package)s`` - value for messages. - - .. versionchanged:: 8.0 - Use :mod:`importlib.metadata` instead of ``pkg_resources``. The - version is detected based on the package name, not the entry - point name. The Python package name must match the installed - package name, or be passed with ``package_name=``. - """ - if message is None: - message = _("%(prog)s, version %(version)s") - - if version is None and package_name is None: - frame = inspect.currentframe() - assert frame is not None - assert frame.f_back is not None - f_globals = frame.f_back.f_globals if frame is not None else None - # break reference cycle - # https://docs.python.org/3/library/inspect.html#the-interpreter-stack - del frame - - if f_globals is not None: - package_name = f_globals.get("__name__") - - if package_name == "__main__": - package_name = f_globals.get("__package__") - - if package_name: - package_name = package_name.partition(".")[0] - - def callback(ctx: Context, param: Parameter, value: bool) -> None: - if not value or ctx.resilient_parsing: - return - - nonlocal prog_name - nonlocal version - - if prog_name is None: - prog_name = ctx.find_root().info_name - - if version is None and package_name is not None: - metadata: t.Optional[types.ModuleType] - - try: - from importlib import metadata # type: ignore - except ImportError: - # Python < 3.8 - import importlib_metadata as metadata # type: ignore - - try: - version = metadata.version(package_name) # type: ignore - except metadata.PackageNotFoundError: # type: ignore - raise RuntimeError( - f"{package_name!r} is not installed. Try passing" - " 'package_name' instead." - ) - - if version is None: - raise RuntimeError( - f"Could not determine the version for {package_name!r} automatically." - ) - - echo( - t.cast(str, message) - % {"prog": prog_name, "package": package_name, "version": version}, - color=ctx.color, - ) - ctx.exit() - - if not param_decls: - param_decls = ("--version",) - - kwargs.setdefault("is_flag", True) - kwargs.setdefault("expose_value", False) - kwargs.setdefault("is_eager", True) - kwargs.setdefault("help", _("Show the version and exit.")) - kwargs["callback"] = callback - return option(*param_decls, **kwargs) - - -def help_option(*param_decls: str, **kwargs: t.Any) -> t.Callable[[FC], FC]: - """Add a ``--help`` option which immediately prints the help page - and exits the program. - - This is usually unnecessary, as the ``--help`` option is added to - each command automatically unless ``add_help_option=False`` is - passed. - - :param param_decls: One or more option names. Defaults to the single - value ``"--help"``. - :param kwargs: Extra arguments are passed to :func:`option`. - """ - - def callback(ctx: Context, param: Parameter, value: bool) -> None: - if not value or ctx.resilient_parsing: - return - - echo(ctx.get_help(), color=ctx.color) - ctx.exit() - - if not param_decls: - param_decls = ("--help",) - - kwargs.setdefault("is_flag", True) - kwargs.setdefault("expose_value", False) - kwargs.setdefault("is_eager", True) - kwargs.setdefault("help", _("Show this message and exit.")) - kwargs["callback"] = callback - return option(*param_decls, **kwargs) diff --git a/venv/lib/python3.8/site-packages/click/exceptions.py b/venv/lib/python3.8/site-packages/click/exceptions.py deleted file mode 100644 index 9e20b3e..0000000 --- a/venv/lib/python3.8/site-packages/click/exceptions.py +++ /dev/null @@ -1,287 +0,0 @@ -import os -import typing as t -from gettext import gettext as _ -from gettext import ngettext - -from ._compat import get_text_stderr -from .utils import echo - -if t.TYPE_CHECKING: - from .core import Context - from .core import Parameter - - -def _join_param_hints( - param_hint: t.Optional[t.Union[t.Sequence[str], str]] -) -> t.Optional[str]: - if param_hint is not None and not isinstance(param_hint, str): - return " / ".join(repr(x) for x in param_hint) - - return param_hint - - -class ClickException(Exception): - """An exception that Click can handle and show to the user.""" - - #: The exit code for this exception. - exit_code = 1 - - def __init__(self, message: str) -> None: - super().__init__(message) - self.message = message - - def format_message(self) -> str: - return self.message - - def __str__(self) -> str: - return self.message - - def show(self, file: t.Optional[t.IO] = None) -> None: - if file is None: - file = get_text_stderr() - - echo(_("Error: {message}").format(message=self.format_message()), file=file) - - -class UsageError(ClickException): - """An internal exception that signals a usage error. This typically - aborts any further handling. - - :param message: the error message to display. - :param ctx: optionally the context that caused this error. Click will - fill in the context automatically in some situations. - """ - - exit_code = 2 - - def __init__(self, message: str, ctx: t.Optional["Context"] = None) -> None: - super().__init__(message) - self.ctx = ctx - self.cmd = self.ctx.command if self.ctx else None - - def show(self, file: t.Optional[t.IO] = None) -> None: - if file is None: - file = get_text_stderr() - color = None - hint = "" - if ( - self.ctx is not None - and self.ctx.command.get_help_option(self.ctx) is not None - ): - hint = _("Try '{command} {option}' for help.").format( - command=self.ctx.command_path, option=self.ctx.help_option_names[0] - ) - hint = f"{hint}\n" - if self.ctx is not None: - color = self.ctx.color - echo(f"{self.ctx.get_usage()}\n{hint}", file=file, color=color) - echo( - _("Error: {message}").format(message=self.format_message()), - file=file, - color=color, - ) - - -class BadParameter(UsageError): - """An exception that formats out a standardized error message for a - bad parameter. This is useful when thrown from a callback or type as - Click will attach contextual information to it (for instance, which - parameter it is). - - .. versionadded:: 2.0 - - :param param: the parameter object that caused this error. This can - be left out, and Click will attach this info itself - if possible. - :param param_hint: a string that shows up as parameter name. This - can be used as alternative to `param` in cases - where custom validation should happen. If it is - a string it's used as such, if it's a list then - each item is quoted and separated. - """ - - def __init__( - self, - message: str, - ctx: t.Optional["Context"] = None, - param: t.Optional["Parameter"] = None, - param_hint: t.Optional[str] = None, - ) -> None: - super().__init__(message, ctx) - self.param = param - self.param_hint = param_hint - - def format_message(self) -> str: - if self.param_hint is not None: - param_hint = self.param_hint - elif self.param is not None: - param_hint = self.param.get_error_hint(self.ctx) # type: ignore - else: - return _("Invalid value: {message}").format(message=self.message) - - return _("Invalid value for {param_hint}: {message}").format( - param_hint=_join_param_hints(param_hint), message=self.message - ) - - -class MissingParameter(BadParameter): - """Raised if click required an option or argument but it was not - provided when invoking the script. - - .. versionadded:: 4.0 - - :param param_type: a string that indicates the type of the parameter. - The default is to inherit the parameter type from - the given `param`. Valid values are ``'parameter'``, - ``'option'`` or ``'argument'``. - """ - - def __init__( - self, - message: t.Optional[str] = None, - ctx: t.Optional["Context"] = None, - param: t.Optional["Parameter"] = None, - param_hint: t.Optional[str] = None, - param_type: t.Optional[str] = None, - ) -> None: - super().__init__(message or "", ctx, param, param_hint) - self.param_type = param_type - - def format_message(self) -> str: - if self.param_hint is not None: - param_hint: t.Optional[str] = self.param_hint - elif self.param is not None: - param_hint = self.param.get_error_hint(self.ctx) # type: ignore - else: - param_hint = None - - param_hint = _join_param_hints(param_hint) - param_hint = f" {param_hint}" if param_hint else "" - - param_type = self.param_type - if param_type is None and self.param is not None: - param_type = self.param.param_type_name - - msg = self.message - if self.param is not None: - msg_extra = self.param.type.get_missing_message(self.param) - if msg_extra: - if msg: - msg += f". {msg_extra}" - else: - msg = msg_extra - - msg = f" {msg}" if msg else "" - - # Translate param_type for known types. - if param_type == "argument": - missing = _("Missing argument") - elif param_type == "option": - missing = _("Missing option") - elif param_type == "parameter": - missing = _("Missing parameter") - else: - missing = _("Missing {param_type}").format(param_type=param_type) - - return f"{missing}{param_hint}.{msg}" - - def __str__(self) -> str: - if not self.message: - param_name = self.param.name if self.param else None - return _("Missing parameter: {param_name}").format(param_name=param_name) - else: - return self.message - - -class NoSuchOption(UsageError): - """Raised if click attempted to handle an option that does not - exist. - - .. versionadded:: 4.0 - """ - - def __init__( - self, - option_name: str, - message: t.Optional[str] = None, - possibilities: t.Optional[t.Sequence[str]] = None, - ctx: t.Optional["Context"] = None, - ) -> None: - if message is None: - message = _("No such option: {name}").format(name=option_name) - - super().__init__(message, ctx) - self.option_name = option_name - self.possibilities = possibilities - - def format_message(self) -> str: - if not self.possibilities: - return self.message - - possibility_str = ", ".join(sorted(self.possibilities)) - suggest = ngettext( - "Did you mean {possibility}?", - "(Possible options: {possibilities})", - len(self.possibilities), - ).format(possibility=possibility_str, possibilities=possibility_str) - return f"{self.message} {suggest}" - - -class BadOptionUsage(UsageError): - """Raised if an option is generally supplied but the use of the option - was incorrect. This is for instance raised if the number of arguments - for an option is not correct. - - .. versionadded:: 4.0 - - :param option_name: the name of the option being used incorrectly. - """ - - def __init__( - self, option_name: str, message: str, ctx: t.Optional["Context"] = None - ) -> None: - super().__init__(message, ctx) - self.option_name = option_name - - -class BadArgumentUsage(UsageError): - """Raised if an argument is generally supplied but the use of the argument - was incorrect. This is for instance raised if the number of values - for an argument is not correct. - - .. versionadded:: 6.0 - """ - - -class FileError(ClickException): - """Raised if a file cannot be opened.""" - - def __init__(self, filename: str, hint: t.Optional[str] = None) -> None: - if hint is None: - hint = _("unknown error") - - super().__init__(hint) - self.ui_filename = os.fsdecode(filename) - self.filename = filename - - def format_message(self) -> str: - return _("Could not open file {filename!r}: {message}").format( - filename=self.ui_filename, message=self.message - ) - - -class Abort(RuntimeError): - """An internal signalling exception that signals Click to abort.""" - - -class Exit(RuntimeError): - """An exception that indicates that the application should exit with some - status code. - - :param code: the status code to exit with. - """ - - __slots__ = ("exit_code",) - - def __init__(self, code: int = 0) -> None: - self.exit_code = code diff --git a/venv/lib/python3.8/site-packages/click/formatting.py b/venv/lib/python3.8/site-packages/click/formatting.py deleted file mode 100644 index ddd2a2f..0000000 --- a/venv/lib/python3.8/site-packages/click/formatting.py +++ /dev/null @@ -1,301 +0,0 @@ -import typing as t -from contextlib import contextmanager -from gettext import gettext as _ - -from ._compat import term_len -from .parser import split_opt - -# Can force a width. This is used by the test system -FORCED_WIDTH: t.Optional[int] = None - - -def measure_table(rows: t.Iterable[t.Tuple[str, str]]) -> t.Tuple[int, ...]: - widths: t.Dict[int, int] = {} - - for row in rows: - for idx, col in enumerate(row): - widths[idx] = max(widths.get(idx, 0), term_len(col)) - - return tuple(y for x, y in sorted(widths.items())) - - -def iter_rows( - rows: t.Iterable[t.Tuple[str, str]], col_count: int -) -> t.Iterator[t.Tuple[str, ...]]: - for row in rows: - yield row + ("",) * (col_count - len(row)) - - -def wrap_text( - text: str, - width: int = 78, - initial_indent: str = "", - subsequent_indent: str = "", - preserve_paragraphs: bool = False, -) -> str: - """A helper function that intelligently wraps text. By default, it - assumes that it operates on a single paragraph of text but if the - `preserve_paragraphs` parameter is provided it will intelligently - handle paragraphs (defined by two empty lines). - - If paragraphs are handled, a paragraph can be prefixed with an empty - line containing the ``\\b`` character (``\\x08``) to indicate that - no rewrapping should happen in that block. - - :param text: the text that should be rewrapped. - :param width: the maximum width for the text. - :param initial_indent: the initial indent that should be placed on the - first line as a string. - :param subsequent_indent: the indent string that should be placed on - each consecutive line. - :param preserve_paragraphs: if this flag is set then the wrapping will - intelligently handle paragraphs. - """ - from ._textwrap import TextWrapper - - text = text.expandtabs() - wrapper = TextWrapper( - width, - initial_indent=initial_indent, - subsequent_indent=subsequent_indent, - replace_whitespace=False, - ) - if not preserve_paragraphs: - return wrapper.fill(text) - - p: t.List[t.Tuple[int, bool, str]] = [] - buf: t.List[str] = [] - indent = None - - def _flush_par() -> None: - if not buf: - return - if buf[0].strip() == "\b": - p.append((indent or 0, True, "\n".join(buf[1:]))) - else: - p.append((indent or 0, False, " ".join(buf))) - del buf[:] - - for line in text.splitlines(): - if not line: - _flush_par() - indent = None - else: - if indent is None: - orig_len = term_len(line) - line = line.lstrip() - indent = orig_len - term_len(line) - buf.append(line) - _flush_par() - - rv = [] - for indent, raw, text in p: - with wrapper.extra_indent(" " * indent): - if raw: - rv.append(wrapper.indent_only(text)) - else: - rv.append(wrapper.fill(text)) - - return "\n\n".join(rv) - - -class HelpFormatter: - """This class helps with formatting text-based help pages. It's - usually just needed for very special internal cases, but it's also - exposed so that developers can write their own fancy outputs. - - At present, it always writes into memory. - - :param indent_increment: the additional increment for each level. - :param width: the width for the text. This defaults to the terminal - width clamped to a maximum of 78. - """ - - def __init__( - self, - indent_increment: int = 2, - width: t.Optional[int] = None, - max_width: t.Optional[int] = None, - ) -> None: - import shutil - - self.indent_increment = indent_increment - if max_width is None: - max_width = 80 - if width is None: - width = FORCED_WIDTH - if width is None: - width = max(min(shutil.get_terminal_size().columns, max_width) - 2, 50) - self.width = width - self.current_indent = 0 - self.buffer: t.List[str] = [] - - def write(self, string: str) -> None: - """Writes a unicode string into the internal buffer.""" - self.buffer.append(string) - - def indent(self) -> None: - """Increases the indentation.""" - self.current_indent += self.indent_increment - - def dedent(self) -> None: - """Decreases the indentation.""" - self.current_indent -= self.indent_increment - - def write_usage( - self, prog: str, args: str = "", prefix: t.Optional[str] = None - ) -> None: - """Writes a usage line into the buffer. - - :param prog: the program name. - :param args: whitespace separated list of arguments. - :param prefix: The prefix for the first line. Defaults to - ``"Usage: "``. - """ - if prefix is None: - prefix = f"{_('Usage:')} " - - usage_prefix = f"{prefix:>{self.current_indent}}{prog} " - text_width = self.width - self.current_indent - - if text_width >= (term_len(usage_prefix) + 20): - # The arguments will fit to the right of the prefix. - indent = " " * term_len(usage_prefix) - self.write( - wrap_text( - args, - text_width, - initial_indent=usage_prefix, - subsequent_indent=indent, - ) - ) - else: - # The prefix is too long, put the arguments on the next line. - self.write(usage_prefix) - self.write("\n") - indent = " " * (max(self.current_indent, term_len(prefix)) + 4) - self.write( - wrap_text( - args, text_width, initial_indent=indent, subsequent_indent=indent - ) - ) - - self.write("\n") - - def write_heading(self, heading: str) -> None: - """Writes a heading into the buffer.""" - self.write(f"{'':>{self.current_indent}}{heading}:\n") - - def write_paragraph(self) -> None: - """Writes a paragraph into the buffer.""" - if self.buffer: - self.write("\n") - - def write_text(self, text: str) -> None: - """Writes re-indented text into the buffer. This rewraps and - preserves paragraphs. - """ - indent = " " * self.current_indent - self.write( - wrap_text( - text, - self.width, - initial_indent=indent, - subsequent_indent=indent, - preserve_paragraphs=True, - ) - ) - self.write("\n") - - def write_dl( - self, - rows: t.Sequence[t.Tuple[str, str]], - col_max: int = 30, - col_spacing: int = 2, - ) -> None: - """Writes a definition list into the buffer. This is how options - and commands are usually formatted. - - :param rows: a list of two item tuples for the terms and values. - :param col_max: the maximum width of the first column. - :param col_spacing: the number of spaces between the first and - second column. - """ - rows = list(rows) - widths = measure_table(rows) - if len(widths) != 2: - raise TypeError("Expected two columns for definition list") - - first_col = min(widths[0], col_max) + col_spacing - - for first, second in iter_rows(rows, len(widths)): - self.write(f"{'':>{self.current_indent}}{first}") - if not second: - self.write("\n") - continue - if term_len(first) <= first_col - col_spacing: - self.write(" " * (first_col - term_len(first))) - else: - self.write("\n") - self.write(" " * (first_col + self.current_indent)) - - text_width = max(self.width - first_col - 2, 10) - wrapped_text = wrap_text(second, text_width, preserve_paragraphs=True) - lines = wrapped_text.splitlines() - - if lines: - self.write(f"{lines[0]}\n") - - for line in lines[1:]: - self.write(f"{'':>{first_col + self.current_indent}}{line}\n") - else: - self.write("\n") - - @contextmanager - def section(self, name: str) -> t.Iterator[None]: - """Helpful context manager that writes a paragraph, a heading, - and the indents. - - :param name: the section name that is written as heading. - """ - self.write_paragraph() - self.write_heading(name) - self.indent() - try: - yield - finally: - self.dedent() - - @contextmanager - def indentation(self) -> t.Iterator[None]: - """A context manager that increases the indentation.""" - self.indent() - try: - yield - finally: - self.dedent() - - def getvalue(self) -> str: - """Returns the buffer contents.""" - return "".join(self.buffer) - - -def join_options(options: t.Sequence[str]) -> t.Tuple[str, bool]: - """Given a list of option strings this joins them in the most appropriate - way and returns them in the form ``(formatted_string, - any_prefix_is_slash)`` where the second item in the tuple is a flag that - indicates if any of the option prefixes was a slash. - """ - rv = [] - any_prefix_is_slash = False - - for opt in options: - prefix = split_opt(opt)[0] - - if prefix == "/": - any_prefix_is_slash = True - - rv.append((len(prefix), opt)) - - rv.sort(key=lambda x: x[0]) - return ", ".join(x[1] for x in rv), any_prefix_is_slash diff --git a/venv/lib/python3.8/site-packages/click/globals.py b/venv/lib/python3.8/site-packages/click/globals.py deleted file mode 100644 index cfcade1..0000000 --- a/venv/lib/python3.8/site-packages/click/globals.py +++ /dev/null @@ -1,69 +0,0 @@ -import typing -import typing as t -from threading import local - -if t.TYPE_CHECKING: - import typing_extensions as te - from .core import Context - -_local = local() - - -@typing.overload -def get_current_context(silent: "te.Literal[False]" = False) -> "Context": - ... - - -@typing.overload -def get_current_context(silent: bool = ...) -> t.Optional["Context"]: - ... - - -def get_current_context(silent: bool = False) -> t.Optional["Context"]: - """Returns the current click context. This can be used as a way to - access the current context object from anywhere. This is a more implicit - alternative to the :func:`pass_context` decorator. This function is - primarily useful for helpers such as :func:`echo` which might be - interested in changing its behavior based on the current context. - - To push the current context, :meth:`Context.scope` can be used. - - .. versionadded:: 5.0 - - :param silent: if set to `True` the return value is `None` if no context - is available. The default behavior is to raise a - :exc:`RuntimeError`. - """ - try: - return t.cast("Context", _local.stack[-1]) - except (AttributeError, IndexError): - if not silent: - raise RuntimeError("There is no active click context.") - - return None - - -def push_context(ctx: "Context") -> None: - """Pushes a new context to the current stack.""" - _local.__dict__.setdefault("stack", []).append(ctx) - - -def pop_context() -> None: - """Removes the top level from the stack.""" - _local.stack.pop() - - -def resolve_color_default(color: t.Optional[bool] = None) -> t.Optional[bool]: - """Internal helper to get the default value of the color flag. If a - value is passed it's returned unchanged, otherwise it's looked up from - the current context. - """ - if color is not None: - return color - - ctx = get_current_context(silent=True) - - if ctx is not None: - return ctx.color - - return None diff --git a/venv/lib/python3.8/site-packages/click/parser.py b/venv/lib/python3.8/site-packages/click/parser.py deleted file mode 100644 index 7d995f7..0000000 --- a/venv/lib/python3.8/site-packages/click/parser.py +++ /dev/null @@ -1,529 +0,0 @@ -""" -This module started out as largely a copy paste from the stdlib's -optparse module with the features removed that we do not need from -optparse because we implement them in Click on a higher level (for -instance type handling, help formatting and a lot more). - -The plan is to remove more and more from here over time. - -The reason this is a different module and not optparse from the stdlib -is that there are differences in 2.x and 3.x about the error messages -generated and optparse in the stdlib uses gettext for no good reason -and might cause us issues. - -Click uses parts of optparse written by Gregory P. Ward and maintained -by the Python Software Foundation. This is limited to code in parser.py. - -Copyright 2001-2006 Gregory P. Ward. All rights reserved. -Copyright 2002-2006 Python Software Foundation. All rights reserved. -""" -# This code uses parts of optparse written by Gregory P. Ward and -# maintained by the Python Software Foundation. -# Copyright 2001-2006 Gregory P. Ward -# Copyright 2002-2006 Python Software Foundation -import typing as t -from collections import deque -from gettext import gettext as _ -from gettext import ngettext - -from .exceptions import BadArgumentUsage -from .exceptions import BadOptionUsage -from .exceptions import NoSuchOption -from .exceptions import UsageError - -if t.TYPE_CHECKING: - import typing_extensions as te - from .core import Argument as CoreArgument - from .core import Context - from .core import Option as CoreOption - from .core import Parameter as CoreParameter - -V = t.TypeVar("V") - -# Sentinel value that indicates an option was passed as a flag without a -# value but is not a flag option. Option.consume_value uses this to -# prompt or use the flag_value. -_flag_needs_value = object() - - -def _unpack_args( - args: t.Sequence[str], nargs_spec: t.Sequence[int] -) -> t.Tuple[t.Sequence[t.Union[str, t.Sequence[t.Optional[str]], None]], t.List[str]]: - """Given an iterable of arguments and an iterable of nargs specifications, - it returns a tuple with all the unpacked arguments at the first index - and all remaining arguments as the second. - - The nargs specification is the number of arguments that should be consumed - or `-1` to indicate that this position should eat up all the remainders. - - Missing items are filled with `None`. - """ - args = deque(args) - nargs_spec = deque(nargs_spec) - rv: t.List[t.Union[str, t.Tuple[t.Optional[str], ...], None]] = [] - spos: t.Optional[int] = None - - def _fetch(c: "te.Deque[V]") -> t.Optional[V]: - try: - if spos is None: - return c.popleft() - else: - return c.pop() - except IndexError: - return None - - while nargs_spec: - nargs = _fetch(nargs_spec) - - if nargs is None: - continue - - if nargs == 1: - rv.append(_fetch(args)) - elif nargs > 1: - x = [_fetch(args) for _ in range(nargs)] - - # If we're reversed, we're pulling in the arguments in reverse, - # so we need to turn them around. - if spos is not None: - x.reverse() - - rv.append(tuple(x)) - elif nargs < 0: - if spos is not None: - raise TypeError("Cannot have two nargs < 0") - - spos = len(rv) - rv.append(None) - - # spos is the position of the wildcard (star). If it's not `None`, - # we fill it with the remainder. - if spos is not None: - rv[spos] = tuple(args) - args = [] - rv[spos + 1 :] = reversed(rv[spos + 1 :]) - - return tuple(rv), list(args) - - -def split_opt(opt: str) -> t.Tuple[str, str]: - first = opt[:1] - if first.isalnum(): - return "", opt - if opt[1:2] == first: - return opt[:2], opt[2:] - return first, opt[1:] - - -def normalize_opt(opt: str, ctx: t.Optional["Context"]) -> str: - if ctx is None or ctx.token_normalize_func is None: - return opt - prefix, opt = split_opt(opt) - return f"{prefix}{ctx.token_normalize_func(opt)}" - - -def split_arg_string(string: str) -> t.List[str]: - """Split an argument string as with :func:`shlex.split`, but don't - fail if the string is incomplete. Ignores a missing closing quote or - incomplete escape sequence and uses the partial token as-is. - - .. code-block:: python - - split_arg_string("example 'my file") - ["example", "my file"] - - split_arg_string("example my\\") - ["example", "my"] - - :param string: String to split. - """ - import shlex - - lex = shlex.shlex(string, posix=True) - lex.whitespace_split = True - lex.commenters = "" - out = [] - - try: - for token in lex: - out.append(token) - except ValueError: - # Raised when end-of-string is reached in an invalid state. Use - # the partial token as-is. The quote or escape character is in - # lex.state, not lex.token. - out.append(lex.token) - - return out - - -class Option: - def __init__( - self, - obj: "CoreOption", - opts: t.Sequence[str], - dest: t.Optional[str], - action: t.Optional[str] = None, - nargs: int = 1, - const: t.Optional[t.Any] = None, - ): - self._short_opts = [] - self._long_opts = [] - self.prefixes = set() - - for opt in opts: - prefix, value = split_opt(opt) - if not prefix: - raise ValueError(f"Invalid start character for option ({opt})") - self.prefixes.add(prefix[0]) - if len(prefix) == 1 and len(value) == 1: - self._short_opts.append(opt) - else: - self._long_opts.append(opt) - self.prefixes.add(prefix) - - if action is None: - action = "store" - - self.dest = dest - self.action = action - self.nargs = nargs - self.const = const - self.obj = obj - - @property - def takes_value(self) -> bool: - return self.action in ("store", "append") - - def process(self, value: str, state: "ParsingState") -> None: - if self.action == "store": - state.opts[self.dest] = value # type: ignore - elif self.action == "store_const": - state.opts[self.dest] = self.const # type: ignore - elif self.action == "append": - state.opts.setdefault(self.dest, []).append(value) # type: ignore - elif self.action == "append_const": - state.opts.setdefault(self.dest, []).append(self.const) # type: ignore - elif self.action == "count": - state.opts[self.dest] = state.opts.get(self.dest, 0) + 1 # type: ignore - else: - raise ValueError(f"unknown action '{self.action}'") - state.order.append(self.obj) - - -class Argument: - def __init__(self, obj: "CoreArgument", dest: t.Optional[str], nargs: int = 1): - self.dest = dest - self.nargs = nargs - self.obj = obj - - def process( - self, - value: t.Union[t.Optional[str], t.Sequence[t.Optional[str]]], - state: "ParsingState", - ) -> None: - if self.nargs > 1: - assert value is not None - holes = sum(1 for x in value if x is None) - if holes == len(value): - value = None - elif holes != 0: - raise BadArgumentUsage( - _("Argument {name!r} takes {nargs} values.").format( - name=self.dest, nargs=self.nargs - ) - ) - - if self.nargs == -1 and self.obj.envvar is not None and value == (): - # Replace empty tuple with None so that a value from the - # environment may be tried. - value = None - - state.opts[self.dest] = value # type: ignore - state.order.append(self.obj) - - -class ParsingState: - def __init__(self, rargs: t.List[str]) -> None: - self.opts: t.Dict[str, t.Any] = {} - self.largs: t.List[str] = [] - self.rargs = rargs - self.order: t.List["CoreParameter"] = [] - - -class OptionParser: - """The option parser is an internal class that is ultimately used to - parse options and arguments. It's modelled after optparse and brings - a similar but vastly simplified API. It should generally not be used - directly as the high level Click classes wrap it for you. - - It's not nearly as extensible as optparse or argparse as it does not - implement features that are implemented on a higher level (such as - types or defaults). - - :param ctx: optionally the :class:`~click.Context` where this parser - should go with. - """ - - def __init__(self, ctx: t.Optional["Context"] = None) -> None: - #: The :class:`~click.Context` for this parser. This might be - #: `None` for some advanced use cases. - self.ctx = ctx - #: This controls how the parser deals with interspersed arguments. - #: If this is set to `False`, the parser will stop on the first - #: non-option. Click uses this to implement nested subcommands - #: safely. - self.allow_interspersed_args = True - #: This tells the parser how to deal with unknown options. By - #: default it will error out (which is sensible), but there is a - #: second mode where it will ignore it and continue processing - #: after shifting all the unknown options into the resulting args. - self.ignore_unknown_options = False - - if ctx is not None: - self.allow_interspersed_args = ctx.allow_interspersed_args - self.ignore_unknown_options = ctx.ignore_unknown_options - - self._short_opt: t.Dict[str, Option] = {} - self._long_opt: t.Dict[str, Option] = {} - self._opt_prefixes = {"-", "--"} - self._args: t.List[Argument] = [] - - def add_option( - self, - obj: "CoreOption", - opts: t.Sequence[str], - dest: t.Optional[str], - action: t.Optional[str] = None, - nargs: int = 1, - const: t.Optional[t.Any] = None, - ) -> None: - """Adds a new option named `dest` to the parser. The destination - is not inferred (unlike with optparse) and needs to be explicitly - provided. Action can be any of ``store``, ``store_const``, - ``append``, ``appnd_const`` or ``count``. - - The `obj` can be used to identify the option in the order list - that is returned from the parser. - """ - opts = [normalize_opt(opt, self.ctx) for opt in opts] - option = Option(obj, opts, dest, action=action, nargs=nargs, const=const) - self._opt_prefixes.update(option.prefixes) - for opt in option._short_opts: - self._short_opt[opt] = option - for opt in option._long_opts: - self._long_opt[opt] = option - - def add_argument( - self, obj: "CoreArgument", dest: t.Optional[str], nargs: int = 1 - ) -> None: - """Adds a positional argument named `dest` to the parser. - - The `obj` can be used to identify the option in the order list - that is returned from the parser. - """ - self._args.append(Argument(obj, dest=dest, nargs=nargs)) - - def parse_args( - self, args: t.List[str] - ) -> t.Tuple[t.Dict[str, t.Any], t.List[str], t.List["CoreParameter"]]: - """Parses positional arguments and returns ``(values, args, order)`` - for the parsed options and arguments as well as the leftover - arguments if there are any. The order is a list of objects as they - appear on the command line. If arguments appear multiple times they - will be memorized multiple times as well. - """ - state = ParsingState(args) - try: - self._process_args_for_options(state) - self._process_args_for_args(state) - except UsageError: - if self.ctx is None or not self.ctx.resilient_parsing: - raise - return state.opts, state.largs, state.order - - def _process_args_for_args(self, state: ParsingState) -> None: - pargs, args = _unpack_args( - state.largs + state.rargs, [x.nargs for x in self._args] - ) - - for idx, arg in enumerate(self._args): - arg.process(pargs[idx], state) - - state.largs = args - state.rargs = [] - - def _process_args_for_options(self, state: ParsingState) -> None: - while state.rargs: - arg = state.rargs.pop(0) - arglen = len(arg) - # Double dashes always handled explicitly regardless of what - # prefixes are valid. - if arg == "--": - return - elif arg[:1] in self._opt_prefixes and arglen > 1: - self._process_opts(arg, state) - elif self.allow_interspersed_args: - state.largs.append(arg) - else: - state.rargs.insert(0, arg) - return - - # Say this is the original argument list: - # [arg0, arg1, ..., arg(i-1), arg(i), arg(i+1), ..., arg(N-1)] - # ^ - # (we are about to process arg(i)). - # - # Then rargs is [arg(i), ..., arg(N-1)] and largs is a *subset* of - # [arg0, ..., arg(i-1)] (any options and their arguments will have - # been removed from largs). - # - # The while loop will usually consume 1 or more arguments per pass. - # If it consumes 1 (eg. arg is an option that takes no arguments), - # then after _process_arg() is done the situation is: - # - # largs = subset of [arg0, ..., arg(i)] - # rargs = [arg(i+1), ..., arg(N-1)] - # - # If allow_interspersed_args is false, largs will always be - # *empty* -- still a subset of [arg0, ..., arg(i-1)], but - # not a very interesting subset! - - def _match_long_opt( - self, opt: str, explicit_value: t.Optional[str], state: ParsingState - ) -> None: - if opt not in self._long_opt: - from difflib import get_close_matches - - possibilities = get_close_matches(opt, self._long_opt) - raise NoSuchOption(opt, possibilities=possibilities, ctx=self.ctx) - - option = self._long_opt[opt] - if option.takes_value: - # At this point it's safe to modify rargs by injecting the - # explicit value, because no exception is raised in this - # branch. This means that the inserted value will be fully - # consumed. - if explicit_value is not None: - state.rargs.insert(0, explicit_value) - - value = self._get_value_from_state(opt, option, state) - - elif explicit_value is not None: - raise BadOptionUsage( - opt, _("Option {name!r} does not take a value.").format(name=opt) - ) - - else: - value = None - - option.process(value, state) - - def _match_short_opt(self, arg: str, state: ParsingState) -> None: - stop = False - i = 1 - prefix = arg[0] - unknown_options = [] - - for ch in arg[1:]: - opt = normalize_opt(f"{prefix}{ch}", self.ctx) - option = self._short_opt.get(opt) - i += 1 - - if not option: - if self.ignore_unknown_options: - unknown_options.append(ch) - continue - raise NoSuchOption(opt, ctx=self.ctx) - if option.takes_value: - # Any characters left in arg? Pretend they're the - # next arg, and stop consuming characters of arg. - if i < len(arg): - state.rargs.insert(0, arg[i:]) - stop = True - - value = self._get_value_from_state(opt, option, state) - - else: - value = None - - option.process(value, state) - - if stop: - break - - # If we got any unknown options we re-combinate the string of the - # remaining options and re-attach the prefix, then report that - # to the state as new larg. This way there is basic combinatorics - # that can be achieved while still ignoring unknown arguments. - if self.ignore_unknown_options and unknown_options: - state.largs.append(f"{prefix}{''.join(unknown_options)}") - - def _get_value_from_state( - self, option_name: str, option: Option, state: ParsingState - ) -> t.Any: - nargs = option.nargs - - if len(state.rargs) < nargs: - if option.obj._flag_needs_value: - # Option allows omitting the value. - value = _flag_needs_value - else: - raise BadOptionUsage( - option_name, - ngettext( - "Option {name!r} requires an argument.", - "Option {name!r} requires {nargs} arguments.", - nargs, - ).format(name=option_name, nargs=nargs), - ) - elif nargs == 1: - next_rarg = state.rargs[0] - - if ( - option.obj._flag_needs_value - and isinstance(next_rarg, str) - and next_rarg[:1] in self._opt_prefixes - and len(next_rarg) > 1 - ): - # The next arg looks like the start of an option, don't - # use it as the value if omitting the value is allowed. - value = _flag_needs_value - else: - value = state.rargs.pop(0) - else: - value = tuple(state.rargs[:nargs]) - del state.rargs[:nargs] - - return value - - def _process_opts(self, arg: str, state: ParsingState) -> None: - explicit_value = None - # Long option handling happens in two parts. The first part is - # supporting explicitly attached values. In any case, we will try - # to long match the option first. - if "=" in arg: - long_opt, explicit_value = arg.split("=", 1) - else: - long_opt = arg - norm_long_opt = normalize_opt(long_opt, self.ctx) - - # At this point we will match the (assumed) long option through - # the long option matching code. Note that this allows options - # like "-foo" to be matched as long options. - try: - self._match_long_opt(norm_long_opt, explicit_value, state) - except NoSuchOption: - # At this point the long option matching failed, and we need - # to try with short options. However there is a special rule - # which says, that if we have a two character options prefix - # (applies to "--foo" for instance), we do not dispatch to the - # short option code and will instead raise the no option - # error. - if arg[:2] not in self._opt_prefixes: - self._match_short_opt(arg, state) - return - - if not self.ignore_unknown_options: - raise - - state.largs.append(arg) diff --git a/venv/lib/python3.8/site-packages/click/py.typed b/venv/lib/python3.8/site-packages/click/py.typed deleted file mode 100644 index e69de29..0000000 diff --git a/venv/lib/python3.8/site-packages/click/shell_completion.py b/venv/lib/python3.8/site-packages/click/shell_completion.py deleted file mode 100644 index 706fb69..0000000 --- a/venv/lib/python3.8/site-packages/click/shell_completion.py +++ /dev/null @@ -1,574 +0,0 @@ -import os -import re -import typing as t -from gettext import gettext as _ - -from .core import Argument -from .core import BaseCommand -from .core import Context -from .core import MultiCommand -from .core import Option -from .core import Parameter -from .core import ParameterSource -from .parser import split_arg_string -from .utils import echo - - -def shell_complete( - cli: BaseCommand, - ctx_args: t.Dict[str, t.Any], - prog_name: str, - complete_var: str, - instruction: str, -) -> int: - """Perform shell completion for the given CLI program. - - :param cli: Command being called. - :param ctx_args: Extra arguments to pass to - ``cli.make_context``. - :param prog_name: Name of the executable in the shell. - :param complete_var: Name of the environment variable that holds - the completion instruction. - :param instruction: Value of ``complete_var`` with the completion - instruction and shell, in the form ``instruction_shell``. - :return: Status code to exit with. - """ - shell, _, instruction = instruction.partition("_") - comp_cls = get_completion_class(shell) - - if comp_cls is None: - return 1 - - comp = comp_cls(cli, ctx_args, prog_name, complete_var) - - if instruction == "source": - echo(comp.source()) - return 0 - - if instruction == "complete": - echo(comp.complete()) - return 0 - - return 1 - - -class CompletionItem: - """Represents a completion value and metadata about the value. The - default metadata is ``type`` to indicate special shell handling, - and ``help`` if a shell supports showing a help string next to the - value. - - Arbitrary parameters can be passed when creating the object, and - accessed using ``item.attr``. If an attribute wasn't passed, - accessing it returns ``None``. - - :param value: The completion suggestion. - :param type: Tells the shell script to provide special completion - support for the type. Click uses ``"dir"`` and ``"file"``. - :param help: String shown next to the value if supported. - :param kwargs: Arbitrary metadata. The built-in implementations - don't use this, but custom type completions paired with custom - shell support could use it. - """ - - __slots__ = ("value", "type", "help", "_info") - - def __init__( - self, - value: t.Any, - type: str = "plain", - help: t.Optional[str] = None, - **kwargs: t.Any, - ) -> None: - self.value = value - self.type = type - self.help = help - self._info = kwargs - - def __getattr__(self, name: str) -> t.Any: - return self._info.get(name) - - -# Only Bash >= 4.4 has the nosort option. -_SOURCE_BASH = """\ -%(complete_func)s() { - local IFS=$'\\n' - local response - - response=$(env COMP_WORDS="${COMP_WORDS[*]}" COMP_CWORD=$COMP_CWORD \ -%(complete_var)s=bash_complete $1) - - for completion in $response; do - IFS=',' read type value <<< "$completion" - - if [[ $type == 'dir' ]]; then - COMREPLY=() - compopt -o dirnames - elif [[ $type == 'file' ]]; then - COMREPLY=() - compopt -o default - elif [[ $type == 'plain' ]]; then - COMPREPLY+=($value) - fi - done - - return 0 -} - -%(complete_func)s_setup() { - complete -o nosort -F %(complete_func)s %(prog_name)s -} - -%(complete_func)s_setup; -""" - -_SOURCE_ZSH = """\ -#compdef %(prog_name)s - -%(complete_func)s() { - local -a completions - local -a completions_with_descriptions - local -a response - (( ! $+commands[%(prog_name)s] )) && return 1 - - response=("${(@f)$(env COMP_WORDS="${words[*]}" COMP_CWORD=$((CURRENT-1)) \ -%(complete_var)s=zsh_complete %(prog_name)s)}") - - for type key descr in ${response}; do - if [[ "$type" == "plain" ]]; then - if [[ "$descr" == "_" ]]; then - completions+=("$key") - else - completions_with_descriptions+=("$key":"$descr") - fi - elif [[ "$type" == "dir" ]]; then - _path_files -/ - elif [[ "$type" == "file" ]]; then - _path_files -f - fi - done - - if [ -n "$completions_with_descriptions" ]; then - _describe -V unsorted completions_with_descriptions -U - fi - - if [ -n "$completions" ]; then - compadd -U -V unsorted -a completions - fi -} - -compdef %(complete_func)s %(prog_name)s; -""" - -_SOURCE_FISH = """\ -function %(complete_func)s; - set -l response; - - for value in (env %(complete_var)s=fish_complete COMP_WORDS=(commandline -cp) \ -COMP_CWORD=(commandline -t) %(prog_name)s); - set response $response $value; - end; - - for completion in $response; - set -l metadata (string split "," $completion); - - if test $metadata[1] = "dir"; - __fish_complete_directories $metadata[2]; - else if test $metadata[1] = "file"; - __fish_complete_path $metadata[2]; - else if test $metadata[1] = "plain"; - echo $metadata[2]; - end; - end; -end; - -complete --no-files --command %(prog_name)s --arguments \ -"(%(complete_func)s)"; -""" - - -class ShellComplete: - """Base class for providing shell completion support. A subclass for - a given shell will override attributes and methods to implement the - completion instructions (``source`` and ``complete``). - - :param cli: Command being called. - :param prog_name: Name of the executable in the shell. - :param complete_var: Name of the environment variable that holds - the completion instruction. - - .. versionadded:: 8.0 - """ - - name: t.ClassVar[str] - """Name to register the shell as with :func:`add_completion_class`. - This is used in completion instructions (``{name}_source`` and - ``{name}_complete``). - """ - - source_template: t.ClassVar[str] - """Completion script template formatted by :meth:`source`. This must - be provided by subclasses. - """ - - def __init__( - self, - cli: BaseCommand, - ctx_args: t.Dict[str, t.Any], - prog_name: str, - complete_var: str, - ) -> None: - self.cli = cli - self.ctx_args = ctx_args - self.prog_name = prog_name - self.complete_var = complete_var - - @property - def func_name(self) -> str: - """The name of the shell function defined by the completion - script. - """ - safe_name = re.sub(r"\W*", "", self.prog_name.replace("-", "_"), re.ASCII) - return f"_{safe_name}_completion" - - def source_vars(self) -> t.Dict[str, t.Any]: - """Vars for formatting :attr:`source_template`. - - By default this provides ``complete_func``, ``complete_var``, - and ``prog_name``. - """ - return { - "complete_func": self.func_name, - "complete_var": self.complete_var, - "prog_name": self.prog_name, - } - - def source(self) -> str: - """Produce the shell script that defines the completion - function. By default this ``%``-style formats - :attr:`source_template` with the dict returned by - :meth:`source_vars`. - """ - return self.source_template % self.source_vars() - - def get_completion_args(self) -> t.Tuple[t.List[str], str]: - """Use the env vars defined by the shell script to return a - tuple of ``args, incomplete``. This must be implemented by - subclasses. - """ - raise NotImplementedError - - def get_completions( - self, args: t.List[str], incomplete: str - ) -> t.List[CompletionItem]: - """Determine the context and last complete command or parameter - from the complete args. Call that object's ``shell_complete`` - method to get the completions for the incomplete value. - - :param args: List of complete args before the incomplete value. - :param incomplete: Value being completed. May be empty. - """ - ctx = _resolve_context(self.cli, self.ctx_args, self.prog_name, args) - obj, incomplete = _resolve_incomplete(ctx, args, incomplete) - return obj.shell_complete(ctx, incomplete) - - def format_completion(self, item: CompletionItem) -> str: - """Format a completion item into the form recognized by the - shell script. This must be implemented by subclasses. - - :param item: Completion item to format. - """ - raise NotImplementedError - - def complete(self) -> str: - """Produce the completion data to send back to the shell. - - By default this calls :meth:`get_completion_args`, gets the - completions, then calls :meth:`format_completion` for each - completion. - """ - args, incomplete = self.get_completion_args() - completions = self.get_completions(args, incomplete) - out = [self.format_completion(item) for item in completions] - return "\n".join(out) - - -class BashComplete(ShellComplete): - """Shell completion for Bash.""" - - name = "bash" - source_template = _SOURCE_BASH - - def _check_version(self) -> None: - import subprocess - - output = subprocess.run(["bash", "--version"], stdout=subprocess.PIPE) - match = re.search(r"version (\d)\.(\d)\.\d", output.stdout.decode()) - - if match is not None: - major, minor = match.groups() - - if major < "4" or major == "4" and minor < "4": - raise RuntimeError( - _( - "Shell completion is not supported for Bash" - " versions older than 4.4." - ) - ) - else: - raise RuntimeError( - _("Couldn't detect Bash version, shell completion is not supported.") - ) - - def source(self) -> str: - self._check_version() - return super().source() - - def get_completion_args(self) -> t.Tuple[t.List[str], str]: - cwords = split_arg_string(os.environ["COMP_WORDS"]) - cword = int(os.environ["COMP_CWORD"]) - args = cwords[1:cword] - - try: - incomplete = cwords[cword] - except IndexError: - incomplete = "" - - return args, incomplete - - def format_completion(self, item: CompletionItem) -> str: - return f"{item.type},{item.value}" - - -class ZshComplete(ShellComplete): - """Shell completion for Zsh.""" - - name = "zsh" - source_template = _SOURCE_ZSH - - def get_completion_args(self) -> t.Tuple[t.List[str], str]: - cwords = split_arg_string(os.environ["COMP_WORDS"]) - cword = int(os.environ["COMP_CWORD"]) - args = cwords[1:cword] - - try: - incomplete = cwords[cword] - except IndexError: - incomplete = "" - - return args, incomplete - - def format_completion(self, item: CompletionItem) -> str: - return f"{item.type}\n{item.value}\n{item.help if item.help else '_'}" - - -class FishComplete(ShellComplete): - """Shell completion for Fish.""" - - name = "fish" - source_template = _SOURCE_FISH - - def get_completion_args(self) -> t.Tuple[t.List[str], str]: - cwords = split_arg_string(os.environ["COMP_WORDS"]) - incomplete = os.environ["COMP_CWORD"] - args = cwords[1:] - - # Fish stores the partial word in both COMP_WORDS and - # COMP_CWORD, remove it from complete args. - if incomplete and args and args[-1] == incomplete: - args.pop() - - return args, incomplete - - def format_completion(self, item: CompletionItem) -> str: - if item.help: - return f"{item.type},{item.value}\t{item.help}" - - return f"{item.type},{item.value}" - - -_available_shells: t.Dict[str, t.Type[ShellComplete]] = { - "bash": BashComplete, - "fish": FishComplete, - "zsh": ZshComplete, -} - - -def add_completion_class( - cls: t.Type[ShellComplete], name: t.Optional[str] = None -) -> None: - """Register a :class:`ShellComplete` subclass under the given name. - The name will be provided by the completion instruction environment - variable during completion. - - :param cls: The completion class that will handle completion for the - shell. - :param name: Name to register the class under. Defaults to the - class's ``name`` attribute. - """ - if name is None: - name = cls.name - - _available_shells[name] = cls - - -def get_completion_class(shell: str) -> t.Optional[t.Type[ShellComplete]]: - """Look up a registered :class:`ShellComplete` subclass by the name - provided by the completion instruction environment variable. If the - name isn't registered, returns ``None``. - - :param shell: Name the class is registered under. - """ - return _available_shells.get(shell) - - -def _is_incomplete_argument(ctx: Context, param: Parameter) -> bool: - """Determine if the given parameter is an argument that can still - accept values. - - :param ctx: Invocation context for the command represented by the - parsed complete args. - :param param: Argument object being checked. - """ - if not isinstance(param, Argument): - return False - - assert param.name is not None - value = ctx.params[param.name] - return ( - param.nargs == -1 - or ctx.get_parameter_source(param.name) is not ParameterSource.COMMANDLINE - or ( - param.nargs > 1 - and isinstance(value, (tuple, list)) - and len(value) < param.nargs - ) - ) - - -def _start_of_option(value: str) -> bool: - """Check if the value looks like the start of an option.""" - return not value[0].isalnum() if value else False - - -def _is_incomplete_option(args: t.List[str], param: Parameter) -> bool: - """Determine if the given parameter is an option that needs a value. - - :param args: List of complete args before the incomplete value. - :param param: Option object being checked. - """ - if not isinstance(param, Option): - return False - - if param.is_flag: - return False - - last_option = None - - for index, arg in enumerate(reversed(args)): - if index + 1 > param.nargs: - break - - if _start_of_option(arg): - last_option = arg - - return last_option is not None and last_option in param.opts - - -def _resolve_context( - cli: BaseCommand, ctx_args: t.Dict[str, t.Any], prog_name: str, args: t.List[str] -) -> Context: - """Produce the context hierarchy starting with the command and - traversing the complete arguments. This only follows the commands, - it doesn't trigger input prompts or callbacks. - - :param cli: Command being called. - :param prog_name: Name of the executable in the shell. - :param args: List of complete args before the incomplete value. - """ - ctx_args["resilient_parsing"] = True - ctx = cli.make_context(prog_name, args.copy(), **ctx_args) - args = ctx.protected_args + ctx.args - - while args: - command = ctx.command - - if isinstance(command, MultiCommand): - if not command.chain: - name, cmd, args = command.resolve_command(ctx, args) - - if cmd is None: - return ctx - - ctx = cmd.make_context(name, args, parent=ctx, resilient_parsing=True) - args = ctx.protected_args + ctx.args - else: - while args: - name, cmd, args = command.resolve_command(ctx, args) - - if cmd is None: - return ctx - - sub_ctx = cmd.make_context( - name, - args, - parent=ctx, - allow_extra_args=True, - allow_interspersed_args=False, - resilient_parsing=True, - ) - args = sub_ctx.args - - ctx = sub_ctx - args = [*sub_ctx.protected_args, *sub_ctx.args] - else: - break - - return ctx - - -def _resolve_incomplete( - ctx: Context, args: t.List[str], incomplete: str -) -> t.Tuple[t.Union[BaseCommand, Parameter], str]: - """Find the Click object that will handle the completion of the - incomplete value. Return the object and the incomplete value. - - :param ctx: Invocation context for the command represented by - the parsed complete args. - :param args: List of complete args before the incomplete value. - :param incomplete: Value being completed. May be empty. - """ - # Different shells treat an "=" between a long option name and - # value differently. Might keep the value joined, return the "=" - # as a separate item, or return the split name and value. Always - # split and discard the "=" to make completion easier. - if incomplete == "=": - incomplete = "" - elif "=" in incomplete and _start_of_option(incomplete): - name, _, incomplete = incomplete.partition("=") - args.append(name) - - # The "--" marker tells Click to stop treating values as options - # even if they start with the option character. If it hasn't been - # given and the incomplete arg looks like an option, the current - # command will provide option name completions. - if "--" not in args and _start_of_option(incomplete): - return ctx.command, incomplete - - params = ctx.command.get_params(ctx) - - # If the last complete arg is an option name with an incomplete - # value, the option will provide value completions. - for param in params: - if _is_incomplete_option(args, param): - return param, incomplete - - # It's not an option name or value. The first argument without a - # parsed value will provide value completions. - for param in params: - if _is_incomplete_argument(ctx, param): - return param, incomplete - - # There were no unparsed arguments, the command may be a group that - # will provide command name completions. - return ctx.command, incomplete diff --git a/venv/lib/python3.8/site-packages/click/termui.py b/venv/lib/python3.8/site-packages/click/termui.py deleted file mode 100644 index 034fe6e..0000000 --- a/venv/lib/python3.8/site-packages/click/termui.py +++ /dev/null @@ -1,807 +0,0 @@ -import inspect -import io -import itertools -import os -import sys -import typing -import typing as t -from gettext import gettext as _ - -from ._compat import isatty -from ._compat import strip_ansi -from ._compat import WIN -from .exceptions import Abort -from .exceptions import UsageError -from .globals import resolve_color_default -from .types import Choice -from .types import convert_type -from .types import ParamType -from .utils import echo -from .utils import LazyFile - -if t.TYPE_CHECKING: - from ._termui_impl import ProgressBar - -V = t.TypeVar("V") - -# The prompt functions to use. The doc tools currently override these -# functions to customize how they work. -visible_prompt_func: t.Callable[[str], str] = input - -_ansi_colors = { - "black": 30, - "red": 31, - "green": 32, - "yellow": 33, - "blue": 34, - "magenta": 35, - "cyan": 36, - "white": 37, - "reset": 39, - "bright_black": 90, - "bright_red": 91, - "bright_green": 92, - "bright_yellow": 93, - "bright_blue": 94, - "bright_magenta": 95, - "bright_cyan": 96, - "bright_white": 97, -} -_ansi_reset_all = "\033[0m" - - -def hidden_prompt_func(prompt: str) -> str: - import getpass - - return getpass.getpass(prompt) - - -def _build_prompt( - text: str, - suffix: str, - show_default: bool = False, - default: t.Optional[t.Any] = None, - show_choices: bool = True, - type: t.Optional[ParamType] = None, -) -> str: - prompt = text - if type is not None and show_choices and isinstance(type, Choice): - prompt += f" ({', '.join(map(str, type.choices))})" - if default is not None and show_default: - prompt = f"{prompt} [{_format_default(default)}]" - return f"{prompt}{suffix}" - - -def _format_default(default: t.Any) -> t.Any: - if isinstance(default, (io.IOBase, LazyFile)) and hasattr(default, "name"): - return default.name # type: ignore - - return default - - -def prompt( - text: str, - default: t.Optional[t.Any] = None, - hide_input: bool = False, - confirmation_prompt: t.Union[bool, str] = False, - type: t.Optional[ParamType] = None, - value_proc: t.Optional[t.Callable[[str], t.Any]] = None, - prompt_suffix: str = ": ", - show_default: bool = True, - err: bool = False, - show_choices: bool = True, -) -> t.Any: - """Prompts a user for input. This is a convenience function that can - be used to prompt a user for input later. - - If the user aborts the input by sending a interrupt signal, this - function will catch it and raise a :exc:`Abort` exception. - - :param text: the text to show for the prompt. - :param default: the default value to use if no input happens. If this - is not given it will prompt until it's aborted. - :param hide_input: if this is set to true then the input value will - be hidden. - :param confirmation_prompt: Prompt a second time to confirm the - value. Can be set to a string instead of ``True`` to customize - the message. - :param type: the type to use to check the value against. - :param value_proc: if this parameter is provided it's a function that - is invoked instead of the type conversion to - convert a value. - :param prompt_suffix: a suffix that should be added to the prompt. - :param show_default: shows or hides the default value in the prompt. - :param err: if set to true the file defaults to ``stderr`` instead of - ``stdout``, the same as with echo. - :param show_choices: Show or hide choices if the passed type is a Choice. - For example if type is a Choice of either day or week, - show_choices is true and text is "Group by" then the - prompt will be "Group by (day, week): ". - - .. versionadded:: 8.0 - ``confirmation_prompt`` can be a custom string. - - .. versionadded:: 7.0 - Added the ``show_choices`` parameter. - - .. versionadded:: 6.0 - Added unicode support for cmd.exe on Windows. - - .. versionadded:: 4.0 - Added the `err` parameter. - - """ - - def prompt_func(text: str) -> str: - f = hidden_prompt_func if hide_input else visible_prompt_func - try: - # Write the prompt separately so that we get nice - # coloring through colorama on Windows - echo(text.rstrip(" "), nl=False, err=err) - # Echo a space to stdout to work around an issue where - # readline causes backspace to clear the whole line. - return f(" ") - except (KeyboardInterrupt, EOFError): - # getpass doesn't print a newline if the user aborts input with ^C. - # Allegedly this behavior is inherited from getpass(3). - # A doc bug has been filed at https://bugs.python.org/issue24711 - if hide_input: - echo(None, err=err) - raise Abort() - - if value_proc is None: - value_proc = convert_type(type, default) - - prompt = _build_prompt( - text, prompt_suffix, show_default, default, show_choices, type - ) - - if confirmation_prompt: - if confirmation_prompt is True: - confirmation_prompt = _("Repeat for confirmation") - - confirmation_prompt = t.cast(str, confirmation_prompt) - confirmation_prompt = _build_prompt(confirmation_prompt, prompt_suffix) - - while True: - while True: - value = prompt_func(prompt) - if value: - break - elif default is not None: - value = default - break - try: - result = value_proc(value) - except UsageError as e: - if hide_input: - echo(_("Error: The value you entered was invalid."), err=err) - else: - echo(_("Error: {e.message}").format(e=e), err=err) # noqa: B306 - continue - if not confirmation_prompt: - return result - while True: - confirmation_prompt = t.cast(str, confirmation_prompt) - value2 = prompt_func(confirmation_prompt) - if value2: - break - if value == value2: - return result - echo(_("Error: The two entered values do not match."), err=err) - - -def confirm( - text: str, - default: t.Optional[bool] = False, - abort: bool = False, - prompt_suffix: str = ": ", - show_default: bool = True, - err: bool = False, -) -> bool: - """Prompts for confirmation (yes/no question). - - If the user aborts the input by sending a interrupt signal this - function will catch it and raise a :exc:`Abort` exception. - - :param text: the question to ask. - :param default: The default value to use when no input is given. If - ``None``, repeat until input is given. - :param abort: if this is set to `True` a negative answer aborts the - exception by raising :exc:`Abort`. - :param prompt_suffix: a suffix that should be added to the prompt. - :param show_default: shows or hides the default value in the prompt. - :param err: if set to true the file defaults to ``stderr`` instead of - ``stdout``, the same as with echo. - - .. versionchanged:: 8.0 - Repeat until input is given if ``default`` is ``None``. - - .. versionadded:: 4.0 - Added the ``err`` parameter. - """ - prompt = _build_prompt( - text, - prompt_suffix, - show_default, - "y/n" if default is None else ("Y/n" if default else "y/N"), - ) - - while True: - try: - # Write the prompt separately so that we get nice - # coloring through colorama on Windows - echo(prompt, nl=False, err=err) - value = visible_prompt_func("").lower().strip() - except (KeyboardInterrupt, EOFError): - raise Abort() - if value in ("y", "yes"): - rv = True - elif value in ("n", "no"): - rv = False - elif default is not None and value == "": - rv = default - else: - echo(_("Error: invalid input"), err=err) - continue - break - if abort and not rv: - raise Abort() - return rv - - -def get_terminal_size() -> os.terminal_size: - """Returns the current size of the terminal as tuple in the form - ``(width, height)`` in columns and rows. - - .. deprecated:: 8.0 - Will be removed in Click 8.1. Use - :func:`shutil.get_terminal_size` instead. - """ - import shutil - import warnings - - warnings.warn( - "'click.get_terminal_size()' is deprecated and will be removed" - " in Click 8.1. Use 'shutil.get_terminal_size()' instead.", - DeprecationWarning, - stacklevel=2, - ) - return shutil.get_terminal_size() - - -def echo_via_pager( - text_or_generator: t.Union[t.Iterable[str], t.Callable[[], t.Iterable[str]], str], - color: t.Optional[bool] = None, -) -> None: - """This function takes a text and shows it via an environment specific - pager on stdout. - - .. versionchanged:: 3.0 - Added the `color` flag. - - :param text_or_generator: the text to page, or alternatively, a - generator emitting the text to page. - :param color: controls if the pager supports ANSI colors or not. The - default is autodetection. - """ - color = resolve_color_default(color) - - if inspect.isgeneratorfunction(text_or_generator): - i = t.cast(t.Callable[[], t.Iterable[str]], text_or_generator)() - elif isinstance(text_or_generator, str): - i = [text_or_generator] - else: - i = iter(t.cast(t.Iterable[str], text_or_generator)) - - # convert every element of i to a text type if necessary - text_generator = (el if isinstance(el, str) else str(el) for el in i) - - from ._termui_impl import pager - - return pager(itertools.chain(text_generator, "\n"), color) - - -def progressbar( - iterable: t.Optional[t.Iterable[V]] = None, - length: t.Optional[int] = None, - label: t.Optional[str] = None, - show_eta: bool = True, - show_percent: t.Optional[bool] = None, - show_pos: bool = False, - item_show_func: t.Optional[t.Callable[[t.Optional[V]], t.Optional[str]]] = None, - fill_char: str = "#", - empty_char: str = "-", - bar_template: str = "%(label)s [%(bar)s] %(info)s", - info_sep: str = " ", - width: int = 36, - file: t.Optional[t.TextIO] = None, - color: t.Optional[bool] = None, - update_min_steps: int = 1, -) -> "ProgressBar[V]": - """This function creates an iterable context manager that can be used - to iterate over something while showing a progress bar. It will - either iterate over the `iterable` or `length` items (that are counted - up). While iteration happens, this function will print a rendered - progress bar to the given `file` (defaults to stdout) and will attempt - to calculate remaining time and more. By default, this progress bar - will not be rendered if the file is not a terminal. - - The context manager creates the progress bar. When the context - manager is entered the progress bar is already created. With every - iteration over the progress bar, the iterable passed to the bar is - advanced and the bar is updated. When the context manager exits, - a newline is printed and the progress bar is finalized on screen. - - Note: The progress bar is currently designed for use cases where the - total progress can be expected to take at least several seconds. - Because of this, the ProgressBar class object won't display - progress that is considered too fast, and progress where the time - between steps is less than a second. - - No printing must happen or the progress bar will be unintentionally - destroyed. - - Example usage:: - - with progressbar(items) as bar: - for item in bar: - do_something_with(item) - - Alternatively, if no iterable is specified, one can manually update the - progress bar through the `update()` method instead of directly - iterating over the progress bar. The update method accepts the number - of steps to increment the bar with:: - - with progressbar(length=chunks.total_bytes) as bar: - for chunk in chunks: - process_chunk(chunk) - bar.update(chunks.bytes) - - The ``update()`` method also takes an optional value specifying the - ``current_item`` at the new position. This is useful when used - together with ``item_show_func`` to customize the output for each - manual step:: - - with click.progressbar( - length=total_size, - label='Unzipping archive', - item_show_func=lambda a: a.filename - ) as bar: - for archive in zip_file: - archive.extract() - bar.update(archive.size, archive) - - :param iterable: an iterable to iterate over. If not provided the length - is required. - :param length: the number of items to iterate over. By default the - progressbar will attempt to ask the iterator about its - length, which might or might not work. If an iterable is - also provided this parameter can be used to override the - length. If an iterable is not provided the progress bar - will iterate over a range of that length. - :param label: the label to show next to the progress bar. - :param show_eta: enables or disables the estimated time display. This is - automatically disabled if the length cannot be - determined. - :param show_percent: enables or disables the percentage display. The - default is `True` if the iterable has a length or - `False` if not. - :param show_pos: enables or disables the absolute position display. The - default is `False`. - :param item_show_func: A function called with the current item which - can return a string to show next to the progress bar. If the - function returns ``None`` nothing is shown. The current item can - be ``None``, such as when entering and exiting the bar. - :param fill_char: the character to use to show the filled part of the - progress bar. - :param empty_char: the character to use to show the non-filled part of - the progress bar. - :param bar_template: the format string to use as template for the bar. - The parameters in it are ``label`` for the label, - ``bar`` for the progress bar and ``info`` for the - info section. - :param info_sep: the separator between multiple info items (eta etc.) - :param width: the width of the progress bar in characters, 0 means full - terminal width - :param file: The file to write to. If this is not a terminal then - only the label is printed. - :param color: controls if the terminal supports ANSI colors or not. The - default is autodetection. This is only needed if ANSI - codes are included anywhere in the progress bar output - which is not the case by default. - :param update_min_steps: Render only when this many updates have - completed. This allows tuning for very fast iterators. - - .. versionchanged:: 8.0 - Output is shown even if execution time is less than 0.5 seconds. - - .. versionchanged:: 8.0 - ``item_show_func`` shows the current item, not the previous one. - - .. versionchanged:: 8.0 - Labels are echoed if the output is not a TTY. Reverts a change - in 7.0 that removed all output. - - .. versionadded:: 8.0 - Added the ``update_min_steps`` parameter. - - .. versionchanged:: 4.0 - Added the ``color`` parameter. Added the ``update`` method to - the object. - - .. versionadded:: 2.0 - """ - from ._termui_impl import ProgressBar - - color = resolve_color_default(color) - return ProgressBar( - iterable=iterable, - length=length, - show_eta=show_eta, - show_percent=show_percent, - show_pos=show_pos, - item_show_func=item_show_func, - fill_char=fill_char, - empty_char=empty_char, - bar_template=bar_template, - info_sep=info_sep, - file=file, - label=label, - width=width, - color=color, - update_min_steps=update_min_steps, - ) - - -def clear() -> None: - """Clears the terminal screen. This will have the effect of clearing - the whole visible space of the terminal and moving the cursor to the - top left. This does not do anything if not connected to a terminal. - - .. versionadded:: 2.0 - """ - if not isatty(sys.stdout): - return - if WIN: - os.system("cls") - else: - sys.stdout.write("\033[2J\033[1;1H") - - -def _interpret_color( - color: t.Union[int, t.Tuple[int, int, int], str], offset: int = 0 -) -> str: - if isinstance(color, int): - return f"{38 + offset};5;{color:d}" - - if isinstance(color, (tuple, list)): - r, g, b = color - return f"{38 + offset};2;{r:d};{g:d};{b:d}" - - return str(_ansi_colors[color] + offset) - - -def style( - text: t.Any, - fg: t.Optional[t.Union[int, t.Tuple[int, int, int], str]] = None, - bg: t.Optional[t.Union[int, t.Tuple[int, int, int], str]] = None, - bold: t.Optional[bool] = None, - dim: t.Optional[bool] = None, - underline: t.Optional[bool] = None, - overline: t.Optional[bool] = None, - italic: t.Optional[bool] = None, - blink: t.Optional[bool] = None, - reverse: t.Optional[bool] = None, - strikethrough: t.Optional[bool] = None, - reset: bool = True, -) -> str: - """Styles a text with ANSI styles and returns the new string. By - default the styling is self contained which means that at the end - of the string a reset code is issued. This can be prevented by - passing ``reset=False``. - - Examples:: - - click.echo(click.style('Hello World!', fg='green')) - click.echo(click.style('ATTENTION!', blink=True)) - click.echo(click.style('Some things', reverse=True, fg='cyan')) - click.echo(click.style('More colors', fg=(255, 12, 128), bg=117)) - - Supported color names: - - * ``black`` (might be a gray) - * ``red`` - * ``green`` - * ``yellow`` (might be an orange) - * ``blue`` - * ``magenta`` - * ``cyan`` - * ``white`` (might be light gray) - * ``bright_black`` - * ``bright_red`` - * ``bright_green`` - * ``bright_yellow`` - * ``bright_blue`` - * ``bright_magenta`` - * ``bright_cyan`` - * ``bright_white`` - * ``reset`` (reset the color code only) - - If the terminal supports it, color may also be specified as: - - - An integer in the interval [0, 255]. The terminal must support - 8-bit/256-color mode. - - An RGB tuple of three integers in [0, 255]. The terminal must - support 24-bit/true-color mode. - - See https://en.wikipedia.org/wiki/ANSI_color and - https://gist.github.com/XVilka/8346728 for more information. - - :param text: the string to style with ansi codes. - :param fg: if provided this will become the foreground color. - :param bg: if provided this will become the background color. - :param bold: if provided this will enable or disable bold mode. - :param dim: if provided this will enable or disable dim mode. This is - badly supported. - :param underline: if provided this will enable or disable underline. - :param overline: if provided this will enable or disable overline. - :param italic: if provided this will enable or disable italic. - :param blink: if provided this will enable or disable blinking. - :param reverse: if provided this will enable or disable inverse - rendering (foreground becomes background and the - other way round). - :param strikethrough: if provided this will enable or disable - striking through text. - :param reset: by default a reset-all code is added at the end of the - string which means that styles do not carry over. This - can be disabled to compose styles. - - .. versionchanged:: 8.0 - A non-string ``message`` is converted to a string. - - .. versionchanged:: 8.0 - Added support for 256 and RGB color codes. - - .. versionchanged:: 8.0 - Added the ``strikethrough``, ``italic``, and ``overline`` - parameters. - - .. versionchanged:: 7.0 - Added support for bright colors. - - .. versionadded:: 2.0 - """ - if not isinstance(text, str): - text = str(text) - - bits = [] - - if fg: - try: - bits.append(f"\033[{_interpret_color(fg)}m") - except KeyError: - raise TypeError(f"Unknown color {fg!r}") - - if bg: - try: - bits.append(f"\033[{_interpret_color(bg, 10)}m") - except KeyError: - raise TypeError(f"Unknown color {bg!r}") - - if bold is not None: - bits.append(f"\033[{1 if bold else 22}m") - if dim is not None: - bits.append(f"\033[{2 if dim else 22}m") - if underline is not None: - bits.append(f"\033[{4 if underline else 24}m") - if overline is not None: - bits.append(f"\033[{53 if underline else 55}m") - if italic is not None: - bits.append(f"\033[{5 if underline else 23}m") - if blink is not None: - bits.append(f"\033[{5 if blink else 25}m") - if reverse is not None: - bits.append(f"\033[{7 if reverse else 27}m") - if strikethrough is not None: - bits.append(f"\033[{9 if strikethrough else 29}m") - bits.append(text) - if reset: - bits.append(_ansi_reset_all) - return "".join(bits) - - -def unstyle(text: str) -> str: - """Removes ANSI styling information from a string. Usually it's not - necessary to use this function as Click's echo function will - automatically remove styling if necessary. - - .. versionadded:: 2.0 - - :param text: the text to remove style information from. - """ - return strip_ansi(text) - - -def secho( - message: t.Optional[t.Any] = None, - file: t.Optional[t.IO] = None, - nl: bool = True, - err: bool = False, - color: t.Optional[bool] = None, - **styles: t.Any, -) -> None: - """This function combines :func:`echo` and :func:`style` into one - call. As such the following two calls are the same:: - - click.secho('Hello World!', fg='green') - click.echo(click.style('Hello World!', fg='green')) - - All keyword arguments are forwarded to the underlying functions - depending on which one they go with. - - Non-string types will be converted to :class:`str`. However, - :class:`bytes` are passed directly to :meth:`echo` without applying - style. If you want to style bytes that represent text, call - :meth:`bytes.decode` first. - - .. versionchanged:: 8.0 - A non-string ``message`` is converted to a string. Bytes are - passed through without style applied. - - .. versionadded:: 2.0 - """ - if message is not None and not isinstance(message, (bytes, bytearray)): - message = style(message, **styles) - - return echo(message, file=file, nl=nl, err=err, color=color) - - -def edit( - text: t.Optional[t.AnyStr] = None, - editor: t.Optional[str] = None, - env: t.Optional[t.Mapping[str, str]] = None, - require_save: bool = True, - extension: str = ".txt", - filename: t.Optional[str] = None, -) -> t.Optional[t.AnyStr]: - r"""Edits the given text in the defined editor. If an editor is given - (should be the full path to the executable but the regular operating - system search path is used for finding the executable) it overrides - the detected editor. Optionally, some environment variables can be - used. If the editor is closed without changes, `None` is returned. In - case a file is edited directly the return value is always `None` and - `require_save` and `extension` are ignored. - - If the editor cannot be opened a :exc:`UsageError` is raised. - - Note for Windows: to simplify cross-platform usage, the newlines are - automatically converted from POSIX to Windows and vice versa. As such, - the message here will have ``\n`` as newline markers. - - :param text: the text to edit. - :param editor: optionally the editor to use. Defaults to automatic - detection. - :param env: environment variables to forward to the editor. - :param require_save: if this is true, then not saving in the editor - will make the return value become `None`. - :param extension: the extension to tell the editor about. This defaults - to `.txt` but changing this might change syntax - highlighting. - :param filename: if provided it will edit this file instead of the - provided text contents. It will not use a temporary - file as an indirection in that case. - """ - from ._termui_impl import Editor - - ed = Editor(editor=editor, env=env, require_save=require_save, extension=extension) - - if filename is None: - return ed.edit(text) - - ed.edit_file(filename) - return None - - -def launch(url: str, wait: bool = False, locate: bool = False) -> int: - """This function launches the given URL (or filename) in the default - viewer application for this file type. If this is an executable, it - might launch the executable in a new session. The return value is - the exit code of the launched application. Usually, ``0`` indicates - success. - - Examples:: - - click.launch('https://click.palletsprojects.com/') - click.launch('/my/downloaded/file', locate=True) - - .. versionadded:: 2.0 - - :param url: URL or filename of the thing to launch. - :param wait: Wait for the program to exit before returning. This - only works if the launched program blocks. In particular, - ``xdg-open`` on Linux does not block. - :param locate: if this is set to `True` then instead of launching the - application associated with the URL it will attempt to - launch a file manager with the file located. This - might have weird effects if the URL does not point to - the filesystem. - """ - from ._termui_impl import open_url - - return open_url(url, wait=wait, locate=locate) - - -# If this is provided, getchar() calls into this instead. This is used -# for unittesting purposes. -_getchar: t.Optional[t.Callable[[bool], str]] = None - - -def getchar(echo: bool = False) -> str: - """Fetches a single character from the terminal and returns it. This - will always return a unicode character and under certain rare - circumstances this might return more than one character. The - situations which more than one character is returned is when for - whatever reason multiple characters end up in the terminal buffer or - standard input was not actually a terminal. - - Note that this will always read from the terminal, even if something - is piped into the standard input. - - Note for Windows: in rare cases when typing non-ASCII characters, this - function might wait for a second character and then return both at once. - This is because certain Unicode characters look like special-key markers. - - .. versionadded:: 2.0 - - :param echo: if set to `True`, the character read will also show up on - the terminal. The default is to not show it. - """ - global _getchar - - if _getchar is None: - from ._termui_impl import getchar as f - - _getchar = f - - return _getchar(echo) - - -def raw_terminal() -> t.ContextManager[int]: - from ._termui_impl import raw_terminal as f - - return f() - - -def pause(info: t.Optional[str] = None, err: bool = False) -> None: - """This command stops execution and waits for the user to press any - key to continue. This is similar to the Windows batch "pause" - command. If the program is not run through a terminal, this command - will instead do nothing. - - .. versionadded:: 2.0 - - .. versionadded:: 4.0 - Added the `err` parameter. - - :param info: The message to print before pausing. Defaults to - ``"Press any key to continue..."``. - :param err: if set to message goes to ``stderr`` instead of - ``stdout``, the same as with echo. - """ - if not isatty(sys.stdin) or not isatty(sys.stdout): - return - - if info is None: - info = _("Press any key to continue...") - - try: - if info: - echo(info, nl=False, err=err) - try: - getchar() - except (KeyboardInterrupt, EOFError): - pass - finally: - if info: - echo(err=err) diff --git a/venv/lib/python3.8/site-packages/click/testing.py b/venv/lib/python3.8/site-packages/click/testing.py deleted file mode 100644 index d19b850..0000000 --- a/venv/lib/python3.8/site-packages/click/testing.py +++ /dev/null @@ -1,479 +0,0 @@ -import contextlib -import io -import os -import shlex -import shutil -import sys -import tempfile -import typing as t -from types import TracebackType - -from . import formatting -from . import termui -from . import utils -from ._compat import _find_binary_reader - -if t.TYPE_CHECKING: - from .core import BaseCommand - - -class EchoingStdin: - def __init__(self, input: t.BinaryIO, output: t.BinaryIO) -> None: - self._input = input - self._output = output - self._paused = False - - def __getattr__(self, x: str) -> t.Any: - return getattr(self._input, x) - - def _echo(self, rv: bytes) -> bytes: - if not self._paused: - self._output.write(rv) - - return rv - - def read(self, n: int = -1) -> bytes: - return self._echo(self._input.read(n)) - - def read1(self, n: int = -1) -> bytes: - return self._echo(self._input.read1(n)) # type: ignore - - def readline(self, n: int = -1) -> bytes: - return self._echo(self._input.readline(n)) - - def readlines(self) -> t.List[bytes]: - return [self._echo(x) for x in self._input.readlines()] - - def __iter__(self) -> t.Iterator[bytes]: - return iter(self._echo(x) for x in self._input) - - def __repr__(self) -> str: - return repr(self._input) - - -@contextlib.contextmanager -def _pause_echo(stream: t.Optional[EchoingStdin]) -> t.Iterator[None]: - if stream is None: - yield - else: - stream._paused = True - yield - stream._paused = False - - -class _NamedTextIOWrapper(io.TextIOWrapper): - def __init__( - self, buffer: t.BinaryIO, name: str, mode: str, **kwargs: t.Any - ) -> None: - super().__init__(buffer, **kwargs) - self._name = name - self._mode = mode - - @property - def name(self) -> str: - return self._name - - @property - def mode(self) -> str: - return self._mode - - -def make_input_stream( - input: t.Optional[t.Union[str, bytes, t.IO]], charset: str -) -> t.BinaryIO: - # Is already an input stream. - if hasattr(input, "read"): - rv = _find_binary_reader(t.cast(t.IO, input)) - - if rv is not None: - return rv - - raise TypeError("Could not find binary reader for input stream.") - - if input is None: - input = b"" - elif isinstance(input, str): - input = input.encode(charset) - - return io.BytesIO(t.cast(bytes, input)) - - -class Result: - """Holds the captured result of an invoked CLI script.""" - - def __init__( - self, - runner: "CliRunner", - stdout_bytes: bytes, - stderr_bytes: t.Optional[bytes], - return_value: t.Any, - exit_code: int, - exception: t.Optional[BaseException], - exc_info: t.Optional[ - t.Tuple[t.Type[BaseException], BaseException, TracebackType] - ] = None, - ): - #: The runner that created the result - self.runner = runner - #: The standard output as bytes. - self.stdout_bytes = stdout_bytes - #: The standard error as bytes, or None if not available - self.stderr_bytes = stderr_bytes - #: The value returned from the invoked command. - #: - #: .. versionadded:: 8.0 - self.return_value = return_value - #: The exit code as integer. - self.exit_code = exit_code - #: The exception that happened if one did. - self.exception = exception - #: The traceback - self.exc_info = exc_info - - @property - def output(self) -> str: - """The (standard) output as unicode string.""" - return self.stdout - - @property - def stdout(self) -> str: - """The standard output as unicode string.""" - return self.stdout_bytes.decode(self.runner.charset, "replace").replace( - "\r\n", "\n" - ) - - @property - def stderr(self) -> str: - """The standard error as unicode string.""" - if self.stderr_bytes is None: - raise ValueError("stderr not separately captured") - return self.stderr_bytes.decode(self.runner.charset, "replace").replace( - "\r\n", "\n" - ) - - def __repr__(self) -> str: - exc_str = repr(self.exception) if self.exception else "okay" - return f"<{type(self).__name__} {exc_str}>" - - -class CliRunner: - """The CLI runner provides functionality to invoke a Click command line - script for unittesting purposes in a isolated environment. This only - works in single-threaded systems without any concurrency as it changes the - global interpreter state. - - :param charset: the character set for the input and output data. - :param env: a dictionary with environment variables for overriding. - :param echo_stdin: if this is set to `True`, then reading from stdin writes - to stdout. This is useful for showing examples in - some circumstances. Note that regular prompts - will automatically echo the input. - :param mix_stderr: if this is set to `False`, then stdout and stderr are - preserved as independent streams. This is useful for - Unix-philosophy apps that have predictable stdout and - noisy stderr, such that each may be measured - independently - """ - - def __init__( - self, - charset: str = "utf-8", - env: t.Optional[t.Mapping[str, t.Optional[str]]] = None, - echo_stdin: bool = False, - mix_stderr: bool = True, - ) -> None: - self.charset = charset - self.env = env or {} - self.echo_stdin = echo_stdin - self.mix_stderr = mix_stderr - - def get_default_prog_name(self, cli: "BaseCommand") -> str: - """Given a command object it will return the default program name - for it. The default is the `name` attribute or ``"root"`` if not - set. - """ - return cli.name or "root" - - def make_env( - self, overrides: t.Optional[t.Mapping[str, t.Optional[str]]] = None - ) -> t.Mapping[str, t.Optional[str]]: - """Returns the environment overrides for invoking a script.""" - rv = dict(self.env) - if overrides: - rv.update(overrides) - return rv - - @contextlib.contextmanager - def isolation( - self, - input: t.Optional[t.Union[str, bytes, t.IO]] = None, - env: t.Optional[t.Mapping[str, t.Optional[str]]] = None, - color: bool = False, - ) -> t.Iterator[t.Tuple[io.BytesIO, t.Optional[io.BytesIO]]]: - """A context manager that sets up the isolation for invoking of a - command line tool. This sets up stdin with the given input data - and `os.environ` with the overrides from the given dictionary. - This also rebinds some internals in Click to be mocked (like the - prompt functionality). - - This is automatically done in the :meth:`invoke` method. - - :param input: the input stream to put into sys.stdin. - :param env: the environment overrides as dictionary. - :param color: whether the output should contain color codes. The - application can still override this explicitly. - - .. versionchanged:: 8.0 - ``stderr`` is opened with ``errors="backslashreplace"`` - instead of the default ``"strict"``. - - .. versionchanged:: 4.0 - Added the ``color`` parameter. - """ - bytes_input = make_input_stream(input, self.charset) - echo_input = None - - old_stdin = sys.stdin - old_stdout = sys.stdout - old_stderr = sys.stderr - old_forced_width = formatting.FORCED_WIDTH - formatting.FORCED_WIDTH = 80 - - env = self.make_env(env) - - bytes_output = io.BytesIO() - - if self.echo_stdin: - bytes_input = echo_input = t.cast( - t.BinaryIO, EchoingStdin(bytes_input, bytes_output) - ) - - sys.stdin = text_input = _NamedTextIOWrapper( - bytes_input, encoding=self.charset, name="", mode="r" - ) - - if self.echo_stdin: - # Force unbuffered reads, otherwise TextIOWrapper reads a - # large chunk which is echoed early. - text_input._CHUNK_SIZE = 1 # type: ignore - - sys.stdout = _NamedTextIOWrapper( - bytes_output, encoding=self.charset, name="", mode="w" - ) - - bytes_error = None - if self.mix_stderr: - sys.stderr = sys.stdout - else: - bytes_error = io.BytesIO() - sys.stderr = _NamedTextIOWrapper( - bytes_error, - encoding=self.charset, - name="", - mode="w", - errors="backslashreplace", - ) - - @_pause_echo(echo_input) # type: ignore - def visible_input(prompt: t.Optional[str] = None) -> str: - sys.stdout.write(prompt or "") - val = text_input.readline().rstrip("\r\n") - sys.stdout.write(f"{val}\n") - sys.stdout.flush() - return val - - @_pause_echo(echo_input) # type: ignore - def hidden_input(prompt: t.Optional[str] = None) -> str: - sys.stdout.write(f"{prompt or ''}\n") - sys.stdout.flush() - return text_input.readline().rstrip("\r\n") - - @_pause_echo(echo_input) # type: ignore - def _getchar(echo: bool) -> str: - char = sys.stdin.read(1) - - if echo: - sys.stdout.write(char) - - sys.stdout.flush() - return char - - default_color = color - - def should_strip_ansi( - stream: t.Optional[t.IO] = None, color: t.Optional[bool] = None - ) -> bool: - if color is None: - return not default_color - return not color - - old_visible_prompt_func = termui.visible_prompt_func - old_hidden_prompt_func = termui.hidden_prompt_func - old__getchar_func = termui._getchar - old_should_strip_ansi = utils.should_strip_ansi # type: ignore - termui.visible_prompt_func = visible_input - termui.hidden_prompt_func = hidden_input - termui._getchar = _getchar - utils.should_strip_ansi = should_strip_ansi # type: ignore - - old_env = {} - try: - for key, value in env.items(): - old_env[key] = os.environ.get(key) - if value is None: - try: - del os.environ[key] - except Exception: - pass - else: - os.environ[key] = value - yield (bytes_output, bytes_error) - finally: - for key, value in old_env.items(): - if value is None: - try: - del os.environ[key] - except Exception: - pass - else: - os.environ[key] = value - sys.stdout = old_stdout - sys.stderr = old_stderr - sys.stdin = old_stdin - termui.visible_prompt_func = old_visible_prompt_func - termui.hidden_prompt_func = old_hidden_prompt_func - termui._getchar = old__getchar_func - utils.should_strip_ansi = old_should_strip_ansi # type: ignore - formatting.FORCED_WIDTH = old_forced_width - - def invoke( - self, - cli: "BaseCommand", - args: t.Optional[t.Union[str, t.Sequence[str]]] = None, - input: t.Optional[t.Union[str, bytes, t.IO]] = None, - env: t.Optional[t.Mapping[str, t.Optional[str]]] = None, - catch_exceptions: bool = True, - color: bool = False, - **extra: t.Any, - ) -> Result: - """Invokes a command in an isolated environment. The arguments are - forwarded directly to the command line script, the `extra` keyword - arguments are passed to the :meth:`~clickpkg.Command.main` function of - the command. - - This returns a :class:`Result` object. - - :param cli: the command to invoke - :param args: the arguments to invoke. It may be given as an iterable - or a string. When given as string it will be interpreted - as a Unix shell command. More details at - :func:`shlex.split`. - :param input: the input data for `sys.stdin`. - :param env: the environment overrides. - :param catch_exceptions: Whether to catch any other exceptions than - ``SystemExit``. - :param extra: the keyword arguments to pass to :meth:`main`. - :param color: whether the output should contain color codes. The - application can still override this explicitly. - - .. versionchanged:: 8.0 - The result object has the ``return_value`` attribute with - the value returned from the invoked command. - - .. versionchanged:: 4.0 - Added the ``color`` parameter. - - .. versionchanged:: 3.0 - Added the ``catch_exceptions`` parameter. - - .. versionchanged:: 3.0 - The result object has the ``exc_info`` attribute with the - traceback if available. - """ - exc_info = None - with self.isolation(input=input, env=env, color=color) as outstreams: - return_value = None - exception: t.Optional[BaseException] = None - exit_code = 0 - - if isinstance(args, str): - args = shlex.split(args) - - try: - prog_name = extra.pop("prog_name") - except KeyError: - prog_name = self.get_default_prog_name(cli) - - try: - return_value = cli.main(args=args or (), prog_name=prog_name, **extra) - except SystemExit as e: - exc_info = sys.exc_info() - e_code = t.cast(t.Optional[t.Union[int, t.Any]], e.code) - - if e_code is None: - e_code = 0 - - if e_code != 0: - exception = e - - if not isinstance(e_code, int): - sys.stdout.write(str(e_code)) - sys.stdout.write("\n") - e_code = 1 - - exit_code = e_code - - except Exception as e: - if not catch_exceptions: - raise - exception = e - exit_code = 1 - exc_info = sys.exc_info() - finally: - sys.stdout.flush() - stdout = outstreams[0].getvalue() - if self.mix_stderr: - stderr = None - else: - stderr = outstreams[1].getvalue() # type: ignore - - return Result( - runner=self, - stdout_bytes=stdout, - stderr_bytes=stderr, - return_value=return_value, - exit_code=exit_code, - exception=exception, - exc_info=exc_info, # type: ignore - ) - - @contextlib.contextmanager - def isolated_filesystem( - self, temp_dir: t.Optional[t.Union[str, os.PathLike]] = None - ) -> t.Iterator[str]: - """A context manager that creates a temporary directory and - changes the current working directory to it. This isolates tests - that affect the contents of the CWD to prevent them from - interfering with each other. - - :param temp_dir: Create the temporary directory under this - directory. If given, the created directory is not removed - when exiting. - - .. versionchanged:: 8.0 - Added the ``temp_dir`` parameter. - """ - cwd = os.getcwd() - t = tempfile.mkdtemp(dir=temp_dir) - os.chdir(t) - - try: - yield t - finally: - os.chdir(cwd) - - if temp_dir is None: - try: - shutil.rmtree(t) - except OSError: # noqa: B014 - pass diff --git a/venv/lib/python3.8/site-packages/click/types.py b/venv/lib/python3.8/site-packages/click/types.py deleted file mode 100644 index 21f0e4f..0000000 --- a/venv/lib/python3.8/site-packages/click/types.py +++ /dev/null @@ -1,1052 +0,0 @@ -import os -import stat -import typing as t -from datetime import datetime -from gettext import gettext as _ -from gettext import ngettext - -from ._compat import _get_argv_encoding -from ._compat import get_filesystem_encoding -from ._compat import open_stream -from .exceptions import BadParameter -from .utils import LazyFile -from .utils import safecall - -if t.TYPE_CHECKING: - import typing_extensions as te - from .core import Context - from .core import Parameter - from .shell_completion import CompletionItem - - -class ParamType: - """Represents the type of a parameter. Validates and converts values - from the command line or Python into the correct type. - - To implement a custom type, subclass and implement at least the - following: - - - The :attr:`name` class attribute must be set. - - Calling an instance of the type with ``None`` must return - ``None``. This is already implemented by default. - - :meth:`convert` must convert string values to the correct type. - - :meth:`convert` must accept values that are already the correct - type. - - It must be able to convert a value if the ``ctx`` and ``param`` - arguments are ``None``. This can occur when converting prompt - input. - """ - - is_composite: t.ClassVar[bool] = False - arity: t.ClassVar[int] = 1 - - #: the descriptive name of this type - name: str - - #: if a list of this type is expected and the value is pulled from a - #: string environment variable, this is what splits it up. `None` - #: means any whitespace. For all parameters the general rule is that - #: whitespace splits them up. The exception are paths and files which - #: are split by ``os.path.pathsep`` by default (":" on Unix and ";" on - #: Windows). - envvar_list_splitter: t.ClassVar[t.Optional[str]] = None - - def to_info_dict(self) -> t.Dict[str, t.Any]: - """Gather information that could be useful for a tool generating - user-facing documentation. - - Use :meth:`click.Context.to_info_dict` to traverse the entire - CLI structure. - - .. versionadded:: 8.0 - """ - # The class name without the "ParamType" suffix. - param_type = type(self).__name__.partition("ParamType")[0] - param_type = param_type.partition("ParameterType")[0] - return {"param_type": param_type, "name": self.name} - - def __call__( - self, - value: t.Any, - param: t.Optional["Parameter"] = None, - ctx: t.Optional["Context"] = None, - ) -> t.Any: - if value is not None: - return self.convert(value, param, ctx) - - def get_metavar(self, param: "Parameter") -> t.Optional[str]: - """Returns the metavar default for this param if it provides one.""" - - def get_missing_message(self, param: "Parameter") -> t.Optional[str]: - """Optionally might return extra information about a missing - parameter. - - .. versionadded:: 2.0 - """ - - def convert( - self, value: t.Any, param: t.Optional["Parameter"], ctx: t.Optional["Context"] - ) -> t.Any: - """Convert the value to the correct type. This is not called if - the value is ``None`` (the missing value). - - This must accept string values from the command line, as well as - values that are already the correct type. It may also convert - other compatible types. - - The ``param`` and ``ctx`` arguments may be ``None`` in certain - situations, such as when converting prompt input. - - If the value cannot be converted, call :meth:`fail` with a - descriptive message. - - :param value: The value to convert. - :param param: The parameter that is using this type to convert - its value. May be ``None``. - :param ctx: The current context that arrived at this value. May - be ``None``. - """ - return value - - def split_envvar_value(self, rv: str) -> t.Sequence[str]: - """Given a value from an environment variable this splits it up - into small chunks depending on the defined envvar list splitter. - - If the splitter is set to `None`, which means that whitespace splits, - then leading and trailing whitespace is ignored. Otherwise, leading - and trailing splitters usually lead to empty items being included. - """ - return (rv or "").split(self.envvar_list_splitter) - - def fail( - self, - message: str, - param: t.Optional["Parameter"] = None, - ctx: t.Optional["Context"] = None, - ) -> "t.NoReturn": - """Helper method to fail with an invalid value message.""" - raise BadParameter(message, ctx=ctx, param=param) - - def shell_complete( - self, ctx: "Context", param: "Parameter", incomplete: str - ) -> t.List["CompletionItem"]: - """Return a list of - :class:`~click.shell_completion.CompletionItem` objects for the - incomplete value. Most types do not provide completions, but - some do, and this allows custom types to provide custom - completions as well. - - :param ctx: Invocation context for this command. - :param param: The parameter that is requesting completion. - :param incomplete: Value being completed. May be empty. - - .. versionadded:: 8.0 - """ - return [] - - -class CompositeParamType(ParamType): - is_composite = True - - @property - def arity(self) -> int: # type: ignore - raise NotImplementedError() - - -class FuncParamType(ParamType): - def __init__(self, func: t.Callable[[t.Any], t.Any]) -> None: - self.name = func.__name__ - self.func = func - - def to_info_dict(self) -> t.Dict[str, t.Any]: - info_dict = super().to_info_dict() - info_dict["func"] = self.func - return info_dict - - def convert( - self, value: t.Any, param: t.Optional["Parameter"], ctx: t.Optional["Context"] - ) -> t.Any: - try: - return self.func(value) - except ValueError: - try: - value = str(value) - except UnicodeError: - value = value.decode("utf-8", "replace") - - self.fail(value, param, ctx) - - -class UnprocessedParamType(ParamType): - name = "text" - - def convert( - self, value: t.Any, param: t.Optional["Parameter"], ctx: t.Optional["Context"] - ) -> t.Any: - return value - - def __repr__(self) -> str: - return "UNPROCESSED" - - -class StringParamType(ParamType): - name = "text" - - def convert( - self, value: t.Any, param: t.Optional["Parameter"], ctx: t.Optional["Context"] - ) -> t.Any: - if isinstance(value, bytes): - enc = _get_argv_encoding() - try: - value = value.decode(enc) - except UnicodeError: - fs_enc = get_filesystem_encoding() - if fs_enc != enc: - try: - value = value.decode(fs_enc) - except UnicodeError: - value = value.decode("utf-8", "replace") - else: - value = value.decode("utf-8", "replace") - return value - return str(value) - - def __repr__(self) -> str: - return "STRING" - - -class Choice(ParamType): - """The choice type allows a value to be checked against a fixed set - of supported values. All of these values have to be strings. - - You should only pass a list or tuple of choices. Other iterables - (like generators) may lead to surprising results. - - The resulting value will always be one of the originally passed choices - regardless of ``case_sensitive`` or any ``ctx.token_normalize_func`` - being specified. - - See :ref:`choice-opts` for an example. - - :param case_sensitive: Set to false to make choices case - insensitive. Defaults to true. - """ - - name = "choice" - - def __init__(self, choices: t.Sequence[str], case_sensitive: bool = True) -> None: - self.choices = choices - self.case_sensitive = case_sensitive - - def to_info_dict(self) -> t.Dict[str, t.Any]: - info_dict = super().to_info_dict() - info_dict["choices"] = self.choices - info_dict["case_sensitive"] = self.case_sensitive - return info_dict - - def get_metavar(self, param: "Parameter") -> str: - choices_str = "|".join(self.choices) - - # Use curly braces to indicate a required argument. - if param.required and param.param_type_name == "argument": - return f"{{{choices_str}}}" - - # Use square braces to indicate an option or optional argument. - return f"[{choices_str}]" - - def get_missing_message(self, param: "Parameter") -> str: - return _("Choose from:\n\t{choices}").format(choices=",\n\t".join(self.choices)) - - def convert( - self, value: t.Any, param: t.Optional["Parameter"], ctx: t.Optional["Context"] - ) -> t.Any: - # Match through normalization and case sensitivity - # first do token_normalize_func, then lowercase - # preserve original `value` to produce an accurate message in - # `self.fail` - normed_value = value - normed_choices = {choice: choice for choice in self.choices} - - if ctx is not None and ctx.token_normalize_func is not None: - normed_value = ctx.token_normalize_func(value) - normed_choices = { - ctx.token_normalize_func(normed_choice): original - for normed_choice, original in normed_choices.items() - } - - if not self.case_sensitive: - normed_value = normed_value.casefold() - normed_choices = { - normed_choice.casefold(): original - for normed_choice, original in normed_choices.items() - } - - if normed_value in normed_choices: - return normed_choices[normed_value] - - choices_str = ", ".join(map(repr, self.choices)) - self.fail( - ngettext( - "{value!r} is not {choice}.", - "{value!r} is not one of {choices}.", - len(self.choices), - ).format(value=value, choice=choices_str, choices=choices_str), - param, - ctx, - ) - - def __repr__(self) -> str: - return f"Choice({list(self.choices)})" - - def shell_complete( - self, ctx: "Context", param: "Parameter", incomplete: str - ) -> t.List["CompletionItem"]: - """Complete choices that start with the incomplete value. - - :param ctx: Invocation context for this command. - :param param: The parameter that is requesting completion. - :param incomplete: Value being completed. May be empty. - - .. versionadded:: 8.0 - """ - from click.shell_completion import CompletionItem - - str_choices = map(str, self.choices) - - if self.case_sensitive: - matched = (c for c in str_choices if c.startswith(incomplete)) - else: - incomplete = incomplete.lower() - matched = (c for c in str_choices if c.lower().startswith(incomplete)) - - return [CompletionItem(c) for c in matched] - - -class DateTime(ParamType): - """The DateTime type converts date strings into `datetime` objects. - - The format strings which are checked are configurable, but default to some - common (non-timezone aware) ISO 8601 formats. - - When specifying *DateTime* formats, you should only pass a list or a tuple. - Other iterables, like generators, may lead to surprising results. - - The format strings are processed using ``datetime.strptime``, and this - consequently defines the format strings which are allowed. - - Parsing is tried using each format, in order, and the first format which - parses successfully is used. - - :param formats: A list or tuple of date format strings, in the order in - which they should be tried. Defaults to - ``'%Y-%m-%d'``, ``'%Y-%m-%dT%H:%M:%S'``, - ``'%Y-%m-%d %H:%M:%S'``. - """ - - name = "datetime" - - def __init__(self, formats: t.Optional[t.Sequence[str]] = None): - self.formats = formats or ["%Y-%m-%d", "%Y-%m-%dT%H:%M:%S", "%Y-%m-%d %H:%M:%S"] - - def to_info_dict(self) -> t.Dict[str, t.Any]: - info_dict = super().to_info_dict() - info_dict["formats"] = self.formats - return info_dict - - def get_metavar(self, param: "Parameter") -> str: - return f"[{'|'.join(self.formats)}]" - - def _try_to_convert_date(self, value: t.Any, format: str) -> t.Optional[datetime]: - try: - return datetime.strptime(value, format) - except ValueError: - return None - - def convert( - self, value: t.Any, param: t.Optional["Parameter"], ctx: t.Optional["Context"] - ) -> t.Any: - if isinstance(value, datetime): - return value - - for format in self.formats: - converted = self._try_to_convert_date(value, format) - - if converted is not None: - return converted - - formats_str = ", ".join(map(repr, self.formats)) - self.fail( - ngettext( - "{value!r} does not match the format {format}.", - "{value!r} does not match the formats {formats}.", - len(self.formats), - ).format(value=value, format=formats_str, formats=formats_str), - param, - ctx, - ) - - def __repr__(self) -> str: - return "DateTime" - - -class _NumberParamTypeBase(ParamType): - _number_class: t.ClassVar[t.Type] - - def convert( - self, value: t.Any, param: t.Optional["Parameter"], ctx: t.Optional["Context"] - ) -> t.Any: - try: - return self._number_class(value) - except ValueError: - self.fail( - _("{value!r} is not a valid {number_type}.").format( - value=value, number_type=self.name - ), - param, - ctx, - ) - - -class _NumberRangeBase(_NumberParamTypeBase): - def __init__( - self, - min: t.Optional[float] = None, - max: t.Optional[float] = None, - min_open: bool = False, - max_open: bool = False, - clamp: bool = False, - ) -> None: - self.min = min - self.max = max - self.min_open = min_open - self.max_open = max_open - self.clamp = clamp - - def to_info_dict(self) -> t.Dict[str, t.Any]: - info_dict = super().to_info_dict() - info_dict.update( - min=self.min, - max=self.max, - min_open=self.min_open, - max_open=self.max_open, - clamp=self.clamp, - ) - return info_dict - - def convert( - self, value: t.Any, param: t.Optional["Parameter"], ctx: t.Optional["Context"] - ) -> t.Any: - import operator - - rv = super().convert(value, param, ctx) - lt_min: bool = self.min is not None and ( - operator.le if self.min_open else operator.lt - )(rv, self.min) - gt_max: bool = self.max is not None and ( - operator.ge if self.max_open else operator.gt - )(rv, self.max) - - if self.clamp: - if lt_min: - return self._clamp(self.min, 1, self.min_open) # type: ignore - - if gt_max: - return self._clamp(self.max, -1, self.max_open) # type: ignore - - if lt_min or gt_max: - self.fail( - _("{value} is not in the range {range}.").format( - value=rv, range=self._describe_range() - ), - param, - ctx, - ) - - return rv - - def _clamp(self, bound: float, dir: "te.Literal[1, -1]", open: bool) -> float: - """Find the valid value to clamp to bound in the given - direction. - - :param bound: The boundary value. - :param dir: 1 or -1 indicating the direction to move. - :param open: If true, the range does not include the bound. - """ - raise NotImplementedError - - def _describe_range(self) -> str: - """Describe the range for use in help text.""" - if self.min is None: - op = "<" if self.max_open else "<=" - return f"x{op}{self.max}" - - if self.max is None: - op = ">" if self.min_open else ">=" - return f"x{op}{self.min}" - - lop = "<" if self.min_open else "<=" - rop = "<" if self.max_open else "<=" - return f"{self.min}{lop}x{rop}{self.max}" - - def __repr__(self) -> str: - clamp = " clamped" if self.clamp else "" - return f"<{type(self).__name__} {self._describe_range()}{clamp}>" - - -class IntParamType(_NumberParamTypeBase): - name = "integer" - _number_class = int - - def __repr__(self) -> str: - return "INT" - - -class IntRange(_NumberRangeBase, IntParamType): - """Restrict an :data:`click.INT` value to a range of accepted - values. See :ref:`ranges`. - - If ``min`` or ``max`` are not passed, any value is accepted in that - direction. If ``min_open`` or ``max_open`` are enabled, the - corresponding boundary is not included in the range. - - If ``clamp`` is enabled, a value outside the range is clamped to the - boundary instead of failing. - - .. versionchanged:: 8.0 - Added the ``min_open`` and ``max_open`` parameters. - """ - - name = "integer range" - - def _clamp( # type: ignore - self, bound: int, dir: "te.Literal[1, -1]", open: bool - ) -> int: - if not open: - return bound - - return bound + dir - - -class FloatParamType(_NumberParamTypeBase): - name = "float" - _number_class = float - - def __repr__(self) -> str: - return "FLOAT" - - -class FloatRange(_NumberRangeBase, FloatParamType): - """Restrict a :data:`click.FLOAT` value to a range of accepted - values. See :ref:`ranges`. - - If ``min`` or ``max`` are not passed, any value is accepted in that - direction. If ``min_open`` or ``max_open`` are enabled, the - corresponding boundary is not included in the range. - - If ``clamp`` is enabled, a value outside the range is clamped to the - boundary instead of failing. This is not supported if either - boundary is marked ``open``. - - .. versionchanged:: 8.0 - Added the ``min_open`` and ``max_open`` parameters. - """ - - name = "float range" - - def __init__( - self, - min: t.Optional[float] = None, - max: t.Optional[float] = None, - min_open: bool = False, - max_open: bool = False, - clamp: bool = False, - ) -> None: - super().__init__( - min=min, max=max, min_open=min_open, max_open=max_open, clamp=clamp - ) - - if (min_open or max_open) and clamp: - raise TypeError("Clamping is not supported for open bounds.") - - def _clamp(self, bound: float, dir: "te.Literal[1, -1]", open: bool) -> float: - if not open: - return bound - - # Could use Python 3.9's math.nextafter here, but clamping an - # open float range doesn't seem to be particularly useful. It's - # left up to the user to write a callback to do it if needed. - raise RuntimeError("Clamping is not supported for open bounds.") - - -class BoolParamType(ParamType): - name = "boolean" - - def convert( - self, value: t.Any, param: t.Optional["Parameter"], ctx: t.Optional["Context"] - ) -> t.Any: - if value in {False, True}: - return bool(value) - - norm = value.strip().lower() - - if norm in {"1", "true", "t", "yes", "y", "on"}: - return True - - if norm in {"0", "false", "f", "no", "n", "off"}: - return False - - self.fail( - _("{value!r} is not a valid boolean.").format(value=value), param, ctx - ) - - def __repr__(self) -> str: - return "BOOL" - - -class UUIDParameterType(ParamType): - name = "uuid" - - def convert( - self, value: t.Any, param: t.Optional["Parameter"], ctx: t.Optional["Context"] - ) -> t.Any: - import uuid - - if isinstance(value, uuid.UUID): - return value - - value = value.strip() - - try: - return uuid.UUID(value) - except ValueError: - self.fail( - _("{value!r} is not a valid UUID.").format(value=value), param, ctx - ) - - def __repr__(self) -> str: - return "UUID" - - -class File(ParamType): - """Declares a parameter to be a file for reading or writing. The file - is automatically closed once the context tears down (after the command - finished working). - - Files can be opened for reading or writing. The special value ``-`` - indicates stdin or stdout depending on the mode. - - By default, the file is opened for reading text data, but it can also be - opened in binary mode or for writing. The encoding parameter can be used - to force a specific encoding. - - The `lazy` flag controls if the file should be opened immediately or upon - first IO. The default is to be non-lazy for standard input and output - streams as well as files opened for reading, `lazy` otherwise. When opening a - file lazily for reading, it is still opened temporarily for validation, but - will not be held open until first IO. lazy is mainly useful when opening - for writing to avoid creating the file until it is needed. - - Starting with Click 2.0, files can also be opened atomically in which - case all writes go into a separate file in the same folder and upon - completion the file will be moved over to the original location. This - is useful if a file regularly read by other users is modified. - - See :ref:`file-args` for more information. - """ - - name = "filename" - envvar_list_splitter = os.path.pathsep - - def __init__( - self, - mode: str = "r", - encoding: t.Optional[str] = None, - errors: t.Optional[str] = "strict", - lazy: t.Optional[bool] = None, - atomic: bool = False, - ) -> None: - self.mode = mode - self.encoding = encoding - self.errors = errors - self.lazy = lazy - self.atomic = atomic - - def to_info_dict(self) -> t.Dict[str, t.Any]: - info_dict = super().to_info_dict() - info_dict.update(mode=self.mode, encoding=self.encoding) - return info_dict - - def resolve_lazy_flag(self, value: t.Any) -> bool: - if self.lazy is not None: - return self.lazy - if value == "-": - return False - elif "w" in self.mode: - return True - return False - - def convert( - self, value: t.Any, param: t.Optional["Parameter"], ctx: t.Optional["Context"] - ) -> t.Any: - try: - if hasattr(value, "read") or hasattr(value, "write"): - return value - - lazy = self.resolve_lazy_flag(value) - - if lazy: - f: t.IO = t.cast( - t.IO, - LazyFile( - value, self.mode, self.encoding, self.errors, atomic=self.atomic - ), - ) - - if ctx is not None: - ctx.call_on_close(f.close_intelligently) # type: ignore - - return f - - f, should_close = open_stream( - value, self.mode, self.encoding, self.errors, atomic=self.atomic - ) - - # If a context is provided, we automatically close the file - # at the end of the context execution (or flush out). If a - # context does not exist, it's the caller's responsibility to - # properly close the file. This for instance happens when the - # type is used with prompts. - if ctx is not None: - if should_close: - ctx.call_on_close(safecall(f.close)) - else: - ctx.call_on_close(safecall(f.flush)) - - return f - except OSError as e: # noqa: B014 - self.fail(f"{os.fsdecode(value)!r}: {e.strerror}", param, ctx) - - def shell_complete( - self, ctx: "Context", param: "Parameter", incomplete: str - ) -> t.List["CompletionItem"]: - """Return a special completion marker that tells the completion - system to use the shell to provide file path completions. - - :param ctx: Invocation context for this command. - :param param: The parameter that is requesting completion. - :param incomplete: Value being completed. May be empty. - - .. versionadded:: 8.0 - """ - from click.shell_completion import CompletionItem - - return [CompletionItem(incomplete, type="file")] - - -class Path(ParamType): - """The path type is similar to the :class:`File` type but it performs - different checks. First of all, instead of returning an open file - handle it returns just the filename. Secondly, it can perform various - basic checks about what the file or directory should be. - - :param exists: if set to true, the file or directory needs to exist for - this value to be valid. If this is not required and a - file does indeed not exist, then all further checks are - silently skipped. - :param file_okay: controls if a file is a possible value. - :param dir_okay: controls if a directory is a possible value. - :param writable: if true, a writable check is performed. - :param readable: if true, a readable check is performed. - :param resolve_path: if this is true, then the path is fully resolved - before the value is passed onwards. This means - that it's absolute and symlinks are resolved. It - will not expand a tilde-prefix, as this is - supposed to be done by the shell only. - :param allow_dash: If this is set to `True`, a single dash to indicate - standard streams is permitted. - :param path_type: Convert the incoming path value to this type. If - ``None``, keep Python's default, which is ``str``. Useful to - convert to :class:`pathlib.Path`. - - .. versionchanged:: 8.0 - Allow passing ``type=pathlib.Path``. - - .. versionchanged:: 6.0 - Added the ``allow_dash`` parameter. - """ - - envvar_list_splitter = os.path.pathsep - - def __init__( - self, - exists: bool = False, - file_okay: bool = True, - dir_okay: bool = True, - writable: bool = False, - readable: bool = True, - resolve_path: bool = False, - allow_dash: bool = False, - path_type: t.Optional[t.Type] = None, - ): - self.exists = exists - self.file_okay = file_okay - self.dir_okay = dir_okay - self.writable = writable - self.readable = readable - self.resolve_path = resolve_path - self.allow_dash = allow_dash - self.type = path_type - - if self.file_okay and not self.dir_okay: - self.name = _("file") - elif self.dir_okay and not self.file_okay: - self.name = _("directory") - else: - self.name = _("path") - - def to_info_dict(self) -> t.Dict[str, t.Any]: - info_dict = super().to_info_dict() - info_dict.update( - exists=self.exists, - file_okay=self.file_okay, - dir_okay=self.dir_okay, - writable=self.writable, - readable=self.readable, - allow_dash=self.allow_dash, - ) - return info_dict - - def coerce_path_result(self, rv: t.Any) -> t.Any: - if self.type is not None and not isinstance(rv, self.type): - if self.type is str: - rv = os.fsdecode(rv) - elif self.type is bytes: - rv = os.fsencode(rv) - else: - rv = self.type(rv) - - return rv - - def convert( - self, value: t.Any, param: t.Optional["Parameter"], ctx: t.Optional["Context"] - ) -> t.Any: - rv = value - - is_dash = self.file_okay and self.allow_dash and rv in (b"-", "-") - - if not is_dash: - if self.resolve_path: - # realpath on Windows Python < 3.8 doesn't resolve symlinks - if os.path.islink(rv): - rv = os.readlink(rv) - - rv = os.path.realpath(rv) - - try: - st = os.stat(rv) - except OSError: - if not self.exists: - return self.coerce_path_result(rv) - self.fail( - _("{name} {filename!r} does not exist.").format( - name=self.name.title(), filename=os.fsdecode(value) - ), - param, - ctx, - ) - - if not self.file_okay and stat.S_ISREG(st.st_mode): - self.fail( - _("{name} {filename!r} is a file.").format( - name=self.name.title(), filename=os.fsdecode(value) - ), - param, - ctx, - ) - if not self.dir_okay and stat.S_ISDIR(st.st_mode): - self.fail( - _("{name} {filename!r} is a directory.").format( - name=self.name.title(), filename=os.fsdecode(value) - ), - param, - ctx, - ) - if self.writable and not os.access(value, os.W_OK): - self.fail( - _("{name} {filename!r} is not writable.").format( - name=self.name.title(), filename=os.fsdecode(value) - ), - param, - ctx, - ) - if self.readable and not os.access(value, os.R_OK): - self.fail( - _("{name} {filename!r} is not readable.").format( - name=self.name.title(), filename=os.fsdecode(value) - ), - param, - ctx, - ) - - return self.coerce_path_result(rv) - - def shell_complete( - self, ctx: "Context", param: "Parameter", incomplete: str - ) -> t.List["CompletionItem"]: - """Return a special completion marker that tells the completion - system to use the shell to provide path completions for only - directories or any paths. - - :param ctx: Invocation context for this command. - :param param: The parameter that is requesting completion. - :param incomplete: Value being completed. May be empty. - - .. versionadded:: 8.0 - """ - from click.shell_completion import CompletionItem - - type = "dir" if self.dir_okay and not self.file_okay else "file" - return [CompletionItem(incomplete, type=type)] - - -class Tuple(CompositeParamType): - """The default behavior of Click is to apply a type on a value directly. - This works well in most cases, except for when `nargs` is set to a fixed - count and different types should be used for different items. In this - case the :class:`Tuple` type can be used. This type can only be used - if `nargs` is set to a fixed number. - - For more information see :ref:`tuple-type`. - - This can be selected by using a Python tuple literal as a type. - - :param types: a list of types that should be used for the tuple items. - """ - - def __init__(self, types: t.Sequence[t.Union[t.Type, ParamType]]) -> None: - self.types = [convert_type(ty) for ty in types] - - def to_info_dict(self) -> t.Dict[str, t.Any]: - info_dict = super().to_info_dict() - info_dict["types"] = [t.to_info_dict() for t in self.types] - return info_dict - - @property - def name(self) -> str: # type: ignore - return f"<{' '.join(ty.name for ty in self.types)}>" - - @property - def arity(self) -> int: # type: ignore - return len(self.types) - - def convert( - self, value: t.Any, param: t.Optional["Parameter"], ctx: t.Optional["Context"] - ) -> t.Any: - len_type = len(self.types) - len_value = len(value) - - if len_value != len_type: - self.fail( - ngettext( - "{len_type} values are required, but {len_value} was given.", - "{len_type} values are required, but {len_value} were given.", - len_value, - ).format(len_type=len_type, len_value=len_value), - param=param, - ctx=ctx, - ) - - return tuple(ty(x, param, ctx) for ty, x in zip(self.types, value)) - - -def convert_type(ty: t.Optional[t.Any], default: t.Optional[t.Any] = None) -> ParamType: - """Find the most appropriate :class:`ParamType` for the given Python - type. If the type isn't provided, it can be inferred from a default - value. - """ - guessed_type = False - - if ty is None and default is not None: - if isinstance(default, (tuple, list)): - # If the default is empty, ty will remain None and will - # return STRING. - if default: - item = default[0] - - # A tuple of tuples needs to detect the inner types. - # Can't call convert recursively because that would - # incorrectly unwind the tuple to a single type. - if isinstance(item, (tuple, list)): - ty = tuple(map(type, item)) - else: - ty = type(item) - else: - ty = type(default) - - guessed_type = True - - if isinstance(ty, tuple): - return Tuple(ty) - - if isinstance(ty, ParamType): - return ty - - if ty is str or ty is None: - return STRING - - if ty is int: - return INT - - if ty is float: - return FLOAT - - if ty is bool: - return BOOL - - if guessed_type: - return STRING - - if __debug__: - try: - if issubclass(ty, ParamType): - raise AssertionError( - f"Attempted to use an uninstantiated parameter type ({ty})." - ) - except TypeError: - # ty is an instance (correct), so issubclass fails. - pass - - return FuncParamType(ty) - - -#: A dummy parameter type that just does nothing. From a user's -#: perspective this appears to just be the same as `STRING` but -#: internally no string conversion takes place if the input was bytes. -#: This is usually useful when working with file paths as they can -#: appear in bytes and unicode. -#: -#: For path related uses the :class:`Path` type is a better choice but -#: there are situations where an unprocessed type is useful which is why -#: it is is provided. -#: -#: .. versionadded:: 4.0 -UNPROCESSED = UnprocessedParamType() - -#: A unicode string parameter type which is the implicit default. This -#: can also be selected by using ``str`` as type. -STRING = StringParamType() - -#: An integer parameter. This can also be selected by using ``int`` as -#: type. -INT = IntParamType() - -#: A floating point value parameter. This can also be selected by using -#: ``float`` as type. -FLOAT = FloatParamType() - -#: A boolean parameter. This is the default for boolean flags. This can -#: also be selected by using ``bool`` as a type. -BOOL = BoolParamType() - -#: A UUID parameter. -UUID = UUIDParameterType() diff --git a/venv/lib/python3.8/site-packages/click/utils.py b/venv/lib/python3.8/site-packages/click/utils.py deleted file mode 100644 index 91a372d..0000000 --- a/venv/lib/python3.8/site-packages/click/utils.py +++ /dev/null @@ -1,579 +0,0 @@ -import os -import sys -import typing as t -from functools import update_wrapper -from types import ModuleType - -from ._compat import _default_text_stderr -from ._compat import _default_text_stdout -from ._compat import _find_binary_writer -from ._compat import auto_wrap_for_ansi -from ._compat import binary_streams -from ._compat import get_filesystem_encoding -from ._compat import open_stream -from ._compat import should_strip_ansi -from ._compat import strip_ansi -from ._compat import text_streams -from ._compat import WIN -from .globals import resolve_color_default - -if t.TYPE_CHECKING: - import typing_extensions as te - -F = t.TypeVar("F", bound=t.Callable[..., t.Any]) - - -def _posixify(name: str) -> str: - return "-".join(name.split()).lower() - - -def safecall(func: F) -> F: - """Wraps a function so that it swallows exceptions.""" - - def wrapper(*args, **kwargs): # type: ignore - try: - return func(*args, **kwargs) - except Exception: - pass - - return update_wrapper(t.cast(F, wrapper), func) - - -def make_str(value: t.Any) -> str: - """Converts a value into a valid string.""" - if isinstance(value, bytes): - try: - return value.decode(get_filesystem_encoding()) - except UnicodeError: - return value.decode("utf-8", "replace") - return str(value) - - -def make_default_short_help(help: str, max_length: int = 45) -> str: - """Returns a condensed version of help string.""" - # Consider only the first paragraph. - paragraph_end = help.find("\n\n") - - if paragraph_end != -1: - help = help[:paragraph_end] - - # Collapse newlines, tabs, and spaces. - words = help.split() - - if not words: - return "" - - # The first paragraph started with a "no rewrap" marker, ignore it. - if words[0] == "\b": - words = words[1:] - - total_length = 0 - last_index = len(words) - 1 - - for i, word in enumerate(words): - total_length += len(word) + (i > 0) - - if total_length > max_length: # too long, truncate - break - - if word[-1] == ".": # sentence end, truncate without "..." - return " ".join(words[: i + 1]) - - if total_length == max_length and i != last_index: - break # not at sentence end, truncate with "..." - else: - return " ".join(words) # no truncation needed - - # Account for the length of the suffix. - total_length += len("...") - - # remove words until the length is short enough - while i > 0: - total_length -= len(words[i]) + (i > 0) - - if total_length <= max_length: - break - - i -= 1 - - return " ".join(words[:i]) + "..." - - -class LazyFile: - """A lazy file works like a regular file but it does not fully open - the file but it does perform some basic checks early to see if the - filename parameter does make sense. This is useful for safely opening - files for writing. - """ - - def __init__( - self, - filename: str, - mode: str = "r", - encoding: t.Optional[str] = None, - errors: t.Optional[str] = "strict", - atomic: bool = False, - ): - self.name = filename - self.mode = mode - self.encoding = encoding - self.errors = errors - self.atomic = atomic - self._f: t.Optional[t.IO] - - if filename == "-": - self._f, self.should_close = open_stream(filename, mode, encoding, errors) - else: - if "r" in mode: - # Open and close the file in case we're opening it for - # reading so that we can catch at least some errors in - # some cases early. - open(filename, mode).close() - self._f = None - self.should_close = True - - def __getattr__(self, name: str) -> t.Any: - return getattr(self.open(), name) - - def __repr__(self) -> str: - if self._f is not None: - return repr(self._f) - return f"" - - def open(self) -> t.IO: - """Opens the file if it's not yet open. This call might fail with - a :exc:`FileError`. Not handling this error will produce an error - that Click shows. - """ - if self._f is not None: - return self._f - try: - rv, self.should_close = open_stream( - self.name, self.mode, self.encoding, self.errors, atomic=self.atomic - ) - except OSError as e: # noqa: E402 - from .exceptions import FileError - - raise FileError(self.name, hint=e.strerror) - self._f = rv - return rv - - def close(self) -> None: - """Closes the underlying file, no matter what.""" - if self._f is not None: - self._f.close() - - def close_intelligently(self) -> None: - """This function only closes the file if it was opened by the lazy - file wrapper. For instance this will never close stdin. - """ - if self.should_close: - self.close() - - def __enter__(self) -> "LazyFile": - return self - - def __exit__(self, exc_type, exc_value, tb): # type: ignore - self.close_intelligently() - - def __iter__(self) -> t.Iterator[t.AnyStr]: - self.open() - return iter(self._f) # type: ignore - - -class KeepOpenFile: - def __init__(self, file: t.IO) -> None: - self._file = file - - def __getattr__(self, name: str) -> t.Any: - return getattr(self._file, name) - - def __enter__(self) -> "KeepOpenFile": - return self - - def __exit__(self, exc_type, exc_value, tb): # type: ignore - pass - - def __repr__(self) -> str: - return repr(self._file) - - def __iter__(self) -> t.Iterator[t.AnyStr]: - return iter(self._file) - - -def echo( - message: t.Optional[t.Any] = None, - file: t.Optional[t.IO] = None, - nl: bool = True, - err: bool = False, - color: t.Optional[bool] = None, -) -> None: - """Print a message and newline to stdout or a file. This should be - used instead of :func:`print` because it provides better support - for different data, files, and environments. - - Compared to :func:`print`, this does the following: - - - Ensures that the output encoding is not misconfigured on Linux. - - Supports Unicode in the Windows console. - - Supports writing to binary outputs, and supports writing bytes - to text outputs. - - Supports colors and styles on Windows. - - Removes ANSI color and style codes if the output does not look - like an interactive terminal. - - Always flushes the output. - - :param message: The string or bytes to output. Other objects are - converted to strings. - :param file: The file to write to. Defaults to ``stdout``. - :param err: Write to ``stderr`` instead of ``stdout``. - :param nl: Print a newline after the message. Enabled by default. - :param color: Force showing or hiding colors and other styles. By - default Click will remove color if the output does not look like - an interactive terminal. - - .. versionchanged:: 6.0 - Support Unicode output on the Windows console. Click does not - modify ``sys.stdout``, so ``sys.stdout.write()`` and ``print()`` - will still not support Unicode. - - .. versionchanged:: 4.0 - Added the ``color`` parameter. - - .. versionadded:: 3.0 - Added the ``err`` parameter. - - .. versionchanged:: 2.0 - Support colors on Windows if colorama is installed. - """ - if file is None: - if err: - file = _default_text_stderr() - else: - file = _default_text_stdout() - - # Convert non bytes/text into the native string type. - if message is not None and not isinstance(message, (str, bytes, bytearray)): - out: t.Optional[t.Union[str, bytes]] = str(message) - else: - out = message - - if nl: - out = out or "" - if isinstance(out, str): - out += "\n" - else: - out += b"\n" - - if not out: - file.flush() - return - - # If there is a message and the value looks like bytes, we manually - # need to find the binary stream and write the message in there. - # This is done separately so that most stream types will work as you - # would expect. Eg: you can write to StringIO for other cases. - if isinstance(out, (bytes, bytearray)): - binary_file = _find_binary_writer(file) - - if binary_file is not None: - file.flush() - binary_file.write(out) - binary_file.flush() - return - - # ANSI style code support. For no message or bytes, nothing happens. - # When outputting to a file instead of a terminal, strip codes. - else: - color = resolve_color_default(color) - - if should_strip_ansi(file, color): - out = strip_ansi(out) - elif WIN: - if auto_wrap_for_ansi is not None: - file = auto_wrap_for_ansi(file) # type: ignore - elif not color: - out = strip_ansi(out) - - file.write(out) # type: ignore - file.flush() - - -def get_binary_stream(name: "te.Literal['stdin', 'stdout', 'stderr']") -> t.BinaryIO: - """Returns a system stream for byte processing. - - :param name: the name of the stream to open. Valid names are ``'stdin'``, - ``'stdout'`` and ``'stderr'`` - """ - opener = binary_streams.get(name) - if opener is None: - raise TypeError(f"Unknown standard stream '{name}'") - return opener() - - -def get_text_stream( - name: "te.Literal['stdin', 'stdout', 'stderr']", - encoding: t.Optional[str] = None, - errors: t.Optional[str] = "strict", -) -> t.TextIO: - """Returns a system stream for text processing. This usually returns - a wrapped stream around a binary stream returned from - :func:`get_binary_stream` but it also can take shortcuts for already - correctly configured streams. - - :param name: the name of the stream to open. Valid names are ``'stdin'``, - ``'stdout'`` and ``'stderr'`` - :param encoding: overrides the detected default encoding. - :param errors: overrides the default error mode. - """ - opener = text_streams.get(name) - if opener is None: - raise TypeError(f"Unknown standard stream '{name}'") - return opener(encoding, errors) - - -def open_file( - filename: str, - mode: str = "r", - encoding: t.Optional[str] = None, - errors: t.Optional[str] = "strict", - lazy: bool = False, - atomic: bool = False, -) -> t.IO: - """This is similar to how the :class:`File` works but for manual - usage. Files are opened non lazy by default. This can open regular - files as well as stdin/stdout if ``'-'`` is passed. - - If stdin/stdout is returned the stream is wrapped so that the context - manager will not close the stream accidentally. This makes it possible - to always use the function like this without having to worry to - accidentally close a standard stream:: - - with open_file(filename) as f: - ... - - .. versionadded:: 3.0 - - :param filename: the name of the file to open (or ``'-'`` for stdin/stdout). - :param mode: the mode in which to open the file. - :param encoding: the encoding to use. - :param errors: the error handling for this file. - :param lazy: can be flipped to true to open the file lazily. - :param atomic: in atomic mode writes go into a temporary file and it's - moved on close. - """ - if lazy: - return t.cast(t.IO, LazyFile(filename, mode, encoding, errors, atomic=atomic)) - f, should_close = open_stream(filename, mode, encoding, errors, atomic=atomic) - if not should_close: - f = t.cast(t.IO, KeepOpenFile(f)) - return f - - -def get_os_args() -> t.Sequence[str]: - """Returns the argument part of ``sys.argv``, removing the first - value which is the name of the script. - - .. deprecated:: 8.0 - Will be removed in Click 8.1. Access ``sys.argv[1:]`` directly - instead. - """ - import warnings - - warnings.warn( - "'get_os_args' is deprecated and will be removed in Click 8.1." - " Access 'sys.argv[1:]' directly instead.", - DeprecationWarning, - stacklevel=2, - ) - return sys.argv[1:] - - -def format_filename( - filename: t.Union[str, bytes, os.PathLike], shorten: bool = False -) -> str: - """Formats a filename for user display. The main purpose of this - function is to ensure that the filename can be displayed at all. This - will decode the filename to unicode if necessary in a way that it will - not fail. Optionally, it can shorten the filename to not include the - full path to the filename. - - :param filename: formats a filename for UI display. This will also convert - the filename into unicode without failing. - :param shorten: this optionally shortens the filename to strip of the - path that leads up to it. - """ - if shorten: - filename = os.path.basename(filename) - - return os.fsdecode(filename) - - -def get_app_dir(app_name: str, roaming: bool = True, force_posix: bool = False) -> str: - r"""Returns the config folder for the application. The default behavior - is to return whatever is most appropriate for the operating system. - - To give you an idea, for an app called ``"Foo Bar"``, something like - the following folders could be returned: - - Mac OS X: - ``~/Library/Application Support/Foo Bar`` - Mac OS X (POSIX): - ``~/.foo-bar`` - Unix: - ``~/.config/foo-bar`` - Unix (POSIX): - ``~/.foo-bar`` - Windows (roaming): - ``C:\Users\\AppData\Roaming\Foo Bar`` - Windows (not roaming): - ``C:\Users\\AppData\Local\Foo Bar`` - - .. versionadded:: 2.0 - - :param app_name: the application name. This should be properly capitalized - and can contain whitespace. - :param roaming: controls if the folder should be roaming or not on Windows. - Has no affect otherwise. - :param force_posix: if this is set to `True` then on any POSIX system the - folder will be stored in the home folder with a leading - dot instead of the XDG config home or darwin's - application support folder. - """ - if WIN: - key = "APPDATA" if roaming else "LOCALAPPDATA" - folder = os.environ.get(key) - if folder is None: - folder = os.path.expanduser("~") - return os.path.join(folder, app_name) - if force_posix: - return os.path.join(os.path.expanduser(f"~/.{_posixify(app_name)}")) - if sys.platform == "darwin": - return os.path.join( - os.path.expanduser("~/Library/Application Support"), app_name - ) - return os.path.join( - os.environ.get("XDG_CONFIG_HOME", os.path.expanduser("~/.config")), - _posixify(app_name), - ) - - -class PacifyFlushWrapper: - """This wrapper is used to catch and suppress BrokenPipeErrors resulting - from ``.flush()`` being called on broken pipe during the shutdown/final-GC - of the Python interpreter. Notably ``.flush()`` is always called on - ``sys.stdout`` and ``sys.stderr``. So as to have minimal impact on any - other cleanup code, and the case where the underlying file is not a broken - pipe, all calls and attributes are proxied. - """ - - def __init__(self, wrapped: t.IO) -> None: - self.wrapped = wrapped - - def flush(self) -> None: - try: - self.wrapped.flush() - except OSError as e: - import errno - - if e.errno != errno.EPIPE: - raise - - def __getattr__(self, attr: str) -> t.Any: - return getattr(self.wrapped, attr) - - -def _detect_program_name( - path: t.Optional[str] = None, _main: ModuleType = sys.modules["__main__"] -) -> str: - """Determine the command used to run the program, for use in help - text. If a file or entry point was executed, the file name is - returned. If ``python -m`` was used to execute a module or package, - ``python -m name`` is returned. - - This doesn't try to be too precise, the goal is to give a concise - name for help text. Files are only shown as their name without the - path. ``python`` is only shown for modules, and the full path to - ``sys.executable`` is not shown. - - :param path: The Python file being executed. Python puts this in - ``sys.argv[0]``, which is used by default. - :param _main: The ``__main__`` module. This should only be passed - during internal testing. - - .. versionadded:: 8.0 - Based on command args detection in the Werkzeug reloader. - - :meta private: - """ - if not path: - path = sys.argv[0] - - # The value of __package__ indicates how Python was called. It may - # not exist if a setuptools script is installed as an egg. It may be - # set incorrectly for entry points created with pip on Windows. - if getattr(_main, "__package__", None) is None or ( - os.name == "nt" - and _main.__package__ == "" - and not os.path.exists(path) - and os.path.exists(f"{path}.exe") - ): - # Executed a file, like "python app.py". - return os.path.basename(path) - - # Executed a module, like "python -m example". - # Rewritten by Python from "-m script" to "/path/to/script.py". - # Need to look at main module to determine how it was executed. - py_module = t.cast(str, _main.__package__) - name = os.path.splitext(os.path.basename(path))[0] - - # A submodule like "example.cli". - if name != "__main__": - py_module = f"{py_module}.{name}" - - return f"python -m {py_module.lstrip('.')}" - - -def _expand_args( - args: t.Iterable[str], - *, - user: bool = True, - env: bool = True, - glob_recursive: bool = True, -) -> t.List[str]: - """Simulate Unix shell expansion with Python functions. - - See :func:`glob.glob`, :func:`os.path.expanduser`, and - :func:`os.path.expandvars`. - - This intended for use on Windows, where the shell does not do any - expansion. It may not exactly match what a Unix shell would do. - - :param args: List of command line arguments to expand. - :param user: Expand user home directory. - :param env: Expand environment variables. - :param glob_recursive: ``**`` matches directories recursively. - - .. versionadded:: 8.0 - - :meta private: - """ - from glob import glob - - out = [] - - for arg in args: - if user: - arg = os.path.expanduser(arg) - - if env: - arg = os.path.expandvars(arg) - - matches = glob(arg, recursive=glob_recursive) - - if not matches: - out.append(arg) - else: - out.extend(matches) - - return out diff --git a/venv/lib/python3.8/site-packages/easy_install.py b/venv/lib/python3.8/site-packages/easy_install.py deleted file mode 100644 index d87e984..0000000 --- a/venv/lib/python3.8/site-packages/easy_install.py +++ /dev/null @@ -1,5 +0,0 @@ -"""Run the EasyInstall command""" - -if __name__ == '__main__': - from setuptools.command.easy_install import main - main() diff --git a/venv/lib/python3.8/site-packages/flask/__init__.py b/venv/lib/python3.8/site-packages/flask/__init__.py deleted file mode 100644 index c5da045..0000000 --- a/venv/lib/python3.8/site-packages/flask/__init__.py +++ /dev/null @@ -1,46 +0,0 @@ -from markupsafe import escape -from markupsafe import Markup -from werkzeug.exceptions import abort as abort -from werkzeug.utils import redirect as redirect - -from . import json as json -from .app import Flask as Flask -from .app import Request as Request -from .app import Response as Response -from .blueprints import Blueprint as Blueprint -from .config import Config as Config -from .ctx import after_this_request as after_this_request -from .ctx import copy_current_request_context as copy_current_request_context -from .ctx import has_app_context as has_app_context -from .ctx import has_request_context as has_request_context -from .globals import _app_ctx_stack as _app_ctx_stack -from .globals import _request_ctx_stack as _request_ctx_stack -from .globals import current_app as current_app -from .globals import g as g -from .globals import request as request -from .globals import session as session -from .helpers import flash as flash -from .helpers import get_flashed_messages as get_flashed_messages -from .helpers import get_template_attribute as get_template_attribute -from .helpers import make_response as make_response -from .helpers import safe_join as safe_join -from .helpers import send_file as send_file -from .helpers import send_from_directory as send_from_directory -from .helpers import stream_with_context as stream_with_context -from .helpers import url_for as url_for -from .json import jsonify as jsonify -from .signals import appcontext_popped as appcontext_popped -from .signals import appcontext_pushed as appcontext_pushed -from .signals import appcontext_tearing_down as appcontext_tearing_down -from .signals import before_render_template as before_render_template -from .signals import got_request_exception as got_request_exception -from .signals import message_flashed as message_flashed -from .signals import request_finished as request_finished -from .signals import request_started as request_started -from .signals import request_tearing_down as request_tearing_down -from .signals import signals_available as signals_available -from .signals import template_rendered as template_rendered -from .templating import render_template as render_template -from .templating import render_template_string as render_template_string - -__version__ = "2.0.1" diff --git a/venv/lib/python3.8/site-packages/flask/__main__.py b/venv/lib/python3.8/site-packages/flask/__main__.py deleted file mode 100644 index 4e28416..0000000 --- a/venv/lib/python3.8/site-packages/flask/__main__.py +++ /dev/null @@ -1,3 +0,0 @@ -from .cli import main - -main() diff --git a/venv/lib/python3.8/site-packages/flask/__pycache__/__init__.cpython-38.pyc b/venv/lib/python3.8/site-packages/flask/__pycache__/__init__.cpython-38.pyc deleted file mode 100644 index 3e81dac17394122c1a89929fe88c2ba8ebf6072a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1850 zcmbu9$#Nn`5QYIsG-4Ht&^p>TBmr7HV>`m(aM%%Zvk&924|yp!bO9|@FRrQ{p?M>p z{2+bR+x*b8q}c1Ttcoxow@u$-@4+7P2J$}aGjAdvzyb3X@*x~D zZzCVU5%U}5V>o8sK|X;K=3SKwPT`b!Pn`uVXff|2pTjxx0rCZ0Fdrgc!X@(&avR#r z$H*P%FrOfIq04-Vd<9p`XUNxZ&D=u1fg9#?SFbC2MBkbfr9 zaPS9d;wUt<*7A=kk+Jqen#leXg#&+xRC5PbYGFsd5&HSU?S2$LihiQC4DHMp{V23@ zOxIUNt`Tk=&slY{rYp?Znp$j}o5 zUr}g%GSE>VCiRZ=BimL>HxLiL9nJ01NwgA!NMnRU{qP4AT*bXiYbN3-j-~h7Ow5SQ zwYf+uUF_0Oc+mr8)$B=Jn6eH%YSeUJII}v8UV0N+R7h56!WpWlhr8BQvT7uCk_O2tNfQN} zkyNqNMz4{zPO?F=NwP(bCL@b z$WL2<<_Gnf^~k|5r2r0kkgmxc~qF diff --git a/venv/lib/python3.8/site-packages/flask/__pycache__/__main__.cpython-38.pyc b/venv/lib/python3.8/site-packages/flask/__pycache__/__main__.cpython-38.pyc deleted file mode 100644 index b151570bdf4d96987c0ddfa18740d8cb8b414d6c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 181 zcmWIL<>g`k0*>{+66ApNV-N=!FabFZKwK;aBvKes7;_kM8KW2(8B!UW85kK-n1UHJ znO`yjB{dmuvE(LZ=J{zd-C|D8$t(hCUCB_y0;IsiFC+bu+yecA%mUrgyn@8!?9>$9 z@{H8f9NjF#yrldJ%L@IpoW$a6{rGs0Iq~s&1(mlrY;yBcN^?@}KvookjO1Yg0J0k> AZU6uP diff --git a/venv/lib/python3.8/site-packages/flask/__pycache__/app.cpython-38.pyc b/venv/lib/python3.8/site-packages/flask/__pycache__/app.cpython-38.pyc deleted file mode 100644 index cb5177e580ac5239323098d6ce4d5bc4dbbbf0fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 63448 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 U+kf@`o(PFCEr3sY-@%^$4;8I>{r~^~ diff --git a/venv/lib/python3.8/site-packages/flask/__pycache__/blueprints.cpython-38.pyc b/venv/lib/python3.8/site-packages/flask/__pycache__/blueprints.cpython-38.pyc deleted file mode 100644 index ac8a7a2d9b7fcc4592ed59c81796d6cca2c1e143..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21713 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 diff --git a/venv/lib/python3.8/site-packages/flask/__pycache__/cli.cpython-38.pyc b/venv/lib/python3.8/site-packages/flask/__pycache__/cli.cpython-38.pyc deleted file mode 100644 index 5e393aada7b93a8371c36cee6a9c6065669a1256..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26941 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 diff --git a/venv/lib/python3.8/site-packages/flask/__pycache__/config.cpython-38.pyc b/venv/lib/python3.8/site-packages/flask/__pycache__/config.cpython-38.pyc deleted file mode 100644 index 6565e35bde3d6c9eecd7d30ec1950fcba6f517ce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11418 zcmcgy-EZ7hb|*QU56L50{)l61vstdwt~8B3vWsonojO4rS@vqzmRw7QZDoxa&hU;z zi9=2Vb-vqGxP#{2o{sa9N`UjM+1q$S)uLa!2Zhz-olEabYBz@S9 zO^P4)o_p@O=i_(I<-@6|Ne#cszr1SQcvsW@gKqLa6E`2?2v=}&G)MQe4fR*w(D~lj zF!*m_!^B_1EA~noC0)CtIR(f3OmocV#zq-;MW=+jlBhf{Y)m-%npP`+4Vv0YO^>JC zUO$jgGmNC`Z+7T${#V4!hd9Dt;3PB}7=!8?1*a-ZQQR)!C||m->J&dKZd9Bp zJe^1nr-V0Ur-C<=*)zkLz|%?R)Mw_#DaQay)A8xW!0)=7HzTmp9z^0`{+_)fLd*6o zJAGz#1G#5Q$BF_g+7ecWyR6g-vFY1A5l?N3sELQWLPkQyB`KnT^g9J`pZ@6Dz_ExU zoWW_R54EN?G;qfB*0itmm6{P(noXkEY)X;=4G;>iD`{2u$yb`B^?P+~A?o!P`fmT~ z!0+3g9pPNv+Y-XNx_#Ym2hV=;Y@zGf;m(5MwBFw*%C7H5&1Mz-Ln5f@CH>&yk?Ggd zW*EB=w7278u;&XYOK3kfA)-K&;t5^D#SqijsmSUOlNsvU+EClpFKLGb{Ds2oOvo!k z?S(Ncywvfmu%^i}I$@NO;!##`t7dJ=3A&!5(=<-8A$NJ&>U4@8m77fxdXq#M(v&p4 zqMLeEpTxg|H;>PXTh|IqH7@Sj-as6m6iq0b6t9wzPUQxyAZ6N+r_qo(2E`GxXXz=e z&p4wYF?tb?L(%~4ME1B%4LX4TRi+$IHk-Y`8F>Uz$Ql3ji4!Z<(_de%ir< zu^+A2hd4r0KVp|ZNbK^sRa$s6AtszMEU)5BkUcs-OrA~R*(s-rXQyDJRWT*ZuEBOa z^@ZU~JEvi%)6Qk4eHtxhaGbfMZR+@YmRd69nJ-M|jB^%L&N=VoD4%oAmvJ) zAH^l5YWBawLLLQjC$z*fyAyf)mgnvW%eEZ16It*qR$m6Yt^?PyXYYsPO1iG+S#D%? zWzeG=5l&k81=0%pqT|{g_oa1}t_bUvwZ0`JNaBe00(hZbFYv8C+?0?$Q|t%*foDf} zza^NKvaR|g-z>R!EUo=uV0GZ$c=(Y!Q*79Yb7OuQ4b_pjvitpdLXG%s_Vob4JKm&;;m`1=F99piQF|V{Aw{`@EJukEx zJrQj+TFd~PljuY(5?3Nw^4Th|kWjWDVxG2bw9)wT_fryew0Tav1 z`PR}$5ARs-TkCS5mXL(MwzT+QX}$ULr6+hZ=Lm>2==X#lSvz8Xj%Rt&8YvOYr!gg2 zn`Pf>2jID5hfv0O5(9#8vi$zOb$>tF!h+E9l5oe~D@lg6D?Dc4V`T^ZzK}$Vc!3y6 zLmdcqJXo^!Ldrc3u2A~Cq#;_S=LLHSDJ8H(8S*Mgq1cK9!3SIJTS+@s5gOSKA~ibG z8w=Mo7d$wofQoIUb`~!#&zwm@n>;~sR%=HK3p?=K4(n`UR`+GlhR59}y@g_6d0ii> zFT#k#3S*~XNs8kd4^IFuiRNn%@ZmRZDDv`wnP~{d*FArc&PDdvh8l!yKEGQQ{46S z94A6&A(GYa*-%qF#3DlpR(kpp6Rvl|~&3ep)Qri;G2o_pl1Rq9n$QwrT?sZdp ze{O+{ejy4H(6c}s%q8x~hnf0Luon^=RtvLeVU@y2*iN#FjlM1Io+X1IY7(JF>O-u( zEw{79qF352(aDkmeip8cR}k}hv?WH4i)?ZHr#z&k43ZYU11b@Wq^;B@r&U+f(zr_H z#>vp#5ha|1S0td?Xno3%uYQ|=Up<>gtIiTmrU&h}2VN95$X648B(j6N8s;j*;bcK5X2vaNth)WTY;fnk|I;4n- zuI1Zw8le^jECg(RiX#EBGx|Y-;WO-d8|+S{Cd7a`E``trKRV7ZF`F^`9&RGwR^U`! z;nZ+`Xvm9{zC;BFPk)D;e4afYPGKr#H2D-ZoGl!OpTY75c*0)(W z%bM2s7y&S!dQd1&+YaG^Jh&W=Cbos3CZi581_vYG?FgCC0(gh#>xnS5H{tKuf0FHc z6o;|goxl-!JLBs`##B+L+#V99{VulXm z6l#~lDr<@Rg>fbUf(TGhB_PScLPd&kS~SP|jg`JZ8^&{ABVJu=1r4~DtZVhZ&fbE-mhw|AFbT9F024=?a!~=bjy4KpCYDRYrg$bgw_m;U&_BTirGA1} zd;XPPTUoE2lkdPlVv_(&Y;FTPa!8Gf(SBcq@#HU!>Os^KMFcbG3twKLj%DPO zeLRg#0y)%%VlSJ#wpC?cHrL0no|SzTIL$KU0(TgwmPGVa&uqJoM9N1VhbD8y4M zsVYeggRq&$x)YyL>cVWqIwBUm9MvV}aO>b;6roMepsrJbCz;lNq|fNHxSP?>Q>|yr ztEjBBW~ky3`x36XfDZi%II>{hz)b|75b4hic{W0Df3Cxuz^gphZ)s0w4~?Pm!hEU8 z*{FzWo$(yCx}kAH`(&1@nTGva)aXvIWO8q89-F|2Kv|rp!YFR0*PMOBBoG1ve`JYC zMC=A0@*u|HNb-5%a%uQgC=ud4*G(HLKO!_q=@&VZ1YnMGQnsc&Dl}lg)E{IT$<$Ej z>_jLorJbedB75;Wf{Yxg_XxBCJ3FXJNaWq#{-`vt$}?2pco2dTfJtKbNxn$AR|mKh z31|JJBtBz^(xeblNwTR?Zkg3$@m6^`MS6kB)~%Ze$fT>SRz@q61tw2nbPv@T1&~hi zd2P|L(=>z=Sqx)mv{K@n-g1(e)`l~FvL=e7k$9G#*_1{S--_p}z;6)bScv{M1g0jV z$}PEMp`IXdsy?HNjr#k0DIq%cH_tMmX3(?CcAaRyKGN~~pU z`KZ8`$q*GSs0+c0$7;> zTx^o6``Ak`v}>SsWz*mpa4 zZ&;A+VQIS*mA1<`DqRC8wVj|;B(6wXOWPAbsYqOhrRGF}Qq9BCr==W9og5Zl(k@-m z{;v$7vK@aDKxOcuN@d6>F>T>wOQF`5ET+|>S1{rc>ao`GTy?O3g>7;kc`F@Rbzb{> za7|E{)^Q64@}flcY8zIt1Kic;BIZbM$p8|~iGrS&F-gyl`a7D`{AH!zb!vV23bXn? zUDt`}obyYxllqWKHh5x5`I*JXv!mB_yuvIA79YpM83g982$x4NZ{kh90pSu~4a7kz z3@Err!8=l$nT(~aEqDzCBJv$7+s!*)l0+h33RU^F$q)@sBa>Z&zzH{OV2Kx#aXY-B)`1rr!{n9 zi;^G21t$=pKNrCZxnY!ZBFB;WU)HZ>Gr29V!W3m4r|{a-`9Z5?n4tFW5!MMZo6jEt+1hTMvQh^UjZ! zJ6E+P0_l$(3uXK%C1FcIXwc(9uW&U$?aH))0@4@PztKRh)vsUA)=^@|S6lg-&Xk^R zhk<_}=2&a#dXB+gHd}TvY1WbQbbNNIKh0~N+};(7NGS&kf=PM)Yl_|&a}p7~v*Xd; zm%L1m%5eoBW%!5(VXSf4DK_areD+qt2=eeps)hU+dPuUxS}|vwWS4T4PE@rz*(iyp zf5Tf<)0#&3H&D@nX&S#TmBtN{nxdjrPE$sK=aoVUP5(*_vUY_vXgro}pf8tPLub9AG^l8To|2;UD_k#(s^_m$^Pz(-%YDGMe z?Iy<4NSAxO55TX~dgM_VefmK6>^O-{tcQupoyIc%2r@4oqSl9<46I9NeNqMHdT&@% zH3LWg2Yga+SoY0f@vw}#;q77hMd2l$3`;|ESjOs9hbG*rVY?XQ0e>8X$UEBI->2vv z+4w#O3u2=f+@{hng0Nb^w9=Dok!P#JxT|MJC>;~Z;*SQpF8oL)gax>tuKTQRr8($; zHUVCrYkoYpeDCI+rRLiD>Vu```jh)hb5Ci%`#0Brs(LJ-61;$B z3vQ3L9ll%lk8Z9lH6K2>t4M4`QNOVO0-N$%0_GTjAQ^NcRHcyOb_X88GXG>P zBP^KJdXWESlY&n`B?UEQxjEpiaf&8sq73p$rH81ZOf~3WZSp=O3F_IRAg4RRK=vvd zGU<~UH1)w|C!Cj$wZc9u`7u>iNJ}?l5ZQ`mgz{on*SWRMe;JZ|hmdtlI2iXMe^NH6 z4&nM8Z{VoP-bgALQ^zswSjb*MKKcm0j3cLvLh|u(0clEHWJ%U4DiS_M8~KDz8+4-m zomk(A^d`Z`ZFR}AdGgn^eH(u%1EBynweUl7KeL?sG z^rgbJ1O{j}F%*BEH$Dj|(C9LTOh3pQZ6K%J@FCvq+<$zVxxQYzq=q1LF5jRN&0Lij z=<_~#iB80T`uNVItwcFb_f*V|iw}LcmAIs;1(GTYa+Y2g%d7HxbWy&iGA0FA)~Er+ z!PvY-TjVXeC)RU7g(t?_;&0&v9U&zt_>S-0S@ZnG^KZ@mh4yI#D=@!MJiml|MhAwdQX&D+uQJXH*N*=l&PUZhLkB diff --git a/venv/lib/python3.8/site-packages/flask/__pycache__/ctx.cpython-38.pyc b/venv/lib/python3.8/site-packages/flask/__pycache__/ctx.cpython-38.pyc deleted file mode 100644 index 2c17c5d62c7999c28d3ce26ae7488d8b50c8513c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15415 zcmdU0TZ|jmd7c?wmdoW{v|8P5d2F|l=t`8_#<^@|!?G;NZtRUC$(GH;A!j+WyWAx? z%$cF2C02fj48$prw$F`Itk5SFMT4S!E{XyL`c$BOWc${lKnk=keN&6L-}j$6!^={! zi{z!0IGoFwbNTQ8_n&=te!ghoQ~2rQ`pWB;^)I{_{bX?QD!$QzZCSqM+byfAf9sIR&-wY*Y`a)3%J~e==c;pZUTBrt^VNAdpT+q? z6@#FCv1PXxtBbZ3INM9=4{>L%b*Q~uU6!Y%*5UR_bw$qSTSwYQt4GoD*aNG2{JP~Y z_=_J~{^A3tdLmd17X7799siKO{BgE=61|<`SMDA5S8(sC;A#KJr?!98KZdK*$<=ZH z1g@SzZzugz=Q|1_?i#?`aFebXwR{uwE?R<;KVy{_-YLG7;cy4^tG&ipOq zHG*}ov2$y;8}P;(w{E?2^mwi#5DZYsB|zQH-{@vs_cb_j*ATkKH|l zW{t2D2lwJyH^dk|nvUJI6&!U5Ji~6+s%8; z4z6dCwhb<3^pnHItN2ELheKdhZQlaR?P?~-2D$CL?|`%!KMPXLBzM5-Pc#0EU%@fh|2S8j3rZWd?j?OfR_3bn{;7%kOa39;U%=f( ze;NI2RxaVaLqYb0HNwzk%z^CH3_a}Uz_h18^UK}tmH6KER=Do9BJZc*#bvkK@|qnt zT;C2Fam9T%3Vhd#T+i)z?I7xcm+nTW+$auJv$N@f+n($9QF%Q2}n_Ew95?=BexT;;@Y;4RC4KZLn1kx$#yrO6GCSy}Q+HY`M)y`e}Q9;Cgqw zrtp;0i?;%Im2+9GZ`R$e3h(VEV^%7zA4Cn+Tn|=P-7`DE?im;B+tf4Se6MT;jU5aS zpc5rii(@qJ#R0}cUqKXf;-ojWM~`;`Mal7eKk(7(#mb8pb${cdH6eg!H_OAJZUk{p zVeK84k37)O4bhiO-%CdoN`L-SJHLEfry$9&kOio!8f{yL%+0VZCiWx z3G23X)5==0y;D>#*cSiA&Yt}MlKp+>1FPe_4>NYtdStIX$_xs%n%`{1wc4QYjbQhx zQlT0wTsE_n>qnSI6tp(fB1U;+spI&0eEve*?q29NyXSiy$jwgRp9hhH*7@xhJL}=S zuiv|{K~1~>rLS~%2XnRBW)PDKwb}*Fm{YfG$1d3mcK_tKtX4)Euaz@0?jU!^YxM%P zgx4B0*XF}>euWMTIN5VF9WKc#)gjz^WUIsYL08A{BmJpUJmXUI;RMb&%gD^~CESRF z;M3-pHv3{cc^N$Eoc?^C$ZXXzXLU54noQEn&ktIfieKaWK8K2FV?)FlKiKekt#~>a zv*>b2MhMfsy=U(^4;>g3yZ@ipgLqtl)_28joO2=RuoJp#SNK$M-)imzqR*7%)i(5R zwN6Q^Ko067^1s^kl-HJyR^2s7yBlt}Lv@Km7cW$XJ?ZAjV5{zXlnNKEw2HXRjR}2& zmUqJVi)%Wk%TL)6nHgj-{G(C9dFCKvl#6?>;Hw2@w!b_f(CFiU(5BS>5?%s^hOK!u!Oy!BD{}|ojQ2%dq#|ytQx}QrKNZK|# zQ5<+aIjy{ABu>Mv*Np+HkIr+dL4Gmq4)$R%3$5+I^#rYiWth2o7F3*-ge7!SBK#u3a0JGRQYf48h`)ix&>h`vMne^WMFA(t zRP9Bk>C+fL@j{{nqvZNksnf)Co}gAK8_3l!=uC&aGb&abE@dj)ehtjJO}2?SF7{7M zXxH#{dQ3RqwzhAR?vmGH-IT{MFl;GW=t1GlB&t&{@G<8-vX<0IE7}NNMJqTI z?CjCy{7Pmie|qlZ!tv5lW+fvnz-4=5x^SfIVH`mAY&-iIGQozR&=q@s0WMy>7c>yX zGI-zUbs7?odrXRSXq}{271zDRNE`oqQLxc#(N%(6&5d2rUBtiLuoJ=QN=gt(dn5s- zN5;rr#594{ZKAc0bZloxlsPK;zIl;JcF@vfN!ICl+k7+tH^K^_P4bauoO z!ILyXosXdB*fsr-NYYmnBI-&=;NEStgWT_;S;TP4Is+-9mxyK0IU5bHbqF^p&R5sQ5I2v}eETCD(?F!7otXa=|v~Q;I zfuGokWJzwM!4`H1tU*g?v(sqxkU}#dm*t1uCaxw|u7zfbU1+wup^6dx-!aRi>TRg7 z?TQz2lLlO1Et!b12jZ%MBKT908QZ@R2h z#_wrDSAYWD?VKH5&(I|ERb$_71e?8`CDXs@ez8Fl2 zvM%F>p2Vv>lbJmAi^lvRnnes&t>cWr9NYOUn=3dAS@k+QID^9&1=*6LUcomaDQQ)G zduJAw((xW=kZEm*bZ&XbQ5zvZy>ah@*abNe-QN`UQkD^vXeD6&4vs=aOjts}Nn~b% z`R8QJwzn&8j?qr+K}|gW4!ozgsq-!7ory>_I{-WhPePzD8OoG-q(dUHX$Flv=K?u& zH-JrwL`TgQY!l=cZ|VfE*GZAfB;pwjbsB)gBBHM9tiN7)8#HMlDj8FB8WRNfohBf; zvqas_F;Y;BXwPA0?GX4o{I+^|4MEkEkcO{R%o_+}%<0%5)MHF}q&u#XJ(`ei(vVKG zY1$g3Gs0jA1qEv$)$mNR5b&*Gc_a z0z|v(VGkK}63R+XXQLjFWnjpwLi^QvGQ~PED|2tNUKZFpR=s$u16%z6kY~xd#v^5N zh@VMvi#7eFxirnxe^scyhJ-JT^hN@>G)Wp9M%pkbV}DLdLX%=Wt*+wu#m!CsuMubO zM6P(mRa%MF`ji3cT6@8HsyU)eQ^}A?n`(yZesDnG;JiIZSJ(<*cp6et&<;r6OllJ* z20_OVFUhAQ97h_G*n(*k)1fgb##CBj{)qGJX;5=KK;$QAN}~*>2unKs%JO zg4tjmEfzn``Ycvus|!95gYxpAco~%^UB>f11o&`koZ4ylxsLP>0i%?Q3@cK?Ax&&H znlP?HV%l-^V&cts3uPo|x=N$sb8ggZqhti$hVE8)m(4YE62-rf)C%>yAPO>gqBh`D z>IRa~_6g!)LR?0l$pq6F`bo|#iLqrm^dA$_$1dsOC{bb8#Ojz{^G?$Tn(;(Ql@8S$ z*h}#_kKgII7ksgH(+qTod)08<2jcUP=Rlj8_~0xH^v9~@SR5)lYl^TD5FYkBSk`N( z^;8S)$LqpA59UTLsz*dLQQ_Ux^~RczePC}6W}xRAjZTay3X~=DoJi`3XNk-ER}7XS zK_$DG?H?Wr6Y4^`m5xS6VJ)7g%OtF|hYHv>3i)3}kWxb}44}FoC~;;#3*awDG{t9D zm+7B>O++E#N-CWbB4^BlqF$|mF5kefhQG4Rm((n-St#rHniXX}A77_>8~6SLUkyMz z3wF`&FODpb9X)aenc!aIAS<~(7JRO-gF86%FUcxVt^OKUi4|@mm)$|$yl2N5prT1teEW-qK&xVXZ9RGf1nVKxu4{i7ss>v zMZPN(16*33=^uF~?CP>CxNZnm5z2_v^q)clRPWupDr7-;q><~MeOxkTQNxJkwep-c ze$Qi3ny$~`46xm9G$?=;U^~>4f>S+;%mlRq<%f4WG=~XWP_qO|1-K&YNLZ{$D7A)z zDf+#`9vyXOk|iATzwnKSwposYdSnstZ^>SAiuP%{zc9)k)CMM{E{%apczw^>w;rP2 zN}Nt|1>m>jxtbyjC|lGJJrc#m8zwa<*!`7}5z{7*vYHYx_E`*ONfUu$22Q-LB}Fm| zE&(5&Q(8n)bj@NPTow+RnE_tm(jR5DR#tJYzRkmTco>&kqOHL_hNRd6lX#uXgl6jJ zTq z7h~UTVv2g?)ZM>(<1Hk6;-HcqG<1-}V=yDq)9str-$ZwJnlMm=(NMe!;cWqI>2&P% zP+T%fctN|1!9ylecoVK#CvkpLVGB)b7bs3r%tQlOOj7IqNP{)kxC^4fgk`u!6M`7b zZQ2`2U}B=ZI;W5>6|>OmNoIT70CgsuG0a3m)H7j;1#A*}fsd^ow%`bVK~$NuNvtDq zdb5e*tOC&!hy_MA4bFsoiS=~@sX)NuN*8CRts=G5$;9gAWX97Z50f3=E2O7B!F6e~DXQ0Rsa}Bdgue$=!3c#BA`u(eLxJeD88d-@GEXoe0r@~` zD1`5>C-FPDFfFl7gbRRm1M6B0M0U@u|jLn`f zW^e80<`!@o#C4kTgzQ=TBDs4AG^vk*E&^mCywC~IsTpM?7tnAsMad9D!;^^su{#f0 zXB@Wz0GAzz2iE^K04HHZ)I;}J2y6>{8ITM^fxCg)=?A^d%3B0GZ*os$1;P&YU?hPw zIV&ZUZff-sd5oGdR2LdIvVlNajxLHu5#-r%+c2IAR3QSeCTW72hsRS4RLVIW*Uuz2 za4?fd;b10#mvvOZVAp(@pAzW1f^YP@I3%e=2BqVII?j}WF~`klN*8QB#eQPK&Z#%U-qf#IDKFYmsnSE+_XJ!xY*9x2LZ&p$i zq@p;VlRKp(UAb1C*Ae1;vJ#zvD7t_3CJ%4$z|d%Lh~-8o41$_O^{X>fnynyGJ{ugX zne=Xa=jveAD3y;5mgzbBQNN8BkroVdoOO;T!%LrbFcQQ_{KBZ{ECVVQqOBRiu0>$O zd4R9WD1x8lc|M=Tzg+*=jj{aob5bD&slq0P!McQO0@BO~&hR^UIxRF+e6W^=dQN|7 zV)RWUbFzVsfboGXaN{Ad&G9J?$qdvs-Z9CbbTW+Xge)BV#&GZh5jW*f7RN0ckQ{!Q z-C)}SkN6^y{ZW=ltoIV;awXYv3X`4I!eE{fF-bLBifp2QtX-R@#?MlT_z~kqG%|so zso#1RR{DxD6?lSOam@|bEJhfnemAVTycRS(9ag}fG@#nUfGY`CFwJyEI{5H9w8X=~ zMY}n%FE)t;IO(B~2qZeGJYk|3CGBZ^>2#Vfdf4EZxNZ(M4ahRPWXGS=OK!?O+7~Os zoj+)Ei$+yfMAP!&aMj{FOk^c+eJk{Q29%@+b|)jg^fU<1@$k_eSJ(r+WX&*g>)I10 z77bg6LwI!Q1gt^nsTZFQH_qctv;Sep8>Efn`diL1VUyqw+gg~5YTcGrRPd>aL^*wr zvP`3E&1dZ_lp4qX=^vg@Daz)UsAup(5nmDY8#w7d2ho-yi|_nM_UwE|QvRBVeJwj; zTHk_cb;Pvl7TUCC?mHhL-A_y_vAS%(dPU1JcPgtUwmd_!cOkb?Z(Rqv5RR=d+(DSD z#l%Iiq=E99jy6d7@eqGV!dqp#I;YEpHHG~-Yvma+#Dko4A>^wT2qN)mb(ZzI8f$4{ zq*Z_=C&@cEKu6rR+QhvHD>|5$-b{48O=6R5R+g#!3O5ryH9_jJ7shB#@4&Cn{BLkF zvQ=PKx!fDYBevt%+gYa5aSpquoIOA=08m!E*uiEHKkB^Kb+ zUjc?V#1ZwL(f*4=fXnFih>fB`8AVKPSJukQBLMy;2%%H+EuPW-YF9glaM?tcI=$cE zvr9aP&pVW;9snFf(i`~uf@%q|PzM_}<*zfe3><1BVybm|tyX$p9Cio&V9$tn)N?o= z%*c4Cu7(_8!fg;gA z<6^11A`yRy6Hqw;&U}PA{r7kstxH&fKNbOh0I|gdaPTVx&H%p6B;ecJeo2FGG5MJR z-tIie+|TXd&qu(s@9yOukYls=5hA^W4f_JlW%n}bBlMcx&cLZ!r@0`l!PIOLosK#g6AEh!eJ#n76I?HuU)^kE3Ds2JGxRMN zE4qwAbA-=j{^^FytB%MFP=ea*F_9SBrfX~cr8EjphU-5A0u52i2_jY8v+7&mzoID? zsB@5Ow8AL3RbEgc_RsTyl)V}}6UXo_&qRMjbtszZCJ(oGpckng9z`^hK?gI~G0y$N zCZHsGsk&@F&)i2DbEn>ud&z5XPngi8VsKu6M8%*ES%spV1TP8uA@r$_9;=2p-!@k7;2@<7#7CZj}oozShM!nsQH@0NgaJg`HtYKSFj=z(kxv z$#K&$C=hqxU!46d$;6n}g7wIM1~Pr-WJsC=@wa(n%zfZ(Add+>Xf+Pt!Rj{dPK^}a z$AiD;@bo_xIMP2pLH!g9Rv(~6L)x(|K0Hqu@npa^LNoOt590(7i1i;iIA?Da4y@L| zzXw)3i{`@pi#YKS>hD<(>}~tUFgxJ7-bgIr$#xd^mdu(5NY`cBO z{dPb1A#I2H4RnM+p^hI7B{y(3$RJD@sf6Kmnd+<#69=~O(`bs!(uqw~1*CC6UMWbNh5!pcH% z;f0fDj?NC@?^02*hw^h`at3)o>agmvs==%nX;ic$**i4I5pRzKaIYRtEn}J=>zE8? zNmuuD3_x2~or#*82*o2^aiKgYhF|#8&=20ZTD$Vb)hpk4bM3kgm|3bE6cXPb2@o+T zBwL&!4Ng?pftX2(v25lX6s{zH;HkGFeT@&U@^FoZ>pXCs(?~cdTml-1@bVRq(TZNc efs~`w!$1DYd0zi!^O=SBmrkslU2s9o3;zqxzTGbX diff --git a/venv/lib/python3.8/site-packages/flask/__pycache__/debughelpers.cpython-38.pyc b/venv/lib/python3.8/site-packages/flask/__pycache__/debughelpers.cpython-38.pyc deleted file mode 100644 index 21615f2e90c8ae011e8cd50de18d8608355b7483..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6416 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 diff --git a/venv/lib/python3.8/site-packages/flask/__pycache__/globals.cpython-38.pyc b/venv/lib/python3.8/site-packages/flask/__pycache__/globals.cpython-38.pyc deleted file mode 100644 index 97df14890e16033cd5f1d4fe60ece6ddd0a7ef7d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1802 zcmcIl&2Hm15GLh6S+Sk0<2XONE!abW8rV44V}YP(5v03C+aOqHQB)T#Bhrp+N>oWI zu@~v3>C5EQ2k4s!y%i|1udtVPC^_Dw?X9R}4u>;i&i4(+^s9E;L-4r2ynFp?9iiXt z;{H>G#pf{eA0S>Kh8Pye$1pp>i7S2uTU$j`3# zHP#SbyymYJx+_|7+iw?oQ*`2We;sts-(YM0Bi3T=pON2X9kvehCfi_-VD9ny4f3}N z+2=LhyTSf8>+&78d5B&8p|L&mjv^V@e)&7x#NWM*{4IFVzbN*@VjV))z)J@4!y(!?y% z2mpu$i8)PReL)Rb$c#{9c$^x}h>;}IoQ$(1G?0yo$SlgZgmcE3M-xK9b;-$#v$NB? zOhZDBWTG=+Aea*-!z|{Bp>_`f9|K4&#<5ghlz@y&7d;2m&(cF+MCAM(?L|yIDv0$YZ%jCxwNbZDUQKAsRSWXoBGrZI-LnG|rw3`2?q^8~ z+j6#lb-}sVpFT^@<^0q6!Ps{F!KCc*~OPe3V73thvFc>lDn(X={3OT20e;@*Q)eOTrdNISr#^>4_U!8l5oW%3jv9|GF7 zTfwD`^0j4q+qk^3YzEb|u7)n}9%bvF$f#lA6W6eN`+P&qI(!imI?lu mJr`}u(o|ad!u~c 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 e>kvpc+S#4)dvD(R=6m1falKw8a8>?% z8~j}%?pNQo#2KQ0Z+?J^~@FsP{8 zuu_a?hShczR*JATD@w1ZD2vKV{{?N=BpKA@oS1p#iK>`=>9^-4IXWk6$F#j57mgNT z_K|?uF@@-Lv=(zHg#mg*8|zE4e$C+Q4gZ zBj$PsUP?-uu}VU8JAHXDS%X`jhrtjvXUKpGdWk$D#v2r1E06yMaW|qwFw>W8m}OXe zd%71jT`V00ODu&bYA@1~jo}UgJ<&~V1Q-NCv+ANi*hxBOVVZQK-dIVTDVFXftQA7l zx)nh1UX=8jk6d#1cp_q{AUL`W`GoE9#K7(@8g66yklD0^tRj~^+H=@otRWifMzLg2 zr-(vxvb!sl!4581$djvvMZ;05U;~UQA|*o;PqNM7cL1a-0j!iofTwnDK_K@{Yk9eg zht`~CkH~Z~WI9<=2m#`FFnbEMhOc}$LtB=~(@3R>EdXY=l!5k|D5Sj`-riU?!_o36 z8eJbJBOdNZaec2ZWqf^bBiT;(zuC_cSe_;@n%Kp&Nz{=wNFP#FH5eP7EujZwT7qea zWSm}ThRGG+*0*3dBuC_!{0h%!^pL6*Lw_b+;GOVZRu1XFyF*^k7gQ|?U?9v3`m5a) zc>2%iZcX^W%HqKvYke8+u&9fKgTp~mv3_>OEJ_>=^9oql=Wc}?wim^5ZiXff#~x5I zK`KJ>S2b%5rRlc<+3muS!A~rfPi4$jo=*YUbe7GYH0x8FO*C1}&*e<*SofD$`$bp# zlXF=0fc!#s==X$@T~9#2HRyxa(6Mea0Ml!JVas_vY7YFe6P$%NJG0W0iQFHl)z2_0 zLhBQc99-^m-Ejdrxo2}FMt#t$%@dccjYiQfoJrmmcrvk-+)vvXY;oR$7PqAlus<;k zPvN24ayV8v&k}N}xvUn>?EW!kw+I9AE7bRVdJ)DF^}LFwF2U--&7ZDZ;~G#N%7%Wz zu3U4;Cmg4Eh*z!+Q!$QV*1~tGHSfVhp-KZr1r(zHWg8;C2Dfg(V8{_YBm?i50`6o` zP?wQQ8pfj{=v@hg)|3x{ar!2#Rm=>o9HP)t{udDWuEaK$%&94g8?Yp!3%2};2mlG8 z>$@zGQb>`@)E4;Vwpdq2z-<&8$uutH&EMk2s8#^Mo0)KQocT&725#pjt{}-AYk%ki zX>+gVr>%tC9`^!l2$}HhSc)a4^8)fj9LiJWYYA@nJF&d8e*5uV@b0=|G)q#0?(akw z63^N#Nl*H1Dw?4dS~t4`r5bmAKcAS z!KSdKE%=7q|ISIWElmsFPSZH6ss0|?3iZR*p!y95n~}=SoV>auPZj4rA+Ey8O4gUF fsPg(#7%CM0JSY(QyH@b%Vr}t4mHM>uuV4HRvK_Ei diff --git a/venv/lib/python3.8/site-packages/flask/__pycache__/scaffold.cpython-38.pyc b/venv/lib/python3.8/site-packages/flask/__pycache__/scaffold.cpython-38.pyc deleted file mode 100644 index 8632d4f8c8ddb57bc85a5b6f64806bb79af32ec6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24651 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 DZj|PW diff --git a/venv/lib/python3.8/site-packages/flask/__pycache__/sessions.cpython-38.pyc b/venv/lib/python3.8/site-packages/flask/__pycache__/sessions.cpython-38.pyc deleted file mode 100644 index 49fd4d4f90653b26dfd17cc7f4739143a3d7567d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13086 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 F|6k3h+yVdq diff --git a/venv/lib/python3.8/site-packages/flask/__pycache__/signals.cpython-38.pyc b/venv/lib/python3.8/site-packages/flask/__pycache__/signals.cpython-38.pyc deleted file mode 100644 index 717a06a80661cfcf2fcfc0a2d76ffcf4e70de0fc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2333 zcmZuy&2Aev5a#}9wO&cKWIKt|=CFsNfPlzGfL;m|MT(*+a&d~fMO*g3u9lR&_KLe9 zx&9G+s`D5il@QV~#*rFua1EY%09Z>a%L150fKwQZ># zpmr=Z1Zrrh5l|yb?E+9H#yl76A@( zLR}sRPx$8@;XMZDx%ZpLecpM~p@CK1RW1l0*FE+kxezDWsZ8>>UhPY;Q+vEf>p%%p zDVcg8*9@d_ehE`!Bn-KAZrwZgguHd&oeB?8jTZS#;k#6T9HM&g_wLz|nU_apR!%Aj zzFY`CxjGXfpPWCF)8hKm>!Vqo=!+w5pQ8`Un>tw1cwOU*iL)5CSR5`7$6&f!hm7Il z8LK14<^`{Er2CA$u9AFp;%TF5$JF7g(qsj=tOlUcK5lL4BM*(Cht_K7*nJB7jnN{1 z4eS6kRd_sFL`!ENPKoO)4@`iNu zbHoApao@t8>^g+JoW;{TlNUn8nT{)&TqaqbOmp!xPL)WEh?95*0gqDvTE|zJIg8Di zh&3P=#jBA?Bh(CX4UQ5MCwX36=~xTNGkF>pvv?Jscv=}yk>{W?%a_U$*{Tsr6)G-d zoX8tKk zODv0}iEOF+u)Th)e2C3^S&ZSeSv&*+a+ol3>%t1Pb3zohk+EwNxb89r<-nNQ0_MFe z!KBM%W*B<_hZ-#rCxC{tR#k_M$QbGZ-mUB4;tKy&7o<}NT05|MaQ_OXRn|Vn+I{OO z%t-YRmq)l@Su7XKSu8ur9|P5v%KAI-@I7;ggEfZ=3^dF;=U0ot*gamnIo_9 zm`zX63+x@laUJ*H#c16VD}hzNtF}?Y4lWo-wU5gPmt9=;aKX^j-WT#lAvEek+;-DK zN|74cTM_IsOK5+!5uBNV9vCqPmlKucH*Di1;+bv~jLs6xlt@K(DU@cjLeas-cFjK< zF56u&()e_ZuMQnQ_`pB#4uYZMJJ4(JbTLBnIh5=~LEwZEeDQE9K!3xSGy;nqC0cHHTVAV#2c2|jFdnz5Rx(RE0Ro#1uz?)@` zAQ&`cD=FKsX^RaYzr=>Fuvsx!gAHx4VJmECgAHr2p$#^0$@&WQekCbl1KKP$ti^_| zVY4Z}1_WDTLpN9!8`@yQR@nSscGTf#%kS6c*bMYXm?Ez0^xe?ec6@i+-+vNxBIo|^ EKLkc(NB{r; diff --git a/venv/lib/python3.8/site-packages/flask/__pycache__/templating.cpython-38.pyc b/venv/lib/python3.8/site-packages/flask/__pycache__/templating.cpython-38.pyc deleted file mode 100644 index 49f9caaa9a655d0b80faebd39d24a7818964f1a3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5526 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 diff --git a/venv/lib/python3.8/site-packages/flask/__pycache__/testing.cpython-38.pyc b/venv/lib/python3.8/site-packages/flask/__pycache__/testing.cpython-38.pyc deleted file mode 100644 index edd70a593a59b2eb9c5b8c46f1a1f4f2e8f643f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8935 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 diff --git a/venv/lib/python3.8/site-packages/flask/__pycache__/typing.cpython-38.pyc b/venv/lib/python3.8/site-packages/flask/__pycache__/typing.cpython-38.pyc deleted file mode 100644 index c735e613505a4144851e9b1876accbf7757a7c86..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1265 zcmZ8f-BQy)6wWqjNJ~qh6tMo{zgz(7oimOjR0Kx{87MmLjV|5O64)kjvzda=;Y)bs zoe#6OUik`+j-K5%wPP|l+3!2w`Ps93Sgn>Fe1fk(KYaEb=eq%uPk`Vle(5*jINaex zIFtZ6DaeP23c~Gs)FZ~@ielfVKCV4p6jS|x2E;*SiTh~F_)S9vZM9oy8h*yGoN&^0 zn@-njICeCQ-g7NbJ?KIS3VU%wkaU;hg<)Y10vz{6( zj+70k!QA8;J(!o5x<$;sgz5{XE^XrKBKLcQ`$kPK8QjAeSajJSxY8rAWbsvtP3*O% zGmcpv#-N?pz13eI>8qHbVwoFbt(_6QIia{^6}K%@fjhmzsEfNJjqMoM7vK(7&%O6J zIdE3WKg@~lt`J>&d$9dtBS}QqVJeIxq^5R&aggZ`JYNTKun%bxM=8i65^K^$D+|WA zqJ4Fqgi%iurK|0Cdt2{YJ6o-nFLt--%zJb}dJKGRkoH0wK$iv}Pd`D{TjNZzRLQKP zG6|{8se^%JNrIJaAzeI-up#YlMCS)eYVTRtQQE~I?INX1+Yo_dDwedGcld^h473|Y zik1%)Q(4-IIneTON4u;K+ItnIN*CK%B7ja09X5;{*yt*d`|vS?RE^n%P3XoF{-bqi>#PGdEp2Q`8Ot3O zaRD-q)74Fu!avb$8<^zrAj$=Fxefh9Fa@nRQgEjBWZZ!?jmIhIVy<`|3hZngIp()T ze8fb~YwswI1#RR}?TKw@kK;Me`r-boXV7Jt__x8!$k{pVNu0`mJ$!Lw(_9>5e%@bK z{bW4}lhrIrSmzY@>fjhate!lGj^eXNXX{FL?@q7>QGJZGyctzteni*2~g}$InW{r+4l8dB{|2n>Z0f1d!g#Z8m diff --git a/venv/lib/python3.8/site-packages/flask/__pycache__/views.cpython-38.pyc b/venv/lib/python3.8/site-packages/flask/__pycache__/views.cpython-38.pyc deleted file mode 100644 index d231bc21e63e073de0033d012db0f0cc3761187d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4893 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 (3, 8): - iscoroutinefunction = inspect.iscoroutinefunction -else: - - def iscoroutinefunction(func: t.Any) -> bool: - while inspect.ismethod(func): - func = func.__func__ - - while isinstance(func, functools.partial): - func = func.func - - return inspect.iscoroutinefunction(func) - - -def _make_timedelta(value: t.Optional[timedelta]) -> t.Optional[timedelta]: - if value is None or isinstance(value, timedelta): - return value - - return timedelta(seconds=value) - - -class Flask(Scaffold): - """The flask object implements a WSGI application and acts as the central - object. It is passed the name of the module or package of the - application. Once it is created it will act as a central registry for - the view functions, the URL rules, template configuration and much more. - - The name of the package is used to resolve resources from inside the - package or the folder the module is contained in depending on if the - package parameter resolves to an actual python package (a folder with - an :file:`__init__.py` file inside) or a standard module (just a ``.py`` file). - - For more information about resource loading, see :func:`open_resource`. - - Usually you create a :class:`Flask` instance in your main module or - in the :file:`__init__.py` file of your package like this:: - - from flask import Flask - app = Flask(__name__) - - .. admonition:: About the First Parameter - - The idea of the first parameter is to give Flask an idea of what - belongs to your application. This name is used to find resources - on the filesystem, can be used by extensions to improve debugging - information and a lot more. - - So it's important what you provide there. If you are using a single - module, `__name__` is always the correct value. If you however are - using a package, it's usually recommended to hardcode the name of - your package there. - - For example if your application is defined in :file:`yourapplication/app.py` - you should create it with one of the two versions below:: - - app = Flask('yourapplication') - app = Flask(__name__.split('.')[0]) - - Why is that? The application will work even with `__name__`, thanks - to how resources are looked up. However it will make debugging more - painful. Certain extensions can make assumptions based on the - import name of your application. For example the Flask-SQLAlchemy - extension will look for the code in your application that triggered - an SQL query in debug mode. If the import name is not properly set - up, that debugging information is lost. (For example it would only - pick up SQL queries in `yourapplication.app` and not - `yourapplication.views.frontend`) - - .. versionadded:: 0.7 - The `static_url_path`, `static_folder`, and `template_folder` - parameters were added. - - .. versionadded:: 0.8 - The `instance_path` and `instance_relative_config` parameters were - added. - - .. versionadded:: 0.11 - The `root_path` parameter was added. - - .. versionadded:: 1.0 - The ``host_matching`` and ``static_host`` parameters were added. - - .. versionadded:: 1.0 - The ``subdomain_matching`` parameter was added. Subdomain - matching needs to be enabled manually now. Setting - :data:`SERVER_NAME` does not implicitly enable it. - - :param import_name: the name of the application package - :param static_url_path: can be used to specify a different path for the - static files on the web. Defaults to the name - of the `static_folder` folder. - :param static_folder: The folder with static files that is served at - ``static_url_path``. Relative to the application ``root_path`` - or an absolute path. Defaults to ``'static'``. - :param static_host: the host to use when adding the static route. - Defaults to None. Required when using ``host_matching=True`` - with a ``static_folder`` configured. - :param host_matching: set ``url_map.host_matching`` attribute. - Defaults to False. - :param subdomain_matching: consider the subdomain relative to - :data:`SERVER_NAME` when matching routes. Defaults to False. - :param template_folder: the folder that contains the templates that should - be used by the application. Defaults to - ``'templates'`` folder in the root path of the - application. - :param instance_path: An alternative instance path for the application. - By default the folder ``'instance'`` next to the - package or module is assumed to be the instance - path. - :param instance_relative_config: if set to ``True`` relative filenames - for loading the config are assumed to - be relative to the instance path instead - of the application root. - :param root_path: The path to the root of the application files. - This should only be set manually when it can't be detected - automatically, such as for namespace packages. - """ - - #: The class that is used for request objects. See :class:`~flask.Request` - #: for more information. - request_class = Request - - #: The class that is used for response objects. See - #: :class:`~flask.Response` for more information. - response_class = Response - - #: The class that is used for the Jinja environment. - #: - #: .. versionadded:: 0.11 - jinja_environment = Environment - - #: The class that is used for the :data:`~flask.g` instance. - #: - #: Example use cases for a custom class: - #: - #: 1. Store arbitrary attributes on flask.g. - #: 2. Add a property for lazy per-request database connectors. - #: 3. Return None instead of AttributeError on unexpected attributes. - #: 4. Raise exception if an unexpected attr is set, a "controlled" flask.g. - #: - #: In Flask 0.9 this property was called `request_globals_class` but it - #: was changed in 0.10 to :attr:`app_ctx_globals_class` because the - #: flask.g object is now application context scoped. - #: - #: .. versionadded:: 0.10 - app_ctx_globals_class = _AppCtxGlobals - - #: The class that is used for the ``config`` attribute of this app. - #: Defaults to :class:`~flask.Config`. - #: - #: Example use cases for a custom class: - #: - #: 1. Default values for certain config options. - #: 2. Access to config values through attributes in addition to keys. - #: - #: .. versionadded:: 0.11 - config_class = Config - - #: The testing flag. Set this to ``True`` to enable the test mode of - #: Flask extensions (and in the future probably also Flask itself). - #: For example this might activate test helpers that have an - #: additional runtime cost which should not be enabled by default. - #: - #: If this is enabled and PROPAGATE_EXCEPTIONS is not changed from the - #: default it's implicitly enabled. - #: - #: This attribute can also be configured from the config with the - #: ``TESTING`` configuration key. Defaults to ``False``. - testing = ConfigAttribute("TESTING") - - #: If a secret key is set, cryptographic components can use this to - #: sign cookies and other things. Set this to a complex random value - #: when you want to use the secure cookie for instance. - #: - #: This attribute can also be configured from the config with the - #: :data:`SECRET_KEY` configuration key. Defaults to ``None``. - secret_key = ConfigAttribute("SECRET_KEY") - - #: The secure cookie uses this for the name of the session cookie. - #: - #: This attribute can also be configured from the config with the - #: ``SESSION_COOKIE_NAME`` configuration key. Defaults to ``'session'`` - session_cookie_name = ConfigAttribute("SESSION_COOKIE_NAME") - - #: A :class:`~datetime.timedelta` which is used to set the expiration - #: date of a permanent session. The default is 31 days which makes a - #: permanent session survive for roughly one month. - #: - #: This attribute can also be configured from the config with the - #: ``PERMANENT_SESSION_LIFETIME`` configuration key. Defaults to - #: ``timedelta(days=31)`` - permanent_session_lifetime = ConfigAttribute( - "PERMANENT_SESSION_LIFETIME", get_converter=_make_timedelta - ) - - #: A :class:`~datetime.timedelta` or number of seconds which is used - #: as the default ``max_age`` for :func:`send_file`. The default is - #: ``None``, which tells the browser to use conditional requests - #: instead of a timed cache. - #: - #: Configured with the :data:`SEND_FILE_MAX_AGE_DEFAULT` - #: configuration key. - #: - #: .. versionchanged:: 2.0 - #: Defaults to ``None`` instead of 12 hours. - send_file_max_age_default = ConfigAttribute( - "SEND_FILE_MAX_AGE_DEFAULT", get_converter=_make_timedelta - ) - - #: Enable this if you want to use the X-Sendfile feature. Keep in - #: mind that the server has to support this. This only affects files - #: sent with the :func:`send_file` method. - #: - #: .. versionadded:: 0.2 - #: - #: This attribute can also be configured from the config with the - #: ``USE_X_SENDFILE`` configuration key. Defaults to ``False``. - use_x_sendfile = ConfigAttribute("USE_X_SENDFILE") - - #: The JSON encoder class to use. Defaults to :class:`~flask.json.JSONEncoder`. - #: - #: .. versionadded:: 0.10 - json_encoder = json.JSONEncoder - - #: The JSON decoder class to use. Defaults to :class:`~flask.json.JSONDecoder`. - #: - #: .. versionadded:: 0.10 - json_decoder = json.JSONDecoder - - #: Options that are passed to the Jinja environment in - #: :meth:`create_jinja_environment`. Changing these options after - #: the environment is created (accessing :attr:`jinja_env`) will - #: have no effect. - #: - #: .. versionchanged:: 1.1.0 - #: This is a ``dict`` instead of an ``ImmutableDict`` to allow - #: easier configuration. - #: - jinja_options: dict = {} - - #: Default configuration parameters. - default_config = ImmutableDict( - { - "ENV": None, - "DEBUG": None, - "TESTING": False, - "PROPAGATE_EXCEPTIONS": None, - "PRESERVE_CONTEXT_ON_EXCEPTION": None, - "SECRET_KEY": None, - "PERMANENT_SESSION_LIFETIME": timedelta(days=31), - "USE_X_SENDFILE": False, - "SERVER_NAME": None, - "APPLICATION_ROOT": "/", - "SESSION_COOKIE_NAME": "session", - "SESSION_COOKIE_DOMAIN": None, - "SESSION_COOKIE_PATH": None, - "SESSION_COOKIE_HTTPONLY": True, - "SESSION_COOKIE_SECURE": False, - "SESSION_COOKIE_SAMESITE": None, - "SESSION_REFRESH_EACH_REQUEST": True, - "MAX_CONTENT_LENGTH": None, - "SEND_FILE_MAX_AGE_DEFAULT": None, - "TRAP_BAD_REQUEST_ERRORS": None, - "TRAP_HTTP_EXCEPTIONS": False, - "EXPLAIN_TEMPLATE_LOADING": False, - "PREFERRED_URL_SCHEME": "http", - "JSON_AS_ASCII": True, - "JSON_SORT_KEYS": True, - "JSONIFY_PRETTYPRINT_REGULAR": False, - "JSONIFY_MIMETYPE": "application/json", - "TEMPLATES_AUTO_RELOAD": None, - "MAX_COOKIE_SIZE": 4093, - } - ) - - #: The rule object to use for URL rules created. This is used by - #: :meth:`add_url_rule`. Defaults to :class:`werkzeug.routing.Rule`. - #: - #: .. versionadded:: 0.7 - url_rule_class = Rule - - #: The map object to use for storing the URL rules and routing - #: configuration parameters. Defaults to :class:`werkzeug.routing.Map`. - #: - #: .. versionadded:: 1.1.0 - url_map_class = Map - - #: the test client that is used with when `test_client` is used. - #: - #: .. versionadded:: 0.7 - test_client_class: t.Optional[t.Type["FlaskClient"]] = None - - #: The :class:`~click.testing.CliRunner` subclass, by default - #: :class:`~flask.testing.FlaskCliRunner` that is used by - #: :meth:`test_cli_runner`. Its ``__init__`` method should take a - #: Flask app object as the first argument. - #: - #: .. versionadded:: 1.0 - test_cli_runner_class: t.Optional[t.Type["FlaskCliRunner"]] = None - - #: the session interface to use. By default an instance of - #: :class:`~flask.sessions.SecureCookieSessionInterface` is used here. - #: - #: .. versionadded:: 0.8 - session_interface = SecureCookieSessionInterface() - - def __init__( - self, - import_name: str, - static_url_path: t.Optional[str] = None, - static_folder: t.Optional[str] = "static", - static_host: t.Optional[str] = None, - host_matching: bool = False, - subdomain_matching: bool = False, - template_folder: t.Optional[str] = "templates", - instance_path: t.Optional[str] = None, - instance_relative_config: bool = False, - root_path: t.Optional[str] = None, - ): - super().__init__( - import_name=import_name, - static_folder=static_folder, - static_url_path=static_url_path, - template_folder=template_folder, - root_path=root_path, - ) - - if instance_path is None: - instance_path = self.auto_find_instance_path() - elif not os.path.isabs(instance_path): - raise ValueError( - "If an instance path is provided it must be absolute." - " A relative path was given instead." - ) - - #: Holds the path to the instance folder. - #: - #: .. versionadded:: 0.8 - self.instance_path = instance_path - - #: The configuration dictionary as :class:`Config`. This behaves - #: exactly like a regular dictionary but supports additional methods - #: to load a config from files. - self.config = self.make_config(instance_relative_config) - - #: A list of functions that are called when :meth:`url_for` raises a - #: :exc:`~werkzeug.routing.BuildError`. Each function registered here - #: is called with `error`, `endpoint` and `values`. If a function - #: returns ``None`` or raises a :exc:`BuildError` the next function is - #: tried. - #: - #: .. versionadded:: 0.9 - self.url_build_error_handlers: t.List[ - t.Callable[[Exception, str, dict], str] - ] = [] - - #: A list of functions that will be called at the beginning of the - #: first request to this instance. To register a function, use the - #: :meth:`before_first_request` decorator. - #: - #: .. versionadded:: 0.8 - self.before_first_request_funcs: t.List[BeforeRequestCallable] = [] - - #: A list of functions that are called when the application context - #: is destroyed. Since the application context is also torn down - #: if the request ends this is the place to store code that disconnects - #: from databases. - #: - #: .. versionadded:: 0.9 - self.teardown_appcontext_funcs: t.List[TeardownCallable] = [] - - #: A list of shell context processor functions that should be run - #: when a shell context is created. - #: - #: .. versionadded:: 0.11 - self.shell_context_processors: t.List[t.Callable[[], t.Dict[str, t.Any]]] = [] - - #: Maps registered blueprint names to blueprint objects. The - #: dict retains the order the blueprints were registered in. - #: Blueprints can be registered multiple times, this dict does - #: not track how often they were attached. - #: - #: .. versionadded:: 0.7 - self.blueprints: t.Dict[str, "Blueprint"] = {} - - #: a place where extensions can store application specific state. For - #: example this is where an extension could store database engines and - #: similar things. - #: - #: The key must match the name of the extension module. For example in - #: case of a "Flask-Foo" extension in `flask_foo`, the key would be - #: ``'foo'``. - #: - #: .. versionadded:: 0.7 - self.extensions: dict = {} - - #: The :class:`~werkzeug.routing.Map` for this instance. You can use - #: this to change the routing converters after the class was created - #: but before any routes are connected. Example:: - #: - #: from werkzeug.routing import BaseConverter - #: - #: class ListConverter(BaseConverter): - #: def to_python(self, value): - #: return value.split(',') - #: def to_url(self, values): - #: return ','.join(super(ListConverter, self).to_url(value) - #: for value in values) - #: - #: app = Flask(__name__) - #: app.url_map.converters['list'] = ListConverter - self.url_map = self.url_map_class() - - self.url_map.host_matching = host_matching - self.subdomain_matching = subdomain_matching - - # tracks internally if the application already handled at least one - # request. - self._got_first_request = False - self._before_request_lock = Lock() - - # Add a static route using the provided static_url_path, static_host, - # and static_folder if there is a configured static_folder. - # Note we do this without checking if static_folder exists. - # For one, it might be created while the server is running (e.g. during - # development). Also, Google App Engine stores static files somewhere - if self.has_static_folder: - assert ( - bool(static_host) == host_matching - ), "Invalid static_host/host_matching combination" - # Use a weakref to avoid creating a reference cycle between the app - # and the view function (see #3761). - self_ref = weakref.ref(self) - self.add_url_rule( - f"{self.static_url_path}/", - endpoint="static", - host=static_host, - view_func=lambda **kw: self_ref().send_static_file(**kw), # type: ignore # noqa: B950 - ) - - # Set the name of the Click group in case someone wants to add - # the app's commands to another CLI tool. - self.cli.name = self.name - - def _is_setup_finished(self) -> bool: - return self.debug and self._got_first_request - - @locked_cached_property - def name(self) -> str: # type: ignore - """The name of the application. This is usually the import name - with the difference that it's guessed from the run file if the - import name is main. This name is used as a display name when - Flask needs the name of the application. It can be set and overridden - to change the value. - - .. versionadded:: 0.8 - """ - if self.import_name == "__main__": - fn = getattr(sys.modules["__main__"], "__file__", None) - if fn is None: - return "__main__" - return os.path.splitext(os.path.basename(fn))[0] - return self.import_name - - @property - def propagate_exceptions(self) -> bool: - """Returns the value of the ``PROPAGATE_EXCEPTIONS`` configuration - value in case it's set, otherwise a sensible default is returned. - - .. versionadded:: 0.7 - """ - rv = self.config["PROPAGATE_EXCEPTIONS"] - if rv is not None: - return rv - return self.testing or self.debug - - @property - def preserve_context_on_exception(self) -> bool: - """Returns the value of the ``PRESERVE_CONTEXT_ON_EXCEPTION`` - configuration value in case it's set, otherwise a sensible default - is returned. - - .. versionadded:: 0.7 - """ - rv = self.config["PRESERVE_CONTEXT_ON_EXCEPTION"] - if rv is not None: - return rv - return self.debug - - @locked_cached_property - def logger(self) -> logging.Logger: - """A standard Python :class:`~logging.Logger` for the app, with - the same name as :attr:`name`. - - In debug mode, the logger's :attr:`~logging.Logger.level` will - be set to :data:`~logging.DEBUG`. - - If there are no handlers configured, a default handler will be - added. See :doc:`/logging` for more information. - - .. versionchanged:: 1.1.0 - The logger takes the same name as :attr:`name` rather than - hard-coding ``"flask.app"``. - - .. versionchanged:: 1.0.0 - Behavior was simplified. The logger is always named - ``"flask.app"``. The level is only set during configuration, - it doesn't check ``app.debug`` each time. Only one format is - used, not different ones depending on ``app.debug``. No - handlers are removed, and a handler is only added if no - handlers are already configured. - - .. versionadded:: 0.3 - """ - return create_logger(self) - - @locked_cached_property - def jinja_env(self) -> Environment: - """The Jinja environment used to load templates. - - The environment is created the first time this property is - accessed. Changing :attr:`jinja_options` after that will have no - effect. - """ - return self.create_jinja_environment() - - @property - def got_first_request(self) -> bool: - """This attribute is set to ``True`` if the application started - handling the first request. - - .. versionadded:: 0.8 - """ - return self._got_first_request - - def make_config(self, instance_relative: bool = False) -> Config: - """Used to create the config attribute by the Flask constructor. - The `instance_relative` parameter is passed in from the constructor - of Flask (there named `instance_relative_config`) and indicates if - the config should be relative to the instance path or the root path - of the application. - - .. versionadded:: 0.8 - """ - root_path = self.root_path - if instance_relative: - root_path = self.instance_path - defaults = dict(self.default_config) - defaults["ENV"] = get_env() - defaults["DEBUG"] = get_debug_flag() - return self.config_class(root_path, defaults) - - def auto_find_instance_path(self) -> str: - """Tries to locate the instance path if it was not provided to the - constructor of the application class. It will basically calculate - the path to a folder named ``instance`` next to your main file or - the package. - - .. versionadded:: 0.8 - """ - prefix, package_path = find_package(self.import_name) - if prefix is None: - return os.path.join(package_path, "instance") - return os.path.join(prefix, "var", f"{self.name}-instance") - - def open_instance_resource(self, resource: str, mode: str = "rb") -> t.IO[t.AnyStr]: - """Opens a resource from the application's instance folder - (:attr:`instance_path`). Otherwise works like - :meth:`open_resource`. Instance resources can also be opened for - writing. - - :param resource: the name of the resource. To access resources within - subfolders use forward slashes as separator. - :param mode: resource file opening mode, default is 'rb'. - """ - return open(os.path.join(self.instance_path, resource), mode) - - @property - def templates_auto_reload(self) -> bool: - """Reload templates when they are changed. Used by - :meth:`create_jinja_environment`. - - This attribute can be configured with :data:`TEMPLATES_AUTO_RELOAD`. If - not set, it will be enabled in debug mode. - - .. versionadded:: 1.0 - This property was added but the underlying config and behavior - already existed. - """ - rv = self.config["TEMPLATES_AUTO_RELOAD"] - return rv if rv is not None else self.debug - - @templates_auto_reload.setter - def templates_auto_reload(self, value: bool) -> None: - self.config["TEMPLATES_AUTO_RELOAD"] = value - - def create_jinja_environment(self) -> Environment: - """Create the Jinja environment based on :attr:`jinja_options` - and the various Jinja-related methods of the app. Changing - :attr:`jinja_options` after this will have no effect. Also adds - Flask-related globals and filters to the environment. - - .. versionchanged:: 0.11 - ``Environment.auto_reload`` set in accordance with - ``TEMPLATES_AUTO_RELOAD`` configuration option. - - .. versionadded:: 0.5 - """ - options = dict(self.jinja_options) - - if "autoescape" not in options: - options["autoescape"] = self.select_jinja_autoescape - - if "auto_reload" not in options: - options["auto_reload"] = self.templates_auto_reload - - rv = self.jinja_environment(self, **options) - rv.globals.update( - url_for=url_for, - get_flashed_messages=get_flashed_messages, - config=self.config, - # request, session and g are normally added with the - # context processor for efficiency reasons but for imported - # templates we also want the proxies in there. - request=request, - session=session, - g=g, - ) - rv.policies["json.dumps_function"] = json.dumps - return rv - - def create_global_jinja_loader(self) -> DispatchingJinjaLoader: - """Creates the loader for the Jinja2 environment. Can be used to - override just the loader and keeping the rest unchanged. It's - discouraged to override this function. Instead one should override - the :meth:`jinja_loader` function instead. - - The global loader dispatches between the loaders of the application - and the individual blueprints. - - .. versionadded:: 0.7 - """ - return DispatchingJinjaLoader(self) - - def select_jinja_autoescape(self, filename: str) -> bool: - """Returns ``True`` if autoescaping should be active for the given - template name. If no template name is given, returns `True`. - - .. versionadded:: 0.5 - """ - if filename is None: - return True - return filename.endswith((".html", ".htm", ".xml", ".xhtml")) - - def update_template_context(self, context: dict) -> None: - """Update the template context with some commonly used variables. - This injects request, session, config and g into the template - context as well as everything template context processors want - to inject. Note that the as of Flask 0.6, the original values - in the context will not be overridden if a context processor - decides to return a value with the same key. - - :param context: the context as a dictionary that is updated in place - to add extra variables. - """ - funcs: t.Iterable[ - TemplateContextProcessorCallable - ] = self.template_context_processors[None] - reqctx = _request_ctx_stack.top - if reqctx is not None: - for bp in request.blueprints: - if bp in self.template_context_processors: - funcs = chain(funcs, self.template_context_processors[bp]) - orig_ctx = context.copy() - for func in funcs: - context.update(func()) - # make sure the original values win. This makes it possible to - # easier add new variables in context processors without breaking - # existing views. - context.update(orig_ctx) - - def make_shell_context(self) -> dict: - """Returns the shell context for an interactive shell for this - application. This runs all the registered shell context - processors. - - .. versionadded:: 0.11 - """ - rv = {"app": self, "g": g} - for processor in self.shell_context_processors: - rv.update(processor()) - return rv - - #: What environment the app is running in. Flask and extensions may - #: enable behaviors based on the environment, such as enabling debug - #: mode. This maps to the :data:`ENV` config key. This is set by the - #: :envvar:`FLASK_ENV` environment variable and may not behave as - #: expected if set in code. - #: - #: **Do not enable development when deploying in production.** - #: - #: Default: ``'production'`` - env = ConfigAttribute("ENV") - - @property - def debug(self) -> bool: - """Whether debug mode is enabled. When using ``flask run`` to start - the development server, an interactive debugger will be shown for - unhandled exceptions, and the server will be reloaded when code - changes. This maps to the :data:`DEBUG` config key. This is - enabled when :attr:`env` is ``'development'`` and is overridden - by the ``FLASK_DEBUG`` environment variable. It may not behave as - expected if set in code. - - **Do not enable debug mode when deploying in production.** - - Default: ``True`` if :attr:`env` is ``'development'``, or - ``False`` otherwise. - """ - return self.config["DEBUG"] - - @debug.setter - def debug(self, value: bool) -> None: - self.config["DEBUG"] = value - self.jinja_env.auto_reload = self.templates_auto_reload - - def run( - self, - host: t.Optional[str] = None, - port: t.Optional[int] = None, - debug: t.Optional[bool] = None, - load_dotenv: bool = True, - **options: t.Any, - ) -> None: - """Runs the application on a local development server. - - Do not use ``run()`` in a production setting. It is not intended to - meet security and performance requirements for a production server. - Instead, see :doc:`/deploying/index` for WSGI server recommendations. - - If the :attr:`debug` flag is set the server will automatically reload - for code changes and show a debugger in case an exception happened. - - If you want to run the application in debug mode, but disable the - code execution on the interactive debugger, you can pass - ``use_evalex=False`` as parameter. This will keep the debugger's - traceback screen active, but disable code execution. - - It is not recommended to use this function for development with - automatic reloading as this is badly supported. Instead you should - be using the :command:`flask` command line script's ``run`` support. - - .. admonition:: Keep in Mind - - Flask will suppress any server error with a generic error page - unless it is in debug mode. As such to enable just the - interactive debugger without the code reloading, you have to - invoke :meth:`run` with ``debug=True`` and ``use_reloader=False``. - Setting ``use_debugger`` to ``True`` without being in debug mode - won't catch any exceptions because there won't be any to - catch. - - :param host: the hostname to listen on. Set this to ``'0.0.0.0'`` to - have the server available externally as well. Defaults to - ``'127.0.0.1'`` or the host in the ``SERVER_NAME`` config variable - if present. - :param port: the port of the webserver. Defaults to ``5000`` or the - port defined in the ``SERVER_NAME`` config variable if present. - :param debug: if given, enable or disable debug mode. See - :attr:`debug`. - :param load_dotenv: Load the nearest :file:`.env` and :file:`.flaskenv` - files to set environment variables. Will also change the working - directory to the directory containing the first file found. - :param options: the options to be forwarded to the underlying Werkzeug - server. See :func:`werkzeug.serving.run_simple` for more - information. - - .. versionchanged:: 1.0 - If installed, python-dotenv will be used to load environment - variables from :file:`.env` and :file:`.flaskenv` files. - - If set, the :envvar:`FLASK_ENV` and :envvar:`FLASK_DEBUG` - environment variables will override :attr:`env` and - :attr:`debug`. - - Threaded mode is enabled by default. - - .. versionchanged:: 0.10 - The default port is now picked from the ``SERVER_NAME`` - variable. - """ - # Change this into a no-op if the server is invoked from the - # command line. Have a look at cli.py for more information. - if os.environ.get("FLASK_RUN_FROM_CLI") == "true": - from .debughelpers import explain_ignored_app_run - - explain_ignored_app_run() - return - - if get_load_dotenv(load_dotenv): - cli.load_dotenv() - - # if set, let env vars override previous values - if "FLASK_ENV" in os.environ: - self.env = get_env() - self.debug = get_debug_flag() - elif "FLASK_DEBUG" in os.environ: - self.debug = get_debug_flag() - - # debug passed to method overrides all other sources - if debug is not None: - self.debug = bool(debug) - - server_name = self.config.get("SERVER_NAME") - sn_host = sn_port = None - - if server_name: - sn_host, _, sn_port = server_name.partition(":") - - if not host: - if sn_host: - host = sn_host - else: - host = "127.0.0.1" - - if port or port == 0: - port = int(port) - elif sn_port: - port = int(sn_port) - else: - port = 5000 - - options.setdefault("use_reloader", self.debug) - options.setdefault("use_debugger", self.debug) - options.setdefault("threaded", True) - - cli.show_server_banner(self.env, self.debug, self.name, False) - - from werkzeug.serving import run_simple - - try: - run_simple(t.cast(str, host), port, self, **options) - finally: - # reset the first request information if the development server - # reset normally. This makes it possible to restart the server - # without reloader and that stuff from an interactive shell. - self._got_first_request = False - - def test_client(self, use_cookies: bool = True, **kwargs: t.Any) -> "FlaskClient": - """Creates a test client for this application. For information - about unit testing head over to :doc:`/testing`. - - Note that if you are testing for assertions or exceptions in your - application code, you must set ``app.testing = True`` in order for the - exceptions to propagate to the test client. Otherwise, the exception - will be handled by the application (not visible to the test client) and - the only indication of an AssertionError or other exception will be a - 500 status code response to the test client. See the :attr:`testing` - attribute. For example:: - - app.testing = True - client = app.test_client() - - The test client can be used in a ``with`` block to defer the closing down - of the context until the end of the ``with`` block. This is useful if - you want to access the context locals for testing:: - - with app.test_client() as c: - rv = c.get('/?vodka=42') - assert request.args['vodka'] == '42' - - Additionally, you may pass optional keyword arguments that will then - be passed to the application's :attr:`test_client_class` constructor. - For example:: - - from flask.testing import FlaskClient - - class CustomClient(FlaskClient): - def __init__(self, *args, **kwargs): - self._authentication = kwargs.pop("authentication") - super(CustomClient,self).__init__( *args, **kwargs) - - app.test_client_class = CustomClient - client = app.test_client(authentication='Basic ....') - - See :class:`~flask.testing.FlaskClient` for more information. - - .. versionchanged:: 0.4 - added support for ``with`` block usage for the client. - - .. versionadded:: 0.7 - The `use_cookies` parameter was added as well as the ability - to override the client to be used by setting the - :attr:`test_client_class` attribute. - - .. versionchanged:: 0.11 - Added `**kwargs` to support passing additional keyword arguments to - the constructor of :attr:`test_client_class`. - """ - cls = self.test_client_class - if cls is None: - from .testing import FlaskClient as cls # type: ignore - return cls( # type: ignore - self, self.response_class, use_cookies=use_cookies, **kwargs - ) - - def test_cli_runner(self, **kwargs: t.Any) -> "FlaskCliRunner": - """Create a CLI runner for testing CLI commands. - See :ref:`testing-cli`. - - Returns an instance of :attr:`test_cli_runner_class`, by default - :class:`~flask.testing.FlaskCliRunner`. The Flask app object is - passed as the first argument. - - .. versionadded:: 1.0 - """ - cls = self.test_cli_runner_class - - if cls is None: - from .testing import FlaskCliRunner as cls # type: ignore - - return cls(self, **kwargs) # type: ignore - - @setupmethod - def register_blueprint(self, blueprint: "Blueprint", **options: t.Any) -> None: - """Register a :class:`~flask.Blueprint` on the application. Keyword - arguments passed to this method will override the defaults set on the - blueprint. - - Calls the blueprint's :meth:`~flask.Blueprint.register` method after - recording the blueprint in the application's :attr:`blueprints`. - - :param blueprint: The blueprint to register. - :param url_prefix: Blueprint routes will be prefixed with this. - :param subdomain: Blueprint routes will match on this subdomain. - :param url_defaults: Blueprint routes will use these default values for - view arguments. - :param options: Additional keyword arguments are passed to - :class:`~flask.blueprints.BlueprintSetupState`. They can be - accessed in :meth:`~flask.Blueprint.record` callbacks. - - .. versionchanged:: 2.0.1 - The ``name`` option can be used to change the (pre-dotted) - name the blueprint is registered with. This allows the same - blueprint to be registered multiple times with unique names - for ``url_for``. - - .. versionadded:: 0.7 - """ - blueprint.register(self, options) - - def iter_blueprints(self) -> t.ValuesView["Blueprint"]: - """Iterates over all blueprints by the order they were registered. - - .. versionadded:: 0.11 - """ - return self.blueprints.values() - - @setupmethod - def add_url_rule( - self, - rule: str, - endpoint: t.Optional[str] = None, - view_func: t.Optional[t.Callable] = None, - provide_automatic_options: t.Optional[bool] = None, - **options: t.Any, - ) -> None: - if endpoint is None: - endpoint = _endpoint_from_view_func(view_func) # type: ignore - options["endpoint"] = endpoint - methods = options.pop("methods", None) - - # if the methods are not given and the view_func object knows its - # methods we can use that instead. If neither exists, we go with - # a tuple of only ``GET`` as default. - if methods is None: - methods = getattr(view_func, "methods", None) or ("GET",) - if isinstance(methods, str): - raise TypeError( - "Allowed methods must be a list of strings, for" - ' example: @app.route(..., methods=["POST"])' - ) - methods = {item.upper() for item in methods} - - # Methods that should always be added - required_methods = set(getattr(view_func, "required_methods", ())) - - # starting with Flask 0.8 the view_func object can disable and - # force-enable the automatic options handling. - if provide_automatic_options is None: - provide_automatic_options = getattr( - view_func, "provide_automatic_options", None - ) - - if provide_automatic_options is None: - if "OPTIONS" not in methods: - provide_automatic_options = True - required_methods.add("OPTIONS") - else: - provide_automatic_options = False - - # Add the required methods now. - methods |= required_methods - - rule = self.url_rule_class(rule, methods=methods, **options) - rule.provide_automatic_options = provide_automatic_options # type: ignore - - self.url_map.add(rule) - if view_func is not None: - old_func = self.view_functions.get(endpoint) - if old_func is not None and old_func != view_func: - raise AssertionError( - "View function mapping is overwriting an existing" - f" endpoint function: {endpoint}" - ) - self.view_functions[endpoint] = view_func - - @setupmethod - def template_filter( - self, name: t.Optional[str] = None - ) -> t.Callable[[TemplateFilterCallable], TemplateFilterCallable]: - """A decorator that is used to register custom template filter. - You can specify a name for the filter, otherwise the function - name will be used. Example:: - - @app.template_filter() - def reverse(s): - return s[::-1] - - :param name: the optional name of the filter, otherwise the - function name will be used. - """ - - def decorator(f: TemplateFilterCallable) -> TemplateFilterCallable: - self.add_template_filter(f, name=name) - return f - - return decorator - - @setupmethod - def add_template_filter( - self, f: TemplateFilterCallable, name: t.Optional[str] = None - ) -> None: - """Register a custom template filter. Works exactly like the - :meth:`template_filter` decorator. - - :param name: the optional name of the filter, otherwise the - function name will be used. - """ - self.jinja_env.filters[name or f.__name__] = f - - @setupmethod - def template_test( - self, name: t.Optional[str] = None - ) -> t.Callable[[TemplateTestCallable], TemplateTestCallable]: - """A decorator that is used to register custom template test. - You can specify a name for the test, otherwise the function - name will be used. Example:: - - @app.template_test() - def is_prime(n): - if n == 2: - return True - for i in range(2, int(math.ceil(math.sqrt(n))) + 1): - if n % i == 0: - return False - return True - - .. versionadded:: 0.10 - - :param name: the optional name of the test, otherwise the - function name will be used. - """ - - def decorator(f: TemplateTestCallable) -> TemplateTestCallable: - self.add_template_test(f, name=name) - return f - - return decorator - - @setupmethod - def add_template_test( - self, f: TemplateTestCallable, name: t.Optional[str] = None - ) -> None: - """Register a custom template test. Works exactly like the - :meth:`template_test` decorator. - - .. versionadded:: 0.10 - - :param name: the optional name of the test, otherwise the - function name will be used. - """ - self.jinja_env.tests[name or f.__name__] = f - - @setupmethod - def template_global( - self, name: t.Optional[str] = None - ) -> t.Callable[[TemplateGlobalCallable], TemplateGlobalCallable]: - """A decorator that is used to register a custom template global function. - You can specify a name for the global function, otherwise the function - name will be used. Example:: - - @app.template_global() - def double(n): - return 2 * n - - .. versionadded:: 0.10 - - :param name: the optional name of the global function, otherwise the - function name will be used. - """ - - def decorator(f: TemplateGlobalCallable) -> TemplateGlobalCallable: - self.add_template_global(f, name=name) - return f - - return decorator - - @setupmethod - def add_template_global( - self, f: TemplateGlobalCallable, name: t.Optional[str] = None - ) -> None: - """Register a custom template global function. Works exactly like the - :meth:`template_global` decorator. - - .. versionadded:: 0.10 - - :param name: the optional name of the global function, otherwise the - function name will be used. - """ - self.jinja_env.globals[name or f.__name__] = f - - @setupmethod - def before_first_request(self, f: BeforeRequestCallable) -> BeforeRequestCallable: - """Registers a function to be run before the first request to this - instance of the application. - - The function will be called without any arguments and its return - value is ignored. - - .. versionadded:: 0.8 - """ - self.before_first_request_funcs.append(f) - return f - - @setupmethod - def teardown_appcontext(self, f: TeardownCallable) -> TeardownCallable: - """Registers a function to be called when the application context - ends. These functions are typically also called when the request - context is popped. - - Example:: - - ctx = app.app_context() - ctx.push() - ... - ctx.pop() - - When ``ctx.pop()`` is executed in the above example, the teardown - functions are called just before the app context moves from the - stack of active contexts. This becomes relevant if you are using - such constructs in tests. - - Since a request context typically also manages an application - context it would also be called when you pop a request context. - - When a teardown function was called because of an unhandled exception - it will be passed an error object. If an :meth:`errorhandler` is - registered, it will handle the exception and the teardown will not - receive it. - - The return values of teardown functions are ignored. - - .. versionadded:: 0.9 - """ - self.teardown_appcontext_funcs.append(f) - return f - - @setupmethod - def shell_context_processor(self, f: t.Callable) -> t.Callable: - """Registers a shell context processor function. - - .. versionadded:: 0.11 - """ - self.shell_context_processors.append(f) - return f - - def _find_error_handler(self, e: Exception) -> t.Optional[ErrorHandlerCallable]: - """Return a registered error handler for an exception in this order: - blueprint handler for a specific code, app handler for a specific code, - blueprint handler for an exception class, app handler for an exception - class, or ``None`` if a suitable handler is not found. - """ - exc_class, code = self._get_exc_class_and_code(type(e)) - - for c in [code, None]: - for name in chain(request.blueprints, [None]): - handler_map = self.error_handler_spec[name][c] - - if not handler_map: - continue - - for cls in exc_class.__mro__: - handler = handler_map.get(cls) - - if handler is not None: - return handler - return None - - def handle_http_exception( - self, e: HTTPException - ) -> t.Union[HTTPException, ResponseReturnValue]: - """Handles an HTTP exception. By default this will invoke the - registered error handlers and fall back to returning the - exception as response. - - .. versionchanged:: 1.0.3 - ``RoutingException``, used internally for actions such as - slash redirects during routing, is not passed to error - handlers. - - .. versionchanged:: 1.0 - Exceptions are looked up by code *and* by MRO, so - ``HTTPExcpetion`` subclasses can be handled with a catch-all - handler for the base ``HTTPException``. - - .. versionadded:: 0.3 - """ - # Proxy exceptions don't have error codes. We want to always return - # those unchanged as errors - if e.code is None: - return e - - # RoutingExceptions are used internally to trigger routing - # actions, such as slash redirects raising RequestRedirect. They - # are not raised or handled in user code. - if isinstance(e, RoutingException): - return e - - handler = self._find_error_handler(e) - if handler is None: - return e - return self.ensure_sync(handler)(e) - - def trap_http_exception(self, e: Exception) -> bool: - """Checks if an HTTP exception should be trapped or not. By default - this will return ``False`` for all exceptions except for a bad request - key error if ``TRAP_BAD_REQUEST_ERRORS`` is set to ``True``. It - also returns ``True`` if ``TRAP_HTTP_EXCEPTIONS`` is set to ``True``. - - This is called for all HTTP exceptions raised by a view function. - If it returns ``True`` for any exception the error handler for this - exception is not called and it shows up as regular exception in the - traceback. This is helpful for debugging implicitly raised HTTP - exceptions. - - .. versionchanged:: 1.0 - Bad request errors are not trapped by default in debug mode. - - .. versionadded:: 0.8 - """ - if self.config["TRAP_HTTP_EXCEPTIONS"]: - return True - - trap_bad_request = self.config["TRAP_BAD_REQUEST_ERRORS"] - - # if unset, trap key errors in debug mode - if ( - trap_bad_request is None - and self.debug - and isinstance(e, BadRequestKeyError) - ): - return True - - if trap_bad_request: - return isinstance(e, BadRequest) - - return False - - def handle_user_exception( - self, e: Exception - ) -> t.Union[HTTPException, ResponseReturnValue]: - """This method is called whenever an exception occurs that - should be handled. A special case is :class:`~werkzeug - .exceptions.HTTPException` which is forwarded to the - :meth:`handle_http_exception` method. This function will either - return a response value or reraise the exception with the same - traceback. - - .. versionchanged:: 1.0 - Key errors raised from request data like ``form`` show the - bad key in debug mode rather than a generic bad request - message. - - .. versionadded:: 0.7 - """ - if isinstance(e, BadRequestKeyError) and ( - self.debug or self.config["TRAP_BAD_REQUEST_ERRORS"] - ): - e.show_exception = True - - if isinstance(e, HTTPException) and not self.trap_http_exception(e): - return self.handle_http_exception(e) - - handler = self._find_error_handler(e) - - if handler is None: - raise - - return self.ensure_sync(handler)(e) - - def handle_exception(self, e: Exception) -> Response: - """Handle an exception that did not have an error handler - associated with it, or that was raised from an error handler. - This always causes a 500 ``InternalServerError``. - - Always sends the :data:`got_request_exception` signal. - - If :attr:`propagate_exceptions` is ``True``, such as in debug - mode, the error will be re-raised so that the debugger can - display it. Otherwise, the original exception is logged, and - an :exc:`~werkzeug.exceptions.InternalServerError` is returned. - - If an error handler is registered for ``InternalServerError`` or - ``500``, it will be used. For consistency, the handler will - always receive the ``InternalServerError``. The original - unhandled exception is available as ``e.original_exception``. - - .. versionchanged:: 1.1.0 - Always passes the ``InternalServerError`` instance to the - handler, setting ``original_exception`` to the unhandled - error. - - .. versionchanged:: 1.1.0 - ``after_request`` functions and other finalization is done - even for the default 500 response when there is no handler. - - .. versionadded:: 0.3 - """ - exc_info = sys.exc_info() - got_request_exception.send(self, exception=e) - - if self.propagate_exceptions: - # Re-raise if called with an active exception, otherwise - # raise the passed in exception. - if exc_info[1] is e: - raise - - raise e - - self.log_exception(exc_info) - server_error: t.Union[InternalServerError, ResponseReturnValue] - server_error = InternalServerError(original_exception=e) - handler = self._find_error_handler(server_error) - - if handler is not None: - server_error = self.ensure_sync(handler)(server_error) - - return self.finalize_request(server_error, from_error_handler=True) - - def log_exception( - self, - exc_info: t.Union[ - t.Tuple[type, BaseException, TracebackType], t.Tuple[None, None, None] - ], - ) -> None: - """Logs an exception. This is called by :meth:`handle_exception` - if debugging is disabled and right before the handler is called. - The default implementation logs the exception as error on the - :attr:`logger`. - - .. versionadded:: 0.8 - """ - self.logger.error( - f"Exception on {request.path} [{request.method}]", exc_info=exc_info - ) - - def raise_routing_exception(self, request: Request) -> "te.NoReturn": - """Exceptions that are recording during routing are reraised with - this method. During debug we are not reraising redirect requests - for non ``GET``, ``HEAD``, or ``OPTIONS`` requests and we're raising - a different error instead to help debug situations. - - :internal: - """ - if ( - not self.debug - or not isinstance(request.routing_exception, RequestRedirect) - or request.method in ("GET", "HEAD", "OPTIONS") - ): - raise request.routing_exception # type: ignore - - from .debughelpers import FormDataRoutingRedirect - - raise FormDataRoutingRedirect(request) - - def dispatch_request(self) -> ResponseReturnValue: - """Does the request dispatching. Matches the URL and returns the - return value of the view or error handler. This does not have to - be a response object. In order to convert the return value to a - proper response object, call :func:`make_response`. - - .. versionchanged:: 0.7 - This no longer does the exception handling, this code was - moved to the new :meth:`full_dispatch_request`. - """ - req = _request_ctx_stack.top.request - if req.routing_exception is not None: - self.raise_routing_exception(req) - rule = req.url_rule - # if we provide automatic options for this URL and the - # request came with the OPTIONS method, reply automatically - if ( - getattr(rule, "provide_automatic_options", False) - and req.method == "OPTIONS" - ): - return self.make_default_options_response() - # otherwise dispatch to the handler for that endpoint - return self.ensure_sync(self.view_functions[rule.endpoint])(**req.view_args) - - def full_dispatch_request(self) -> Response: - """Dispatches the request and on top of that performs request - pre and postprocessing as well as HTTP exception catching and - error handling. - - .. versionadded:: 0.7 - """ - self.try_trigger_before_first_request_functions() - try: - request_started.send(self) - rv = self.preprocess_request() - if rv is None: - rv = self.dispatch_request() - except Exception as e: - rv = self.handle_user_exception(e) - return self.finalize_request(rv) - - def finalize_request( - self, - rv: t.Union[ResponseReturnValue, HTTPException], - from_error_handler: bool = False, - ) -> Response: - """Given the return value from a view function this finalizes - the request by converting it into a response and invoking the - postprocessing functions. This is invoked for both normal - request dispatching as well as error handlers. - - Because this means that it might be called as a result of a - failure a special safe mode is available which can be enabled - with the `from_error_handler` flag. If enabled, failures in - response processing will be logged and otherwise ignored. - - :internal: - """ - response = self.make_response(rv) - try: - response = self.process_response(response) - request_finished.send(self, response=response) - except Exception: - if not from_error_handler: - raise - self.logger.exception( - "Request finalizing failed with an error while handling an error" - ) - return response - - def try_trigger_before_first_request_functions(self) -> None: - """Called before each request and will ensure that it triggers - the :attr:`before_first_request_funcs` and only exactly once per - application instance (which means process usually). - - :internal: - """ - if self._got_first_request: - return - with self._before_request_lock: - if self._got_first_request: - return - for func in self.before_first_request_funcs: - self.ensure_sync(func)() - self._got_first_request = True - - def make_default_options_response(self) -> Response: - """This method is called to create the default ``OPTIONS`` response. - This can be changed through subclassing to change the default - behavior of ``OPTIONS`` responses. - - .. versionadded:: 0.7 - """ - adapter = _request_ctx_stack.top.url_adapter - methods = adapter.allowed_methods() - rv = self.response_class() - rv.allow.update(methods) - return rv - - def should_ignore_error(self, error: t.Optional[BaseException]) -> bool: - """This is called to figure out if an error should be ignored - or not as far as the teardown system is concerned. If this - function returns ``True`` then the teardown handlers will not be - passed the error. - - .. versionadded:: 0.10 - """ - return False - - def ensure_sync(self, func: t.Callable) -> t.Callable: - """Ensure that the function is synchronous for WSGI workers. - Plain ``def`` functions are returned as-is. ``async def`` - functions are wrapped to run and wait for the response. - - Override this method to change how the app runs async views. - - .. versionadded:: 2.0 - """ - if iscoroutinefunction(func): - return self.async_to_sync(func) - - return func - - def async_to_sync( - self, func: t.Callable[..., t.Coroutine] - ) -> t.Callable[..., t.Any]: - """Return a sync function that will run the coroutine function. - - .. code-block:: python - - result = app.async_to_sync(func)(*args, **kwargs) - - Override this method to change how the app converts async code - to be synchronously callable. - - .. versionadded:: 2.0 - """ - try: - from asgiref.sync import async_to_sync as asgiref_async_to_sync - except ImportError: - raise RuntimeError( - "Install Flask with the 'async' extra in order to use async views." - ) - - # Check that Werkzeug isn't using its fallback ContextVar class. - if ContextVar.__module__ == "werkzeug.local": - raise RuntimeError( - "Async cannot be used with this combination of Python " - "and Greenlet versions." - ) - - return asgiref_async_to_sync(func) - - def make_response(self, rv: ResponseReturnValue) -> Response: - """Convert the return value from a view function to an instance of - :attr:`response_class`. - - :param rv: the return value from the view function. The view function - must return a response. Returning ``None``, or the view ending - without returning, is not allowed. The following types are allowed - for ``view_rv``: - - ``str`` - A response object is created with the string encoded to UTF-8 - as the body. - - ``bytes`` - A response object is created with the bytes as the body. - - ``dict`` - A dictionary that will be jsonify'd before being returned. - - ``tuple`` - Either ``(body, status, headers)``, ``(body, status)``, or - ``(body, headers)``, where ``body`` is any of the other types - allowed here, ``status`` is a string or an integer, and - ``headers`` is a dictionary or a list of ``(key, value)`` - tuples. If ``body`` is a :attr:`response_class` instance, - ``status`` overwrites the exiting value and ``headers`` are - extended. - - :attr:`response_class` - The object is returned unchanged. - - other :class:`~werkzeug.wrappers.Response` class - The object is coerced to :attr:`response_class`. - - :func:`callable` - The function is called as a WSGI application. The result is - used to create a response object. - - .. versionchanged:: 0.9 - Previously a tuple was interpreted as the arguments for the - response object. - """ - - status = headers = None - - # unpack tuple returns - if isinstance(rv, tuple): - len_rv = len(rv) - - # a 3-tuple is unpacked directly - if len_rv == 3: - rv, status, headers = rv - # decide if a 2-tuple has status or headers - elif len_rv == 2: - if isinstance(rv[1], (Headers, dict, tuple, list)): - rv, headers = rv - else: - rv, status = rv - # other sized tuples are not allowed - else: - raise TypeError( - "The view function did not return a valid response tuple." - " The tuple must have the form (body, status, headers)," - " (body, status), or (body, headers)." - ) - - # the body must not be None - if rv is None: - raise TypeError( - f"The view function for {request.endpoint!r} did not" - " return a valid response. The function either returned" - " None or ended without a return statement." - ) - - # make sure the body is an instance of the response class - if not isinstance(rv, self.response_class): - if isinstance(rv, (str, bytes, bytearray)): - # let the response class set the status and headers instead of - # waiting to do it manually, so that the class can handle any - # special logic - rv = self.response_class(rv, status=status, headers=headers) - status = headers = None - elif isinstance(rv, dict): - rv = jsonify(rv) - elif isinstance(rv, BaseResponse) or callable(rv): - # evaluate a WSGI callable, or coerce a different response - # class to the correct type - try: - rv = self.response_class.force_type(rv, request.environ) # type: ignore # noqa: B950 - except TypeError as e: - raise TypeError( - f"{e}\nThe view function did not return a valid" - " response. The return type must be a string," - " dict, tuple, Response instance, or WSGI" - f" callable, but it was a {type(rv).__name__}." - ).with_traceback(sys.exc_info()[2]) - else: - raise TypeError( - "The view function did not return a valid" - " response. The return type must be a string," - " dict, tuple, Response instance, or WSGI" - f" callable, but it was a {type(rv).__name__}." - ) - - rv = t.cast(Response, rv) - # prefer the status if it was provided - if status is not None: - if isinstance(status, (str, bytes, bytearray)): - rv.status = status # type: ignore - else: - rv.status_code = status - - # extend existing headers with provided headers - if headers: - rv.headers.update(headers) - - return rv - - def create_url_adapter( - self, request: t.Optional[Request] - ) -> t.Optional[MapAdapter]: - """Creates a URL adapter for the given request. The URL adapter - is created at a point where the request context is not yet set - up so the request is passed explicitly. - - .. versionadded:: 0.6 - - .. versionchanged:: 0.9 - This can now also be called without a request object when the - URL adapter is created for the application context. - - .. versionchanged:: 1.0 - :data:`SERVER_NAME` no longer implicitly enables subdomain - matching. Use :attr:`subdomain_matching` instead. - """ - if request is not None: - # If subdomain matching is disabled (the default), use the - # default subdomain in all cases. This should be the default - # in Werkzeug but it currently does not have that feature. - if not self.subdomain_matching: - subdomain = self.url_map.default_subdomain or None - else: - subdomain = None - - return self.url_map.bind_to_environ( - request.environ, - server_name=self.config["SERVER_NAME"], - subdomain=subdomain, - ) - # We need at the very least the server name to be set for this - # to work. - if self.config["SERVER_NAME"] is not None: - return self.url_map.bind( - self.config["SERVER_NAME"], - script_name=self.config["APPLICATION_ROOT"], - url_scheme=self.config["PREFERRED_URL_SCHEME"], - ) - - return None - - def inject_url_defaults(self, endpoint: str, values: dict) -> None: - """Injects the URL defaults for the given endpoint directly into - the values dictionary passed. This is used internally and - automatically called on URL building. - - .. versionadded:: 0.7 - """ - funcs: t.Iterable[URLDefaultCallable] = self.url_default_functions[None] - - if "." in endpoint: - # This is called by url_for, which can be called outside a - # request, can't use request.blueprints. - bps = _split_blueprint_path(endpoint.rpartition(".")[0]) - bp_funcs = chain.from_iterable(self.url_default_functions[bp] for bp in bps) - funcs = chain(funcs, bp_funcs) - - for func in funcs: - func(endpoint, values) - - def handle_url_build_error( - self, error: Exception, endpoint: str, values: dict - ) -> str: - """Handle :class:`~werkzeug.routing.BuildError` on - :meth:`url_for`. - """ - for handler in self.url_build_error_handlers: - try: - rv = handler(error, endpoint, values) - except BuildError as e: - # make error available outside except block - error = e - else: - if rv is not None: - return rv - - # Re-raise if called with an active exception, otherwise raise - # the passed in exception. - if error is sys.exc_info()[1]: - raise - - raise error - - def preprocess_request(self) -> t.Optional[ResponseReturnValue]: - """Called before the request is dispatched. Calls - :attr:`url_value_preprocessors` registered with the app and the - current blueprint (if any). Then calls :attr:`before_request_funcs` - registered with the app and the blueprint. - - If any :meth:`before_request` handler returns a non-None value, the - value is handled as if it was the return value from the view, and - further request handling is stopped. - """ - - funcs: t.Iterable[URLValuePreprocessorCallable] = self.url_value_preprocessors[ - None - ] - for bp in request.blueprints: - if bp in self.url_value_preprocessors: - funcs = chain(funcs, self.url_value_preprocessors[bp]) - for func in funcs: - func(request.endpoint, request.view_args) - - funcs: t.Iterable[BeforeRequestCallable] = self.before_request_funcs[None] - for bp in request.blueprints: - if bp in self.before_request_funcs: - funcs = chain(funcs, self.before_request_funcs[bp]) - for func in funcs: - rv = self.ensure_sync(func)() - if rv is not None: - return rv - - return None - - def process_response(self, response: Response) -> Response: - """Can be overridden in order to modify the response object - before it's sent to the WSGI server. By default this will - call all the :meth:`after_request` decorated functions. - - .. versionchanged:: 0.5 - As of Flask 0.5 the functions registered for after request - execution are called in reverse order of registration. - - :param response: a :attr:`response_class` object. - :return: a new response object or the same, has to be an - instance of :attr:`response_class`. - """ - ctx = _request_ctx_stack.top - funcs: t.Iterable[AfterRequestCallable] = ctx._after_request_functions - for bp in request.blueprints: - if bp in self.after_request_funcs: - funcs = chain(funcs, reversed(self.after_request_funcs[bp])) - if None in self.after_request_funcs: - funcs = chain(funcs, reversed(self.after_request_funcs[None])) - for handler in funcs: - response = self.ensure_sync(handler)(response) - if not self.session_interface.is_null_session(ctx.session): - self.session_interface.save_session(self, ctx.session, response) - return response - - def do_teardown_request( - self, exc: t.Optional[BaseException] = _sentinel # type: ignore - ) -> None: - """Called after the request is dispatched and the response is - returned, right before the request context is popped. - - This calls all functions decorated with - :meth:`teardown_request`, and :meth:`Blueprint.teardown_request` - if a blueprint handled the request. Finally, the - :data:`request_tearing_down` signal is sent. - - This is called by - :meth:`RequestContext.pop() `, - which may be delayed during testing to maintain access to - resources. - - :param exc: An unhandled exception raised while dispatching the - request. Detected from the current exception information if - not passed. Passed to each teardown function. - - .. versionchanged:: 0.9 - Added the ``exc`` argument. - """ - if exc is _sentinel: - exc = sys.exc_info()[1] - funcs: t.Iterable[TeardownCallable] = reversed( - self.teardown_request_funcs[None] - ) - for bp in request.blueprints: - if bp in self.teardown_request_funcs: - funcs = chain(funcs, reversed(self.teardown_request_funcs[bp])) - for func in funcs: - self.ensure_sync(func)(exc) - request_tearing_down.send(self, exc=exc) - - def do_teardown_appcontext( - self, exc: t.Optional[BaseException] = _sentinel # type: ignore - ) -> None: - """Called right before the application context is popped. - - When handling a request, the application context is popped - after the request context. See :meth:`do_teardown_request`. - - This calls all functions decorated with - :meth:`teardown_appcontext`. Then the - :data:`appcontext_tearing_down` signal is sent. - - This is called by - :meth:`AppContext.pop() `. - - .. versionadded:: 0.9 - """ - if exc is _sentinel: - exc = sys.exc_info()[1] - for func in reversed(self.teardown_appcontext_funcs): - self.ensure_sync(func)(exc) - appcontext_tearing_down.send(self, exc=exc) - - def app_context(self) -> AppContext: - """Create an :class:`~flask.ctx.AppContext`. Use as a ``with`` - block to push the context, which will make :data:`current_app` - point at this application. - - An application context is automatically pushed by - :meth:`RequestContext.push() ` - when handling a request, and when running a CLI command. Use - this to manually create a context outside of these situations. - - :: - - with app.app_context(): - init_db() - - See :doc:`/appcontext`. - - .. versionadded:: 0.9 - """ - return AppContext(self) - - def request_context(self, environ: dict) -> RequestContext: - """Create a :class:`~flask.ctx.RequestContext` representing a - WSGI environment. Use a ``with`` block to push the context, - which will make :data:`request` point at this request. - - See :doc:`/reqcontext`. - - Typically you should not call this from your own code. A request - context is automatically pushed by the :meth:`wsgi_app` when - handling a request. Use :meth:`test_request_context` to create - an environment and context instead of this method. - - :param environ: a WSGI environment - """ - return RequestContext(self, environ) - - def test_request_context(self, *args: t.Any, **kwargs: t.Any) -> RequestContext: - """Create a :class:`~flask.ctx.RequestContext` for a WSGI - environment created from the given values. This is mostly useful - during testing, where you may want to run a function that uses - request data without dispatching a full request. - - See :doc:`/reqcontext`. - - Use a ``with`` block to push the context, which will make - :data:`request` point at the request for the created - environment. :: - - with test_request_context(...): - generate_report() - - When using the shell, it may be easier to push and pop the - context manually to avoid indentation. :: - - ctx = app.test_request_context(...) - ctx.push() - ... - ctx.pop() - - Takes the same arguments as Werkzeug's - :class:`~werkzeug.test.EnvironBuilder`, with some defaults from - the application. See the linked Werkzeug docs for most of the - available arguments. Flask-specific behavior is listed here. - - :param path: URL path being requested. - :param base_url: Base URL where the app is being served, which - ``path`` is relative to. If not given, built from - :data:`PREFERRED_URL_SCHEME`, ``subdomain``, - :data:`SERVER_NAME`, and :data:`APPLICATION_ROOT`. - :param subdomain: Subdomain name to append to - :data:`SERVER_NAME`. - :param url_scheme: Scheme to use instead of - :data:`PREFERRED_URL_SCHEME`. - :param data: The request body, either as a string or a dict of - form keys and values. - :param json: If given, this is serialized as JSON and passed as - ``data``. Also defaults ``content_type`` to - ``application/json``. - :param args: other positional arguments passed to - :class:`~werkzeug.test.EnvironBuilder`. - :param kwargs: other keyword arguments passed to - :class:`~werkzeug.test.EnvironBuilder`. - """ - from .testing import EnvironBuilder - - builder = EnvironBuilder(self, *args, **kwargs) - - try: - return self.request_context(builder.get_environ()) - finally: - builder.close() - - def wsgi_app(self, environ: dict, start_response: t.Callable) -> t.Any: - """The actual WSGI application. This is not implemented in - :meth:`__call__` so that middlewares can be applied without - losing a reference to the app object. Instead of doing this:: - - app = MyMiddleware(app) - - It's a better idea to do this instead:: - - app.wsgi_app = MyMiddleware(app.wsgi_app) - - Then you still have the original application object around and - can continue to call methods on it. - - .. versionchanged:: 0.7 - Teardown events for the request and app contexts are called - even if an unhandled error occurs. Other events may not be - called depending on when an error occurs during dispatch. - See :ref:`callbacks-and-errors`. - - :param environ: A WSGI environment. - :param start_response: A callable accepting a status code, - a list of headers, and an optional exception context to - start the response. - """ - ctx = self.request_context(environ) - error: t.Optional[BaseException] = None - try: - try: - ctx.push() - response = self.full_dispatch_request() - except Exception as e: - error = e - response = self.handle_exception(e) - except: # noqa: B001 - error = sys.exc_info()[1] - raise - return response(environ, start_response) - finally: - if self.should_ignore_error(error): - error = None - ctx.auto_pop(error) - - def __call__(self, environ: dict, start_response: t.Callable) -> t.Any: - """The WSGI server calls the Flask application object as the - WSGI application. This calls :meth:`wsgi_app`, which can be - wrapped to apply middleware. - """ - return self.wsgi_app(environ, start_response) diff --git a/venv/lib/python3.8/site-packages/flask/blueprints.py b/venv/lib/python3.8/site-packages/flask/blueprints.py deleted file mode 100644 index f3913b3..0000000 --- a/venv/lib/python3.8/site-packages/flask/blueprints.py +++ /dev/null @@ -1,603 +0,0 @@ -import typing as t -from collections import defaultdict -from functools import update_wrapper - -from .scaffold import _endpoint_from_view_func -from .scaffold import _sentinel -from .scaffold import Scaffold -from .typing import AfterRequestCallable -from .typing import BeforeRequestCallable -from .typing import ErrorHandlerCallable -from .typing import TeardownCallable -from .typing import TemplateContextProcessorCallable -from .typing import TemplateFilterCallable -from .typing import TemplateGlobalCallable -from .typing import TemplateTestCallable -from .typing import URLDefaultCallable -from .typing import URLValuePreprocessorCallable - -if t.TYPE_CHECKING: - from .app import Flask - -DeferredSetupFunction = t.Callable[["BlueprintSetupState"], t.Callable] - - -class BlueprintSetupState: - """Temporary holder object for registering a blueprint with the - application. An instance of this class is created by the - :meth:`~flask.Blueprint.make_setup_state` method and later passed - to all register callback functions. - """ - - def __init__( - self, - blueprint: "Blueprint", - app: "Flask", - options: t.Any, - first_registration: bool, - ) -> None: - #: a reference to the current application - self.app = app - - #: a reference to the blueprint that created this setup state. - self.blueprint = blueprint - - #: a dictionary with all options that were passed to the - #: :meth:`~flask.Flask.register_blueprint` method. - self.options = options - - #: as blueprints can be registered multiple times with the - #: application and not everything wants to be registered - #: multiple times on it, this attribute can be used to figure - #: out if the blueprint was registered in the past already. - self.first_registration = first_registration - - subdomain = self.options.get("subdomain") - if subdomain is None: - subdomain = self.blueprint.subdomain - - #: The subdomain that the blueprint should be active for, ``None`` - #: otherwise. - self.subdomain = subdomain - - url_prefix = self.options.get("url_prefix") - if url_prefix is None: - url_prefix = self.blueprint.url_prefix - #: The prefix that should be used for all URLs defined on the - #: blueprint. - self.url_prefix = url_prefix - - self.name = self.options.get("name", blueprint.name) - self.name_prefix = self.options.get("name_prefix", "") - - #: A dictionary with URL defaults that is added to each and every - #: URL that was defined with the blueprint. - self.url_defaults = dict(self.blueprint.url_values_defaults) - self.url_defaults.update(self.options.get("url_defaults", ())) - - def add_url_rule( - self, - rule: str, - endpoint: t.Optional[str] = None, - view_func: t.Optional[t.Callable] = None, - **options: t.Any, - ) -> None: - """A helper method to register a rule (and optionally a view function) - to the application. The endpoint is automatically prefixed with the - blueprint's name. - """ - if self.url_prefix is not None: - if rule: - rule = "/".join((self.url_prefix.rstrip("/"), rule.lstrip("/"))) - else: - rule = self.url_prefix - options.setdefault("subdomain", self.subdomain) - if endpoint is None: - endpoint = _endpoint_from_view_func(view_func) # type: ignore - defaults = self.url_defaults - if "defaults" in options: - defaults = dict(defaults, **options.pop("defaults")) - - self.app.add_url_rule( - rule, - f"{self.name_prefix}.{self.name}.{endpoint}".lstrip("."), - view_func, - defaults=defaults, - **options, - ) - - -class Blueprint(Scaffold): - """Represents a blueprint, a collection of routes and other - app-related functions that can be registered on a real application - later. - - A blueprint is an object that allows defining application functions - without requiring an application object ahead of time. It uses the - same decorators as :class:`~flask.Flask`, but defers the need for an - application by recording them for later registration. - - Decorating a function with a blueprint creates a deferred function - that is called with :class:`~flask.blueprints.BlueprintSetupState` - when the blueprint is registered on an application. - - See :doc:`/blueprints` for more information. - - :param name: The name of the blueprint. Will be prepended to each - endpoint name. - :param import_name: The name of the blueprint package, usually - ``__name__``. This helps locate the ``root_path`` for the - blueprint. - :param static_folder: A folder with static files that should be - served by the blueprint's static route. The path is relative to - the blueprint's root path. Blueprint static files are disabled - by default. - :param static_url_path: The url to serve static files from. - Defaults to ``static_folder``. If the blueprint does not have - a ``url_prefix``, the app's static route will take precedence, - and the blueprint's static files won't be accessible. - :param template_folder: A folder with templates that should be added - to the app's template search path. The path is relative to the - blueprint's root path. Blueprint templates are disabled by - default. Blueprint templates have a lower precedence than those - in the app's templates folder. - :param url_prefix: A path to prepend to all of the blueprint's URLs, - to make them distinct from the rest of the app's routes. - :param subdomain: A subdomain that blueprint routes will match on by - default. - :param url_defaults: A dict of default values that blueprint routes - will receive by default. - :param root_path: By default, the blueprint will automatically set - this based on ``import_name``. In certain situations this - automatic detection can fail, so the path can be specified - manually instead. - - .. versionchanged:: 1.1.0 - Blueprints have a ``cli`` group to register nested CLI commands. - The ``cli_group`` parameter controls the name of the group under - the ``flask`` command. - - .. versionadded:: 0.7 - """ - - warn_on_modifications = False - _got_registered_once = False - - #: Blueprint local JSON encoder class to use. Set to ``None`` to use - #: the app's :class:`~flask.Flask.json_encoder`. - json_encoder = None - #: Blueprint local JSON decoder class to use. Set to ``None`` to use - #: the app's :class:`~flask.Flask.json_decoder`. - json_decoder = None - - def __init__( - self, - name: str, - import_name: str, - static_folder: t.Optional[str] = None, - static_url_path: t.Optional[str] = None, - template_folder: t.Optional[str] = None, - url_prefix: t.Optional[str] = None, - subdomain: t.Optional[str] = None, - url_defaults: t.Optional[dict] = None, - root_path: t.Optional[str] = None, - cli_group: t.Optional[str] = _sentinel, # type: ignore - ): - super().__init__( - import_name=import_name, - static_folder=static_folder, - static_url_path=static_url_path, - template_folder=template_folder, - root_path=root_path, - ) - - if "." in name: - raise ValueError("'name' may not contain a dot '.' character.") - - self.name = name - self.url_prefix = url_prefix - self.subdomain = subdomain - self.deferred_functions: t.List[DeferredSetupFunction] = [] - - if url_defaults is None: - url_defaults = {} - - self.url_values_defaults = url_defaults - self.cli_group = cli_group - self._blueprints: t.List[t.Tuple["Blueprint", dict]] = [] - - def _is_setup_finished(self) -> bool: - return self.warn_on_modifications and self._got_registered_once - - def record(self, func: t.Callable) -> None: - """Registers a function that is called when the blueprint is - registered on the application. This function is called with the - state as argument as returned by the :meth:`make_setup_state` - method. - """ - if self._got_registered_once and self.warn_on_modifications: - from warnings import warn - - warn( - Warning( - "The blueprint was already registered once but is" - " getting modified now. These changes will not show" - " up." - ) - ) - self.deferred_functions.append(func) - - def record_once(self, func: t.Callable) -> None: - """Works like :meth:`record` but wraps the function in another - function that will ensure the function is only called once. If the - blueprint is registered a second time on the application, the - function passed is not called. - """ - - def wrapper(state: BlueprintSetupState) -> None: - if state.first_registration: - func(state) - - return self.record(update_wrapper(wrapper, func)) - - def make_setup_state( - self, app: "Flask", options: dict, first_registration: bool = False - ) -> BlueprintSetupState: - """Creates an instance of :meth:`~flask.blueprints.BlueprintSetupState` - object that is later passed to the register callback functions. - Subclasses can override this to return a subclass of the setup state. - """ - return BlueprintSetupState(self, app, options, first_registration) - - def register_blueprint(self, blueprint: "Blueprint", **options: t.Any) -> None: - """Register a :class:`~flask.Blueprint` on this blueprint. Keyword - arguments passed to this method will override the defaults set - on the blueprint. - - .. versionchanged:: 2.0.1 - The ``name`` option can be used to change the (pre-dotted) - name the blueprint is registered with. This allows the same - blueprint to be registered multiple times with unique names - for ``url_for``. - - .. versionadded:: 2.0 - """ - if blueprint is self: - raise ValueError("Cannot register a blueprint on itself") - self._blueprints.append((blueprint, options)) - - def register(self, app: "Flask", options: dict) -> None: - """Called by :meth:`Flask.register_blueprint` to register all - views and callbacks registered on the blueprint with the - application. Creates a :class:`.BlueprintSetupState` and calls - each :meth:`record` callback with it. - - :param app: The application this blueprint is being registered - with. - :param options: Keyword arguments forwarded from - :meth:`~Flask.register_blueprint`. - - .. versionchanged:: 2.0.1 - Nested blueprints are registered with their dotted name. - This allows different blueprints with the same name to be - nested at different locations. - - .. versionchanged:: 2.0.1 - The ``name`` option can be used to change the (pre-dotted) - name the blueprint is registered with. This allows the same - blueprint to be registered multiple times with unique names - for ``url_for``. - - .. versionchanged:: 2.0.1 - Registering the same blueprint with the same name multiple - times is deprecated and will become an error in Flask 2.1. - """ - first_registration = not any(bp is self for bp in app.blueprints.values()) - name_prefix = options.get("name_prefix", "") - self_name = options.get("name", self.name) - name = f"{name_prefix}.{self_name}".lstrip(".") - - if name in app.blueprints: - existing_at = f" '{name}'" if self_name != name else "" - - if app.blueprints[name] is not self: - raise ValueError( - f"The name '{self_name}' is already registered for" - f" a different blueprint{existing_at}. Use 'name='" - " to provide a unique name." - ) - else: - import warnings - - warnings.warn( - f"The name '{self_name}' is already registered for" - f" this blueprint{existing_at}. Use 'name=' to" - " provide a unique name. This will become an error" - " in Flask 2.1.", - stacklevel=4, - ) - - app.blueprints[name] = self - self._got_registered_once = True - state = self.make_setup_state(app, options, first_registration) - - if self.has_static_folder: - state.add_url_rule( - f"{self.static_url_path}/", - view_func=self.send_static_file, - endpoint="static", - ) - - # Merge blueprint data into parent. - if first_registration: - - def extend(bp_dict, parent_dict): - for key, values in bp_dict.items(): - key = name if key is None else f"{name}.{key}" - parent_dict[key].extend(values) - - for key, value in self.error_handler_spec.items(): - key = name if key is None else f"{name}.{key}" - value = defaultdict( - dict, - { - code: { - exc_class: func for exc_class, func in code_values.items() - } - for code, code_values in value.items() - }, - ) - app.error_handler_spec[key] = value - - for endpoint, func in self.view_functions.items(): - app.view_functions[endpoint] = func - - extend(self.before_request_funcs, app.before_request_funcs) - extend(self.after_request_funcs, app.after_request_funcs) - extend( - self.teardown_request_funcs, - app.teardown_request_funcs, - ) - extend(self.url_default_functions, app.url_default_functions) - extend(self.url_value_preprocessors, app.url_value_preprocessors) - extend(self.template_context_processors, app.template_context_processors) - - for deferred in self.deferred_functions: - deferred(state) - - cli_resolved_group = options.get("cli_group", self.cli_group) - - if self.cli.commands: - if cli_resolved_group is None: - app.cli.commands.update(self.cli.commands) - elif cli_resolved_group is _sentinel: - self.cli.name = name - app.cli.add_command(self.cli) - else: - self.cli.name = cli_resolved_group - app.cli.add_command(self.cli) - - for blueprint, bp_options in self._blueprints: - bp_options = bp_options.copy() - bp_url_prefix = bp_options.get("url_prefix") - - if bp_url_prefix is None: - bp_url_prefix = blueprint.url_prefix - - if state.url_prefix is not None and bp_url_prefix is not None: - bp_options["url_prefix"] = ( - state.url_prefix.rstrip("/") + "/" + bp_url_prefix.lstrip("/") - ) - elif bp_url_prefix is not None: - bp_options["url_prefix"] = bp_url_prefix - elif state.url_prefix is not None: - bp_options["url_prefix"] = state.url_prefix - - bp_options["name_prefix"] = name - blueprint.register(app, bp_options) - - def add_url_rule( - self, - rule: str, - endpoint: t.Optional[str] = None, - view_func: t.Optional[t.Callable] = None, - provide_automatic_options: t.Optional[bool] = None, - **options: t.Any, - ) -> None: - """Like :meth:`Flask.add_url_rule` but for a blueprint. The endpoint for - the :func:`url_for` function is prefixed with the name of the blueprint. - """ - if endpoint and "." in endpoint: - raise ValueError("'endpoint' may not contain a dot '.' character.") - - if view_func and hasattr(view_func, "__name__") and "." in view_func.__name__: - raise ValueError("'view_func' name may not contain a dot '.' character.") - - self.record( - lambda s: s.add_url_rule( - rule, - endpoint, - view_func, - provide_automatic_options=provide_automatic_options, - **options, - ) - ) - - def app_template_filter( - self, name: t.Optional[str] = None - ) -> t.Callable[[TemplateFilterCallable], TemplateFilterCallable]: - """Register a custom template filter, available application wide. Like - :meth:`Flask.template_filter` but for a blueprint. - - :param name: the optional name of the filter, otherwise the - function name will be used. - """ - - def decorator(f: TemplateFilterCallable) -> TemplateFilterCallable: - self.add_app_template_filter(f, name=name) - return f - - return decorator - - def add_app_template_filter( - self, f: TemplateFilterCallable, name: t.Optional[str] = None - ) -> None: - """Register a custom template filter, available application wide. Like - :meth:`Flask.add_template_filter` but for a blueprint. Works exactly - like the :meth:`app_template_filter` decorator. - - :param name: the optional name of the filter, otherwise the - function name will be used. - """ - - def register_template(state: BlueprintSetupState) -> None: - state.app.jinja_env.filters[name or f.__name__] = f - - self.record_once(register_template) - - def app_template_test( - self, name: t.Optional[str] = None - ) -> t.Callable[[TemplateTestCallable], TemplateTestCallable]: - """Register a custom template test, available application wide. Like - :meth:`Flask.template_test` but for a blueprint. - - .. versionadded:: 0.10 - - :param name: the optional name of the test, otherwise the - function name will be used. - """ - - def decorator(f: TemplateTestCallable) -> TemplateTestCallable: - self.add_app_template_test(f, name=name) - return f - - return decorator - - def add_app_template_test( - self, f: TemplateTestCallable, name: t.Optional[str] = None - ) -> None: - """Register a custom template test, available application wide. Like - :meth:`Flask.add_template_test` but for a blueprint. Works exactly - like the :meth:`app_template_test` decorator. - - .. versionadded:: 0.10 - - :param name: the optional name of the test, otherwise the - function name will be used. - """ - - def register_template(state: BlueprintSetupState) -> None: - state.app.jinja_env.tests[name or f.__name__] = f - - self.record_once(register_template) - - def app_template_global( - self, name: t.Optional[str] = None - ) -> t.Callable[[TemplateGlobalCallable], TemplateGlobalCallable]: - """Register a custom template global, available application wide. Like - :meth:`Flask.template_global` but for a blueprint. - - .. versionadded:: 0.10 - - :param name: the optional name of the global, otherwise the - function name will be used. - """ - - def decorator(f: TemplateGlobalCallable) -> TemplateGlobalCallable: - self.add_app_template_global(f, name=name) - return f - - return decorator - - def add_app_template_global( - self, f: TemplateGlobalCallable, name: t.Optional[str] = None - ) -> None: - """Register a custom template global, available application wide. Like - :meth:`Flask.add_template_global` but for a blueprint. Works exactly - like the :meth:`app_template_global` decorator. - - .. versionadded:: 0.10 - - :param name: the optional name of the global, otherwise the - function name will be used. - """ - - def register_template(state: BlueprintSetupState) -> None: - state.app.jinja_env.globals[name or f.__name__] = f - - self.record_once(register_template) - - def before_app_request(self, f: BeforeRequestCallable) -> BeforeRequestCallable: - """Like :meth:`Flask.before_request`. Such a function is executed - before each request, even if outside of a blueprint. - """ - self.record_once( - lambda s: s.app.before_request_funcs.setdefault(None, []).append(f) - ) - return f - - def before_app_first_request( - self, f: BeforeRequestCallable - ) -> BeforeRequestCallable: - """Like :meth:`Flask.before_first_request`. Such a function is - executed before the first request to the application. - """ - self.record_once(lambda s: s.app.before_first_request_funcs.append(f)) - return f - - def after_app_request(self, f: AfterRequestCallable) -> AfterRequestCallable: - """Like :meth:`Flask.after_request` but for a blueprint. Such a function - is executed after each request, even if outside of the blueprint. - """ - self.record_once( - lambda s: s.app.after_request_funcs.setdefault(None, []).append(f) - ) - return f - - def teardown_app_request(self, f: TeardownCallable) -> TeardownCallable: - """Like :meth:`Flask.teardown_request` but for a blueprint. Such a - function is executed when tearing down each request, even if outside of - the blueprint. - """ - self.record_once( - lambda s: s.app.teardown_request_funcs.setdefault(None, []).append(f) - ) - return f - - def app_context_processor( - self, f: TemplateContextProcessorCallable - ) -> TemplateContextProcessorCallable: - """Like :meth:`Flask.context_processor` but for a blueprint. Such a - function is executed each request, even if outside of the blueprint. - """ - self.record_once( - lambda s: s.app.template_context_processors.setdefault(None, []).append(f) - ) - return f - - def app_errorhandler(self, code: t.Union[t.Type[Exception], int]) -> t.Callable: - """Like :meth:`Flask.errorhandler` but for a blueprint. This - handler is used for all requests, even if outside of the blueprint. - """ - - def decorator(f: ErrorHandlerCallable) -> ErrorHandlerCallable: - self.record_once(lambda s: s.app.errorhandler(code)(f)) - return f - - return decorator - - def app_url_value_preprocessor( - self, f: URLValuePreprocessorCallable - ) -> URLValuePreprocessorCallable: - """Same as :meth:`url_value_preprocessor` but application wide.""" - self.record_once( - lambda s: s.app.url_value_preprocessors.setdefault(None, []).append(f) - ) - return f - - def app_url_defaults(self, f: URLDefaultCallable) -> URLDefaultCallable: - """Same as :meth:`url_defaults` but application wide.""" - self.record_once( - lambda s: s.app.url_default_functions.setdefault(None, []).append(f) - ) - return f diff --git a/venv/lib/python3.8/site-packages/flask/cli.py b/venv/lib/python3.8/site-packages/flask/cli.py deleted file mode 100644 index d9e810d..0000000 --- a/venv/lib/python3.8/site-packages/flask/cli.py +++ /dev/null @@ -1,994 +0,0 @@ -import ast -import inspect -import os -import platform -import re -import sys -import traceback -import warnings -from functools import update_wrapper -from operator import attrgetter -from threading import Lock -from threading import Thread - -import click -from werkzeug.utils import import_string - -from .globals import current_app -from .helpers import get_debug_flag -from .helpers import get_env -from .helpers import get_load_dotenv - -try: - import dotenv -except ImportError: - dotenv = None - -try: - import ssl -except ImportError: - ssl = None # type: ignore - - -class NoAppException(click.UsageError): - """Raised if an application cannot be found or loaded.""" - - -def find_best_app(script_info, module): - """Given a module instance this tries to find the best possible - application in the module or raises an exception. - """ - from . import Flask - - # Search for the most common names first. - for attr_name in ("app", "application"): - app = getattr(module, attr_name, None) - - if isinstance(app, Flask): - return app - - # Otherwise find the only object that is a Flask instance. - matches = [v for v in module.__dict__.values() if isinstance(v, Flask)] - - if len(matches) == 1: - return matches[0] - elif len(matches) > 1: - raise NoAppException( - "Detected multiple Flask applications in module" - f" {module.__name__!r}. Use 'FLASK_APP={module.__name__}:name'" - f" to specify the correct one." - ) - - # Search for app factory functions. - for attr_name in ("create_app", "make_app"): - app_factory = getattr(module, attr_name, None) - - if inspect.isfunction(app_factory): - try: - app = call_factory(script_info, app_factory) - - if isinstance(app, Flask): - return app - except TypeError: - if not _called_with_wrong_args(app_factory): - raise - raise NoAppException( - f"Detected factory {attr_name!r} in module {module.__name__!r}," - " but could not call it without arguments. Use" - f" \"FLASK_APP='{module.__name__}:{attr_name}(args)'\"" - " to specify arguments." - ) - - raise NoAppException( - "Failed to find Flask application or factory in module" - f" {module.__name__!r}. Use 'FLASK_APP={module.__name__}:name'" - " to specify one." - ) - - -def call_factory(script_info, app_factory, args=None, kwargs=None): - """Takes an app factory, a ``script_info` object and optionally a tuple - of arguments. Checks for the existence of a script_info argument and calls - the app_factory depending on that and the arguments provided. - """ - sig = inspect.signature(app_factory) - args = [] if args is None else args - kwargs = {} if kwargs is None else kwargs - - if "script_info" in sig.parameters: - warnings.warn( - "The 'script_info' argument is deprecated and will not be" - " passed to the app factory function in Flask 2.1.", - DeprecationWarning, - ) - kwargs["script_info"] = script_info - - if ( - not args - and len(sig.parameters) == 1 - and next(iter(sig.parameters.values())).default is inspect.Parameter.empty - ): - warnings.warn( - "Script info is deprecated and will not be passed as the" - " single argument to the app factory function in Flask" - " 2.1.", - DeprecationWarning, - ) - args.append(script_info) - - return app_factory(*args, **kwargs) - - -def _called_with_wrong_args(f): - """Check whether calling a function raised a ``TypeError`` because - the call failed or because something in the factory raised the - error. - - :param f: The function that was called. - :return: ``True`` if the call failed. - """ - tb = sys.exc_info()[2] - - try: - while tb is not None: - if tb.tb_frame.f_code is f.__code__: - # In the function, it was called successfully. - return False - - tb = tb.tb_next - - # Didn't reach the function. - return True - finally: - # Delete tb to break a circular reference. - # https://docs.python.org/2/library/sys.html#sys.exc_info - del tb - - -def find_app_by_string(script_info, module, app_name): - """Check if the given string is a variable name or a function. Call - a function to get the app instance, or return the variable directly. - """ - from . import Flask - - # Parse app_name as a single expression to determine if it's a valid - # attribute name or function call. - try: - expr = ast.parse(app_name.strip(), mode="eval").body - except SyntaxError: - raise NoAppException( - f"Failed to parse {app_name!r} as an attribute name or function call." - ) - - if isinstance(expr, ast.Name): - name = expr.id - args = kwargs = None - elif isinstance(expr, ast.Call): - # Ensure the function name is an attribute name only. - if not isinstance(expr.func, ast.Name): - raise NoAppException( - f"Function reference must be a simple name: {app_name!r}." - ) - - name = expr.func.id - - # Parse the positional and keyword arguments as literals. - try: - args = [ast.literal_eval(arg) for arg in expr.args] - kwargs = {kw.arg: ast.literal_eval(kw.value) for kw in expr.keywords} - except ValueError: - # literal_eval gives cryptic error messages, show a generic - # message with the full expression instead. - raise NoAppException( - f"Failed to parse arguments as literal values: {app_name!r}." - ) - else: - raise NoAppException( - f"Failed to parse {app_name!r} as an attribute name or function call." - ) - - try: - attr = getattr(module, name) - except AttributeError: - raise NoAppException( - f"Failed to find attribute {name!r} in {module.__name__!r}." - ) - - # If the attribute is a function, call it with any args and kwargs - # to get the real application. - if inspect.isfunction(attr): - try: - app = call_factory(script_info, attr, args, kwargs) - except TypeError: - if not _called_with_wrong_args(attr): - raise - - raise NoAppException( - f"The factory {app_name!r} in module" - f" {module.__name__!r} could not be called with the" - " specified arguments." - ) - else: - app = attr - - if isinstance(app, Flask): - return app - - raise NoAppException( - "A valid Flask application was not obtained from" - f" '{module.__name__}:{app_name}'." - ) - - -def prepare_import(path): - """Given a filename this will try to calculate the python path, add it - to the search path and return the actual module name that is expected. - """ - path = os.path.realpath(path) - - fname, ext = os.path.splitext(path) - if ext == ".py": - path = fname - - if os.path.basename(path) == "__init__": - path = os.path.dirname(path) - - module_name = [] - - # move up until outside package structure (no __init__.py) - while True: - path, name = os.path.split(path) - module_name.append(name) - - if not os.path.exists(os.path.join(path, "__init__.py")): - break - - if sys.path[0] != path: - sys.path.insert(0, path) - - return ".".join(module_name[::-1]) - - -def locate_app(script_info, module_name, app_name, raise_if_not_found=True): - __traceback_hide__ = True # noqa: F841 - - try: - __import__(module_name) - except ImportError: - # Reraise the ImportError if it occurred within the imported module. - # Determine this by checking whether the trace has a depth > 1. - if sys.exc_info()[2].tb_next: - raise NoAppException( - f"While importing {module_name!r}, an ImportError was" - f" raised:\n\n{traceback.format_exc()}" - ) - elif raise_if_not_found: - raise NoAppException(f"Could not import {module_name!r}.") - else: - return - - module = sys.modules[module_name] - - if app_name is None: - return find_best_app(script_info, module) - else: - return find_app_by_string(script_info, module, app_name) - - -def get_version(ctx, param, value): - if not value or ctx.resilient_parsing: - return - - import werkzeug - from . import __version__ - - click.echo( - f"Python {platform.python_version()}\n" - f"Flask {__version__}\n" - f"Werkzeug {werkzeug.__version__}", - color=ctx.color, - ) - ctx.exit() - - -version_option = click.Option( - ["--version"], - help="Show the flask version", - expose_value=False, - callback=get_version, - is_flag=True, - is_eager=True, -) - - -class DispatchingApp: - """Special application that dispatches to a Flask application which - is imported by name in a background thread. If an error happens - it is recorded and shown as part of the WSGI handling which in case - of the Werkzeug debugger means that it shows up in the browser. - """ - - def __init__(self, loader, use_eager_loading=None): - self.loader = loader - self._app = None - self._lock = Lock() - self._bg_loading_exc_info = None - - if use_eager_loading is None: - use_eager_loading = os.environ.get("WERKZEUG_RUN_MAIN") != "true" - - if use_eager_loading: - self._load_unlocked() - else: - self._load_in_background() - - def _load_in_background(self): - def _load_app(): - __traceback_hide__ = True # noqa: F841 - with self._lock: - try: - self._load_unlocked() - except Exception: - self._bg_loading_exc_info = sys.exc_info() - - t = Thread(target=_load_app, args=()) - t.start() - - def _flush_bg_loading_exception(self): - __traceback_hide__ = True # noqa: F841 - exc_info = self._bg_loading_exc_info - if exc_info is not None: - self._bg_loading_exc_info = None - raise exc_info - - def _load_unlocked(self): - __traceback_hide__ = True # noqa: F841 - self._app = rv = self.loader() - self._bg_loading_exc_info = None - return rv - - def __call__(self, environ, start_response): - __traceback_hide__ = True # noqa: F841 - if self._app is not None: - return self._app(environ, start_response) - self._flush_bg_loading_exception() - with self._lock: - if self._app is not None: - rv = self._app - else: - rv = self._load_unlocked() - return rv(environ, start_response) - - -class ScriptInfo: - """Helper object to deal with Flask applications. This is usually not - necessary to interface with as it's used internally in the dispatching - to click. In future versions of Flask this object will most likely play - a bigger role. Typically it's created automatically by the - :class:`FlaskGroup` but you can also manually create it and pass it - onwards as click object. - """ - - def __init__(self, app_import_path=None, create_app=None, set_debug_flag=True): - #: Optionally the import path for the Flask application. - self.app_import_path = app_import_path or os.environ.get("FLASK_APP") - #: Optionally a function that is passed the script info to create - #: the instance of the application. - self.create_app = create_app - #: A dictionary with arbitrary data that can be associated with - #: this script info. - self.data = {} - self.set_debug_flag = set_debug_flag - self._loaded_app = None - - def load_app(self): - """Loads the Flask app (if not yet loaded) and returns it. Calling - this multiple times will just result in the already loaded app to - be returned. - """ - __traceback_hide__ = True # noqa: F841 - - if self._loaded_app is not None: - return self._loaded_app - - if self.create_app is not None: - app = call_factory(self, self.create_app) - else: - if self.app_import_path: - path, name = ( - re.split(r":(?![\\/])", self.app_import_path, 1) + [None] - )[:2] - import_name = prepare_import(path) - app = locate_app(self, import_name, name) - else: - for path in ("wsgi.py", "app.py"): - import_name = prepare_import(path) - app = locate_app(self, import_name, None, raise_if_not_found=False) - - if app: - break - - if not app: - raise NoAppException( - "Could not locate a Flask application. You did not provide " - 'the "FLASK_APP" environment variable, and a "wsgi.py" or ' - '"app.py" module was not found in the current directory.' - ) - - if self.set_debug_flag: - # Update the app's debug flag through the descriptor so that - # other values repopulate as well. - app.debug = get_debug_flag() - - self._loaded_app = app - return app - - -pass_script_info = click.make_pass_decorator(ScriptInfo, ensure=True) - - -def with_appcontext(f): - """Wraps a callback so that it's guaranteed to be executed with the - script's application context. If callbacks are registered directly - to the ``app.cli`` object then they are wrapped with this function - by default unless it's disabled. - """ - - @click.pass_context - def decorator(__ctx, *args, **kwargs): - with __ctx.ensure_object(ScriptInfo).load_app().app_context(): - return __ctx.invoke(f, *args, **kwargs) - - return update_wrapper(decorator, f) - - -class AppGroup(click.Group): - """This works similar to a regular click :class:`~click.Group` but it - changes the behavior of the :meth:`command` decorator so that it - automatically wraps the functions in :func:`with_appcontext`. - - Not to be confused with :class:`FlaskGroup`. - """ - - def command(self, *args, **kwargs): - """This works exactly like the method of the same name on a regular - :class:`click.Group` but it wraps callbacks in :func:`with_appcontext` - unless it's disabled by passing ``with_appcontext=False``. - """ - wrap_for_ctx = kwargs.pop("with_appcontext", True) - - def decorator(f): - if wrap_for_ctx: - f = with_appcontext(f) - return click.Group.command(self, *args, **kwargs)(f) - - return decorator - - def group(self, *args, **kwargs): - """This works exactly like the method of the same name on a regular - :class:`click.Group` but it defaults the group class to - :class:`AppGroup`. - """ - kwargs.setdefault("cls", AppGroup) - return click.Group.group(self, *args, **kwargs) - - -class FlaskGroup(AppGroup): - """Special subclass of the :class:`AppGroup` group that supports - loading more commands from the configured Flask app. Normally a - developer does not have to interface with this class but there are - some very advanced use cases for which it makes sense to create an - instance of this. see :ref:`custom-scripts`. - - :param add_default_commands: if this is True then the default run and - shell commands will be added. - :param add_version_option: adds the ``--version`` option. - :param create_app: an optional callback that is passed the script info and - returns the loaded app. - :param load_dotenv: Load the nearest :file:`.env` and :file:`.flaskenv` - files to set environment variables. Will also change the working - directory to the directory containing the first file found. - :param set_debug_flag: Set the app's debug flag based on the active - environment - - .. versionchanged:: 1.0 - If installed, python-dotenv will be used to load environment variables - from :file:`.env` and :file:`.flaskenv` files. - """ - - def __init__( - self, - add_default_commands=True, - create_app=None, - add_version_option=True, - load_dotenv=True, - set_debug_flag=True, - **extra, - ): - params = list(extra.pop("params", None) or ()) - - if add_version_option: - params.append(version_option) - - AppGroup.__init__(self, params=params, **extra) - self.create_app = create_app - self.load_dotenv = load_dotenv - self.set_debug_flag = set_debug_flag - - if add_default_commands: - self.add_command(run_command) - self.add_command(shell_command) - self.add_command(routes_command) - - self._loaded_plugin_commands = False - - def _load_plugin_commands(self): - if self._loaded_plugin_commands: - return - try: - import pkg_resources - except ImportError: - self._loaded_plugin_commands = True - return - - for ep in pkg_resources.iter_entry_points("flask.commands"): - self.add_command(ep.load(), ep.name) - self._loaded_plugin_commands = True - - def get_command(self, ctx, name): - self._load_plugin_commands() - # Look up built-in and plugin commands, which should be - # available even if the app fails to load. - rv = super().get_command(ctx, name) - - if rv is not None: - return rv - - info = ctx.ensure_object(ScriptInfo) - - # Look up commands provided by the app, showing an error and - # continuing if the app couldn't be loaded. - try: - return info.load_app().cli.get_command(ctx, name) - except NoAppException as e: - click.secho(f"Error: {e.format_message()}\n", err=True, fg="red") - - def list_commands(self, ctx): - self._load_plugin_commands() - # Start with the built-in and plugin commands. - rv = set(super().list_commands(ctx)) - info = ctx.ensure_object(ScriptInfo) - - # Add commands provided by the app, showing an error and - # continuing if the app couldn't be loaded. - try: - rv.update(info.load_app().cli.list_commands(ctx)) - except NoAppException as e: - # When an app couldn't be loaded, show the error message - # without the traceback. - click.secho(f"Error: {e.format_message()}\n", err=True, fg="red") - except Exception: - # When any other errors occurred during loading, show the - # full traceback. - click.secho(f"{traceback.format_exc()}\n", err=True, fg="red") - - return sorted(rv) - - def main(self, *args, **kwargs): - # Set a global flag that indicates that we were invoked from the - # command line interface. This is detected by Flask.run to make the - # call into a no-op. This is necessary to avoid ugly errors when the - # script that is loaded here also attempts to start a server. - os.environ["FLASK_RUN_FROM_CLI"] = "true" - - if get_load_dotenv(self.load_dotenv): - load_dotenv() - - obj = kwargs.get("obj") - - if obj is None: - obj = ScriptInfo( - create_app=self.create_app, set_debug_flag=self.set_debug_flag - ) - - kwargs["obj"] = obj - kwargs.setdefault("auto_envvar_prefix", "FLASK") - return super().main(*args, **kwargs) - - -def _path_is_ancestor(path, other): - """Take ``other`` and remove the length of ``path`` from it. Then join it - to ``path``. If it is the original value, ``path`` is an ancestor of - ``other``.""" - return os.path.join(path, other[len(path) :].lstrip(os.sep)) == other - - -def load_dotenv(path=None): - """Load "dotenv" files in order of precedence to set environment variables. - - If an env var is already set it is not overwritten, so earlier files in the - list are preferred over later files. - - This is a no-op if `python-dotenv`_ is not installed. - - .. _python-dotenv: https://github.com/theskumar/python-dotenv#readme - - :param path: Load the file at this location instead of searching. - :return: ``True`` if a file was loaded. - - .. versionchanged:: 1.1.0 - Returns ``False`` when python-dotenv is not installed, or when - the given path isn't a file. - - .. versionchanged:: 2.0 - When loading the env files, set the default encoding to UTF-8. - - .. versionadded:: 1.0 - """ - if dotenv is None: - if path or os.path.isfile(".env") or os.path.isfile(".flaskenv"): - click.secho( - " * Tip: There are .env or .flaskenv files present." - ' Do "pip install python-dotenv" to use them.', - fg="yellow", - err=True, - ) - - return False - - # if the given path specifies the actual file then return True, - # else False - if path is not None: - if os.path.isfile(path): - return dotenv.load_dotenv(path, encoding="utf-8") - - return False - - new_dir = None - - for name in (".env", ".flaskenv"): - path = dotenv.find_dotenv(name, usecwd=True) - - if not path: - continue - - if new_dir is None: - new_dir = os.path.dirname(path) - - dotenv.load_dotenv(path, encoding="utf-8") - - return new_dir is not None # at least one file was located and loaded - - -def show_server_banner(env, debug, app_import_path, eager_loading): - """Show extra startup messages the first time the server is run, - ignoring the reloader. - """ - if os.environ.get("WERKZEUG_RUN_MAIN") == "true": - return - - if app_import_path is not None: - message = f" * Serving Flask app {app_import_path!r}" - - if not eager_loading: - message += " (lazy loading)" - - click.echo(message) - - click.echo(f" * Environment: {env}") - - if env == "production": - click.secho( - " WARNING: This is a development server. Do not use it in" - " a production deployment.", - fg="red", - ) - click.secho(" Use a production WSGI server instead.", dim=True) - - if debug is not None: - click.echo(f" * Debug mode: {'on' if debug else 'off'}") - - -class CertParamType(click.ParamType): - """Click option type for the ``--cert`` option. Allows either an - existing file, the string ``'adhoc'``, or an import for a - :class:`~ssl.SSLContext` object. - """ - - name = "path" - - def __init__(self): - self.path_type = click.Path(exists=True, dir_okay=False, resolve_path=True) - - def convert(self, value, param, ctx): - if ssl is None: - raise click.BadParameter( - 'Using "--cert" requires Python to be compiled with SSL support.', - ctx, - param, - ) - - try: - return self.path_type(value, param, ctx) - except click.BadParameter: - value = click.STRING(value, param, ctx).lower() - - if value == "adhoc": - try: - import cryptography # noqa: F401 - except ImportError: - raise click.BadParameter( - "Using ad-hoc certificates requires the cryptography library.", - ctx, - param, - ) - - return value - - obj = import_string(value, silent=True) - - if isinstance(obj, ssl.SSLContext): - return obj - - raise - - -def _validate_key(ctx, param, value): - """The ``--key`` option must be specified when ``--cert`` is a file. - Modifies the ``cert`` param to be a ``(cert, key)`` pair if needed. - """ - cert = ctx.params.get("cert") - is_adhoc = cert == "adhoc" - is_context = ssl and isinstance(cert, ssl.SSLContext) - - if value is not None: - if is_adhoc: - raise click.BadParameter( - 'When "--cert" is "adhoc", "--key" is not used.', ctx, param - ) - - if is_context: - raise click.BadParameter( - 'When "--cert" is an SSLContext object, "--key is not used.', ctx, param - ) - - if not cert: - raise click.BadParameter('"--cert" must also be specified.', ctx, param) - - ctx.params["cert"] = cert, value - - else: - if cert and not (is_adhoc or is_context): - raise click.BadParameter('Required when using "--cert".', ctx, param) - - return value - - -class SeparatedPathType(click.Path): - """Click option type that accepts a list of values separated by the - OS's path separator (``:``, ``;`` on Windows). Each value is - validated as a :class:`click.Path` type. - """ - - def convert(self, value, param, ctx): - items = self.split_envvar_value(value) - super_convert = super().convert - return [super_convert(item, param, ctx) for item in items] - - -@click.command("run", short_help="Run a development server.") -@click.option("--host", "-h", default="127.0.0.1", help="The interface to bind to.") -@click.option("--port", "-p", default=5000, help="The port to bind to.") -@click.option( - "--cert", type=CertParamType(), help="Specify a certificate file to use HTTPS." -) -@click.option( - "--key", - type=click.Path(exists=True, dir_okay=False, resolve_path=True), - callback=_validate_key, - expose_value=False, - help="The key file to use when specifying a certificate.", -) -@click.option( - "--reload/--no-reload", - default=None, - help="Enable or disable the reloader. By default the reloader " - "is active if debug is enabled.", -) -@click.option( - "--debugger/--no-debugger", - default=None, - help="Enable or disable the debugger. By default the debugger " - "is active if debug is enabled.", -) -@click.option( - "--eager-loading/--lazy-loading", - default=None, - help="Enable or disable eager loading. By default eager " - "loading is enabled if the reloader is disabled.", -) -@click.option( - "--with-threads/--without-threads", - default=True, - help="Enable or disable multithreading.", -) -@click.option( - "--extra-files", - default=None, - type=SeparatedPathType(), - help=( - "Extra files that trigger a reload on change. Multiple paths" - f" are separated by {os.path.pathsep!r}." - ), -) -@pass_script_info -def run_command( - info, host, port, reload, debugger, eager_loading, with_threads, cert, extra_files -): - """Run a local development server. - - This server is for development purposes only. It does not provide - the stability, security, or performance of production WSGI servers. - - The reloader and debugger are enabled by default if - FLASK_ENV=development or FLASK_DEBUG=1. - """ - debug = get_debug_flag() - - if reload is None: - reload = debug - - if debugger is None: - debugger = debug - - show_server_banner(get_env(), debug, info.app_import_path, eager_loading) - app = DispatchingApp(info.load_app, use_eager_loading=eager_loading) - - from werkzeug.serving import run_simple - - run_simple( - host, - port, - app, - use_reloader=reload, - use_debugger=debugger, - threaded=with_threads, - ssl_context=cert, - extra_files=extra_files, - ) - - -@click.command("shell", short_help="Run a shell in the app context.") -@with_appcontext -def shell_command() -> None: - """Run an interactive Python shell in the context of a given - Flask application. The application will populate the default - namespace of this shell according to its configuration. - - This is useful for executing small snippets of management code - without having to manually configure the application. - """ - import code - from .globals import _app_ctx_stack - - app = _app_ctx_stack.top.app - banner = ( - f"Python {sys.version} on {sys.platform}\n" - f"App: {app.import_name} [{app.env}]\n" - f"Instance: {app.instance_path}" - ) - ctx: dict = {} - - # Support the regular Python interpreter startup script if someone - # is using it. - startup = os.environ.get("PYTHONSTARTUP") - if startup and os.path.isfile(startup): - with open(startup) as f: - eval(compile(f.read(), startup, "exec"), ctx) - - ctx.update(app.make_shell_context()) - - # Site, customize, or startup script can set a hook to call when - # entering interactive mode. The default one sets up readline with - # tab and history completion. - interactive_hook = getattr(sys, "__interactivehook__", None) - - if interactive_hook is not None: - try: - import readline - from rlcompleter import Completer - except ImportError: - pass - else: - # rlcompleter uses __main__.__dict__ by default, which is - # flask.__main__. Use the shell context instead. - readline.set_completer(Completer(ctx).complete) - - interactive_hook() - - code.interact(banner=banner, local=ctx) - - -@click.command("routes", short_help="Show the routes for the app.") -@click.option( - "--sort", - "-s", - type=click.Choice(("endpoint", "methods", "rule", "match")), - default="endpoint", - help=( - 'Method to sort routes by. "match" is the order that Flask will match ' - "routes when dispatching a request." - ), -) -@click.option("--all-methods", is_flag=True, help="Show HEAD and OPTIONS methods.") -@with_appcontext -def routes_command(sort: str, all_methods: bool) -> None: - """Show all registered routes with endpoints and methods.""" - - rules = list(current_app.url_map.iter_rules()) - if not rules: - click.echo("No routes were registered.") - return - - ignored_methods = set(() if all_methods else ("HEAD", "OPTIONS")) - - if sort in ("endpoint", "rule"): - rules = sorted(rules, key=attrgetter(sort)) - elif sort == "methods": - rules = sorted(rules, key=lambda rule: sorted(rule.methods)) # type: ignore - - rule_methods = [ - ", ".join(sorted(rule.methods - ignored_methods)) # type: ignore - for rule in rules - ] - - headers = ("Endpoint", "Methods", "Rule") - widths = ( - max(len(rule.endpoint) for rule in rules), - max(len(methods) for methods in rule_methods), - max(len(rule.rule) for rule in rules), - ) - widths = [max(len(h), w) for h, w in zip(headers, widths)] - row = "{{0:<{0}}} {{1:<{1}}} {{2:<{2}}}".format(*widths) - - click.echo(row.format(*headers).strip()) - click.echo(row.format(*("-" * width for width in widths))) - - for rule, methods in zip(rules, rule_methods): - click.echo(row.format(rule.endpoint, methods, rule.rule).rstrip()) - - -cli = FlaskGroup( - help="""\ -A general utility script for Flask applications. - -Provides commands from Flask, extensions, and the application. Loads the -application defined in the FLASK_APP environment variable, or from a wsgi.py -file. Setting the FLASK_ENV environment variable to 'development' will enable -debug mode. - -\b - {prefix}{cmd} FLASK_APP=hello.py - {prefix}{cmd} FLASK_ENV=development - {prefix}flask run -""".format( - cmd="export" if os.name == "posix" else "set", - prefix="$ " if os.name == "posix" else "> ", - ) -) - - -def main() -> None: - if int(click.__version__[0]) < 8: - warnings.warn( - "Using the `flask` cli with Click 7 is deprecated and" - " will not be supported starting with Flask 2.1." - " Please upgrade to Click 8 as soon as possible.", - DeprecationWarning, - ) - # TODO omit sys.argv once https://github.com/pallets/click/issues/536 is fixed - cli.main(args=sys.argv[1:]) - - -if __name__ == "__main__": - main() diff --git a/venv/lib/python3.8/site-packages/flask/config.py b/venv/lib/python3.8/site-packages/flask/config.py deleted file mode 100644 index c79a558..0000000 --- a/venv/lib/python3.8/site-packages/flask/config.py +++ /dev/null @@ -1,291 +0,0 @@ -import errno -import os -import types -import typing as t - -from werkzeug.utils import import_string - - -class ConfigAttribute: - """Makes an attribute forward to the config""" - - def __init__(self, name: str, get_converter: t.Optional[t.Callable] = None) -> None: - self.__name__ = name - self.get_converter = get_converter - - def __get__(self, obj: t.Any, owner: t.Any = None) -> t.Any: - if obj is None: - return self - rv = obj.config[self.__name__] - if self.get_converter is not None: - rv = self.get_converter(rv) - return rv - - def __set__(self, obj: t.Any, value: t.Any) -> None: - obj.config[self.__name__] = value - - -class Config(dict): - """Works exactly like a dict but provides ways to fill it from files - or special dictionaries. There are two common patterns to populate the - config. - - Either you can fill the config from a config file:: - - app.config.from_pyfile('yourconfig.cfg') - - Or alternatively you can define the configuration options in the - module that calls :meth:`from_object` or provide an import path to - a module that should be loaded. It is also possible to tell it to - use the same module and with that provide the configuration values - just before the call:: - - DEBUG = True - SECRET_KEY = 'development key' - app.config.from_object(__name__) - - In both cases (loading from any Python file or loading from modules), - only uppercase keys are added to the config. This makes it possible to use - lowercase values in the config file for temporary values that are not added - to the config or to define the config keys in the same file that implements - the application. - - Probably the most interesting way to load configurations is from an - environment variable pointing to a file:: - - app.config.from_envvar('YOURAPPLICATION_SETTINGS') - - In this case before launching the application you have to set this - environment variable to the file you want to use. On Linux and OS X - use the export statement:: - - export YOURAPPLICATION_SETTINGS='/path/to/config/file' - - On windows use `set` instead. - - :param root_path: path to which files are read relative from. When the - config object is created by the application, this is - the application's :attr:`~flask.Flask.root_path`. - :param defaults: an optional dictionary of default values - """ - - def __init__(self, root_path: str, defaults: t.Optional[dict] = None) -> None: - dict.__init__(self, defaults or {}) - self.root_path = root_path - - def from_envvar(self, variable_name: str, silent: bool = False) -> bool: - """Loads a configuration from an environment variable pointing to - a configuration file. This is basically just a shortcut with nicer - error messages for this line of code:: - - app.config.from_pyfile(os.environ['YOURAPPLICATION_SETTINGS']) - - :param variable_name: name of the environment variable - :param silent: set to ``True`` if you want silent failure for missing - files. - :return: bool. ``True`` if able to load config, ``False`` otherwise. - """ - rv = os.environ.get(variable_name) - if not rv: - if silent: - return False - raise RuntimeError( - f"The environment variable {variable_name!r} is not set" - " and as such configuration could not be loaded. Set" - " this variable and make it point to a configuration" - " file" - ) - return self.from_pyfile(rv, silent=silent) - - def from_pyfile(self, filename: str, silent: bool = False) -> bool: - """Updates the values in the config from a Python file. This function - behaves as if the file was imported as module with the - :meth:`from_object` function. - - :param filename: the filename of the config. This can either be an - absolute filename or a filename relative to the - root path. - :param silent: set to ``True`` if you want silent failure for missing - files. - - .. versionadded:: 0.7 - `silent` parameter. - """ - filename = os.path.join(self.root_path, filename) - d = types.ModuleType("config") - d.__file__ = filename - try: - with open(filename, mode="rb") as config_file: - exec(compile(config_file.read(), filename, "exec"), d.__dict__) - except OSError as e: - if silent and e.errno in (errno.ENOENT, errno.EISDIR, errno.ENOTDIR): - return False - e.strerror = f"Unable to load configuration file ({e.strerror})" - raise - self.from_object(d) - return True - - def from_object(self, obj: t.Union[object, str]) -> None: - """Updates the values from the given object. An object can be of one - of the following two types: - - - a string: in this case the object with that name will be imported - - an actual object reference: that object is used directly - - Objects are usually either modules or classes. :meth:`from_object` - loads only the uppercase attributes of the module/class. A ``dict`` - object will not work with :meth:`from_object` because the keys of a - ``dict`` are not attributes of the ``dict`` class. - - Example of module-based configuration:: - - app.config.from_object('yourapplication.default_config') - from yourapplication import default_config - app.config.from_object(default_config) - - Nothing is done to the object before loading. If the object is a - class and has ``@property`` attributes, it needs to be - instantiated before being passed to this method. - - You should not use this function to load the actual configuration but - rather configuration defaults. The actual config should be loaded - with :meth:`from_pyfile` and ideally from a location not within the - package because the package might be installed system wide. - - See :ref:`config-dev-prod` for an example of class-based configuration - using :meth:`from_object`. - - :param obj: an import name or object - """ - if isinstance(obj, str): - obj = import_string(obj) - for key in dir(obj): - if key.isupper(): - self[key] = getattr(obj, key) - - def from_file( - self, - filename: str, - load: t.Callable[[t.IO[t.Any]], t.Mapping], - silent: bool = False, - ) -> bool: - """Update the values in the config from a file that is loaded - using the ``load`` parameter. The loaded data is passed to the - :meth:`from_mapping` method. - - .. code-block:: python - - import toml - app.config.from_file("config.toml", load=toml.load) - - :param filename: The path to the data file. This can be an - absolute path or relative to the config root path. - :param load: A callable that takes a file handle and returns a - mapping of loaded data from the file. - :type load: ``Callable[[Reader], Mapping]`` where ``Reader`` - implements a ``read`` method. - :param silent: Ignore the file if it doesn't exist. - - .. versionadded:: 2.0 - """ - filename = os.path.join(self.root_path, filename) - - try: - with open(filename) as f: - obj = load(f) - except OSError as e: - if silent and e.errno in (errno.ENOENT, errno.EISDIR): - return False - - e.strerror = f"Unable to load configuration file ({e.strerror})" - raise - - return self.from_mapping(obj) - - def from_json(self, filename: str, silent: bool = False) -> bool: - """Update the values in the config from a JSON file. The loaded - data is passed to the :meth:`from_mapping` method. - - :param filename: The path to the JSON file. This can be an - absolute path or relative to the config root path. - :param silent: Ignore the file if it doesn't exist. - - .. deprecated:: 2.0.0 - Will be removed in Flask 2.1. Use :meth:`from_file` instead. - This was removed early in 2.0.0, was added back in 2.0.1. - - .. versionadded:: 0.11 - """ - import warnings - from . import json - - warnings.warn( - "'from_json' is deprecated and will be removed in Flask" - " 2.1. Use 'from_file(path, json.load)' instead.", - DeprecationWarning, - stacklevel=2, - ) - return self.from_file(filename, json.load, silent=silent) - - def from_mapping( - self, mapping: t.Optional[t.Mapping[str, t.Any]] = None, **kwargs: t.Any - ) -> bool: - """Updates the config like :meth:`update` ignoring items with non-upper - keys. - - .. versionadded:: 0.11 - """ - mappings: t.Dict[str, t.Any] = {} - if mapping is not None: - mappings.update(mapping) - mappings.update(kwargs) - for key, value in mappings.items(): - if key.isupper(): - self[key] = value - return True - - def get_namespace( - self, namespace: str, lowercase: bool = True, trim_namespace: bool = True - ) -> t.Dict[str, t.Any]: - """Returns a dictionary containing a subset of configuration options - that match the specified namespace/prefix. Example usage:: - - app.config['IMAGE_STORE_TYPE'] = 'fs' - app.config['IMAGE_STORE_PATH'] = '/var/app/images' - app.config['IMAGE_STORE_BASE_URL'] = 'http://img.website.com' - image_store_config = app.config.get_namespace('IMAGE_STORE_') - - The resulting dictionary `image_store_config` would look like:: - - { - 'type': 'fs', - 'path': '/var/app/images', - 'base_url': 'http://img.website.com' - } - - This is often useful when configuration options map directly to - keyword arguments in functions or class constructors. - - :param namespace: a configuration namespace - :param lowercase: a flag indicating if the keys of the resulting - dictionary should be lowercase - :param trim_namespace: a flag indicating if the keys of the resulting - dictionary should not include the namespace - - .. versionadded:: 0.11 - """ - rv = {} - for k, v in self.items(): - if not k.startswith(namespace): - continue - if trim_namespace: - key = k[len(namespace) :] - else: - key = k - if lowercase: - key = key.lower() - rv[key] = v - return rv - - def __repr__(self) -> str: - return f"<{type(self).__name__} {dict.__repr__(self)}>" diff --git a/venv/lib/python3.8/site-packages/flask/ctx.py b/venv/lib/python3.8/site-packages/flask/ctx.py deleted file mode 100644 index 5c06463..0000000 --- a/venv/lib/python3.8/site-packages/flask/ctx.py +++ /dev/null @@ -1,480 +0,0 @@ -import sys -import typing as t -from functools import update_wrapper -from types import TracebackType - -from werkzeug.exceptions import HTTPException - -from .globals import _app_ctx_stack -from .globals import _request_ctx_stack -from .signals import appcontext_popped -from .signals import appcontext_pushed -from .typing import AfterRequestCallable - -if t.TYPE_CHECKING: - from .app import Flask - from .sessions import SessionMixin - from .wrappers import Request - - -# a singleton sentinel value for parameter defaults -_sentinel = object() - - -class _AppCtxGlobals: - """A plain object. Used as a namespace for storing data during an - application context. - - Creating an app context automatically creates this object, which is - made available as the :data:`g` proxy. - - .. describe:: 'key' in g - - Check whether an attribute is present. - - .. versionadded:: 0.10 - - .. describe:: iter(g) - - Return an iterator over the attribute names. - - .. versionadded:: 0.10 - """ - - # Define attr methods to let mypy know this is a namespace object - # that has arbitrary attributes. - - def __getattr__(self, name: str) -> t.Any: - try: - return self.__dict__[name] - except KeyError: - raise AttributeError(name) from None - - def __setattr__(self, name: str, value: t.Any) -> None: - self.__dict__[name] = value - - def __delattr__(self, name: str) -> None: - try: - del self.__dict__[name] - except KeyError: - raise AttributeError(name) from None - - def get(self, name: str, default: t.Optional[t.Any] = None) -> t.Any: - """Get an attribute by name, or a default value. Like - :meth:`dict.get`. - - :param name: Name of attribute to get. - :param default: Value to return if the attribute is not present. - - .. versionadded:: 0.10 - """ - return self.__dict__.get(name, default) - - def pop(self, name: str, default: t.Any = _sentinel) -> t.Any: - """Get and remove an attribute by name. Like :meth:`dict.pop`. - - :param name: Name of attribute to pop. - :param default: Value to return if the attribute is not present, - instead of raising a ``KeyError``. - - .. versionadded:: 0.11 - """ - if default is _sentinel: - return self.__dict__.pop(name) - else: - return self.__dict__.pop(name, default) - - def setdefault(self, name: str, default: t.Any = None) -> t.Any: - """Get the value of an attribute if it is present, otherwise - set and return a default value. Like :meth:`dict.setdefault`. - - :param name: Name of attribute to get. - :param default: Value to set and return if the attribute is not - present. - - .. versionadded:: 0.11 - """ - return self.__dict__.setdefault(name, default) - - def __contains__(self, item: str) -> bool: - return item in self.__dict__ - - def __iter__(self) -> t.Iterator[str]: - return iter(self.__dict__) - - def __repr__(self) -> str: - top = _app_ctx_stack.top - if top is not None: - return f"" - return object.__repr__(self) - - -def after_this_request(f: AfterRequestCallable) -> AfterRequestCallable: - """Executes a function after this request. This is useful to modify - response objects. The function is passed the response object and has - to return the same or a new one. - - Example:: - - @app.route('/') - def index(): - @after_this_request - def add_header(response): - response.headers['X-Foo'] = 'Parachute' - return response - return 'Hello World!' - - This is more useful if a function other than the view function wants to - modify a response. For instance think of a decorator that wants to add - some headers without converting the return value into a response object. - - .. versionadded:: 0.9 - """ - _request_ctx_stack.top._after_request_functions.append(f) - return f - - -def copy_current_request_context(f: t.Callable) -> t.Callable: - """A helper function that decorates a function to retain the current - request context. This is useful when working with greenlets. The moment - the function is decorated a copy of the request context is created and - then pushed when the function is called. The current session is also - included in the copied request context. - - Example:: - - import gevent - from flask import copy_current_request_context - - @app.route('/') - def index(): - @copy_current_request_context - def do_some_work(): - # do some work here, it can access flask.request or - # flask.session like you would otherwise in the view function. - ... - gevent.spawn(do_some_work) - return 'Regular response' - - .. versionadded:: 0.10 - """ - top = _request_ctx_stack.top - if top is None: - raise RuntimeError( - "This decorator can only be used at local scopes " - "when a request context is on the stack. For instance within " - "view functions." - ) - reqctx = top.copy() - - def wrapper(*args, **kwargs): - with reqctx: - return f(*args, **kwargs) - - return update_wrapper(wrapper, f) - - -def has_request_context() -> bool: - """If you have code that wants to test if a request context is there or - not this function can be used. For instance, you may want to take advantage - of request information if the request object is available, but fail - silently if it is unavailable. - - :: - - class User(db.Model): - - def __init__(self, username, remote_addr=None): - self.username = username - if remote_addr is None and has_request_context(): - remote_addr = request.remote_addr - self.remote_addr = remote_addr - - Alternatively you can also just test any of the context bound objects - (such as :class:`request` or :class:`g`) for truthness:: - - class User(db.Model): - - def __init__(self, username, remote_addr=None): - self.username = username - if remote_addr is None and request: - remote_addr = request.remote_addr - self.remote_addr = remote_addr - - .. versionadded:: 0.7 - """ - return _request_ctx_stack.top is not None - - -def has_app_context() -> bool: - """Works like :func:`has_request_context` but for the application - context. You can also just do a boolean check on the - :data:`current_app` object instead. - - .. versionadded:: 0.9 - """ - return _app_ctx_stack.top is not None - - -class AppContext: - """The application context binds an application object implicitly - to the current thread or greenlet, similar to how the - :class:`RequestContext` binds request information. The application - context is also implicitly created if a request context is created - but the application is not on top of the individual application - context. - """ - - def __init__(self, app: "Flask") -> None: - self.app = app - self.url_adapter = app.create_url_adapter(None) - self.g = app.app_ctx_globals_class() - - # Like request context, app contexts can be pushed multiple times - # but there a basic "refcount" is enough to track them. - self._refcnt = 0 - - def push(self) -> None: - """Binds the app context to the current context.""" - self._refcnt += 1 - _app_ctx_stack.push(self) - appcontext_pushed.send(self.app) - - def pop(self, exc: t.Optional[BaseException] = _sentinel) -> None: # type: ignore - """Pops the app context.""" - try: - self._refcnt -= 1 - if self._refcnt <= 0: - if exc is _sentinel: - exc = sys.exc_info()[1] - self.app.do_teardown_appcontext(exc) - finally: - rv = _app_ctx_stack.pop() - assert rv is self, f"Popped wrong app context. ({rv!r} instead of {self!r})" - appcontext_popped.send(self.app) - - def __enter__(self) -> "AppContext": - self.push() - return self - - def __exit__( - self, exc_type: type, exc_value: BaseException, tb: TracebackType - ) -> None: - self.pop(exc_value) - - -class RequestContext: - """The request context contains all request relevant information. It is - created at the beginning of the request and pushed to the - `_request_ctx_stack` and removed at the end of it. It will create the - URL adapter and request object for the WSGI environment provided. - - Do not attempt to use this class directly, instead use - :meth:`~flask.Flask.test_request_context` and - :meth:`~flask.Flask.request_context` to create this object. - - When the request context is popped, it will evaluate all the - functions registered on the application for teardown execution - (:meth:`~flask.Flask.teardown_request`). - - The request context is automatically popped at the end of the request - for you. In debug mode the request context is kept around if - exceptions happen so that interactive debuggers have a chance to - introspect the data. With 0.4 this can also be forced for requests - that did not fail and outside of ``DEBUG`` mode. By setting - ``'flask._preserve_context'`` to ``True`` on the WSGI environment the - context will not pop itself at the end of the request. This is used by - the :meth:`~flask.Flask.test_client` for example to implement the - deferred cleanup functionality. - - You might find this helpful for unittests where you need the - information from the context local around for a little longer. Make - sure to properly :meth:`~werkzeug.LocalStack.pop` the stack yourself in - that situation, otherwise your unittests will leak memory. - """ - - def __init__( - self, - app: "Flask", - environ: dict, - request: t.Optional["Request"] = None, - session: t.Optional["SessionMixin"] = None, - ) -> None: - self.app = app - if request is None: - request = app.request_class(environ) - self.request = request - self.url_adapter = None - try: - self.url_adapter = app.create_url_adapter(self.request) - except HTTPException as e: - self.request.routing_exception = e - self.flashes = None - self.session = session - - # Request contexts can be pushed multiple times and interleaved with - # other request contexts. Now only if the last level is popped we - # get rid of them. Additionally if an application context is missing - # one is created implicitly so for each level we add this information - self._implicit_app_ctx_stack: t.List[t.Optional["AppContext"]] = [] - - # indicator if the context was preserved. Next time another context - # is pushed the preserved context is popped. - self.preserved = False - - # remembers the exception for pop if there is one in case the context - # preservation kicks in. - self._preserved_exc = None - - # Functions that should be executed after the request on the response - # object. These will be called before the regular "after_request" - # functions. - self._after_request_functions: t.List[AfterRequestCallable] = [] - - @property - def g(self) -> AppContext: - return _app_ctx_stack.top.g - - @g.setter - def g(self, value: AppContext) -> None: - _app_ctx_stack.top.g = value - - def copy(self) -> "RequestContext": - """Creates a copy of this request context with the same request object. - This can be used to move a request context to a different greenlet. - Because the actual request object is the same this cannot be used to - move a request context to a different thread unless access to the - request object is locked. - - .. versionadded:: 0.10 - - .. versionchanged:: 1.1 - The current session object is used instead of reloading the original - data. This prevents `flask.session` pointing to an out-of-date object. - """ - return self.__class__( - self.app, - environ=self.request.environ, - request=self.request, - session=self.session, - ) - - def match_request(self) -> None: - """Can be overridden by a subclass to hook into the matching - of the request. - """ - try: - result = self.url_adapter.match(return_rule=True) # type: ignore - self.request.url_rule, self.request.view_args = result # type: ignore - except HTTPException as e: - self.request.routing_exception = e - - def push(self) -> None: - """Binds the request context to the current context.""" - # If an exception occurs in debug mode or if context preservation is - # activated under exception situations exactly one context stays - # on the stack. The rationale is that you want to access that - # information under debug situations. However if someone forgets to - # pop that context again we want to make sure that on the next push - # it's invalidated, otherwise we run at risk that something leaks - # memory. This is usually only a problem in test suite since this - # functionality is not active in production environments. - top = _request_ctx_stack.top - if top is not None and top.preserved: - top.pop(top._preserved_exc) - - # Before we push the request context we have to ensure that there - # is an application context. - app_ctx = _app_ctx_stack.top - if app_ctx is None or app_ctx.app != self.app: - app_ctx = self.app.app_context() - app_ctx.push() - self._implicit_app_ctx_stack.append(app_ctx) - else: - self._implicit_app_ctx_stack.append(None) - - _request_ctx_stack.push(self) - - # Open the session at the moment that the request context is available. - # This allows a custom open_session method to use the request context. - # Only open a new session if this is the first time the request was - # pushed, otherwise stream_with_context loses the session. - if self.session is None: - session_interface = self.app.session_interface - self.session = session_interface.open_session(self.app, self.request) - - if self.session is None: - self.session = session_interface.make_null_session(self.app) - - # Match the request URL after loading the session, so that the - # session is available in custom URL converters. - if self.url_adapter is not None: - self.match_request() - - def pop(self, exc: t.Optional[BaseException] = _sentinel) -> None: # type: ignore - """Pops the request context and unbinds it by doing that. This will - also trigger the execution of functions registered by the - :meth:`~flask.Flask.teardown_request` decorator. - - .. versionchanged:: 0.9 - Added the `exc` argument. - """ - app_ctx = self._implicit_app_ctx_stack.pop() - clear_request = False - - try: - if not self._implicit_app_ctx_stack: - self.preserved = False - self._preserved_exc = None - if exc is _sentinel: - exc = sys.exc_info()[1] - self.app.do_teardown_request(exc) - - request_close = getattr(self.request, "close", None) - if request_close is not None: - request_close() - clear_request = True - finally: - rv = _request_ctx_stack.pop() - - # get rid of circular dependencies at the end of the request - # so that we don't require the GC to be active. - if clear_request: - rv.request.environ["werkzeug.request"] = None - - # Get rid of the app as well if necessary. - if app_ctx is not None: - app_ctx.pop(exc) - - assert ( - rv is self - ), f"Popped wrong request context. ({rv!r} instead of {self!r})" - - def auto_pop(self, exc: t.Optional[BaseException]) -> None: - if self.request.environ.get("flask._preserve_context") or ( - exc is not None and self.app.preserve_context_on_exception - ): - self.preserved = True - self._preserved_exc = exc # type: ignore - else: - self.pop(exc) - - def __enter__(self) -> "RequestContext": - self.push() - return self - - def __exit__( - self, exc_type: type, exc_value: BaseException, tb: TracebackType - ) -> None: - # do not pop the request stack if we are in debug mode and an - # exception happened. This will allow the debugger to still - # access the request object in the interactive shell. Furthermore - # the context can be force kept alive for the test client. - # See flask.testing for how this works. - self.auto_pop(exc_value) - - def __repr__(self) -> str: - return ( - f"<{type(self).__name__} {self.request.url!r}" - f" [{self.request.method}] of {self.app.name}>" - ) diff --git a/venv/lib/python3.8/site-packages/flask/debughelpers.py b/venv/lib/python3.8/site-packages/flask/debughelpers.py deleted file mode 100644 index ce65c48..0000000 --- a/venv/lib/python3.8/site-packages/flask/debughelpers.py +++ /dev/null @@ -1,171 +0,0 @@ -import os -import typing as t -from warnings import warn - -from .app import Flask -from .blueprints import Blueprint -from .globals import _request_ctx_stack - - -class UnexpectedUnicodeError(AssertionError, UnicodeError): - """Raised in places where we want some better error reporting for - unexpected unicode or binary data. - """ - - -class DebugFilesKeyError(KeyError, AssertionError): - """Raised from request.files during debugging. The idea is that it can - provide a better error message than just a generic KeyError/BadRequest. - """ - - def __init__(self, request, key): - form_matches = request.form.getlist(key) - buf = [ - f"You tried to access the file {key!r} in the request.files" - " dictionary but it does not exist. The mimetype for the" - f" request is {request.mimetype!r} instead of" - " 'multipart/form-data' which means that no file contents" - " were transmitted. To fix this error you should provide" - ' enctype="multipart/form-data" in your form.' - ] - if form_matches: - names = ", ".join(repr(x) for x in form_matches) - buf.append( - "\n\nThe browser instead transmitted some file names. " - f"This was submitted: {names}" - ) - self.msg = "".join(buf) - - def __str__(self): - return self.msg - - -class FormDataRoutingRedirect(AssertionError): - """This exception is raised by Flask in debug mode if it detects a - redirect caused by the routing system when the request method is not - GET, HEAD or OPTIONS. Reasoning: form data will be dropped. - """ - - def __init__(self, request): - exc = request.routing_exception - buf = [ - f"A request was sent to this URL ({request.url}) but a" - " redirect was issued automatically by the routing system" - f" to {exc.new_url!r}." - ] - - # In case just a slash was appended we can be extra helpful - if f"{request.base_url}/" == exc.new_url.split("?")[0]: - buf.append( - " The URL was defined with a trailing slash so Flask" - " will automatically redirect to the URL with the" - " trailing slash if it was accessed without one." - ) - - buf.append( - " Make sure to directly send your" - f" {request.method}-request to this URL since we can't make" - " browsers or HTTP clients redirect with form data reliably" - " or without user interaction." - ) - buf.append("\n\nNote: this exception is only raised in debug mode") - AssertionError.__init__(self, "".join(buf).encode("utf-8")) - - -def attach_enctype_error_multidict(request): - """Since Flask 0.8 we're monkeypatching the files object in case a - request is detected that does not use multipart form data but the files - object is accessed. - """ - oldcls = request.files.__class__ - - class newcls(oldcls): - def __getitem__(self, key): - try: - return oldcls.__getitem__(self, key) - except KeyError: - if key not in request.form: - raise - raise DebugFilesKeyError(request, key) - - newcls.__name__ = oldcls.__name__ - newcls.__module__ = oldcls.__module__ - request.files.__class__ = newcls - - -def _dump_loader_info(loader) -> t.Generator: - yield f"class: {type(loader).__module__}.{type(loader).__name__}" - for key, value in sorted(loader.__dict__.items()): - if key.startswith("_"): - continue - if isinstance(value, (tuple, list)): - if not all(isinstance(x, str) for x in value): - continue - yield f"{key}:" - for item in value: - yield f" - {item}" - continue - elif not isinstance(value, (str, int, float, bool)): - continue - yield f"{key}: {value!r}" - - -def explain_template_loading_attempts(app: Flask, template, attempts) -> None: - """This should help developers understand what failed""" - info = [f"Locating template {template!r}:"] - total_found = 0 - blueprint = None - reqctx = _request_ctx_stack.top - if reqctx is not None and reqctx.request.blueprint is not None: - blueprint = reqctx.request.blueprint - - for idx, (loader, srcobj, triple) in enumerate(attempts): - if isinstance(srcobj, Flask): - src_info = f"application {srcobj.import_name!r}" - elif isinstance(srcobj, Blueprint): - src_info = f"blueprint {srcobj.name!r} ({srcobj.import_name})" - else: - src_info = repr(srcobj) - - info.append(f"{idx + 1:5}: trying loader of {src_info}") - - for line in _dump_loader_info(loader): - info.append(f" {line}") - - if triple is None: - detail = "no match" - else: - detail = f"found ({triple[1] or ''!r})" - total_found += 1 - info.append(f" -> {detail}") - - seems_fishy = False - if total_found == 0: - info.append("Error: the template could not be found.") - seems_fishy = True - elif total_found > 1: - info.append("Warning: multiple loaders returned a match for the template.") - seems_fishy = True - - if blueprint is not None and seems_fishy: - info.append( - " The template was looked up from an endpoint that belongs" - f" to the blueprint {blueprint!r}." - ) - info.append(" Maybe you did not place a template in the right folder?") - info.append(" See https://flask.palletsprojects.com/blueprints/#templates") - - app.logger.info("\n".join(info)) - - -def explain_ignored_app_run() -> None: - if os.environ.get("WERKZEUG_RUN_MAIN") != "true": - warn( - Warning( - "Silently ignoring app.run() because the application is" - " run from the flask command line executable. Consider" - ' putting app.run() behind an if __name__ == "__main__"' - " guard to silence this warning." - ), - stacklevel=3, - ) diff --git a/venv/lib/python3.8/site-packages/flask/globals.py b/venv/lib/python3.8/site-packages/flask/globals.py deleted file mode 100644 index 6d91c75..0000000 --- a/venv/lib/python3.8/site-packages/flask/globals.py +++ /dev/null @@ -1,59 +0,0 @@ -import typing as t -from functools import partial - -from werkzeug.local import LocalProxy -from werkzeug.local import LocalStack - -if t.TYPE_CHECKING: - from .app import Flask - from .ctx import _AppCtxGlobals - from .sessions import SessionMixin - from .wrappers import Request - -_request_ctx_err_msg = """\ -Working outside of request context. - -This typically means that you attempted to use functionality that needed -an active HTTP request. Consult the documentation on testing for -information about how to avoid this problem.\ -""" -_app_ctx_err_msg = """\ -Working outside of application context. - -This typically means that you attempted to use functionality that needed -to interface with the current application object in some way. To solve -this, set up an application context with app.app_context(). See the -documentation for more information.\ -""" - - -def _lookup_req_object(name): - top = _request_ctx_stack.top - if top is None: - raise RuntimeError(_request_ctx_err_msg) - return getattr(top, name) - - -def _lookup_app_object(name): - top = _app_ctx_stack.top - if top is None: - raise RuntimeError(_app_ctx_err_msg) - return getattr(top, name) - - -def _find_app(): - top = _app_ctx_stack.top - if top is None: - raise RuntimeError(_app_ctx_err_msg) - return top.app - - -# context locals -_request_ctx_stack = LocalStack() -_app_ctx_stack = LocalStack() -current_app: "Flask" = LocalProxy(_find_app) # type: ignore -request: "Request" = LocalProxy(partial(_lookup_req_object, "request")) # type: ignore -session: "SessionMixin" = LocalProxy( # type: ignore - partial(_lookup_req_object, "session") -) -g: "_AppCtxGlobals" = LocalProxy(partial(_lookup_app_object, "g")) # type: ignore diff --git a/venv/lib/python3.8/site-packages/flask/helpers.py b/venv/lib/python3.8/site-packages/flask/helpers.py deleted file mode 100644 index 7b8b087..0000000 --- a/venv/lib/python3.8/site-packages/flask/helpers.py +++ /dev/null @@ -1,836 +0,0 @@ -import os -import pkgutil -import socket -import sys -import typing as t -import warnings -from datetime import datetime -from datetime import timedelta -from functools import lru_cache -from functools import update_wrapper -from threading import RLock - -import werkzeug.utils -from werkzeug.exceptions import NotFound -from werkzeug.routing import BuildError -from werkzeug.urls import url_quote - -from .globals import _app_ctx_stack -from .globals import _request_ctx_stack -from .globals import current_app -from .globals import request -from .globals import session -from .signals import message_flashed - -if t.TYPE_CHECKING: - from .wrappers import Response - - -def get_env() -> str: - """Get the environment the app is running in, indicated by the - :envvar:`FLASK_ENV` environment variable. The default is - ``'production'``. - """ - return os.environ.get("FLASK_ENV") or "production" - - -def get_debug_flag() -> bool: - """Get whether debug mode should be enabled for the app, indicated - by the :envvar:`FLASK_DEBUG` environment variable. The default is - ``True`` if :func:`.get_env` returns ``'development'``, or ``False`` - otherwise. - """ - val = os.environ.get("FLASK_DEBUG") - - if not val: - return get_env() == "development" - - return val.lower() not in ("0", "false", "no") - - -def get_load_dotenv(default: bool = True) -> bool: - """Get whether the user has disabled loading dotenv files by setting - :envvar:`FLASK_SKIP_DOTENV`. The default is ``True``, load the - files. - - :param default: What to return if the env var isn't set. - """ - val = os.environ.get("FLASK_SKIP_DOTENV") - - if not val: - return default - - return val.lower() in ("0", "false", "no") - - -def stream_with_context( - generator_or_function: t.Union[ - t.Iterator[t.AnyStr], t.Callable[..., t.Iterator[t.AnyStr]] - ] -) -> t.Iterator[t.AnyStr]: - """Request contexts disappear when the response is started on the server. - This is done for efficiency reasons and to make it less likely to encounter - memory leaks with badly written WSGI middlewares. The downside is that if - you are using streamed responses, the generator cannot access request bound - information any more. - - This function however can help you keep the context around for longer:: - - from flask import stream_with_context, request, Response - - @app.route('/stream') - def streamed_response(): - @stream_with_context - def generate(): - yield 'Hello ' - yield request.args['name'] - yield '!' - return Response(generate()) - - Alternatively it can also be used around a specific generator:: - - from flask import stream_with_context, request, Response - - @app.route('/stream') - def streamed_response(): - def generate(): - yield 'Hello ' - yield request.args['name'] - yield '!' - return Response(stream_with_context(generate())) - - .. versionadded:: 0.9 - """ - try: - gen = iter(generator_or_function) # type: ignore - except TypeError: - - def decorator(*args: t.Any, **kwargs: t.Any) -> t.Any: - gen = generator_or_function(*args, **kwargs) # type: ignore - return stream_with_context(gen) - - return update_wrapper(decorator, generator_or_function) # type: ignore - - def generator() -> t.Generator: - ctx = _request_ctx_stack.top - if ctx is None: - raise RuntimeError( - "Attempted to stream with context but " - "there was no context in the first place to keep around." - ) - with ctx: - # Dummy sentinel. Has to be inside the context block or we're - # not actually keeping the context around. - yield None - - # The try/finally is here so that if someone passes a WSGI level - # iterator in we're still running the cleanup logic. Generators - # don't need that because they are closed on their destruction - # automatically. - try: - yield from gen - finally: - if hasattr(gen, "close"): - gen.close() # type: ignore - - # The trick is to start the generator. Then the code execution runs until - # the first dummy None is yielded at which point the context was already - # pushed. This item is discarded. Then when the iteration continues the - # real generator is executed. - wrapped_g = generator() - next(wrapped_g) - return wrapped_g - - -def make_response(*args: t.Any) -> "Response": - """Sometimes it is necessary to set additional headers in a view. Because - views do not have to return response objects but can return a value that - is converted into a response object by Flask itself, it becomes tricky to - add headers to it. This function can be called instead of using a return - and you will get a response object which you can use to attach headers. - - If view looked like this and you want to add a new header:: - - def index(): - return render_template('index.html', foo=42) - - You can now do something like this:: - - def index(): - response = make_response(render_template('index.html', foo=42)) - response.headers['X-Parachutes'] = 'parachutes are cool' - return response - - This function accepts the very same arguments you can return from a - view function. This for example creates a response with a 404 error - code:: - - response = make_response(render_template('not_found.html'), 404) - - The other use case of this function is to force the return value of a - view function into a response which is helpful with view - decorators:: - - response = make_response(view_function()) - response.headers['X-Parachutes'] = 'parachutes are cool' - - Internally this function does the following things: - - - if no arguments are passed, it creates a new response argument - - if one argument is passed, :meth:`flask.Flask.make_response` - is invoked with it. - - if more than one argument is passed, the arguments are passed - to the :meth:`flask.Flask.make_response` function as tuple. - - .. versionadded:: 0.6 - """ - if not args: - return current_app.response_class() - if len(args) == 1: - args = args[0] - return current_app.make_response(args) - - -def url_for(endpoint: str, **values: t.Any) -> str: - """Generates a URL to the given endpoint with the method provided. - - Variable arguments that are unknown to the target endpoint are appended - to the generated URL as query arguments. If the value of a query argument - is ``None``, the whole pair is skipped. In case blueprints are active - you can shortcut references to the same blueprint by prefixing the - local endpoint with a dot (``.``). - - This will reference the index function local to the current blueprint:: - - url_for('.index') - - See :ref:`url-building`. - - Configuration values ``APPLICATION_ROOT`` and ``SERVER_NAME`` are only used when - generating URLs outside of a request context. - - To integrate applications, :class:`Flask` has a hook to intercept URL build - errors through :attr:`Flask.url_build_error_handlers`. The `url_for` - function results in a :exc:`~werkzeug.routing.BuildError` when the current - app does not have a URL for the given endpoint and values. When it does, the - :data:`~flask.current_app` calls its :attr:`~Flask.url_build_error_handlers` if - it is not ``None``, which can return a string to use as the result of - `url_for` (instead of `url_for`'s default to raise the - :exc:`~werkzeug.routing.BuildError` exception) or re-raise the exception. - An example:: - - def external_url_handler(error, endpoint, values): - "Looks up an external URL when `url_for` cannot build a URL." - # This is an example of hooking the build_error_handler. - # Here, lookup_url is some utility function you've built - # which looks up the endpoint in some external URL registry. - url = lookup_url(endpoint, **values) - if url is None: - # External lookup did not have a URL. - # Re-raise the BuildError, in context of original traceback. - exc_type, exc_value, tb = sys.exc_info() - if exc_value is error: - raise exc_type(exc_value).with_traceback(tb) - else: - raise error - # url_for will use this result, instead of raising BuildError. - return url - - app.url_build_error_handlers.append(external_url_handler) - - Here, `error` is the instance of :exc:`~werkzeug.routing.BuildError`, and - `endpoint` and `values` are the arguments passed into `url_for`. Note - that this is for building URLs outside the current application, and not for - handling 404 NotFound errors. - - .. versionadded:: 0.10 - The `_scheme` parameter was added. - - .. versionadded:: 0.9 - The `_anchor` and `_method` parameters were added. - - .. versionadded:: 0.9 - Calls :meth:`Flask.handle_build_error` on - :exc:`~werkzeug.routing.BuildError`. - - :param endpoint: the endpoint of the URL (name of the function) - :param values: the variable arguments of the URL rule - :param _external: if set to ``True``, an absolute URL is generated. Server - address can be changed via ``SERVER_NAME`` configuration variable which - falls back to the `Host` header, then to the IP and port of the request. - :param _scheme: a string specifying the desired URL scheme. The `_external` - parameter must be set to ``True`` or a :exc:`ValueError` is raised. The default - behavior uses the same scheme as the current request, or - :data:`PREFERRED_URL_SCHEME` if no request context is available. - This also can be set to an empty string to build protocol-relative - URLs. - :param _anchor: if provided this is added as anchor to the URL. - :param _method: if provided this explicitly specifies an HTTP method. - """ - appctx = _app_ctx_stack.top - reqctx = _request_ctx_stack.top - - if appctx is None: - raise RuntimeError( - "Attempted to generate a URL without the application context being" - " pushed. This has to be executed when application context is" - " available." - ) - - # If request specific information is available we have some extra - # features that support "relative" URLs. - if reqctx is not None: - url_adapter = reqctx.url_adapter - blueprint_name = request.blueprint - - if endpoint[:1] == ".": - if blueprint_name is not None: - endpoint = f"{blueprint_name}{endpoint}" - else: - endpoint = endpoint[1:] - - external = values.pop("_external", False) - - # Otherwise go with the url adapter from the appctx and make - # the URLs external by default. - else: - url_adapter = appctx.url_adapter - - if url_adapter is None: - raise RuntimeError( - "Application was not able to create a URL adapter for request" - " independent URL generation. You might be able to fix this by" - " setting the SERVER_NAME config variable." - ) - - external = values.pop("_external", True) - - anchor = values.pop("_anchor", None) - method = values.pop("_method", None) - scheme = values.pop("_scheme", None) - appctx.app.inject_url_defaults(endpoint, values) - - # This is not the best way to deal with this but currently the - # underlying Werkzeug router does not support overriding the scheme on - # a per build call basis. - old_scheme = None - if scheme is not None: - if not external: - raise ValueError("When specifying _scheme, _external must be True") - old_scheme = url_adapter.url_scheme - url_adapter.url_scheme = scheme - - try: - try: - rv = url_adapter.build( - endpoint, values, method=method, force_external=external - ) - finally: - if old_scheme is not None: - url_adapter.url_scheme = old_scheme - except BuildError as error: - # We need to inject the values again so that the app callback can - # deal with that sort of stuff. - values["_external"] = external - values["_anchor"] = anchor - values["_method"] = method - values["_scheme"] = scheme - return appctx.app.handle_url_build_error(error, endpoint, values) - - if anchor is not None: - rv += f"#{url_quote(anchor)}" - return rv - - -def get_template_attribute(template_name: str, attribute: str) -> t.Any: - """Loads a macro (or variable) a template exports. This can be used to - invoke a macro from within Python code. If you for example have a - template named :file:`_cider.html` with the following contents: - - .. sourcecode:: html+jinja - - {% macro hello(name) %}Hello {{ name }}!{% endmacro %} - - You can access this from Python code like this:: - - hello = get_template_attribute('_cider.html', 'hello') - return hello('World') - - .. versionadded:: 0.2 - - :param template_name: the name of the template - :param attribute: the name of the variable of macro to access - """ - return getattr(current_app.jinja_env.get_template(template_name).module, attribute) - - -def flash(message: str, category: str = "message") -> None: - """Flashes a message to the next request. In order to remove the - flashed message from the session and to display it to the user, - the template has to call :func:`get_flashed_messages`. - - .. versionchanged:: 0.3 - `category` parameter added. - - :param message: the message to be flashed. - :param category: the category for the message. The following values - are recommended: ``'message'`` for any kind of message, - ``'error'`` for errors, ``'info'`` for information - messages and ``'warning'`` for warnings. However any - kind of string can be used as category. - """ - # Original implementation: - # - # session.setdefault('_flashes', []).append((category, message)) - # - # This assumed that changes made to mutable structures in the session are - # always in sync with the session object, which is not true for session - # implementations that use external storage for keeping their keys/values. - flashes = session.get("_flashes", []) - flashes.append((category, message)) - session["_flashes"] = flashes - message_flashed.send( - current_app._get_current_object(), # type: ignore - message=message, - category=category, - ) - - -def get_flashed_messages( - with_categories: bool = False, category_filter: t.Iterable[str] = () -) -> t.Union[t.List[str], t.List[t.Tuple[str, str]]]: - """Pulls all flashed messages from the session and returns them. - Further calls in the same request to the function will return - the same messages. By default just the messages are returned, - but when `with_categories` is set to ``True``, the return value will - be a list of tuples in the form ``(category, message)`` instead. - - Filter the flashed messages to one or more categories by providing those - categories in `category_filter`. This allows rendering categories in - separate html blocks. The `with_categories` and `category_filter` - arguments are distinct: - - * `with_categories` controls whether categories are returned with message - text (``True`` gives a tuple, where ``False`` gives just the message text). - * `category_filter` filters the messages down to only those matching the - provided categories. - - See :doc:`/patterns/flashing` for examples. - - .. versionchanged:: 0.3 - `with_categories` parameter added. - - .. versionchanged:: 0.9 - `category_filter` parameter added. - - :param with_categories: set to ``True`` to also receive categories. - :param category_filter: filter of categories to limit return values. Only - categories in the list will be returned. - """ - flashes = _request_ctx_stack.top.flashes - if flashes is None: - _request_ctx_stack.top.flashes = flashes = ( - session.pop("_flashes") if "_flashes" in session else [] - ) - if category_filter: - flashes = list(filter(lambda f: f[0] in category_filter, flashes)) - if not with_categories: - return [x[1] for x in flashes] - return flashes - - -def _prepare_send_file_kwargs( - download_name: t.Optional[str] = None, - attachment_filename: t.Optional[str] = None, - etag: t.Optional[t.Union[bool, str]] = None, - add_etags: t.Optional[t.Union[bool]] = None, - max_age: t.Optional[ - t.Union[int, t.Callable[[t.Optional[str]], t.Optional[int]]] - ] = None, - cache_timeout: t.Optional[int] = None, - **kwargs: t.Any, -) -> t.Dict[str, t.Any]: - if attachment_filename is not None: - warnings.warn( - "The 'attachment_filename' parameter has been renamed to" - " 'download_name'. The old name will be removed in Flask" - " 2.1.", - DeprecationWarning, - stacklevel=3, - ) - download_name = attachment_filename - - if cache_timeout is not None: - warnings.warn( - "The 'cache_timeout' parameter has been renamed to" - " 'max_age'. The old name will be removed in Flask 2.1.", - DeprecationWarning, - stacklevel=3, - ) - max_age = cache_timeout - - if add_etags is not None: - warnings.warn( - "The 'add_etags' parameter has been renamed to 'etag'. The" - " old name will be removed in Flask 2.1.", - DeprecationWarning, - stacklevel=3, - ) - etag = add_etags - - if max_age is None: - max_age = current_app.get_send_file_max_age - - kwargs.update( - environ=request.environ, - download_name=download_name, - etag=etag, - max_age=max_age, - use_x_sendfile=current_app.use_x_sendfile, - response_class=current_app.response_class, - _root_path=current_app.root_path, # type: ignore - ) - return kwargs - - -def send_file( - path_or_file: t.Union[os.PathLike, str, t.BinaryIO], - mimetype: t.Optional[str] = None, - as_attachment: bool = False, - download_name: t.Optional[str] = None, - attachment_filename: t.Optional[str] = None, - conditional: bool = True, - etag: t.Union[bool, str] = True, - add_etags: t.Optional[bool] = None, - last_modified: t.Optional[t.Union[datetime, int, float]] = None, - max_age: t.Optional[ - t.Union[int, t.Callable[[t.Optional[str]], t.Optional[int]]] - ] = None, - cache_timeout: t.Optional[int] = None, -): - """Send the contents of a file to the client. - - The first argument can be a file path or a file-like object. Paths - are preferred in most cases because Werkzeug can manage the file and - get extra information from the path. Passing a file-like object - requires that the file is opened in binary mode, and is mostly - useful when building a file in memory with :class:`io.BytesIO`. - - Never pass file paths provided by a user. The path is assumed to be - trusted, so a user could craft a path to access a file you didn't - intend. Use :func:`send_from_directory` to safely serve - user-requested paths from within a directory. - - If the WSGI server sets a ``file_wrapper`` in ``environ``, it is - used, otherwise Werkzeug's built-in wrapper is used. Alternatively, - if the HTTP server supports ``X-Sendfile``, configuring Flask with - ``USE_X_SENDFILE = True`` will tell the server to send the given - path, which is much more efficient than reading it in Python. - - :param path_or_file: The path to the file to send, relative to the - current working directory if a relative path is given. - Alternatively, a file-like object opened in binary mode. Make - sure the file pointer is seeked to the start of the data. - :param mimetype: The MIME type to send for the file. If not - provided, it will try to detect it from the file name. - :param as_attachment: Indicate to a browser that it should offer to - save the file instead of displaying it. - :param download_name: The default name browsers will use when saving - the file. Defaults to the passed file name. - :param conditional: Enable conditional and range responses based on - request headers. Requires passing a file path and ``environ``. - :param etag: Calculate an ETag for the file, which requires passing - a file path. Can also be a string to use instead. - :param last_modified: The last modified time to send for the file, - in seconds. If not provided, it will try to detect it from the - file path. - :param max_age: How long the client should cache the file, in - seconds. If set, ``Cache-Control`` will be ``public``, otherwise - it will be ``no-cache`` to prefer conditional caching. - - .. versionchanged:: 2.0 - ``download_name`` replaces the ``attachment_filename`` - parameter. If ``as_attachment=False``, it is passed with - ``Content-Disposition: inline`` instead. - - .. versionchanged:: 2.0 - ``max_age`` replaces the ``cache_timeout`` parameter. - ``conditional`` is enabled and ``max_age`` is not set by - default. - - .. versionchanged:: 2.0 - ``etag`` replaces the ``add_etags`` parameter. It can be a - string to use instead of generating one. - - .. versionchanged:: 2.0 - Passing a file-like object that inherits from - :class:`~io.TextIOBase` will raise a :exc:`ValueError` rather - than sending an empty file. - - .. versionadded:: 2.0 - Moved the implementation to Werkzeug. This is now a wrapper to - pass some Flask-specific arguments. - - .. versionchanged:: 1.1 - ``filename`` may be a :class:`~os.PathLike` object. - - .. versionchanged:: 1.1 - Passing a :class:`~io.BytesIO` object supports range requests. - - .. versionchanged:: 1.0.3 - Filenames are encoded with ASCII instead of Latin-1 for broader - compatibility with WSGI servers. - - .. versionchanged:: 1.0 - UTF-8 filenames as specified in :rfc:`2231` are supported. - - .. versionchanged:: 0.12 - The filename is no longer automatically inferred from file - objects. If you want to use automatic MIME and etag support, - pass a filename via ``filename_or_fp`` or - ``attachment_filename``. - - .. versionchanged:: 0.12 - ``attachment_filename`` is preferred over ``filename`` for MIME - detection. - - .. versionchanged:: 0.9 - ``cache_timeout`` defaults to - :meth:`Flask.get_send_file_max_age`. - - .. versionchanged:: 0.7 - MIME guessing and etag support for file-like objects was - deprecated because it was unreliable. Pass a filename if you are - able to, otherwise attach an etag yourself. - - .. versionchanged:: 0.5 - The ``add_etags``, ``cache_timeout`` and ``conditional`` - parameters were added. The default behavior is to add etags. - - .. versionadded:: 0.2 - """ - return werkzeug.utils.send_file( - **_prepare_send_file_kwargs( - path_or_file=path_or_file, - environ=request.environ, - mimetype=mimetype, - as_attachment=as_attachment, - download_name=download_name, - attachment_filename=attachment_filename, - conditional=conditional, - etag=etag, - add_etags=add_etags, - last_modified=last_modified, - max_age=max_age, - cache_timeout=cache_timeout, - ) - ) - - -def safe_join(directory: str, *pathnames: str) -> str: - """Safely join zero or more untrusted path components to a base - directory to avoid escaping the base directory. - - :param directory: The trusted base directory. - :param pathnames: The untrusted path components relative to the - base directory. - :return: A safe path, otherwise ``None``. - """ - warnings.warn( - "'flask.helpers.safe_join' is deprecated and will be removed in" - " Flask 2.1. Use 'werkzeug.utils.safe_join' instead.", - DeprecationWarning, - stacklevel=2, - ) - path = werkzeug.utils.safe_join(directory, *pathnames) - - if path is None: - raise NotFound() - - return path - - -def send_from_directory( - directory: t.Union[os.PathLike, str], - path: t.Union[os.PathLike, str], - filename: t.Optional[str] = None, - **kwargs: t.Any, -) -> "Response": - """Send a file from within a directory using :func:`send_file`. - - .. code-block:: python - - @app.route("/uploads/") - def download_file(name): - return send_from_directory( - app.config['UPLOAD_FOLDER'], name, as_attachment=True - ) - - This is a secure way to serve files from a folder, such as static - files or uploads. Uses :func:`~werkzeug.security.safe_join` to - ensure the path coming from the client is not maliciously crafted to - point outside the specified directory. - - If the final path does not point to an existing regular file, - raises a 404 :exc:`~werkzeug.exceptions.NotFound` error. - - :param directory: The directory that ``path`` must be located under. - :param path: The path to the file to send, relative to - ``directory``. - :param kwargs: Arguments to pass to :func:`send_file`. - - .. versionchanged:: 2.0 - ``path`` replaces the ``filename`` parameter. - - .. versionadded:: 2.0 - Moved the implementation to Werkzeug. This is now a wrapper to - pass some Flask-specific arguments. - - .. versionadded:: 0.5 - """ - if filename is not None: - warnings.warn( - "The 'filename' parameter has been renamed to 'path'. The" - " old name will be removed in Flask 2.1.", - DeprecationWarning, - stacklevel=2, - ) - path = filename - - return werkzeug.utils.send_from_directory( # type: ignore - directory, path, **_prepare_send_file_kwargs(**kwargs) - ) - - -def get_root_path(import_name: str) -> str: - """Find the root path of a package, or the path that contains a - module. If it cannot be found, returns the current working - directory. - - Not to be confused with the value returned by :func:`find_package`. - - :meta private: - """ - # Module already imported and has a file attribute. Use that first. - mod = sys.modules.get(import_name) - - if mod is not None and hasattr(mod, "__file__"): - return os.path.dirname(os.path.abspath(mod.__file__)) - - # Next attempt: check the loader. - loader = pkgutil.get_loader(import_name) - - # Loader does not exist or we're referring to an unloaded main - # module or a main module without path (interactive sessions), go - # with the current working directory. - if loader is None or import_name == "__main__": - return os.getcwd() - - if hasattr(loader, "get_filename"): - filepath = loader.get_filename(import_name) # type: ignore - else: - # Fall back to imports. - __import__(import_name) - mod = sys.modules[import_name] - filepath = getattr(mod, "__file__", None) - - # If we don't have a file path it might be because it is a - # namespace package. In this case pick the root path from the - # first module that is contained in the package. - if filepath is None: - raise RuntimeError( - "No root path can be found for the provided module" - f" {import_name!r}. This can happen because the module" - " came from an import hook that does not provide file" - " name information or because it's a namespace package." - " In this case the root path needs to be explicitly" - " provided." - ) - - # filepath is import_name.py for a module, or __init__.py for a package. - return os.path.dirname(os.path.abspath(filepath)) - - -class locked_cached_property(werkzeug.utils.cached_property): - """A :func:`property` that is only evaluated once. Like - :class:`werkzeug.utils.cached_property` except access uses a lock - for thread safety. - - .. versionchanged:: 2.0 - Inherits from Werkzeug's ``cached_property`` (and ``property``). - """ - - def __init__( - self, - fget: t.Callable[[t.Any], t.Any], - name: t.Optional[str] = None, - doc: t.Optional[str] = None, - ) -> None: - super().__init__(fget, name=name, doc=doc) - self.lock = RLock() - - def __get__(self, obj: object, type: type = None) -> t.Any: # type: ignore - if obj is None: - return self - - with self.lock: - return super().__get__(obj, type=type) - - def __set__(self, obj: object, value: t.Any) -> None: - with self.lock: - super().__set__(obj, value) - - def __delete__(self, obj: object) -> None: - with self.lock: - super().__delete__(obj) - - -def total_seconds(td: timedelta) -> int: - """Returns the total seconds from a timedelta object. - - :param timedelta td: the timedelta to be converted in seconds - - :returns: number of seconds - :rtype: int - - .. deprecated:: 2.0 - Will be removed in Flask 2.1. Use - :meth:`timedelta.total_seconds` instead. - """ - warnings.warn( - "'total_seconds' is deprecated and will be removed in Flask" - " 2.1. Use 'timedelta.total_seconds' instead.", - DeprecationWarning, - stacklevel=2, - ) - return td.days * 60 * 60 * 24 + td.seconds - - -def is_ip(value: str) -> bool: - """Determine if the given string is an IP address. - - :param value: value to check - :type value: str - - :return: True if string is an IP address - :rtype: bool - """ - for family in (socket.AF_INET, socket.AF_INET6): - try: - socket.inet_pton(family, value) - except OSError: - pass - else: - return True - - return False - - -@lru_cache(maxsize=None) -def _split_blueprint_path(name: str) -> t.List[str]: - out: t.List[str] = [name] - - if "." in name: - out.extend(_split_blueprint_path(name.rpartition(".")[0])) - - return out diff --git a/venv/lib/python3.8/site-packages/flask/json/__init__.py b/venv/lib/python3.8/site-packages/flask/json/__init__.py deleted file mode 100644 index 5780e20..0000000 --- a/venv/lib/python3.8/site-packages/flask/json/__init__.py +++ /dev/null @@ -1,350 +0,0 @@ -import io -import json as _json -import typing as t -import uuid -import warnings -from datetime import date - -from jinja2.utils import htmlsafe_json_dumps as _jinja_htmlsafe_dumps -from werkzeug.http import http_date - -from ..globals import current_app -from ..globals import request - -if t.TYPE_CHECKING: - from ..app import Flask - from ..wrappers import Response - -try: - import dataclasses -except ImportError: - # Python < 3.7 - dataclasses = None # type: ignore - - -class JSONEncoder(_json.JSONEncoder): - """The default JSON encoder. Handles extra types compared to the - built-in :class:`json.JSONEncoder`. - - - :class:`datetime.datetime` and :class:`datetime.date` are - serialized to :rfc:`822` strings. This is the same as the HTTP - date format. - - :class:`uuid.UUID` is serialized to a string. - - :class:`dataclasses.dataclass` is passed to - :func:`dataclasses.asdict`. - - :class:`~markupsafe.Markup` (or any object with a ``__html__`` - method) will call the ``__html__`` method to get a string. - - Assign a subclass of this to :attr:`flask.Flask.json_encoder` or - :attr:`flask.Blueprint.json_encoder` to override the default. - """ - - def default(self, o: t.Any) -> t.Any: - """Convert ``o`` to a JSON serializable type. See - :meth:`json.JSONEncoder.default`. Python does not support - overriding how basic types like ``str`` or ``list`` are - serialized, they are handled before this method. - """ - if isinstance(o, date): - return http_date(o) - if isinstance(o, uuid.UUID): - return str(o) - if dataclasses and dataclasses.is_dataclass(o): - return dataclasses.asdict(o) - if hasattr(o, "__html__"): - return str(o.__html__()) - return super().default(o) - - -class JSONDecoder(_json.JSONDecoder): - """The default JSON decoder. - - This does not change any behavior from the built-in - :class:`json.JSONDecoder`. - - Assign a subclass of this to :attr:`flask.Flask.json_decoder` or - :attr:`flask.Blueprint.json_decoder` to override the default. - """ - - -def _dump_arg_defaults( - kwargs: t.Dict[str, t.Any], app: t.Optional["Flask"] = None -) -> None: - """Inject default arguments for dump functions.""" - if app is None: - app = current_app - - if app: - cls = app.json_encoder - bp = app.blueprints.get(request.blueprint) if request else None # type: ignore - if bp is not None and bp.json_encoder is not None: - cls = bp.json_encoder - - kwargs.setdefault("cls", cls) - kwargs.setdefault("ensure_ascii", app.config["JSON_AS_ASCII"]) - kwargs.setdefault("sort_keys", app.config["JSON_SORT_KEYS"]) - else: - kwargs.setdefault("sort_keys", True) - kwargs.setdefault("cls", JSONEncoder) - - -def _load_arg_defaults( - kwargs: t.Dict[str, t.Any], app: t.Optional["Flask"] = None -) -> None: - """Inject default arguments for load functions.""" - if app is None: - app = current_app - - if app: - cls = app.json_decoder - bp = app.blueprints.get(request.blueprint) if request else None # type: ignore - if bp is not None and bp.json_decoder is not None: - cls = bp.json_decoder - - kwargs.setdefault("cls", cls) - else: - kwargs.setdefault("cls", JSONDecoder) - - -def dumps(obj: t.Any, app: t.Optional["Flask"] = None, **kwargs: t.Any) -> str: - """Serialize an object to a string of JSON. - - Takes the same arguments as the built-in :func:`json.dumps`, with - some defaults from application configuration. - - :param obj: Object to serialize to JSON. - :param app: Use this app's config instead of the active app context - or defaults. - :param kwargs: Extra arguments passed to :func:`json.dumps`. - - .. versionchanged:: 2.0 - ``encoding`` is deprecated and will be removed in Flask 2.1. - - .. versionchanged:: 1.0.3 - ``app`` can be passed directly, rather than requiring an app - context for configuration. - """ - _dump_arg_defaults(kwargs, app=app) - encoding = kwargs.pop("encoding", None) - rv = _json.dumps(obj, **kwargs) - - if encoding is not None: - warnings.warn( - "'encoding' is deprecated and will be removed in Flask 2.1.", - DeprecationWarning, - stacklevel=2, - ) - - if isinstance(rv, str): - return rv.encode(encoding) # type: ignore - - return rv - - -def dump( - obj: t.Any, fp: t.IO[str], app: t.Optional["Flask"] = None, **kwargs: t.Any -) -> None: - """Serialize an object to JSON written to a file object. - - Takes the same arguments as the built-in :func:`json.dump`, with - some defaults from application configuration. - - :param obj: Object to serialize to JSON. - :param fp: File object to write JSON to. - :param app: Use this app's config instead of the active app context - or defaults. - :param kwargs: Extra arguments passed to :func:`json.dump`. - - .. versionchanged:: 2.0 - Writing to a binary file, and the ``encoding`` argument, is - deprecated and will be removed in Flask 2.1. - """ - _dump_arg_defaults(kwargs, app=app) - encoding = kwargs.pop("encoding", None) - show_warning = encoding is not None - - try: - fp.write("") - except TypeError: - show_warning = True - fp = io.TextIOWrapper(fp, encoding or "utf-8") # type: ignore - - if show_warning: - warnings.warn( - "Writing to a binary file, and the 'encoding' argument, is" - " deprecated and will be removed in Flask 2.1.", - DeprecationWarning, - stacklevel=2, - ) - - _json.dump(obj, fp, **kwargs) - - -def loads(s: str, app: t.Optional["Flask"] = None, **kwargs: t.Any) -> t.Any: - """Deserialize an object from a string of JSON. - - Takes the same arguments as the built-in :func:`json.loads`, with - some defaults from application configuration. - - :param s: JSON string to deserialize. - :param app: Use this app's config instead of the active app context - or defaults. - :param kwargs: Extra arguments passed to :func:`json.loads`. - - .. versionchanged:: 2.0 - ``encoding`` is deprecated and will be removed in Flask 2.1. The - data must be a string or UTF-8 bytes. - - .. versionchanged:: 1.0.3 - ``app`` can be passed directly, rather than requiring an app - context for configuration. - """ - _load_arg_defaults(kwargs, app=app) - encoding = kwargs.pop("encoding", None) - - if encoding is not None: - warnings.warn( - "'encoding' is deprecated and will be removed in Flask 2.1." - " The data must be a string or UTF-8 bytes.", - DeprecationWarning, - stacklevel=2, - ) - - if isinstance(s, bytes): - s = s.decode(encoding) - - return _json.loads(s, **kwargs) - - -def load(fp: t.IO[str], app: t.Optional["Flask"] = None, **kwargs: t.Any) -> t.Any: - """Deserialize an object from JSON read from a file object. - - Takes the same arguments as the built-in :func:`json.load`, with - some defaults from application configuration. - - :param fp: File object to read JSON from. - :param app: Use this app's config instead of the active app context - or defaults. - :param kwargs: Extra arguments passed to :func:`json.load`. - - .. versionchanged:: 2.0 - ``encoding`` is deprecated and will be removed in Flask 2.1. The - file must be text mode, or binary mode with UTF-8 bytes. - """ - _load_arg_defaults(kwargs, app=app) - encoding = kwargs.pop("encoding", None) - - if encoding is not None: - warnings.warn( - "'encoding' is deprecated and will be removed in Flask 2.1." - " The file must be text mode, or binary mode with UTF-8" - " bytes.", - DeprecationWarning, - stacklevel=2, - ) - - if isinstance(fp.read(0), bytes): - fp = io.TextIOWrapper(fp, encoding) # type: ignore - - return _json.load(fp, **kwargs) - - -def htmlsafe_dumps(obj: t.Any, **kwargs: t.Any) -> str: - """Serialize an object to a string of JSON with :func:`dumps`, then - replace HTML-unsafe characters with Unicode escapes and mark the - result safe with :class:`~markupsafe.Markup`. - - This is available in templates as the ``|tojson`` filter. - - The returned string is safe to render in HTML documents and - `` - - - -
-""" -FOOTER = """\ - -
- -
-
-

Console Locked

-

- The console is locked and needs to be unlocked by entering the PIN. - You can find the PIN printed out on the standard output of your - shell that runs the server. -

-

PIN: - - -

-
-
- - -""" - -PAGE_HTML = ( - HEADER - + """\ -

%(exception_type)s

-
-

%(exception)s

-
-

Traceback (most recent call last)

-%(summary)s -
-

- This is the Copy/Paste friendly version of the traceback. -

- -
-
- The debugger caught an exception in your WSGI application. You can now - look at the traceback which led to the error. - If you enable JavaScript you can also use additional features such as code - execution (if the evalex feature is enabled), automatic pasting of the - exceptions and much more. -
-""" - + FOOTER - + """ - -""" -) - -CONSOLE_HTML = ( - HEADER - + """\ -

Interactive Console

-
-In this console you can execute Python expressions in the context of the -application. The initial namespace was created by the debugger automatically. -
-
The Console requires JavaScript.
-""" - + FOOTER -) - -SUMMARY_HTML = """\ -
- %(title)s -
    %(frames)s
- %(description)s -
-""" - -FRAME_HTML = """\ -
-

File "%(filename)s", - line %(lineno)s, - in %(function_name)s

-
%(lines)s
-
-""" - -SOURCE_LINE_HTML = """\ - - %(lineno)s - %(code)s - -""" - - -def render_console_html(secret: str, evalex_trusted: bool = True) -> str: - return CONSOLE_HTML % { - "evalex": "true", - "evalex_trusted": "true" if evalex_trusted else "false", - "console": "true", - "title": "Console", - "secret": secret, - "traceback_id": -1, - } - - -def get_current_traceback( - ignore_system_exceptions: bool = False, - show_hidden_frames: bool = False, - skip: int = 0, -) -> "Traceback": - """Get the current exception info as `Traceback` object. Per default - calling this method will reraise system exceptions such as generator exit, - system exit or others. This behavior can be disabled by passing `False` - to the function as first parameter. - """ - info = t.cast( - t.Tuple[t.Type[BaseException], BaseException, TracebackType], sys.exc_info() - ) - exc_type, exc_value, tb = info - - if ignore_system_exceptions and exc_type in { - SystemExit, - KeyboardInterrupt, - GeneratorExit, - }: - raise - for _ in range(skip): - if tb.tb_next is None: - break - tb = tb.tb_next - tb = Traceback(exc_type, exc_value, tb) - if not show_hidden_frames: - tb.filter_hidden_frames() - return tb - - -class Line: - """Helper for the source renderer.""" - - __slots__ = ("lineno", "code", "in_frame", "current") - - def __init__(self, lineno: int, code: str) -> None: - self.lineno = lineno - self.code = code - self.in_frame = False - self.current = False - - @property - def classes(self) -> t.List[str]: - rv = ["line"] - if self.in_frame: - rv.append("in-frame") - if self.current: - rv.append("current") - return rv - - def render(self) -> str: - return SOURCE_LINE_HTML % { - "classes": " ".join(self.classes), - "lineno": self.lineno, - "code": escape(self.code), - } - - -class Traceback: - """Wraps a traceback.""" - - def __init__( - self, - exc_type: t.Type[BaseException], - exc_value: BaseException, - tb: TracebackType, - ) -> None: - self.exc_type = exc_type - self.exc_value = exc_value - self.tb = tb - - exception_type = exc_type.__name__ - if exc_type.__module__ not in {"builtins", "__builtin__", "exceptions"}: - exception_type = f"{exc_type.__module__}.{exception_type}" - self.exception_type = exception_type - - self.groups = [] - memo = set() - while True: - self.groups.append(Group(exc_type, exc_value, tb)) - memo.add(id(exc_value)) - exc_value = exc_value.__cause__ or exc_value.__context__ # type: ignore - if exc_value is None or id(exc_value) in memo: - break - exc_type = type(exc_value) - tb = exc_value.__traceback__ # type: ignore - self.groups.reverse() - self.frames = [frame for group in self.groups for frame in group.frames] - - def filter_hidden_frames(self) -> None: - """Remove the frames according to the paste spec.""" - for group in self.groups: - group.filter_hidden_frames() - - self.frames[:] = [frame for group in self.groups for frame in group.frames] - - @property - def is_syntax_error(self) -> bool: - """Is it a syntax error?""" - return isinstance(self.exc_value, SyntaxError) - - @property - def exception(self) -> str: - """String representation of the final exception.""" - return self.groups[-1].exception - - def log(self, logfile: t.Optional[t.TextIO] = None) -> None: - """Log the ASCII traceback into a file object.""" - if logfile is None: - logfile = sys.stderr - tb = f"{self.plaintext.rstrip()}\n" - logfile.write(tb) - - def render_summary(self, include_title: bool = True) -> str: - """Render the traceback for the interactive console.""" - title = "" - classes = ["traceback"] - if not self.frames: - classes.append("noframe-traceback") - frames = [] - else: - library_frames = sum(frame.is_library for frame in self.frames) - mark_lib = 0 < library_frames < len(self.frames) - frames = [group.render(mark_lib=mark_lib) for group in self.groups] - - if include_title: - if self.is_syntax_error: - title = "Syntax Error" - else: - title = "Traceback (most recent call last):" - - if self.is_syntax_error: - description = f"
{escape(self.exception)}
" - else: - description = f"
{escape(self.exception)}
" - - return SUMMARY_HTML % { - "classes": " ".join(classes), - "title": f"

{title if title else ''}

", - "frames": "\n".join(frames), - "description": description, - } - - def render_full( - self, - evalex: bool = False, - secret: t.Optional[str] = None, - evalex_trusted: bool = True, - ) -> str: - """Render the Full HTML page with the traceback info.""" - exc = escape(self.exception) - return PAGE_HTML % { - "evalex": "true" if evalex else "false", - "evalex_trusted": "true" if evalex_trusted else "false", - "console": "false", - "title": exc, - "exception": exc, - "exception_type": escape(self.exception_type), - "summary": self.render_summary(include_title=False), - "plaintext": escape(self.plaintext), - "plaintext_cs": re.sub("-{2,}", "-", self.plaintext), - "traceback_id": self.id, - "secret": secret, - } - - @cached_property - def plaintext(self) -> str: - return "\n".join([group.render_text() for group in self.groups]) - - @property - def id(self) -> int: - return id(self) - - -class Group: - """A group of frames for an exception in a traceback. If the - exception has a ``__cause__`` or ``__context__``, there are multiple - exception groups. - """ - - def __init__( - self, - exc_type: t.Type[BaseException], - exc_value: BaseException, - tb: TracebackType, - ) -> None: - self.exc_type = exc_type - self.exc_value = exc_value - self.info = None - if exc_value.__cause__ is not None: - self.info = ( - "The above exception was the direct cause of the following exception" - ) - elif exc_value.__context__ is not None: - self.info = ( - "During handling of the above exception, another exception occurred" - ) - - self.frames = [] - while tb is not None: - self.frames.append(Frame(exc_type, exc_value, tb)) - tb = tb.tb_next # type: ignore - - def filter_hidden_frames(self) -> None: - new_frames: t.List[Frame] = [] - hidden = False - - for frame in self.frames: - hide = frame.hide - if hide in ("before", "before_and_this"): - new_frames = [] - hidden = False - if hide == "before_and_this": - continue - elif hide in ("reset", "reset_and_this"): - hidden = False - if hide == "reset_and_this": - continue - elif hide in ("after", "after_and_this"): - hidden = True - if hide == "after_and_this": - continue - elif hide or hidden: - continue - new_frames.append(frame) - - # if we only have one frame and that frame is from the codeop - # module, remove it. - if len(new_frames) == 1 and self.frames[0].module == "codeop": - del self.frames[:] - - # if the last frame is missing something went terrible wrong :( - elif self.frames[-1] in new_frames: - self.frames[:] = new_frames - - @property - def exception(self) -> str: - """String representation of the exception.""" - buf = traceback.format_exception_only(self.exc_type, self.exc_value) - rv = "".join(buf).strip() - return _to_str(rv, "utf-8", "replace") - - def render(self, mark_lib: bool = True) -> str: - out = [] - if self.info is not None: - out.append(f'
  • {self.info}:
    ') - for frame in self.frames: - title = f' title="{escape(frame.info)}"' if frame.info else "" - out.append(f"{frame.render(mark_lib=mark_lib)}") - return "\n".join(out) - - def render_text(self) -> str: - out = [] - if self.info is not None: - out.append(f"\n{self.info}:\n") - out.append("Traceback (most recent call last):") - for frame in self.frames: - out.append(frame.render_text()) - out.append(self.exception) - return "\n".join(out) - - -class Frame: - """A single frame in a traceback.""" - - def __init__( - self, - exc_type: t.Type[BaseException], - exc_value: BaseException, - tb: TracebackType, - ) -> None: - self.lineno = tb.tb_lineno - self.function_name = tb.tb_frame.f_code.co_name - self.locals = tb.tb_frame.f_locals - self.globals = tb.tb_frame.f_globals - - fn = inspect.getsourcefile(tb) or inspect.getfile(tb) - if fn[-4:] in (".pyo", ".pyc"): - fn = fn[:-1] - # if it's a file on the file system resolve the real filename. - if os.path.isfile(fn): - fn = os.path.realpath(fn) - self.filename = _to_str(fn, get_filesystem_encoding()) - self.module = self.globals.get("__name__", self.locals.get("__name__")) - self.loader = self.globals.get("__loader__", self.locals.get("__loader__")) - self.code = tb.tb_frame.f_code - - # support for paste's traceback extensions - self.hide = self.locals.get("__traceback_hide__", False) - info = self.locals.get("__traceback_info__") - if info is not None: - info = _to_str(info, "utf-8", "replace") - self.info = info - - def render(self, mark_lib: bool = True) -> str: - """Render a single frame in a traceback.""" - return FRAME_HTML % { - "id": self.id, - "filename": escape(self.filename), - "lineno": self.lineno, - "function_name": escape(self.function_name), - "lines": self.render_line_context(), - "library": "library" if mark_lib and self.is_library else "", - } - - @cached_property - def is_library(self) -> bool: - return any( - self.filename.startswith(os.path.realpath(path)) - for path in sysconfig.get_paths().values() - ) - - def render_text(self) -> str: - return ( - f' File "{self.filename}", line {self.lineno}, in {self.function_name}\n' - f" {self.current_line.strip()}" - ) - - def render_line_context(self) -> str: - before, current, after = self.get_context_lines() - rv = [] - - def render_line(line: str, cls: str) -> None: - line = line.expandtabs().rstrip() - stripped_line = line.strip() - prefix = len(line) - len(stripped_line) - rv.append( - f'
    {" " * prefix}'
    -                f"{escape(stripped_line) if stripped_line else ' '}
    " - ) - - for line in before: - render_line(line, "before") - render_line(current, "current") - for line in after: - render_line(line, "after") - - return "\n".join(rv) - - def get_annotated_lines(self) -> t.List[Line]: - """Helper function that returns lines with extra information.""" - lines = [Line(idx + 1, x) for idx, x in enumerate(self.sourcelines)] - - # find function definition and mark lines - if hasattr(self.code, "co_firstlineno"): - lineno = self.code.co_firstlineno - 1 - while lineno > 0: - if _funcdef_re.match(lines[lineno].code): - break - lineno -= 1 - try: - offset = len(inspect.getblock([f"{x.code}\n" for x in lines[lineno:]])) - except TokenError: - offset = 0 - for line in lines[lineno : lineno + offset]: - line.in_frame = True - - # mark current line - try: - lines[self.lineno - 1].current = True - except IndexError: - pass - - return lines - - def eval(self, code: t.Union[str, CodeType], mode: str = "single") -> t.Any: - """Evaluate code in the context of the frame.""" - if isinstance(code, str): - code = compile(code, "", mode) - return eval(code, self.globals, self.locals) - - @cached_property - def sourcelines(self) -> t.List[str]: - """The sourcecode of the file as list of strings.""" - # get sourcecode from loader or file - source = None - if self.loader is not None: - try: - if hasattr(self.loader, "get_source"): - source = self.loader.get_source(self.module) - elif hasattr(self.loader, "get_source_by_code"): - source = self.loader.get_source_by_code(self.code) - except Exception: - # we munch the exception so that we don't cause troubles - # if the loader is broken. - pass - - if source is None: - try: - with open(self.filename, mode="rb") as f: - source = f.read() - except OSError: - return [] - - # already str? return right away - if isinstance(source, str): - return source.splitlines() - - charset = "utf-8" - if source.startswith(codecs.BOM_UTF8): - source = source[3:] - else: - for idx, match in enumerate(_line_re.finditer(source)): - coding_match = _coding_re.search(match.group()) - if coding_match is not None: - charset = coding_match.group(1).decode("utf-8") - break - if idx > 1: - break - - # on broken cookies we fall back to utf-8 too - charset = _to_str(charset) - try: - codecs.lookup(charset) - except LookupError: - charset = "utf-8" - - return source.decode(charset, "replace").splitlines() - - def get_context_lines( - self, context: int = 5 - ) -> t.Tuple[t.List[str], str, t.List[str]]: - before = self.sourcelines[self.lineno - context - 1 : self.lineno - 1] - past = self.sourcelines[self.lineno : self.lineno + context] - return (before, self.current_line, past) - - @property - def current_line(self) -> str: - try: - return self.sourcelines[self.lineno - 1] - except IndexError: - return "" - - @cached_property - def console(self) -> Console: - return Console(self.globals, self.locals) - - @property - def id(self) -> int: - return id(self) diff --git a/venv/lib/python3.8/site-packages/werkzeug/exceptions.py b/venv/lib/python3.8/site-packages/werkzeug/exceptions.py deleted file mode 100644 index 16c3964..0000000 --- a/venv/lib/python3.8/site-packages/werkzeug/exceptions.py +++ /dev/null @@ -1,943 +0,0 @@ -"""Implements a number of Python exceptions which can be raised from within -a view to trigger a standard HTTP non-200 response. - -Usage Example -------------- - -.. code-block:: python - - from werkzeug.wrappers.request import Request - from werkzeug.exceptions import HTTPException, NotFound - - def view(request): - raise NotFound() - - @Request.application - def application(request): - try: - return view(request) - except HTTPException as e: - return e - -As you can see from this example those exceptions are callable WSGI -applications. However, they are not Werkzeug response objects. You -can get a response object by calling ``get_response()`` on a HTTP -exception. - -Keep in mind that you may have to pass an environ (WSGI) or scope -(ASGI) to ``get_response()`` because some errors fetch additional -information relating to the request. - -If you want to hook in a different exception page to say, a 404 status -code, you can add a second except for a specific subclass of an error: - -.. code-block:: python - - @Request.application - def application(request): - try: - return view(request) - except NotFound as e: - return not_found(request) - except HTTPException as e: - return e - -""" -import sys -import typing as t -import warnings -from datetime import datetime -from html import escape - -from ._internal import _get_environ - -if t.TYPE_CHECKING: - import typing_extensions as te - from _typeshed.wsgi import StartResponse - from _typeshed.wsgi import WSGIEnvironment - from .datastructures import WWWAuthenticate - from .sansio.response import Response - from .wrappers.response import Response as WSGIResponse # noqa: F401 - - -class HTTPException(Exception): - """The base class for all HTTP exceptions. This exception can be called as a WSGI - application to render a default error page or you can catch the subclasses - of it independently and render nicer error messages. - """ - - code: t.Optional[int] = None - description: t.Optional[str] = None - - def __init__( - self, - description: t.Optional[str] = None, - response: t.Optional["Response"] = None, - ) -> None: - super().__init__() - if description is not None: - self.description = description - self.response = response - - @classmethod - def wrap( - cls, exception: t.Type[BaseException], name: t.Optional[str] = None - ) -> t.Type["HTTPException"]: - """Create an exception that is a subclass of the calling HTTP - exception and the ``exception`` argument. - - The first argument to the class will be passed to the - wrapped ``exception``, the rest to the HTTP exception. If - ``e.args`` is not empty and ``e.show_exception`` is ``True``, - the wrapped exception message is added to the HTTP error - description. - - .. deprecated:: 2.0 - Will be removed in Werkzeug 2.1. Create a subclass manually - instead. - - .. versionchanged:: 0.15.5 - The ``show_exception`` attribute controls whether the - description includes the wrapped exception message. - - .. versionchanged:: 0.15.0 - The description includes the wrapped exception message. - """ - warnings.warn( - "'HTTPException.wrap' is deprecated and will be removed in" - " Werkzeug 2.1. Create a subclass manually instead.", - DeprecationWarning, - stacklevel=2, - ) - - class newcls(cls, exception): # type: ignore - _description = cls.description - show_exception = False - - def __init__( - self, arg: t.Optional[t.Any] = None, *args: t.Any, **kwargs: t.Any - ) -> None: - super().__init__(*args, **kwargs) - - if arg is None: - exception.__init__(self) - else: - exception.__init__(self, arg) - - @property - def description(self) -> str: - if self.show_exception: - return ( - f"{self._description}\n" - f"{exception.__name__}: {exception.__str__(self)}" - ) - - return self._description # type: ignore - - @description.setter - def description(self, value: str) -> None: - self._description = value - - newcls.__module__ = sys._getframe(1).f_globals["__name__"] - name = name or cls.__name__ + exception.__name__ - newcls.__name__ = newcls.__qualname__ = name - return newcls - - @property - def name(self) -> str: - """The status name.""" - from .http import HTTP_STATUS_CODES - - return HTTP_STATUS_CODES.get(self.code, "Unknown Error") # type: ignore - - def get_description( - self, - environ: t.Optional["WSGIEnvironment"] = None, - scope: t.Optional[dict] = None, - ) -> str: - """Get the description.""" - if self.description is None: - description = "" - elif not isinstance(self.description, str): - description = str(self.description) - else: - description = self.description - - description = escape(description).replace("\n", "
    ") - return f"

    {description}

    " - - def get_body( - self, - environ: t.Optional["WSGIEnvironment"] = None, - scope: t.Optional[dict] = None, - ) -> str: - """Get the HTML body.""" - return ( - '\n' - f"{self.code} {escape(self.name)}\n" - f"

    {escape(self.name)}

    \n" - f"{self.get_description(environ)}\n" - ) - - def get_headers( - self, - environ: t.Optional["WSGIEnvironment"] = None, - scope: t.Optional[dict] = None, - ) -> t.List[t.Tuple[str, str]]: - """Get a list of headers.""" - return [("Content-Type", "text/html; charset=utf-8")] - - def get_response( - self, - environ: t.Optional["WSGIEnvironment"] = None, - scope: t.Optional[dict] = None, - ) -> "Response": - """Get a response object. If one was passed to the exception - it's returned directly. - - :param environ: the optional environ for the request. This - can be used to modify the response depending - on how the request looked like. - :return: a :class:`Response` object or a subclass thereof. - """ - from .wrappers.response import Response as WSGIResponse # noqa: F811 - - if self.response is not None: - return self.response - if environ is not None: - environ = _get_environ(environ) - headers = self.get_headers(environ, scope) - return WSGIResponse(self.get_body(environ, scope), self.code, headers) - - def __call__( - self, environ: "WSGIEnvironment", start_response: "StartResponse" - ) -> t.Iterable[bytes]: - """Call the exception as WSGI application. - - :param environ: the WSGI environment. - :param start_response: the response callable provided by the WSGI - server. - """ - response = t.cast("WSGIResponse", self.get_response(environ)) - return response(environ, start_response) - - def __str__(self) -> str: - code = self.code if self.code is not None else "???" - return f"{code} {self.name}: {self.description}" - - def __repr__(self) -> str: - code = self.code if self.code is not None else "???" - return f"<{type(self).__name__} '{code}: {self.name}'>" - - -class BadRequest(HTTPException): - """*400* `Bad Request` - - Raise if the browser sends something to the application the application - or server cannot handle. - """ - - code = 400 - description = ( - "The browser (or proxy) sent a request that this server could " - "not understand." - ) - - -class BadRequestKeyError(BadRequest, KeyError): - """An exception that is used to signal both a :exc:`KeyError` and a - :exc:`BadRequest`. Used by many of the datastructures. - """ - - _description = BadRequest.description - #: Show the KeyError along with the HTTP error message in the - #: response. This should be disabled in production, but can be - #: useful in a debug mode. - show_exception = False - - def __init__(self, arg: t.Optional[str] = None, *args: t.Any, **kwargs: t.Any): - super().__init__(*args, **kwargs) - - if arg is None: - KeyError.__init__(self) - else: - KeyError.__init__(self, arg) - - @property # type: ignore - def description(self) -> str: # type: ignore - if self.show_exception: - return ( - f"{self._description}\n" - f"{KeyError.__name__}: {KeyError.__str__(self)}" - ) - - return self._description - - @description.setter - def description(self, value: str) -> None: - self._description = value - - -class ClientDisconnected(BadRequest): - """Internal exception that is raised if Werkzeug detects a disconnected - client. Since the client is already gone at that point attempting to - send the error message to the client might not work and might ultimately - result in another exception in the server. Mainly this is here so that - it is silenced by default as far as Werkzeug is concerned. - - Since disconnections cannot be reliably detected and are unspecified - by WSGI to a large extent this might or might not be raised if a client - is gone. - - .. versionadded:: 0.8 - """ - - -class SecurityError(BadRequest): - """Raised if something triggers a security error. This is otherwise - exactly like a bad request error. - - .. versionadded:: 0.9 - """ - - -class BadHost(BadRequest): - """Raised if the submitted host is badly formatted. - - .. versionadded:: 0.11.2 - """ - - -class Unauthorized(HTTPException): - """*401* ``Unauthorized`` - - Raise if the user is not authorized to access a resource. - - The ``www_authenticate`` argument should be used to set the - ``WWW-Authenticate`` header. This is used for HTTP basic auth and - other schemes. Use :class:`~werkzeug.datastructures.WWWAuthenticate` - to create correctly formatted values. Strictly speaking a 401 - response is invalid if it doesn't provide at least one value for - this header, although real clients typically don't care. - - :param description: Override the default message used for the body - of the response. - :param www-authenticate: A single value, or list of values, for the - WWW-Authenticate header(s). - - .. versionchanged:: 2.0 - Serialize multiple ``www_authenticate`` items into multiple - ``WWW-Authenticate`` headers, rather than joining them - into a single value, for better interoperability. - - .. versionchanged:: 0.15.3 - If the ``www_authenticate`` argument is not set, the - ``WWW-Authenticate`` header is not set. - - .. versionchanged:: 0.15.3 - The ``response`` argument was restored. - - .. versionchanged:: 0.15.1 - ``description`` was moved back as the first argument, restoring - its previous position. - - .. versionchanged:: 0.15.0 - ``www_authenticate`` was added as the first argument, ahead of - ``description``. - """ - - code = 401 - description = ( - "The server could not verify that you are authorized to access" - " the URL requested. You either supplied the wrong credentials" - " (e.g. a bad password), or your browser doesn't understand" - " how to supply the credentials required." - ) - - def __init__( - self, - description: t.Optional[str] = None, - response: t.Optional["Response"] = None, - www_authenticate: t.Optional[ - t.Union["WWWAuthenticate", t.Iterable["WWWAuthenticate"]] - ] = None, - ) -> None: - super().__init__(description, response) - - from .datastructures import WWWAuthenticate - - if isinstance(www_authenticate, WWWAuthenticate): - www_authenticate = (www_authenticate,) - - self.www_authenticate = www_authenticate - - def get_headers( - self, - environ: t.Optional["WSGIEnvironment"] = None, - scope: t.Optional[dict] = None, - ) -> t.List[t.Tuple[str, str]]: - headers = super().get_headers(environ, scope) - if self.www_authenticate: - headers.extend(("WWW-Authenticate", str(x)) for x in self.www_authenticate) - return headers - - -class Forbidden(HTTPException): - """*403* `Forbidden` - - Raise if the user doesn't have the permission for the requested resource - but was authenticated. - """ - - code = 403 - description = ( - "You don't have the permission to access the requested" - " resource. It is either read-protected or not readable by the" - " server." - ) - - -class NotFound(HTTPException): - """*404* `Not Found` - - Raise if a resource does not exist and never existed. - """ - - code = 404 - description = ( - "The requested URL was not found on the server. If you entered" - " the URL manually please check your spelling and try again." - ) - - -class MethodNotAllowed(HTTPException): - """*405* `Method Not Allowed` - - Raise if the server used a method the resource does not handle. For - example `POST` if the resource is view only. Especially useful for REST. - - The first argument for this exception should be a list of allowed methods. - Strictly speaking the response would be invalid if you don't provide valid - methods in the header which you can do with that list. - """ - - code = 405 - description = "The method is not allowed for the requested URL." - - def __init__( - self, - valid_methods: t.Optional[t.Iterable[str]] = None, - description: t.Optional[str] = None, - response: t.Optional["Response"] = None, - ) -> None: - """Takes an optional list of valid http methods - starting with werkzeug 0.3 the list will be mandatory.""" - super().__init__(description=description, response=response) - self.valid_methods = valid_methods - - def get_headers( - self, - environ: t.Optional["WSGIEnvironment"] = None, - scope: t.Optional[dict] = None, - ) -> t.List[t.Tuple[str, str]]: - headers = super().get_headers(environ, scope) - if self.valid_methods: - headers.append(("Allow", ", ".join(self.valid_methods))) - return headers - - -class NotAcceptable(HTTPException): - """*406* `Not Acceptable` - - Raise if the server can't return any content conforming to the - `Accept` headers of the client. - """ - - code = 406 - description = ( - "The resource identified by the request is only capable of" - " generating response entities which have content" - " characteristics not acceptable according to the accept" - " headers sent in the request." - ) - - -class RequestTimeout(HTTPException): - """*408* `Request Timeout` - - Raise to signalize a timeout. - """ - - code = 408 - description = ( - "The server closed the network connection because the browser" - " didn't finish the request within the specified time." - ) - - -class Conflict(HTTPException): - """*409* `Conflict` - - Raise to signal that a request cannot be completed because it conflicts - with the current state on the server. - - .. versionadded:: 0.7 - """ - - code = 409 - description = ( - "A conflict happened while processing the request. The" - " resource might have been modified while the request was being" - " processed." - ) - - -class Gone(HTTPException): - """*410* `Gone` - - Raise if a resource existed previously and went away without new location. - """ - - code = 410 - description = ( - "The requested URL is no longer available on this server and" - " there is no forwarding address. If you followed a link from a" - " foreign page, please contact the author of this page." - ) - - -class LengthRequired(HTTPException): - """*411* `Length Required` - - Raise if the browser submitted data but no ``Content-Length`` header which - is required for the kind of processing the server does. - """ - - code = 411 - description = ( - "A request with this method requires a valid Content-" - "Length header." - ) - - -class PreconditionFailed(HTTPException): - """*412* `Precondition Failed` - - Status code used in combination with ``If-Match``, ``If-None-Match``, or - ``If-Unmodified-Since``. - """ - - code = 412 - description = ( - "The precondition on the request for the URL failed positive evaluation." - ) - - -class RequestEntityTooLarge(HTTPException): - """*413* `Request Entity Too Large` - - The status code one should return if the data submitted exceeded a given - limit. - """ - - code = 413 - description = "The data value transmitted exceeds the capacity limit." - - -class RequestURITooLarge(HTTPException): - """*414* `Request URI Too Large` - - Like *413* but for too long URLs. - """ - - code = 414 - description = ( - "The length of the requested URL exceeds the capacity limit for" - " this server. The request cannot be processed." - ) - - -class UnsupportedMediaType(HTTPException): - """*415* `Unsupported Media Type` - - The status code returned if the server is unable to handle the media type - the client transmitted. - """ - - code = 415 - description = ( - "The server does not support the media type transmitted in the request." - ) - - -class RequestedRangeNotSatisfiable(HTTPException): - """*416* `Requested Range Not Satisfiable` - - The client asked for an invalid part of the file. - - .. versionadded:: 0.7 - """ - - code = 416 - description = "The server cannot provide the requested range." - - def __init__( - self, - length: t.Optional[int] = None, - units: str = "bytes", - description: t.Optional[str] = None, - response: t.Optional["Response"] = None, - ) -> None: - """Takes an optional `Content-Range` header value based on ``length`` - parameter. - """ - super().__init__(description=description, response=response) - self.length = length - self.units = units - - def get_headers( - self, - environ: t.Optional["WSGIEnvironment"] = None, - scope: t.Optional[dict] = None, - ) -> t.List[t.Tuple[str, str]]: - headers = super().get_headers(environ, scope) - if self.length is not None: - headers.append(("Content-Range", f"{self.units} */{self.length}")) - return headers - - -class ExpectationFailed(HTTPException): - """*417* `Expectation Failed` - - The server cannot meet the requirements of the Expect request-header. - - .. versionadded:: 0.7 - """ - - code = 417 - description = "The server could not meet the requirements of the Expect header" - - -class ImATeapot(HTTPException): - """*418* `I'm a teapot` - - The server should return this if it is a teapot and someone attempted - to brew coffee with it. - - .. versionadded:: 0.7 - """ - - code = 418 - description = "This server is a teapot, not a coffee machine" - - -class UnprocessableEntity(HTTPException): - """*422* `Unprocessable Entity` - - Used if the request is well formed, but the instructions are otherwise - incorrect. - """ - - code = 422 - description = ( - "The request was well-formed but was unable to be followed due" - " to semantic errors." - ) - - -class Locked(HTTPException): - """*423* `Locked` - - Used if the resource that is being accessed is locked. - """ - - code = 423 - description = "The resource that is being accessed is locked." - - -class FailedDependency(HTTPException): - """*424* `Failed Dependency` - - Used if the method could not be performed on the resource - because the requested action depended on another action and that action failed. - """ - - code = 424 - description = ( - "The method could not be performed on the resource because the" - " requested action depended on another action and that action" - " failed." - ) - - -class PreconditionRequired(HTTPException): - """*428* `Precondition Required` - - The server requires this request to be conditional, typically to prevent - the lost update problem, which is a race condition between two or more - clients attempting to update a resource through PUT or DELETE. By requiring - each client to include a conditional header ("If-Match" or "If-Unmodified- - Since") with the proper value retained from a recent GET request, the - server ensures that each client has at least seen the previous revision of - the resource. - """ - - code = 428 - description = ( - "This request is required to be conditional; try using" - ' "If-Match" or "If-Unmodified-Since".' - ) - - -class _RetryAfter(HTTPException): - """Adds an optional ``retry_after`` parameter which will set the - ``Retry-After`` header. May be an :class:`int` number of seconds or - a :class:`~datetime.datetime`. - """ - - def __init__( - self, - description: t.Optional[str] = None, - response: t.Optional["Response"] = None, - retry_after: t.Optional[t.Union[datetime, int]] = None, - ) -> None: - super().__init__(description, response) - self.retry_after = retry_after - - def get_headers( - self, - environ: t.Optional["WSGIEnvironment"] = None, - scope: t.Optional[dict] = None, - ) -> t.List[t.Tuple[str, str]]: - headers = super().get_headers(environ, scope) - - if self.retry_after: - if isinstance(self.retry_after, datetime): - from .http import http_date - - value = http_date(self.retry_after) - else: - value = str(self.retry_after) - - headers.append(("Retry-After", value)) - - return headers - - -class TooManyRequests(_RetryAfter): - """*429* `Too Many Requests` - - The server is limiting the rate at which this user receives - responses, and this request exceeds that rate. (The server may use - any convenient method to identify users and their request rates). - The server may include a "Retry-After" header to indicate how long - the user should wait before retrying. - - :param retry_after: If given, set the ``Retry-After`` header to this - value. May be an :class:`int` number of seconds or a - :class:`~datetime.datetime`. - - .. versionchanged:: 1.0 - Added ``retry_after`` parameter. - """ - - code = 429 - description = "This user has exceeded an allotted request count. Try again later." - - -class RequestHeaderFieldsTooLarge(HTTPException): - """*431* `Request Header Fields Too Large` - - The server refuses to process the request because the header fields are too - large. One or more individual fields may be too large, or the set of all - headers is too large. - """ - - code = 431 - description = "One or more header fields exceeds the maximum size." - - -class UnavailableForLegalReasons(HTTPException): - """*451* `Unavailable For Legal Reasons` - - This status code indicates that the server is denying access to the - resource as a consequence of a legal demand. - """ - - code = 451 - description = "Unavailable for legal reasons." - - -class InternalServerError(HTTPException): - """*500* `Internal Server Error` - - Raise if an internal server error occurred. This is a good fallback if an - unknown error occurred in the dispatcher. - - .. versionchanged:: 1.0.0 - Added the :attr:`original_exception` attribute. - """ - - code = 500 - description = ( - "The server encountered an internal error and was unable to" - " complete your request. Either the server is overloaded or" - " there is an error in the application." - ) - - def __init__( - self, - description: t.Optional[str] = None, - response: t.Optional["Response"] = None, - original_exception: t.Optional[BaseException] = None, - ) -> None: - #: The original exception that caused this 500 error. Can be - #: used by frameworks to provide context when handling - #: unexpected errors. - self.original_exception = original_exception - super().__init__(description=description, response=response) - - -class NotImplemented(HTTPException): - """*501* `Not Implemented` - - Raise if the application does not support the action requested by the - browser. - """ - - code = 501 - description = "The server does not support the action requested by the browser." - - -class BadGateway(HTTPException): - """*502* `Bad Gateway` - - If you do proxying in your application you should return this status code - if you received an invalid response from the upstream server it accessed - in attempting to fulfill the request. - """ - - code = 502 - description = ( - "The proxy server received an invalid response from an upstream server." - ) - - -class ServiceUnavailable(_RetryAfter): - """*503* `Service Unavailable` - - Status code you should return if a service is temporarily - unavailable. - - :param retry_after: If given, set the ``Retry-After`` header to this - value. May be an :class:`int` number of seconds or a - :class:`~datetime.datetime`. - - .. versionchanged:: 1.0 - Added ``retry_after`` parameter. - """ - - code = 503 - description = ( - "The server is temporarily unable to service your request due" - " to maintenance downtime or capacity problems. Please try" - " again later." - ) - - -class GatewayTimeout(HTTPException): - """*504* `Gateway Timeout` - - Status code you should return if a connection to an upstream server - times out. - """ - - code = 504 - description = "The connection to an upstream server timed out." - - -class HTTPVersionNotSupported(HTTPException): - """*505* `HTTP Version Not Supported` - - The server does not support the HTTP protocol version used in the request. - """ - - code = 505 - description = ( - "The server does not support the HTTP protocol version used in the request." - ) - - -default_exceptions: t.Dict[int, t.Type[HTTPException]] = {} - - -def _find_exceptions() -> None: - for obj in globals().values(): - try: - is_http_exception = issubclass(obj, HTTPException) - except TypeError: - is_http_exception = False - if not is_http_exception or obj.code is None: - continue - old_obj = default_exceptions.get(obj.code, None) - if old_obj is not None and issubclass(obj, old_obj): - continue - default_exceptions[obj.code] = obj - - -_find_exceptions() -del _find_exceptions - - -class Aborter: - """When passed a dict of code -> exception items it can be used as - callable that raises exceptions. If the first argument to the - callable is an integer it will be looked up in the mapping, if it's - a WSGI application it will be raised in a proxy exception. - - The rest of the arguments are forwarded to the exception constructor. - """ - - def __init__( - self, - mapping: t.Optional[t.Dict[int, t.Type[HTTPException]]] = None, - extra: t.Optional[t.Dict[int, t.Type[HTTPException]]] = None, - ) -> None: - if mapping is None: - mapping = default_exceptions - self.mapping = dict(mapping) - if extra is not None: - self.mapping.update(extra) - - def __call__( - self, code: t.Union[int, "Response"], *args: t.Any, **kwargs: t.Any - ) -> "te.NoReturn": - from .sansio.response import Response - - if isinstance(code, Response): - raise HTTPException(response=code) - - if code not in self.mapping: - raise LookupError(f"no exception for {code!r}") - - raise self.mapping[code](*args, **kwargs) - - -def abort( - status: t.Union[int, "Response"], *args: t.Any, **kwargs: t.Any -) -> "te.NoReturn": - """Raises an :py:exc:`HTTPException` for the given status code or WSGI - application. - - If a status code is given, it will be looked up in the list of - exceptions and will raise that exception. If passed a WSGI application, - it will wrap it in a proxy WSGI exception and raise that:: - - abort(404) # 404 Not Found - abort(Response('Hello World')) - - """ - _aborter(status, *args, **kwargs) - - -_aborter: Aborter = Aborter() diff --git a/venv/lib/python3.8/site-packages/werkzeug/filesystem.py b/venv/lib/python3.8/site-packages/werkzeug/filesystem.py deleted file mode 100644 index 36a3d12..0000000 --- a/venv/lib/python3.8/site-packages/werkzeug/filesystem.py +++ /dev/null @@ -1,55 +0,0 @@ -import codecs -import sys -import typing as t -import warnings - -# We do not trust traditional unixes. -has_likely_buggy_unicode_filesystem = ( - sys.platform.startswith("linux") or "bsd" in sys.platform -) - - -def _is_ascii_encoding(encoding: t.Optional[str]) -> bool: - """Given an encoding this figures out if the encoding is actually ASCII (which - is something we don't actually want in most cases). This is necessary - because ASCII comes under many names such as ANSI_X3.4-1968. - """ - if encoding is None: - return False - try: - return codecs.lookup(encoding).name == "ascii" - except LookupError: - return False - - -class BrokenFilesystemWarning(RuntimeWarning, UnicodeWarning): - """The warning used by Werkzeug to signal a broken filesystem. Will only be - used once per runtime.""" - - -_warned_about_filesystem_encoding = False - - -def get_filesystem_encoding() -> str: - """Returns the filesystem encoding that should be used. Note that this is - different from the Python understanding of the filesystem encoding which - might be deeply flawed. Do not use this value against Python's string APIs - because it might be different. See :ref:`filesystem-encoding` for the exact - behavior. - - The concept of a filesystem encoding in generally is not something you - should rely on. As such if you ever need to use this function except for - writing wrapper code reconsider. - """ - global _warned_about_filesystem_encoding - rv = sys.getfilesystemencoding() - if has_likely_buggy_unicode_filesystem and not rv or _is_ascii_encoding(rv): - if not _warned_about_filesystem_encoding: - warnings.warn( - "Detected a misconfigured UNIX filesystem: Will use" - f" UTF-8 as filesystem encoding instead of {rv!r}", - BrokenFilesystemWarning, - ) - _warned_about_filesystem_encoding = True - return "utf-8" - return rv diff --git a/venv/lib/python3.8/site-packages/werkzeug/formparser.py b/venv/lib/python3.8/site-packages/werkzeug/formparser.py deleted file mode 100644 index 2dcb709..0000000 --- a/venv/lib/python3.8/site-packages/werkzeug/formparser.py +++ /dev/null @@ -1,495 +0,0 @@ -import typing as t -import warnings -from functools import update_wrapper -from io import BytesIO -from itertools import chain -from typing import Union - -from . import exceptions -from ._internal import _to_str -from .datastructures import FileStorage -from .datastructures import Headers -from .datastructures import MultiDict -from .http import parse_options_header -from .sansio.multipart import Data -from .sansio.multipart import Epilogue -from .sansio.multipart import Field -from .sansio.multipart import File -from .sansio.multipart import MultipartDecoder -from .sansio.multipart import NeedData -from .urls import url_decode_stream -from .wsgi import _make_chunk_iter -from .wsgi import get_content_length -from .wsgi import get_input_stream - -# there are some platforms where SpooledTemporaryFile is not available. -# In that case we need to provide a fallback. -try: - from tempfile import SpooledTemporaryFile -except ImportError: - from tempfile import TemporaryFile - - SpooledTemporaryFile = None # type: ignore - -if t.TYPE_CHECKING: - import typing as te - from _typeshed.wsgi import WSGIEnvironment - - t_parse_result = t.Tuple[t.BinaryIO, MultiDict, MultiDict] - - class TStreamFactory(te.Protocol): - def __call__( - self, - total_content_length: t.Optional[int], - content_type: t.Optional[str], - filename: t.Optional[str], - content_length: t.Optional[int] = None, - ) -> t.BinaryIO: - ... - - -F = t.TypeVar("F", bound=t.Callable[..., t.Any]) - - -def _exhaust(stream: t.BinaryIO) -> None: - bts = stream.read(64 * 1024) - while bts: - bts = stream.read(64 * 1024) - - -def default_stream_factory( - total_content_length: t.Optional[int], - content_type: t.Optional[str], - filename: t.Optional[str], - content_length: t.Optional[int] = None, -) -> t.BinaryIO: - max_size = 1024 * 500 - - if SpooledTemporaryFile is not None: - return t.cast(t.BinaryIO, SpooledTemporaryFile(max_size=max_size, mode="rb+")) - elif total_content_length is None or total_content_length > max_size: - return t.cast(t.BinaryIO, TemporaryFile("rb+")) - - return BytesIO() - - -def parse_form_data( - environ: "WSGIEnvironment", - stream_factory: t.Optional["TStreamFactory"] = None, - charset: str = "utf-8", - errors: str = "replace", - max_form_memory_size: t.Optional[int] = None, - max_content_length: t.Optional[int] = None, - cls: t.Optional[t.Type[MultiDict]] = None, - silent: bool = True, -) -> "t_parse_result": - """Parse the form data in the environ and return it as tuple in the form - ``(stream, form, files)``. You should only call this method if the - transport method is `POST`, `PUT`, or `PATCH`. - - If the mimetype of the data transmitted is `multipart/form-data` the - files multidict will be filled with `FileStorage` objects. If the - mimetype is unknown the input stream is wrapped and returned as first - argument, else the stream is empty. - - This is a shortcut for the common usage of :class:`FormDataParser`. - - Have a look at :doc:`/request_data` for more details. - - .. versionadded:: 0.5 - The `max_form_memory_size`, `max_content_length` and - `cls` parameters were added. - - .. versionadded:: 0.5.1 - The optional `silent` flag was added. - - :param environ: the WSGI environment to be used for parsing. - :param stream_factory: An optional callable that returns a new read and - writeable file descriptor. This callable works - the same as :meth:`Response._get_file_stream`. - :param charset: The character set for URL and url encoded form data. - :param errors: The encoding error behavior. - :param max_form_memory_size: the maximum number of bytes to be accepted for - in-memory stored form data. If the data - exceeds the value specified an - :exc:`~exceptions.RequestEntityTooLarge` - exception is raised. - :param max_content_length: If this is provided and the transmitted data - is longer than this value an - :exc:`~exceptions.RequestEntityTooLarge` - exception is raised. - :param cls: an optional dict class to use. If this is not specified - or `None` the default :class:`MultiDict` is used. - :param silent: If set to False parsing errors will not be caught. - :return: A tuple in the form ``(stream, form, files)``. - """ - return FormDataParser( - stream_factory, - charset, - errors, - max_form_memory_size, - max_content_length, - cls, - silent, - ).parse_from_environ(environ) - - -def exhaust_stream(f: F) -> F: - """Helper decorator for methods that exhausts the stream on return.""" - - def wrapper(self, stream, *args, **kwargs): # type: ignore - try: - return f(self, stream, *args, **kwargs) - finally: - exhaust = getattr(stream, "exhaust", None) - - if exhaust is not None: - exhaust() - else: - while True: - chunk = stream.read(1024 * 64) - - if not chunk: - break - - return update_wrapper(t.cast(F, wrapper), f) - - -class FormDataParser: - """This class implements parsing of form data for Werkzeug. By itself - it can parse multipart and url encoded form data. It can be subclassed - and extended but for most mimetypes it is a better idea to use the - untouched stream and expose it as separate attributes on a request - object. - - .. versionadded:: 0.8 - - :param stream_factory: An optional callable that returns a new read and - writeable file descriptor. This callable works - the same as :meth:`Response._get_file_stream`. - :param charset: The character set for URL and url encoded form data. - :param errors: The encoding error behavior. - :param max_form_memory_size: the maximum number of bytes to be accepted for - in-memory stored form data. If the data - exceeds the value specified an - :exc:`~exceptions.RequestEntityTooLarge` - exception is raised. - :param max_content_length: If this is provided and the transmitted data - is longer than this value an - :exc:`~exceptions.RequestEntityTooLarge` - exception is raised. - :param cls: an optional dict class to use. If this is not specified - or `None` the default :class:`MultiDict` is used. - :param silent: If set to False parsing errors will not be caught. - """ - - def __init__( - self, - stream_factory: t.Optional["TStreamFactory"] = None, - charset: str = "utf-8", - errors: str = "replace", - max_form_memory_size: t.Optional[int] = None, - max_content_length: t.Optional[int] = None, - cls: t.Optional[t.Type[MultiDict]] = None, - silent: bool = True, - ) -> None: - if stream_factory is None: - stream_factory = default_stream_factory - - self.stream_factory = stream_factory - self.charset = charset - self.errors = errors - self.max_form_memory_size = max_form_memory_size - self.max_content_length = max_content_length - - if cls is None: - cls = MultiDict - - self.cls = cls - self.silent = silent - - def get_parse_func( - self, mimetype: str, options: t.Dict[str, str] - ) -> t.Optional[ - t.Callable[ - ["FormDataParser", t.BinaryIO, str, t.Optional[int], t.Dict[str, str]], - "t_parse_result", - ] - ]: - return self.parse_functions.get(mimetype) - - def parse_from_environ(self, environ: "WSGIEnvironment") -> "t_parse_result": - """Parses the information from the environment as form data. - - :param environ: the WSGI environment to be used for parsing. - :return: A tuple in the form ``(stream, form, files)``. - """ - content_type = environ.get("CONTENT_TYPE", "") - content_length = get_content_length(environ) - mimetype, options = parse_options_header(content_type) - return self.parse(get_input_stream(environ), mimetype, content_length, options) - - def parse( - self, - stream: t.BinaryIO, - mimetype: str, - content_length: t.Optional[int], - options: t.Optional[t.Dict[str, str]] = None, - ) -> "t_parse_result": - """Parses the information from the given stream, mimetype, - content length and mimetype parameters. - - :param stream: an input stream - :param mimetype: the mimetype of the data - :param content_length: the content length of the incoming data - :param options: optional mimetype parameters (used for - the multipart boundary for instance) - :return: A tuple in the form ``(stream, form, files)``. - """ - if ( - self.max_content_length is not None - and content_length is not None - and content_length > self.max_content_length - ): - # if the input stream is not exhausted, firefox reports Connection Reset - _exhaust(stream) - raise exceptions.RequestEntityTooLarge() - - if options is None: - options = {} - - parse_func = self.get_parse_func(mimetype, options) - - if parse_func is not None: - try: - return parse_func(self, stream, mimetype, content_length, options) - except ValueError: - if not self.silent: - raise - - return stream, self.cls(), self.cls() - - @exhaust_stream - def _parse_multipart( - self, - stream: t.BinaryIO, - mimetype: str, - content_length: t.Optional[int], - options: t.Dict[str, str], - ) -> "t_parse_result": - parser = MultiPartParser( - self.stream_factory, - self.charset, - self.errors, - max_form_memory_size=self.max_form_memory_size, - cls=self.cls, - ) - boundary = options.get("boundary", "").encode("ascii") - - if not boundary: - raise ValueError("Missing boundary") - - form, files = parser.parse(stream, boundary, content_length) - return stream, form, files - - @exhaust_stream - def _parse_urlencoded( - self, - stream: t.BinaryIO, - mimetype: str, - content_length: t.Optional[int], - options: t.Dict[str, str], - ) -> "t_parse_result": - if ( - self.max_form_memory_size is not None - and content_length is not None - and content_length > self.max_form_memory_size - ): - # if the input stream is not exhausted, firefox reports Connection Reset - _exhaust(stream) - raise exceptions.RequestEntityTooLarge() - - form = url_decode_stream(stream, self.charset, errors=self.errors, cls=self.cls) - return stream, form, self.cls() - - #: mapping of mimetypes to parsing functions - parse_functions: t.Dict[ - str, - t.Callable[ - ["FormDataParser", t.BinaryIO, str, t.Optional[int], t.Dict[str, str]], - "t_parse_result", - ], - ] = { - "multipart/form-data": _parse_multipart, - "application/x-www-form-urlencoded": _parse_urlencoded, - "application/x-url-encoded": _parse_urlencoded, - } - - -def _line_parse(line: str) -> t.Tuple[str, bool]: - """Removes line ending characters and returns a tuple (`stripped_line`, - `is_terminated`). - """ - if line[-2:] == "\r\n": - return line[:-2], True - - elif line[-1:] in {"\r", "\n"}: - return line[:-1], True - - return line, False - - -def parse_multipart_headers(iterable: t.Iterable[bytes]) -> Headers: - """Parses multipart headers from an iterable that yields lines (including - the trailing newline symbol). The iterable has to be newline terminated. - The iterable will stop at the line where the headers ended so it can be - further consumed. - :param iterable: iterable of strings that are newline terminated - """ - warnings.warn( - "'parse_multipart_headers' is deprecated and will be removed in" - " Werkzeug 2.1.", - DeprecationWarning, - stacklevel=2, - ) - result: t.List[t.Tuple[str, str]] = [] - - for b_line in iterable: - line = _to_str(b_line) - line, line_terminated = _line_parse(line) - - if not line_terminated: - raise ValueError("unexpected end of line in multipart header") - - if not line: - break - elif line[0] in " \t" and result: - key, value = result[-1] - result[-1] = (key, f"{value}\n {line[1:]}") - else: - parts = line.split(":", 1) - - if len(parts) == 2: - result.append((parts[0].strip(), parts[1].strip())) - - # we link the list to the headers, no need to create a copy, the - # list was not shared anyways. - return Headers(result) - - -class MultiPartParser: - def __init__( - self, - stream_factory: t.Optional["TStreamFactory"] = None, - charset: str = "utf-8", - errors: str = "replace", - max_form_memory_size: t.Optional[int] = None, - cls: t.Optional[t.Type[MultiDict]] = None, - buffer_size: int = 64 * 1024, - ) -> None: - self.charset = charset - self.errors = errors - self.max_form_memory_size = max_form_memory_size - - if stream_factory is None: - stream_factory = default_stream_factory - - self.stream_factory = stream_factory - - if cls is None: - cls = MultiDict - - self.cls = cls - - self.buffer_size = buffer_size - - def fail(self, message: str) -> "te.NoReturn": - raise ValueError(message) - - def get_part_charset(self, headers: Headers) -> str: - # Figure out input charset for current part - content_type = headers.get("content-type") - - if content_type: - mimetype, ct_params = parse_options_header(content_type) - return ct_params.get("charset", self.charset) - - return self.charset - - def start_file_streaming( - self, event: File, total_content_length: t.Optional[int] - ) -> t.BinaryIO: - content_type = event.headers.get("content-type") - - try: - content_length = int(event.headers["content-length"]) - except (KeyError, ValueError): - content_length = 0 - - container = self.stream_factory( - total_content_length=total_content_length, - filename=event.filename, - content_type=content_type, - content_length=content_length, - ) - return container - - def parse( - self, stream: t.BinaryIO, boundary: bytes, content_length: t.Optional[int] - ) -> t.Tuple[MultiDict, MultiDict]: - container: t.Union[t.BinaryIO, t.List[bytes]] - _write: t.Callable[[bytes], t.Any] - - iterator = chain( - _make_chunk_iter( - stream, - limit=content_length, - buffer_size=self.buffer_size, - ), - [None], - ) - - parser = MultipartDecoder(boundary, self.max_form_memory_size) - - fields = [] - files = [] - - current_part: Union[Field, File] - for data in iterator: - parser.receive_data(data) - event = parser.next_event() - while not isinstance(event, (Epilogue, NeedData)): - if isinstance(event, Field): - current_part = event - container = [] - _write = container.append - elif isinstance(event, File): - current_part = event - container = self.start_file_streaming(event, content_length) - _write = container.write - elif isinstance(event, Data): - _write(event.data) - if not event.more_data: - if isinstance(current_part, Field): - value = b"".join(container).decode( - self.get_part_charset(current_part.headers), self.errors - ) - fields.append((current_part.name, value)) - else: - container = t.cast(t.BinaryIO, container) - container.seek(0) - files.append( - ( - current_part.name, - FileStorage( - container, - current_part.filename, - current_part.name, - headers=current_part.headers, - ), - ) - ) - - event = parser.next_event() - - return self.cls(fields), self.cls(files) diff --git a/venv/lib/python3.8/site-packages/werkzeug/http.py b/venv/lib/python3.8/site-packages/werkzeug/http.py deleted file mode 100644 index ca48fe2..0000000 --- a/venv/lib/python3.8/site-packages/werkzeug/http.py +++ /dev/null @@ -1,1388 +0,0 @@ -import base64 -import email.utils -import re -import typing -import typing as t -import warnings -from datetime import date -from datetime import datetime -from datetime import time -from datetime import timedelta -from datetime import timezone -from enum import Enum -from hashlib import sha1 -from time import mktime -from time import struct_time -from urllib.parse import unquote_to_bytes as _unquote -from urllib.request import parse_http_list as _parse_list_header - -from ._internal import _cookie_parse_impl -from ._internal import _cookie_quote -from ._internal import _make_cookie_domain -from ._internal import _to_bytes -from ._internal import _to_str -from ._internal import _wsgi_decoding_dance -from werkzeug._internal import _dt_as_utc - -if t.TYPE_CHECKING: - import typing_extensions as te - from _typeshed.wsgi import WSGIEnvironment - -# for explanation of "media-range", etc. see Sections 5.3.{1,2} of RFC 7231 -_accept_re = re.compile( - r""" - ( # media-range capturing-parenthesis - [^\s;,]+ # type/subtype - (?:[ \t]*;[ \t]* # ";" - (?: # parameter non-capturing-parenthesis - [^\s;,q][^\s;,]* # token that doesn't start with "q" - | # or - q[^\s;,=][^\s;,]* # token that is more than just "q" - ) - )* # zero or more parameters - ) # end of media-range - (?:[ \t]*;[ \t]*q= # weight is a "q" parameter - (\d*(?:\.\d+)?) # qvalue capturing-parentheses - [^,]* # "extension" accept params: who cares? - )? # accept params are optional - """, - re.VERBOSE, -) -_token_chars = frozenset( - "!#$%&'*+-.0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ^_`abcdefghijklmnopqrstuvwxyz|~" -) -_etag_re = re.compile(r'([Ww]/)?(?:"(.*?)"|(.*?))(?:\s*,\s*|$)') -_option_header_piece_re = re.compile( - r""" - ;\s*,?\s* # newlines were replaced with commas - (?P - "[^"\\]*(?:\\.[^"\\]*)*" # quoted string - | - [^\s;,=*]+ # token - ) - (?:\*(?P\d+))? # *1, optional continuation index - \s* - (?: # optionally followed by =value - (?: # equals sign, possibly with encoding - \*\s*=\s* # * indicates extended notation - (?: # optional encoding - (?P[^\s]+?) - '(?P[^\s]*?)' - )? - | - =\s* # basic notation - ) - (?P - "[^"\\]*(?:\\.[^"\\]*)*" # quoted string - | - [^;,]+ # token - )? - )? - \s* - """, - flags=re.VERBOSE, -) -_option_header_start_mime_type = re.compile(r",\s*([^;,\s]+)([;,]\s*.+)?") -_entity_headers = frozenset( - [ - "allow", - "content-encoding", - "content-language", - "content-length", - "content-location", - "content-md5", - "content-range", - "content-type", - "expires", - "last-modified", - ] -) -_hop_by_hop_headers = frozenset( - [ - "connection", - "keep-alive", - "proxy-authenticate", - "proxy-authorization", - "te", - "trailer", - "transfer-encoding", - "upgrade", - ] -) -HTTP_STATUS_CODES = { - 100: "Continue", - 101: "Switching Protocols", - 102: "Processing", - 103: "Early Hints", # see RFC 8297 - 200: "OK", - 201: "Created", - 202: "Accepted", - 203: "Non Authoritative Information", - 204: "No Content", - 205: "Reset Content", - 206: "Partial Content", - 207: "Multi Status", - 208: "Already Reported", # see RFC 5842 - 226: "IM Used", # see RFC 3229 - 300: "Multiple Choices", - 301: "Moved Permanently", - 302: "Found", - 303: "See Other", - 304: "Not Modified", - 305: "Use Proxy", - 306: "Switch Proxy", # unused - 307: "Temporary Redirect", - 308: "Permanent Redirect", - 400: "Bad Request", - 401: "Unauthorized", - 402: "Payment Required", # unused - 403: "Forbidden", - 404: "Not Found", - 405: "Method Not Allowed", - 406: "Not Acceptable", - 407: "Proxy Authentication Required", - 408: "Request Timeout", - 409: "Conflict", - 410: "Gone", - 411: "Length Required", - 412: "Precondition Failed", - 413: "Request Entity Too Large", - 414: "Request URI Too Long", - 415: "Unsupported Media Type", - 416: "Requested Range Not Satisfiable", - 417: "Expectation Failed", - 418: "I'm a teapot", # see RFC 2324 - 421: "Misdirected Request", # see RFC 7540 - 422: "Unprocessable Entity", - 423: "Locked", - 424: "Failed Dependency", - 425: "Too Early", # see RFC 8470 - 426: "Upgrade Required", - 428: "Precondition Required", # see RFC 6585 - 429: "Too Many Requests", - 431: "Request Header Fields Too Large", - 449: "Retry With", # proprietary MS extension - 451: "Unavailable For Legal Reasons", - 500: "Internal Server Error", - 501: "Not Implemented", - 502: "Bad Gateway", - 503: "Service Unavailable", - 504: "Gateway Timeout", - 505: "HTTP Version Not Supported", - 506: "Variant Also Negotiates", # see RFC 2295 - 507: "Insufficient Storage", - 508: "Loop Detected", # see RFC 5842 - 510: "Not Extended", - 511: "Network Authentication Failed", -} - - -class COEP(Enum): - """Cross Origin Embedder Policies""" - - UNSAFE_NONE = "unsafe-none" - REQUIRE_CORP = "require-corp" - - -class COOP(Enum): - """Cross Origin Opener Policies""" - - UNSAFE_NONE = "unsafe-none" - SAME_ORIGIN_ALLOW_POPUPS = "same-origin-allow-popups" - SAME_ORIGIN = "same-origin" - - -def quote_header_value( - value: t.Union[str, int], extra_chars: str = "", allow_token: bool = True -) -> str: - """Quote a header value if necessary. - - .. versionadded:: 0.5 - - :param value: the value to quote. - :param extra_chars: a list of extra characters to skip quoting. - :param allow_token: if this is enabled token values are returned - unchanged. - """ - if isinstance(value, bytes): - value = value.decode("latin1") - value = str(value) - if allow_token: - token_chars = _token_chars | set(extra_chars) - if set(value).issubset(token_chars): - return value - value = value.replace("\\", "\\\\").replace('"', '\\"') - return f'"{value}"' - - -def unquote_header_value(value: str, is_filename: bool = False) -> str: - r"""Unquotes a header value. (Reversal of :func:`quote_header_value`). - This does not use the real unquoting but what browsers are actually - using for quoting. - - .. versionadded:: 0.5 - - :param value: the header value to unquote. - :param is_filename: The value represents a filename or path. - """ - if value and value[0] == value[-1] == '"': - # this is not the real unquoting, but fixing this so that the - # RFC is met will result in bugs with internet explorer and - # probably some other browsers as well. IE for example is - # uploading files with "C:\foo\bar.txt" as filename - value = value[1:-1] - - # if this is a filename and the starting characters look like - # a UNC path, then just return the value without quotes. Using the - # replace sequence below on a UNC path has the effect of turning - # the leading double slash into a single slash and then - # _fix_ie_filename() doesn't work correctly. See #458. - if not is_filename or value[:2] != "\\\\": - return value.replace("\\\\", "\\").replace('\\"', '"') - return value - - -def dump_options_header( - header: t.Optional[str], options: t.Mapping[str, t.Optional[t.Union[str, int]]] -) -> str: - """The reverse function to :func:`parse_options_header`. - - :param header: the header to dump - :param options: a dict of options to append. - """ - segments = [] - if header is not None: - segments.append(header) - for key, value in options.items(): - if value is None: - segments.append(key) - else: - segments.append(f"{key}={quote_header_value(value)}") - return "; ".join(segments) - - -def dump_header( - iterable: t.Union[t.Dict[str, t.Union[str, int]], t.Iterable[str]], - allow_token: bool = True, -) -> str: - """Dump an HTTP header again. This is the reversal of - :func:`parse_list_header`, :func:`parse_set_header` and - :func:`parse_dict_header`. This also quotes strings that include an - equals sign unless you pass it as dict of key, value pairs. - - >>> dump_header({'foo': 'bar baz'}) - 'foo="bar baz"' - >>> dump_header(('foo', 'bar baz')) - 'foo, "bar baz"' - - :param iterable: the iterable or dict of values to quote. - :param allow_token: if set to `False` tokens as values are disallowed. - See :func:`quote_header_value` for more details. - """ - if isinstance(iterable, dict): - items = [] - for key, value in iterable.items(): - if value is None: - items.append(key) - else: - items.append( - f"{key}={quote_header_value(value, allow_token=allow_token)}" - ) - else: - items = [quote_header_value(x, allow_token=allow_token) for x in iterable] - return ", ".join(items) - - -def dump_csp_header(header: "ds.ContentSecurityPolicy") -> str: - """Dump a Content Security Policy header. - - These are structured into policies such as "default-src 'self'; - script-src 'self'". - - .. versionadded:: 1.0.0 - Support for Content Security Policy headers was added. - - """ - return "; ".join(f"{key} {value}" for key, value in header.items()) - - -def parse_list_header(value: str) -> t.List[str]: - """Parse lists as described by RFC 2068 Section 2. - - In particular, parse comma-separated lists where the elements of - the list may include quoted-strings. A quoted-string could - contain a comma. A non-quoted string could have quotes in the - middle. Quotes are removed automatically after parsing. - - It basically works like :func:`parse_set_header` just that items - may appear multiple times and case sensitivity is preserved. - - The return value is a standard :class:`list`: - - >>> parse_list_header('token, "quoted value"') - ['token', 'quoted value'] - - To create a header from the :class:`list` again, use the - :func:`dump_header` function. - - :param value: a string with a list header. - :return: :class:`list` - """ - result = [] - for item in _parse_list_header(value): - if item[:1] == item[-1:] == '"': - item = unquote_header_value(item[1:-1]) - result.append(item) - return result - - -def parse_dict_header(value: str, cls: t.Type[dict] = dict) -> t.Dict[str, str]: - """Parse lists of key, value pairs as described by RFC 2068 Section 2 and - convert them into a python dict (or any other mapping object created from - the type with a dict like interface provided by the `cls` argument): - - >>> d = parse_dict_header('foo="is a fish", bar="as well"') - >>> type(d) is dict - True - >>> sorted(d.items()) - [('bar', 'as well'), ('foo', 'is a fish')] - - If there is no value for a key it will be `None`: - - >>> parse_dict_header('key_without_value') - {'key_without_value': None} - - To create a header from the :class:`dict` again, use the - :func:`dump_header` function. - - .. versionchanged:: 0.9 - Added support for `cls` argument. - - :param value: a string with a dict header. - :param cls: callable to use for storage of parsed results. - :return: an instance of `cls` - """ - result = cls() - if isinstance(value, bytes): - value = value.decode("latin1") - for item in _parse_list_header(value): - if "=" not in item: - result[item] = None - continue - name, value = item.split("=", 1) - if value[:1] == value[-1:] == '"': - value = unquote_header_value(value[1:-1]) - result[name] = value - return result - - -@typing.overload -def parse_options_header( - value: t.Optional[str], multiple: "te.Literal[False]" = False -) -> t.Tuple[str, t.Dict[str, str]]: - ... - - -@typing.overload -def parse_options_header( - value: t.Optional[str], multiple: "te.Literal[True]" -) -> t.Tuple[t.Any, ...]: - ... - - -def parse_options_header( - value: t.Optional[str], multiple: bool = False -) -> t.Union[t.Tuple[str, t.Dict[str, str]], t.Tuple[t.Any, ...]]: - """Parse a ``Content-Type`` like header into a tuple with the content - type and the options: - - >>> parse_options_header('text/html; charset=utf8') - ('text/html', {'charset': 'utf8'}) - - This should not be used to parse ``Cache-Control`` like headers that use - a slightly different format. For these headers use the - :func:`parse_dict_header` function. - - .. versionchanged:: 0.15 - :rfc:`2231` parameter continuations are handled. - - .. versionadded:: 0.5 - - :param value: the header to parse. - :param multiple: Whether try to parse and return multiple MIME types - :return: (mimetype, options) or (mimetype, options, mimetype, options, …) - if multiple=True - """ - if not value: - return "", {} - - result: t.List[t.Any] = [] - - value = "," + value.replace("\n", ",") - while value: - match = _option_header_start_mime_type.match(value) - if not match: - break - result.append(match.group(1)) # mimetype - options: t.Dict[str, str] = {} - # Parse options - rest = match.group(2) - encoding: t.Optional[str] - continued_encoding: t.Optional[str] = None - while rest: - optmatch = _option_header_piece_re.match(rest) - if not optmatch: - break - option, count, encoding, language, option_value = optmatch.groups() - # Continuations don't have to supply the encoding after the - # first line. If we're in a continuation, track the current - # encoding to use for subsequent lines. Reset it when the - # continuation ends. - if not count: - continued_encoding = None - else: - if not encoding: - encoding = continued_encoding - continued_encoding = encoding - option = unquote_header_value(option) - if option_value is not None: - option_value = unquote_header_value(option_value, option == "filename") - if encoding is not None: - option_value = _unquote(option_value).decode(encoding) - if count: - # Continuations append to the existing value. For - # simplicity, this ignores the possibility of - # out-of-order indices, which shouldn't happen anyway. - options[option] = options.get(option, "") + option_value - else: - options[option] = option_value - rest = rest[optmatch.end() :] - result.append(options) - if multiple is False: - return tuple(result) - value = rest - - return tuple(result) if result else ("", {}) - - -_TAnyAccept = t.TypeVar("_TAnyAccept", bound="ds.Accept") - - -@typing.overload -def parse_accept_header(value: t.Optional[str]) -> "ds.Accept": - ... - - -@typing.overload -def parse_accept_header( - value: t.Optional[str], cls: t.Type[_TAnyAccept] -) -> _TAnyAccept: - ... - - -def parse_accept_header( - value: t.Optional[str], cls: t.Optional[t.Type[_TAnyAccept]] = None -) -> _TAnyAccept: - """Parses an HTTP Accept-* header. This does not implement a complete - valid algorithm but one that supports at least value and quality - extraction. - - Returns a new :class:`Accept` object (basically a list of ``(value, quality)`` - tuples sorted by the quality with some additional accessor methods). - - The second parameter can be a subclass of :class:`Accept` that is created - with the parsed values and returned. - - :param value: the accept header string to be parsed. - :param cls: the wrapper class for the return value (can be - :class:`Accept` or a subclass thereof) - :return: an instance of `cls`. - """ - if cls is None: - cls = t.cast(t.Type[_TAnyAccept], ds.Accept) - - if not value: - return cls(None) - - result = [] - for match in _accept_re.finditer(value): - quality_match = match.group(2) - if not quality_match: - quality: float = 1 - else: - quality = max(min(float(quality_match), 1), 0) - result.append((match.group(1), quality)) - return cls(result) - - -_TAnyCC = t.TypeVar("_TAnyCC", bound="ds._CacheControl") -_t_cc_update = t.Optional[t.Callable[[_TAnyCC], None]] - - -@typing.overload -def parse_cache_control_header( - value: t.Optional[str], on_update: _t_cc_update, cls: None = None -) -> "ds.RequestCacheControl": - ... - - -@typing.overload -def parse_cache_control_header( - value: t.Optional[str], on_update: _t_cc_update, cls: t.Type[_TAnyCC] -) -> _TAnyCC: - ... - - -def parse_cache_control_header( - value: t.Optional[str], - on_update: _t_cc_update = None, - cls: t.Optional[t.Type[_TAnyCC]] = None, -) -> _TAnyCC: - """Parse a cache control header. The RFC differs between response and - request cache control, this method does not. It's your responsibility - to not use the wrong control statements. - - .. versionadded:: 0.5 - The `cls` was added. If not specified an immutable - :class:`~werkzeug.datastructures.RequestCacheControl` is returned. - - :param value: a cache control header to be parsed. - :param on_update: an optional callable that is called every time a value - on the :class:`~werkzeug.datastructures.CacheControl` - object is changed. - :param cls: the class for the returned object. By default - :class:`~werkzeug.datastructures.RequestCacheControl` is used. - :return: a `cls` object. - """ - if cls is None: - cls = t.cast(t.Type[_TAnyCC], ds.RequestCacheControl) - - if not value: - return cls((), on_update) - - return cls(parse_dict_header(value), on_update) - - -_TAnyCSP = t.TypeVar("_TAnyCSP", bound="ds.ContentSecurityPolicy") -_t_csp_update = t.Optional[t.Callable[[_TAnyCSP], None]] - - -@typing.overload -def parse_csp_header( - value: t.Optional[str], on_update: _t_csp_update, cls: None = None -) -> "ds.ContentSecurityPolicy": - ... - - -@typing.overload -def parse_csp_header( - value: t.Optional[str], on_update: _t_csp_update, cls: t.Type[_TAnyCSP] -) -> _TAnyCSP: - ... - - -def parse_csp_header( - value: t.Optional[str], - on_update: _t_csp_update = None, - cls: t.Optional[t.Type[_TAnyCSP]] = None, -) -> _TAnyCSP: - """Parse a Content Security Policy header. - - .. versionadded:: 1.0.0 - Support for Content Security Policy headers was added. - - :param value: a csp header to be parsed. - :param on_update: an optional callable that is called every time a value - on the object is changed. - :param cls: the class for the returned object. By default - :class:`~werkzeug.datastructures.ContentSecurityPolicy` is used. - :return: a `cls` object. - """ - if cls is None: - cls = t.cast(t.Type[_TAnyCSP], ds.ContentSecurityPolicy) - - if value is None: - return cls((), on_update) - - items = [] - - for policy in value.split(";"): - policy = policy.strip() - - # Ignore badly formatted policies (no space) - if " " in policy: - directive, value = policy.strip().split(" ", 1) - items.append((directive.strip(), value.strip())) - - return cls(items, on_update) - - -def parse_set_header( - value: t.Optional[str], - on_update: t.Optional[t.Callable[["ds.HeaderSet"], None]] = None, -) -> "ds.HeaderSet": - """Parse a set-like header and return a - :class:`~werkzeug.datastructures.HeaderSet` object: - - >>> hs = parse_set_header('token, "quoted value"') - - The return value is an object that treats the items case-insensitively - and keeps the order of the items: - - >>> 'TOKEN' in hs - True - >>> hs.index('quoted value') - 1 - >>> hs - HeaderSet(['token', 'quoted value']) - - To create a header from the :class:`HeaderSet` again, use the - :func:`dump_header` function. - - :param value: a set header to be parsed. - :param on_update: an optional callable that is called every time a - value on the :class:`~werkzeug.datastructures.HeaderSet` - object is changed. - :return: a :class:`~werkzeug.datastructures.HeaderSet` - """ - if not value: - return ds.HeaderSet(None, on_update) - return ds.HeaderSet(parse_list_header(value), on_update) - - -def parse_authorization_header( - value: t.Optional[str], -) -> t.Optional["ds.Authorization"]: - """Parse an HTTP basic/digest authorization header transmitted by the web - browser. The return value is either `None` if the header was invalid or - not given, otherwise an :class:`~werkzeug.datastructures.Authorization` - object. - - :param value: the authorization header to parse. - :return: a :class:`~werkzeug.datastructures.Authorization` object or `None`. - """ - if not value: - return None - value = _wsgi_decoding_dance(value) - try: - auth_type, auth_info = value.split(None, 1) - auth_type = auth_type.lower() - except ValueError: - return None - if auth_type == "basic": - try: - username, password = base64.b64decode(auth_info).split(b":", 1) - except Exception: - return None - try: - return ds.Authorization( - "basic", - { - "username": _to_str(username, "utf-8"), - "password": _to_str(password, "utf-8"), - }, - ) - except UnicodeDecodeError: - return None - elif auth_type == "digest": - auth_map = parse_dict_header(auth_info) - for key in "username", "realm", "nonce", "uri", "response": - if key not in auth_map: - return None - if "qop" in auth_map: - if not auth_map.get("nc") or not auth_map.get("cnonce"): - return None - return ds.Authorization("digest", auth_map) - return None - - -def parse_www_authenticate_header( - value: t.Optional[str], - on_update: t.Optional[t.Callable[["ds.WWWAuthenticate"], None]] = None, -) -> "ds.WWWAuthenticate": - """Parse an HTTP WWW-Authenticate header into a - :class:`~werkzeug.datastructures.WWWAuthenticate` object. - - :param value: a WWW-Authenticate header to parse. - :param on_update: an optional callable that is called every time a value - on the :class:`~werkzeug.datastructures.WWWAuthenticate` - object is changed. - :return: a :class:`~werkzeug.datastructures.WWWAuthenticate` object. - """ - if not value: - return ds.WWWAuthenticate(on_update=on_update) - try: - auth_type, auth_info = value.split(None, 1) - auth_type = auth_type.lower() - except (ValueError, AttributeError): - return ds.WWWAuthenticate(value.strip().lower(), on_update=on_update) - return ds.WWWAuthenticate(auth_type, parse_dict_header(auth_info), on_update) - - -def parse_if_range_header(value: t.Optional[str]) -> "ds.IfRange": - """Parses an if-range header which can be an etag or a date. Returns - a :class:`~werkzeug.datastructures.IfRange` object. - - .. versionchanged:: 2.0 - If the value represents a datetime, it is timezone-aware. - - .. versionadded:: 0.7 - """ - if not value: - return ds.IfRange() - date = parse_date(value) - if date is not None: - return ds.IfRange(date=date) - # drop weakness information - return ds.IfRange(unquote_etag(value)[0]) - - -def parse_range_header( - value: t.Optional[str], make_inclusive: bool = True -) -> t.Optional["ds.Range"]: - """Parses a range header into a :class:`~werkzeug.datastructures.Range` - object. If the header is missing or malformed `None` is returned. - `ranges` is a list of ``(start, stop)`` tuples where the ranges are - non-inclusive. - - .. versionadded:: 0.7 - """ - if not value or "=" not in value: - return None - - ranges = [] - last_end = 0 - units, rng = value.split("=", 1) - units = units.strip().lower() - - for item in rng.split(","): - item = item.strip() - if "-" not in item: - return None - if item.startswith("-"): - if last_end < 0: - return None - try: - begin = int(item) - except ValueError: - return None - end = None - last_end = -1 - elif "-" in item: - begin_str, end_str = item.split("-", 1) - begin_str = begin_str.strip() - end_str = end_str.strip() - if not begin_str.isdigit(): - return None - begin = int(begin_str) - if begin < last_end or last_end < 0: - return None - if end_str: - if not end_str.isdigit(): - return None - end = int(end_str) + 1 - if begin >= end: - return None - else: - end = None - last_end = end if end is not None else -1 - ranges.append((begin, end)) - - return ds.Range(units, ranges) - - -def parse_content_range_header( - value: t.Optional[str], - on_update: t.Optional[t.Callable[["ds.ContentRange"], None]] = None, -) -> t.Optional["ds.ContentRange"]: - """Parses a range header into a - :class:`~werkzeug.datastructures.ContentRange` object or `None` if - parsing is not possible. - - .. versionadded:: 0.7 - - :param value: a content range header to be parsed. - :param on_update: an optional callable that is called every time a value - on the :class:`~werkzeug.datastructures.ContentRange` - object is changed. - """ - if value is None: - return None - try: - units, rangedef = (value or "").strip().split(None, 1) - except ValueError: - return None - - if "/" not in rangedef: - return None - rng, length_str = rangedef.split("/", 1) - if length_str == "*": - length = None - elif length_str.isdigit(): - length = int(length_str) - else: - return None - - if rng == "*": - return ds.ContentRange(units, None, None, length, on_update=on_update) - elif "-" not in rng: - return None - - start_str, stop_str = rng.split("-", 1) - try: - start = int(start_str) - stop = int(stop_str) + 1 - except ValueError: - return None - - if is_byte_range_valid(start, stop, length): - return ds.ContentRange(units, start, stop, length, on_update=on_update) - - return None - - -def quote_etag(etag: str, weak: bool = False) -> str: - """Quote an etag. - - :param etag: the etag to quote. - :param weak: set to `True` to tag it "weak". - """ - if '"' in etag: - raise ValueError("invalid etag") - etag = f'"{etag}"' - if weak: - etag = f"W/{etag}" - return etag - - -def unquote_etag( - etag: t.Optional[str], -) -> t.Union[t.Tuple[str, bool], t.Tuple[None, None]]: - """Unquote a single etag: - - >>> unquote_etag('W/"bar"') - ('bar', True) - >>> unquote_etag('"bar"') - ('bar', False) - - :param etag: the etag identifier to unquote. - :return: a ``(etag, weak)`` tuple. - """ - if not etag: - return None, None - etag = etag.strip() - weak = False - if etag.startswith(("W/", "w/")): - weak = True - etag = etag[2:] - if etag[:1] == etag[-1:] == '"': - etag = etag[1:-1] - return etag, weak - - -def parse_etags(value: t.Optional[str]) -> "ds.ETags": - """Parse an etag header. - - :param value: the tag header to parse - :return: an :class:`~werkzeug.datastructures.ETags` object. - """ - if not value: - return ds.ETags() - strong = [] - weak = [] - end = len(value) - pos = 0 - while pos < end: - match = _etag_re.match(value, pos) - if match is None: - break - is_weak, quoted, raw = match.groups() - if raw == "*": - return ds.ETags(star_tag=True) - elif quoted: - raw = quoted - if is_weak: - weak.append(raw) - else: - strong.append(raw) - pos = match.end() - return ds.ETags(strong, weak) - - -def generate_etag(data: bytes) -> str: - """Generate an etag for some data. - - .. versionchanged:: 2.0 - Use SHA-1. MD5 may not be available in some environments. - """ - return sha1(data).hexdigest() - - -def parse_date(value: t.Optional[str]) -> t.Optional[datetime]: - """Parse an :rfc:`2822` date into a timezone-aware - :class:`datetime.datetime` object, or ``None`` if parsing fails. - - This is a wrapper for :func:`email.utils.parsedate_to_datetime`. It - returns ``None`` if parsing fails instead of raising an exception, - and always returns a timezone-aware datetime object. If the string - doesn't have timezone information, it is assumed to be UTC. - - :param value: A string with a supported date format. - - .. versionchanged:: 2.0 - Return a timezone-aware datetime object. Use - ``email.utils.parsedate_to_datetime``. - """ - if value is None: - return None - - try: - dt = email.utils.parsedate_to_datetime(value) - except (TypeError, ValueError): - return None - - if dt.tzinfo is None: - return dt.replace(tzinfo=timezone.utc) - - return dt - - -def cookie_date( - expires: t.Optional[t.Union[datetime, date, int, float, struct_time]] = None -) -> str: - """Format a datetime object or timestamp into an :rfc:`2822` date - string for ``Set-Cookie expires``. - - .. deprecated:: 2.0 - Will be removed in Werkzeug 2.1. Use :func:`http_date` instead. - """ - warnings.warn( - "'cookie_date' is deprecated and will be removed in Werkzeug" - " 2.1. Use 'http_date' instead.", - DeprecationWarning, - stacklevel=2, - ) - return http_date(expires) - - -def http_date( - timestamp: t.Optional[t.Union[datetime, date, int, float, struct_time]] = None -) -> str: - """Format a datetime object or timestamp into an :rfc:`2822` date - string. - - This is a wrapper for :func:`email.utils.format_datetime`. It - assumes naive datetime objects are in UTC instead of raising an - exception. - - :param timestamp: The datetime or timestamp to format. Defaults to - the current time. - - .. versionchanged:: 2.0 - Use ``email.utils.format_datetime``. Accept ``date`` objects. - """ - if isinstance(timestamp, date): - if not isinstance(timestamp, datetime): - # Assume plain date is midnight UTC. - timestamp = datetime.combine(timestamp, time(), tzinfo=timezone.utc) - else: - # Ensure datetime is timezone-aware. - timestamp = _dt_as_utc(timestamp) - - return email.utils.format_datetime(timestamp, usegmt=True) - - if isinstance(timestamp, struct_time): - timestamp = mktime(timestamp) - - return email.utils.formatdate(timestamp, usegmt=True) - - -def parse_age(value: t.Optional[str] = None) -> t.Optional[timedelta]: - """Parses a base-10 integer count of seconds into a timedelta. - - If parsing fails, the return value is `None`. - - :param value: a string consisting of an integer represented in base-10 - :return: a :class:`datetime.timedelta` object or `None`. - """ - if not value: - return None - try: - seconds = int(value) - except ValueError: - return None - if seconds < 0: - return None - try: - return timedelta(seconds=seconds) - except OverflowError: - return None - - -def dump_age(age: t.Optional[t.Union[timedelta, int]] = None) -> t.Optional[str]: - """Formats the duration as a base-10 integer. - - :param age: should be an integer number of seconds, - a :class:`datetime.timedelta` object, or, - if the age is unknown, `None` (default). - """ - if age is None: - return None - if isinstance(age, timedelta): - age = int(age.total_seconds()) - else: - age = int(age) - - if age < 0: - raise ValueError("age cannot be negative") - - return str(age) - - -def is_resource_modified( - environ: "WSGIEnvironment", - etag: t.Optional[str] = None, - data: t.Optional[bytes] = None, - last_modified: t.Optional[t.Union[datetime, str]] = None, - ignore_if_range: bool = True, -) -> bool: - """Convenience method for conditional requests. - - :param environ: the WSGI environment of the request to be checked. - :param etag: the etag for the response for comparison. - :param data: or alternatively the data of the response to automatically - generate an etag using :func:`generate_etag`. - :param last_modified: an optional date of the last modification. - :param ignore_if_range: If `False`, `If-Range` header will be taken into - account. - :return: `True` if the resource was modified, otherwise `False`. - - .. versionchanged:: 2.0 - SHA-1 is used to generate an etag value for the data. MD5 may - not be available in some environments. - - .. versionchanged:: 1.0.0 - The check is run for methods other than ``GET`` and ``HEAD``. - """ - if etag is None and data is not None: - etag = generate_etag(data) - elif data is not None: - raise TypeError("both data and etag given") - - unmodified = False - if isinstance(last_modified, str): - last_modified = parse_date(last_modified) - - # HTTP doesn't use microsecond, remove it to avoid false positive - # comparisons. Mark naive datetimes as UTC. - if last_modified is not None: - last_modified = _dt_as_utc(last_modified.replace(microsecond=0)) - - if_range = None - if not ignore_if_range and "HTTP_RANGE" in environ: - # https://tools.ietf.org/html/rfc7233#section-3.2 - # A server MUST ignore an If-Range header field received in a request - # that does not contain a Range header field. - if_range = parse_if_range_header(environ.get("HTTP_IF_RANGE")) - - if if_range is not None and if_range.date is not None: - modified_since: t.Optional[datetime] = if_range.date - else: - modified_since = parse_date(environ.get("HTTP_IF_MODIFIED_SINCE")) - - if modified_since and last_modified and last_modified <= modified_since: - unmodified = True - - if etag: - etag, _ = unquote_etag(etag) - etag = t.cast(str, etag) - - if if_range is not None and if_range.etag is not None: - unmodified = parse_etags(if_range.etag).contains(etag) - else: - if_none_match = parse_etags(environ.get("HTTP_IF_NONE_MATCH")) - if if_none_match: - # https://tools.ietf.org/html/rfc7232#section-3.2 - # "A recipient MUST use the weak comparison function when comparing - # entity-tags for If-None-Match" - unmodified = if_none_match.contains_weak(etag) - - # https://tools.ietf.org/html/rfc7232#section-3.1 - # "Origin server MUST use the strong comparison function when - # comparing entity-tags for If-Match" - if_match = parse_etags(environ.get("HTTP_IF_MATCH")) - if if_match: - unmodified = not if_match.is_strong(etag) - - return not unmodified - - -def remove_entity_headers( - headers: t.Union["ds.Headers", t.List[t.Tuple[str, str]]], - allowed: t.Iterable[str] = ("expires", "content-location"), -) -> None: - """Remove all entity headers from a list or :class:`Headers` object. This - operation works in-place. `Expires` and `Content-Location` headers are - by default not removed. The reason for this is :rfc:`2616` section - 10.3.5 which specifies some entity headers that should be sent. - - .. versionchanged:: 0.5 - added `allowed` parameter. - - :param headers: a list or :class:`Headers` object. - :param allowed: a list of headers that should still be allowed even though - they are entity headers. - """ - allowed = {x.lower() for x in allowed} - headers[:] = [ - (key, value) - for key, value in headers - if not is_entity_header(key) or key.lower() in allowed - ] - - -def remove_hop_by_hop_headers( - headers: t.Union["ds.Headers", t.List[t.Tuple[str, str]]] -) -> None: - """Remove all HTTP/1.1 "Hop-by-Hop" headers from a list or - :class:`Headers` object. This operation works in-place. - - .. versionadded:: 0.5 - - :param headers: a list or :class:`Headers` object. - """ - headers[:] = [ - (key, value) for key, value in headers if not is_hop_by_hop_header(key) - ] - - -def is_entity_header(header: str) -> bool: - """Check if a header is an entity header. - - .. versionadded:: 0.5 - - :param header: the header to test. - :return: `True` if it's an entity header, `False` otherwise. - """ - return header.lower() in _entity_headers - - -def is_hop_by_hop_header(header: str) -> bool: - """Check if a header is an HTTP/1.1 "Hop-by-Hop" header. - - .. versionadded:: 0.5 - - :param header: the header to test. - :return: `True` if it's an HTTP/1.1 "Hop-by-Hop" header, `False` otherwise. - """ - return header.lower() in _hop_by_hop_headers - - -def parse_cookie( - header: t.Union["WSGIEnvironment", str, bytes, None], - charset: str = "utf-8", - errors: str = "replace", - cls: t.Optional[t.Type["ds.MultiDict"]] = None, -) -> "ds.MultiDict[str, str]": - """Parse a cookie from a string or WSGI environ. - - The same key can be provided multiple times, the values are stored - in-order. The default :class:`MultiDict` will have the first value - first, and all values can be retrieved with - :meth:`MultiDict.getlist`. - - :param header: The cookie header as a string, or a WSGI environ dict - with a ``HTTP_COOKIE`` key. - :param charset: The charset for the cookie values. - :param errors: The error behavior for the charset decoding. - :param cls: A dict-like class to store the parsed cookies in. - Defaults to :class:`MultiDict`. - - .. versionchanged:: 1.0.0 - Returns a :class:`MultiDict` instead of a - ``TypeConversionDict``. - - .. versionchanged:: 0.5 - Returns a :class:`TypeConversionDict` instead of a regular dict. - The ``cls`` parameter was added. - """ - if isinstance(header, dict): - header = header.get("HTTP_COOKIE", "") - elif header is None: - header = "" - - # PEP 3333 sends headers through the environ as latin1 decoded - # strings. Encode strings back to bytes for parsing. - if isinstance(header, str): - header = header.encode("latin1", "replace") - - if cls is None: - cls = ds.MultiDict - - def _parse_pairs() -> t.Iterator[t.Tuple[str, str]]: - for key, val in _cookie_parse_impl(header): # type: ignore - key_str = _to_str(key, charset, errors, allow_none_charset=True) - - if not key_str: - continue - - val_str = _to_str(val, charset, errors, allow_none_charset=True) - yield key_str, val_str - - return cls(_parse_pairs()) - - -def dump_cookie( - key: str, - value: t.Union[bytes, str] = "", - max_age: t.Optional[t.Union[timedelta, int]] = None, - expires: t.Optional[t.Union[str, datetime, int, float]] = None, - path: t.Optional[str] = "/", - domain: t.Optional[str] = None, - secure: bool = False, - httponly: bool = False, - charset: str = "utf-8", - sync_expires: bool = True, - max_size: int = 4093, - samesite: t.Optional[str] = None, -) -> str: - """Create a Set-Cookie header without the ``Set-Cookie`` prefix. - - The return value is usually restricted to ascii as the vast majority - of values are properly escaped, but that is no guarantee. It's - tunneled through latin1 as required by :pep:`3333`. - - The return value is not ASCII safe if the key contains unicode - characters. This is technically against the specification but - happens in the wild. It's strongly recommended to not use - non-ASCII values for the keys. - - :param max_age: should be a number of seconds, or `None` (default) if - the cookie should last only as long as the client's - browser session. Additionally `timedelta` objects - are accepted, too. - :param expires: should be a `datetime` object or unix timestamp. - :param path: limits the cookie to a given path, per default it will - span the whole domain. - :param domain: Use this if you want to set a cross-domain cookie. For - example, ``domain=".example.com"`` will set a cookie - that is readable by the domain ``www.example.com``, - ``foo.example.com`` etc. Otherwise, a cookie will only - be readable by the domain that set it. - :param secure: The cookie will only be available via HTTPS - :param httponly: disallow JavaScript to access the cookie. This is an - extension to the cookie standard and probably not - supported by all browsers. - :param charset: the encoding for string values. - :param sync_expires: automatically set expires if max_age is defined - but expires not. - :param max_size: Warn if the final header value exceeds this size. The - default, 4093, should be safely `supported by most browsers - `_. Set to 0 to disable this check. - :param samesite: Limits the scope of the cookie such that it will - only be attached to requests if those requests are same-site. - - .. _`cookie`: http://browsercookielimits.squawky.net/ - - .. versionchanged:: 1.0.0 - The string ``'None'`` is accepted for ``samesite``. - """ - key = _to_bytes(key, charset) - value = _to_bytes(value, charset) - - if path is not None: - from .urls import iri_to_uri - - path = iri_to_uri(path, charset) - - domain = _make_cookie_domain(domain) - - if isinstance(max_age, timedelta): - max_age = int(max_age.total_seconds()) - - if expires is not None: - if not isinstance(expires, str): - expires = http_date(expires) - elif max_age is not None and sync_expires: - expires = http_date(datetime.now(tz=timezone.utc).timestamp() + max_age) - - if samesite is not None: - samesite = samesite.title() - - if samesite not in {"Strict", "Lax", "None"}: - raise ValueError("SameSite must be 'Strict', 'Lax', or 'None'.") - - buf = [key + b"=" + _cookie_quote(value)] - - # XXX: In theory all of these parameters that are not marked with `None` - # should be quoted. Because stdlib did not quote it before I did not - # want to introduce quoting there now. - for k, v, q in ( - (b"Domain", domain, True), - (b"Expires", expires, False), - (b"Max-Age", max_age, False), - (b"Secure", secure, None), - (b"HttpOnly", httponly, None), - (b"Path", path, False), - (b"SameSite", samesite, False), - ): - if q is None: - if v: - buf.append(k) - continue - - if v is None: - continue - - tmp = bytearray(k) - if not isinstance(v, (bytes, bytearray)): - v = _to_bytes(str(v), charset) - if q: - v = _cookie_quote(v) - tmp += b"=" + v - buf.append(bytes(tmp)) - - # The return value will be an incorrectly encoded latin1 header for - # consistency with the headers object. - rv = b"; ".join(buf) - rv = rv.decode("latin1") - - # Warn if the final value of the cookie is larger than the limit. If the - # cookie is too large, then it may be silently ignored by the browser, - # which can be quite hard to debug. - cookie_size = len(rv) - - if max_size and cookie_size > max_size: - value_size = len(value) - warnings.warn( - f"The {key.decode(charset)!r} cookie is too large: the value was" - f" {value_size} bytes but the" - f" header required {cookie_size - value_size} extra bytes. The final size" - f" was {cookie_size} bytes but the limit is {max_size} bytes. Browsers may" - f" silently ignore cookies larger than this.", - stacklevel=2, - ) - - return rv - - -def is_byte_range_valid( - start: t.Optional[int], stop: t.Optional[int], length: t.Optional[int] -) -> bool: - """Checks if a given byte content range is valid for the given length. - - .. versionadded:: 0.7 - """ - if (start is None) != (stop is None): - return False - elif start is None: - return length is None or length >= 0 - elif length is None: - return 0 <= start < stop # type: ignore - elif start >= stop: # type: ignore - return False - return 0 <= start < length - - -# circular dependencies -from . import datastructures as ds diff --git a/venv/lib/python3.8/site-packages/werkzeug/local.py b/venv/lib/python3.8/site-packages/werkzeug/local.py deleted file mode 100644 index a5a7870..0000000 --- a/venv/lib/python3.8/site-packages/werkzeug/local.py +++ /dev/null @@ -1,666 +0,0 @@ -import copy -import math -import operator -import sys -import typing as t -import warnings -from functools import partial -from functools import update_wrapper - -from .wsgi import ClosingIterator - -if t.TYPE_CHECKING: - from _typeshed.wsgi import StartResponse - from _typeshed.wsgi import WSGIApplication - from _typeshed.wsgi import WSGIEnvironment - -F = t.TypeVar("F", bound=t.Callable[..., t.Any]) - -try: - from greenlet import getcurrent as _get_ident -except ImportError: - from threading import get_ident as _get_ident - - -def get_ident() -> int: - warnings.warn( - "'get_ident' is deprecated and will be removed in Werkzeug" - " 2.1. Use 'greenlet.getcurrent' or 'threading.get_ident' for" - " previous behavior.", - DeprecationWarning, - stacklevel=2, - ) - return _get_ident() # type: ignore - - -class _CannotUseContextVar(Exception): - pass - - -try: - from contextvars import ContextVar - - if "gevent" in sys.modules or "eventlet" in sys.modules: - # Both use greenlet, so first check it has patched - # ContextVars, Greenlet <0.4.17 does not. - import greenlet - - greenlet_patched = getattr(greenlet, "GREENLET_USE_CONTEXT_VARS", False) - - if not greenlet_patched: - # If Gevent is used, check it has patched ContextVars, - # <20.5 does not. - try: - from gevent.monkey import is_object_patched - except ImportError: - # Gevent isn't used, but Greenlet is and hasn't patched - raise _CannotUseContextVar() - else: - if is_object_patched("threading", "local") and not is_object_patched( - "contextvars", "ContextVar" - ): - raise _CannotUseContextVar() - - -except (ImportError, _CannotUseContextVar): - - class ContextVar: # type: ignore - """A fake ContextVar based on the previous greenlet/threading - ident function. Used on Python 3.6, eventlet, and old versions - of gevent. - """ - - def __init__(self, _name: str) -> None: - self.storage: t.Dict[int, t.Dict[str, t.Any]] = {} - - def get(self, default: t.Dict[str, t.Any]) -> t.Dict[str, t.Any]: - return self.storage.get(_get_ident(), default) - - def set(self, value: t.Dict[str, t.Any]) -> None: - self.storage[_get_ident()] = value - - -def release_local(local: t.Union["Local", "LocalStack"]) -> None: - """Releases the contents of the local for the current context. - This makes it possible to use locals without a manager. - - Example:: - - >>> loc = Local() - >>> loc.foo = 42 - >>> release_local(loc) - >>> hasattr(loc, 'foo') - False - - With this function one can release :class:`Local` objects as well - as :class:`LocalStack` objects. However it is not possible to - release data held by proxies that way, one always has to retain - a reference to the underlying local object in order to be able - to release it. - - .. versionadded:: 0.6.1 - """ - local.__release_local__() - - -class Local: - __slots__ = ("_storage",) - - def __init__(self) -> None: - object.__setattr__(self, "_storage", ContextVar("local_storage")) - - @property - def __storage__(self) -> t.Dict[str, t.Any]: - warnings.warn( - "'__storage__' is deprecated and will be removed in Werkzeug 2.1.", - DeprecationWarning, - stacklevel=2, - ) - return self._storage.get({}) # type: ignore - - @property - def __ident_func__(self) -> t.Callable[[], int]: - warnings.warn( - "'__ident_func__' is deprecated and will be removed in" - " Werkzeug 2.1. It should not be used in Python 3.7+.", - DeprecationWarning, - stacklevel=2, - ) - return _get_ident # type: ignore - - @__ident_func__.setter - def __ident_func__(self, func: t.Callable[[], int]) -> None: - warnings.warn( - "'__ident_func__' is deprecated and will be removed in" - " Werkzeug 2.1. Setting it no longer has any effect.", - DeprecationWarning, - stacklevel=2, - ) - - def __iter__(self) -> t.Iterator[t.Tuple[int, t.Any]]: - return iter(self._storage.get({}).items()) - - def __call__(self, proxy: str) -> "LocalProxy": - """Create a proxy for a name.""" - return LocalProxy(self, proxy) - - def __release_local__(self) -> None: - self._storage.set({}) - - def __getattr__(self, name: str) -> t.Any: - values = self._storage.get({}) - try: - return values[name] - except KeyError: - raise AttributeError(name) - - def __setattr__(self, name: str, value: t.Any) -> None: - values = self._storage.get({}).copy() - values[name] = value - self._storage.set(values) - - def __delattr__(self, name: str) -> None: - values = self._storage.get({}).copy() - try: - del values[name] - self._storage.set(values) - except KeyError: - raise AttributeError(name) - - -class LocalStack: - """This class works similar to a :class:`Local` but keeps a stack - of objects instead. This is best explained with an example:: - - >>> ls = LocalStack() - >>> ls.push(42) - >>> ls.top - 42 - >>> ls.push(23) - >>> ls.top - 23 - >>> ls.pop() - 23 - >>> ls.top - 42 - - They can be force released by using a :class:`LocalManager` or with - the :func:`release_local` function but the correct way is to pop the - item from the stack after using. When the stack is empty it will - no longer be bound to the current context (and as such released). - - By calling the stack without arguments it returns a proxy that resolves to - the topmost item on the stack. - - .. versionadded:: 0.6.1 - """ - - def __init__(self) -> None: - self._local = Local() - - def __release_local__(self) -> None: - self._local.__release_local__() - - @property - def __ident_func__(self) -> t.Callable[[], int]: - return self._local.__ident_func__ - - @__ident_func__.setter - def __ident_func__(self, value: t.Callable[[], int]) -> None: - object.__setattr__(self._local, "__ident_func__", value) - - def __call__(self) -> "LocalProxy": - def _lookup() -> t.Any: - rv = self.top - if rv is None: - raise RuntimeError("object unbound") - return rv - - return LocalProxy(_lookup) - - def push(self, obj: t.Any) -> t.List[t.Any]: - """Pushes a new item to the stack""" - rv = getattr(self._local, "stack", []).copy() - rv.append(obj) - self._local.stack = rv - return rv # type: ignore - - def pop(self) -> t.Any: - """Removes the topmost item from the stack, will return the - old value or `None` if the stack was already empty. - """ - stack = getattr(self._local, "stack", None) - if stack is None: - return None - elif len(stack) == 1: - release_local(self._local) - return stack[-1] - else: - return stack.pop() - - @property - def top(self) -> t.Any: - """The topmost item on the stack. If the stack is empty, - `None` is returned. - """ - try: - return self._local.stack[-1] - except (AttributeError, IndexError): - return None - - -class LocalManager: - """Local objects cannot manage themselves. For that you need a local - manager. You can pass a local manager multiple locals or add them - later y appending them to `manager.locals`. Every time the manager - cleans up, it will clean up all the data left in the locals for this - context. - - .. versionchanged:: 2.0 - ``ident_func`` is deprecated and will be removed in Werkzeug - 2.1. - - .. versionchanged:: 0.6.1 - The :func:`release_local` function can be used instead of a - manager. - - .. versionchanged:: 0.7 - The ``ident_func`` parameter was added. - """ - - def __init__( - self, - locals: t.Optional[t.Iterable[t.Union[Local, LocalStack]]] = None, - ident_func: None = None, - ) -> None: - if locals is None: - self.locals = [] - elif isinstance(locals, Local): - self.locals = [locals] - else: - self.locals = list(locals) - - if ident_func is not None: - warnings.warn( - "'ident_func' is deprecated and will be removed in" - " Werkzeug 2.1. Setting it no longer has any effect.", - DeprecationWarning, - stacklevel=2, - ) - - @property - def ident_func(self) -> t.Callable[[], int]: - warnings.warn( - "'ident_func' is deprecated and will be removed in Werkzeug 2.1.", - DeprecationWarning, - stacklevel=2, - ) - return _get_ident # type: ignore - - @ident_func.setter - def ident_func(self, func: t.Callable[[], int]) -> None: - warnings.warn( - "'ident_func' is deprecated and will be removedin Werkzeug" - " 2.1. Setting it no longer has any effect.", - DeprecationWarning, - stacklevel=2, - ) - - def get_ident(self) -> int: - """Return the context identifier the local objects use internally for - this context. You cannot override this method to change the behavior - but use it to link other context local objects (such as SQLAlchemy's - scoped sessions) to the Werkzeug locals. - - .. deprecated:: 2.0 - Will be removed in Werkzeug 2.1. - - .. versionchanged:: 0.7 - You can pass a different ident function to the local manager that - will then be propagated to all the locals passed to the - constructor. - """ - warnings.warn( - "'get_ident' is deprecated and will be removed in Werkzeug 2.1.", - DeprecationWarning, - stacklevel=2, - ) - return self.ident_func() - - def cleanup(self) -> None: - """Manually clean up the data in the locals for this context. Call - this at the end of the request or use `make_middleware()`. - """ - for local in self.locals: - release_local(local) - - def make_middleware(self, app: "WSGIApplication") -> "WSGIApplication": - """Wrap a WSGI application so that cleaning up happens after - request end. - """ - - def application( - environ: "WSGIEnvironment", start_response: "StartResponse" - ) -> t.Iterable[bytes]: - return ClosingIterator(app(environ, start_response), self.cleanup) - - return application - - def middleware(self, func: "WSGIApplication") -> "WSGIApplication": - """Like `make_middleware` but for decorating functions. - - Example usage:: - - @manager.middleware - def application(environ, start_response): - ... - - The difference to `make_middleware` is that the function passed - will have all the arguments copied from the inner application - (name, docstring, module). - """ - return update_wrapper(self.make_middleware(func), func) - - def __repr__(self) -> str: - return f"<{type(self).__name__} storages: {len(self.locals)}>" - - -class _ProxyLookup: - """Descriptor that handles proxied attribute lookup for - :class:`LocalProxy`. - - :param f: The built-in function this attribute is accessed through. - Instead of looking up the special method, the function call - is redone on the object. - :param fallback: Call this method if the proxy is unbound instead of - raising a :exc:`RuntimeError`. - :param class_value: Value to return when accessed from the class. - Used for ``__doc__`` so building docs still works. - """ - - __slots__ = ("bind_f", "fallback", "class_value", "name") - - def __init__( - self, - f: t.Optional[t.Callable] = None, - fallback: t.Optional[t.Callable] = None, - class_value: t.Optional[t.Any] = None, - ) -> None: - bind_f: t.Optional[t.Callable[["LocalProxy", t.Any], t.Callable]] - - if hasattr(f, "__get__"): - # A Python function, can be turned into a bound method. - - def bind_f(instance: "LocalProxy", obj: t.Any) -> t.Callable: - return f.__get__(obj, type(obj)) # type: ignore - - elif f is not None: - # A C function, use partial to bind the first argument. - - def bind_f(instance: "LocalProxy", obj: t.Any) -> t.Callable: - return partial(f, obj) # type: ignore - - else: - # Use getattr, which will produce a bound method. - bind_f = None - - self.bind_f = bind_f - self.fallback = fallback - self.class_value = class_value - - def __set_name__(self, owner: "LocalProxy", name: str) -> None: - self.name = name - - def __get__(self, instance: "LocalProxy", owner: t.Optional[type] = None) -> t.Any: - if instance is None: - if self.class_value is not None: - return self.class_value - - return self - - try: - obj = instance._get_current_object() - except RuntimeError: - if self.fallback is None: - raise - - return self.fallback.__get__(instance, owner) # type: ignore - - if self.bind_f is not None: - return self.bind_f(instance, obj) - - return getattr(obj, self.name) - - def __repr__(self) -> str: - return f"proxy {self.name}" - - def __call__(self, instance: "LocalProxy", *args: t.Any, **kwargs: t.Any) -> t.Any: - """Support calling unbound methods from the class. For example, - this happens with ``copy.copy``, which does - ``type(x).__copy__(x)``. ``type(x)`` can't be proxied, so it - returns the proxy type and descriptor. - """ - return self.__get__(instance, type(instance))(*args, **kwargs) - - -class _ProxyIOp(_ProxyLookup): - """Look up an augmented assignment method on a proxied object. The - method is wrapped to return the proxy instead of the object. - """ - - __slots__ = () - - def __init__( - self, f: t.Optional[t.Callable] = None, fallback: t.Optional[t.Callable] = None - ) -> None: - super().__init__(f, fallback) - - def bind_f(instance: "LocalProxy", obj: t.Any) -> t.Callable: - def i_op(self: t.Any, other: t.Any) -> "LocalProxy": - f(self, other) # type: ignore - return instance - - return i_op.__get__(obj, type(obj)) # type: ignore - - self.bind_f = bind_f - - -def _l_to_r_op(op: F) -> F: - """Swap the argument order to turn an l-op into an r-op.""" - - def r_op(obj: t.Any, other: t.Any) -> t.Any: - return op(other, obj) - - return t.cast(F, r_op) - - -class LocalProxy: - """A proxy to the object bound to a :class:`Local`. All operations - on the proxy are forwarded to the bound object. If no object is - bound, a :exc:`RuntimeError` is raised. - - .. code-block:: python - - from werkzeug.local import Local - l = Local() - - # a proxy to whatever l.user is set to - user = l("user") - - from werkzeug.local import LocalStack - _request_stack = LocalStack() - - # a proxy to _request_stack.top - request = _request_stack() - - # a proxy to the session attribute of the request proxy - session = LocalProxy(lambda: request.session) - - ``__repr__`` and ``__class__`` are forwarded, so ``repr(x)`` and - ``isinstance(x, cls)`` will look like the proxied object. Use - ``issubclass(type(x), LocalProxy)`` to check if an object is a - proxy. - - .. code-block:: python - - repr(user) # - isinstance(user, User) # True - issubclass(type(user), LocalProxy) # True - - :param local: The :class:`Local` or callable that provides the - proxied object. - :param name: The attribute name to look up on a :class:`Local`. Not - used if a callable is given. - - .. versionchanged:: 2.0 - Updated proxied attributes and methods to reflect the current - data model. - - .. versionchanged:: 0.6.1 - The class can be instantiated with a callable. - """ - - __slots__ = ("__local", "__name", "__wrapped__") - - def __init__( - self, - local: t.Union["Local", t.Callable[[], t.Any]], - name: t.Optional[str] = None, - ) -> None: - object.__setattr__(self, "_LocalProxy__local", local) - object.__setattr__(self, "_LocalProxy__name", name) - - if callable(local) and not hasattr(local, "__release_local__"): - # "local" is a callable that is not an instance of Local or - # LocalManager: mark it as a wrapped function. - object.__setattr__(self, "__wrapped__", local) - - def _get_current_object(self) -> t.Any: - """Return the current object. This is useful if you want the real - object behind the proxy at a time for performance reasons or because - you want to pass the object into a different context. - """ - if not hasattr(self.__local, "__release_local__"): # type: ignore - return self.__local() # type: ignore - - try: - return getattr(self.__local, self.__name) # type: ignore - except AttributeError: - raise RuntimeError(f"no object bound to {self.__name}") # type: ignore - - __doc__ = _ProxyLookup( # type: ignore - class_value=__doc__, fallback=lambda self: type(self).__doc__ - ) - # __del__ should only delete the proxy - __repr__ = _ProxyLookup( # type: ignore - repr, fallback=lambda self: f"<{type(self).__name__} unbound>" - ) - __str__ = _ProxyLookup(str) # type: ignore - __bytes__ = _ProxyLookup(bytes) - __format__ = _ProxyLookup() # type: ignore - __lt__ = _ProxyLookup(operator.lt) - __le__ = _ProxyLookup(operator.le) - __eq__ = _ProxyLookup(operator.eq) # type: ignore - __ne__ = _ProxyLookup(operator.ne) # type: ignore - __gt__ = _ProxyLookup(operator.gt) - __ge__ = _ProxyLookup(operator.ge) - __hash__ = _ProxyLookup(hash) # type: ignore - __bool__ = _ProxyLookup(bool, fallback=lambda self: False) - __getattr__ = _ProxyLookup(getattr) - # __getattribute__ triggered through __getattr__ - __setattr__ = _ProxyLookup(setattr) # type: ignore - __delattr__ = _ProxyLookup(delattr) # type: ignore - __dir__ = _ProxyLookup(dir, fallback=lambda self: []) # type: ignore - # __get__ (proxying descriptor not supported) - # __set__ (descriptor) - # __delete__ (descriptor) - # __set_name__ (descriptor) - # __objclass__ (descriptor) - # __slots__ used by proxy itself - # __dict__ (__getattr__) - # __weakref__ (__getattr__) - # __init_subclass__ (proxying metaclass not supported) - # __prepare__ (metaclass) - __class__ = _ProxyLookup(fallback=lambda self: type(self)) # type: ignore - __instancecheck__ = _ProxyLookup(lambda self, other: isinstance(other, self)) - __subclasscheck__ = _ProxyLookup(lambda self, other: issubclass(other, self)) - # __class_getitem__ triggered through __getitem__ - __call__ = _ProxyLookup(lambda self, *args, **kwargs: self(*args, **kwargs)) - __len__ = _ProxyLookup(len) - __length_hint__ = _ProxyLookup(operator.length_hint) - __getitem__ = _ProxyLookup(operator.getitem) - __setitem__ = _ProxyLookup(operator.setitem) - __delitem__ = _ProxyLookup(operator.delitem) - # __missing__ triggered through __getitem__ - __iter__ = _ProxyLookup(iter) - __next__ = _ProxyLookup(next) - __reversed__ = _ProxyLookup(reversed) - __contains__ = _ProxyLookup(operator.contains) - __add__ = _ProxyLookup(operator.add) - __sub__ = _ProxyLookup(operator.sub) - __mul__ = _ProxyLookup(operator.mul) - __matmul__ = _ProxyLookup(operator.matmul) - __truediv__ = _ProxyLookup(operator.truediv) - __floordiv__ = _ProxyLookup(operator.floordiv) - __mod__ = _ProxyLookup(operator.mod) - __divmod__ = _ProxyLookup(divmod) - __pow__ = _ProxyLookup(pow) - __lshift__ = _ProxyLookup(operator.lshift) - __rshift__ = _ProxyLookup(operator.rshift) - __and__ = _ProxyLookup(operator.and_) - __xor__ = _ProxyLookup(operator.xor) - __or__ = _ProxyLookup(operator.or_) - __radd__ = _ProxyLookup(_l_to_r_op(operator.add)) - __rsub__ = _ProxyLookup(_l_to_r_op(operator.sub)) - __rmul__ = _ProxyLookup(_l_to_r_op(operator.mul)) - __rmatmul__ = _ProxyLookup(_l_to_r_op(operator.matmul)) - __rtruediv__ = _ProxyLookup(_l_to_r_op(operator.truediv)) - __rfloordiv__ = _ProxyLookup(_l_to_r_op(operator.floordiv)) - __rmod__ = _ProxyLookup(_l_to_r_op(operator.mod)) - __rdivmod__ = _ProxyLookup(_l_to_r_op(divmod)) - __rpow__ = _ProxyLookup(_l_to_r_op(pow)) - __rlshift__ = _ProxyLookup(_l_to_r_op(operator.lshift)) - __rrshift__ = _ProxyLookup(_l_to_r_op(operator.rshift)) - __rand__ = _ProxyLookup(_l_to_r_op(operator.and_)) - __rxor__ = _ProxyLookup(_l_to_r_op(operator.xor)) - __ror__ = _ProxyLookup(_l_to_r_op(operator.or_)) - __iadd__ = _ProxyIOp(operator.iadd) - __isub__ = _ProxyIOp(operator.isub) - __imul__ = _ProxyIOp(operator.imul) - __imatmul__ = _ProxyIOp(operator.imatmul) - __itruediv__ = _ProxyIOp(operator.itruediv) - __ifloordiv__ = _ProxyIOp(operator.ifloordiv) - __imod__ = _ProxyIOp(operator.imod) - __ipow__ = _ProxyIOp(operator.ipow) - __ilshift__ = _ProxyIOp(operator.ilshift) - __irshift__ = _ProxyIOp(operator.irshift) - __iand__ = _ProxyIOp(operator.iand) - __ixor__ = _ProxyIOp(operator.ixor) - __ior__ = _ProxyIOp(operator.ior) - __neg__ = _ProxyLookup(operator.neg) - __pos__ = _ProxyLookup(operator.pos) - __abs__ = _ProxyLookup(abs) - __invert__ = _ProxyLookup(operator.invert) - __complex__ = _ProxyLookup(complex) - __int__ = _ProxyLookup(int) - __float__ = _ProxyLookup(float) - __index__ = _ProxyLookup(operator.index) - __round__ = _ProxyLookup(round) - __trunc__ = _ProxyLookup(math.trunc) - __floor__ = _ProxyLookup(math.floor) - __ceil__ = _ProxyLookup(math.ceil) - __enter__ = _ProxyLookup() - __exit__ = _ProxyLookup() - __await__ = _ProxyLookup() - __aiter__ = _ProxyLookup() - __anext__ = _ProxyLookup() - __aenter__ = _ProxyLookup() - __aexit__ = _ProxyLookup() - __copy__ = _ProxyLookup(copy.copy) - __deepcopy__ = _ProxyLookup(copy.deepcopy) - # __getnewargs_ex__ (pickle through proxy not supported) - # __getnewargs__ (pickle) - # __getstate__ (pickle) - # __setstate__ (pickle) - # __reduce__ (pickle) - # __reduce_ex__ (pickle) diff --git a/venv/lib/python3.8/site-packages/werkzeug/middleware/__init__.py b/venv/lib/python3.8/site-packages/werkzeug/middleware/__init__.py deleted file mode 100644 index 6ddcf7f..0000000 --- a/venv/lib/python3.8/site-packages/werkzeug/middleware/__init__.py +++ /dev/null @@ -1,22 +0,0 @@ -""" -Middleware -========== - -A WSGI middleware is a WSGI application that wraps another application -in order to observe or change its behavior. Werkzeug provides some -middleware for common use cases. - -.. toctree:: - :maxdepth: 1 - - proxy_fix - shared_data - dispatcher - http_proxy - lint - profiler - -The :doc:`interactive debugger ` is also a middleware that can -be applied manually, although it is typically used automatically with -the :doc:`development server `. -""" diff --git a/venv/lib/python3.8/site-packages/werkzeug/middleware/__pycache__/__init__.cpython-38.pyc b/venv/lib/python3.8/site-packages/werkzeug/middleware/__pycache__/__init__.cpython-38.pyc deleted file mode 100644 index 60411505dceb0e0b7630411e2fc650c81ca890a5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 663 zcmYjPv2NQi5S6pkAdr8!H9#$)NGBmR(y8dsE@=^<3w;*PA`wy~NJ_T*N1ggVSvz-X zr%XN3LFxlY+`Y%6?mhAA<)x@NmOr01e-~BtYc9@%vFesrTJolU`>bF_yMxU4EubQQG(_QVvSdBx#?t#>5uZisHTDj}p6yG-c=bzL3*U?C629u?% T!|`!>?$~hgbCvO=i@u diff --git a/venv/lib/python3.8/site-packages/werkzeug/middleware/__pycache__/dispatcher.cpython-38.pyc b/venv/lib/python3.8/site-packages/werkzeug/middleware/__pycache__/dispatcher.cpython-38.pyc deleted file mode 100644 index 8902141cdce530022c2597c2922ecd0d9a8703bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2724 zcmZ`*TW=IM6rRi8GHhs6(NT!PENl&CeGw`->LS zkB`N5ym|wJaC(k#g_pQJPkIl1^%YirQcLT-x=WNA=8ay%&g+;rdrjB5>4=7CK6ga( znb&IxZ^xN$@dq`>308_Ci6d^}JY#FIF1U#fqzbOR_X&dCgIKdP79x>HTuBxw$&J*E zGaYC9iDWYI?%%u3 zVBUf51i=c6@-&6X@(E8#60AB>v4IURWv4P_o9|0D<=+B3f;!2D`G6hpL&Cw z6KrK0M&rv_U*%AZDT%{`#TmQB5BW}{;=-`Xn;ag)bf)qFsSLnF%RQAJX*i@{B|hNI zn39hNQd`4BJa(mkWtvo__8iU}O4UJd(_TH-}~2{E&&8^`NRLU5>xKvA$kCSZDXXn_b^q;L-z4Ngh4 zbBTxum?fRqLvC2NstA&$SdvjmQsp{035V`>gMi_ITy|{=cy~^r^|^H_9Oq+!{bCQ$ zq08jbESp>7nJ2(fSPlmK(@-x7%vZ~o0*MKsxn&efTbr=#IoI-9K zUm)1#Q}T$i$Am1Be2Ak*G13Vv$bth|CnZ)%UkE4(WT`f&;poJwO3(xtB33do$&l?0 z-*yYY=yVt#m^@0jMqb{Vj3DSnc`;NJuP*!I%9XF#Hj*lh4!UR`GSjllZtScrE-$Vo ze4u6U8okQdns>|D9mAEmCv}m73mYF$iM@cZ6H=b|G#QTxpobw1S zW}vc&Xyb?G9^O^F`T~ZLJ90v2$l<>hY8dx}7zniwFrre)Hf?EK*MiW zSTbp`RK&&NAS2m*2eYtcb)uX3!u)j39)RxBPqbC=`vK5AL7Mn0! zhD41!({btz_vvSA<2y}FVAC1%D&kY*2#jmW3fkp)RH-tdIw=O#0{x8lv_U7W_rGE? za$nl({*`y^3-7ol{E`2tp|(c;$a&~u)}imnzvvv-AOAG+UwXn9wO8Jc;6HAFyYa#q z)m}Ki`^UA%bHw}7v1ffqtXt`I;bGn!HAns@&?o9waROf#UvP}PXY_ZWvDKT|UfJCU zH@CjKTRLytrPrtsr+02=_1@<8Zn(8_XMMg_`uoz@oFKUx#bRtu=38n8%xac~^BBs8 zw)bgohMtl7r+#XhdQ74OaS7 z436J+YhKF@@bkPmcg~yh+HTuz{eQ|T2?VM(2_!vXSO#I3;<`v^-VVdZ1D>2vnqesN z2-~hHTXze(Pk2(+*5b&NzBWp=t!bM^D!!M#?W$W zZRa1)^V|5OT?9wjFv9|+rO4fKcK5;ddbql=zWV*<*3I7e5JagD nr05*!{n$d#7GH%(QuRI?%GTA&*>5SUnjEOHme)Yw@bmuzX7(R> diff --git a/venv/lib/python3.8/site-packages/werkzeug/middleware/__pycache__/http_proxy.cpython-38.pyc b/venv/lib/python3.8/site-packages/werkzeug/middleware/__pycache__/http_proxy.cpython-38.pyc deleted file mode 100644 index 57f3a5ade74ee305d5bf789906b2ae954bc2b42e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6783 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 B`V#;E diff --git a/venv/lib/python3.8/site-packages/werkzeug/middleware/__pycache__/profiler.cpython-38.pyc b/venv/lib/python3.8/site-packages/werkzeug/middleware/__pycache__/profiler.cpython-38.pyc deleted file mode 100644 index 99532aba2d997068f1f725cdfd6f00abe59383db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4921 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 M?_Gjl>vY@y189$h;Q#;t diff --git a/venv/lib/python3.8/site-packages/werkzeug/middleware/__pycache__/proxy_fix.cpython-38.pyc b/venv/lib/python3.8/site-packages/werkzeug/middleware/__pycache__/proxy_fix.cpython-38.pyc deleted file mode 100644 index 8b926501ff350992cb1de61c63e31be7616941b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6150 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 TNKpY{eEFTa(K1NyxJ&;Be@_l2 diff --git a/venv/lib/python3.8/site-packages/werkzeug/middleware/__pycache__/shared_data.cpython-38.pyc b/venv/lib/python3.8/site-packages/werkzeug/middleware/__pycache__/shared_data.cpython-38.pyc deleted file mode 100644 index aeae97f7f92f1ec9a06dbe419ad79d47c070ddaf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9826 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 diff --git a/venv/lib/python3.8/site-packages/werkzeug/middleware/dispatcher.py b/venv/lib/python3.8/site-packages/werkzeug/middleware/dispatcher.py deleted file mode 100644 index ace1c75..0000000 --- a/venv/lib/python3.8/site-packages/werkzeug/middleware/dispatcher.py +++ /dev/null @@ -1,78 +0,0 @@ -""" -Application Dispatcher -====================== - -This middleware creates a single WSGI application that dispatches to -multiple other WSGI applications mounted at different URL paths. - -A common example is writing a Single Page Application, where you have a -backend API and a frontend written in JavaScript that does the routing -in the browser rather than requesting different pages from the server. -The frontend is a single HTML and JS file that should be served for any -path besides "/api". - -This example dispatches to an API app under "/api", an admin app -under "/admin", and an app that serves frontend files for all other -requests:: - - app = DispatcherMiddleware(serve_frontend, { - '/api': api_app, - '/admin': admin_app, - }) - -In production, you might instead handle this at the HTTP server level, -serving files or proxying to application servers based on location. The -API and admin apps would each be deployed with a separate WSGI server, -and the static files would be served directly by the HTTP server. - -.. autoclass:: DispatcherMiddleware - -:copyright: 2007 Pallets -:license: BSD-3-Clause -""" -import typing as t - -if t.TYPE_CHECKING: - from _typeshed.wsgi import StartResponse - from _typeshed.wsgi import WSGIApplication - from _typeshed.wsgi import WSGIEnvironment - - -class DispatcherMiddleware: - """Combine multiple applications as a single WSGI application. - Requests are dispatched to an application based on the path it is - mounted under. - - :param app: The WSGI application to dispatch to if the request - doesn't match a mounted path. - :param mounts: Maps path prefixes to applications for dispatching. - """ - - def __init__( - self, - app: "WSGIApplication", - mounts: t.Optional[t.Dict[str, "WSGIApplication"]] = None, - ) -> None: - self.app = app - self.mounts = mounts or {} - - def __call__( - self, environ: "WSGIEnvironment", start_response: "StartResponse" - ) -> t.Iterable[bytes]: - script = environ.get("PATH_INFO", "") - path_info = "" - - while "/" in script: - if script in self.mounts: - app = self.mounts[script] - break - - script, last_item = script.rsplit("/", 1) - path_info = f"/{last_item}{path_info}" - else: - app = self.mounts.get(script, self.app) - - original_script_name = environ.get("SCRIPT_NAME", "") - environ["SCRIPT_NAME"] = original_script_name + script - environ["PATH_INFO"] = path_info - return app(environ, start_response) diff --git a/venv/lib/python3.8/site-packages/werkzeug/middleware/http_proxy.py b/venv/lib/python3.8/site-packages/werkzeug/middleware/http_proxy.py deleted file mode 100644 index 1cde458..0000000 --- a/venv/lib/python3.8/site-packages/werkzeug/middleware/http_proxy.py +++ /dev/null @@ -1,230 +0,0 @@ -""" -Basic HTTP Proxy -================ - -.. autoclass:: ProxyMiddleware - -:copyright: 2007 Pallets -:license: BSD-3-Clause -""" -import typing as t -from http import client - -from ..datastructures import EnvironHeaders -from ..http import is_hop_by_hop_header -from ..urls import url_parse -from ..urls import url_quote -from ..wsgi import get_input_stream - -if t.TYPE_CHECKING: - from _typeshed.wsgi import StartResponse - from _typeshed.wsgi import WSGIApplication - from _typeshed.wsgi import WSGIEnvironment - - -class ProxyMiddleware: - """Proxy requests under a path to an external server, routing other - requests to the app. - - This middleware can only proxy HTTP requests, as HTTP is the only - protocol handled by the WSGI server. Other protocols, such as - WebSocket requests, cannot be proxied at this layer. This should - only be used for development, in production a real proxy server - should be used. - - The middleware takes a dict mapping a path prefix to a dict - describing the host to be proxied to:: - - app = ProxyMiddleware(app, { - "/static/": { - "target": "http://127.0.0.1:5001/", - } - }) - - Each host has the following options: - - ``target``: - The target URL to dispatch to. This is required. - ``remove_prefix``: - Whether to remove the prefix from the URL before dispatching it - to the target. The default is ``False``. - ``host``: - ``""`` (default): - The host header is automatically rewritten to the URL of the - target. - ``None``: - The host header is unmodified from the client request. - Any other value: - The host header is overwritten with the value. - ``headers``: - A dictionary of headers to be sent with the request to the - target. The default is ``{}``. - ``ssl_context``: - A :class:`ssl.SSLContext` defining how to verify requests if the - target is HTTPS. The default is ``None``. - - In the example above, everything under ``"/static/"`` is proxied to - the server on port 5001. The host header is rewritten to the target, - and the ``"/static/"`` prefix is removed from the URLs. - - :param app: The WSGI application to wrap. - :param targets: Proxy target configurations. See description above. - :param chunk_size: Size of chunks to read from input stream and - write to target. - :param timeout: Seconds before an operation to a target fails. - - .. versionadded:: 0.14 - """ - - def __init__( - self, - app: "WSGIApplication", - targets: t.Mapping[str, t.Dict[str, t.Any]], - chunk_size: int = 2 << 13, - timeout: int = 10, - ) -> None: - def _set_defaults(opts: t.Dict[str, t.Any]) -> t.Dict[str, t.Any]: - opts.setdefault("remove_prefix", False) - opts.setdefault("host", "") - opts.setdefault("headers", {}) - opts.setdefault("ssl_context", None) - return opts - - self.app = app - self.targets = { - f"/{k.strip('/')}/": _set_defaults(v) for k, v in targets.items() - } - self.chunk_size = chunk_size - self.timeout = timeout - - def proxy_to( - self, opts: t.Dict[str, t.Any], path: str, prefix: str - ) -> "WSGIApplication": - target = url_parse(opts["target"]) - host = t.cast(str, target.ascii_host) - - def application( - environ: "WSGIEnvironment", start_response: "StartResponse" - ) -> t.Iterable[bytes]: - headers = list(EnvironHeaders(environ).items()) - headers[:] = [ - (k, v) - for k, v in headers - if not is_hop_by_hop_header(k) - and k.lower() not in ("content-length", "host") - ] - headers.append(("Connection", "close")) - - if opts["host"] == "": - headers.append(("Host", host)) - elif opts["host"] is None: - headers.append(("Host", environ["HTTP_HOST"])) - else: - headers.append(("Host", opts["host"])) - - headers.extend(opts["headers"].items()) - remote_path = path - - if opts["remove_prefix"]: - remote_path = remote_path[len(prefix) :].lstrip("/") - remote_path = f"{target.path.rstrip('/')}/{remote_path}" - - content_length = environ.get("CONTENT_LENGTH") - chunked = False - - if content_length not in ("", None): - headers.append(("Content-Length", content_length)) # type: ignore - elif content_length is not None: - headers.append(("Transfer-Encoding", "chunked")) - chunked = True - - try: - if target.scheme == "http": - con = client.HTTPConnection( - host, target.port or 80, timeout=self.timeout - ) - elif target.scheme == "https": - con = client.HTTPSConnection( - host, - target.port or 443, - timeout=self.timeout, - context=opts["ssl_context"], - ) - else: - raise RuntimeError( - "Target scheme must be 'http' or 'https', got" - f" {target.scheme!r}." - ) - - con.connect() - remote_url = url_quote(remote_path) - querystring = environ["QUERY_STRING"] - - if querystring: - remote_url = f"{remote_url}?{querystring}" - - con.putrequest(environ["REQUEST_METHOD"], remote_url, skip_host=True) - - for k, v in headers: - if k.lower() == "connection": - v = "close" - - con.putheader(k, v) - - con.endheaders() - stream = get_input_stream(environ) - - while True: - data = stream.read(self.chunk_size) - - if not data: - break - - if chunked: - con.send(b"%x\r\n%s\r\n" % (len(data), data)) - else: - con.send(data) - - resp = con.getresponse() - except OSError: - from ..exceptions import BadGateway - - return BadGateway()(environ, start_response) - - start_response( - f"{resp.status} {resp.reason}", - [ - (k.title(), v) - for k, v in resp.getheaders() - if not is_hop_by_hop_header(k) - ], - ) - - def read() -> t.Iterator[bytes]: - while True: - try: - data = resp.read(self.chunk_size) - except OSError: - break - - if not data: - break - - yield data - - return read() - - return application - - def __call__( - self, environ: "WSGIEnvironment", start_response: "StartResponse" - ) -> t.Iterable[bytes]: - path = environ["PATH_INFO"] - app = self.app - - for prefix, opts in self.targets.items(): - if path.startswith(prefix): - app = self.proxy_to(opts, path, prefix) - break - - return app(environ, start_response) diff --git a/venv/lib/python3.8/site-packages/werkzeug/middleware/lint.py b/venv/lib/python3.8/site-packages/werkzeug/middleware/lint.py deleted file mode 100644 index 80c423d..0000000 --- a/venv/lib/python3.8/site-packages/werkzeug/middleware/lint.py +++ /dev/null @@ -1,420 +0,0 @@ -""" -WSGI Protocol Linter -==================== - -This module provides a middleware that performs sanity checks on the -behavior of the WSGI server and application. It checks that the -:pep:`3333` WSGI spec is properly implemented. It also warns on some -common HTTP errors such as non-empty responses for 304 status codes. - -.. autoclass:: LintMiddleware - -:copyright: 2007 Pallets -:license: BSD-3-Clause -""" -import typing as t -from types import TracebackType -from urllib.parse import urlparse -from warnings import warn - -from ..datastructures import Headers -from ..http import is_entity_header -from ..wsgi import FileWrapper - -if t.TYPE_CHECKING: - from _typeshed.wsgi import StartResponse - from _typeshed.wsgi import WSGIApplication - from _typeshed.wsgi import WSGIEnvironment - - -class WSGIWarning(Warning): - """Warning class for WSGI warnings.""" - - -class HTTPWarning(Warning): - """Warning class for HTTP warnings.""" - - -def check_type(context: str, obj: object, need: t.Type = str) -> None: - if type(obj) is not need: - warn( - f"{context!r} requires {need.__name__!r}, got {type(obj).__name__!r}.", - WSGIWarning, - stacklevel=3, - ) - - -class InputStream: - def __init__(self, stream: t.BinaryIO) -> None: - self._stream = stream - - def read(self, *args: t.Any) -> bytes: - if len(args) == 0: - warn( - "WSGI does not guarantee an EOF marker on the input stream, thus making" - " calls to 'wsgi.input.read()' unsafe. Conforming servers may never" - " return from this call.", - WSGIWarning, - stacklevel=2, - ) - elif len(args) != 1: - warn( - "Too many parameters passed to 'wsgi.input.read()'.", - WSGIWarning, - stacklevel=2, - ) - return self._stream.read(*args) - - def readline(self, *args: t.Any) -> bytes: - if len(args) == 0: - warn( - "Calls to 'wsgi.input.readline()' without arguments are unsafe. Use" - " 'wsgi.input.read()' instead.", - WSGIWarning, - stacklevel=2, - ) - elif len(args) == 1: - warn( - "'wsgi.input.readline()' was called with a size hint. WSGI does not" - " support this, although it's available on all major servers.", - WSGIWarning, - stacklevel=2, - ) - else: - raise TypeError("Too many arguments passed to 'wsgi.input.readline()'.") - return self._stream.readline(*args) - - def __iter__(self) -> t.Iterator[bytes]: - try: - return iter(self._stream) - except TypeError: - warn("'wsgi.input' is not iterable.", WSGIWarning, stacklevel=2) - return iter(()) - - def close(self) -> None: - warn("The application closed the input stream!", WSGIWarning, stacklevel=2) - self._stream.close() - - -class ErrorStream: - def __init__(self, stream: t.TextIO) -> None: - self._stream = stream - - def write(self, s: str) -> None: - check_type("wsgi.error.write()", s, str) - self._stream.write(s) - - def flush(self) -> None: - self._stream.flush() - - def writelines(self, seq: t.Iterable[str]) -> None: - for line in seq: - self.write(line) - - def close(self) -> None: - warn("The application closed the error stream!", WSGIWarning, stacklevel=2) - self._stream.close() - - -class GuardedWrite: - def __init__(self, write: t.Callable[[bytes], None], chunks: t.List[int]) -> None: - self._write = write - self._chunks = chunks - - def __call__(self, s: bytes) -> None: - check_type("write()", s, bytes) - self._write(s) - self._chunks.append(len(s)) - - -class GuardedIterator: - def __init__( - self, - iterator: t.Iterable[bytes], - headers_set: t.Tuple[int, Headers], - chunks: t.List[int], - ) -> None: - self._iterator = iterator - self._next = iter(iterator).__next__ - self.closed = False - self.headers_set = headers_set - self.chunks = chunks - - def __iter__(self) -> "GuardedIterator": - return self - - def __next__(self) -> bytes: - if self.closed: - warn("Iterated over closed 'app_iter'.", WSGIWarning, stacklevel=2) - - rv = self._next() - - if not self.headers_set: - warn( - "The application returned before it started the response.", - WSGIWarning, - stacklevel=2, - ) - - check_type("application iterator items", rv, bytes) - self.chunks.append(len(rv)) - return rv - - def close(self) -> None: - self.closed = True - - if hasattr(self._iterator, "close"): - self._iterator.close() # type: ignore - - if self.headers_set: - status_code, headers = self.headers_set - bytes_sent = sum(self.chunks) - content_length = headers.get("content-length", type=int) - - if status_code == 304: - for key, _value in headers: - key = key.lower() - if key not in ("expires", "content-location") and is_entity_header( - key - ): - warn( - f"Entity header {key!r} found in 304 response.", HTTPWarning - ) - if bytes_sent: - warn("304 responses must not have a body.", HTTPWarning) - elif 100 <= status_code < 200 or status_code == 204: - if content_length != 0: - warn( - f"{status_code} responses must have an empty content length.", - HTTPWarning, - ) - if bytes_sent: - warn(f"{status_code} responses must not have a body.", HTTPWarning) - elif content_length is not None and content_length != bytes_sent: - warn( - "Content-Length and the number of bytes sent to the" - " client do not match.", - WSGIWarning, - ) - - def __del__(self) -> None: - if not self.closed: - try: - warn( - "Iterator was garbage collected before it was closed.", WSGIWarning - ) - except Exception: - pass - - -class LintMiddleware: - """Warns about common errors in the WSGI and HTTP behavior of the - server and wrapped application. Some of the issues it checks are: - - - invalid status codes - - non-bytes sent to the WSGI server - - strings returned from the WSGI application - - non-empty conditional responses - - unquoted etags - - relative URLs in the Location header - - unsafe calls to wsgi.input - - unclosed iterators - - Error information is emitted using the :mod:`warnings` module. - - :param app: The WSGI application to wrap. - - .. code-block:: python - - from werkzeug.middleware.lint import LintMiddleware - app = LintMiddleware(app) - """ - - def __init__(self, app: "WSGIApplication") -> None: - self.app = app - - def check_environ(self, environ: "WSGIEnvironment") -> None: - if type(environ) is not dict: - warn( - "WSGI environment is not a standard Python dict.", - WSGIWarning, - stacklevel=4, - ) - for key in ( - "REQUEST_METHOD", - "SERVER_NAME", - "SERVER_PORT", - "wsgi.version", - "wsgi.input", - "wsgi.errors", - "wsgi.multithread", - "wsgi.multiprocess", - "wsgi.run_once", - ): - if key not in environ: - warn( - f"Required environment key {key!r} not found", - WSGIWarning, - stacklevel=3, - ) - if environ["wsgi.version"] != (1, 0): - warn("Environ is not a WSGI 1.0 environ.", WSGIWarning, stacklevel=3) - - script_name = environ.get("SCRIPT_NAME", "") - path_info = environ.get("PATH_INFO", "") - - if script_name and script_name[0] != "/": - warn( - f"'SCRIPT_NAME' does not start with a slash: {script_name!r}", - WSGIWarning, - stacklevel=3, - ) - - if path_info and path_info[0] != "/": - warn( - f"'PATH_INFO' does not start with a slash: {path_info!r}", - WSGIWarning, - stacklevel=3, - ) - - def check_start_response( - self, - status: str, - headers: t.List[t.Tuple[str, str]], - exc_info: t.Optional[ - t.Tuple[t.Type[BaseException], BaseException, TracebackType] - ], - ) -> t.Tuple[int, Headers]: - check_type("status", status, str) - status_code_str = status.split(None, 1)[0] - - if len(status_code_str) != 3 or not status_code_str.isdigit(): - warn("Status code must be three digits.", WSGIWarning, stacklevel=3) - - if len(status) < 4 or status[3] != " ": - warn( - f"Invalid value for status {status!r}. Valid status strings are three" - " digits, a space and a status explanation.", - WSGIWarning, - stacklevel=3, - ) - - status_code = int(status_code_str) - - if status_code < 100: - warn("Status code < 100 detected.", WSGIWarning, stacklevel=3) - - if type(headers) is not list: - warn("Header list is not a list.", WSGIWarning, stacklevel=3) - - for item in headers: - if type(item) is not tuple or len(item) != 2: - warn("Header items must be 2-item tuples.", WSGIWarning, stacklevel=3) - name, value = item - if type(name) is not str or type(value) is not str: - warn( - "Header keys and values must be strings.", WSGIWarning, stacklevel=3 - ) - if name.lower() == "status": - warn( - "The status header is not supported due to" - " conflicts with the CGI spec.", - WSGIWarning, - stacklevel=3, - ) - - if exc_info is not None and not isinstance(exc_info, tuple): - warn("Invalid value for exc_info.", WSGIWarning, stacklevel=3) - - headers = Headers(headers) - self.check_headers(headers) - - return status_code, headers - - def check_headers(self, headers: Headers) -> None: - etag = headers.get("etag") - - if etag is not None: - if etag.startswith(("W/", "w/")): - if etag.startswith("w/"): - warn( - "Weak etag indicator should be upper case.", - HTTPWarning, - stacklevel=4, - ) - - etag = etag[2:] - - if not (etag[:1] == etag[-1:] == '"'): - warn("Unquoted etag emitted.", HTTPWarning, stacklevel=4) - - location = headers.get("location") - - if location is not None: - if not urlparse(location).netloc: - warn( - "Absolute URLs required for location header.", - HTTPWarning, - stacklevel=4, - ) - - def check_iterator(self, app_iter: t.Iterable[bytes]) -> None: - if isinstance(app_iter, bytes): - warn( - "The application returned a bytestring. The response will send one" - " character at a time to the client, which will kill performance." - " Return a list or iterable instead.", - WSGIWarning, - stacklevel=3, - ) - - def __call__(self, *args: t.Any, **kwargs: t.Any) -> t.Iterable[bytes]: - if len(args) != 2: - warn("A WSGI app takes two arguments.", WSGIWarning, stacklevel=2) - - if kwargs: - warn( - "A WSGI app does not take keyword arguments.", WSGIWarning, stacklevel=2 - ) - - environ: "WSGIEnvironment" = args[0] - start_response: "StartResponse" = args[1] - - self.check_environ(environ) - environ["wsgi.input"] = InputStream(environ["wsgi.input"]) - environ["wsgi.errors"] = ErrorStream(environ["wsgi.errors"]) - - # Hook our own file wrapper in so that applications will always - # iterate to the end and we can check the content length. - environ["wsgi.file_wrapper"] = FileWrapper - - headers_set: t.List[t.Any] = [] - chunks: t.List[int] = [] - - def checking_start_response( - *args: t.Any, **kwargs: t.Any - ) -> t.Callable[[bytes], None]: - if len(args) not in {2, 3}: - warn( - f"Invalid number of arguments: {len(args)}, expected 2 or 3.", - WSGIWarning, - stacklevel=2, - ) - - if kwargs: - warn("'start_response' does not take keyword arguments.", WSGIWarning) - - status: str = args[0] - headers: t.List[t.Tuple[str, str]] = args[1] - exc_info: t.Optional[ - t.Tuple[t.Type[BaseException], BaseException, TracebackType] - ] = (args[2] if len(args) == 3 else None) - - headers_set[:] = self.check_start_response(status, headers, exc_info) - return GuardedWrite(start_response(status, headers, exc_info), chunks) - - app_iter = self.app(environ, t.cast("StartResponse", checking_start_response)) - self.check_iterator(app_iter) - return GuardedIterator( - app_iter, t.cast(t.Tuple[int, Headers], headers_set), chunks - ) diff --git a/venv/lib/python3.8/site-packages/werkzeug/middleware/profiler.py b/venv/lib/python3.8/site-packages/werkzeug/middleware/profiler.py deleted file mode 100644 index 0992f8f..0000000 --- a/venv/lib/python3.8/site-packages/werkzeug/middleware/profiler.py +++ /dev/null @@ -1,139 +0,0 @@ -""" -Application Profiler -==================== - -This module provides a middleware that profiles each request with the -:mod:`cProfile` module. This can help identify bottlenecks in your code -that may be slowing down your application. - -.. autoclass:: ProfilerMiddleware - -:copyright: 2007 Pallets -:license: BSD-3-Clause -""" -import os.path -import sys -import time -import typing as t -from pstats import Stats - -try: - from cProfile import Profile -except ImportError: - from profile import Profile # type: ignore - -if t.TYPE_CHECKING: - from _typeshed.wsgi import StartResponse - from _typeshed.wsgi import WSGIApplication - from _typeshed.wsgi import WSGIEnvironment - - -class ProfilerMiddleware: - """Wrap a WSGI application and profile the execution of each - request. Responses are buffered so that timings are more exact. - - If ``stream`` is given, :class:`pstats.Stats` are written to it - after each request. If ``profile_dir`` is given, :mod:`cProfile` - data files are saved to that directory, one file per request. - - The filename can be customized by passing ``filename_format``. If - it is a string, it will be formatted using :meth:`str.format` with - the following fields available: - - - ``{method}`` - The request method; GET, POST, etc. - - ``{path}`` - The request path or 'root' should one not exist. - - ``{elapsed}`` - The elapsed time of the request. - - ``{time}`` - The time of the request. - - If it is a callable, it will be called with the WSGI ``environ`` - dict and should return a filename. - - :param app: The WSGI application to wrap. - :param stream: Write stats to this stream. Disable with ``None``. - :param sort_by: A tuple of columns to sort stats by. See - :meth:`pstats.Stats.sort_stats`. - :param restrictions: A tuple of restrictions to filter stats by. See - :meth:`pstats.Stats.print_stats`. - :param profile_dir: Save profile data files to this directory. - :param filename_format: Format string for profile data file names, - or a callable returning a name. See explanation above. - - .. code-block:: python - - from werkzeug.middleware.profiler import ProfilerMiddleware - app = ProfilerMiddleware(app) - - .. versionchanged:: 0.15 - Stats are written even if ``profile_dir`` is given, and can be - disable by passing ``stream=None``. - - .. versionadded:: 0.15 - Added ``filename_format``. - - .. versionadded:: 0.9 - Added ``restrictions`` and ``profile_dir``. - """ - - def __init__( - self, - app: "WSGIApplication", - stream: t.TextIO = sys.stdout, - sort_by: t.Iterable[str] = ("time", "calls"), - restrictions: t.Iterable[t.Union[str, int, float]] = (), - profile_dir: t.Optional[str] = None, - filename_format: str = "{method}.{path}.{elapsed:.0f}ms.{time:.0f}.prof", - ) -> None: - self._app = app - self._stream = stream - self._sort_by = sort_by - self._restrictions = restrictions - self._profile_dir = profile_dir - self._filename_format = filename_format - - def __call__( - self, environ: "WSGIEnvironment", start_response: "StartResponse" - ) -> t.Iterable[bytes]: - response_body: t.List[bytes] = [] - - def catching_start_response(status, headers, exc_info=None): # type: ignore - start_response(status, headers, exc_info) - return response_body.append - - def runapp() -> None: - app_iter = self._app( - environ, t.cast("StartResponse", catching_start_response) - ) - response_body.extend(app_iter) - - if hasattr(app_iter, "close"): - app_iter.close() # type: ignore - - profile = Profile() - start = time.time() - profile.runcall(runapp) - body = b"".join(response_body) - elapsed = time.time() - start - - if self._profile_dir is not None: - if callable(self._filename_format): - filename = self._filename_format(environ) - else: - filename = self._filename_format.format( - method=environ["REQUEST_METHOD"], - path=environ["PATH_INFO"].strip("/").replace("/", ".") or "root", - elapsed=elapsed * 1000.0, - time=time.time(), - ) - filename = os.path.join(self._profile_dir, filename) - profile.dump_stats(filename) - - if self._stream is not None: - stats = Stats(profile, stream=self._stream) - stats.sort_stats(*self._sort_by) - print("-" * 80, file=self._stream) - path_info = environ.get("PATH_INFO", "") - print(f"PATH: {path_info!r}", file=self._stream) - stats.print_stats(*self._restrictions) - print(f"{'-' * 80}\n", file=self._stream) - - return [body] diff --git a/venv/lib/python3.8/site-packages/werkzeug/middleware/proxy_fix.py b/venv/lib/python3.8/site-packages/werkzeug/middleware/proxy_fix.py deleted file mode 100644 index e90b1b3..0000000 --- a/venv/lib/python3.8/site-packages/werkzeug/middleware/proxy_fix.py +++ /dev/null @@ -1,187 +0,0 @@ -""" -X-Forwarded-For Proxy Fix -========================= - -This module provides a middleware that adjusts the WSGI environ based on -``X-Forwarded-`` headers that proxies in front of an application may -set. - -When an application is running behind a proxy server, WSGI may see the -request as coming from that server rather than the real client. Proxies -set various headers to track where the request actually came from. - -This middleware should only be used if the application is actually -behind such a proxy, and should be configured with the number of proxies -that are chained in front of it. Not all proxies set all the headers. -Since incoming headers can be faked, you must set how many proxies are -setting each header so the middleware knows what to trust. - -.. autoclass:: ProxyFix - -:copyright: 2007 Pallets -:license: BSD-3-Clause -""" -import typing as t - -from ..http import parse_list_header - -if t.TYPE_CHECKING: - from _typeshed.wsgi import StartResponse - from _typeshed.wsgi import WSGIApplication - from _typeshed.wsgi import WSGIEnvironment - - -class ProxyFix: - """Adjust the WSGI environ based on ``X-Forwarded-`` that proxies in - front of the application may set. - - - ``X-Forwarded-For`` sets ``REMOTE_ADDR``. - - ``X-Forwarded-Proto`` sets ``wsgi.url_scheme``. - - ``X-Forwarded-Host`` sets ``HTTP_HOST``, ``SERVER_NAME``, and - ``SERVER_PORT``. - - ``X-Forwarded-Port`` sets ``HTTP_HOST`` and ``SERVER_PORT``. - - ``X-Forwarded-Prefix`` sets ``SCRIPT_NAME``. - - You must tell the middleware how many proxies set each header so it - knows what values to trust. It is a security issue to trust values - that came from the client rather than a proxy. - - The original values of the headers are stored in the WSGI - environ as ``werkzeug.proxy_fix.orig``, a dict. - - :param app: The WSGI application to wrap. - :param x_for: Number of values to trust for ``X-Forwarded-For``. - :param x_proto: Number of values to trust for ``X-Forwarded-Proto``. - :param x_host: Number of values to trust for ``X-Forwarded-Host``. - :param x_port: Number of values to trust for ``X-Forwarded-Port``. - :param x_prefix: Number of values to trust for - ``X-Forwarded-Prefix``. - - .. code-block:: python - - from werkzeug.middleware.proxy_fix import ProxyFix - # App is behind one proxy that sets the -For and -Host headers. - app = ProxyFix(app, x_for=1, x_host=1) - - .. versionchanged:: 1.0 - Deprecated code has been removed: - - * The ``num_proxies`` argument and attribute. - * The ``get_remote_addr`` method. - * The environ keys ``orig_remote_addr``, - ``orig_wsgi_url_scheme``, and ``orig_http_host``. - - .. versionchanged:: 0.15 - All headers support multiple values. The ``num_proxies`` - argument is deprecated. Each header is configured with a - separate number of trusted proxies. - - .. versionchanged:: 0.15 - Original WSGI environ values are stored in the - ``werkzeug.proxy_fix.orig`` dict. ``orig_remote_addr``, - ``orig_wsgi_url_scheme``, and ``orig_http_host`` are deprecated - and will be removed in 1.0. - - .. versionchanged:: 0.15 - Support ``X-Forwarded-Port`` and ``X-Forwarded-Prefix``. - - .. versionchanged:: 0.15 - ``X-Forwarded-Host`` and ``X-Forwarded-Port`` modify - ``SERVER_NAME`` and ``SERVER_PORT``. - """ - - def __init__( - self, - app: "WSGIApplication", - x_for: int = 1, - x_proto: int = 1, - x_host: int = 0, - x_port: int = 0, - x_prefix: int = 0, - ) -> None: - self.app = app - self.x_for = x_for - self.x_proto = x_proto - self.x_host = x_host - self.x_port = x_port - self.x_prefix = x_prefix - - def _get_real_value(self, trusted: int, value: t.Optional[str]) -> t.Optional[str]: - """Get the real value from a list header based on the configured - number of trusted proxies. - - :param trusted: Number of values to trust in the header. - :param value: Comma separated list header value to parse. - :return: The real value, or ``None`` if there are fewer values - than the number of trusted proxies. - - .. versionchanged:: 1.0 - Renamed from ``_get_trusted_comma``. - - .. versionadded:: 0.15 - """ - if not (trusted and value): - return None - values = parse_list_header(value) - if len(values) >= trusted: - return values[-trusted] - return None - - def __call__( - self, environ: "WSGIEnvironment", start_response: "StartResponse" - ) -> t.Iterable[bytes]: - """Modify the WSGI environ based on the various ``Forwarded`` - headers before calling the wrapped application. Store the - original environ values in ``werkzeug.proxy_fix.orig_{key}``. - """ - environ_get = environ.get - orig_remote_addr = environ_get("REMOTE_ADDR") - orig_wsgi_url_scheme = environ_get("wsgi.url_scheme") - orig_http_host = environ_get("HTTP_HOST") - environ.update( - { - "werkzeug.proxy_fix.orig": { - "REMOTE_ADDR": orig_remote_addr, - "wsgi.url_scheme": orig_wsgi_url_scheme, - "HTTP_HOST": orig_http_host, - "SERVER_NAME": environ_get("SERVER_NAME"), - "SERVER_PORT": environ_get("SERVER_PORT"), - "SCRIPT_NAME": environ_get("SCRIPT_NAME"), - } - } - ) - - x_for = self._get_real_value(self.x_for, environ_get("HTTP_X_FORWARDED_FOR")) - if x_for: - environ["REMOTE_ADDR"] = x_for - - x_proto = self._get_real_value( - self.x_proto, environ_get("HTTP_X_FORWARDED_PROTO") - ) - if x_proto: - environ["wsgi.url_scheme"] = x_proto - - x_host = self._get_real_value(self.x_host, environ_get("HTTP_X_FORWARDED_HOST")) - if x_host: - environ["HTTP_HOST"] = x_host - parts = x_host.split(":", 1) - environ["SERVER_NAME"] = parts[0] - if len(parts) == 2: - environ["SERVER_PORT"] = parts[1] - - x_port = self._get_real_value(self.x_port, environ_get("HTTP_X_FORWARDED_PORT")) - if x_port: - host = environ.get("HTTP_HOST") - if host: - parts = host.split(":", 1) - host = parts[0] if len(parts) == 2 else host - environ["HTTP_HOST"] = f"{host}:{x_port}" - environ["SERVER_PORT"] = x_port - - x_prefix = self._get_real_value( - self.x_prefix, environ_get("HTTP_X_FORWARDED_PREFIX") - ) - if x_prefix: - environ["SCRIPT_NAME"] = x_prefix - - return self.app(environ, start_response) diff --git a/venv/lib/python3.8/site-packages/werkzeug/middleware/shared_data.py b/venv/lib/python3.8/site-packages/werkzeug/middleware/shared_data.py deleted file mode 100644 index f11b43a..0000000 --- a/venv/lib/python3.8/site-packages/werkzeug/middleware/shared_data.py +++ /dev/null @@ -1,320 +0,0 @@ -""" -Serve Shared Static Files -========================= - -.. autoclass:: SharedDataMiddleware - :members: is_allowed - -:copyright: 2007 Pallets -:license: BSD-3-Clause -""" -import mimetypes -import os -import pkgutil -import posixpath -import typing as t -from datetime import datetime -from datetime import timezone -from io import BytesIO -from time import time -from zlib import adler32 - -from ..filesystem import get_filesystem_encoding -from ..http import http_date -from ..http import is_resource_modified -from ..security import safe_join -from ..utils import get_content_type -from ..wsgi import get_path_info -from ..wsgi import wrap_file - -_TOpener = t.Callable[[], t.Tuple[t.BinaryIO, datetime, int]] -_TLoader = t.Callable[[t.Optional[str]], t.Tuple[t.Optional[str], t.Optional[_TOpener]]] - -if t.TYPE_CHECKING: - from _typeshed.wsgi import StartResponse - from _typeshed.wsgi import WSGIApplication - from _typeshed.wsgi import WSGIEnvironment - - -class SharedDataMiddleware: - - """A WSGI middleware which provides static content for development - environments or simple server setups. Its usage is quite simple:: - - import os - from werkzeug.middleware.shared_data import SharedDataMiddleware - - app = SharedDataMiddleware(app, { - '/shared': os.path.join(os.path.dirname(__file__), 'shared') - }) - - The contents of the folder ``./shared`` will now be available on - ``http://example.com/shared/``. This is pretty useful during development - because a standalone media server is not required. Files can also be - mounted on the root folder and still continue to use the application because - the shared data middleware forwards all unhandled requests to the - application, even if the requests are below one of the shared folders. - - If `pkg_resources` is available you can also tell the middleware to serve - files from package data:: - - app = SharedDataMiddleware(app, { - '/static': ('myapplication', 'static') - }) - - This will then serve the ``static`` folder in the `myapplication` - Python package. - - The optional `disallow` parameter can be a list of :func:`~fnmatch.fnmatch` - rules for files that are not accessible from the web. If `cache` is set to - `False` no caching headers are sent. - - Currently the middleware does not support non-ASCII filenames. If the - encoding on the file system happens to match the encoding of the URI it may - work but this could also be by accident. We strongly suggest using ASCII - only file names for static files. - - The middleware will guess the mimetype using the Python `mimetype` - module. If it's unable to figure out the charset it will fall back - to `fallback_mimetype`. - - :param app: the application to wrap. If you don't want to wrap an - application you can pass it :exc:`NotFound`. - :param exports: a list or dict of exported files and folders. - :param disallow: a list of :func:`~fnmatch.fnmatch` rules. - :param cache: enable or disable caching headers. - :param cache_timeout: the cache timeout in seconds for the headers. - :param fallback_mimetype: The fallback mimetype for unknown files. - - .. versionchanged:: 1.0 - The default ``fallback_mimetype`` is - ``application/octet-stream``. If a filename looks like a text - mimetype, the ``utf-8`` charset is added to it. - - .. versionadded:: 0.6 - Added ``fallback_mimetype``. - - .. versionchanged:: 0.5 - Added ``cache_timeout``. - """ - - def __init__( - self, - app: "WSGIApplication", - exports: t.Union[ - t.Dict[str, t.Union[str, t.Tuple[str, str]]], - t.Iterable[t.Tuple[str, t.Union[str, t.Tuple[str, str]]]], - ], - disallow: None = None, - cache: bool = True, - cache_timeout: int = 60 * 60 * 12, - fallback_mimetype: str = "application/octet-stream", - ) -> None: - self.app = app - self.exports: t.List[t.Tuple[str, _TLoader]] = [] - self.cache = cache - self.cache_timeout = cache_timeout - - if isinstance(exports, dict): - exports = exports.items() - - for key, value in exports: - if isinstance(value, tuple): - loader = self.get_package_loader(*value) - elif isinstance(value, str): - if os.path.isfile(value): - loader = self.get_file_loader(value) - else: - loader = self.get_directory_loader(value) - else: - raise TypeError(f"unknown def {value!r}") - - self.exports.append((key, loader)) - - if disallow is not None: - from fnmatch import fnmatch - - self.is_allowed = lambda x: not fnmatch(x, disallow) - - self.fallback_mimetype = fallback_mimetype - - def is_allowed(self, filename: str) -> bool: - """Subclasses can override this method to disallow the access to - certain files. However by providing `disallow` in the constructor - this method is overwritten. - """ - return True - - def _opener(self, filename: str) -> _TOpener: - return lambda: ( - open(filename, "rb"), - datetime.fromtimestamp(os.path.getmtime(filename), tz=timezone.utc), - int(os.path.getsize(filename)), - ) - - def get_file_loader(self, filename: str) -> _TLoader: - return lambda x: (os.path.basename(filename), self._opener(filename)) - - def get_package_loader(self, package: str, package_path: str) -> _TLoader: - load_time = datetime.now(timezone.utc) - provider = pkgutil.get_loader(package) - - if hasattr(provider, "get_resource_reader"): - # Python 3 - reader = provider.get_resource_reader(package) # type: ignore - - def loader( - path: t.Optional[str], - ) -> t.Tuple[t.Optional[str], t.Optional[_TOpener]]: - if path is None: - return None, None - - path = safe_join(package_path, path) - - if path is None: - return None, None - - basename = posixpath.basename(path) - - try: - resource = reader.open_resource(path) - except OSError: - return None, None - - if isinstance(resource, BytesIO): - return ( - basename, - lambda: (resource, load_time, len(resource.getvalue())), - ) - - return ( - basename, - lambda: ( - resource, - datetime.fromtimestamp( - os.path.getmtime(resource.name), tz=timezone.utc - ), - os.path.getsize(resource.name), - ), - ) - - else: - # Python 3.6 - package_filename = provider.get_filename(package) # type: ignore - is_filesystem = os.path.exists(package_filename) - root = os.path.join(os.path.dirname(package_filename), package_path) - - def loader( - path: t.Optional[str], - ) -> t.Tuple[t.Optional[str], t.Optional[_TOpener]]: - if path is None: - return None, None - - path = safe_join(root, path) - - if path is None: - return None, None - - basename = posixpath.basename(path) - - if is_filesystem: - if not os.path.isfile(path): - return None, None - - return basename, self._opener(path) - - try: - data = provider.get_data(path) # type: ignore - except OSError: - return None, None - - return basename, lambda: (BytesIO(data), load_time, len(data)) - - return loader - - def get_directory_loader(self, directory: str) -> _TLoader: - def loader( - path: t.Optional[str], - ) -> t.Tuple[t.Optional[str], t.Optional[_TOpener]]: - if path is not None: - path = safe_join(directory, path) - - if path is None: - return None, None - else: - path = directory - - if os.path.isfile(path): - return os.path.basename(path), self._opener(path) - - return None, None - - return loader - - def generate_etag(self, mtime: datetime, file_size: int, real_filename: str) -> str: - if not isinstance(real_filename, bytes): - real_filename = real_filename.encode( # type: ignore - get_filesystem_encoding() - ) - - timestamp = mtime.timestamp() - checksum = adler32(real_filename) & 0xFFFFFFFF # type: ignore - return f"wzsdm-{timestamp}-{file_size}-{checksum}" - - def __call__( - self, environ: "WSGIEnvironment", start_response: "StartResponse" - ) -> t.Iterable[bytes]: - path = get_path_info(environ) - file_loader = None - - for search_path, loader in self.exports: - if search_path == path: - real_filename, file_loader = loader(None) - - if file_loader is not None: - break - - if not search_path.endswith("/"): - search_path += "/" - - if path.startswith(search_path): - real_filename, file_loader = loader(path[len(search_path) :]) - - if file_loader is not None: - break - - if file_loader is None or not self.is_allowed(real_filename): # type: ignore - return self.app(environ, start_response) - - guessed_type = mimetypes.guess_type(real_filename) # type: ignore - mime_type = get_content_type(guessed_type[0] or self.fallback_mimetype, "utf-8") - f, mtime, file_size = file_loader() - - headers = [("Date", http_date())] - - if self.cache: - timeout = self.cache_timeout - etag = self.generate_etag(mtime, file_size, real_filename) # type: ignore - headers += [ - ("Etag", f'"{etag}"'), - ("Cache-Control", f"max-age={timeout}, public"), - ] - - if not is_resource_modified(environ, etag, last_modified=mtime): - f.close() - start_response("304 Not Modified", headers) - return [] - - headers.append(("Expires", http_date(time() + timeout))) - else: - headers.append(("Cache-Control", "public")) - - headers.extend( - ( - ("Content-Type", mime_type), - ("Content-Length", str(file_size)), - ("Last-Modified", http_date(mtime)), - ) - ) - start_response("200 OK", headers) - return wrap_file(environ, f) diff --git a/venv/lib/python3.8/site-packages/werkzeug/py.typed b/venv/lib/python3.8/site-packages/werkzeug/py.typed deleted file mode 100644 index e69de29..0000000 diff --git a/venv/lib/python3.8/site-packages/werkzeug/routing.py b/venv/lib/python3.8/site-packages/werkzeug/routing.py deleted file mode 100644 index 1043875..0000000 --- a/venv/lib/python3.8/site-packages/werkzeug/routing.py +++ /dev/null @@ -1,2332 +0,0 @@ -"""When it comes to combining multiple controller or view functions -(however you want to call them) you need a dispatcher. A simple way -would be applying regular expression tests on the ``PATH_INFO`` and -calling registered callback functions that return the value then. - -This module implements a much more powerful system than simple regular -expression matching because it can also convert values in the URLs and -build URLs. - -Here a simple example that creates a URL map for an application with -two subdomains (www and kb) and some URL rules: - -.. code-block:: python - - m = Map([ - # Static URLs - Rule('/', endpoint='static/index'), - Rule('/about', endpoint='static/about'), - Rule('/help', endpoint='static/help'), - # Knowledge Base - Subdomain('kb', [ - Rule('/', endpoint='kb/index'), - Rule('/browse/', endpoint='kb/browse'), - Rule('/browse//', endpoint='kb/browse'), - Rule('/browse//', endpoint='kb/browse') - ]) - ], default_subdomain='www') - -If the application doesn't use subdomains it's perfectly fine to not set -the default subdomain and not use the `Subdomain` rule factory. The -endpoint in the rules can be anything, for example import paths or -unique identifiers. The WSGI application can use those endpoints to get the -handler for that URL. It doesn't have to be a string at all but it's -recommended. - -Now it's possible to create a URL adapter for one of the subdomains and -build URLs: - -.. code-block:: python - - c = m.bind('example.com') - - c.build("kb/browse", dict(id=42)) - 'http://kb.example.com/browse/42/' - - c.build("kb/browse", dict()) - 'http://kb.example.com/browse/' - - c.build("kb/browse", dict(id=42, page=3)) - 'http://kb.example.com/browse/42/3' - - c.build("static/about") - '/about' - - c.build("static/index", force_external=True) - 'http://www.example.com/' - - c = m.bind('example.com', subdomain='kb') - - c.build("static/about") - 'http://www.example.com/about' - -The first argument to bind is the server name *without* the subdomain. -Per default it will assume that the script is mounted on the root, but -often that's not the case so you can provide the real mount point as -second argument: - -.. code-block:: python - - c = m.bind('example.com', '/applications/example') - -The third argument can be the subdomain, if not given the default -subdomain is used. For more details about binding have a look at the -documentation of the `MapAdapter`. - -And here is how you can match URLs: - -.. code-block:: python - - c = m.bind('example.com') - - c.match("/") - ('static/index', {}) - - c.match("/about") - ('static/about', {}) - - c = m.bind('example.com', '/', 'kb') - - c.match("/") - ('kb/index', {}) - - c.match("/browse/42/23") - ('kb/browse', {'id': 42, 'page': 23}) - -If matching fails you get a ``NotFound`` exception, if the rule thinks -it's a good idea to redirect (for example because the URL was defined -to have a slash at the end but the request was missing that slash) it -will raise a ``RequestRedirect`` exception. Both are subclasses of -``HTTPException`` so you can use those errors as responses in the -application. - -If matching succeeded but the URL rule was incompatible to the given -method (for example there were only rules for ``GET`` and ``HEAD`` but -routing tried to match a ``POST`` request) a ``MethodNotAllowed`` -exception is raised. -""" -import ast -import difflib -import posixpath -import re -import typing -import typing as t -import uuid -import warnings -from pprint import pformat -from string import Template -from threading import Lock -from types import CodeType - -from ._internal import _encode_idna -from ._internal import _get_environ -from ._internal import _to_bytes -from ._internal import _to_str -from ._internal import _wsgi_decoding_dance -from .datastructures import ImmutableDict -from .datastructures import MultiDict -from .exceptions import BadHost -from .exceptions import BadRequest -from .exceptions import HTTPException -from .exceptions import MethodNotAllowed -from .exceptions import NotFound -from .urls import _fast_url_quote -from .urls import url_encode -from .urls import url_join -from .urls import url_quote -from .utils import cached_property -from .utils import redirect -from .wsgi import get_host - -if t.TYPE_CHECKING: - import typing_extensions as te - from _typeshed.wsgi import WSGIApplication - from _typeshed.wsgi import WSGIEnvironment - from .wrappers.response import Response - -_rule_re = re.compile( - r""" - (?P[^<]*) # static rule data - < - (?: - (?P[a-zA-Z_][a-zA-Z0-9_]*) # converter name - (?:\((?P.*?)\))? # converter arguments - \: # variable delimiter - )? - (?P[a-zA-Z_][a-zA-Z0-9_]*) # variable name - > - """, - re.VERBOSE, -) -_simple_rule_re = re.compile(r"<([^>]+)>") -_converter_args_re = re.compile( - r""" - ((?P\w+)\s*=\s*)? - (?P - True|False| - \d+.\d+| - \d+.| - \d+| - [\w\d_.]+| - [urUR]?(?P"[^"]*?"|'[^']*') - )\s*, - """, - re.VERBOSE, -) - - -_PYTHON_CONSTANTS = {"None": None, "True": True, "False": False} - - -def _pythonize(value: str) -> t.Union[None, bool, int, float, str]: - if value in _PYTHON_CONSTANTS: - return _PYTHON_CONSTANTS[value] - for convert in int, float: - try: - return convert(value) # type: ignore - except ValueError: - pass - if value[:1] == value[-1:] and value[0] in "\"'": - value = value[1:-1] - return str(value) - - -def parse_converter_args(argstr: str) -> t.Tuple[t.Tuple, t.Dict[str, t.Any]]: - argstr += "," - args = [] - kwargs = {} - - for item in _converter_args_re.finditer(argstr): - value = item.group("stringval") - if value is None: - value = item.group("value") - value = _pythonize(value) - if not item.group("name"): - args.append(value) - else: - name = item.group("name") - kwargs[name] = value - - return tuple(args), kwargs - - -def parse_rule(rule: str) -> t.Iterator[t.Tuple[t.Optional[str], t.Optional[str], str]]: - """Parse a rule and return it as generator. Each iteration yields tuples - in the form ``(converter, arguments, variable)``. If the converter is - `None` it's a static url part, otherwise it's a dynamic one. - - :internal: - """ - pos = 0 - end = len(rule) - do_match = _rule_re.match - used_names = set() - while pos < end: - m = do_match(rule, pos) - if m is None: - break - data = m.groupdict() - if data["static"]: - yield None, None, data["static"] - variable = data["variable"] - converter = data["converter"] or "default" - if variable in used_names: - raise ValueError(f"variable name {variable!r} used twice.") - used_names.add(variable) - yield converter, data["args"] or None, variable - pos = m.end() - if pos < end: - remaining = rule[pos:] - if ">" in remaining or "<" in remaining: - raise ValueError(f"malformed url rule: {rule!r}") - yield None, None, remaining - - -class RoutingException(Exception): - """Special exceptions that require the application to redirect, notifying - about missing urls, etc. - - :internal: - """ - - -class RequestRedirect(HTTPException, RoutingException): - """Raise if the map requests a redirect. This is for example the case if - `strict_slashes` are activated and an url that requires a trailing slash. - - The attribute `new_url` contains the absolute destination url. - """ - - code = 308 - - def __init__(self, new_url: str) -> None: - super().__init__(new_url) - self.new_url = new_url - - def get_response( - self, - environ: t.Optional["WSGIEnvironment"] = None, - scope: t.Optional[dict] = None, - ) -> "Response": - return redirect(self.new_url, self.code) - - -class RequestPath(RoutingException): - """Internal exception.""" - - __slots__ = ("path_info",) - - def __init__(self, path_info: str) -> None: - super().__init__() - self.path_info = path_info - - -class RequestAliasRedirect(RoutingException): # noqa: B903 - """This rule is an alias and wants to redirect to the canonical URL.""" - - def __init__(self, matched_values: t.Mapping[str, t.Any]) -> None: - super().__init__() - self.matched_values = matched_values - - -class BuildError(RoutingException, LookupError): - """Raised if the build system cannot find a URL for an endpoint with the - values provided. - """ - - def __init__( - self, - endpoint: str, - values: t.Mapping[str, t.Any], - method: t.Optional[str], - adapter: t.Optional["MapAdapter"] = None, - ) -> None: - super().__init__(endpoint, values, method) - self.endpoint = endpoint - self.values = values - self.method = method - self.adapter = adapter - - @cached_property - def suggested(self) -> t.Optional["Rule"]: - return self.closest_rule(self.adapter) - - def closest_rule(self, adapter: t.Optional["MapAdapter"]) -> t.Optional["Rule"]: - def _score_rule(rule: "Rule") -> float: - return sum( - [ - 0.98 - * difflib.SequenceMatcher( - None, rule.endpoint, self.endpoint - ).ratio(), - 0.01 * bool(set(self.values or ()).issubset(rule.arguments)), - 0.01 * bool(rule.methods and self.method in rule.methods), - ] - ) - - if adapter and adapter.map._rules: - return max(adapter.map._rules, key=_score_rule) - - return None - - def __str__(self) -> str: - message = [f"Could not build url for endpoint {self.endpoint!r}"] - if self.method: - message.append(f" ({self.method!r})") - if self.values: - message.append(f" with values {sorted(self.values)!r}") - message.append(".") - if self.suggested: - if self.endpoint == self.suggested.endpoint: - if ( - self.method - and self.suggested.methods is not None - and self.method not in self.suggested.methods - ): - message.append( - " Did you mean to use methods" - f" {sorted(self.suggested.methods)!r}?" - ) - missing_values = self.suggested.arguments.union( - set(self.suggested.defaults or ()) - ) - set(self.values.keys()) - if missing_values: - message.append( - f" Did you forget to specify values {sorted(missing_values)!r}?" - ) - else: - message.append(f" Did you mean {self.suggested.endpoint!r} instead?") - return "".join(message) - - -class WebsocketMismatch(BadRequest): - """The only matched rule is either a WebSocket and the request is - HTTP, or the rule is HTTP and the request is a WebSocket. - """ - - -class ValidationError(ValueError): - """Validation error. If a rule converter raises this exception the rule - does not match the current URL and the next URL is tried. - """ - - -class RuleFactory: - """As soon as you have more complex URL setups it's a good idea to use rule - factories to avoid repetitive tasks. Some of them are builtin, others can - be added by subclassing `RuleFactory` and overriding `get_rules`. - """ - - def get_rules(self, map: "Map") -> t.Iterable["Rule"]: - """Subclasses of `RuleFactory` have to override this method and return - an iterable of rules.""" - raise NotImplementedError() - - -class Subdomain(RuleFactory): - """All URLs provided by this factory have the subdomain set to a - specific domain. For example if you want to use the subdomain for - the current language this can be a good setup:: - - url_map = Map([ - Rule('/', endpoint='#select_language'), - Subdomain('', [ - Rule('/', endpoint='index'), - Rule('/about', endpoint='about'), - Rule('/help', endpoint='help') - ]) - ]) - - All the rules except for the ``'#select_language'`` endpoint will now - listen on a two letter long subdomain that holds the language code - for the current request. - """ - - def __init__(self, subdomain: str, rules: t.Iterable["Rule"]) -> None: - self.subdomain = subdomain - self.rules = rules - - def get_rules(self, map: "Map") -> t.Iterator["Rule"]: - for rulefactory in self.rules: - for rule in rulefactory.get_rules(map): - rule = rule.empty() - rule.subdomain = self.subdomain - yield rule - - -class Submount(RuleFactory): - """Like `Subdomain` but prefixes the URL rule with a given string:: - - url_map = Map([ - Rule('/', endpoint='index'), - Submount('/blog', [ - Rule('/', endpoint='blog/index'), - Rule('/entry/', endpoint='blog/show') - ]) - ]) - - Now the rule ``'blog/show'`` matches ``/blog/entry/``. - """ - - def __init__(self, path: str, rules: t.Iterable["Rule"]) -> None: - self.path = path.rstrip("/") - self.rules = rules - - def get_rules(self, map: "Map") -> t.Iterator["Rule"]: - for rulefactory in self.rules: - for rule in rulefactory.get_rules(map): - rule = rule.empty() - rule.rule = self.path + rule.rule - yield rule - - -class EndpointPrefix(RuleFactory): - """Prefixes all endpoints (which must be strings for this factory) with - another string. This can be useful for sub applications:: - - url_map = Map([ - Rule('/', endpoint='index'), - EndpointPrefix('blog/', [Submount('/blog', [ - Rule('/', endpoint='index'), - Rule('/entry/', endpoint='show') - ])]) - ]) - """ - - def __init__(self, prefix: str, rules: t.Iterable["Rule"]) -> None: - self.prefix = prefix - self.rules = rules - - def get_rules(self, map: "Map") -> t.Iterator["Rule"]: - for rulefactory in self.rules: - for rule in rulefactory.get_rules(map): - rule = rule.empty() - rule.endpoint = self.prefix + rule.endpoint - yield rule - - -class RuleTemplate: - """Returns copies of the rules wrapped and expands string templates in - the endpoint, rule, defaults or subdomain sections. - - Here a small example for such a rule template:: - - from werkzeug.routing import Map, Rule, RuleTemplate - - resource = RuleTemplate([ - Rule('/$name/', endpoint='$name.list'), - Rule('/$name/', endpoint='$name.show') - ]) - - url_map = Map([resource(name='user'), resource(name='page')]) - - When a rule template is called the keyword arguments are used to - replace the placeholders in all the string parameters. - """ - - def __init__(self, rules: t.Iterable["Rule"]) -> None: - self.rules = list(rules) - - def __call__(self, *args: t.Any, **kwargs: t.Any) -> "RuleTemplateFactory": - return RuleTemplateFactory(self.rules, dict(*args, **kwargs)) - - -class RuleTemplateFactory(RuleFactory): - """A factory that fills in template variables into rules. Used by - `RuleTemplate` internally. - - :internal: - """ - - def __init__(self, rules: t.Iterable["Rule"], context: t.Dict[str, t.Any]) -> None: - self.rules = rules - self.context = context - - def get_rules(self, map: "Map") -> t.Iterator["Rule"]: - for rulefactory in self.rules: - for rule in rulefactory.get_rules(map): - new_defaults = subdomain = None - if rule.defaults: - new_defaults = {} - for key, value in rule.defaults.items(): - if isinstance(value, str): - value = Template(value).substitute(self.context) - new_defaults[key] = value - if rule.subdomain is not None: - subdomain = Template(rule.subdomain).substitute(self.context) - new_endpoint = rule.endpoint - if isinstance(new_endpoint, str): - new_endpoint = Template(new_endpoint).substitute(self.context) - yield Rule( - Template(rule.rule).substitute(self.context), - new_defaults, - subdomain, - rule.methods, - rule.build_only, - new_endpoint, - rule.strict_slashes, - ) - - -def _prefix_names(src: str) -> ast.stmt: - """ast parse and prefix names with `.` to avoid collision with user vars""" - tree = ast.parse(src).body[0] - if isinstance(tree, ast.Expr): - tree = tree.value # type: ignore - for node in ast.walk(tree): - if isinstance(node, ast.Name): - node.id = f".{node.id}" - return tree - - -_CALL_CONVERTER_CODE_FMT = "self._converters[{elem!r}].to_url()" -_IF_KWARGS_URL_ENCODE_CODE = """\ -if kwargs: - q = '?' - params = self._encode_query_vars(kwargs) -else: - q = params = '' -""" -_IF_KWARGS_URL_ENCODE_AST = _prefix_names(_IF_KWARGS_URL_ENCODE_CODE) -_URL_ENCODE_AST_NAMES = (_prefix_names("q"), _prefix_names("params")) - - -class Rule(RuleFactory): - """A Rule represents one URL pattern. There are some options for `Rule` - that change the way it behaves and are passed to the `Rule` constructor. - Note that besides the rule-string all arguments *must* be keyword arguments - in order to not break the application on Werkzeug upgrades. - - `string` - Rule strings basically are just normal URL paths with placeholders in - the format ```` where the converter and the - arguments are optional. If no converter is defined the `default` - converter is used which means `string` in the normal configuration. - - URL rules that end with a slash are branch URLs, others are leaves. - If you have `strict_slashes` enabled (which is the default), all - branch URLs that are matched without a trailing slash will trigger a - redirect to the same URL with the missing slash appended. - - The converters are defined on the `Map`. - - `endpoint` - The endpoint for this rule. This can be anything. A reference to a - function, a string, a number etc. The preferred way is using a string - because the endpoint is used for URL generation. - - `defaults` - An optional dict with defaults for other rules with the same endpoint. - This is a bit tricky but useful if you want to have unique URLs:: - - url_map = Map([ - Rule('/all/', defaults={'page': 1}, endpoint='all_entries'), - Rule('/all/page/', endpoint='all_entries') - ]) - - If a user now visits ``http://example.com/all/page/1`` he will be - redirected to ``http://example.com/all/``. If `redirect_defaults` is - disabled on the `Map` instance this will only affect the URL - generation. - - `subdomain` - The subdomain rule string for this rule. If not specified the rule - only matches for the `default_subdomain` of the map. If the map is - not bound to a subdomain this feature is disabled. - - Can be useful if you want to have user profiles on different subdomains - and all subdomains are forwarded to your application:: - - url_map = Map([ - Rule('/', subdomain='', endpoint='user/homepage'), - Rule('/stats', subdomain='', endpoint='user/stats') - ]) - - `methods` - A sequence of http methods this rule applies to. If not specified, all - methods are allowed. For example this can be useful if you want different - endpoints for `POST` and `GET`. If methods are defined and the path - matches but the method matched against is not in this list or in the - list of another rule for that path the error raised is of the type - `MethodNotAllowed` rather than `NotFound`. If `GET` is present in the - list of methods and `HEAD` is not, `HEAD` is added automatically. - - `strict_slashes` - Override the `Map` setting for `strict_slashes` only for this rule. If - not specified the `Map` setting is used. - - `merge_slashes` - Override :attr:`Map.merge_slashes` for this rule. - - `build_only` - Set this to True and the rule will never match but will create a URL - that can be build. This is useful if you have resources on a subdomain - or folder that are not handled by the WSGI application (like static data) - - `redirect_to` - If given this must be either a string or callable. In case of a - callable it's called with the url adapter that triggered the match and - the values of the URL as keyword arguments and has to return the target - for the redirect, otherwise it has to be a string with placeholders in - rule syntax:: - - def foo_with_slug(adapter, id): - # ask the database for the slug for the old id. this of - # course has nothing to do with werkzeug. - return f'foo/{Foo.get_slug_for_id(id)}' - - url_map = Map([ - Rule('/foo/', endpoint='foo'), - Rule('/some/old/url/', redirect_to='foo/'), - Rule('/other/old/url/', redirect_to=foo_with_slug) - ]) - - When the rule is matched the routing system will raise a - `RequestRedirect` exception with the target for the redirect. - - Keep in mind that the URL will be joined against the URL root of the - script so don't use a leading slash on the target URL unless you - really mean root of that domain. - - `alias` - If enabled this rule serves as an alias for another rule with the same - endpoint and arguments. - - `host` - If provided and the URL map has host matching enabled this can be - used to provide a match rule for the whole host. This also means - that the subdomain feature is disabled. - - `websocket` - If ``True``, this rule is only matches for WebSocket (``ws://``, - ``wss://``) requests. By default, rules will only match for HTTP - requests. - - .. versionadded:: 1.0 - Added ``websocket``. - - .. versionadded:: 1.0 - Added ``merge_slashes``. - - .. versionadded:: 0.7 - Added ``alias`` and ``host``. - - .. versionchanged:: 0.6.1 - ``HEAD`` is added to ``methods`` if ``GET`` is present. - """ - - def __init__( - self, - string: str, - defaults: t.Optional[t.Mapping[str, t.Any]] = None, - subdomain: t.Optional[str] = None, - methods: t.Optional[t.Iterable[str]] = None, - build_only: bool = False, - endpoint: t.Optional[str] = None, - strict_slashes: t.Optional[bool] = None, - merge_slashes: t.Optional[bool] = None, - redirect_to: t.Optional[t.Union[str, t.Callable[..., str]]] = None, - alias: bool = False, - host: t.Optional[str] = None, - websocket: bool = False, - ) -> None: - if not string.startswith("/"): - raise ValueError("urls must start with a leading slash") - self.rule = string - self.is_leaf = not string.endswith("/") - - self.map: "Map" = None # type: ignore - self.strict_slashes = strict_slashes - self.merge_slashes = merge_slashes - self.subdomain = subdomain - self.host = host - self.defaults = defaults - self.build_only = build_only - self.alias = alias - self.websocket = websocket - - if methods is not None: - if isinstance(methods, str): - raise TypeError("'methods' should be a list of strings.") - - methods = {x.upper() for x in methods} - - if "HEAD" not in methods and "GET" in methods: - methods.add("HEAD") - - if websocket and methods - {"GET", "HEAD", "OPTIONS"}: - raise ValueError( - "WebSocket rules can only use 'GET', 'HEAD', and 'OPTIONS' methods." - ) - - self.methods = methods - self.endpoint: str = endpoint # type: ignore - self.redirect_to = redirect_to - - if defaults: - self.arguments = set(map(str, defaults)) - else: - self.arguments = set() - - self._trace: t.List[t.Tuple[bool, str]] = [] - - def empty(self) -> "Rule": - """ - Return an unbound copy of this rule. - - This can be useful if want to reuse an already bound URL for another - map. See ``get_empty_kwargs`` to override what keyword arguments are - provided to the new copy. - """ - return type(self)(self.rule, **self.get_empty_kwargs()) - - def get_empty_kwargs(self) -> t.Mapping[str, t.Any]: - """ - Provides kwargs for instantiating empty copy with empty() - - Use this method to provide custom keyword arguments to the subclass of - ``Rule`` when calling ``some_rule.empty()``. Helpful when the subclass - has custom keyword arguments that are needed at instantiation. - - Must return a ``dict`` that will be provided as kwargs to the new - instance of ``Rule``, following the initial ``self.rule`` value which - is always provided as the first, required positional argument. - """ - defaults = None - if self.defaults: - defaults = dict(self.defaults) - return dict( - defaults=defaults, - subdomain=self.subdomain, - methods=self.methods, - build_only=self.build_only, - endpoint=self.endpoint, - strict_slashes=self.strict_slashes, - redirect_to=self.redirect_to, - alias=self.alias, - host=self.host, - ) - - def get_rules(self, map: "Map") -> t.Iterator["Rule"]: - yield self - - def refresh(self) -> None: - """Rebinds and refreshes the URL. Call this if you modified the - rule in place. - - :internal: - """ - self.bind(self.map, rebind=True) - - def bind(self, map: "Map", rebind: bool = False) -> None: - """Bind the url to a map and create a regular expression based on - the information from the rule itself and the defaults from the map. - - :internal: - """ - if self.map is not None and not rebind: - raise RuntimeError(f"url rule {self!r} already bound to map {self.map!r}") - self.map = map - if self.strict_slashes is None: - self.strict_slashes = map.strict_slashes - if self.merge_slashes is None: - self.merge_slashes = map.merge_slashes - if self.subdomain is None: - self.subdomain = map.default_subdomain - self.compile() - - def get_converter( - self, - variable_name: str, - converter_name: str, - args: t.Tuple, - kwargs: t.Mapping[str, t.Any], - ) -> "BaseConverter": - """Looks up the converter for the given parameter. - - .. versionadded:: 0.9 - """ - if converter_name not in self.map.converters: - raise LookupError(f"the converter {converter_name!r} does not exist") - return self.map.converters[converter_name](self.map, *args, **kwargs) - - def _encode_query_vars(self, query_vars: t.Mapping[str, t.Any]) -> str: - return url_encode( - query_vars, - charset=self.map.charset, - sort=self.map.sort_parameters, - key=self.map.sort_key, - ) - - def compile(self) -> None: - """Compiles the regular expression and stores it.""" - assert self.map is not None, "rule not bound" - - if self.map.host_matching: - domain_rule = self.host or "" - else: - domain_rule = self.subdomain or "" - - self._trace = [] - self._converters: t.Dict[str, "BaseConverter"] = {} - self._static_weights: t.List[t.Tuple[int, int]] = [] - self._argument_weights: t.List[int] = [] - regex_parts = [] - - def _build_regex(rule: str) -> None: - index = 0 - for converter, arguments, variable in parse_rule(rule): - if converter is None: - for match in re.finditer(r"/+|[^/]+", variable): - part = match.group(0) - if part.startswith("/"): - if self.merge_slashes: - regex_parts.append(r"/+?") - self._trace.append((False, "/")) - else: - regex_parts.append(part) - self._trace.append((False, part)) - continue - self._trace.append((False, part)) - regex_parts.append(re.escape(part)) - if part: - self._static_weights.append((index, -len(part))) - else: - if arguments: - c_args, c_kwargs = parse_converter_args(arguments) - else: - c_args = () - c_kwargs = {} - convobj = self.get_converter(variable, converter, c_args, c_kwargs) - regex_parts.append(f"(?P<{variable}>{convobj.regex})") - self._converters[variable] = convobj - self._trace.append((True, variable)) - self._argument_weights.append(convobj.weight) - self.arguments.add(str(variable)) - index = index + 1 - - _build_regex(domain_rule) - regex_parts.append("\\|") - self._trace.append((False, "|")) - _build_regex(self.rule if self.is_leaf else self.rule.rstrip("/")) - if not self.is_leaf: - self._trace.append((False, "/")) - - self._build: t.Callable[..., t.Tuple[str, str]] - self._build = self._compile_builder(False).__get__(self, None) # type: ignore - self._build_unknown: t.Callable[..., t.Tuple[str, str]] - self._build_unknown = self._compile_builder(True).__get__( # type: ignore - self, None - ) - - if self.build_only: - return - - if not (self.is_leaf and self.strict_slashes): - reps = "*" if self.merge_slashes else "?" - tail = f"(?/{reps})" - else: - tail = "" - - regex = f"^{''.join(regex_parts)}{tail}$" - self._regex = re.compile(regex) - - def match( - self, path: str, method: t.Optional[str] = None - ) -> t.Optional[t.MutableMapping[str, t.Any]]: - """Check if the rule matches a given path. Path is a string in the - form ``"subdomain|/path"`` and is assembled by the map. If - the map is doing host matching the subdomain part will be the host - instead. - - If the rule matches a dict with the converted values is returned, - otherwise the return value is `None`. - - :internal: - """ - if not self.build_only: - require_redirect = False - - m = self._regex.search(path) - if m is not None: - groups = m.groupdict() - # we have a folder like part of the url without a trailing - # slash and strict slashes enabled. raise an exception that - # tells the map to redirect to the same url but with a - # trailing slash - if ( - self.strict_slashes - and not self.is_leaf - and not groups.pop("__suffix__") - and ( - method is None or self.methods is None or method in self.methods - ) - ): - path += "/" - require_redirect = True - # if we are not in strict slashes mode we have to remove - # a __suffix__ - elif not self.strict_slashes: - del groups["__suffix__"] - - result = {} - for name, value in groups.items(): - try: - value = self._converters[name].to_python(value) - except ValidationError: - return None - result[str(name)] = value - if self.defaults: - result.update(self.defaults) - - if self.merge_slashes: - new_path = "|".join(self.build(result, False)) # type: ignore - if path.endswith("/") and not new_path.endswith("/"): - new_path += "/" - if new_path.count("/") < path.count("/"): - path = new_path - require_redirect = True - - if require_redirect: - path = path.split("|", 1)[1] - raise RequestPath(path) - - if self.alias and self.map.redirect_defaults: - raise RequestAliasRedirect(result) - - return result - - return None - - @staticmethod - def _get_func_code(code: CodeType, name: str) -> t.Callable[..., t.Tuple[str, str]]: - globs: t.Dict[str, t.Any] = {} - locs: t.Dict[str, t.Any] = {} - exec(code, globs, locs) - return locs[name] # type: ignore - - def _compile_builder( - self, append_unknown: bool = True - ) -> t.Callable[..., t.Tuple[str, str]]: - defaults = self.defaults or {} - dom_ops: t.List[t.Tuple[bool, str]] = [] - url_ops: t.List[t.Tuple[bool, str]] = [] - - opl = dom_ops - for is_dynamic, data in self._trace: - if data == "|" and opl is dom_ops: - opl = url_ops - continue - # this seems like a silly case to ever come up but: - # if a default is given for a value that appears in the rule, - # resolve it to a constant ahead of time - if is_dynamic and data in defaults: - data = self._converters[data].to_url(defaults[data]) - opl.append((False, data)) - elif not is_dynamic: - opl.append( - (False, url_quote(_to_bytes(data, self.map.charset), safe="/:|+")) - ) - else: - opl.append((True, data)) - - def _convert(elem: str) -> ast.stmt: - ret = _prefix_names(_CALL_CONVERTER_CODE_FMT.format(elem=elem)) - ret.args = [ast.Name(str(elem), ast.Load())] # type: ignore # str for py2 - return ret - - def _parts(ops: t.List[t.Tuple[bool, str]]) -> t.List[ast.AST]: - parts = [ - _convert(elem) if is_dynamic else ast.Str(s=elem) - for is_dynamic, elem in ops - ] - parts = parts or [ast.Str("")] - # constant fold - ret = [parts[0]] - for p in parts[1:]: - if isinstance(p, ast.Str) and isinstance(ret[-1], ast.Str): - ret[-1] = ast.Str(ret[-1].s + p.s) - else: - ret.append(p) - return ret - - dom_parts = _parts(dom_ops) - url_parts = _parts(url_ops) - if not append_unknown: - body = [] - else: - body = [_IF_KWARGS_URL_ENCODE_AST] - url_parts.extend(_URL_ENCODE_AST_NAMES) - - def _join(parts: t.List[ast.AST]) -> ast.AST: - if len(parts) == 1: # shortcut - return parts[0] - return ast.JoinedStr(parts) - - body.append( - ast.Return(ast.Tuple([_join(dom_parts), _join(url_parts)], ast.Load())) - ) - - pargs = [ - elem - for is_dynamic, elem in dom_ops + url_ops - if is_dynamic and elem not in defaults - ] - kargs = [str(k) for k in defaults] - - func_ast: ast.FunctionDef = _prefix_names("def _(): pass") # type: ignore - func_ast.name = f"" - func_ast.args.args.append(ast.arg(".self", None)) - for arg in pargs + kargs: - func_ast.args.args.append(ast.arg(arg, None)) - func_ast.args.kwarg = ast.arg(".kwargs", None) - for _ in kargs: - func_ast.args.defaults.append(ast.Str("")) - func_ast.body = body - - # use `ast.parse` instead of `ast.Module` for better portability - # Python 3.8 changes the signature of `ast.Module` - module = ast.parse("") - module.body = [func_ast] - - # mark everything as on line 1, offset 0 - # less error-prone than `ast.fix_missing_locations` - # bad line numbers cause an assert to fail in debug builds - for node in ast.walk(module): - if "lineno" in node._attributes: - node.lineno = 1 - if "col_offset" in node._attributes: - node.col_offset = 0 - - code = compile(module, "", "exec") - return self._get_func_code(code, func_ast.name) - - def build( - self, values: t.Mapping[str, t.Any], append_unknown: bool = True - ) -> t.Optional[t.Tuple[str, str]]: - """Assembles the relative url for that rule and the subdomain. - If building doesn't work for some reasons `None` is returned. - - :internal: - """ - try: - if append_unknown: - return self._build_unknown(**values) - else: - return self._build(**values) - except ValidationError: - return None - - def provides_defaults_for(self, rule: "Rule") -> bool: - """Check if this rule has defaults for a given rule. - - :internal: - """ - return bool( - not self.build_only - and self.defaults - and self.endpoint == rule.endpoint - and self != rule - and self.arguments == rule.arguments - ) - - def suitable_for( - self, values: t.Mapping[str, t.Any], method: t.Optional[str] = None - ) -> bool: - """Check if the dict of values has enough data for url generation. - - :internal: - """ - # if a method was given explicitly and that method is not supported - # by this rule, this rule is not suitable. - if ( - method is not None - and self.methods is not None - and method not in self.methods - ): - return False - - defaults = self.defaults or () - - # all arguments required must be either in the defaults dict or - # the value dictionary otherwise it's not suitable - for key in self.arguments: - if key not in defaults and key not in values: - return False - - # in case defaults are given we ensure that either the value was - # skipped or the value is the same as the default value. - if defaults: - for key, value in defaults.items(): - if key in values and value != values[key]: - return False - - return True - - def match_compare_key( - self, - ) -> t.Tuple[bool, int, t.Iterable[t.Tuple[int, int]], int, t.Iterable[int]]: - """The match compare key for sorting. - - Current implementation: - - 1. rules without any arguments come first for performance - reasons only as we expect them to match faster and some - common ones usually don't have any arguments (index pages etc.) - 2. rules with more static parts come first so the second argument - is the negative length of the number of the static weights. - 3. we order by static weights, which is a combination of index - and length - 4. The more complex rules come first so the next argument is the - negative length of the number of argument weights. - 5. lastly we order by the actual argument weights. - - :internal: - """ - return ( - bool(self.arguments), - -len(self._static_weights), - self._static_weights, - -len(self._argument_weights), - self._argument_weights, - ) - - def build_compare_key(self) -> t.Tuple[int, int, int]: - """The build compare key for sorting. - - :internal: - """ - return (1 if self.alias else 0, -len(self.arguments), -len(self.defaults or ())) - - def __eq__(self, other: object) -> bool: - return isinstance(other, type(self)) and self._trace == other._trace - - __hash__ = None # type: ignore - - def __str__(self) -> str: - return self.rule - - def __repr__(self) -> str: - if self.map is None: - return f"<{type(self).__name__} (unbound)>" - parts = [] - for is_dynamic, data in self._trace: - if is_dynamic: - parts.append(f"<{data}>") - else: - parts.append(data) - parts = "".join(parts).lstrip("|") - methods = f" ({', '.join(self.methods)})" if self.methods is not None else "" - return f"<{type(self).__name__} {parts!r}{methods} -> {self.endpoint}>" - - -class BaseConverter: - """Base class for all converters.""" - - regex = "[^/]+" - weight = 100 - - def __init__(self, map: "Map", *args: t.Any, **kwargs: t.Any) -> None: - self.map = map - - def to_python(self, value: str) -> t.Any: - return value - - def to_url(self, value: t.Any) -> str: - if isinstance(value, (bytes, bytearray)): - return _fast_url_quote(value) - return _fast_url_quote(str(value).encode(self.map.charset)) - - -class UnicodeConverter(BaseConverter): - """This converter is the default converter and accepts any string but - only one path segment. Thus the string can not include a slash. - - This is the default validator. - - Example:: - - Rule('/pages/'), - Rule('/') - - :param map: the :class:`Map`. - :param minlength: the minimum length of the string. Must be greater - or equal 1. - :param maxlength: the maximum length of the string. - :param length: the exact length of the string. - """ - - def __init__( - self, - map: "Map", - minlength: int = 1, - maxlength: t.Optional[int] = None, - length: t.Optional[int] = None, - ) -> None: - super().__init__(map) - if length is not None: - length_regex = f"{{{int(length)}}}" - else: - if maxlength is None: - maxlength_value = "" - else: - maxlength_value = str(int(maxlength)) - length_regex = f"{{{int(minlength)},{maxlength_value}}}" - self.regex = f"[^/]{length_regex}" - - -class AnyConverter(BaseConverter): - """Matches one of the items provided. Items can either be Python - identifiers or strings:: - - Rule('/') - - :param map: the :class:`Map`. - :param items: this function accepts the possible items as positional - arguments. - """ - - def __init__(self, map: "Map", *items: str) -> None: - super().__init__(map) - self.regex = f"(?:{'|'.join([re.escape(x) for x in items])})" - - -class PathConverter(BaseConverter): - """Like the default :class:`UnicodeConverter`, but it also matches - slashes. This is useful for wikis and similar applications:: - - Rule('/') - Rule('//edit') - - :param map: the :class:`Map`. - """ - - regex = "[^/].*?" - weight = 200 - - -class NumberConverter(BaseConverter): - """Baseclass for `IntegerConverter` and `FloatConverter`. - - :internal: - """ - - weight = 50 - num_convert: t.Callable = int - - def __init__( - self, - map: "Map", - fixed_digits: int = 0, - min: t.Optional[int] = None, - max: t.Optional[int] = None, - signed: bool = False, - ) -> None: - if signed: - self.regex = self.signed_regex - super().__init__(map) - self.fixed_digits = fixed_digits - self.min = min - self.max = max - self.signed = signed - - def to_python(self, value: str) -> t.Any: - if self.fixed_digits and len(value) != self.fixed_digits: - raise ValidationError() - value = self.num_convert(value) - if (self.min is not None and value < self.min) or ( - self.max is not None and value > self.max - ): - raise ValidationError() - return value - - def to_url(self, value: t.Any) -> str: - value = str(self.num_convert(value)) - if self.fixed_digits: - value = value.zfill(self.fixed_digits) - return value - - @property - def signed_regex(self) -> str: - return f"-?{self.regex}" - - -class IntegerConverter(NumberConverter): - """This converter only accepts integer values:: - - Rule("/page/") - - By default it only accepts unsigned, positive values. The ``signed`` - parameter will enable signed, negative values. :: - - Rule("/page/") - - :param map: The :class:`Map`. - :param fixed_digits: The number of fixed digits in the URL. If you - set this to ``4`` for example, the rule will only match if the - URL looks like ``/0001/``. The default is variable length. - :param min: The minimal value. - :param max: The maximal value. - :param signed: Allow signed (negative) values. - - .. versionadded:: 0.15 - The ``signed`` parameter. - """ - - regex = r"\d+" - - -class FloatConverter(NumberConverter): - """This converter only accepts floating point values:: - - Rule("/probability/") - - By default it only accepts unsigned, positive values. The ``signed`` - parameter will enable signed, negative values. :: - - Rule("/offset/") - - :param map: The :class:`Map`. - :param min: The minimal value. - :param max: The maximal value. - :param signed: Allow signed (negative) values. - - .. versionadded:: 0.15 - The ``signed`` parameter. - """ - - regex = r"\d+\.\d+" - num_convert = float - - def __init__( - self, - map: "Map", - min: t.Optional[float] = None, - max: t.Optional[float] = None, - signed: bool = False, - ) -> None: - super().__init__(map, min=min, max=max, signed=signed) # type: ignore - - -class UUIDConverter(BaseConverter): - """This converter only accepts UUID strings:: - - Rule('/object/') - - .. versionadded:: 0.10 - - :param map: the :class:`Map`. - """ - - regex = ( - r"[A-Fa-f0-9]{8}-[A-Fa-f0-9]{4}-" - r"[A-Fa-f0-9]{4}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{12}" - ) - - def to_python(self, value: str) -> uuid.UUID: - return uuid.UUID(value) - - def to_url(self, value: uuid.UUID) -> str: - return str(value) - - -#: the default converter mapping for the map. -DEFAULT_CONVERTERS: t.Mapping[str, t.Type[BaseConverter]] = { - "default": UnicodeConverter, - "string": UnicodeConverter, - "any": AnyConverter, - "path": PathConverter, - "int": IntegerConverter, - "float": FloatConverter, - "uuid": UUIDConverter, -} - - -class Map: - """The map class stores all the URL rules and some configuration - parameters. Some of the configuration values are only stored on the - `Map` instance since those affect all rules, others are just defaults - and can be overridden for each rule. Note that you have to specify all - arguments besides the `rules` as keyword arguments! - - :param rules: sequence of url rules for this map. - :param default_subdomain: The default subdomain for rules without a - subdomain defined. - :param charset: charset of the url. defaults to ``"utf-8"`` - :param strict_slashes: If a rule ends with a slash but the matched - URL does not, redirect to the URL with a trailing slash. - :param merge_slashes: Merge consecutive slashes when matching or - building URLs. Matches will redirect to the normalized URL. - Slashes in variable parts are not merged. - :param redirect_defaults: This will redirect to the default rule if it - wasn't visited that way. This helps creating - unique URLs. - :param converters: A dict of converters that adds additional converters - to the list of converters. If you redefine one - converter this will override the original one. - :param sort_parameters: If set to `True` the url parameters are sorted. - See `url_encode` for more details. - :param sort_key: The sort key function for `url_encode`. - :param encoding_errors: the error method to use for decoding - :param host_matching: if set to `True` it enables the host matching - feature and disables the subdomain one. If - enabled the `host` parameter to rules is used - instead of the `subdomain` one. - - .. versionchanged:: 1.0 - If ``url_scheme`` is ``ws`` or ``wss``, only WebSocket rules - will match. - - .. versionchanged:: 1.0 - Added ``merge_slashes``. - - .. versionchanged:: 0.7 - Added ``encoding_errors`` and ``host_matching``. - - .. versionchanged:: 0.5 - Added ``sort_parameters`` and ``sort_key``. - """ - - #: A dict of default converters to be used. - default_converters = ImmutableDict(DEFAULT_CONVERTERS) - - #: The type of lock to use when updating. - #: - #: .. versionadded:: 1.0 - lock_class = Lock - - def __init__( - self, - rules: t.Optional[t.Iterable[RuleFactory]] = None, - default_subdomain: str = "", - charset: str = "utf-8", - strict_slashes: bool = True, - merge_slashes: bool = True, - redirect_defaults: bool = True, - converters: t.Optional[t.Mapping[str, t.Type[BaseConverter]]] = None, - sort_parameters: bool = False, - sort_key: t.Optional[t.Callable[[t.Any], t.Any]] = None, - encoding_errors: str = "replace", - host_matching: bool = False, - ) -> None: - self._rules: t.List[Rule] = [] - self._rules_by_endpoint: t.Dict[str, t.List[Rule]] = {} - self._remap = True - self._remap_lock = self.lock_class() - - self.default_subdomain = default_subdomain - self.charset = charset - self.encoding_errors = encoding_errors - self.strict_slashes = strict_slashes - self.merge_slashes = merge_slashes - self.redirect_defaults = redirect_defaults - self.host_matching = host_matching - - self.converters = self.default_converters.copy() - if converters: - self.converters.update(converters) - - self.sort_parameters = sort_parameters - self.sort_key = sort_key - - for rulefactory in rules or (): - self.add(rulefactory) - - def is_endpoint_expecting(self, endpoint: str, *arguments: str) -> bool: - """Iterate over all rules and check if the endpoint expects - the arguments provided. This is for example useful if you have - some URLs that expect a language code and others that do not and - you want to wrap the builder a bit so that the current language - code is automatically added if not provided but endpoints expect - it. - - :param endpoint: the endpoint to check. - :param arguments: this function accepts one or more arguments - as positional arguments. Each one of them is - checked. - """ - self.update() - arguments = set(arguments) - for rule in self._rules_by_endpoint[endpoint]: - if arguments.issubset(rule.arguments): - return True - return False - - def iter_rules(self, endpoint: t.Optional[str] = None) -> t.Iterator[Rule]: - """Iterate over all rules or the rules of an endpoint. - - :param endpoint: if provided only the rules for that endpoint - are returned. - :return: an iterator - """ - self.update() - if endpoint is not None: - return iter(self._rules_by_endpoint[endpoint]) - return iter(self._rules) - - def add(self, rulefactory: RuleFactory) -> None: - """Add a new rule or factory to the map and bind it. Requires that the - rule is not bound to another map. - - :param rulefactory: a :class:`Rule` or :class:`RuleFactory` - """ - for rule in rulefactory.get_rules(self): - rule.bind(self) - self._rules.append(rule) - self._rules_by_endpoint.setdefault(rule.endpoint, []).append(rule) - self._remap = True - - def bind( - self, - server_name: str, - script_name: t.Optional[str] = None, - subdomain: t.Optional[str] = None, - url_scheme: str = "http", - default_method: str = "GET", - path_info: t.Optional[str] = None, - query_args: t.Optional[t.Union[t.Mapping[str, t.Any], str]] = None, - ) -> "MapAdapter": - """Return a new :class:`MapAdapter` with the details specified to the - call. Note that `script_name` will default to ``'/'`` if not further - specified or `None`. The `server_name` at least is a requirement - because the HTTP RFC requires absolute URLs for redirects and so all - redirect exceptions raised by Werkzeug will contain the full canonical - URL. - - If no path_info is passed to :meth:`match` it will use the default path - info passed to bind. While this doesn't really make sense for - manual bind calls, it's useful if you bind a map to a WSGI - environment which already contains the path info. - - `subdomain` will default to the `default_subdomain` for this map if - no defined. If there is no `default_subdomain` you cannot use the - subdomain feature. - - .. versionchanged:: 1.0 - If ``url_scheme`` is ``ws`` or ``wss``, only WebSocket rules - will match. - - .. versionchanged:: 0.15 - ``path_info`` defaults to ``'/'`` if ``None``. - - .. versionchanged:: 0.8 - ``query_args`` can be a string. - - .. versionchanged:: 0.7 - Added ``query_args``. - """ - server_name = server_name.lower() - if self.host_matching: - if subdomain is not None: - raise RuntimeError("host matching enabled and a subdomain was provided") - elif subdomain is None: - subdomain = self.default_subdomain - if script_name is None: - script_name = "/" - if path_info is None: - path_info = "/" - try: - server_name = _encode_idna(server_name) # type: ignore - except UnicodeError: - raise BadHost() - return MapAdapter( - self, - server_name, - script_name, - subdomain, - url_scheme, - path_info, - default_method, - query_args, - ) - - def bind_to_environ( - self, - environ: "WSGIEnvironment", - server_name: t.Optional[str] = None, - subdomain: t.Optional[str] = None, - ) -> "MapAdapter": - """Like :meth:`bind` but you can pass it an WSGI environment and it - will fetch the information from that dictionary. Note that because of - limitations in the protocol there is no way to get the current - subdomain and real `server_name` from the environment. If you don't - provide it, Werkzeug will use `SERVER_NAME` and `SERVER_PORT` (or - `HTTP_HOST` if provided) as used `server_name` with disabled subdomain - feature. - - If `subdomain` is `None` but an environment and a server name is - provided it will calculate the current subdomain automatically. - Example: `server_name` is ``'example.com'`` and the `SERVER_NAME` - in the wsgi `environ` is ``'staging.dev.example.com'`` the calculated - subdomain will be ``'staging.dev'``. - - If the object passed as environ has an environ attribute, the value of - this attribute is used instead. This allows you to pass request - objects. Additionally `PATH_INFO` added as a default of the - :class:`MapAdapter` so that you don't have to pass the path info to - the match method. - - .. versionchanged:: 1.0.0 - If the passed server name specifies port 443, it will match - if the incoming scheme is ``https`` without a port. - - .. versionchanged:: 1.0.0 - A warning is shown when the passed server name does not - match the incoming WSGI server name. - - .. versionchanged:: 0.8 - This will no longer raise a ValueError when an unexpected server - name was passed. - - .. versionchanged:: 0.5 - previously this method accepted a bogus `calculate_subdomain` - parameter that did not have any effect. It was removed because - of that. - - :param environ: a WSGI environment. - :param server_name: an optional server name hint (see above). - :param subdomain: optionally the current subdomain (see above). - """ - environ = _get_environ(environ) - wsgi_server_name = get_host(environ).lower() - scheme = environ["wsgi.url_scheme"] - - if ( - environ.get("HTTP_CONNECTION", "").lower() == "upgrade" - and environ.get("HTTP_UPGRADE", "").lower() == "websocket" - ): - scheme = "wss" if scheme == "https" else "ws" - - if server_name is None: - server_name = wsgi_server_name - else: - server_name = server_name.lower() - - # strip standard port to match get_host() - if scheme in {"http", "ws"} and server_name.endswith(":80"): - server_name = server_name[:-3] - elif scheme in {"https", "wss"} and server_name.endswith(":443"): - server_name = server_name[:-4] - - if subdomain is None and not self.host_matching: - cur_server_name = wsgi_server_name.split(".") - real_server_name = server_name.split(".") - offset = -len(real_server_name) - - if cur_server_name[offset:] != real_server_name: - # This can happen even with valid configs if the server was - # accessed directly by IP address under some situations. - # Instead of raising an exception like in Werkzeug 0.7 or - # earlier we go by an invalid subdomain which will result - # in a 404 error on matching. - warnings.warn( - f"Current server name {wsgi_server_name!r} doesn't match configured" - f" server name {server_name!r}", - stacklevel=2, - ) - subdomain = "" - else: - subdomain = ".".join(filter(None, cur_server_name[:offset])) - - def _get_wsgi_string(name: str) -> t.Optional[str]: - val = environ.get(name) - if val is not None: - return _wsgi_decoding_dance(val, self.charset) - return None - - script_name = _get_wsgi_string("SCRIPT_NAME") - path_info = _get_wsgi_string("PATH_INFO") - query_args = _get_wsgi_string("QUERY_STRING") - return Map.bind( - self, - server_name, - script_name, - subdomain, - scheme, - environ["REQUEST_METHOD"], - path_info, - query_args=query_args, - ) - - def update(self) -> None: - """Called before matching and building to keep the compiled rules - in the correct order after things changed. - """ - if not self._remap: - return - - with self._remap_lock: - if not self._remap: - return - - self._rules.sort(key=lambda x: x.match_compare_key()) - for rules in self._rules_by_endpoint.values(): - rules.sort(key=lambda x: x.build_compare_key()) - self._remap = False - - def __repr__(self) -> str: - rules = self.iter_rules() - return f"{type(self).__name__}({pformat(list(rules))})" - - -class MapAdapter: - - """Returned by :meth:`Map.bind` or :meth:`Map.bind_to_environ` and does - the URL matching and building based on runtime information. - """ - - def __init__( - self, - map: Map, - server_name: str, - script_name: str, - subdomain: t.Optional[str], - url_scheme: str, - path_info: str, - default_method: str, - query_args: t.Optional[t.Union[t.Mapping[str, t.Any], str]] = None, - ): - self.map = map - self.server_name = _to_str(server_name) - script_name = _to_str(script_name) - if not script_name.endswith("/"): - script_name += "/" - self.script_name = script_name - self.subdomain = _to_str(subdomain) - self.url_scheme = _to_str(url_scheme) - self.path_info = _to_str(path_info) - self.default_method = _to_str(default_method) - self.query_args = query_args - self.websocket = self.url_scheme in {"ws", "wss"} - - def dispatch( - self, - view_func: t.Callable[[str, t.Mapping[str, t.Any]], "WSGIApplication"], - path_info: t.Optional[str] = None, - method: t.Optional[str] = None, - catch_http_exceptions: bool = False, - ) -> "WSGIApplication": - """Does the complete dispatching process. `view_func` is called with - the endpoint and a dict with the values for the view. It should - look up the view function, call it, and return a response object - or WSGI application. http exceptions are not caught by default - so that applications can display nicer error messages by just - catching them by hand. If you want to stick with the default - error messages you can pass it ``catch_http_exceptions=True`` and - it will catch the http exceptions. - - Here a small example for the dispatch usage:: - - from werkzeug.wrappers import Request, Response - from werkzeug.wsgi import responder - from werkzeug.routing import Map, Rule - - def on_index(request): - return Response('Hello from the index') - - url_map = Map([Rule('/', endpoint='index')]) - views = {'index': on_index} - - @responder - def application(environ, start_response): - request = Request(environ) - urls = url_map.bind_to_environ(environ) - return urls.dispatch(lambda e, v: views[e](request, **v), - catch_http_exceptions=True) - - Keep in mind that this method might return exception objects, too, so - use :class:`Response.force_type` to get a response object. - - :param view_func: a function that is called with the endpoint as - first argument and the value dict as second. Has - to dispatch to the actual view function with this - information. (see above) - :param path_info: the path info to use for matching. Overrides the - path info specified on binding. - :param method: the HTTP method used for matching. Overrides the - method specified on binding. - :param catch_http_exceptions: set to `True` to catch any of the - werkzeug :class:`HTTPException`\\s. - """ - try: - try: - endpoint, args = self.match(path_info, method) - except RequestRedirect as e: - return e - return view_func(endpoint, args) - except HTTPException as e: - if catch_http_exceptions: - return e - raise - - @typing.overload - def match( # type: ignore - self, - path_info: t.Optional[str] = None, - method: t.Optional[str] = None, - return_rule: "te.Literal[False]" = False, - query_args: t.Optional[t.Union[t.Mapping[str, t.Any], str]] = None, - websocket: t.Optional[bool] = None, - ) -> t.Tuple[str, t.Mapping[str, t.Any]]: - ... - - @typing.overload - def match( - self, - path_info: t.Optional[str] = None, - method: t.Optional[str] = None, - return_rule: "te.Literal[True]" = True, - query_args: t.Optional[t.Union[t.Mapping[str, t.Any], str]] = None, - websocket: t.Optional[bool] = None, - ) -> t.Tuple[Rule, t.Mapping[str, t.Any]]: - ... - - def match( - self, - path_info: t.Optional[str] = None, - method: t.Optional[str] = None, - return_rule: bool = False, - query_args: t.Optional[t.Union[t.Mapping[str, t.Any], str]] = None, - websocket: t.Optional[bool] = None, - ) -> t.Tuple[t.Union[str, Rule], t.Mapping[str, t.Any]]: - """The usage is simple: you just pass the match method the current - path info as well as the method (which defaults to `GET`). The - following things can then happen: - - - you receive a `NotFound` exception that indicates that no URL is - matching. A `NotFound` exception is also a WSGI application you - can call to get a default page not found page (happens to be the - same object as `werkzeug.exceptions.NotFound`) - - - you receive a `MethodNotAllowed` exception that indicates that there - is a match for this URL but not for the current request method. - This is useful for RESTful applications. - - - you receive a `RequestRedirect` exception with a `new_url` - attribute. This exception is used to notify you about a request - Werkzeug requests from your WSGI application. This is for example the - case if you request ``/foo`` although the correct URL is ``/foo/`` - You can use the `RequestRedirect` instance as response-like object - similar to all other subclasses of `HTTPException`. - - - you receive a ``WebsocketMismatch`` exception if the only - match is a WebSocket rule but the bind is an HTTP request, or - if the match is an HTTP rule but the bind is a WebSocket - request. - - - you get a tuple in the form ``(endpoint, arguments)`` if there is - a match (unless `return_rule` is True, in which case you get a tuple - in the form ``(rule, arguments)``) - - If the path info is not passed to the match method the default path - info of the map is used (defaults to the root URL if not defined - explicitly). - - All of the exceptions raised are subclasses of `HTTPException` so they - can be used as WSGI responses. They will all render generic error or - redirect pages. - - Here is a small example for matching: - - >>> m = Map([ - ... Rule('/', endpoint='index'), - ... Rule('/downloads/', endpoint='downloads/index'), - ... Rule('/downloads/', endpoint='downloads/show') - ... ]) - >>> urls = m.bind("example.com", "/") - >>> urls.match("/", "GET") - ('index', {}) - >>> urls.match("/downloads/42") - ('downloads/show', {'id': 42}) - - And here is what happens on redirect and missing URLs: - - >>> urls.match("/downloads") - Traceback (most recent call last): - ... - RequestRedirect: http://example.com/downloads/ - >>> urls.match("/missing") - Traceback (most recent call last): - ... - NotFound: 404 Not Found - - :param path_info: the path info to use for matching. Overrides the - path info specified on binding. - :param method: the HTTP method used for matching. Overrides the - method specified on binding. - :param return_rule: return the rule that matched instead of just the - endpoint (defaults to `False`). - :param query_args: optional query arguments that are used for - automatic redirects as string or dictionary. It's - currently not possible to use the query arguments - for URL matching. - :param websocket: Match WebSocket instead of HTTP requests. A - websocket request has a ``ws`` or ``wss`` - :attr:`url_scheme`. This overrides that detection. - - .. versionadded:: 1.0 - Added ``websocket``. - - .. versionchanged:: 0.8 - ``query_args`` can be a string. - - .. versionadded:: 0.7 - Added ``query_args``. - - .. versionadded:: 0.6 - Added ``return_rule``. - """ - self.map.update() - if path_info is None: - path_info = self.path_info - else: - path_info = _to_str(path_info, self.map.charset) - if query_args is None: - query_args = self.query_args or {} - method = (method or self.default_method).upper() - - if websocket is None: - websocket = self.websocket - - require_redirect = False - - domain_part = self.server_name if self.map.host_matching else self.subdomain - path_part = f"/{path_info.lstrip('/')}" if path_info else "" - path = f"{domain_part}|{path_part}" - - have_match_for = set() - websocket_mismatch = False - - for rule in self.map._rules: - try: - rv = rule.match(path, method) - except RequestPath as e: - raise RequestRedirect( - self.make_redirect_url( - url_quote(e.path_info, self.map.charset, safe="/:|+"), - query_args, - ) - ) - except RequestAliasRedirect as e: - raise RequestRedirect( - self.make_alias_redirect_url( - path, rule.endpoint, e.matched_values, method, query_args - ) - ) - if rv is None: - continue - if rule.methods is not None and method not in rule.methods: - have_match_for.update(rule.methods) - continue - - if rule.websocket != websocket: - websocket_mismatch = True - continue - - if self.map.redirect_defaults: - redirect_url = self.get_default_redirect(rule, method, rv, query_args) - if redirect_url is not None: - raise RequestRedirect(redirect_url) - - if rule.redirect_to is not None: - if isinstance(rule.redirect_to, str): - - def _handle_match(match: t.Match[str]) -> str: - value = rv[match.group(1)] # type: ignore - return rule._converters[match.group(1)].to_url(value) - - redirect_url = _simple_rule_re.sub(_handle_match, rule.redirect_to) - else: - redirect_url = rule.redirect_to(self, **rv) - - if self.subdomain: - netloc = f"{self.subdomain}.{self.server_name}" - else: - netloc = self.server_name - - raise RequestRedirect( - url_join( - f"{self.url_scheme or 'http'}://{netloc}{self.script_name}", - redirect_url, - ) - ) - - if require_redirect: - raise RequestRedirect( - self.make_redirect_url( - url_quote(path_info, self.map.charset, safe="/:|+"), query_args - ) - ) - - if return_rule: - return rule, rv - else: - return rule.endpoint, rv - - if have_match_for: - raise MethodNotAllowed(valid_methods=list(have_match_for)) - - if websocket_mismatch: - raise WebsocketMismatch() - - raise NotFound() - - def test( - self, path_info: t.Optional[str] = None, method: t.Optional[str] = None - ) -> bool: - """Test if a rule would match. Works like `match` but returns `True` - if the URL matches, or `False` if it does not exist. - - :param path_info: the path info to use for matching. Overrides the - path info specified on binding. - :param method: the HTTP method used for matching. Overrides the - method specified on binding. - """ - try: - self.match(path_info, method) - except RequestRedirect: - pass - except HTTPException: - return False - return True - - def allowed_methods(self, path_info: t.Optional[str] = None) -> t.Iterable[str]: - """Returns the valid methods that match for a given path. - - .. versionadded:: 0.7 - """ - try: - self.match(path_info, method="--") - except MethodNotAllowed as e: - return e.valid_methods # type: ignore - except HTTPException: - pass - return [] - - def get_host(self, domain_part: t.Optional[str]) -> str: - """Figures out the full host name for the given domain part. The - domain part is a subdomain in case host matching is disabled or - a full host name. - """ - if self.map.host_matching: - if domain_part is None: - return self.server_name - return _to_str(domain_part, "ascii") - subdomain = domain_part - if subdomain is None: - subdomain = self.subdomain - else: - subdomain = _to_str(subdomain, "ascii") - - if subdomain: - return f"{subdomain}.{self.server_name}" - else: - return self.server_name - - def get_default_redirect( - self, - rule: Rule, - method: str, - values: t.MutableMapping[str, t.Any], - query_args: t.Union[t.Mapping[str, t.Any], str], - ) -> t.Optional[str]: - """A helper that returns the URL to redirect to if it finds one. - This is used for default redirecting only. - - :internal: - """ - assert self.map.redirect_defaults - for r in self.map._rules_by_endpoint[rule.endpoint]: - # every rule that comes after this one, including ourself - # has a lower priority for the defaults. We order the ones - # with the highest priority up for building. - if r is rule: - break - if r.provides_defaults_for(rule) and r.suitable_for(values, method): - values.update(r.defaults) # type: ignore - domain_part, path = r.build(values) # type: ignore - return self.make_redirect_url(path, query_args, domain_part=domain_part) - return None - - def encode_query_args(self, query_args: t.Union[t.Mapping[str, t.Any], str]) -> str: - if not isinstance(query_args, str): - return url_encode(query_args, self.map.charset) - return query_args - - def make_redirect_url( - self, - path_info: str, - query_args: t.Optional[t.Union[t.Mapping[str, t.Any], str]] = None, - domain_part: t.Optional[str] = None, - ) -> str: - """Creates a redirect URL. - - :internal: - """ - if query_args: - suffix = f"?{self.encode_query_args(query_args)}" - else: - suffix = "" - - scheme = self.url_scheme or "http" - host = self.get_host(domain_part) - path = posixpath.join(self.script_name.strip("/"), path_info.lstrip("/")) - return f"{scheme}://{host}/{path}{suffix}" - - def make_alias_redirect_url( - self, - path: str, - endpoint: str, - values: t.Mapping[str, t.Any], - method: str, - query_args: t.Union[t.Mapping[str, t.Any], str], - ) -> str: - """Internally called to make an alias redirect URL.""" - url = self.build( - endpoint, values, method, append_unknown=False, force_external=True - ) - if query_args: - url += f"?{self.encode_query_args(query_args)}" - assert url != path, "detected invalid alias setting. No canonical URL found" - return url - - def _partial_build( - self, - endpoint: str, - values: t.Mapping[str, t.Any], - method: t.Optional[str], - append_unknown: bool, - ) -> t.Optional[t.Tuple[str, str, bool]]: - """Helper for :meth:`build`. Returns subdomain and path for the - rule that accepts this endpoint, values and method. - - :internal: - """ - # in case the method is none, try with the default method first - if method is None: - rv = self._partial_build( - endpoint, values, self.default_method, append_unknown - ) - if rv is not None: - return rv - - # Default method did not match or a specific method is passed. - # Check all for first match with matching host. If no matching - # host is found, go with first result. - first_match = None - - for rule in self.map._rules_by_endpoint.get(endpoint, ()): - if rule.suitable_for(values, method): - build_rv = rule.build(values, append_unknown) - - if build_rv is not None: - rv = (build_rv[0], build_rv[1], rule.websocket) - if self.map.host_matching: - if rv[0] == self.server_name: - return rv - elif first_match is None: - first_match = rv - else: - return rv - - return first_match - - def build( - self, - endpoint: str, - values: t.Optional[t.Mapping[str, t.Any]] = None, - method: t.Optional[str] = None, - force_external: bool = False, - append_unknown: bool = True, - url_scheme: t.Optional[str] = None, - ) -> str: - """Building URLs works pretty much the other way round. Instead of - `match` you call `build` and pass it the endpoint and a dict of - arguments for the placeholders. - - The `build` function also accepts an argument called `force_external` - which, if you set it to `True` will force external URLs. Per default - external URLs (include the server name) will only be used if the - target URL is on a different subdomain. - - >>> m = Map([ - ... Rule('/', endpoint='index'), - ... Rule('/downloads/', endpoint='downloads/index'), - ... Rule('/downloads/', endpoint='downloads/show') - ... ]) - >>> urls = m.bind("example.com", "/") - >>> urls.build("index", {}) - '/' - >>> urls.build("downloads/show", {'id': 42}) - '/downloads/42' - >>> urls.build("downloads/show", {'id': 42}, force_external=True) - 'http://example.com/downloads/42' - - Because URLs cannot contain non ASCII data you will always get - bytes back. Non ASCII characters are urlencoded with the - charset defined on the map instance. - - Additional values are converted to strings and appended to the URL as - URL querystring parameters: - - >>> urls.build("index", {'q': 'My Searchstring'}) - '/?q=My+Searchstring' - - When processing those additional values, lists are furthermore - interpreted as multiple values (as per - :py:class:`werkzeug.datastructures.MultiDict`): - - >>> urls.build("index", {'q': ['a', 'b', 'c']}) - '/?q=a&q=b&q=c' - - Passing a ``MultiDict`` will also add multiple values: - - >>> urls.build("index", MultiDict((('p', 'z'), ('q', 'a'), ('q', 'b')))) - '/?p=z&q=a&q=b' - - If a rule does not exist when building a `BuildError` exception is - raised. - - The build method accepts an argument called `method` which allows you - to specify the method you want to have an URL built for if you have - different methods for the same endpoint specified. - - :param endpoint: the endpoint of the URL to build. - :param values: the values for the URL to build. Unhandled values are - appended to the URL as query parameters. - :param method: the HTTP method for the rule if there are different - URLs for different methods on the same endpoint. - :param force_external: enforce full canonical external URLs. If the URL - scheme is not provided, this will generate - a protocol-relative URL. - :param append_unknown: unknown parameters are appended to the generated - URL as query string argument. Disable this - if you want the builder to ignore those. - :param url_scheme: Scheme to use in place of the bound - :attr:`url_scheme`. - - .. versionchanged:: 2.0 - Added the ``url_scheme`` parameter. - - .. versionadded:: 0.6 - Added the ``append_unknown`` parameter. - """ - self.map.update() - - if values: - temp_values: t.Dict[str, t.Union[t.List[t.Any], t.Any]] = {} - always_list = isinstance(values, MultiDict) - key: str - value: t.Optional[t.Union[t.List[t.Any], t.Any]] - - # For MultiDict, dict.items(values) is like values.lists() - # without the call or list coercion overhead. - for key, value in dict.items(values): # type: ignore - if value is None: - continue - - if always_list or isinstance(value, (list, tuple)): - value = [v for v in value if v is not None] - - if not value: - continue - - if len(value) == 1: - value = value[0] - - temp_values[key] = value - - values = temp_values - else: - values = {} - - rv = self._partial_build(endpoint, values, method, append_unknown) - if rv is None: - raise BuildError(endpoint, values, method, self) - - domain_part, path, websocket = rv - host = self.get_host(domain_part) - - if url_scheme is None: - url_scheme = self.url_scheme - - # Always build WebSocket routes with the scheme (browsers - # require full URLs). If bound to a WebSocket, ensure that HTTP - # routes are built with an HTTP scheme. - secure = url_scheme in {"https", "wss"} - - if websocket: - force_external = True - url_scheme = "wss" if secure else "ws" - elif url_scheme: - url_scheme = "https" if secure else "http" - - # shortcut this. - if not force_external and ( - (self.map.host_matching and host == self.server_name) - or (not self.map.host_matching and domain_part == self.subdomain) - ): - return f"{self.script_name.rstrip('/')}/{path.lstrip('/')}" - - scheme = f"{url_scheme}:" if url_scheme else "" - return f"{scheme}//{host}{self.script_name[:-1]}/{path.lstrip('/')}" diff --git a/venv/lib/python3.8/site-packages/werkzeug/sansio/__init__.py b/venv/lib/python3.8/site-packages/werkzeug/sansio/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/venv/lib/python3.8/site-packages/werkzeug/sansio/__pycache__/__init__.cpython-38.pyc b/venv/lib/python3.8/site-packages/werkzeug/sansio/__pycache__/__init__.cpython-38.pyc deleted file mode 100644 index beee1d68abd4457873e83df3d1c8cb125012d084..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 151 zcmWIL<>g`k0*>{+5&ryk0@& UEe@O9{FKt1R6CHVpMjVG09F(u&;S4c diff --git a/venv/lib/python3.8/site-packages/werkzeug/sansio/__pycache__/multipart.cpython-38.pyc b/venv/lib/python3.8/site-packages/werkzeug/sansio/__pycache__/multipart.cpython-38.pyc deleted file mode 100644 index e81ed64447c8b6702f32ee78ade210f6fcca404d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6506 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 du^DR6;EX$Z+S9gcP5U-OUB#{}->0g(3g| diff --git a/venv/lib/python3.8/site-packages/werkzeug/sansio/__pycache__/request.cpython-38.pyc b/venv/lib/python3.8/site-packages/werkzeug/sansio/__pycache__/request.cpython-38.pyc deleted file mode 100644 index cf619d9e9ff44f14202b89b9e2f10435bef05b05..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17161 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 R;aeyw#yIXC{U3kx{|ipYh}{4H diff --git a/venv/lib/python3.8/site-packages/werkzeug/sansio/__pycache__/response.cpython-38.pyc b/venv/lib/python3.8/site-packages/werkzeug/sansio/__pycache__/response.cpython-38.pyc deleted file mode 100644 index 21af9e1e66d1fd7d0d8a0ce000f931724d5b9f50..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21082 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 KG@{bafAJqyrZEEm diff --git a/venv/lib/python3.8/site-packages/werkzeug/sansio/multipart.py b/venv/lib/python3.8/site-packages/werkzeug/sansio/multipart.py deleted file mode 100644 index bb8ab34..0000000 --- a/venv/lib/python3.8/site-packages/werkzeug/sansio/multipart.py +++ /dev/null @@ -1,260 +0,0 @@ -import re -from dataclasses import dataclass -from enum import auto -from enum import Enum -from typing import cast -from typing import List -from typing import Optional -from typing import Tuple - -from .._internal import _to_bytes -from .._internal import _to_str -from ..datastructures import Headers -from ..exceptions import RequestEntityTooLarge -from ..http import parse_options_header - - -class Event: - pass - - -@dataclass(frozen=True) -class Preamble(Event): - data: bytes - - -@dataclass(frozen=True) -class Field(Event): - name: str - headers: Headers - - -@dataclass(frozen=True) -class File(Event): - name: str - filename: str - headers: Headers - - -@dataclass(frozen=True) -class Data(Event): - data: bytes - more_data: bool - - -@dataclass(frozen=True) -class Epilogue(Event): - data: bytes - - -class NeedData(Event): - pass - - -NEED_DATA = NeedData() - - -class State(Enum): - PREAMBLE = auto() - PART = auto() - DATA = auto() - EPILOGUE = auto() - COMPLETE = auto() - - -# Multipart line breaks MUST be CRLF (\r\n) by RFC-7578, except that -# many implementations break this and either use CR or LF alone. -LINE_BREAK = b"(?:\r\n|\n|\r)" -BLANK_LINE_RE = re.compile(b"(?:\r\n\r\n|\r\r|\n\n)", re.MULTILINE) -LINE_BREAK_RE = re.compile(LINE_BREAK, re.MULTILINE) -# Header values can be continued via a space or tab after the linebreak, as -# per RFC2231 -HEADER_CONTINUATION_RE = re.compile(b"%s[ \t]" % LINE_BREAK, re.MULTILINE) - - -class MultipartDecoder: - """Decodes a multipart message as bytes into Python events. - - The part data is returned as available to allow the caller to save - the data from memory to disk, if desired. - """ - - def __init__( - self, - boundary: bytes, - max_form_memory_size: Optional[int] = None, - ) -> None: - self.buffer = bytearray() - self.complete = False - self.max_form_memory_size = max_form_memory_size - self.state = State.PREAMBLE - self.boundary = boundary - - # Note in the below \h i.e. horizontal whitespace is used - # as [^\S\n\r] as \h isn't supported in python. - - # The preamble must end with a boundary where the boundary is - # prefixed by a line break, RFC2046. Except that many - # implementations including Werkzeug's tests omit the line - # break prefix. In addition the first boundary could be the - # epilogue boundary (for empty form-data) hence the matching - # group to understand if it is an epilogue boundary. - self.preamble_re = re.compile( - br"%s?--%s(--[^\S\n\r]*%s?|[^\S\n\r]*%s)" - % (LINE_BREAK, re.escape(boundary), LINE_BREAK, LINE_BREAK), - re.MULTILINE, - ) - # A boundary must include a line break prefix and suffix, and - # may include trailing whitespace. In addition the boundary - # could be the epilogue boundary hence the matching group to - # understand if it is an epilogue boundary. - self.boundary_re = re.compile( - br"%s--%s(--[^\S\n\r]*%s?|[^\S\n\r]*%s)" - % (LINE_BREAK, re.escape(boundary), LINE_BREAK, LINE_BREAK), - re.MULTILINE, - ) - - def last_newline(self) -> int: - try: - last_nl = self.buffer.rindex(b"\n") - except ValueError: - last_nl = len(self.buffer) - try: - last_cr = self.buffer.rindex(b"\r") - except ValueError: - last_cr = len(self.buffer) - - return min(last_nl, last_cr) - - def receive_data(self, data: Optional[bytes]) -> None: - if data is None: - self.complete = True - elif ( - self.max_form_memory_size is not None - and len(self.buffer) + len(data) > self.max_form_memory_size - ): - raise RequestEntityTooLarge() - else: - self.buffer.extend(data) - - def next_event(self) -> Event: - event: Event = NEED_DATA - - if self.state == State.PREAMBLE: - match = self.preamble_re.search(self.buffer) - if match is not None: - if match.group(1).startswith(b"--"): - self.state = State.EPILOGUE - else: - self.state = State.PART - data = bytes(self.buffer[: match.start()]) - del self.buffer[: match.end()] - event = Preamble(data=data) - - elif self.state == State.PART: - match = BLANK_LINE_RE.search(self.buffer) - if match is not None: - headers = self._parse_headers(self.buffer[: match.start()]) - del self.buffer[: match.end()] - - if "content-disposition" not in headers: - raise ValueError("Missing Content-Disposition header") - - disposition, extra = parse_options_header( - headers["content-disposition"] - ) - name = cast(str, extra.get("name")) - filename = extra.get("filename") - if filename is not None: - event = File( - filename=filename, - headers=headers, - name=name, - ) - else: - event = Field( - headers=headers, - name=name, - ) - self.state = State.DATA - - elif self.state == State.DATA: - if self.buffer.find(b"--" + self.boundary) == -1: - # No complete boundary in the buffer, but there may be - # a partial boundary at the end. As the boundary - # starts with either a nl or cr find the earliest and - # return up to that as data. - data_length = del_index = self.last_newline() - more_data = True - else: - match = self.boundary_re.search(self.buffer) - if match is not None: - if match.group(1).startswith(b"--"): - self.state = State.EPILOGUE - else: - self.state = State.PART - data_length = match.start() - del_index = match.end() - else: - data_length = del_index = self.last_newline() - more_data = match is None - - data = bytes(self.buffer[:data_length]) - del self.buffer[:del_index] - if data or not more_data: - event = Data(data=data, more_data=more_data) - - elif self.state == State.EPILOGUE and self.complete: - event = Epilogue(data=bytes(self.buffer)) - del self.buffer[:] - self.state = State.COMPLETE - - if self.complete and isinstance(event, NeedData): - raise ValueError(f"Invalid form-data cannot parse beyond {self.state}") - - return event - - def _parse_headers(self, data: bytes) -> Headers: - headers: List[Tuple[str, str]] = [] - # Merge the continued headers into one line - data = HEADER_CONTINUATION_RE.sub(b" ", data) - # Now there is one header per line - for line in data.splitlines(): - if line.strip() != b"": - name, value = _to_str(line).strip().split(":", 1) - headers.append((name.strip(), value.strip())) - return Headers(headers) - - -class MultipartEncoder: - def __init__(self, boundary: bytes) -> None: - self.boundary = boundary - self.state = State.PREAMBLE - - def send_event(self, event: Event) -> bytes: - if isinstance(event, Preamble) and self.state == State.PREAMBLE: - self.state = State.PART - return event.data - elif isinstance(event, (Field, File)) and self.state in { - State.PREAMBLE, - State.PART, - State.DATA, - }: - self.state = State.DATA - data = b"\r\n--" + self.boundary + b"\r\n" - data += b'Content-Disposition: form-data; name="%s"' % _to_bytes(event.name) - if isinstance(event, File): - data += b'; filename="%s"' % _to_bytes(event.filename) - data += b"\r\n" - for name, value in cast(Field, event).headers: - if name.lower() != "content-disposition": - data += _to_bytes(f"{name}: {value}\r\n") - data += b"\r\n" - return data - elif isinstance(event, Data) and self.state == State.DATA: - return event.data - elif isinstance(event, Epilogue): - self.state = State.COMPLETE - return b"\r\n--" + self.boundary + b"--\r\n" + event.data - else: - raise ValueError(f"Cannot generate {event} in state: {self.state}") diff --git a/venv/lib/python3.8/site-packages/werkzeug/sansio/request.py b/venv/lib/python3.8/site-packages/werkzeug/sansio/request.py deleted file mode 100644 index 2c21a21..0000000 --- a/venv/lib/python3.8/site-packages/werkzeug/sansio/request.py +++ /dev/null @@ -1,548 +0,0 @@ -import typing as t -from datetime import datetime - -from .._internal import _to_str -from ..datastructures import Accept -from ..datastructures import Authorization -from ..datastructures import CharsetAccept -from ..datastructures import ETags -from ..datastructures import Headers -from ..datastructures import HeaderSet -from ..datastructures import IfRange -from ..datastructures import ImmutableList -from ..datastructures import ImmutableMultiDict -from ..datastructures import LanguageAccept -from ..datastructures import MIMEAccept -from ..datastructures import MultiDict -from ..datastructures import Range -from ..datastructures import RequestCacheControl -from ..http import parse_accept_header -from ..http import parse_authorization_header -from ..http import parse_cache_control_header -from ..http import parse_cookie -from ..http import parse_date -from ..http import parse_etags -from ..http import parse_if_range_header -from ..http import parse_list_header -from ..http import parse_options_header -from ..http import parse_range_header -from ..http import parse_set_header -from ..urls import url_decode -from ..user_agent import UserAgent -from ..useragents import _UserAgent as _DeprecatedUserAgent -from ..utils import cached_property -from ..utils import header_property -from .utils import get_current_url -from .utils import get_host - - -class Request: - """Represents the non-IO parts of a HTTP request, including the - method, URL info, and headers. - - This class is not meant for general use. It should only be used when - implementing WSGI, ASGI, or another HTTP application spec. Werkzeug - provides a WSGI implementation at :cls:`werkzeug.wrappers.Request`. - - :param method: The method the request was made with, such as - ``GET``. - :param scheme: The URL scheme of the protocol the request used, such - as ``https`` or ``wss``. - :param server: The address of the server. ``(host, port)``, - ``(path, None)`` for unix sockets, or ``None`` if not known. - :param root_path: The prefix that the application is mounted under. - This is prepended to generated URLs, but is not part of route - matching. - :param path: The path part of the URL after ``root_path``. - :param query_string: The part of the URL after the "?". - :param headers: The headers received with the request. - :param remote_addr: The address of the client sending the request. - - .. versionadded:: 2.0 - """ - - #: The charset used to decode most data in the request. - charset = "utf-8" - - #: the error handling procedure for errors, defaults to 'replace' - encoding_errors = "replace" - - #: the class to use for `args` and `form`. The default is an - #: :class:`~werkzeug.datastructures.ImmutableMultiDict` which supports - #: multiple values per key. alternatively it makes sense to use an - #: :class:`~werkzeug.datastructures.ImmutableOrderedMultiDict` which - #: preserves order or a :class:`~werkzeug.datastructures.ImmutableDict` - #: which is the fastest but only remembers the last key. It is also - #: possible to use mutable structures, but this is not recommended. - #: - #: .. versionadded:: 0.6 - parameter_storage_class: t.Type[MultiDict] = ImmutableMultiDict - - #: The type to be used for dict values from the incoming WSGI - #: environment. (For example for :attr:`cookies`.) By default an - #: :class:`~werkzeug.datastructures.ImmutableMultiDict` is used. - #: - #: .. versionchanged:: 1.0.0 - #: Changed to ``ImmutableMultiDict`` to support multiple values. - #: - #: .. versionadded:: 0.6 - dict_storage_class: t.Type[MultiDict] = ImmutableMultiDict - - #: the type to be used for list values from the incoming WSGI environment. - #: By default an :class:`~werkzeug.datastructures.ImmutableList` is used - #: (for example for :attr:`access_list`). - #: - #: .. versionadded:: 0.6 - list_storage_class: t.Type[t.List] = ImmutableList - - user_agent_class = _DeprecatedUserAgent - """The class used and returned by the :attr:`user_agent` property to - parse the header. Defaults to - :class:`~werkzeug.user_agent.UserAgent`, which does no parsing. An - extension can provide a subclass that uses a parser to provide other - data. - - .. versionadded:: 2.0 - """ - - #: Valid host names when handling requests. By default all hosts are - #: trusted, which means that whatever the client says the host is - #: will be accepted. - #: - #: Because ``Host`` and ``X-Forwarded-Host`` headers can be set to - #: any value by a malicious client, it is recommended to either set - #: this property or implement similar validation in the proxy (if - #: the application is being run behind one). - #: - #: .. versionadded:: 0.9 - trusted_hosts: t.Optional[t.List[str]] = None - - def __init__( - self, - method: str, - scheme: str, - server: t.Optional[t.Tuple[str, t.Optional[int]]], - root_path: str, - path: str, - query_string: bytes, - headers: Headers, - remote_addr: t.Optional[str], - ) -> None: - #: The method the request was made with, such as ``GET``. - self.method = method.upper() - #: The URL scheme of the protocol the request used, such as - #: ``https`` or ``wss``. - self.scheme = scheme - #: The address of the server. ``(host, port)``, ``(path, None)`` - #: for unix sockets, or ``None`` if not known. - self.server = server - #: The prefix that the application is mounted under, without a - #: trailing slash. :attr:`path` comes after this. - self.root_path = root_path.rstrip("/") - #: The path part of the URL after :attr:`root_path`. This is the - #: path used for routing within the application. - self.path = "/" + path.lstrip("/") - #: The part of the URL after the "?". This is the raw value, use - #: :attr:`args` for the parsed values. - self.query_string = query_string - #: The headers received with the request. - self.headers = headers - #: The address of the client sending the request. - self.remote_addr = remote_addr - - def __repr__(self) -> str: - try: - url = self.url - except Exception as e: - url = f"(invalid URL: {e})" - - return f"<{type(self).__name__} {url!r} [{self.method}]>" - - @property - def url_charset(self) -> str: - """The charset that is assumed for URLs. Defaults to the value - of :attr:`charset`. - - .. versionadded:: 0.6 - """ - return self.charset - - @cached_property - def args(self) -> "MultiDict[str, str]": - """The parsed URL parameters (the part in the URL after the question - mark). - - By default an - :class:`~werkzeug.datastructures.ImmutableMultiDict` - is returned from this function. This can be changed by setting - :attr:`parameter_storage_class` to a different type. This might - be necessary if the order of the form data is important. - """ - return url_decode( - self.query_string, - self.url_charset, - errors=self.encoding_errors, - cls=self.parameter_storage_class, - ) - - @cached_property - def access_route(self) -> t.List[str]: - """If a forwarded header exists this is a list of all ip addresses - from the client ip to the last proxy server. - """ - if "X-Forwarded-For" in self.headers: - return self.list_storage_class( - parse_list_header(self.headers["X-Forwarded-For"]) - ) - elif self.remote_addr is not None: - return self.list_storage_class([self.remote_addr]) - return self.list_storage_class() - - @cached_property - def full_path(self) -> str: - """Requested path, including the query string.""" - return f"{self.path}?{_to_str(self.query_string, self.url_charset)}" - - @property - def is_secure(self) -> bool: - """``True`` if the request was made with a secure protocol - (HTTPS or WSS). - """ - return self.scheme in {"https", "wss"} - - @cached_property - def url(self) -> str: - """The full request URL with the scheme, host, root path, path, - and query string.""" - return get_current_url( - self.scheme, self.host, self.root_path, self.path, self.query_string - ) - - @cached_property - def base_url(self) -> str: - """Like :attr:`url` but without the query string.""" - return get_current_url(self.scheme, self.host, self.root_path, self.path) - - @cached_property - def root_url(self) -> str: - """The request URL scheme, host, and root path. This is the root - that the application is accessed from. - """ - return get_current_url(self.scheme, self.host, self.root_path) - - @cached_property - def host_url(self) -> str: - """The request URL scheme and host only.""" - return get_current_url(self.scheme, self.host) - - @cached_property - def host(self) -> str: - """The host name the request was made to, including the port if - it's non-standard. Validated with :attr:`trusted_hosts`. - """ - return get_host( - self.scheme, self.headers.get("host"), self.server, self.trusted_hosts - ) - - @cached_property - def cookies(self) -> "ImmutableMultiDict[str, str]": - """A :class:`dict` with the contents of all cookies transmitted with - the request.""" - wsgi_combined_cookie = ";".join(self.headers.getlist("Cookie")) - return parse_cookie( # type: ignore - wsgi_combined_cookie, - self.charset, - self.encoding_errors, - cls=self.dict_storage_class, - ) - - # Common Descriptors - - content_type = header_property[str]( - "Content-Type", - doc="""The Content-Type entity-header field indicates the media - type of the entity-body sent to the recipient or, in the case of - the HEAD method, the media type that would have been sent had - the request been a GET.""", - read_only=True, - ) - - @cached_property - def content_length(self) -> t.Optional[int]: - """The Content-Length entity-header field indicates the size of the - entity-body in bytes or, in the case of the HEAD method, the size of - the entity-body that would have been sent had the request been a - GET. - """ - if self.headers.get("Transfer-Encoding", "") == "chunked": - return None - - content_length = self.headers.get("Content-Length") - if content_length is not None: - try: - return max(0, int(content_length)) - except (ValueError, TypeError): - pass - - return None - - content_encoding = header_property[str]( - "Content-Encoding", - doc="""The Content-Encoding entity-header field is used as a - modifier to the media-type. When present, its value indicates - what additional content codings have been applied to the - entity-body, and thus what decoding mechanisms must be applied - in order to obtain the media-type referenced by the Content-Type - header field. - - .. versionadded:: 0.9""", - read_only=True, - ) - content_md5 = header_property[str]( - "Content-MD5", - doc="""The Content-MD5 entity-header field, as defined in - RFC 1864, is an MD5 digest of the entity-body for the purpose of - providing an end-to-end message integrity check (MIC) of the - entity-body. (Note: a MIC is good for detecting accidental - modification of the entity-body in transit, but is not proof - against malicious attacks.) - - .. versionadded:: 0.9""", - read_only=True, - ) - referrer = header_property[str]( - "Referer", - doc="""The Referer[sic] request-header field allows the client - to specify, for the server's benefit, the address (URI) of the - resource from which the Request-URI was obtained (the - "referrer", although the header field is misspelled).""", - read_only=True, - ) - date = header_property( - "Date", - None, - parse_date, - doc="""The Date general-header field represents the date and - time at which the message was originated, having the same - semantics as orig-date in RFC 822. - - .. versionchanged:: 2.0 - The datetime object is timezone-aware. - """, - read_only=True, - ) - max_forwards = header_property( - "Max-Forwards", - None, - int, - doc="""The Max-Forwards request-header field provides a - mechanism with the TRACE and OPTIONS methods to limit the number - of proxies or gateways that can forward the request to the next - inbound server.""", - read_only=True, - ) - - def _parse_content_type(self) -> None: - if not hasattr(self, "_parsed_content_type"): - self._parsed_content_type = parse_options_header( - self.headers.get("Content-Type", "") - ) - - @property - def mimetype(self) -> str: - """Like :attr:`content_type`, but without parameters (eg, without - charset, type etc.) and always lowercase. For example if the content - type is ``text/HTML; charset=utf-8`` the mimetype would be - ``'text/html'``. - """ - self._parse_content_type() - return self._parsed_content_type[0].lower() - - @property - def mimetype_params(self) -> t.Dict[str, str]: - """The mimetype parameters as dict. For example if the content - type is ``text/html; charset=utf-8`` the params would be - ``{'charset': 'utf-8'}``. - """ - self._parse_content_type() - return self._parsed_content_type[1] - - @cached_property - def pragma(self) -> HeaderSet: - """The Pragma general-header field is used to include - implementation-specific directives that might apply to any recipient - along the request/response chain. All pragma directives specify - optional behavior from the viewpoint of the protocol; however, some - systems MAY require that behavior be consistent with the directives. - """ - return parse_set_header(self.headers.get("Pragma", "")) - - # Accept - - @cached_property - def accept_mimetypes(self) -> MIMEAccept: - """List of mimetypes this client supports as - :class:`~werkzeug.datastructures.MIMEAccept` object. - """ - return parse_accept_header(self.headers.get("Accept"), MIMEAccept) - - @cached_property - def accept_charsets(self) -> CharsetAccept: - """List of charsets this client supports as - :class:`~werkzeug.datastructures.CharsetAccept` object. - """ - return parse_accept_header(self.headers.get("Accept-Charset"), CharsetAccept) - - @cached_property - def accept_encodings(self) -> Accept: - """List of encodings this client accepts. Encodings in a HTTP term - are compression encodings such as gzip. For charsets have a look at - :attr:`accept_charset`. - """ - return parse_accept_header(self.headers.get("Accept-Encoding")) - - @cached_property - def accept_languages(self) -> LanguageAccept: - """List of languages this client accepts as - :class:`~werkzeug.datastructures.LanguageAccept` object. - - .. versionchanged 0.5 - In previous versions this was a regular - :class:`~werkzeug.datastructures.Accept` object. - """ - return parse_accept_header(self.headers.get("Accept-Language"), LanguageAccept) - - # ETag - - @cached_property - def cache_control(self) -> RequestCacheControl: - """A :class:`~werkzeug.datastructures.RequestCacheControl` object - for the incoming cache control headers. - """ - cache_control = self.headers.get("Cache-Control") - return parse_cache_control_header(cache_control, None, RequestCacheControl) - - @cached_property - def if_match(self) -> ETags: - """An object containing all the etags in the `If-Match` header. - - :rtype: :class:`~werkzeug.datastructures.ETags` - """ - return parse_etags(self.headers.get("If-Match")) - - @cached_property - def if_none_match(self) -> ETags: - """An object containing all the etags in the `If-None-Match` header. - - :rtype: :class:`~werkzeug.datastructures.ETags` - """ - return parse_etags(self.headers.get("If-None-Match")) - - @cached_property - def if_modified_since(self) -> t.Optional[datetime]: - """The parsed `If-Modified-Since` header as a datetime object. - - .. versionchanged:: 2.0 - The datetime object is timezone-aware. - """ - return parse_date(self.headers.get("If-Modified-Since")) - - @cached_property - def if_unmodified_since(self) -> t.Optional[datetime]: - """The parsed `If-Unmodified-Since` header as a datetime object. - - .. versionchanged:: 2.0 - The datetime object is timezone-aware. - """ - return parse_date(self.headers.get("If-Unmodified-Since")) - - @cached_property - def if_range(self) -> IfRange: - """The parsed ``If-Range`` header. - - .. versionchanged:: 2.0 - ``IfRange.date`` is timezone-aware. - - .. versionadded:: 0.7 - """ - return parse_if_range_header(self.headers.get("If-Range")) - - @cached_property - def range(self) -> t.Optional[Range]: - """The parsed `Range` header. - - .. versionadded:: 0.7 - - :rtype: :class:`~werkzeug.datastructures.Range` - """ - return parse_range_header(self.headers.get("Range")) - - # User Agent - - @cached_property - def user_agent(self) -> UserAgent: - """The user agent. Use ``user_agent.string`` to get the header - value. Set :attr:`user_agent_class` to a subclass of - :class:`~werkzeug.user_agent.UserAgent` to provide parsing for - the other properties or other extended data. - - .. versionchanged:: 2.0 - The built in parser is deprecated and will be removed in - Werkzeug 2.1. A ``UserAgent`` subclass must be set to parse - data from the string. - """ - return self.user_agent_class(self.headers.get("User-Agent", "")) - - # Authorization - - @cached_property - def authorization(self) -> t.Optional[Authorization]: - """The `Authorization` object in parsed form.""" - return parse_authorization_header(self.headers.get("Authorization")) - - # CORS - - origin = header_property[str]( - "Origin", - doc=( - "The host that the request originated from. Set" - " :attr:`~CORSResponseMixin.access_control_allow_origin` on" - " the response to indicate which origins are allowed." - ), - read_only=True, - ) - - access_control_request_headers = header_property( - "Access-Control-Request-Headers", - load_func=parse_set_header, - doc=( - "Sent with a preflight request to indicate which headers" - " will be sent with the cross origin request. Set" - " :attr:`~CORSResponseMixin.access_control_allow_headers`" - " on the response to indicate which headers are allowed." - ), - read_only=True, - ) - - access_control_request_method = header_property[str]( - "Access-Control-Request-Method", - doc=( - "Sent with a preflight request to indicate which method" - " will be used for the cross origin request. Set" - " :attr:`~CORSResponseMixin.access_control_allow_methods`" - " on the response to indicate which methods are allowed." - ), - read_only=True, - ) - - @property - def is_json(self) -> bool: - """Check if the mimetype indicates JSON data, either - :mimetype:`application/json` or :mimetype:`application/*+json`. - """ - mt = self.mimetype - return ( - mt == "application/json" - or mt.startswith("application/") - and mt.endswith("+json") - ) diff --git a/venv/lib/python3.8/site-packages/werkzeug/sansio/response.py b/venv/lib/python3.8/site-packages/werkzeug/sansio/response.py deleted file mode 100644 index aedfcb0..0000000 --- a/venv/lib/python3.8/site-packages/werkzeug/sansio/response.py +++ /dev/null @@ -1,656 +0,0 @@ -import typing -import typing as t -from datetime import datetime -from datetime import timedelta -from datetime import timezone -from http import HTTPStatus - -from .._internal import _to_str -from ..datastructures import Headers -from ..datastructures import HeaderSet -from ..http import dump_cookie -from ..http import HTTP_STATUS_CODES -from ..utils import get_content_type -from werkzeug.datastructures import CallbackDict -from werkzeug.datastructures import ContentRange -from werkzeug.datastructures import ResponseCacheControl -from werkzeug.datastructures import WWWAuthenticate -from werkzeug.http import COEP -from werkzeug.http import COOP -from werkzeug.http import dump_age -from werkzeug.http import dump_csp_header -from werkzeug.http import dump_header -from werkzeug.http import dump_options_header -from werkzeug.http import http_date -from werkzeug.http import parse_age -from werkzeug.http import parse_cache_control_header -from werkzeug.http import parse_content_range_header -from werkzeug.http import parse_csp_header -from werkzeug.http import parse_date -from werkzeug.http import parse_options_header -from werkzeug.http import parse_set_header -from werkzeug.http import parse_www_authenticate_header -from werkzeug.http import quote_etag -from werkzeug.http import unquote_etag -from werkzeug.utils import header_property - - -def _set_property(name: str, doc: t.Optional[str] = None) -> property: - def fget(self: "Response") -> HeaderSet: - def on_update(header_set: HeaderSet) -> None: - if not header_set and name in self.headers: - del self.headers[name] - elif header_set: - self.headers[name] = header_set.to_header() - - return parse_set_header(self.headers.get(name), on_update) - - def fset( - self: "Response", - value: t.Optional[ - t.Union[str, t.Dict[str, t.Union[str, int]], t.Iterable[str]] - ], - ) -> None: - if not value: - del self.headers[name] - elif isinstance(value, str): - self.headers[name] = value - else: - self.headers[name] = dump_header(value) - - return property(fget, fset, doc=doc) - - -class Response: - """Represents the non-IO parts of an HTTP response, specifically the - status and headers but not the body. - - This class is not meant for general use. It should only be used when - implementing WSGI, ASGI, or another HTTP application spec. Werkzeug - provides a WSGI implementation at :cls:`werkzeug.wrappers.Response`. - - :param status: The status code for the response. Either an int, in - which case the default status message is added, or a string in - the form ``{code} {message}``, like ``404 Not Found``. Defaults - to 200. - :param headers: A :class:`~werkzeug.datastructures.Headers` object, - or a list of ``(key, value)`` tuples that will be converted to a - ``Headers`` object. - :param mimetype: The mime type (content type without charset or - other parameters) of the response. If the value starts with - ``text/`` (or matches some other special cases), the charset - will be added to create the ``content_type``. - :param content_type: The full content type of the response. - Overrides building the value from ``mimetype``. - - .. versionadded:: 2.0 - """ - - #: the charset of the response. - charset = "utf-8" - - #: the default status if none is provided. - default_status = 200 - - #: the default mimetype if none is provided. - default_mimetype = "text/plain" - - #: Warn if a cookie header exceeds this size. The default, 4093, should be - #: safely `supported by most browsers `_. A cookie larger than - #: this size will still be sent, but it may be ignored or handled - #: incorrectly by some browsers. Set to 0 to disable this check. - #: - #: .. versionadded:: 0.13 - #: - #: .. _`cookie`: http://browsercookielimits.squawky.net/ - max_cookie_size = 4093 - - # A :class:`Headers` object representing the response headers. - headers: Headers - - def __init__( - self, - status: t.Optional[t.Union[int, str, HTTPStatus]] = None, - headers: t.Optional[ - t.Union[ - t.Mapping[str, t.Union[str, int, t.Iterable[t.Union[str, int]]]], - t.Iterable[t.Tuple[str, t.Union[str, int]]], - ] - ] = None, - mimetype: t.Optional[str] = None, - content_type: t.Optional[str] = None, - ) -> None: - if isinstance(headers, Headers): - self.headers = headers - elif not headers: - self.headers = Headers() - else: - self.headers = Headers(headers) - - if content_type is None: - if mimetype is None and "content-type" not in self.headers: - mimetype = self.default_mimetype - if mimetype is not None: - mimetype = get_content_type(mimetype, self.charset) - content_type = mimetype - if content_type is not None: - self.headers["Content-Type"] = content_type - if status is None: - status = self.default_status - self.status = status # type: ignore - - def __repr__(self) -> str: - return f"<{type(self).__name__} [{self.status}]>" - - @property - def status_code(self) -> int: - """The HTTP status code as a number.""" - return self._status_code - - @status_code.setter - def status_code(self, code: int) -> None: - self.status = code # type: ignore - - @property - def status(self) -> str: - """The HTTP status code as a string.""" - return self._status - - @status.setter - def status(self, value: t.Union[str, int, HTTPStatus]) -> None: - if not isinstance(value, (str, bytes, int, HTTPStatus)): - raise TypeError("Invalid status argument") - - self._status, self._status_code = self._clean_status(value) - - def _clean_status(self, value: t.Union[str, int, HTTPStatus]) -> t.Tuple[str, int]: - if isinstance(value, HTTPStatus): - value = int(value) - status = _to_str(value, self.charset) - split_status = status.split(None, 1) - - if len(split_status) == 0: - raise ValueError("Empty status argument") - - if len(split_status) > 1: - if split_status[0].isdigit(): - # code and message - return status, int(split_status[0]) - - # multi-word message - return f"0 {status}", 0 - - if split_status[0].isdigit(): - # code only - status_code = int(split_status[0]) - - try: - status = f"{status_code} {HTTP_STATUS_CODES[status_code].upper()}" - except KeyError: - status = f"{status_code} UNKNOWN" - - return status, status_code - - # one-word message - return f"0 {status}", 0 - - def set_cookie( - self, - key: str, - value: str = "", - max_age: t.Optional[t.Union[timedelta, int]] = None, - expires: t.Optional[t.Union[str, datetime, int, float]] = None, - path: t.Optional[str] = "/", - domain: t.Optional[str] = None, - secure: bool = False, - httponly: bool = False, - samesite: t.Optional[str] = None, - ) -> None: - """Sets a cookie. - - A warning is raised if the size of the cookie header exceeds - :attr:`max_cookie_size`, but the header will still be set. - - :param key: the key (name) of the cookie to be set. - :param value: the value of the cookie. - :param max_age: should be a number of seconds, or `None` (default) if - the cookie should last only as long as the client's - browser session. - :param expires: should be a `datetime` object or UNIX timestamp. - :param path: limits the cookie to a given path, per default it will - span the whole domain. - :param domain: if you want to set a cross-domain cookie. For example, - ``domain=".example.com"`` will set a cookie that is - readable by the domain ``www.example.com``, - ``foo.example.com`` etc. Otherwise, a cookie will only - be readable by the domain that set it. - :param secure: If ``True``, the cookie will only be available - via HTTPS. - :param httponly: Disallow JavaScript access to the cookie. - :param samesite: Limit the scope of the cookie to only be - attached to requests that are "same-site". - """ - self.headers.add( - "Set-Cookie", - dump_cookie( - key, - value=value, - max_age=max_age, - expires=expires, - path=path, - domain=domain, - secure=secure, - httponly=httponly, - charset=self.charset, - max_size=self.max_cookie_size, - samesite=samesite, - ), - ) - - def delete_cookie( - self, - key: str, - path: str = "/", - domain: t.Optional[str] = None, - secure: bool = False, - httponly: bool = False, - samesite: t.Optional[str] = None, - ) -> None: - """Delete a cookie. Fails silently if key doesn't exist. - - :param key: the key (name) of the cookie to be deleted. - :param path: if the cookie that should be deleted was limited to a - path, the path has to be defined here. - :param domain: if the cookie that should be deleted was limited to a - domain, that domain has to be defined here. - :param secure: If ``True``, the cookie will only be available - via HTTPS. - :param httponly: Disallow JavaScript access to the cookie. - :param samesite: Limit the scope of the cookie to only be - attached to requests that are "same-site". - """ - self.set_cookie( - key, - expires=0, - max_age=0, - path=path, - domain=domain, - secure=secure, - httponly=httponly, - samesite=samesite, - ) - - @property - def is_json(self) -> bool: - """Check if the mimetype indicates JSON data, either - :mimetype:`application/json` or :mimetype:`application/*+json`. - """ - mt = self.mimetype - return mt is not None and ( - mt == "application/json" - or mt.startswith("application/") - and mt.endswith("+json") - ) - - # Common Descriptors - - @property - def mimetype(self) -> t.Optional[str]: - """The mimetype (content type without charset etc.)""" - ct = self.headers.get("content-type") - - if ct: - return ct.split(";")[0].strip() - else: - return None - - @mimetype.setter - def mimetype(self, value: str) -> None: - self.headers["Content-Type"] = get_content_type(value, self.charset) - - @property - def mimetype_params(self) -> t.Dict[str, str]: - """The mimetype parameters as dict. For example if the - content type is ``text/html; charset=utf-8`` the params would be - ``{'charset': 'utf-8'}``. - - .. versionadded:: 0.5 - """ - - def on_update(d: t.Dict[str, str]) -> None: - self.headers["Content-Type"] = dump_options_header(self.mimetype, d) - - d = parse_options_header(self.headers.get("content-type", ""))[1] - return CallbackDict(d, on_update) - - location = header_property[str]( - "Location", - doc="""The Location response-header field is used to redirect - the recipient to a location other than the Request-URI for - completion of the request or identification of a new - resource.""", - ) - age = header_property( - "Age", - None, - parse_age, - dump_age, # type: ignore - doc="""The Age response-header field conveys the sender's - estimate of the amount of time since the response (or its - revalidation) was generated at the origin server. - - Age values are non-negative decimal integers, representing time - in seconds.""", - ) - content_type = header_property[str]( - "Content-Type", - doc="""The Content-Type entity-header field indicates the media - type of the entity-body sent to the recipient or, in the case of - the HEAD method, the media type that would have been sent had - the request been a GET.""", - ) - content_length = header_property( - "Content-Length", - None, - int, - str, - doc="""The Content-Length entity-header field indicates the size - of the entity-body, in decimal number of OCTETs, sent to the - recipient or, in the case of the HEAD method, the size of the - entity-body that would have been sent had the request been a - GET.""", - ) - content_location = header_property[str]( - "Content-Location", - doc="""The Content-Location entity-header field MAY be used to - supply the resource location for the entity enclosed in the - message when that entity is accessible from a location separate - from the requested resource's URI.""", - ) - content_encoding = header_property[str]( - "Content-Encoding", - doc="""The Content-Encoding entity-header field is used as a - modifier to the media-type. When present, its value indicates - what additional content codings have been applied to the - entity-body, and thus what decoding mechanisms must be applied - in order to obtain the media-type referenced by the Content-Type - header field.""", - ) - content_md5 = header_property[str]( - "Content-MD5", - doc="""The Content-MD5 entity-header field, as defined in - RFC 1864, is an MD5 digest of the entity-body for the purpose of - providing an end-to-end message integrity check (MIC) of the - entity-body. (Note: a MIC is good for detecting accidental - modification of the entity-body in transit, but is not proof - against malicious attacks.)""", - ) - date = header_property( - "Date", - None, - parse_date, - http_date, - doc="""The Date general-header field represents the date and - time at which the message was originated, having the same - semantics as orig-date in RFC 822. - - .. versionchanged:: 2.0 - The datetime object is timezone-aware. - """, - ) - expires = header_property( - "Expires", - None, - parse_date, - http_date, - doc="""The Expires entity-header field gives the date/time after - which the response is considered stale. A stale cache entry may - not normally be returned by a cache. - - .. versionchanged:: 2.0 - The datetime object is timezone-aware. - """, - ) - last_modified = header_property( - "Last-Modified", - None, - parse_date, - http_date, - doc="""The Last-Modified entity-header field indicates the date - and time at which the origin server believes the variant was - last modified. - - .. versionchanged:: 2.0 - The datetime object is timezone-aware. - """, - ) - - @property - def retry_after(self) -> t.Optional[datetime]: - """The Retry-After response-header field can be used with a - 503 (Service Unavailable) response to indicate how long the - service is expected to be unavailable to the requesting client. - - Time in seconds until expiration or date. - - .. versionchanged:: 2.0 - The datetime object is timezone-aware. - """ - value = self.headers.get("retry-after") - if value is None: - return None - elif value.isdigit(): - return datetime.now(timezone.utc) + timedelta(seconds=int(value)) - return parse_date(value) - - @retry_after.setter - def retry_after(self, value: t.Optional[t.Union[datetime, int, str]]) -> None: - if value is None: - if "retry-after" in self.headers: - del self.headers["retry-after"] - return - elif isinstance(value, datetime): - value = http_date(value) - else: - value = str(value) - self.headers["Retry-After"] = value - - vary = _set_property( - "Vary", - doc="""The Vary field value indicates the set of request-header - fields that fully determines, while the response is fresh, - whether a cache is permitted to use the response to reply to a - subsequent request without revalidation.""", - ) - content_language = _set_property( - "Content-Language", - doc="""The Content-Language entity-header field describes the - natural language(s) of the intended audience for the enclosed - entity. Note that this might not be equivalent to all the - languages used within the entity-body.""", - ) - allow = _set_property( - "Allow", - doc="""The Allow entity-header field lists the set of methods - supported by the resource identified by the Request-URI. The - purpose of this field is strictly to inform the recipient of - valid methods associated with the resource. An Allow header - field MUST be present in a 405 (Method Not Allowed) - response.""", - ) - - # ETag - - @property - def cache_control(self) -> ResponseCacheControl: - """The Cache-Control general-header field is used to specify - directives that MUST be obeyed by all caching mechanisms along the - request/response chain. - """ - - def on_update(cache_control: ResponseCacheControl) -> None: - if not cache_control and "cache-control" in self.headers: - del self.headers["cache-control"] - elif cache_control: - self.headers["Cache-Control"] = cache_control.to_header() - - return parse_cache_control_header( - self.headers.get("cache-control"), on_update, ResponseCacheControl - ) - - def set_etag(self, etag: str, weak: bool = False) -> None: - """Set the etag, and override the old one if there was one.""" - self.headers["ETag"] = quote_etag(etag, weak) - - def get_etag(self) -> t.Union[t.Tuple[str, bool], t.Tuple[None, None]]: - """Return a tuple in the form ``(etag, is_weak)``. If there is no - ETag the return value is ``(None, None)``. - """ - return unquote_etag(self.headers.get("ETag")) - - accept_ranges = header_property[str]( - "Accept-Ranges", - doc="""The `Accept-Ranges` header. Even though the name would - indicate that multiple values are supported, it must be one - string token only. - - The values ``'bytes'`` and ``'none'`` are common. - - .. versionadded:: 0.7""", - ) - - @property - def content_range(self) -> ContentRange: - """The ``Content-Range`` header as a - :class:`~werkzeug.datastructures.ContentRange` object. Available - even if the header is not set. - - .. versionadded:: 0.7 - """ - - def on_update(rng: ContentRange) -> None: - if not rng: - del self.headers["content-range"] - else: - self.headers["Content-Range"] = rng.to_header() - - rv = parse_content_range_header(self.headers.get("content-range"), on_update) - # always provide a content range object to make the descriptor - # more user friendly. It provides an unset() method that can be - # used to remove the header quickly. - if rv is None: - rv = ContentRange(None, None, None, on_update=on_update) - return rv - - @content_range.setter - def content_range(self, value: t.Optional[t.Union[ContentRange, str]]) -> None: - if not value: - del self.headers["content-range"] - elif isinstance(value, str): - self.headers["Content-Range"] = value - else: - self.headers["Content-Range"] = value.to_header() - - # Authorization - - @property - def www_authenticate(self) -> WWWAuthenticate: - """The ``WWW-Authenticate`` header in a parsed form.""" - - def on_update(www_auth: WWWAuthenticate) -> None: - if not www_auth and "www-authenticate" in self.headers: - del self.headers["www-authenticate"] - elif www_auth: - self.headers["WWW-Authenticate"] = www_auth.to_header() - - header = self.headers.get("www-authenticate") - return parse_www_authenticate_header(header, on_update) - - # CSP - - content_security_policy = header_property( - "Content-Security-Policy", - None, - parse_csp_header, # type: ignore - dump_csp_header, - doc="""The Content-Security-Policy header adds an additional layer of - security to help detect and mitigate certain types of attacks.""", - ) - content_security_policy_report_only = header_property( - "Content-Security-Policy-Report-Only", - None, - parse_csp_header, # type: ignore - dump_csp_header, - doc="""The Content-Security-Policy-Report-Only header adds a csp policy - that is not enforced but is reported thereby helping detect - certain types of attacks.""", - ) - - # CORS - - @property - def access_control_allow_credentials(self) -> bool: - """Whether credentials can be shared by the browser to - JavaScript code. As part of the preflight request it indicates - whether credentials can be used on the cross origin request. - """ - return "Access-Control-Allow-Credentials" in self.headers - - @access_control_allow_credentials.setter - def access_control_allow_credentials(self, value: t.Optional[bool]) -> None: - if value is True: - self.headers["Access-Control-Allow-Credentials"] = "true" - else: - self.headers.pop("Access-Control-Allow-Credentials", None) - - access_control_allow_headers = header_property( - "Access-Control-Allow-Headers", - load_func=parse_set_header, - dump_func=dump_header, - doc="Which headers can be sent with the cross origin request.", - ) - - access_control_allow_methods = header_property( - "Access-Control-Allow-Methods", - load_func=parse_set_header, - dump_func=dump_header, - doc="Which methods can be used for the cross origin request.", - ) - - access_control_allow_origin = header_property[str]( - "Access-Control-Allow-Origin", - doc="The origin or '*' for any origin that may make cross origin requests.", - ) - - access_control_expose_headers = header_property( - "Access-Control-Expose-Headers", - load_func=parse_set_header, - dump_func=dump_header, - doc="Which headers can be shared by the browser to JavaScript code.", - ) - - access_control_max_age = header_property( - "Access-Control-Max-Age", - load_func=int, - dump_func=str, - doc="The maximum age in seconds the access control settings can be cached for.", - ) - - cross_origin_opener_policy = header_property[COOP]( - "Cross-Origin-Opener-Policy", - load_func=lambda value: COOP(value), - dump_func=lambda value: value.value, - default=COOP.UNSAFE_NONE, - doc="""Allows control over sharing of browsing context group with cross-origin - documents. Values must be a member of the :class:`werkzeug.http.COOP` enum.""", - ) - - cross_origin_embedder_policy = header_property[COEP]( - "Cross-Origin-Embedder-Policy", - load_func=lambda value: COEP(value), - dump_func=lambda value: value.value, - default=COEP.UNSAFE_NONE, - doc="""Prevents a document from loading any cross-origin resources that do not - explicitly grant the document permission. Values must be a member of the - :class:`werkzeug.http.COEP` enum.""", - ) diff --git a/venv/lib/python3.8/site-packages/werkzeug/sansio/utils.py b/venv/lib/python3.8/site-packages/werkzeug/sansio/utils.py deleted file mode 100644 index 1b4d892..0000000 --- a/venv/lib/python3.8/site-packages/werkzeug/sansio/utils.py +++ /dev/null @@ -1,142 +0,0 @@ -import typing as t - -from .._internal import _encode_idna -from ..exceptions import SecurityError -from ..urls import uri_to_iri -from ..urls import url_quote - - -def host_is_trusted(hostname: str, trusted_list: t.Iterable[str]) -> bool: - """Check if a host matches a list of trusted names. - - :param hostname: The name to check. - :param trusted_list: A list of valid names to match. If a name - starts with a dot it will match all subdomains. - - .. versionadded:: 0.9 - """ - if not hostname: - return False - - if isinstance(trusted_list, str): - trusted_list = [trusted_list] - - def _normalize(hostname: str) -> bytes: - if ":" in hostname: - hostname = hostname.rsplit(":", 1)[0] - - return _encode_idna(hostname) - - try: - hostname_bytes = _normalize(hostname) - except UnicodeError: - return False - - for ref in trusted_list: - if ref.startswith("."): - ref = ref[1:] - suffix_match = True - else: - suffix_match = False - - try: - ref_bytes = _normalize(ref) - except UnicodeError: - return False - - if ref_bytes == hostname_bytes: - return True - - if suffix_match and hostname_bytes.endswith(b"." + ref_bytes): - return True - - return False - - -def get_host( - scheme: str, - host_header: t.Optional[str], - server: t.Optional[t.Tuple[str, t.Optional[int]]] = None, - trusted_hosts: t.Optional[t.Iterable[str]] = None, -) -> str: - """Return the host for the given parameters. - - This first checks the ``host_header``. If it's not present, then - ``server`` is used. The host will only contain the port if it is - different than the standard port for the protocol. - - Optionally, verify that the host is trusted using - :func:`host_is_trusted` and raise a - :exc:`~werkzeug.exceptions.SecurityError` if it is not. - - :param scheme: The protocol the request used, like ``"https"``. - :param host_header: The ``Host`` header value. - :param server: Address of the server. ``(host, port)``, or - ``(path, None)`` for unix sockets. - :param trusted_hosts: A list of trusted host names. - - :return: Host, with port if necessary. - :raise ~werkzeug.exceptions.SecurityError: If the host is not - trusted. - """ - host = "" - - if host_header is not None: - host = host_header - elif server is not None: - host = server[0] - - if server[1] is not None: - host = f"{host}:{server[1]}" - - if scheme in {"http", "ws"} and host.endswith(":80"): - host = host[:-3] - elif scheme in {"https", "wss"} and host.endswith(":443"): - host = host[:-4] - - if trusted_hosts is not None: - if not host_is_trusted(host, trusted_hosts): - raise SecurityError(f"Host {host!r} is not trusted.") - - return host - - -def get_current_url( - scheme: str, - host: str, - root_path: t.Optional[str] = None, - path: t.Optional[str] = None, - query_string: t.Optional[bytes] = None, -) -> str: - """Recreate the URL for a request. If an optional part isn't - provided, it and subsequent parts are not included in the URL. - - The URL is an IRI, not a URI, so it may contain Unicode characters. - Use :func:`~werkzeug.urls.iri_to_uri` to convert it to ASCII. - - :param scheme: The protocol the request used, like ``"https"``. - :param host: The host the request was made to. See :func:`get_host`. - :param root_path: Prefix that the application is mounted under. This - is prepended to ``path``. - :param path: The path part of the URL after ``root_path``. - :param query_string: The portion of the URL after the "?". - """ - url = [scheme, "://", host] - - if root_path is None: - url.append("/") - return uri_to_iri("".join(url)) - - url.append(url_quote(root_path.rstrip("/"))) - url.append("/") - - if path is None: - return uri_to_iri("".join(url)) - - url.append(url_quote(path.lstrip("/"))) - - if query_string: - url.append("?") - url.append(url_quote(query_string, safe=":&%=+$!*'(),")) - - return uri_to_iri("".join(url)) diff --git a/venv/lib/python3.8/site-packages/werkzeug/security.py b/venv/lib/python3.8/site-packages/werkzeug/security.py deleted file mode 100644 index e23040a..0000000 --- a/venv/lib/python3.8/site-packages/werkzeug/security.py +++ /dev/null @@ -1,247 +0,0 @@ -import hashlib -import hmac -import os -import posixpath -import secrets -import typing as t -import warnings - -if t.TYPE_CHECKING: - pass - -SALT_CHARS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" -DEFAULT_PBKDF2_ITERATIONS = 260000 - -_os_alt_seps: t.List[str] = list( - sep for sep in [os.path.sep, os.path.altsep] if sep is not None and sep != "/" -) - - -def pbkdf2_hex( - data: t.Union[str, bytes], - salt: t.Union[str, bytes], - iterations: int = DEFAULT_PBKDF2_ITERATIONS, - keylen: t.Optional[int] = None, - hashfunc: t.Optional[t.Union[str, t.Callable]] = None, -) -> str: - """Like :func:`pbkdf2_bin`, but returns a hex-encoded string. - - :param data: the data to derive. - :param salt: the salt for the derivation. - :param iterations: the number of iterations. - :param keylen: the length of the resulting key. If not provided, - the digest size will be used. - :param hashfunc: the hash function to use. This can either be the - string name of a known hash function, or a function - from the hashlib module. Defaults to sha256. - - .. deprecated:: 2.0 - Will be removed in Werkzeug 2.1. Use :func:`hashlib.pbkdf2_hmac` - instead. - - .. versionadded:: 0.9 - """ - warnings.warn( - "'pbkdf2_hex' is deprecated and will be removed in Werkzeug" - " 2.1. Use 'hashlib.pbkdf2_hmac().hex()' instead.", - DeprecationWarning, - stacklevel=2, - ) - return pbkdf2_bin(data, salt, iterations, keylen, hashfunc).hex() - - -def pbkdf2_bin( - data: t.Union[str, bytes], - salt: t.Union[str, bytes], - iterations: int = DEFAULT_PBKDF2_ITERATIONS, - keylen: t.Optional[int] = None, - hashfunc: t.Optional[t.Union[str, t.Callable]] = None, -) -> bytes: - """Returns a binary digest for the PBKDF2 hash algorithm of `data` - with the given `salt`. It iterates `iterations` times and produces a - key of `keylen` bytes. By default, SHA-256 is used as hash function; - a different hashlib `hashfunc` can be provided. - - :param data: the data to derive. - :param salt: the salt for the derivation. - :param iterations: the number of iterations. - :param keylen: the length of the resulting key. If not provided - the digest size will be used. - :param hashfunc: the hash function to use. This can either be the - string name of a known hash function or a function - from the hashlib module. Defaults to sha256. - - .. deprecated:: 2.0 - Will be removed in Werkzeug 2.1. Use :func:`hashlib.pbkdf2_hmac` - instead. - - .. versionadded:: 0.9 - """ - warnings.warn( - "'pbkdf2_bin' is deprecated and will be removed in Werkzeug" - " 2.1. Use 'hashlib.pbkdf2_hmac()' instead.", - DeprecationWarning, - stacklevel=2, - ) - - if isinstance(data, str): - data = data.encode("utf8") - - if isinstance(salt, str): - salt = salt.encode("utf8") - - if not hashfunc: - hash_name = "sha256" - elif callable(hashfunc): - hash_name = hashfunc().name - else: - hash_name = hashfunc - - return hashlib.pbkdf2_hmac(hash_name, data, salt, iterations, keylen) - - -def safe_str_cmp(a: str, b: str) -> bool: - """This function compares strings in somewhat constant time. This - requires that the length of at least one string is known in advance. - - Returns `True` if the two strings are equal, or `False` if they are not. - - .. deprecated:: 2.0 - Will be removed in Werkzeug 2.1. Use - :func:`hmac.compare_digest` instead. - - .. versionadded:: 0.7 - """ - warnings.warn( - "'safe_str_cmp' is deprecated and will be removed in Werkzeug" - " 2.1. Use 'hmac.compare_digest' instead.", - DeprecationWarning, - stacklevel=2, - ) - - if isinstance(a, str): - a = a.encode("utf-8") # type: ignore - - if isinstance(b, str): - b = b.encode("utf-8") # type: ignore - - return hmac.compare_digest(a, b) - - -def gen_salt(length: int) -> str: - """Generate a random string of SALT_CHARS with specified ``length``.""" - if length <= 0: - raise ValueError("Salt length must be positive") - - return "".join(secrets.choice(SALT_CHARS) for _ in range(length)) - - -def _hash_internal(method: str, salt: str, password: str) -> t.Tuple[str, str]: - """Internal password hash helper. Supports plaintext without salt, - unsalted and salted passwords. In case salted passwords are used - hmac is used. - """ - if method == "plain": - return password, method - - salt = salt.encode("utf-8") - password = password.encode("utf-8") - - if method.startswith("pbkdf2:"): - if not salt: - raise ValueError("Salt is required for PBKDF2") - - args = method[7:].split(":") - - if len(args) not in (1, 2): - raise ValueError("Invalid number of arguments for PBKDF2") - - method = args.pop(0) - iterations = int(args[0] or 0) if args else DEFAULT_PBKDF2_ITERATIONS - return ( - hashlib.pbkdf2_hmac(method, password, salt, iterations).hex(), - f"pbkdf2:{method}:{iterations}", - ) - - if salt: - return hmac.new(salt, password, method).hexdigest(), method - - return hashlib.new(method, password).hexdigest(), method - - -def generate_password_hash( - password: str, method: str = "pbkdf2:sha256", salt_length: int = 16 -) -> str: - """Hash a password with the given method and salt with a string of - the given length. The format of the string returned includes the method - that was used so that :func:`check_password_hash` can check the hash. - - The format for the hashed string looks like this:: - - method$salt$hash - - This method can **not** generate unsalted passwords but it is possible - to set param method='plain' in order to enforce plaintext passwords. - If a salt is used, hmac is used internally to salt the password. - - If PBKDF2 is wanted it can be enabled by setting the method to - ``pbkdf2:method:iterations`` where iterations is optional:: - - pbkdf2:sha256:80000$salt$hash - pbkdf2:sha256$salt$hash - - :param password: the password to hash. - :param method: the hash method to use (one that hashlib supports). Can - optionally be in the format ``pbkdf2:method:iterations`` - to enable PBKDF2. - :param salt_length: the length of the salt in letters. - """ - salt = gen_salt(salt_length) if method != "plain" else "" - h, actual_method = _hash_internal(method, salt, password) - return f"{actual_method}${salt}${h}" - - -def check_password_hash(pwhash: str, password: str) -> bool: - """Check a password against a given salted and hashed password value. - In order to support unsalted legacy passwords this method supports - plain text passwords, md5 and sha1 hashes (both salted and unsalted). - - Returns `True` if the password matched, `False` otherwise. - - :param pwhash: a hashed string like returned by - :func:`generate_password_hash`. - :param password: the plaintext password to compare against the hash. - """ - if pwhash.count("$") < 2: - return False - - method, salt, hashval = pwhash.split("$", 2) - return hmac.compare_digest(_hash_internal(method, salt, password)[0], hashval) - - -def safe_join(directory: str, *pathnames: str) -> t.Optional[str]: - """Safely join zero or more untrusted path components to a base - directory to avoid escaping the base directory. - - :param directory: The trusted base directory. - :param pathnames: The untrusted path components relative to the - base directory. - :return: A safe path, otherwise ``None``. - """ - parts = [directory] - - for filename in pathnames: - if filename != "": - filename = posixpath.normpath(filename) - - if ( - any(sep in filename for sep in _os_alt_seps) - or os.path.isabs(filename) - or filename == ".." - or filename.startswith("../") - ): - return None - - parts.append(filename) - - return posixpath.join(*parts) diff --git a/venv/lib/python3.8/site-packages/werkzeug/serving.py b/venv/lib/python3.8/site-packages/werkzeug/serving.py deleted file mode 100644 index 1be9949..0000000 --- a/venv/lib/python3.8/site-packages/werkzeug/serving.py +++ /dev/null @@ -1,1079 +0,0 @@ -"""A WSGI and HTTP server for use **during development only**. This -server is convenient to use, but is not designed to be particularly -stable, secure, or efficient. Use a dedicate WSGI server and HTTP -server when deploying to production. - -It provides features like interactive debugging and code reloading. Use -``run_simple`` to start the server. Put this in a ``run.py`` script: - -.. code-block:: python - - from myapp import create_app - from werkzeug import run_simple -""" -import io -import os -import platform -import signal -import socket -import socketserver -import sys -import typing as t -import warnings -from datetime import datetime as dt -from datetime import timedelta -from datetime import timezone -from http.server import BaseHTTPRequestHandler -from http.server import HTTPServer - -from ._internal import _log -from ._internal import _wsgi_encoding_dance -from .exceptions import InternalServerError -from .urls import uri_to_iri -from .urls import url_parse -from .urls import url_unquote - -try: - import ssl -except ImportError: - - class _SslDummy: - def __getattr__(self, name: str) -> t.Any: - raise RuntimeError("SSL support unavailable") - - ssl = _SslDummy() # type: ignore - -_log_add_style = True - -if os.name == "nt": - try: - __import__("colorama") - except ImportError: - _log_add_style = False - -can_fork = hasattr(os, "fork") - -if can_fork: - ForkingMixIn = socketserver.ForkingMixIn -else: - - class ForkingMixIn: # type: ignore - pass - - -try: - af_unix = socket.AF_UNIX -except AttributeError: - af_unix = None # type: ignore - -LISTEN_QUEUE = 128 -can_open_by_fd = not platform.system() == "Windows" and hasattr(socket, "fromfd") - -_TSSLContextArg = t.Optional[ - t.Union["ssl.SSLContext", t.Tuple[str, t.Optional[str]], "te.Literal['adhoc']"] -] - -if t.TYPE_CHECKING: - import typing_extensions as te # noqa: F401 - from _typeshed.wsgi import WSGIApplication - from _typeshed.wsgi import WSGIEnvironment - from cryptography.hazmat.primitives.asymmetric.rsa import ( - RSAPrivateKeyWithSerialization, - ) - from cryptography.x509 import Certificate - - -class DechunkedInput(io.RawIOBase): - """An input stream that handles Transfer-Encoding 'chunked'""" - - def __init__(self, rfile: t.BinaryIO) -> None: - self._rfile = rfile - self._done = False - self._len = 0 - - def readable(self) -> bool: - return True - - def read_chunk_len(self) -> int: - try: - line = self._rfile.readline().decode("latin1") - _len = int(line.strip(), 16) - except ValueError: - raise OSError("Invalid chunk header") - if _len < 0: - raise OSError("Negative chunk length not allowed") - return _len - - def readinto(self, buf: bytearray) -> int: # type: ignore - read = 0 - while not self._done and read < len(buf): - if self._len == 0: - # This is the first chunk or we fully consumed the previous - # one. Read the next length of the next chunk - self._len = self.read_chunk_len() - - if self._len == 0: - # Found the final chunk of size 0. The stream is now exhausted, - # but there is still a final newline that should be consumed - self._done = True - - if self._len > 0: - # There is data (left) in this chunk, so append it to the - # buffer. If this operation fully consumes the chunk, this will - # reset self._len to 0. - n = min(len(buf), self._len) - - # If (read + chunk size) becomes more than len(buf), buf will - # grow beyond the original size and read more data than - # required. So only read as much data as can fit in buf. - if read + n > len(buf): - buf[read:] = self._rfile.read(len(buf) - read) - self._len -= len(buf) - read - read = len(buf) - else: - buf[read : read + n] = self._rfile.read(n) - self._len -= n - read += n - - if self._len == 0: - # Skip the terminating newline of a chunk that has been fully - # consumed. This also applies to the 0-sized final chunk - terminator = self._rfile.readline() - if terminator not in (b"\n", b"\r\n", b"\r"): - raise OSError("Missing chunk terminating newline") - - return read - - -class WSGIRequestHandler(BaseHTTPRequestHandler): - """A request handler that implements WSGI dispatching.""" - - server: "BaseWSGIServer" - - @property - def server_version(self) -> str: # type: ignore - from . import __version__ - - return f"Werkzeug/{__version__}" - - def make_environ(self) -> "WSGIEnvironment": - request_url = url_parse(self.path) - - def shutdown_server() -> None: - warnings.warn( - "The 'environ['werkzeug.server.shutdown']' function is" - " deprecated and will be removed in Werkzeug 2.1.", - stacklevel=2, - ) - self.server.shutdown_signal = True - - url_scheme = "http" if self.server.ssl_context is None else "https" - - if not self.client_address: - self.client_address = ("", 0) - elif isinstance(self.client_address, str): - self.client_address = (self.client_address, 0) - - # If there was no scheme but the path started with two slashes, - # the first segment may have been incorrectly parsed as the - # netloc, prepend it to the path again. - if not request_url.scheme and request_url.netloc: - path_info = f"/{request_url.netloc}{request_url.path}" - else: - path_info = request_url.path - - path_info = url_unquote(path_info) - - environ: "WSGIEnvironment" = { - "wsgi.version": (1, 0), - "wsgi.url_scheme": url_scheme, - "wsgi.input": self.rfile, - "wsgi.errors": sys.stderr, - "wsgi.multithread": self.server.multithread, - "wsgi.multiprocess": self.server.multiprocess, - "wsgi.run_once": False, - "werkzeug.server.shutdown": shutdown_server, - "werkzeug.socket": self.connection, - "SERVER_SOFTWARE": self.server_version, - "REQUEST_METHOD": self.command, - "SCRIPT_NAME": "", - "PATH_INFO": _wsgi_encoding_dance(path_info), - "QUERY_STRING": _wsgi_encoding_dance(request_url.query), - # Non-standard, added by mod_wsgi, uWSGI - "REQUEST_URI": _wsgi_encoding_dance(self.path), - # Non-standard, added by gunicorn - "RAW_URI": _wsgi_encoding_dance(self.path), - "REMOTE_ADDR": self.address_string(), - "REMOTE_PORT": self.port_integer(), - "SERVER_NAME": self.server.server_address[0], - "SERVER_PORT": str(self.server.server_address[1]), - "SERVER_PROTOCOL": self.request_version, - } - - for key, value in self.headers.items(): - key = key.upper().replace("-", "_") - value = value.replace("\r\n", "") - if key not in ("CONTENT_TYPE", "CONTENT_LENGTH"): - key = f"HTTP_{key}" - if key in environ: - value = f"{environ[key]},{value}" - environ[key] = value - - if environ.get("HTTP_TRANSFER_ENCODING", "").strip().lower() == "chunked": - environ["wsgi.input_terminated"] = True - environ["wsgi.input"] = DechunkedInput(environ["wsgi.input"]) - - # Per RFC 2616, if the URL is absolute, use that as the host. - # We're using "has a scheme" to indicate an absolute URL. - if request_url.scheme and request_url.netloc: - environ["HTTP_HOST"] = request_url.netloc - - try: - # binary_form=False gives nicer information, but wouldn't be compatible with - # what Nginx or Apache could return. - peer_cert = self.connection.getpeercert(binary_form=True) - if peer_cert is not None: - # Nginx and Apache use PEM format. - environ["SSL_CLIENT_CERT"] = ssl.DER_cert_to_PEM_cert(peer_cert) - except ValueError: - # SSL handshake hasn't finished. - self.server.log("error", "Cannot fetch SSL peer certificate info") - except AttributeError: - # Not using TLS, the socket will not have getpeercert(). - pass - - return environ - - def run_wsgi(self) -> None: - if self.headers.get("Expect", "").lower().strip() == "100-continue": - self.wfile.write(b"HTTP/1.1 100 Continue\r\n\r\n") - - self.environ = environ = self.make_environ() - status_set: t.Optional[str] = None - headers_set: t.Optional[t.List[t.Tuple[str, str]]] = None - status_sent: t.Optional[str] = None - headers_sent: t.Optional[t.List[t.Tuple[str, str]]] = None - - def write(data: bytes) -> None: - nonlocal status_sent, headers_sent - assert status_set is not None, "write() before start_response" - assert headers_set is not None, "write() before start_response" - if status_sent is None: - status_sent = status_set - headers_sent = headers_set - try: - code_str, msg = status_sent.split(None, 1) - except ValueError: - code_str, msg = status_sent, "" - code = int(code_str) - self.send_response(code, msg) - header_keys = set() - for key, value in headers_sent: - self.send_header(key, value) - key = key.lower() - header_keys.add(key) - if not ( - "content-length" in header_keys - or environ["REQUEST_METHOD"] == "HEAD" - or code < 200 - or code in (204, 304) - ): - self.close_connection = True - self.send_header("Connection", "close") - if "server" not in header_keys: - self.send_header("Server", self.version_string()) - if "date" not in header_keys: - self.send_header("Date", self.date_time_string()) - self.end_headers() - - assert isinstance(data, bytes), "applications must write bytes" - self.wfile.write(data) - self.wfile.flush() - - def start_response(status, headers, exc_info=None): # type: ignore - nonlocal status_set, headers_set - if exc_info: - try: - if headers_sent: - raise exc_info[1].with_traceback(exc_info[2]) - finally: - exc_info = None - elif headers_set: - raise AssertionError("Headers already set") - status_set = status - headers_set = headers - return write - - def execute(app: "WSGIApplication") -> None: - application_iter = app(environ, start_response) - try: - for data in application_iter: - write(data) - if not headers_sent: - write(b"") - finally: - if hasattr(application_iter, "close"): - application_iter.close() # type: ignore - - try: - execute(self.server.app) - except (ConnectionError, socket.timeout) as e: - self.connection_dropped(e, environ) - except Exception: - if self.server.passthrough_errors: - raise - from .debug.tbtools import get_current_traceback - - traceback = get_current_traceback(ignore_system_exceptions=True) - try: - # if we haven't yet sent the headers but they are set - # we roll back to be able to set them again. - if status_sent is None: - status_set = None - headers_set = None - execute(InternalServerError()) - except Exception: - pass - self.server.log("error", "Error on request:\n%s", traceback.plaintext) - - def handle(self) -> None: - """Handles a request ignoring dropped connections.""" - try: - BaseHTTPRequestHandler.handle(self) - except (ConnectionError, socket.timeout) as e: - self.connection_dropped(e) - except Exception as e: - if self.server.ssl_context is not None and is_ssl_error(e): - self.log_error("SSL error occurred: %s", e) - else: - raise - if self.server.shutdown_signal: - self.initiate_shutdown() - - def initiate_shutdown(self) -> None: - if is_running_from_reloader(): - # Windows does not provide SIGKILL, go with SIGTERM then. - sig = getattr(signal, "SIGKILL", signal.SIGTERM) - os.kill(os.getpid(), sig) - - self.server._BaseServer__shutdown_request = True # type: ignore - - def connection_dropped( - self, error: BaseException, environ: t.Optional["WSGIEnvironment"] = None - ) -> None: - """Called if the connection was closed by the client. By default - nothing happens. - """ - - def handle_one_request(self) -> None: - """Handle a single HTTP request.""" - self.raw_requestline = self.rfile.readline() - if not self.raw_requestline: - self.close_connection = True - elif self.parse_request(): - self.run_wsgi() - - def send_response(self, code: int, message: t.Optional[str] = None) -> None: - """Send the response header and log the response code.""" - self.log_request(code) - if message is None: - message = self.responses[code][0] if code in self.responses else "" - if self.request_version != "HTTP/0.9": - hdr = f"{self.protocol_version} {code} {message}\r\n" - self.wfile.write(hdr.encode("ascii")) - - def version_string(self) -> str: - return super().version_string().strip() - - def address_string(self) -> str: - if getattr(self, "environ", None): - return self.environ["REMOTE_ADDR"] # type: ignore - - if not self.client_address: - return "" - - return self.client_address[0] - - def port_integer(self) -> int: - return self.client_address[1] - - def log_request( - self, code: t.Union[int, str] = "-", size: t.Union[int, str] = "-" - ) -> None: - try: - path = uri_to_iri(self.path) - msg = f"{self.command} {path} {self.request_version}" - except AttributeError: - # path isn't set if the requestline was bad - msg = self.requestline - - code = str(code) - - if _log_add_style: - if code[0] == "1": # 1xx - Informational - msg = _ansi_style(msg, "bold") - elif code == "200": # 2xx - Success - pass - elif code == "304": # 304 - Resource Not Modified - msg = _ansi_style(msg, "cyan") - elif code[0] == "3": # 3xx - Redirection - msg = _ansi_style(msg, "green") - elif code == "404": # 404 - Resource Not Found - msg = _ansi_style(msg, "yellow") - elif code[0] == "4": # 4xx - Client Error - msg = _ansi_style(msg, "bold", "red") - else: # 5xx, or any other response - msg = _ansi_style(msg, "bold", "magenta") - - self.log("info", '"%s" %s %s', msg, code, size) - - def log_error(self, format: str, *args: t.Any) -> None: - self.log("error", format, *args) - - def log_message(self, format: str, *args: t.Any) -> None: - self.log("info", format, *args) - - def log(self, type: str, message: str, *args: t.Any) -> None: - _log( - type, - f"{self.address_string()} - - [{self.log_date_time_string()}] {message}\n", - *args, - ) - - -def _ansi_style(value: str, *styles: str) -> str: - codes = { - "bold": 1, - "red": 31, - "green": 32, - "yellow": 33, - "magenta": 35, - "cyan": 36, - } - - for style in styles: - value = f"\x1b[{codes[style]}m{value}" - - return f"{value}\x1b[0m" - - -def generate_adhoc_ssl_pair( - cn: t.Optional[str] = None, -) -> t.Tuple["Certificate", "RSAPrivateKeyWithSerialization"]: - try: - from cryptography import x509 - from cryptography.x509.oid import NameOID - from cryptography.hazmat.backends import default_backend - from cryptography.hazmat.primitives import hashes - from cryptography.hazmat.primitives.asymmetric import rsa - except ImportError: - raise TypeError("Using ad-hoc certificates requires the cryptography library.") - - backend = default_backend() - pkey = rsa.generate_private_key( - public_exponent=65537, key_size=2048, backend=backend - ) - - # pretty damn sure that this is not actually accepted by anyone - if cn is None: - cn = "*" - - subject = x509.Name( - [ - x509.NameAttribute(NameOID.ORGANIZATION_NAME, "Dummy Certificate"), - x509.NameAttribute(NameOID.COMMON_NAME, cn), - ] - ) - - backend = default_backend() - cert = ( - x509.CertificateBuilder() - .subject_name(subject) - .issuer_name(subject) - .public_key(pkey.public_key()) - .serial_number(x509.random_serial_number()) - .not_valid_before(dt.now(timezone.utc)) - .not_valid_after(dt.now(timezone.utc) + timedelta(days=365)) - .add_extension(x509.ExtendedKeyUsage([x509.OID_SERVER_AUTH]), critical=False) - .add_extension(x509.SubjectAlternativeName([x509.DNSName("*")]), critical=False) - .sign(pkey, hashes.SHA256(), backend) - ) - return cert, pkey - - -def make_ssl_devcert( - base_path: str, host: t.Optional[str] = None, cn: t.Optional[str] = None -) -> t.Tuple[str, str]: - """Creates an SSL key for development. This should be used instead of - the ``'adhoc'`` key which generates a new cert on each server start. - It accepts a path for where it should store the key and cert and - either a host or CN. If a host is given it will use the CN - ``*.host/CN=host``. - - For more information see :func:`run_simple`. - - .. versionadded:: 0.9 - - :param base_path: the path to the certificate and key. The extension - ``.crt`` is added for the certificate, ``.key`` is - added for the key. - :param host: the name of the host. This can be used as an alternative - for the `cn`. - :param cn: the `CN` to use. - """ - - if host is not None: - cn = f"*.{host}/CN={host}" - cert, pkey = generate_adhoc_ssl_pair(cn=cn) - - from cryptography.hazmat.primitives import serialization - - cert_file = f"{base_path}.crt" - pkey_file = f"{base_path}.key" - - with open(cert_file, "wb") as f: - f.write(cert.public_bytes(serialization.Encoding.PEM)) - with open(pkey_file, "wb") as f: - f.write( - pkey.private_bytes( - encoding=serialization.Encoding.PEM, - format=serialization.PrivateFormat.TraditionalOpenSSL, - encryption_algorithm=serialization.NoEncryption(), - ) - ) - - return cert_file, pkey_file - - -def generate_adhoc_ssl_context() -> "ssl.SSLContext": - """Generates an adhoc SSL context for the development server.""" - import tempfile - import atexit - - cert, pkey = generate_adhoc_ssl_pair() - - from cryptography.hazmat.primitives import serialization - - cert_handle, cert_file = tempfile.mkstemp() - pkey_handle, pkey_file = tempfile.mkstemp() - atexit.register(os.remove, pkey_file) - atexit.register(os.remove, cert_file) - - os.write(cert_handle, cert.public_bytes(serialization.Encoding.PEM)) - os.write( - pkey_handle, - pkey.private_bytes( - encoding=serialization.Encoding.PEM, - format=serialization.PrivateFormat.TraditionalOpenSSL, - encryption_algorithm=serialization.NoEncryption(), - ), - ) - - os.close(cert_handle) - os.close(pkey_handle) - ctx = load_ssl_context(cert_file, pkey_file) - return ctx - - -def load_ssl_context( - cert_file: str, pkey_file: t.Optional[str] = None, protocol: t.Optional[int] = None -) -> "ssl.SSLContext": - """Loads SSL context from cert/private key files and optional protocol. - Many parameters are directly taken from the API of - :py:class:`ssl.SSLContext`. - - :param cert_file: Path of the certificate to use. - :param pkey_file: Path of the private key to use. If not given, the key - will be obtained from the certificate file. - :param protocol: A ``PROTOCOL`` constant from the :mod:`ssl` module. - Defaults to :data:`ssl.PROTOCOL_TLS_SERVER`. - """ - if protocol is None: - protocol = ssl.PROTOCOL_TLS_SERVER - - ctx = ssl.SSLContext(protocol) - ctx.load_cert_chain(cert_file, pkey_file) - return ctx - - -def is_ssl_error(error: t.Optional[Exception] = None) -> bool: - """Checks if the given error (or the current one) is an SSL error.""" - if error is None: - error = t.cast(Exception, sys.exc_info()[1]) - return isinstance(error, ssl.SSLError) - - -def select_address_family(host: str, port: int) -> socket.AddressFamily: - """Return ``AF_INET4``, ``AF_INET6``, or ``AF_UNIX`` depending on - the host and port.""" - if host.startswith("unix://"): - return socket.AF_UNIX - elif ":" in host and hasattr(socket, "AF_INET6"): - return socket.AF_INET6 - return socket.AF_INET - - -def get_sockaddr( - host: str, port: int, family: socket.AddressFamily -) -> t.Union[t.Tuple[str, int], str]: - """Return a fully qualified socket address that can be passed to - :func:`socket.bind`.""" - if family == af_unix: - return host.split("://", 1)[1] - try: - res = socket.getaddrinfo( - host, port, family, socket.SOCK_STREAM, socket.IPPROTO_TCP - ) - except socket.gaierror: - return host, port - return res[0][4] # type: ignore - - -def get_interface_ip(family: socket.AddressFamily) -> str: - """Get the IP address of an external interface. Used when binding to - 0.0.0.0 or ::1 to show a more useful URL. - - :meta private: - """ - # arbitrary private address - host = "fd31:f903:5ab5:1::1" if family == socket.AF_INET6 else "10.253.155.219" - - with socket.socket(family, socket.SOCK_DGRAM) as s: - try: - s.connect((host, 58162)) - except OSError: - return "::1" if family == socket.AF_INET6 else "127.0.0.1" - - return s.getsockname()[0] # type: ignore - - -class BaseWSGIServer(HTTPServer): - - """Simple single-threaded, single-process WSGI server.""" - - multithread = False - multiprocess = False - request_queue_size = LISTEN_QUEUE - - def __init__( - self, - host: str, - port: int, - app: "WSGIApplication", - handler: t.Optional[t.Type[WSGIRequestHandler]] = None, - passthrough_errors: bool = False, - ssl_context: t.Optional[_TSSLContextArg] = None, - fd: t.Optional[int] = None, - ) -> None: - if handler is None: - handler = WSGIRequestHandler - - self.address_family = select_address_family(host, port) - - if fd is not None: - real_sock = socket.fromfd(fd, self.address_family, socket.SOCK_STREAM) - port = 0 - - server_address = get_sockaddr(host, int(port), self.address_family) - - # remove socket file if it already exists - if self.address_family == af_unix: - server_address = t.cast(str, server_address) - - if os.path.exists(server_address): - os.unlink(server_address) - - super().__init__(server_address, handler) # type: ignore - - self.app = app - self.passthrough_errors = passthrough_errors - self.shutdown_signal = False - self.host = host - self.port = self.socket.getsockname()[1] - - # Patch in the original socket. - if fd is not None: - self.socket.close() - self.socket = real_sock - self.server_address = self.socket.getsockname() - - if ssl_context is not None: - if isinstance(ssl_context, tuple): - ssl_context = load_ssl_context(*ssl_context) - if ssl_context == "adhoc": - ssl_context = generate_adhoc_ssl_context() - - self.socket = ssl_context.wrap_socket(self.socket, server_side=True) - self.ssl_context: t.Optional["ssl.SSLContext"] = ssl_context - else: - self.ssl_context = None - - def log(self, type: str, message: str, *args: t.Any) -> None: - _log(type, message, *args) - - def serve_forever(self, poll_interval: float = 0.5) -> None: - self.shutdown_signal = False - try: - super().serve_forever(poll_interval=poll_interval) - except KeyboardInterrupt: - pass - finally: - self.server_close() - - def handle_error(self, request: t.Any, client_address: t.Tuple[str, int]) -> None: - if self.passthrough_errors: - raise - - return super().handle_error(request, client_address) - - -class ThreadedWSGIServer(socketserver.ThreadingMixIn, BaseWSGIServer): - - """A WSGI server that does threading.""" - - multithread = True - daemon_threads = True - - -class ForkingWSGIServer(ForkingMixIn, BaseWSGIServer): - - """A WSGI server that does forking.""" - - multiprocess = True - - def __init__( - self, - host: str, - port: int, - app: "WSGIApplication", - processes: int = 40, - handler: t.Optional[t.Type[WSGIRequestHandler]] = None, - passthrough_errors: bool = False, - ssl_context: t.Optional[_TSSLContextArg] = None, - fd: t.Optional[int] = None, - ) -> None: - if not can_fork: - raise ValueError("Your platform does not support forking.") - BaseWSGIServer.__init__( - self, host, port, app, handler, passthrough_errors, ssl_context, fd - ) - self.max_children = processes - - -def make_server( - host: str, - port: int, - app: "WSGIApplication", - threaded: bool = False, - processes: int = 1, - request_handler: t.Optional[t.Type[WSGIRequestHandler]] = None, - passthrough_errors: bool = False, - ssl_context: t.Optional[_TSSLContextArg] = None, - fd: t.Optional[int] = None, -) -> BaseWSGIServer: - """Create a new server instance that is either threaded, or forks - or just processes one request after another. - """ - if threaded and processes > 1: - raise ValueError("cannot have a multithreaded and multi process server.") - elif threaded: - return ThreadedWSGIServer( - host, port, app, request_handler, passthrough_errors, ssl_context, fd=fd - ) - elif processes > 1: - return ForkingWSGIServer( - host, - port, - app, - processes, - request_handler, - passthrough_errors, - ssl_context, - fd=fd, - ) - else: - return BaseWSGIServer( - host, port, app, request_handler, passthrough_errors, ssl_context, fd=fd - ) - - -def is_running_from_reloader() -> bool: - """Checks if the application is running from within the Werkzeug - reloader subprocess. - - .. versionadded:: 0.10 - """ - return os.environ.get("WERKZEUG_RUN_MAIN") == "true" - - -def run_simple( - hostname: str, - port: int, - application: "WSGIApplication", - use_reloader: bool = False, - use_debugger: bool = False, - use_evalex: bool = True, - extra_files: t.Optional[t.Iterable[str]] = None, - exclude_patterns: t.Optional[t.Iterable[str]] = None, - reloader_interval: int = 1, - reloader_type: str = "auto", - threaded: bool = False, - processes: int = 1, - request_handler: t.Optional[t.Type[WSGIRequestHandler]] = None, - static_files: t.Optional[t.Dict[str, t.Union[str, t.Tuple[str, str]]]] = None, - passthrough_errors: bool = False, - ssl_context: t.Optional[_TSSLContextArg] = None, -) -> None: - """Start a WSGI application. Optional features include a reloader, - multithreading and fork support. - - This function has a command-line interface too:: - - python -m werkzeug.serving --help - - .. versionchanged:: 2.0 - Added ``exclude_patterns`` parameter. - - .. versionadded:: 0.5 - `static_files` was added to simplify serving of static files as well - as `passthrough_errors`. - - .. versionadded:: 0.6 - support for SSL was added. - - .. versionadded:: 0.8 - Added support for automatically loading a SSL context from certificate - file and private key. - - .. versionadded:: 0.9 - Added command-line interface. - - .. versionadded:: 0.10 - Improved the reloader and added support for changing the backend - through the `reloader_type` parameter. See :ref:`reloader` - for more information. - - .. versionchanged:: 0.15 - Bind to a Unix socket by passing a path that starts with - ``unix://`` as the ``hostname``. - - :param hostname: The host to bind to, for example ``'localhost'``. - If the value is a path that starts with ``unix://`` it will bind - to a Unix socket instead of a TCP socket.. - :param port: The port for the server. eg: ``8080`` - :param application: the WSGI application to execute - :param use_reloader: should the server automatically restart the python - process if modules were changed? - :param use_debugger: should the werkzeug debugging system be used? - :param use_evalex: should the exception evaluation feature be enabled? - :param extra_files: a list of files the reloader should watch - additionally to the modules. For example configuration - files. - :param exclude_patterns: List of :mod:`fnmatch` patterns to ignore - when running the reloader. For example, ignore cache files that - shouldn't reload when updated. - :param reloader_interval: the interval for the reloader in seconds. - :param reloader_type: the type of reloader to use. The default is - auto detection. Valid values are ``'stat'`` and - ``'watchdog'``. See :ref:`reloader` for more - information. - :param threaded: should the process handle each request in a separate - thread? - :param processes: if greater than 1 then handle each request in a new process - up to this maximum number of concurrent processes. - :param request_handler: optional parameter that can be used to replace - the default one. You can use this to replace it - with a different - :class:`~BaseHTTPServer.BaseHTTPRequestHandler` - subclass. - :param static_files: a list or dict of paths for static files. This works - exactly like :class:`SharedDataMiddleware`, it's actually - just wrapping the application in that middleware before - serving. - :param passthrough_errors: set this to `True` to disable the error catching. - This means that the server will die on errors but - it can be useful to hook debuggers in (pdb etc.) - :param ssl_context: an SSL context for the connection. Either an - :class:`ssl.SSLContext`, a tuple in the form - ``(cert_file, pkey_file)``, the string ``'adhoc'`` if - the server should automatically create one, or ``None`` - to disable SSL (which is the default). - """ - if not isinstance(port, int): - raise TypeError("port must be an integer") - if use_debugger: - from .debug import DebuggedApplication - - application = DebuggedApplication(application, use_evalex) - if static_files: - from .middleware.shared_data import SharedDataMiddleware - - application = SharedDataMiddleware(application, static_files) - - def log_startup(sock: socket.socket) -> None: - all_addresses_message = ( - " * Running on all addresses.\n" - " WARNING: This is a development server. Do not use it in" - " a production deployment." - ) - - if sock.family == af_unix: - _log("info", " * Running on %s (Press CTRL+C to quit)", hostname) - else: - if hostname == "0.0.0.0": - _log("warning", all_addresses_message) - display_hostname = get_interface_ip(socket.AF_INET) - elif hostname == "::": - _log("warning", all_addresses_message) - display_hostname = get_interface_ip(socket.AF_INET6) - else: - display_hostname = hostname - - if ":" in display_hostname: - display_hostname = f"[{display_hostname}]" - - _log( - "info", - " * Running on %s://%s:%d/ (Press CTRL+C to quit)", - "http" if ssl_context is None else "https", - display_hostname, - sock.getsockname()[1], - ) - - def inner() -> None: - try: - fd: t.Optional[int] = int(os.environ["WERKZEUG_SERVER_FD"]) - except (LookupError, ValueError): - fd = None - srv = make_server( - hostname, - port, - application, - threaded, - processes, - request_handler, - passthrough_errors, - ssl_context, - fd=fd, - ) - if fd is None: - log_startup(srv.socket) - srv.serve_forever() - - if use_reloader: - # If we're not running already in the subprocess that is the - # reloader we want to open up a socket early to make sure the - # port is actually available. - if not is_running_from_reloader(): - if port == 0 and not can_open_by_fd: - raise ValueError( - "Cannot bind to a random port with enabled " - "reloader if the Python interpreter does " - "not support socket opening by fd." - ) - - # Create and destroy a socket so that any exceptions are - # raised before we spawn a separate Python interpreter and - # lose this ability. - address_family = select_address_family(hostname, port) - server_address = get_sockaddr(hostname, port, address_family) - s = socket.socket(address_family, socket.SOCK_STREAM) - s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) - s.bind(server_address) - s.set_inheritable(True) - - # If we can open the socket by file descriptor, then we can just - # reuse this one and our socket will survive the restarts. - if can_open_by_fd: - os.environ["WERKZEUG_SERVER_FD"] = str(s.fileno()) - s.listen(LISTEN_QUEUE) - log_startup(s) - else: - s.close() - if address_family == af_unix: - server_address = t.cast(str, server_address) - _log("info", "Unlinking %s", server_address) - os.unlink(server_address) - - from ._reloader import run_with_reloader as _rwr - - _rwr( - inner, - extra_files=extra_files, - exclude_patterns=exclude_patterns, - interval=reloader_interval, - reloader_type=reloader_type, - ) - else: - inner() - - -def run_with_reloader(*args: t.Any, **kwargs: t.Any) -> None: - """Run a process with the reloader. This is not a public API, do - not use this function. - - .. deprecated:: 2.0 - Will be removed in Werkzeug 2.1. - """ - from ._reloader import run_with_reloader as _rwr - - warnings.warn( - ( - "'run_with_reloader' is a private API, it will no longer be" - " accessible in Werkzeug 2.1. Use 'run_simple' instead." - ), - DeprecationWarning, - stacklevel=2, - ) - _rwr(*args, **kwargs) - - -def main() -> None: - """A simple command-line interface for :py:func:`run_simple`.""" - import argparse - from .utils import import_string - - _log("warning", "This CLI is deprecated and will be removed in version 2.1.") - - parser = argparse.ArgumentParser( - description="Run the given WSGI application with the development server.", - allow_abbrev=False, - ) - parser.add_argument( - "-b", - "--bind", - dest="address", - help="The hostname:port the app should listen on.", - ) - parser.add_argument( - "-d", - "--debug", - action="store_true", - help="Show the interactive debugger for unhandled exceptions.", - ) - parser.add_argument( - "-r", - "--reload", - action="store_true", - help="Reload the process if modules change.", - ) - parser.add_argument( - "application", help="Application to import and serve, in the form module:app." - ) - args = parser.parse_args() - hostname, port = None, None - - if args.address: - hostname, _, port = args.address.partition(":") - - run_simple( - hostname=hostname or "127.0.0.1", - port=int(port or 5000), - application=import_string(args.application), - use_reloader=args.reload, - use_debugger=args.debug, - ) - - -if __name__ == "__main__": - main() diff --git a/venv/lib/python3.8/site-packages/werkzeug/test.py b/venv/lib/python3.8/site-packages/werkzeug/test.py deleted file mode 100644 index 9301c02..0000000 --- a/venv/lib/python3.8/site-packages/werkzeug/test.py +++ /dev/null @@ -1,1324 +0,0 @@ -import mimetypes -import sys -import typing as t -import warnings -from collections import defaultdict -from datetime import datetime -from datetime import timedelta -from http.cookiejar import CookieJar -from io import BytesIO -from itertools import chain -from random import random -from tempfile import TemporaryFile -from time import time -from urllib.request import Request as _UrllibRequest - -from ._internal import _get_environ -from ._internal import _make_encode_wrapper -from ._internal import _wsgi_decoding_dance -from ._internal import _wsgi_encoding_dance -from .datastructures import Authorization -from .datastructures import CallbackDict -from .datastructures import CombinedMultiDict -from .datastructures import EnvironHeaders -from .datastructures import FileMultiDict -from .datastructures import Headers -from .datastructures import MultiDict -from .http import dump_cookie -from .http import dump_options_header -from .http import parse_options_header -from .sansio.multipart import Data -from .sansio.multipart import Epilogue -from .sansio.multipart import Field -from .sansio.multipart import File -from .sansio.multipart import MultipartEncoder -from .sansio.multipart import Preamble -from .urls import iri_to_uri -from .urls import url_encode -from .urls import url_fix -from .urls import url_parse -from .urls import url_unparse -from .urls import url_unquote -from .utils import get_content_type -from .wrappers.request import Request -from .wrappers.response import Response -from .wsgi import ClosingIterator -from .wsgi import get_current_url - -if t.TYPE_CHECKING: - from _typeshed.wsgi import WSGIApplication - from _typeshed.wsgi import WSGIEnvironment - - -def stream_encode_multipart( - data: t.Mapping[str, t.Any], - use_tempfile: bool = True, - threshold: int = 1024 * 500, - boundary: t.Optional[str] = None, - charset: str = "utf-8", -) -> t.Tuple[t.BinaryIO, int, str]: - """Encode a dict of values (either strings or file descriptors or - :class:`FileStorage` objects.) into a multipart encoded string stored - in a file descriptor. - """ - if boundary is None: - boundary = f"---------------WerkzeugFormPart_{time()}{random()}" - - stream: t.BinaryIO = BytesIO() - total_length = 0 - on_disk = False - - if use_tempfile: - - def write_binary(s: bytes) -> int: - nonlocal stream, total_length, on_disk - - if on_disk: - return stream.write(s) - else: - length = len(s) - - if length + total_length <= threshold: - stream.write(s) - else: - new_stream = t.cast(t.BinaryIO, TemporaryFile("wb+")) - new_stream.write(stream.getvalue()) # type: ignore - new_stream.write(s) - stream = new_stream - on_disk = True - - total_length += length - return length - - else: - write_binary = stream.write - - encoder = MultipartEncoder(boundary.encode()) - write_binary(encoder.send_event(Preamble(data=b""))) - for key, value in _iter_data(data): - reader = getattr(value, "read", None) - if reader is not None: - filename = getattr(value, "filename", getattr(value, "name", None)) - content_type = getattr(value, "content_type", None) - if content_type is None: - content_type = ( - filename - and mimetypes.guess_type(filename)[0] - or "application/octet-stream" - ) - headers = Headers([("Content-Type", content_type)]) - if filename is None: - write_binary(encoder.send_event(Field(name=key, headers=headers))) - else: - write_binary( - encoder.send_event( - File(name=key, filename=filename, headers=headers) - ) - ) - while True: - chunk = reader(16384) - - if not chunk: - break - - write_binary(encoder.send_event(Data(data=chunk, more_data=True))) - else: - if not isinstance(value, str): - value = str(value) - write_binary(encoder.send_event(Field(name=key, headers=Headers()))) - write_binary( - encoder.send_event(Data(data=value.encode(charset), more_data=False)) - ) - - write_binary(encoder.send_event(Epilogue(data=b""))) - - length = stream.tell() - stream.seek(0) - return stream, length, boundary - - -def encode_multipart( - values: t.Mapping[str, t.Any], - boundary: t.Optional[str] = None, - charset: str = "utf-8", -) -> t.Tuple[str, bytes]: - """Like `stream_encode_multipart` but returns a tuple in the form - (``boundary``, ``data``) where data is bytes. - """ - stream, length, boundary = stream_encode_multipart( - values, use_tempfile=False, boundary=boundary, charset=charset - ) - return boundary, stream.read() - - -class _TestCookieHeaders: - """A headers adapter for cookielib""" - - def __init__(self, headers: t.Union[Headers, t.List[t.Tuple[str, str]]]) -> None: - self.headers = headers - - def getheaders(self, name: str) -> t.Iterable[str]: - headers = [] - name = name.lower() - for k, v in self.headers: - if k.lower() == name: - headers.append(v) - return headers - - def get_all( - self, name: str, default: t.Optional[t.Iterable[str]] = None - ) -> t.Iterable[str]: - headers = self.getheaders(name) - - if not headers: - return default # type: ignore - - return headers - - -class _TestCookieResponse: - """Something that looks like a httplib.HTTPResponse, but is actually just an - adapter for our test responses to make them available for cookielib. - """ - - def __init__(self, headers: t.Union[Headers, t.List[t.Tuple[str, str]]]) -> None: - self.headers = _TestCookieHeaders(headers) - - def info(self) -> _TestCookieHeaders: - return self.headers - - -class _TestCookieJar(CookieJar): - """A cookielib.CookieJar modified to inject and read cookie headers from - and to wsgi environments, and wsgi application responses. - """ - - def inject_wsgi(self, environ: "WSGIEnvironment") -> None: - """Inject the cookies as client headers into the server's wsgi - environment. - """ - cvals = [f"{c.name}={c.value}" for c in self] - - if cvals: - environ["HTTP_COOKIE"] = "; ".join(cvals) - else: - environ.pop("HTTP_COOKIE", None) - - def extract_wsgi( - self, - environ: "WSGIEnvironment", - headers: t.Union[Headers, t.List[t.Tuple[str, str]]], - ) -> None: - """Extract the server's set-cookie headers as cookies into the - cookie jar. - """ - self.extract_cookies( - _TestCookieResponse(headers), # type: ignore - _UrllibRequest(get_current_url(environ)), - ) - - -def _iter_data(data: t.Mapping[str, t.Any]) -> t.Iterator[t.Tuple[str, t.Any]]: - """Iterate over a mapping that might have a list of values, yielding - all key, value pairs. Almost like iter_multi_items but only allows - lists, not tuples, of values so tuples can be used for files. - """ - if isinstance(data, MultiDict): - yield from data.items(multi=True) - else: - for key, value in data.items(): - if isinstance(value, list): - for v in value: - yield key, v - else: - yield key, value - - -_TAnyMultiDict = t.TypeVar("_TAnyMultiDict", bound=MultiDict) - - -class EnvironBuilder: - """This class can be used to conveniently create a WSGI environment - for testing purposes. It can be used to quickly create WSGI environments - or request objects from arbitrary data. - - The signature of this class is also used in some other places as of - Werkzeug 0.5 (:func:`create_environ`, :meth:`Response.from_values`, - :meth:`Client.open`). Because of this most of the functionality is - available through the constructor alone. - - Files and regular form data can be manipulated independently of each - other with the :attr:`form` and :attr:`files` attributes, but are - passed with the same argument to the constructor: `data`. - - `data` can be any of these values: - - - a `str` or `bytes` object: The object is converted into an - :attr:`input_stream`, the :attr:`content_length` is set and you have to - provide a :attr:`content_type`. - - a `dict` or :class:`MultiDict`: The keys have to be strings. The values - have to be either any of the following objects, or a list of any of the - following objects: - - - a :class:`file`-like object: These are converted into - :class:`FileStorage` objects automatically. - - a `tuple`: The :meth:`~FileMultiDict.add_file` method is called - with the key and the unpacked `tuple` items as positional - arguments. - - a `str`: The string is set as form data for the associated key. - - a file-like object: The object content is loaded in memory and then - handled like a regular `str` or a `bytes`. - - :param path: the path of the request. In the WSGI environment this will - end up as `PATH_INFO`. If the `query_string` is not defined - and there is a question mark in the `path` everything after - it is used as query string. - :param base_url: the base URL is a URL that is used to extract the WSGI - URL scheme, host (server name + server port) and the - script root (`SCRIPT_NAME`). - :param query_string: an optional string or dict with URL parameters. - :param method: the HTTP method to use, defaults to `GET`. - :param input_stream: an optional input stream. Do not specify this and - `data`. As soon as an input stream is set you can't - modify :attr:`args` and :attr:`files` unless you - set the :attr:`input_stream` to `None` again. - :param content_type: The content type for the request. As of 0.5 you - don't have to provide this when specifying files - and form data via `data`. - :param content_length: The content length for the request. You don't - have to specify this when providing data via - `data`. - :param errors_stream: an optional error stream that is used for - `wsgi.errors`. Defaults to :data:`stderr`. - :param multithread: controls `wsgi.multithread`. Defaults to `False`. - :param multiprocess: controls `wsgi.multiprocess`. Defaults to `False`. - :param run_once: controls `wsgi.run_once`. Defaults to `False`. - :param headers: an optional list or :class:`Headers` object of headers. - :param data: a string or dict of form data or a file-object. - See explanation above. - :param json: An object to be serialized and assigned to ``data``. - Defaults the content type to ``"application/json"``. - Serialized with the function assigned to :attr:`json_dumps`. - :param environ_base: an optional dict of environment defaults. - :param environ_overrides: an optional dict of environment overrides. - :param charset: the charset used to encode string data. - :param auth: An authorization object to use for the - ``Authorization`` header value. A ``(username, password)`` tuple - is a shortcut for ``Basic`` authorization. - - .. versionchanged:: 2.0 - ``REQUEST_URI`` and ``RAW_URI`` is the full raw URI including - the query string, not only the path. - - .. versionchanged:: 2.0 - The default :attr:`request_class` is ``Request`` instead of - ``BaseRequest``. - - .. versionadded:: 2.0 - Added the ``auth`` parameter. - - .. versionadded:: 0.15 - The ``json`` param and :meth:`json_dumps` method. - - .. versionadded:: 0.15 - The environ has keys ``REQUEST_URI`` and ``RAW_URI`` containing - the path before perecent-decoding. This is not part of the WSGI - PEP, but many WSGI servers include it. - - .. versionchanged:: 0.6 - ``path`` and ``base_url`` can now be unicode strings that are - encoded with :func:`iri_to_uri`. - """ - - #: the server protocol to use. defaults to HTTP/1.1 - server_protocol = "HTTP/1.1" - - #: the wsgi version to use. defaults to (1, 0) - wsgi_version = (1, 0) - - #: The default request class used by :meth:`get_request`. - request_class = Request - - import json - - #: The serialization function used when ``json`` is passed. - json_dumps = staticmethod(json.dumps) - del json - - _args: t.Optional[MultiDict] - _query_string: t.Optional[str] - _input_stream: t.Optional[t.BinaryIO] - _form: t.Optional[MultiDict] - _files: t.Optional[FileMultiDict] - - def __init__( - self, - path: str = "/", - base_url: t.Optional[str] = None, - query_string: t.Optional[t.Union[t.Mapping[str, str], str]] = None, - method: str = "GET", - input_stream: t.Optional[t.BinaryIO] = None, - content_type: t.Optional[str] = None, - content_length: t.Optional[int] = None, - errors_stream: t.Optional[t.TextIO] = None, - multithread: bool = False, - multiprocess: bool = False, - run_once: bool = False, - headers: t.Optional[t.Union[Headers, t.Iterable[t.Tuple[str, str]]]] = None, - data: t.Optional[t.Union[t.BinaryIO, str, bytes, t.Mapping[str, t.Any]]] = None, - environ_base: t.Optional[t.Mapping[str, t.Any]] = None, - environ_overrides: t.Optional[t.Mapping[str, t.Any]] = None, - charset: str = "utf-8", - mimetype: t.Optional[str] = None, - json: t.Optional[t.Mapping[str, t.Any]] = None, - auth: t.Optional[t.Union[Authorization, t.Tuple[str, str]]] = None, - ) -> None: - path_s = _make_encode_wrapper(path) - if query_string is not None and path_s("?") in path: - raise ValueError("Query string is defined in the path and as an argument") - request_uri = url_parse(path) - if query_string is None and path_s("?") in path: - query_string = request_uri.query - self.charset = charset - self.path = iri_to_uri(request_uri.path) - self.request_uri = path - if base_url is not None: - base_url = url_fix(iri_to_uri(base_url, charset), charset) - self.base_url = base_url # type: ignore - if isinstance(query_string, (bytes, str)): - self.query_string = query_string - else: - if query_string is None: - query_string = MultiDict() - elif not isinstance(query_string, MultiDict): - query_string = MultiDict(query_string) - self.args = query_string - self.method = method - if headers is None: - headers = Headers() - elif not isinstance(headers, Headers): - headers = Headers(headers) - self.headers = headers - if content_type is not None: - self.content_type = content_type - if errors_stream is None: - errors_stream = sys.stderr - self.errors_stream = errors_stream - self.multithread = multithread - self.multiprocess = multiprocess - self.run_once = run_once - self.environ_base = environ_base - self.environ_overrides = environ_overrides - self.input_stream = input_stream - self.content_length = content_length - self.closed = False - - if auth is not None: - if isinstance(auth, tuple): - auth = Authorization( - "basic", {"username": auth[0], "password": auth[1]} - ) - - self.headers.set("Authorization", auth.to_header()) - - if json is not None: - if data is not None: - raise TypeError("can't provide both json and data") - - data = self.json_dumps(json) - - if self.content_type is None: - self.content_type = "application/json" - - if data: - if input_stream is not None: - raise TypeError("can't provide input stream and data") - if hasattr(data, "read"): - data = data.read() # type: ignore - if isinstance(data, str): - data = data.encode(self.charset) - if isinstance(data, bytes): - self.input_stream = BytesIO(data) - if self.content_length is None: - self.content_length = len(data) - else: - for key, value in _iter_data(data): # type: ignore - if isinstance(value, (tuple, dict)) or hasattr(value, "read"): - self._add_file_from_data(key, value) - else: - self.form.setlistdefault(key).append(value) - - if mimetype is not None: - self.mimetype = mimetype - - @classmethod - def from_environ( - cls, environ: "WSGIEnvironment", **kwargs: t.Any - ) -> "EnvironBuilder": - """Turn an environ dict back into a builder. Any extra kwargs - override the args extracted from the environ. - - .. versionchanged:: 2.0 - Path and query values are passed through the WSGI decoding - dance to avoid double encoding. - - .. versionadded:: 0.15 - """ - headers = Headers(EnvironHeaders(environ)) - out = { - "path": _wsgi_decoding_dance(environ["PATH_INFO"]), - "base_url": cls._make_base_url( - environ["wsgi.url_scheme"], - headers.pop("Host"), - _wsgi_decoding_dance(environ["SCRIPT_NAME"]), - ), - "query_string": _wsgi_decoding_dance(environ["QUERY_STRING"]), - "method": environ["REQUEST_METHOD"], - "input_stream": environ["wsgi.input"], - "content_type": headers.pop("Content-Type", None), - "content_length": headers.pop("Content-Length", None), - "errors_stream": environ["wsgi.errors"], - "multithread": environ["wsgi.multithread"], - "multiprocess": environ["wsgi.multiprocess"], - "run_once": environ["wsgi.run_once"], - "headers": headers, - } - out.update(kwargs) - return cls(**out) - - def _add_file_from_data( - self, - key: str, - value: t.Union[ - t.BinaryIO, t.Tuple[t.BinaryIO, str], t.Tuple[t.BinaryIO, str, str] - ], - ) -> None: - """Called in the EnvironBuilder to add files from the data dict.""" - if isinstance(value, tuple): - self.files.add_file(key, *value) - else: - self.files.add_file(key, value) - - @staticmethod - def _make_base_url(scheme: str, host: str, script_root: str) -> str: - return url_unparse((scheme, host, script_root, "", "")).rstrip("/") + "/" - - @property - def base_url(self) -> str: - """The base URL is used to extract the URL scheme, host name, - port, and root path. - """ - return self._make_base_url(self.url_scheme, self.host, self.script_root) - - @base_url.setter - def base_url(self, value: t.Optional[str]) -> None: - if value is None: - scheme = "http" - netloc = "localhost" - script_root = "" - else: - scheme, netloc, script_root, qs, anchor = url_parse(value) - if qs or anchor: - raise ValueError("base url must not contain a query string or fragment") - self.script_root = script_root.rstrip("/") - self.host = netloc - self.url_scheme = scheme - - @property - def content_type(self) -> t.Optional[str]: - """The content type for the request. Reflected from and to - the :attr:`headers`. Do not set if you set :attr:`files` or - :attr:`form` for auto detection. - """ - ct = self.headers.get("Content-Type") - if ct is None and not self._input_stream: - if self._files: - return "multipart/form-data" - if self._form: - return "application/x-www-form-urlencoded" - return None - return ct - - @content_type.setter - def content_type(self, value: t.Optional[str]) -> None: - if value is None: - self.headers.pop("Content-Type", None) - else: - self.headers["Content-Type"] = value - - @property - def mimetype(self) -> t.Optional[str]: - """The mimetype (content type without charset etc.) - - .. versionadded:: 0.14 - """ - ct = self.content_type - return ct.split(";")[0].strip() if ct else None - - @mimetype.setter - def mimetype(self, value: str) -> None: - self.content_type = get_content_type(value, self.charset) - - @property - def mimetype_params(self) -> t.Mapping[str, str]: - """The mimetype parameters as dict. For example if the - content type is ``text/html; charset=utf-8`` the params would be - ``{'charset': 'utf-8'}``. - - .. versionadded:: 0.14 - """ - - def on_update(d: t.Mapping[str, str]) -> None: - self.headers["Content-Type"] = dump_options_header(self.mimetype, d) - - d = parse_options_header(self.headers.get("content-type", ""))[1] - return CallbackDict(d, on_update) - - @property - def content_length(self) -> t.Optional[int]: - """The content length as integer. Reflected from and to the - :attr:`headers`. Do not set if you set :attr:`files` or - :attr:`form` for auto detection. - """ - return self.headers.get("Content-Length", type=int) - - @content_length.setter - def content_length(self, value: t.Optional[int]) -> None: - if value is None: - self.headers.pop("Content-Length", None) - else: - self.headers["Content-Length"] = str(value) - - def _get_form(self, name: str, storage: t.Type[_TAnyMultiDict]) -> _TAnyMultiDict: - """Common behavior for getting the :attr:`form` and - :attr:`files` properties. - - :param name: Name of the internal cached attribute. - :param storage: Storage class used for the data. - """ - if self.input_stream is not None: - raise AttributeError("an input stream is defined") - - rv = getattr(self, name) - - if rv is None: - rv = storage() - setattr(self, name, rv) - - return rv # type: ignore - - def _set_form(self, name: str, value: MultiDict) -> None: - """Common behavior for setting the :attr:`form` and - :attr:`files` properties. - - :param name: Name of the internal cached attribute. - :param value: Value to assign to the attribute. - """ - self._input_stream = None - setattr(self, name, value) - - @property - def form(self) -> MultiDict: - """A :class:`MultiDict` of form values.""" - return self._get_form("_form", MultiDict) - - @form.setter - def form(self, value: MultiDict) -> None: - self._set_form("_form", value) - - @property - def files(self) -> FileMultiDict: - """A :class:`FileMultiDict` of uploaded files. Use - :meth:`~FileMultiDict.add_file` to add new files. - """ - return self._get_form("_files", FileMultiDict) - - @files.setter - def files(self, value: FileMultiDict) -> None: - self._set_form("_files", value) - - @property - def input_stream(self) -> t.Optional[t.BinaryIO]: - """An optional input stream. This is mutually exclusive with - setting :attr:`form` and :attr:`files`, setting it will clear - those. Do not provide this if the method is not ``POST`` or - another method that has a body. - """ - return self._input_stream - - @input_stream.setter - def input_stream(self, value: t.Optional[t.BinaryIO]) -> None: - self._input_stream = value - self._form = None - self._files = None - - @property - def query_string(self) -> str: - """The query string. If you set this to a string - :attr:`args` will no longer be available. - """ - if self._query_string is None: - if self._args is not None: - return url_encode(self._args, charset=self.charset) - return "" - return self._query_string - - @query_string.setter - def query_string(self, value: t.Optional[str]) -> None: - self._query_string = value - self._args = None - - @property - def args(self) -> MultiDict: - """The URL arguments as :class:`MultiDict`.""" - if self._query_string is not None: - raise AttributeError("a query string is defined") - if self._args is None: - self._args = MultiDict() - return self._args - - @args.setter - def args(self, value: t.Optional[MultiDict]) -> None: - self._query_string = None - self._args = value - - @property - def server_name(self) -> str: - """The server name (read-only, use :attr:`host` to set)""" - return self.host.split(":", 1)[0] - - @property - def server_port(self) -> int: - """The server port as integer (read-only, use :attr:`host` to set)""" - pieces = self.host.split(":", 1) - if len(pieces) == 2 and pieces[1].isdigit(): - return int(pieces[1]) - if self.url_scheme == "https": - return 443 - return 80 - - def __del__(self) -> None: - try: - self.close() - except Exception: - pass - - def close(self) -> None: - """Closes all files. If you put real :class:`file` objects into the - :attr:`files` dict you can call this method to automatically close - them all in one go. - """ - if self.closed: - return - try: - files = self.files.values() - except AttributeError: - files = () # type: ignore - for f in files: - try: - f.close() - except Exception: - pass - self.closed = True - - def get_environ(self) -> "WSGIEnvironment": - """Return the built environ. - - .. versionchanged:: 0.15 - The content type and length headers are set based on - input stream detection. Previously this only set the WSGI - keys. - """ - input_stream = self.input_stream - content_length = self.content_length - - mimetype = self.mimetype - content_type = self.content_type - - if input_stream is not None: - start_pos = input_stream.tell() - input_stream.seek(0, 2) - end_pos = input_stream.tell() - input_stream.seek(start_pos) - content_length = end_pos - start_pos - elif mimetype == "multipart/form-data": - input_stream, content_length, boundary = stream_encode_multipart( - CombinedMultiDict([self.form, self.files]), charset=self.charset - ) - content_type = f'{mimetype}; boundary="{boundary}"' - elif mimetype == "application/x-www-form-urlencoded": - form_encoded = url_encode(self.form, charset=self.charset).encode("ascii") - content_length = len(form_encoded) - input_stream = BytesIO(form_encoded) - else: - input_stream = BytesIO() - - result: "WSGIEnvironment" = {} - if self.environ_base: - result.update(self.environ_base) - - def _path_encode(x: str) -> str: - return _wsgi_encoding_dance(url_unquote(x, self.charset), self.charset) - - raw_uri = _wsgi_encoding_dance(self.request_uri, self.charset) - result.update( - { - "REQUEST_METHOD": self.method, - "SCRIPT_NAME": _path_encode(self.script_root), - "PATH_INFO": _path_encode(self.path), - "QUERY_STRING": _wsgi_encoding_dance(self.query_string, self.charset), - # Non-standard, added by mod_wsgi, uWSGI - "REQUEST_URI": raw_uri, - # Non-standard, added by gunicorn - "RAW_URI": raw_uri, - "SERVER_NAME": self.server_name, - "SERVER_PORT": str(self.server_port), - "HTTP_HOST": self.host, - "SERVER_PROTOCOL": self.server_protocol, - "wsgi.version": self.wsgi_version, - "wsgi.url_scheme": self.url_scheme, - "wsgi.input": input_stream, - "wsgi.errors": self.errors_stream, - "wsgi.multithread": self.multithread, - "wsgi.multiprocess": self.multiprocess, - "wsgi.run_once": self.run_once, - } - ) - - headers = self.headers.copy() - - if content_type is not None: - result["CONTENT_TYPE"] = content_type - headers.set("Content-Type", content_type) - - if content_length is not None: - result["CONTENT_LENGTH"] = str(content_length) - headers.set("Content-Length", content_length) - - combined_headers = defaultdict(list) - - for key, value in headers.to_wsgi_list(): - combined_headers[f"HTTP_{key.upper().replace('-', '_')}"].append(value) - - for key, values in combined_headers.items(): - result[key] = ", ".join(values) - - if self.environ_overrides: - result.update(self.environ_overrides) - - return result - - def get_request(self, cls: t.Optional[t.Type[Request]] = None) -> Request: - """Returns a request with the data. If the request class is not - specified :attr:`request_class` is used. - - :param cls: The request wrapper to use. - """ - if cls is None: - cls = self.request_class - - return cls(self.get_environ()) - - -class ClientRedirectError(Exception): - """If a redirect loop is detected when using follow_redirects=True with - the :cls:`Client`, then this exception is raised. - """ - - -class Client: - """This class allows you to send requests to a wrapped application. - - The use_cookies parameter indicates whether cookies should be stored and - sent for subsequent requests. This is True by default, but passing False - will disable this behaviour. - - If you want to request some subdomain of your application you may set - `allow_subdomain_redirects` to `True` as if not no external redirects - are allowed. - - .. versionchanged:: 2.0 - ``response_wrapper`` is always a subclass of - :class:``TestResponse``. - - .. versionchanged:: 0.5 - Added the ``use_cookies`` parameter. - """ - - def __init__( - self, - application: "WSGIApplication", - response_wrapper: t.Optional[t.Type["Response"]] = None, - use_cookies: bool = True, - allow_subdomain_redirects: bool = False, - ) -> None: - self.application = application - - if response_wrapper in {None, Response}: - response_wrapper = TestResponse - elif not isinstance(response_wrapper, TestResponse): - response_wrapper = type( - "WrapperTestResponse", - (TestResponse, response_wrapper), # type: ignore - {}, - ) - - self.response_wrapper = t.cast(t.Type["TestResponse"], response_wrapper) - - if use_cookies: - self.cookie_jar: t.Optional[_TestCookieJar] = _TestCookieJar() - else: - self.cookie_jar = None - - self.allow_subdomain_redirects = allow_subdomain_redirects - - def set_cookie( - self, - server_name: str, - key: str, - value: str = "", - max_age: t.Optional[t.Union[timedelta, int]] = None, - expires: t.Optional[t.Union[str, datetime, int, float]] = None, - path: str = "/", - domain: t.Optional[str] = None, - secure: bool = False, - httponly: bool = False, - samesite: t.Optional[str] = None, - charset: str = "utf-8", - ) -> None: - """Sets a cookie in the client's cookie jar. The server name - is required and has to match the one that is also passed to - the open call. - """ - assert self.cookie_jar is not None, "cookies disabled" - header = dump_cookie( - key, - value, - max_age, - expires, - path, - domain, - secure, - httponly, - charset, - samesite=samesite, - ) - environ = create_environ(path, base_url=f"http://{server_name}") - headers = [("Set-Cookie", header)] - self.cookie_jar.extract_wsgi(environ, headers) - - def delete_cookie( - self, - server_name: str, - key: str, - path: str = "/", - domain: t.Optional[str] = None, - secure: bool = False, - httponly: bool = False, - samesite: t.Optional[str] = None, - ) -> None: - """Deletes a cookie in the test client.""" - self.set_cookie( - server_name, - key, - expires=0, - max_age=0, - path=path, - domain=domain, - secure=secure, - httponly=httponly, - samesite=samesite, - ) - - def run_wsgi_app( - self, environ: "WSGIEnvironment", buffered: bool = False - ) -> t.Tuple[t.Iterable[bytes], str, Headers]: - """Runs the wrapped WSGI app with the given environment. - - :meta private: - """ - if self.cookie_jar is not None: - self.cookie_jar.inject_wsgi(environ) - - rv = run_wsgi_app(self.application, environ, buffered=buffered) - - if self.cookie_jar is not None: - self.cookie_jar.extract_wsgi(environ, rv[2]) - - return rv - - def resolve_redirect( - self, response: "TestResponse", buffered: bool = False - ) -> "TestResponse": - """Perform a new request to the location given by the redirect - response to the previous request. - - :meta private: - """ - scheme, netloc, path, qs, anchor = url_parse(response.location) - builder = EnvironBuilder.from_environ(response.request.environ, query_string=qs) - - to_name_parts = netloc.split(":", 1)[0].split(".") - from_name_parts = builder.server_name.split(".") - - if to_name_parts != [""]: - # The new location has a host, use it for the base URL. - builder.url_scheme = scheme - builder.host = netloc - else: - # A local redirect with autocorrect_location_header=False - # doesn't have a host, so use the request's host. - to_name_parts = from_name_parts - - # Explain why a redirect to a different server name won't be followed. - if to_name_parts != from_name_parts: - if to_name_parts[-len(from_name_parts) :] == from_name_parts: - if not self.allow_subdomain_redirects: - raise RuntimeError("Following subdomain redirects is not enabled.") - else: - raise RuntimeError("Following external redirects is not supported.") - - path_parts = path.split("/") - root_parts = builder.script_root.split("/") - - if path_parts[: len(root_parts)] == root_parts: - # Strip the script root from the path. - builder.path = path[len(builder.script_root) :] - else: - # The new location is not under the script root, so use the - # whole path and clear the previous root. - builder.path = path - builder.script_root = "" - - # Only 307 and 308 preserve all of the original request. - if response.status_code not in {307, 308}: - # HEAD is preserved, everything else becomes GET. - if builder.method != "HEAD": - builder.method = "GET" - - # Clear the body and the headers that describe it. - - if builder.input_stream is not None: - builder.input_stream.close() - builder.input_stream = None - - builder.content_type = None - builder.content_length = None - builder.headers.pop("Transfer-Encoding", None) - - return self.open(builder, buffered=buffered) - - def open( - self, - *args: t.Any, - as_tuple: bool = False, - buffered: bool = False, - follow_redirects: bool = False, - **kwargs: t.Any, - ) -> "TestResponse": - """Generate an environ dict from the given arguments, make a - request to the application using it, and return the response. - - :param args: Passed to :class:`EnvironBuilder` to create the - environ for the request. If a single arg is passed, it can - be an existing :class:`EnvironBuilder` or an environ dict. - :param buffered: Convert the iterator returned by the app into - a list. If the iterator has a ``close()`` method, it is - called automatically. - :param follow_redirects: Make additional requests to follow HTTP - redirects until a non-redirect status is returned. - :attr:`TestResponse.history` lists the intermediate - responses. - - .. versionchanged:: 2.0 - ``as_tuple`` is deprecated and will be removed in Werkzeug - 2.1. Use :attr:`TestResponse.request` and - ``request.environ`` instead. - - .. versionchanged:: 2.0 - The request input stream is closed when calling - ``response.close()``. Input streams for redirects are - automatically closed. - - .. versionchanged:: 0.5 - If a dict is provided as file in the dict for the ``data`` - parameter the content type has to be called ``content_type`` - instead of ``mimetype``. This change was made for - consistency with :class:`werkzeug.FileWrapper`. - - .. versionchanged:: 0.5 - Added the ``follow_redirects`` parameter. - """ - request: t.Optional["Request"] = None - - if not kwargs and len(args) == 1: - arg = args[0] - - if isinstance(arg, EnvironBuilder): - request = arg.get_request() - elif isinstance(arg, dict): - request = EnvironBuilder.from_environ(arg).get_request() - elif isinstance(arg, Request): - request = arg - - if request is None: - builder = EnvironBuilder(*args, **kwargs) - - try: - request = builder.get_request() - finally: - builder.close() - - response = self.run_wsgi_app(request.environ, buffered=buffered) - response = self.response_wrapper(*response, request=request) - - redirects = set() - history: t.List["TestResponse"] = [] - - while follow_redirects and response.status_code in { - 301, - 302, - 303, - 305, - 307, - 308, - }: - # Exhaust intermediate response bodies to ensure middleware - # that returns an iterator runs any cleanup code. - if not buffered: - response.make_sequence() - response.close() - - new_redirect_entry = (response.location, response.status_code) - - if new_redirect_entry in redirects: - raise ClientRedirectError( - f"Loop detected: A {response.status_code} redirect" - f" to {response.location} was already made." - ) - - redirects.add(new_redirect_entry) - response.history = tuple(history) - history.append(response) - response = self.resolve_redirect(response, buffered=buffered) - else: - # This is the final request after redirects, or not - # following redirects. - response.history = tuple(history) - # Close the input stream when closing the response, in case - # the input is an open temporary file. - response.call_on_close(request.input_stream.close) - - if as_tuple: - warnings.warn( - "'as_tuple' is deprecated and will be removed in" - " Werkzeug 2.1. Access 'response.request.environ'" - " instead.", - DeprecationWarning, - stacklevel=2, - ) - return request.environ, response # type: ignore - - return response - - def get(self, *args: t.Any, **kw: t.Any) -> "TestResponse": - """Call :meth:`open` with ``method`` set to ``GET``.""" - kw["method"] = "GET" - return self.open(*args, **kw) - - def post(self, *args: t.Any, **kw: t.Any) -> "TestResponse": - """Call :meth:`open` with ``method`` set to ``POST``.""" - kw["method"] = "POST" - return self.open(*args, **kw) - - def put(self, *args: t.Any, **kw: t.Any) -> "TestResponse": - """Call :meth:`open` with ``method`` set to ``PUT``.""" - kw["method"] = "PUT" - return self.open(*args, **kw) - - def delete(self, *args: t.Any, **kw: t.Any) -> "TestResponse": - """Call :meth:`open` with ``method`` set to ``DELETE``.""" - kw["method"] = "DELETE" - return self.open(*args, **kw) - - def patch(self, *args: t.Any, **kw: t.Any) -> "TestResponse": - """Call :meth:`open` with ``method`` set to ``PATCH``.""" - kw["method"] = "PATCH" - return self.open(*args, **kw) - - def options(self, *args: t.Any, **kw: t.Any) -> "TestResponse": - """Call :meth:`open` with ``method`` set to ``OPTIONS``.""" - kw["method"] = "OPTIONS" - return self.open(*args, **kw) - - def head(self, *args: t.Any, **kw: t.Any) -> "TestResponse": - """Call :meth:`open` with ``method`` set to ``HEAD``.""" - kw["method"] = "HEAD" - return self.open(*args, **kw) - - def trace(self, *args: t.Any, **kw: t.Any) -> "TestResponse": - """Call :meth:`open` with ``method`` set to ``TRACE``.""" - kw["method"] = "TRACE" - return self.open(*args, **kw) - - def __repr__(self) -> str: - return f"<{type(self).__name__} {self.application!r}>" - - -def create_environ(*args: t.Any, **kwargs: t.Any) -> "WSGIEnvironment": - """Create a new WSGI environ dict based on the values passed. The first - parameter should be the path of the request which defaults to '/'. The - second one can either be an absolute path (in that case the host is - localhost:80) or a full path to the request with scheme, netloc port and - the path to the script. - - This accepts the same arguments as the :class:`EnvironBuilder` - constructor. - - .. versionchanged:: 0.5 - This function is now a thin wrapper over :class:`EnvironBuilder` which - was added in 0.5. The `headers`, `environ_base`, `environ_overrides` - and `charset` parameters were added. - """ - builder = EnvironBuilder(*args, **kwargs) - - try: - return builder.get_environ() - finally: - builder.close() - - -def run_wsgi_app( - app: "WSGIApplication", environ: "WSGIEnvironment", buffered: bool = False -) -> t.Tuple[t.Iterable[bytes], str, Headers]: - """Return a tuple in the form (app_iter, status, headers) of the - application output. This works best if you pass it an application that - returns an iterator all the time. - - Sometimes applications may use the `write()` callable returned - by the `start_response` function. This tries to resolve such edge - cases automatically. But if you don't get the expected output you - should set `buffered` to `True` which enforces buffering. - - If passed an invalid WSGI application the behavior of this function is - undefined. Never pass non-conforming WSGI applications to this function. - - :param app: the application to execute. - :param buffered: set to `True` to enforce buffering. - :return: tuple in the form ``(app_iter, status, headers)`` - """ - # Copy environ to ensure any mutations by the app (ProxyFix, for - # example) don't affect subsequent requests (such as redirects). - environ = _get_environ(environ).copy() - status: str - response: t.Optional[t.Tuple[str, t.List[t.Tuple[str, str]]]] = None - buffer: t.List[bytes] = [] - - def start_response(status, headers, exc_info=None): # type: ignore - nonlocal response - - if exc_info: - try: - raise exc_info[1].with_traceback(exc_info[2]) - finally: - exc_info = None - - response = (status, headers) - return buffer.append - - app_rv = app(environ, start_response) - close_func = getattr(app_rv, "close", None) - app_iter: t.Iterable[bytes] = iter(app_rv) - - # when buffering we emit the close call early and convert the - # application iterator into a regular list - if buffered: - try: - app_iter = list(app_iter) - finally: - if close_func is not None: - close_func() - - # otherwise we iterate the application iter until we have a response, chain - # the already received data with the already collected data and wrap it in - # a new `ClosingIterator` if we need to restore a `close` callable from the - # original return value. - else: - for item in app_iter: - buffer.append(item) - - if response is not None: - break - - if buffer: - app_iter = chain(buffer, app_iter) - - if close_func is not None and app_iter is not app_rv: - app_iter = ClosingIterator(app_iter, close_func) - - status, headers = response # type: ignore - return app_iter, status, Headers(headers) - - -class TestResponse(Response): - """:class:`~werkzeug.wrappers.Response` subclass that provides extra - information about requests made with the test :class:`Client`. - - Test client requests will always return an instance of this class. - If a custom response class is passed to the client, it is - subclassed along with this to support test information. - - If the test request included large files, or if the application is - serving a file, call :meth:`close` to close any open files and - prevent Python showing a ``ResourceWarning``. - """ - - request: Request - """A request object with the environ used to make the request that - resulted in this response. - """ - - history: t.Tuple["TestResponse", ...] - """A list of intermediate responses. Populated when the test request - is made with ``follow_redirects`` enabled. - """ - - def __init__( - self, - response: t.Iterable[bytes], - status: str, - headers: Headers, - request: Request, - history: t.Tuple["TestResponse"] = (), # type: ignore - **kwargs: t.Any, - ) -> None: - super().__init__(response, status, headers, **kwargs) - self.request = request - self.history = history - self._compat_tuple = response, status, headers - - def __iter__(self) -> t.Iterator: - warnings.warn( - ( - "The test client no longer returns a tuple, it returns" - " a 'TestResponse'. Tuple unpacking is deprecated and" - " will be removed in Werkzeug 2.1. Access the" - " attributes 'data', 'status', and 'headers' instead." - ), - DeprecationWarning, - stacklevel=2, - ) - return iter(self._compat_tuple) - - def __getitem__(self, item: int) -> t.Any: - warnings.warn( - ( - "The test client no longer returns a tuple, it returns" - " a 'TestResponse'. Item indexing is deprecated and" - " will be removed in Werkzeug 2.1. Access the" - " attributes 'data', 'status', and 'headers' instead." - ), - DeprecationWarning, - stacklevel=2, - ) - return self._compat_tuple[item] diff --git a/venv/lib/python3.8/site-packages/werkzeug/testapp.py b/venv/lib/python3.8/site-packages/werkzeug/testapp.py deleted file mode 100644 index 981f887..0000000 --- a/venv/lib/python3.8/site-packages/werkzeug/testapp.py +++ /dev/null @@ -1,240 +0,0 @@ -"""A small application that can be used to test a WSGI server and check -it for WSGI compliance. -""" -import base64 -import os -import sys -import typing as t -from html import escape -from textwrap import wrap - -from . import __version__ as _werkzeug_version -from .wrappers.request import Request -from .wrappers.response import Response - -if t.TYPE_CHECKING: - from _typeshed.wsgi import StartResponse - from _typeshed.wsgi import WSGIEnvironment - - -logo = Response( - base64.b64decode( - """ -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 -=""" - ), - mimetype="image/png", -) - - -TEMPLATE = """\ - -WSGI Information - -
    - -

    WSGI Information

    -

    - This page displays all available information about the WSGI server and - the underlying Python interpreter. -

    Python Interpreter

    - - - - - - -
    Python Version - %(python_version)s -
    Platform - %(platform)s [%(os)s] -
    API Version - %(api_version)s -
    Byteorder - %(byteorder)s -
    Werkzeug Version - %(werkzeug_version)s -
    -

    WSGI Environment

    - %(wsgi_env)s
    -

    Installed Eggs

    -

    - The following python packages were installed on the system as - Python eggs: -

      %(python_eggs)s
    -

    System Path

    -

    - The following paths are the current contents of the load path. The - following entries are looked up for Python packages. Note that not - all items in this path are folders. Gray and underlined items are - entries pointing to invalid resources or used by custom import hooks - such as the zip importer. -

    - Items with a bright background were expanded for display from a relative - path. If you encounter such paths in the output you might want to check - your setup as relative paths are usually problematic in multithreaded - environments. -

      %(sys_path)s
    -
    -""" - - -def iter_sys_path() -> t.Iterator[t.Tuple[str, bool, bool]]: - if os.name == "posix": - - def strip(x: str) -> str: - prefix = os.path.expanduser("~") - if x.startswith(prefix): - x = f"~{x[len(prefix) :]}" - return x - - else: - - def strip(x: str) -> str: - return x - - cwd = os.path.abspath(os.getcwd()) - for item in sys.path: - path = os.path.join(cwd, item or os.path.curdir) - yield strip(os.path.normpath(path)), not os.path.isdir(path), path != item - - -def render_testapp(req: Request) -> bytes: - try: - import pkg_resources - except ImportError: - eggs: t.Iterable[t.Any] = () - else: - eggs = sorted( - pkg_resources.working_set, - key=lambda x: x.project_name.lower(), # type: ignore - ) - python_eggs = [] - for egg in eggs: - try: - version = egg.version - except (ValueError, AttributeError): - version = "unknown" - python_eggs.append( - f"
  • {escape(egg.project_name)} [{escape(version)}]" - ) - - wsgi_env = [] - sorted_environ = sorted(req.environ.items(), key=lambda x: repr(x[0]).lower()) - for key, value in sorted_environ: - value = "".join(wrap(escape(repr(value)))) - wsgi_env.append(f"{escape(str(key))}{value}") - - sys_path = [] - for item, virtual, expanded in iter_sys_path(): - class_ = [] - if virtual: - class_.append("virtual") - if expanded: - class_.append("exp") - class_ = f' class="{" ".join(class_)}"' if class_ else "" - sys_path.append(f"{escape(item)}") - - return ( - TEMPLATE - % { - "python_version": "
    ".join(escape(sys.version).splitlines()), - "platform": escape(sys.platform), - "os": escape(os.name), - "api_version": sys.api_version, - "byteorder": sys.byteorder, - "werkzeug_version": _werkzeug_version, - "python_eggs": "\n".join(python_eggs), - "wsgi_env": "\n".join(wsgi_env), - "sys_path": "\n".join(sys_path), - } - ).encode("utf-8") - - -def test_app( - environ: "WSGIEnvironment", start_response: "StartResponse" -) -> t.Iterable[bytes]: - """Simple test application that dumps the environment. You can use - it to check if Werkzeug is working properly: - - .. sourcecode:: pycon - - >>> from werkzeug.serving import run_simple - >>> from werkzeug.testapp import test_app - >>> run_simple('localhost', 3000, test_app) - * Running on http://localhost:3000/ - - The application displays important information from the WSGI environment, - the Python interpreter and the installed libraries. - """ - req = Request(environ, populate_request=False) - if req.args.get("resource") == "logo": - response = logo - else: - response = Response(render_testapp(req), mimetype="text/html") - return response(environ, start_response) - - -if __name__ == "__main__": - from .serving import run_simple - - run_simple("localhost", 5000, test_app, use_reloader=True) diff --git a/venv/lib/python3.8/site-packages/werkzeug/urls.py b/venv/lib/python3.8/site-packages/werkzeug/urls.py deleted file mode 100644 index 7566ac2..0000000 --- a/venv/lib/python3.8/site-packages/werkzeug/urls.py +++ /dev/null @@ -1,1211 +0,0 @@ -"""Functions for working with URLs. - -Contains implementations of functions from :mod:`urllib.parse` that -handle bytes and strings. -""" -import codecs -import os -import re -import typing as t -import warnings - -from ._internal import _check_str_tuple -from ._internal import _decode_idna -from ._internal import _encode_idna -from ._internal import _make_encode_wrapper -from ._internal import _to_str - -if t.TYPE_CHECKING: - from . import datastructures as ds - -# A regular expression for what a valid schema looks like -_scheme_re = re.compile(r"^[a-zA-Z0-9+-.]+$") - -# Characters that are safe in any part of an URL. -_always_safe = frozenset( - bytearray( - b"abcdefghijklmnopqrstuvwxyz" - b"ABCDEFGHIJKLMNOPQRSTUVWXYZ" - b"0123456789" - b"-._~" - ) -) - -_hexdigits = "0123456789ABCDEFabcdef" -_hextobyte = { - f"{a}{b}".encode("ascii"): int(f"{a}{b}", 16) - for a in _hexdigits - for b in _hexdigits -} -_bytetohex = [f"%{char:02X}".encode("ascii") for char in range(256)] - - -class _URLTuple(t.NamedTuple): - scheme: str - netloc: str - path: str - query: str - fragment: str - - -class BaseURL(_URLTuple): - """Superclass of :py:class:`URL` and :py:class:`BytesURL`.""" - - __slots__ = () - _at: str - _colon: str - _lbracket: str - _rbracket: str - - def __str__(self) -> str: - return self.to_url() - - def replace(self, **kwargs: t.Any) -> "BaseURL": - """Return an URL with the same values, except for those parameters - given new values by whichever keyword arguments are specified.""" - return self._replace(**kwargs) - - @property - def host(self) -> t.Optional[str]: - """The host part of the URL if available, otherwise `None`. The - host is either the hostname or the IP address mentioned in the - URL. It will not contain the port. - """ - return self._split_host()[0] - - @property - def ascii_host(self) -> t.Optional[str]: - """Works exactly like :attr:`host` but will return a result that - is restricted to ASCII. If it finds a netloc that is not ASCII - it will attempt to idna decode it. This is useful for socket - operations when the URL might include internationalized characters. - """ - rv = self.host - if rv is not None and isinstance(rv, str): - try: - rv = _encode_idna(rv) # type: ignore - except UnicodeError: - rv = rv.encode("ascii", "ignore") # type: ignore - return _to_str(rv, "ascii", "ignore") - - @property - def port(self) -> t.Optional[int]: - """The port in the URL as an integer if it was present, `None` - otherwise. This does not fill in default ports. - """ - try: - rv = int(_to_str(self._split_host()[1])) - if 0 <= rv <= 65535: - return rv - except (ValueError, TypeError): - pass - return None - - @property - def auth(self) -> t.Optional[str]: - """The authentication part in the URL if available, `None` - otherwise. - """ - return self._split_netloc()[0] - - @property - def username(self) -> t.Optional[str]: - """The username if it was part of the URL, `None` otherwise. - This undergoes URL decoding and will always be a string. - """ - rv = self._split_auth()[0] - if rv is not None: - return _url_unquote_legacy(rv) - return None - - @property - def raw_username(self) -> t.Optional[str]: - """The username if it was part of the URL, `None` otherwise. - Unlike :attr:`username` this one is not being decoded. - """ - return self._split_auth()[0] - - @property - def password(self) -> t.Optional[str]: - """The password if it was part of the URL, `None` otherwise. - This undergoes URL decoding and will always be a string. - """ - rv = self._split_auth()[1] - if rv is not None: - return _url_unquote_legacy(rv) - return None - - @property - def raw_password(self) -> t.Optional[str]: - """The password if it was part of the URL, `None` otherwise. - Unlike :attr:`password` this one is not being decoded. - """ - return self._split_auth()[1] - - def decode_query(self, *args: t.Any, **kwargs: t.Any) -> "ds.MultiDict[str, str]": - """Decodes the query part of the URL. Ths is a shortcut for - calling :func:`url_decode` on the query argument. The arguments and - keyword arguments are forwarded to :func:`url_decode` unchanged. - """ - return url_decode(self.query, *args, **kwargs) - - def join(self, *args: t.Any, **kwargs: t.Any) -> "BaseURL": - """Joins this URL with another one. This is just a convenience - function for calling into :meth:`url_join` and then parsing the - return value again. - """ - return url_parse(url_join(self, *args, **kwargs)) - - def to_url(self) -> str: - """Returns a URL string or bytes depending on the type of the - information stored. This is just a convenience function - for calling :meth:`url_unparse` for this URL. - """ - return url_unparse(self) - - def encode_netloc(self) -> str: - """Encodes the netloc part to an ASCII safe URL as bytes.""" - rv = self.ascii_host or "" - if ":" in rv: - rv = f"[{rv}]" - port = self.port - if port is not None: - rv = f"{rv}:{port}" - auth = ":".join( - filter( - None, - [ - url_quote(self.raw_username or "", "utf-8", "strict", "/:%"), - url_quote(self.raw_password or "", "utf-8", "strict", "/:%"), - ], - ) - ) - if auth: - rv = f"{auth}@{rv}" - return rv - - def decode_netloc(self) -> str: - """Decodes the netloc part into a string.""" - rv = _decode_idna(self.host or "") - - if ":" in rv: - rv = f"[{rv}]" - port = self.port - if port is not None: - rv = f"{rv}:{port}" - auth = ":".join( - filter( - None, - [ - _url_unquote_legacy(self.raw_username or "", "/:%@"), - _url_unquote_legacy(self.raw_password or "", "/:%@"), - ], - ) - ) - if auth: - rv = f"{auth}@{rv}" - return rv - - def to_uri_tuple(self) -> "BaseURL": - """Returns a :class:`BytesURL` tuple that holds a URI. This will - encode all the information in the URL properly to ASCII using the - rules a web browser would follow. - - It's usually more interesting to directly call :meth:`iri_to_uri` which - will return a string. - """ - return url_parse(iri_to_uri(self)) - - def to_iri_tuple(self) -> "BaseURL": - """Returns a :class:`URL` tuple that holds a IRI. This will try - to decode as much information as possible in the URL without - losing information similar to how a web browser does it for the - URL bar. - - It's usually more interesting to directly call :meth:`uri_to_iri` which - will return a string. - """ - return url_parse(uri_to_iri(self)) - - def get_file_location( - self, pathformat: t.Optional[str] = None - ) -> t.Tuple[t.Optional[str], t.Optional[str]]: - """Returns a tuple with the location of the file in the form - ``(server, location)``. If the netloc is empty in the URL or - points to localhost, it's represented as ``None``. - - The `pathformat` by default is autodetection but needs to be set - when working with URLs of a specific system. The supported values - are ``'windows'`` when working with Windows or DOS paths and - ``'posix'`` when working with posix paths. - - If the URL does not point to a local file, the server and location - are both represented as ``None``. - - :param pathformat: The expected format of the path component. - Currently ``'windows'`` and ``'posix'`` are - supported. Defaults to ``None`` which is - autodetect. - """ - if self.scheme != "file": - return None, None - - path = url_unquote(self.path) - host = self.netloc or None - - if pathformat is None: - if os.name == "nt": - pathformat = "windows" - else: - pathformat = "posix" - - if pathformat == "windows": - if path[:1] == "/" and path[1:2].isalpha() and path[2:3] in "|:": - path = f"{path[1:2]}:{path[3:]}" - windows_share = path[:3] in ("\\" * 3, "/" * 3) - import ntpath - - path = ntpath.normpath(path) - # Windows shared drives are represented as ``\\host\\directory``. - # That results in a URL like ``file://///host/directory``, and a - # path like ``///host/directory``. We need to special-case this - # because the path contains the hostname. - if windows_share and host is None: - parts = path.lstrip("\\").split("\\", 1) - if len(parts) == 2: - host, path = parts - else: - host = parts[0] - path = "" - elif pathformat == "posix": - import posixpath - - path = posixpath.normpath(path) - else: - raise TypeError(f"Invalid path format {pathformat!r}") - - if host in ("127.0.0.1", "::1", "localhost"): - host = None - - return host, path - - def _split_netloc(self) -> t.Tuple[t.Optional[str], str]: - if self._at in self.netloc: - auth, _, netloc = self.netloc.partition(self._at) - return auth, netloc - return None, self.netloc - - def _split_auth(self) -> t.Tuple[t.Optional[str], t.Optional[str]]: - auth = self._split_netloc()[0] - if not auth: - return None, None - if self._colon not in auth: - return auth, None - - username, _, password = auth.partition(self._colon) - return username, password - - def _split_host(self) -> t.Tuple[t.Optional[str], t.Optional[str]]: - rv = self._split_netloc()[1] - if not rv: - return None, None - - if not rv.startswith(self._lbracket): - if self._colon in rv: - host, _, port = rv.partition(self._colon) - return host, port - return rv, None - - idx = rv.find(self._rbracket) - if idx < 0: - return rv, None - - host = rv[1:idx] - rest = rv[idx + 1 :] - if rest.startswith(self._colon): - return host, rest[1:] - return host, None - - -class URL(BaseURL): - """Represents a parsed URL. This behaves like a regular tuple but - also has some extra attributes that give further insight into the - URL. - """ - - __slots__ = () - _at = "@" - _colon = ":" - _lbracket = "[" - _rbracket = "]" - - def encode(self, charset: str = "utf-8", errors: str = "replace") -> "BytesURL": - """Encodes the URL to a tuple made out of bytes. The charset is - only being used for the path, query and fragment. - """ - return BytesURL( - self.scheme.encode("ascii"), # type: ignore - self.encode_netloc(), - self.path.encode(charset, errors), # type: ignore - self.query.encode(charset, errors), # type: ignore - self.fragment.encode(charset, errors), # type: ignore - ) - - -class BytesURL(BaseURL): - """Represents a parsed URL in bytes.""" - - __slots__ = () - _at = b"@" # type: ignore - _colon = b":" # type: ignore - _lbracket = b"[" # type: ignore - _rbracket = b"]" # type: ignore - - def __str__(self) -> str: - return self.to_url().decode("utf-8", "replace") # type: ignore - - def encode_netloc(self) -> bytes: # type: ignore - """Returns the netloc unchanged as bytes.""" - return self.netloc # type: ignore - - def decode(self, charset: str = "utf-8", errors: str = "replace") -> "URL": - """Decodes the URL to a tuple made out of strings. The charset is - only being used for the path, query and fragment. - """ - return URL( - self.scheme.decode("ascii"), # type: ignore - self.decode_netloc(), - self.path.decode(charset, errors), # type: ignore - self.query.decode(charset, errors), # type: ignore - self.fragment.decode(charset, errors), # type: ignore - ) - - -_unquote_maps: t.Dict[t.FrozenSet[int], t.Dict[bytes, int]] = {frozenset(): _hextobyte} - - -def _unquote_to_bytes( - string: t.Union[str, bytes], unsafe: t.Union[str, bytes] = "" -) -> bytes: - if isinstance(string, str): - string = string.encode("utf-8") - - if isinstance(unsafe, str): - unsafe = unsafe.encode("utf-8") - - unsafe = frozenset(bytearray(unsafe)) - groups = iter(string.split(b"%")) - result = bytearray(next(groups, b"")) - - try: - hex_to_byte = _unquote_maps[unsafe] - except KeyError: - hex_to_byte = _unquote_maps[unsafe] = { - h: b for h, b in _hextobyte.items() if b not in unsafe - } - - for group in groups: - code = group[:2] - - if code in hex_to_byte: - result.append(hex_to_byte[code]) - result.extend(group[2:]) - else: - result.append(37) # % - result.extend(group) - - return bytes(result) - - -def _url_encode_impl( - obj: t.Union[t.Mapping[str, str], t.Iterable[t.Tuple[str, str]]], - charset: str, - sort: bool, - key: t.Optional[t.Callable[[t.Tuple[str, str]], t.Any]], -) -> t.Iterator[str]: - from .datastructures import iter_multi_items - - iterable: t.Iterable[t.Tuple[str, str]] = iter_multi_items(obj) - - if sort: - iterable = sorted(iterable, key=key) - - for key_str, value_str in iterable: - if value_str is None: - continue - - if not isinstance(key_str, bytes): - key_bytes = str(key_str).encode(charset) - else: - key_bytes = key_str - - if not isinstance(value_str, bytes): - value_bytes = str(value_str).encode(charset) - else: - value_bytes = value_str - - yield f"{_fast_url_quote_plus(key_bytes)}={_fast_url_quote_plus(value_bytes)}" - - -def _url_unquote_legacy(value: str, unsafe: str = "") -> str: - try: - return url_unquote(value, charset="utf-8", errors="strict", unsafe=unsafe) - except UnicodeError: - return url_unquote(value, charset="latin1", unsafe=unsafe) - - -def url_parse( - url: str, scheme: t.Optional[str] = None, allow_fragments: bool = True -) -> BaseURL: - """Parses a URL from a string into a :class:`URL` tuple. If the URL - is lacking a scheme it can be provided as second argument. Otherwise, - it is ignored. Optionally fragments can be stripped from the URL - by setting `allow_fragments` to `False`. - - The inverse of this function is :func:`url_unparse`. - - :param url: the URL to parse. - :param scheme: the default schema to use if the URL is schemaless. - :param allow_fragments: if set to `False` a fragment will be removed - from the URL. - """ - s = _make_encode_wrapper(url) - is_text_based = isinstance(url, str) - - if scheme is None: - scheme = s("") - netloc = query = fragment = s("") - i = url.find(s(":")) - if i > 0 and _scheme_re.match(_to_str(url[:i], errors="replace")): - # make sure "iri" is not actually a port number (in which case - # "scheme" is really part of the path) - rest = url[i + 1 :] - if not rest or any(c not in s("0123456789") for c in rest): - # not a port number - scheme, url = url[:i].lower(), rest - - if url[:2] == s("//"): - delim = len(url) - for c in s("/?#"): - wdelim = url.find(c, 2) - if wdelim >= 0: - delim = min(delim, wdelim) - netloc, url = url[2:delim], url[delim:] - if (s("[") in netloc and s("]") not in netloc) or ( - s("]") in netloc and s("[") not in netloc - ): - raise ValueError("Invalid IPv6 URL") - - if allow_fragments and s("#") in url: - url, fragment = url.split(s("#"), 1) - if s("?") in url: - url, query = url.split(s("?"), 1) - - result_type = URL if is_text_based else BytesURL - return result_type(scheme, netloc, url, query, fragment) - - -def _make_fast_url_quote( - charset: str = "utf-8", - errors: str = "strict", - safe: t.Union[str, bytes] = "/:", - unsafe: t.Union[str, bytes] = "", -) -> t.Callable[[bytes], str]: - """Precompile the translation table for a URL encoding function. - - Unlike :func:`url_quote`, the generated function only takes the - string to quote. - - :param charset: The charset to encode the result with. - :param errors: How to handle encoding errors. - :param safe: An optional sequence of safe characters to never encode. - :param unsafe: An optional sequence of unsafe characters to always encode. - """ - if isinstance(safe, str): - safe = safe.encode(charset, errors) - - if isinstance(unsafe, str): - unsafe = unsafe.encode(charset, errors) - - safe = (frozenset(bytearray(safe)) | _always_safe) - frozenset(bytearray(unsafe)) - table = [chr(c) if c in safe else f"%{c:02X}" for c in range(256)] - - def quote(string: bytes) -> str: - return "".join([table[c] for c in string]) - - return quote - - -_fast_url_quote = _make_fast_url_quote() -_fast_quote_plus = _make_fast_url_quote(safe=" ", unsafe="+") - - -def _fast_url_quote_plus(string: bytes) -> str: - return _fast_quote_plus(string).replace(" ", "+") - - -def url_quote( - string: t.Union[str, bytes], - charset: str = "utf-8", - errors: str = "strict", - safe: t.Union[str, bytes] = "/:", - unsafe: t.Union[str, bytes] = "", -) -> str: - """URL encode a single string with a given encoding. - - :param s: the string to quote. - :param charset: the charset to be used. - :param safe: an optional sequence of safe characters. - :param unsafe: an optional sequence of unsafe characters. - - .. versionadded:: 0.9.2 - The `unsafe` parameter was added. - """ - if not isinstance(string, (str, bytes, bytearray)): - string = str(string) - if isinstance(string, str): - string = string.encode(charset, errors) - if isinstance(safe, str): - safe = safe.encode(charset, errors) - if isinstance(unsafe, str): - unsafe = unsafe.encode(charset, errors) - safe = (frozenset(bytearray(safe)) | _always_safe) - frozenset(bytearray(unsafe)) - rv = bytearray() - for char in bytearray(string): - if char in safe: - rv.append(char) - else: - rv.extend(_bytetohex[char]) - return bytes(rv).decode(charset) - - -def url_quote_plus( - string: str, charset: str = "utf-8", errors: str = "strict", safe: str = "" -) -> str: - """URL encode a single string with the given encoding and convert - whitespace to "+". - - :param s: The string to quote. - :param charset: The charset to be used. - :param safe: An optional sequence of safe characters. - """ - return url_quote(string, charset, errors, safe + " ", "+").replace(" ", "+") - - -def url_unparse(components: t.Tuple[str, str, str, str, str]) -> str: - """The reverse operation to :meth:`url_parse`. This accepts arbitrary - as well as :class:`URL` tuples and returns a URL as a string. - - :param components: the parsed URL as tuple which should be converted - into a URL string. - """ - _check_str_tuple(components) - scheme, netloc, path, query, fragment = components - s = _make_encode_wrapper(scheme) - url = s("") - - # We generally treat file:///x and file:/x the same which is also - # what browsers seem to do. This also allows us to ignore a schema - # register for netloc utilization or having to differentiate between - # empty and missing netloc. - if netloc or (scheme and path.startswith(s("/"))): - if path and path[:1] != s("/"): - path = s("/") + path - url = s("//") + (netloc or s("")) + path - elif path: - url += path - if scheme: - url = scheme + s(":") + url - if query: - url = url + s("?") + query - if fragment: - url = url + s("#") + fragment - return url - - -def url_unquote( - s: t.Union[str, bytes], - charset: str = "utf-8", - errors: str = "replace", - unsafe: str = "", -) -> str: - """URL decode a single string with a given encoding. If the charset - is set to `None` no decoding is performed and raw bytes are - returned. - - :param s: the string to unquote. - :param charset: the charset of the query string. If set to `None` - no decoding will take place. - :param errors: the error handling for the charset decoding. - """ - rv = _unquote_to_bytes(s, unsafe) - if charset is None: - return rv - return rv.decode(charset, errors) - - -def url_unquote_plus( - s: t.Union[str, bytes], charset: str = "utf-8", errors: str = "replace" -) -> str: - """URL decode a single string with the given `charset` and decode "+" to - whitespace. - - Per default encoding errors are ignored. If you want a different behavior - you can set `errors` to ``'replace'`` or ``'strict'``. - - :param s: The string to unquote. - :param charset: the charset of the query string. If set to `None` - no decoding will take place. - :param errors: The error handling for the `charset` decoding. - """ - if isinstance(s, str): - s = s.replace("+", " ") - else: - s = s.replace(b"+", b" ") - return url_unquote(s, charset, errors) - - -def url_fix(s: str, charset: str = "utf-8") -> str: - r"""Sometimes you get an URL by a user that just isn't a real URL because - it contains unsafe characters like ' ' and so on. This function can fix - some of the problems in a similar way browsers handle data entered by the - user: - - >>> url_fix('http://de.wikipedia.org/wiki/Elf (Begriffskl\xe4rung)') - 'http://de.wikipedia.org/wiki/Elf%20(Begriffskl%C3%A4rung)' - - :param s: the string with the URL to fix. - :param charset: The target charset for the URL if the url was given - as a string. - """ - # First step is to switch to text processing and to convert - # backslashes (which are invalid in URLs anyways) to slashes. This is - # consistent with what Chrome does. - s = _to_str(s, charset, "replace").replace("\\", "/") - - # For the specific case that we look like a malformed windows URL - # we want to fix this up manually: - if s.startswith("file://") and s[7:8].isalpha() and s[8:10] in (":/", "|/"): - s = f"file:///{s[7:]}" - - url = url_parse(s) - path = url_quote(url.path, charset, safe="/%+$!*'(),") - qs = url_quote_plus(url.query, charset, safe=":&%=+$!*'(),") - anchor = url_quote_plus(url.fragment, charset, safe=":&%=+$!*'(),") - return url_unparse((url.scheme, url.encode_netloc(), path, qs, anchor)) - - -# not-unreserved characters remain quoted when unquoting to IRI -_to_iri_unsafe = "".join([chr(c) for c in range(128) if c not in _always_safe]) - - -def _codec_error_url_quote(e: UnicodeError) -> t.Tuple[str, int]: - """Used in :func:`uri_to_iri` after unquoting to re-quote any - invalid bytes. - """ - # the docs state that UnicodeError does have these attributes, - # but mypy isn't picking them up - out = _fast_url_quote(e.object[e.start : e.end]) # type: ignore - return out, e.end # type: ignore - - -codecs.register_error("werkzeug.url_quote", _codec_error_url_quote) - - -def uri_to_iri( - uri: t.Union[str, t.Tuple[str, str, str, str, str]], - charset: str = "utf-8", - errors: str = "werkzeug.url_quote", -) -> str: - """Convert a URI to an IRI. All valid UTF-8 characters are unquoted, - leaving all reserved and invalid characters quoted. If the URL has - a domain, it is decoded from Punycode. - - >>> uri_to_iri("http://xn--n3h.net/p%C3%A5th?q=%C3%A8ry%DF") - 'http://\\u2603.net/p\\xe5th?q=\\xe8ry%DF' - - :param uri: The URI to convert. - :param charset: The encoding to encode unquoted bytes with. - :param errors: Error handler to use during ``bytes.encode``. By - default, invalid bytes are left quoted. - - .. versionchanged:: 0.15 - All reserved and invalid characters remain quoted. Previously, - only some reserved characters were preserved, and invalid bytes - were replaced instead of left quoted. - - .. versionadded:: 0.6 - """ - if isinstance(uri, tuple): - uri = url_unparse(uri) - - uri = url_parse(_to_str(uri, charset)) - path = url_unquote(uri.path, charset, errors, _to_iri_unsafe) - query = url_unquote(uri.query, charset, errors, _to_iri_unsafe) - fragment = url_unquote(uri.fragment, charset, errors, _to_iri_unsafe) - return url_unparse((uri.scheme, uri.decode_netloc(), path, query, fragment)) - - -# reserved characters remain unquoted when quoting to URI -_to_uri_safe = ":/?#[]@!$&'()*+,;=%" - - -def iri_to_uri( - iri: t.Union[str, t.Tuple[str, str, str, str, str]], - charset: str = "utf-8", - errors: str = "strict", - safe_conversion: bool = False, -) -> str: - """Convert an IRI to a URI. All non-ASCII and unsafe characters are - quoted. If the URL has a domain, it is encoded to Punycode. - - >>> iri_to_uri('http://\\u2603.net/p\\xe5th?q=\\xe8ry%DF') - 'http://xn--n3h.net/p%C3%A5th?q=%C3%A8ry%DF' - - :param iri: The IRI to convert. - :param charset: The encoding of the IRI. - :param errors: Error handler to use during ``bytes.encode``. - :param safe_conversion: Return the URL unchanged if it only contains - ASCII characters and no whitespace. See the explanation below. - - There is a general problem with IRI conversion with some protocols - that are in violation of the URI specification. Consider the - following two IRIs:: - - magnet:?xt=uri:whatever - itms-services://?action=download-manifest - - After parsing, we don't know if the scheme requires the ``//``, - which is dropped if empty, but conveys different meanings in the - final URL if it's present or not. In this case, you can use - ``safe_conversion``, which will return the URL unchanged if it only - contains ASCII characters and no whitespace. This can result in a - URI with unquoted characters if it was not already quoted correctly, - but preserves the URL's semantics. Werkzeug uses this for the - ``Location`` header for redirects. - - .. versionchanged:: 0.15 - All reserved characters remain unquoted. Previously, only some - reserved characters were left unquoted. - - .. versionchanged:: 0.9.6 - The ``safe_conversion`` parameter was added. - - .. versionadded:: 0.6 - """ - if isinstance(iri, tuple): - iri = url_unparse(iri) - - if safe_conversion: - # If we're not sure if it's safe to convert the URL, and it only - # contains ASCII characters, return it unconverted. - try: - native_iri = _to_str(iri) - ascii_iri = native_iri.encode("ascii") - - # Only return if it doesn't have whitespace. (Why?) - if len(ascii_iri.split()) == 1: - return native_iri - except UnicodeError: - pass - - iri = url_parse(_to_str(iri, charset, errors)) - path = url_quote(iri.path, charset, errors, _to_uri_safe) - query = url_quote(iri.query, charset, errors, _to_uri_safe) - fragment = url_quote(iri.fragment, charset, errors, _to_uri_safe) - return url_unparse((iri.scheme, iri.encode_netloc(), path, query, fragment)) - - -def url_decode( - s: t.AnyStr, - charset: str = "utf-8", - decode_keys: None = None, - include_empty: bool = True, - errors: str = "replace", - separator: str = "&", - cls: t.Optional[t.Type["ds.MultiDict"]] = None, -) -> "ds.MultiDict[str, str]": - """Parse a query string and return it as a :class:`MultiDict`. - - :param s: The query string to parse. - :param charset: Decode bytes to string with this charset. If not - given, bytes are returned as-is. - :param include_empty: Include keys with empty values in the dict. - :param errors: Error handling behavior when decoding bytes. - :param separator: Separator character between pairs. - :param cls: Container to hold result instead of :class:`MultiDict`. - - .. versionchanged:: 2.0 - The ``decode_keys`` parameter is deprecated and will be removed - in Werkzeug 2.1. - - .. versionchanged:: 0.5 - In previous versions ";" and "&" could be used for url decoding. - Now only "&" is supported. If you want to use ";", a different - ``separator`` can be provided. - - .. versionchanged:: 0.5 - The ``cls`` parameter was added. - """ - if decode_keys is not None: - warnings.warn( - "'decode_keys' is deprecated and will be removed in Werkzeug 2.1.", - DeprecationWarning, - stacklevel=2, - ) - if cls is None: - from .datastructures import MultiDict # noqa: F811 - - cls = MultiDict - if isinstance(s, str) and not isinstance(separator, str): - separator = separator.decode(charset or "ascii") - elif isinstance(s, bytes) and not isinstance(separator, bytes): - separator = separator.encode(charset or "ascii") # type: ignore - return cls( - _url_decode_impl( - s.split(separator), charset, include_empty, errors # type: ignore - ) - ) - - -def url_decode_stream( - stream: t.BinaryIO, - charset: str = "utf-8", - decode_keys: None = None, - include_empty: bool = True, - errors: str = "replace", - separator: bytes = b"&", - cls: t.Optional[t.Type["ds.MultiDict"]] = None, - limit: t.Optional[int] = None, - return_iterator: bool = False, -) -> "ds.MultiDict[str, str]": - """Works like :func:`url_decode` but decodes a stream. The behavior - of stream and limit follows functions like - :func:`~werkzeug.wsgi.make_line_iter`. The generator of pairs is - directly fed to the `cls` so you can consume the data while it's - parsed. - - :param stream: a stream with the encoded querystring - :param charset: the charset of the query string. If set to `None` - no decoding will take place. - :param include_empty: Set to `False` if you don't want empty values to - appear in the dict. - :param errors: the decoding error behavior. - :param separator: the pair separator to be used, defaults to ``&`` - :param cls: an optional dict class to use. If this is not specified - or `None` the default :class:`MultiDict` is used. - :param limit: the content length of the URL data. Not necessary if - a limited stream is provided. - - .. versionchanged:: 2.0 - The ``decode_keys`` and ``return_iterator`` parameters are - deprecated and will be removed in Werkzeug 2.1. - - .. versionadded:: 0.8 - """ - from .wsgi import make_chunk_iter - - if decode_keys is not None: - warnings.warn( - "'decode_keys' is deprecated and will be removed in Werkzeug 2.1.", - DeprecationWarning, - stacklevel=2, - ) - - pair_iter = make_chunk_iter(stream, separator, limit) - decoder = _url_decode_impl(pair_iter, charset, include_empty, errors) - - if return_iterator: - warnings.warn( - "'return_iterator' is deprecated and will be removed in Werkzeug 2.1.", - DeprecationWarning, - stacklevel=2, - ) - return decoder # type: ignore - - if cls is None: - from .datastructures import MultiDict # noqa: F811 - - cls = MultiDict - - return cls(decoder) - - -def _url_decode_impl( - pair_iter: t.Iterable[t.AnyStr], charset: str, include_empty: bool, errors: str -) -> t.Iterator[t.Tuple[str, str]]: - for pair in pair_iter: - if not pair: - continue - s = _make_encode_wrapper(pair) - equal = s("=") - if equal in pair: - key, value = pair.split(equal, 1) - else: - if not include_empty: - continue - key = pair - value = s("") - yield ( - url_unquote_plus(key, charset, errors), - url_unquote_plus(value, charset, errors), - ) - - -def url_encode( - obj: t.Union[t.Mapping[str, str], t.Iterable[t.Tuple[str, str]]], - charset: str = "utf-8", - encode_keys: None = None, - sort: bool = False, - key: t.Optional[t.Callable[[t.Tuple[str, str]], t.Any]] = None, - separator: str = "&", -) -> str: - """URL encode a dict/`MultiDict`. If a value is `None` it will not appear - in the result string. Per default only values are encoded into the target - charset strings. - - :param obj: the object to encode into a query string. - :param charset: the charset of the query string. - :param sort: set to `True` if you want parameters to be sorted by `key`. - :param separator: the separator to be used for the pairs. - :param key: an optional function to be used for sorting. For more details - check out the :func:`sorted` documentation. - - .. versionchanged:: 2.0 - The ``encode_keys`` parameter is deprecated and will be removed - in Werkzeug 2.1. - - .. versionchanged:: 0.5 - Added the ``sort``, ``key``, and ``separator`` parameters. - """ - if encode_keys is not None: - warnings.warn( - "'encode_keys' is deprecated and will be removed in Werkzeug 2.1.", - DeprecationWarning, - stacklevel=2, - ) - separator = _to_str(separator, "ascii") - return separator.join(_url_encode_impl(obj, charset, sort, key)) - - -def url_encode_stream( - obj: t.Union[t.Mapping[str, str], t.Iterable[t.Tuple[str, str]]], - stream: t.Optional[t.TextIO] = None, - charset: str = "utf-8", - encode_keys: None = None, - sort: bool = False, - key: t.Optional[t.Callable[[t.Tuple[str, str]], t.Any]] = None, - separator: str = "&", -) -> None: - """Like :meth:`url_encode` but writes the results to a stream - object. If the stream is `None` a generator over all encoded - pairs is returned. - - :param obj: the object to encode into a query string. - :param stream: a stream to write the encoded object into or `None` if - an iterator over the encoded pairs should be returned. In - that case the separator argument is ignored. - :param charset: the charset of the query string. - :param sort: set to `True` if you want parameters to be sorted by `key`. - :param separator: the separator to be used for the pairs. - :param key: an optional function to be used for sorting. For more details - check out the :func:`sorted` documentation. - - .. versionchanged:: 2.0 - The ``encode_keys`` parameter is deprecated and will be removed - in Werkzeug 2.1. - - .. versionadded:: 0.8 - """ - if encode_keys is not None: - warnings.warn( - "'encode_keys' is deprecated and will be removed in Werkzeug 2.1.", - DeprecationWarning, - stacklevel=2, - ) - separator = _to_str(separator, "ascii") - gen = _url_encode_impl(obj, charset, sort, key) - if stream is None: - return gen # type: ignore - for idx, chunk in enumerate(gen): - if idx: - stream.write(separator) - stream.write(chunk) - return None - - -def url_join( - base: t.Union[str, t.Tuple[str, str, str, str, str]], - url: t.Union[str, t.Tuple[str, str, str, str, str]], - allow_fragments: bool = True, -) -> str: - """Join a base URL and a possibly relative URL to form an absolute - interpretation of the latter. - - :param base: the base URL for the join operation. - :param url: the URL to join. - :param allow_fragments: indicates whether fragments should be allowed. - """ - if isinstance(base, tuple): - base = url_unparse(base) - if isinstance(url, tuple): - url = url_unparse(url) - - _check_str_tuple((base, url)) - s = _make_encode_wrapper(base) - - if not base: - return url - if not url: - return base - - bscheme, bnetloc, bpath, bquery, bfragment = url_parse( - base, allow_fragments=allow_fragments - ) - scheme, netloc, path, query, fragment = url_parse(url, bscheme, allow_fragments) - if scheme != bscheme: - return url - if netloc: - return url_unparse((scheme, netloc, path, query, fragment)) - netloc = bnetloc - - if path[:1] == s("/"): - segments = path.split(s("/")) - elif not path: - segments = bpath.split(s("/")) - if not query: - query = bquery - else: - segments = bpath.split(s("/"))[:-1] + path.split(s("/")) - - # If the rightmost part is "./" we want to keep the slash but - # remove the dot. - if segments[-1] == s("."): - segments[-1] = s("") - - # Resolve ".." and "." - segments = [segment for segment in segments if segment != s(".")] - while True: - i = 1 - n = len(segments) - 1 - while i < n: - if segments[i] == s("..") and segments[i - 1] not in (s(""), s("..")): - del segments[i - 1 : i + 1] - break - i += 1 - else: - break - - # Remove trailing ".." if the URL is absolute - unwanted_marker = [s(""), s("..")] - while segments[:2] == unwanted_marker: - del segments[1] - - path = s("/").join(segments) - return url_unparse((scheme, netloc, path, query, fragment)) - - -class Href: - """Implements a callable that constructs URLs with the given base. The - function can be called with any number of positional and keyword - arguments which than are used to assemble the URL. Works with URLs - and posix paths. - - Positional arguments are appended as individual segments to - the path of the URL: - - >>> href = Href('/foo') - >>> href('bar', 23) - '/foo/bar/23' - >>> href('foo', bar=23) - '/foo/foo?bar=23' - - If any of the arguments (positional or keyword) evaluates to `None` it - will be skipped. If no keyword arguments are given the last argument - can be a :class:`dict` or :class:`MultiDict` (or any other dict subclass), - otherwise the keyword arguments are used for the query parameters, cutting - off the first trailing underscore of the parameter name: - - >>> href(is_=42) - '/foo?is=42' - >>> href({'foo': 'bar'}) - '/foo?foo=bar' - - Combining of both methods is not allowed: - - >>> href({'foo': 'bar'}, bar=42) - Traceback (most recent call last): - ... - TypeError: keyword arguments and query-dicts can't be combined - - Accessing attributes on the href object creates a new href object with - the attribute name as prefix: - - >>> bar_href = href.bar - >>> bar_href("blub") - '/foo/bar/blub' - - If `sort` is set to `True` the items are sorted by `key` or the default - sorting algorithm: - - >>> href = Href("/", sort=True) - >>> href(a=1, b=2, c=3) - '/?a=1&b=2&c=3' - - .. deprecated:: 2.0 - Will be removed in Werkzeug 2.1. Use :mod:`werkzeug.routing` - instead. - - .. versionadded:: 0.5 - `sort` and `key` were added. - """ - - def __init__( # type: ignore - self, base="./", charset="utf-8", sort=False, key=None - ): - warnings.warn( - "'Href' is deprecated and will be removed in Werkzeug 2.1." - " Use 'werkzeug.routing' instead.", - DeprecationWarning, - stacklevel=2, - ) - - if not base: - base = "./" - self.base = base - self.charset = charset - self.sort = sort - self.key = key - - def __getattr__(self, name): # type: ignore - if name[:2] == "__": - raise AttributeError(name) - base = self.base - if base[-1:] != "/": - base += "/" - return Href(url_join(base, name), self.charset, self.sort, self.key) - - def __call__(self, *path, **query): # type: ignore - if path and isinstance(path[-1], dict): - if query: - raise TypeError("keyword arguments and query-dicts can't be combined") - query, path = path[-1], path[:-1] - elif query: - query = {k[:-1] if k.endswith("_") else k: v for k, v in query.items()} - path = "/".join( - [ - _to_str(url_quote(x, self.charset), "ascii") - for x in path - if x is not None - ] - ).lstrip("/") - rv = self.base - if path: - if not rv.endswith("/"): - rv += "/" - rv = url_join(rv, f"./{path}") - if query: - rv += "?" + _to_str( - url_encode(query, self.charset, sort=self.sort, key=self.key), "ascii" - ) - return rv diff --git a/venv/lib/python3.8/site-packages/werkzeug/user_agent.py b/venv/lib/python3.8/site-packages/werkzeug/user_agent.py deleted file mode 100644 index 66ffcbe..0000000 --- a/venv/lib/python3.8/site-packages/werkzeug/user_agent.py +++ /dev/null @@ -1,47 +0,0 @@ -import typing as t - - -class UserAgent: - """Represents a parsed user agent header value. - - The default implementation does no parsing, only the :attr:`string` - attribute is set. A subclass may parse the string to set the - common attributes or expose other information. Set - :attr:`werkzeug.wrappers.Request.user_agent_class` to use a - subclass. - - :param string: The header value to parse. - - .. versionadded:: 2.0 - This replaces the previous ``useragents`` module, but does not - provide a built-in parser. - """ - - platform: t.Optional[str] = None - """The OS name, if it could be parsed from the string.""" - - browser: t.Optional[str] = None - """The browser name, if it could be parsed from the string.""" - - version: t.Optional[str] = None - """The browser version, if it could be parsed from the string.""" - - language: t.Optional[str] = None - """The browser language, if it could be parsed from the string.""" - - def __init__(self, string: str) -> None: - self.string: str = string - """The original header value.""" - - def __repr__(self) -> str: - return f"<{type(self).__name__} {self.browser}/{self.version}>" - - def __str__(self) -> str: - return self.string - - def __bool__(self) -> bool: - return bool(self.browser) - - def to_header(self) -> str: - """Convert to a header value.""" - return self.string diff --git a/venv/lib/python3.8/site-packages/werkzeug/useragents.py b/venv/lib/python3.8/site-packages/werkzeug/useragents.py deleted file mode 100644 index 4deed8f..0000000 --- a/venv/lib/python3.8/site-packages/werkzeug/useragents.py +++ /dev/null @@ -1,215 +0,0 @@ -import re -import typing as t -import warnings - -from .user_agent import UserAgent as _BaseUserAgent - -if t.TYPE_CHECKING: - from _typeshed.wsgi import WSGIEnvironment - - -class _UserAgentParser: - platform_rules: t.ClassVar[t.Iterable[t.Tuple[str, str]]] = ( - (" cros ", "chromeos"), - ("iphone|ios", "iphone"), - ("ipad", "ipad"), - (r"darwin\b|mac\b|os\s*x", "macos"), - ("win", "windows"), - (r"android", "android"), - ("netbsd", "netbsd"), - ("openbsd", "openbsd"), - ("freebsd", "freebsd"), - ("dragonfly", "dragonflybsd"), - ("(sun|i86)os", "solaris"), - (r"x11\b|lin(\b|ux)?", "linux"), - (r"nintendo\s+wii", "wii"), - ("irix", "irix"), - ("hp-?ux", "hpux"), - ("aix", "aix"), - ("sco|unix_sv", "sco"), - ("bsd", "bsd"), - ("amiga", "amiga"), - ("blackberry|playbook", "blackberry"), - ("symbian", "symbian"), - ) - browser_rules: t.ClassVar[t.Iterable[t.Tuple[str, str]]] = ( - ("googlebot", "google"), - ("msnbot", "msn"), - ("yahoo", "yahoo"), - ("ask jeeves", "ask"), - (r"aol|america\s+online\s+browser", "aol"), - (r"opera|opr", "opera"), - ("edge|edg", "edge"), - ("chrome|crios", "chrome"), - ("seamonkey", "seamonkey"), - ("firefox|firebird|phoenix|iceweasel", "firefox"), - ("galeon", "galeon"), - ("safari|version", "safari"), - ("webkit", "webkit"), - ("camino", "camino"), - ("konqueror", "konqueror"), - ("k-meleon", "kmeleon"), - ("netscape", "netscape"), - (r"msie|microsoft\s+internet\s+explorer|trident/.+? rv:", "msie"), - ("lynx", "lynx"), - ("links", "links"), - ("Baiduspider", "baidu"), - ("bingbot", "bing"), - ("mozilla", "mozilla"), - ) - - _browser_version_re = r"(?:{pattern})[/\sa-z(]*(\d+[.\da-z]+)?" - _language_re = re.compile( - r"(?:;\s*|\s+)(\b\w{2}\b(?:-\b\w{2}\b)?)\s*;|" - r"(?:\(|\[|;)\s*(\b\w{2}\b(?:-\b\w{2}\b)?)\s*(?:\]|\)|;)" - ) - - def __init__(self) -> None: - self.platforms = [(b, re.compile(a, re.I)) for a, b in self.platform_rules] - self.browsers = [ - (b, re.compile(self._browser_version_re.format(pattern=a), re.I)) - for a, b in self.browser_rules - ] - - def __call__( - self, user_agent: str - ) -> t.Tuple[t.Optional[str], t.Optional[str], t.Optional[str], t.Optional[str]]: - platform: t.Optional[str] - browser: t.Optional[str] - version: t.Optional[str] - language: t.Optional[str] - - for platform, regex in self.platforms: # noqa: B007 - match = regex.search(user_agent) - if match is not None: - break - else: - platform = None - - # Except for Trident, all browser key words come after the last ')' - last_closing_paren = 0 - if ( - not re.compile(r"trident/.+? rv:", re.I).search(user_agent) - and ")" in user_agent - and user_agent[-1] != ")" - ): - last_closing_paren = user_agent.rindex(")") - - for browser, regex in self.browsers: # noqa: B007 - match = regex.search(user_agent[last_closing_paren:]) - if match is not None: - version = match.group(1) - break - else: - browser = version = None - match = self._language_re.search(user_agent) - if match is not None: - language = match.group(1) or match.group(2) - else: - language = None - return platform, browser, version, language - - -# It wasn't public, but users might have imported it anyway, show a -# warning if a user created an instance. -class UserAgentParser(_UserAgentParser): - """A simple user agent parser. Used by the `UserAgent`. - - .. deprecated:: 2.0 - Will be removed in Werkzeug 2.1. Use a dedicated parser library - instead. - """ - - def __init__(self) -> None: - warnings.warn( - "'UserAgentParser' is deprecated and will be removed in" - " Werkzeug 2.1. Use a dedicated parser library instead.", - DeprecationWarning, - stacklevel=2, - ) - super().__init__() - - -class _deprecated_property(property): - def __init__(self, fget: t.Callable[["_UserAgent"], t.Any]) -> None: - super().__init__(fget) - self.message = ( - "The built-in user agent parser is deprecated and will be" - f" removed in Werkzeug 2.1. The {fget.__name__!r} property" - " will be 'None'. Subclass 'werkzeug.user_agent.UserAgent'" - " and set 'Request.user_agent_class' to use a different" - " parser." - ) - - def __get__(self, *args: t.Any, **kwargs: t.Any) -> t.Any: - warnings.warn(self.message, DeprecationWarning, stacklevel=3) - return super().__get__(*args, **kwargs) - - -# This is what Request.user_agent returns for now, only show warnings on -# attribute access, not creation. -class _UserAgent(_BaseUserAgent): - _parser = _UserAgentParser() - - def __init__(self, string: str) -> None: - super().__init__(string) - info = self._parser(string) - self._platform, self._browser, self._version, self._language = info - - @_deprecated_property - def platform(self) -> t.Optional[str]: # type: ignore - return self._platform - - @_deprecated_property - def browser(self) -> t.Optional[str]: # type: ignore - return self._browser - - @_deprecated_property - def version(self) -> t.Optional[str]: # type: ignore - return self._version - - @_deprecated_property - def language(self) -> t.Optional[str]: # type: ignore - return self._language - - -# This is what users might be importing, show warnings on create. -class UserAgent(_UserAgent): - """Represents a parsed user agent header value. - - This uses a basic parser to try to extract some information from the - header. - - :param environ_or_string: The header value to parse, or a WSGI - environ containing the header. - - .. deprecated:: 2.0 - Will be removed in Werkzeug 2.1. Subclass - :class:`werkzeug.user_agent.UserAgent` (note the new module - name) to use a dedicated parser instead. - - .. versionchanged:: 2.0 - Passing a WSGI environ is deprecated and will be removed in 2.1. - """ - - def __init__(self, environ_or_string: "t.Union[str, WSGIEnvironment]") -> None: - if isinstance(environ_or_string, dict): - warnings.warn( - "Passing an environ to 'UserAgent' is deprecated and" - " will be removed in Werkzeug 2.1. Pass the header" - " value string instead.", - DeprecationWarning, - stacklevel=2, - ) - string = environ_or_string.get("HTTP_USER_AGENT", "") - else: - string = environ_or_string - - warnings.warn( - "The 'werkzeug.useragents' module is deprecated and will be" - " removed in Werkzeug 2.1. The new base API is" - " 'werkzeug.user_agent.UserAgent'.", - DeprecationWarning, - stacklevel=2, - ) - super().__init__(string) diff --git a/venv/lib/python3.8/site-packages/werkzeug/utils.py b/venv/lib/python3.8/site-packages/werkzeug/utils.py deleted file mode 100644 index 7bb02bb..0000000 --- a/venv/lib/python3.8/site-packages/werkzeug/utils.py +++ /dev/null @@ -1,1091 +0,0 @@ -import codecs -import io -import mimetypes -import os -import pkgutil -import re -import sys -import typing as t -import unicodedata -import warnings -from datetime import datetime -from html.entities import name2codepoint -from time import time -from zlib import adler32 - -from ._internal import _DictAccessorProperty -from ._internal import _missing -from ._internal import _parse_signature -from ._internal import _TAccessorValue -from .datastructures import Headers -from .exceptions import NotFound -from .exceptions import RequestedRangeNotSatisfiable -from .security import safe_join -from .urls import url_quote -from .wsgi import wrap_file - -if t.TYPE_CHECKING: - from _typeshed.wsgi import WSGIEnvironment - from .wrappers.request import Request - from .wrappers.response import Response - -_T = t.TypeVar("_T") - -_entity_re = re.compile(r"&([^;]+);") -_filename_ascii_strip_re = re.compile(r"[^A-Za-z0-9_.-]") -_windows_device_files = ( - "CON", - "AUX", - "COM1", - "COM2", - "COM3", - "COM4", - "LPT1", - "LPT2", - "LPT3", - "PRN", - "NUL", -) - - -class cached_property(property, t.Generic[_T]): - """A :func:`property` that is only evaluated once. Subsequent access - returns the cached value. Setting the property sets the cached - value. Deleting the property clears the cached value, accessing it - again will evaluate it again. - - .. code-block:: python - - class Example: - @cached_property - def value(self): - # calculate something important here - return 42 - - e = Example() - e.value # evaluates - e.value # uses cache - e.value = 16 # sets cache - del e.value # clears cache - - The class must have a ``__dict__`` for this to work. - - .. versionchanged:: 2.0 - ``del obj.name`` clears the cached value. - """ - - def __init__( - self, - fget: t.Callable[[t.Any], _T], - name: t.Optional[str] = None, - doc: t.Optional[str] = None, - ) -> None: - super().__init__(fget, doc=doc) - self.__name__ = name or fget.__name__ - self.__module__ = fget.__module__ - - def __set__(self, obj: object, value: _T) -> None: - obj.__dict__[self.__name__] = value - - def __get__(self, obj: object, type: type = None) -> _T: # type: ignore - if obj is None: - return self # type: ignore - - value: _T = obj.__dict__.get(self.__name__, _missing) - - if value is _missing: - value = self.fget(obj) # type: ignore - obj.__dict__[self.__name__] = value - - return value - - def __delete__(self, obj: object) -> None: - del obj.__dict__[self.__name__] - - -def invalidate_cached_property(obj: object, name: str) -> None: - """Invalidates the cache for a :class:`cached_property`: - - >>> class Test(object): - ... @cached_property - ... def magic_number(self): - ... print("recalculating...") - ... return 42 - ... - >>> var = Test() - >>> var.magic_number - recalculating... - 42 - >>> var.magic_number - 42 - >>> invalidate_cached_property(var, "magic_number") - >>> var.magic_number - recalculating... - 42 - - You must pass the name of the cached property as the second argument. - - .. deprecated:: 2.0 - Will be removed in Werkzeug 2.1. Use ``del obj.name`` instead. - """ - warnings.warn( - "'invalidate_cached_property' is deprecated and will be removed" - " in Werkzeug 2.1. Use 'del obj.name' instead.", - DeprecationWarning, - stacklevel=2, - ) - delattr(obj, name) - - -class environ_property(_DictAccessorProperty[_TAccessorValue]): - """Maps request attributes to environment variables. This works not only - for the Werkzeug request object, but also any other class with an - environ attribute: - - >>> class Test(object): - ... environ = {'key': 'value'} - ... test = environ_property('key') - >>> var = Test() - >>> var.test - 'value' - - If you pass it a second value it's used as default if the key does not - exist, the third one can be a converter that takes a value and converts - it. If it raises :exc:`ValueError` or :exc:`TypeError` the default value - is used. If no default value is provided `None` is used. - - Per default the property is read only. You have to explicitly enable it - by passing ``read_only=False`` to the constructor. - """ - - read_only = True - - def lookup(self, obj: "Request") -> "WSGIEnvironment": - return obj.environ - - -class header_property(_DictAccessorProperty[_TAccessorValue]): - """Like `environ_property` but for headers.""" - - def lookup(self, obj: t.Union["Request", "Response"]) -> Headers: - return obj.headers - - -class HTMLBuilder: - """Helper object for HTML generation. - - Per default there are two instances of that class. The `html` one, and - the `xhtml` one for those two dialects. The class uses keyword parameters - and positional parameters to generate small snippets of HTML. - - Keyword parameters are converted to XML/SGML attributes, positional - arguments are used as children. Because Python accepts positional - arguments before keyword arguments it's a good idea to use a list with the - star-syntax for some children: - - >>> html.p(class_='foo', *[html.a('foo', href='foo.html'), ' ', - ... html.a('bar', href='bar.html')]) - '

    foo bar

    ' - - This class works around some browser limitations and can not be used for - arbitrary SGML/XML generation. For that purpose lxml and similar - libraries exist. - - Calling the builder escapes the string passed: - - >>> html.p(html("")) - '

    <foo>

    ' - - .. deprecated:: 2.0 - Will be removed in Werkzeug 2.1. - """ - - _entity_re = re.compile(r"&([^;]+);") - _entities = name2codepoint.copy() - _entities["apos"] = 39 - _empty_elements = { - "area", - "base", - "basefont", - "br", - "col", - "command", - "embed", - "frame", - "hr", - "img", - "input", - "keygen", - "isindex", - "link", - "meta", - "param", - "source", - "wbr", - } - _boolean_attributes = { - "selected", - "checked", - "compact", - "declare", - "defer", - "disabled", - "ismap", - "multiple", - "nohref", - "noresize", - "noshade", - "nowrap", - } - _plaintext_elements = {"textarea"} - _c_like_cdata = {"script", "style"} - - def __init__(self, dialect): # type: ignore - self._dialect = dialect - - def __call__(self, s): # type: ignore - import html - - warnings.warn( - "'utils.HTMLBuilder' is deprecated and will be removed in Werkzeug 2.1.", - DeprecationWarning, - stacklevel=2, - ) - return html.escape(s) - - def __getattr__(self, tag): # type: ignore - import html - - warnings.warn( - "'utils.HTMLBuilder' is deprecated and will be removed in Werkzeug 2.1.", - DeprecationWarning, - stacklevel=2, - ) - if tag[:2] == "__": - raise AttributeError(tag) - - def proxy(*children, **arguments): # type: ignore - buffer = f"<{tag}" - for key, value in arguments.items(): - if value is None: - continue - if key[-1] == "_": - key = key[:-1] - if key in self._boolean_attributes: - if not value: - continue - if self._dialect == "xhtml": - value = f'="{key}"' - else: - value = "" - else: - value = f'="{html.escape(value)}"' - buffer += f" {key}{value}" - if not children and tag in self._empty_elements: - if self._dialect == "xhtml": - buffer += " />" - else: - buffer += ">" - return buffer - buffer += ">" - - children_as_string = "".join([str(x) for x in children if x is not None]) - - if children_as_string: - if tag in self._plaintext_elements: - children_as_string = html.escape(children_as_string) - elif tag in self._c_like_cdata and self._dialect == "xhtml": - children_as_string = f"/**/" - buffer += children_as_string + f"" - return buffer - - return proxy - - def __repr__(self) -> str: - return f"<{type(self).__name__} for {self._dialect!r}>" - - -html = HTMLBuilder("html") -xhtml = HTMLBuilder("xhtml") - -# https://cgit.freedesktop.org/xdg/shared-mime-info/tree/freedesktop.org.xml.in -# https://www.iana.org/assignments/media-types/media-types.xhtml -# Types listed in the XDG mime info that have a charset in the IANA registration. -_charset_mimetypes = { - "application/ecmascript", - "application/javascript", - "application/sql", - "application/xml", - "application/xml-dtd", - "application/xml-external-parsed-entity", -} - - -def get_content_type(mimetype: str, charset: str) -> str: - """Returns the full content type string with charset for a mimetype. - - If the mimetype represents text, the charset parameter will be - appended, otherwise the mimetype is returned unchanged. - - :param mimetype: The mimetype to be used as content type. - :param charset: The charset to be appended for text mimetypes. - :return: The content type. - - .. versionchanged:: 0.15 - Any type that ends with ``+xml`` gets a charset, not just those - that start with ``application/``. Known text types such as - ``application/javascript`` are also given charsets. - """ - if ( - mimetype.startswith("text/") - or mimetype in _charset_mimetypes - or mimetype.endswith("+xml") - ): - mimetype += f"; charset={charset}" - - return mimetype - - -def detect_utf_encoding(data: bytes) -> str: - """Detect which UTF encoding was used to encode the given bytes. - - The latest JSON standard (:rfc:`8259`) suggests that only UTF-8 is - accepted. Older documents allowed 8, 16, or 32. 16 and 32 can be big - or little endian. Some editors or libraries may prepend a BOM. - - :internal: - - :param data: Bytes in unknown UTF encoding. - :return: UTF encoding name - - .. deprecated:: 2.0 - Will be removed in Werkzeug 2.1. This is built in to - :func:`json.loads`. - - .. versionadded:: 0.15 - """ - warnings.warn( - "'detect_utf_encoding' is deprecated and will be removed in" - " Werkzeug 2.1. This is built in to 'json.loads'.", - DeprecationWarning, - stacklevel=2, - ) - head = data[:4] - - if head[:3] == codecs.BOM_UTF8: - return "utf-8-sig" - - if b"\x00" not in head: - return "utf-8" - - if head in (codecs.BOM_UTF32_BE, codecs.BOM_UTF32_LE): - return "utf-32" - - if head[:2] in (codecs.BOM_UTF16_BE, codecs.BOM_UTF16_LE): - return "utf-16" - - if len(head) == 4: - if head[:3] == b"\x00\x00\x00": - return "utf-32-be" - - if head[::2] == b"\x00\x00": - return "utf-16-be" - - if head[1:] == b"\x00\x00\x00": - return "utf-32-le" - - if head[1::2] == b"\x00\x00": - return "utf-16-le" - - if len(head) == 2: - return "utf-16-be" if head.startswith(b"\x00") else "utf-16-le" - - return "utf-8" - - -def format_string(string: str, context: t.Mapping[str, t.Any]) -> str: - """String-template format a string: - - >>> format_string('$foo and ${foo}s', dict(foo=42)) - '42 and 42s' - - This does not do any attribute lookup. - - :param string: the format string. - :param context: a dict with the variables to insert. - - .. deprecated:: 2.0 - Will be removed in Werkzeug 2.1. Use :class:`string.Template` - instead. - """ - from string import Template - - warnings.warn( - "'utils.format_string' is deprecated and will be removed in" - " Werkzeug 2.1. Use 'string.Template' instead.", - DeprecationWarning, - stacklevel=2, - ) - return Template(string).substitute(context) - - -def secure_filename(filename: str) -> str: - r"""Pass it a filename and it will return a secure version of it. This - filename can then safely be stored on a regular file system and passed - to :func:`os.path.join`. The filename returned is an ASCII only string - for maximum portability. - - On windows systems the function also makes sure that the file is not - named after one of the special device files. - - >>> secure_filename("My cool movie.mov") - 'My_cool_movie.mov' - >>> secure_filename("../../../etc/passwd") - 'etc_passwd' - >>> secure_filename('i contain cool \xfcml\xe4uts.txt') - 'i_contain_cool_umlauts.txt' - - The function might return an empty filename. It's your responsibility - to ensure that the filename is unique and that you abort or - generate a random filename if the function returned an empty one. - - .. versionadded:: 0.5 - - :param filename: the filename to secure - """ - filename = unicodedata.normalize("NFKD", filename) - filename = filename.encode("ascii", "ignore").decode("ascii") - - for sep in os.path.sep, os.path.altsep: - if sep: - filename = filename.replace(sep, " ") - filename = str(_filename_ascii_strip_re.sub("", "_".join(filename.split()))).strip( - "._" - ) - - # on nt a couple of special files are present in each folder. We - # have to ensure that the target file is not such a filename. In - # this case we prepend an underline - if ( - os.name == "nt" - and filename - and filename.split(".")[0].upper() in _windows_device_files - ): - filename = f"_{filename}" - - return filename - - -def escape(s: t.Any) -> str: - """Replace ``&``, ``<``, ``>``, ``"``, and ``'`` with HTML-safe - sequences. - - ``None`` is escaped to an empty string. - - .. deprecated:: 2.0 - Will be removed in Werkzeug 2.1. Use MarkupSafe instead. - """ - import html - - warnings.warn( - "'utils.escape' is deprecated and will be removed in Werkzeug" - " 2.1. Use MarkupSafe instead.", - DeprecationWarning, - stacklevel=2, - ) - - if s is None: - return "" - - if hasattr(s, "__html__"): - return s.__html__() # type: ignore - - if not isinstance(s, str): - s = str(s) - - return html.escape(s, quote=True) # type: ignore - - -def unescape(s: str) -> str: - """The reverse of :func:`escape`. This unescapes all the HTML - entities, not only those inserted by ``escape``. - - .. deprecated:: 2.0 - Will be removed in Werkzeug 2.1. Use MarkupSafe instead. - """ - import html - - warnings.warn( - "'utils.unescape' is deprecated and will be removed in Werkzueg" - " 2.1. Use MarkupSafe instead.", - DeprecationWarning, - stacklevel=2, - ) - return html.unescape(s) - - -def redirect( - location: str, code: int = 302, Response: t.Optional[t.Type["Response"]] = None -) -> "Response": - """Returns a response object (a WSGI application) that, if called, - redirects the client to the target location. Supported codes are - 301, 302, 303, 305, 307, and 308. 300 is not supported because - it's not a real redirect and 304 because it's the answer for a - request with a request with defined If-Modified-Since headers. - - .. versionadded:: 0.6 - The location can now be a unicode string that is encoded using - the :func:`iri_to_uri` function. - - .. versionadded:: 0.10 - The class used for the Response object can now be passed in. - - :param location: the location the response should redirect to. - :param code: the redirect status code. defaults to 302. - :param class Response: a Response class to use when instantiating a - response. The default is :class:`werkzeug.wrappers.Response` if - unspecified. - """ - import html - - if Response is None: - from .wrappers import Response # type: ignore - - display_location = html.escape(location) - if isinstance(location, str): - # Safe conversion is necessary here as we might redirect - # to a broken URI scheme (for instance itms-services). - from .urls import iri_to_uri - - location = iri_to_uri(location, safe_conversion=True) - response = Response( # type: ignore - '\n' - "Redirecting...\n" - "

    Redirecting...

    \n" - "

    You should be redirected automatically to target URL: " - f'{display_location}. If' - " not click the link.", - code, - mimetype="text/html", - ) - response.headers["Location"] = location - return response - - -def append_slash_redirect(environ: "WSGIEnvironment", code: int = 301) -> "Response": - """Redirects to the same URL but with a slash appended. The behavior - of this function is undefined if the path ends with a slash already. - - :param environ: the WSGI environment for the request that triggers - the redirect. - :param code: the status code for the redirect. - """ - new_path = environ["PATH_INFO"].strip("/") + "/" - query_string = environ.get("QUERY_STRING") - if query_string: - new_path += f"?{query_string}" - return redirect(new_path, code) - - -def send_file( - path_or_file: t.Union[os.PathLike, str, t.BinaryIO], - environ: "WSGIEnvironment", - mimetype: t.Optional[str] = None, - as_attachment: bool = False, - download_name: t.Optional[str] = None, - conditional: bool = True, - etag: t.Union[bool, str] = True, - last_modified: t.Optional[t.Union[datetime, int, float]] = None, - max_age: t.Optional[ - t.Union[int, t.Callable[[t.Optional[str]], t.Optional[int]]] - ] = None, - use_x_sendfile: bool = False, - response_class: t.Optional[t.Type["Response"]] = None, - _root_path: t.Optional[t.Union[os.PathLike, str]] = None, -) -> "Response": - """Send the contents of a file to the client. - - The first argument can be a file path or a file-like object. Paths - are preferred in most cases because Werkzeug can manage the file and - get extra information from the path. Passing a file-like object - requires that the file is opened in binary mode, and is mostly - useful when building a file in memory with :class:`io.BytesIO`. - - Never pass file paths provided by a user. The path is assumed to be - trusted, so a user could craft a path to access a file you didn't - intend. - - If the WSGI server sets a ``file_wrapper`` in ``environ``, it is - used, otherwise Werkzeug's built-in wrapper is used. Alternatively, - if the HTTP server supports ``X-Sendfile``, ``use_x_sendfile=True`` - will tell the server to send the given path, which is much more - efficient than reading it in Python. - - :param path_or_file: The path to the file to send, relative to the - current working directory if a relative path is given. - Alternatively, a file-like object opened in binary mode. Make - sure the file pointer is seeked to the start of the data. - :param environ: The WSGI environ for the current request. - :param mimetype: The MIME type to send for the file. If not - provided, it will try to detect it from the file name. - :param as_attachment: Indicate to a browser that it should offer to - save the file instead of displaying it. - :param download_name: The default name browsers will use when saving - the file. Defaults to the passed file name. - :param conditional: Enable conditional and range responses based on - request headers. Requires passing a file path and ``environ``. - :param etag: Calculate an ETag for the file, which requires passing - a file path. Can also be a string to use instead. - :param last_modified: The last modified time to send for the file, - in seconds. If not provided, it will try to detect it from the - file path. - :param max_age: How long the client should cache the file, in - seconds. If set, ``Cache-Control`` will be ``public``, otherwise - it will be ``no-cache`` to prefer conditional caching. - :param use_x_sendfile: Set the ``X-Sendfile`` header to let the - server to efficiently send the file. Requires support from the - HTTP server. Requires passing a file path. - :param response_class: Build the response using this class. Defaults - to :class:`~werkzeug.wrappers.Response`. - :param _root_path: Do not use. For internal use only. Use - :func:`send_from_directory` to safely send files under a path. - - .. versionadded:: 2.0 - Adapted from Flask's implementation. - - .. versionchanged:: 2.0 - ``download_name`` replaces Flask's ``attachment_filename`` - parameter. If ``as_attachment=False``, it is passed with - ``Content-Disposition: inline`` instead. - - .. versionchanged:: 2.0 - ``max_age`` replaces Flask's ``cache_timeout`` parameter. - ``conditional`` is enabled and ``max_age`` is not set by - default. - - .. versionchanged:: 2.0 - ``etag`` replaces Flask's ``add_etags`` parameter. It can be a - string to use instead of generating one. - - .. versionchanged:: 2.0 - If an encoding is returned when guessing ``mimetype`` from - ``download_name``, set the ``Content-Encoding`` header. - """ - if response_class is None: - from .wrappers import Response - - response_class = Response - - path: t.Optional[str] = None - file: t.Optional[t.BinaryIO] = None - size: t.Optional[int] = None - mtime: t.Optional[float] = None - headers = Headers() - - if isinstance(path_or_file, (os.PathLike, str)) or hasattr( - path_or_file, "__fspath__" - ): - path_or_file = t.cast(t.Union[os.PathLike, str], path_or_file) - - # Flask will pass app.root_path, allowing its send_file wrapper - # to not have to deal with paths. - if _root_path is not None: - path = os.path.join(_root_path, path_or_file) - else: - path = os.path.abspath(path_or_file) - - stat = os.stat(path) - size = stat.st_size - mtime = stat.st_mtime - else: - file = path_or_file - - if download_name is None and path is not None: - download_name = os.path.basename(path) - - if mimetype is None: - if download_name is None: - raise TypeError( - "Unable to detect the MIME type because a file name is" - " not available. Either set 'download_name', pass a" - " path instead of a file, or set 'mimetype'." - ) - - mimetype, encoding = mimetypes.guess_type(download_name) - - if mimetype is None: - mimetype = "application/octet-stream" - - if encoding is not None: - headers.set("Content-Encoding", encoding) - - if download_name is not None: - try: - download_name.encode("ascii") - except UnicodeEncodeError: - simple = unicodedata.normalize("NFKD", download_name) - simple = simple.encode("ascii", "ignore").decode("ascii") - quoted = url_quote(download_name, safe="") - names = {"filename": simple, "filename*": f"UTF-8''{quoted}"} - else: - names = {"filename": download_name} - - value = "attachment" if as_attachment else "inline" - headers.set("Content-Disposition", value, **names) - elif as_attachment: - raise TypeError( - "No name provided for attachment. Either set" - " 'download_name' or pass a path instead of a file." - ) - - if use_x_sendfile and path is not None: - headers["X-Sendfile"] = path - data = None - else: - if file is None: - file = open(path, "rb") # type: ignore - elif isinstance(file, io.BytesIO): - size = file.getbuffer().nbytes - elif isinstance(file, io.TextIOBase): - raise ValueError("Files must be opened in binary mode or use BytesIO.") - - data = wrap_file(environ, file) - - rv = response_class( - data, mimetype=mimetype, headers=headers, direct_passthrough=True - ) - - if size is not None: - rv.content_length = size - - if last_modified is not None: - rv.last_modified = last_modified # type: ignore - elif mtime is not None: - rv.last_modified = mtime # type: ignore - - rv.cache_control.no_cache = True - - # Flask will pass app.get_send_file_max_age, allowing its send_file - # wrapper to not have to deal with paths. - if callable(max_age): - max_age = max_age(path) - - if max_age is not None: - if max_age > 0: - rv.cache_control.no_cache = None - rv.cache_control.public = True - - rv.cache_control.max_age = max_age - rv.expires = int(time() + max_age) # type: ignore - - if isinstance(etag, str): - rv.set_etag(etag) - elif etag and path is not None: - check = adler32(path.encode("utf-8")) & 0xFFFFFFFF - rv.set_etag(f"{mtime}-{size}-{check}") - - if conditional: - try: - rv = rv.make_conditional(environ, accept_ranges=True, complete_length=size) - except RequestedRangeNotSatisfiable: - if file is not None: - file.close() - - raise - - # Some x-sendfile implementations incorrectly ignore the 304 - # status code and send the file anyway. - if rv.status_code == 304: - rv.headers.pop("x-sendfile", None) - - return rv - - -def send_from_directory( - directory: t.Union[os.PathLike, str], - path: t.Union[os.PathLike, str], - environ: "WSGIEnvironment", - **kwargs: t.Any, -) -> "Response": - """Send a file from within a directory using :func:`send_file`. - - This is a secure way to serve files from a folder, such as static - files or uploads. Uses :func:`~werkzeug.security.safe_join` to - ensure the path coming from the client is not maliciously crafted to - point outside the specified directory. - - If the final path does not point to an existing regular file, - returns a 404 :exc:`~werkzeug.exceptions.NotFound` error. - - :param directory: The directory that ``path`` must be located under. - :param path: The path to the file to send, relative to - ``directory``. - :param environ: The WSGI environ for the current request. - :param kwargs: Arguments to pass to :func:`send_file`. - - .. versionadded:: 2.0 - Adapted from Flask's implementation. - """ - path = safe_join(os.fspath(directory), os.fspath(path)) - - if path is None: - raise NotFound() - - # Flask will pass app.root_path, allowing its send_from_directory - # wrapper to not have to deal with paths. - if "_root_path" in kwargs: - path = os.path.join(kwargs["_root_path"], path) - - try: - if not os.path.isfile(path): - raise NotFound() - except ValueError: - # path contains null byte on Python < 3.8 - raise NotFound() - - return send_file(path, environ, **kwargs) - - -def import_string(import_name: str, silent: bool = False) -> t.Any: - """Imports an object based on a string. This is useful if you want to - use import paths as endpoints or something similar. An import path can - be specified either in dotted notation (``xml.sax.saxutils.escape``) - or with a colon as object delimiter (``xml.sax.saxutils:escape``). - - If `silent` is True the return value will be `None` if the import fails. - - :param import_name: the dotted name for the object to import. - :param silent: if set to `True` import errors are ignored and - `None` is returned instead. - :return: imported object - """ - import_name = import_name.replace(":", ".") - try: - try: - __import__(import_name) - except ImportError: - if "." not in import_name: - raise - else: - return sys.modules[import_name] - - module_name, obj_name = import_name.rsplit(".", 1) - module = __import__(module_name, globals(), locals(), [obj_name]) - try: - return getattr(module, obj_name) - except AttributeError as e: - raise ImportError(e) - - except ImportError as e: - if not silent: - raise ImportStringError(import_name, e).with_traceback(sys.exc_info()[2]) - - return None - - -def find_modules( - import_path: str, include_packages: bool = False, recursive: bool = False -) -> t.Iterator[str]: - """Finds all the modules below a package. This can be useful to - automatically import all views / controllers so that their metaclasses / - function decorators have a chance to register themselves on the - application. - - Packages are not returned unless `include_packages` is `True`. This can - also recursively list modules but in that case it will import all the - packages to get the correct load path of that module. - - :param import_path: the dotted name for the package to find child modules. - :param include_packages: set to `True` if packages should be returned, too. - :param recursive: set to `True` if recursion should happen. - :return: generator - """ - module = import_string(import_path) - path = getattr(module, "__path__", None) - if path is None: - raise ValueError(f"{import_path!r} is not a package") - basename = f"{module.__name__}." - for _importer, modname, ispkg in pkgutil.iter_modules(path): - modname = basename + modname - if ispkg: - if include_packages: - yield modname - if recursive: - yield from find_modules(modname, include_packages, True) - else: - yield modname - - -def validate_arguments(func, args, kwargs, drop_extra=True): # type: ignore - """Checks if the function accepts the arguments and keyword arguments. - Returns a new ``(args, kwargs)`` tuple that can safely be passed to - the function without causing a `TypeError` because the function signature - is incompatible. If `drop_extra` is set to `True` (which is the default) - any extra positional or keyword arguments are dropped automatically. - - The exception raised provides three attributes: - - `missing` - A set of argument names that the function expected but where - missing. - - `extra` - A dict of keyword arguments that the function can not handle but - where provided. - - `extra_positional` - A list of values that where given by positional argument but the - function cannot accept. - - This can be useful for decorators that forward user submitted data to - a view function:: - - from werkzeug.utils import ArgumentValidationError, validate_arguments - - def sanitize(f): - def proxy(request): - data = request.values.to_dict() - try: - args, kwargs = validate_arguments(f, (request,), data) - except ArgumentValidationError: - raise BadRequest('The browser failed to transmit all ' - 'the data expected.') - return f(*args, **kwargs) - return proxy - - :param func: the function the validation is performed against. - :param args: a tuple of positional arguments. - :param kwargs: a dict of keyword arguments. - :param drop_extra: set to `False` if you don't want extra arguments - to be silently dropped. - :return: tuple in the form ``(args, kwargs)``. - - .. deprecated:: 2.0 - Will be removed in Werkzeug 2.1. Use :func:`inspect.signature` - instead. - """ - warnings.warn( - "'utils.validate_arguments' is deprecated and will be removed" - " in Werkzeug 2.1. Use 'inspect.signature' instead.", - DeprecationWarning, - stacklevel=2, - ) - parser = _parse_signature(func) - args, kwargs, missing, extra, extra_positional = parser(args, kwargs)[:5] - if missing: - raise ArgumentValidationError(tuple(missing)) - elif (extra or extra_positional) and not drop_extra: - raise ArgumentValidationError(None, extra, extra_positional) - return tuple(args), kwargs - - -def bind_arguments(func, args, kwargs): # type: ignore - """Bind the arguments provided into a dict. When passed a function, - a tuple of arguments and a dict of keyword arguments `bind_arguments` - returns a dict of names as the function would see it. This can be useful - to implement a cache decorator that uses the function arguments to build - the cache key based on the values of the arguments. - - :param func: the function the arguments should be bound for. - :param args: tuple of positional arguments. - :param kwargs: a dict of keyword arguments. - :return: a :class:`dict` of bound keyword arguments. - - .. deprecated:: 2.0 - Will be removed in Werkzeug 2.1. Use :meth:`Signature.bind` - instead. - """ - warnings.warn( - "'utils.bind_arguments' is deprecated and will be removed in" - " Werkzeug 2.1. Use 'Signature.bind' instead.", - DeprecationWarning, - stacklevel=2, - ) - ( - args, - kwargs, - missing, - extra, - extra_positional, - arg_spec, - vararg_var, - kwarg_var, - ) = _parse_signature(func)(args, kwargs) - values = {} - for (name, _has_default, _default), value in zip(arg_spec, args): - values[name] = value - if vararg_var is not None: - values[vararg_var] = tuple(extra_positional) - elif extra_positional: - raise TypeError("too many positional arguments") - if kwarg_var is not None: - multikw = set(extra) & {x[0] for x in arg_spec} - if multikw: - raise TypeError( - f"got multiple values for keyword argument {next(iter(multikw))!r}" - ) - values[kwarg_var] = extra - elif extra: - raise TypeError(f"got unexpected keyword argument {next(iter(extra))!r}") - return values - - -class ArgumentValidationError(ValueError): - """Raised if :func:`validate_arguments` fails to validate - - .. deprecated:: 2.0 - Will be removed in Werkzeug 2.1 along with ``utils.bind`` and - ``validate_arguments``. - """ - - def __init__(self, missing=None, extra=None, extra_positional=None): # type: ignore - self.missing = set(missing or ()) - self.extra = extra or {} - self.extra_positional = extra_positional or [] - super().__init__( - "function arguments invalid." - f" ({len(self.missing)} missing," - f" {len(self.extra) + len(self.extra_positional)} additional)" - ) - - -class ImportStringError(ImportError): - """Provides information about a failed :func:`import_string` attempt.""" - - #: String in dotted notation that failed to be imported. - import_name: str - #: Wrapped exception. - exception: BaseException - - def __init__(self, import_name: str, exception: BaseException) -> None: - self.import_name = import_name - self.exception = exception - msg = import_name - name = "" - tracked = [] - for part in import_name.replace(":", ".").split("."): - name = f"{name}.{part}" if name else part - imported = import_string(name, silent=True) - if imported: - tracked.append((name, getattr(imported, "__file__", None))) - else: - track = [f"- {n!r} found in {i!r}." for n, i in tracked] - track.append(f"- {name!r} not found.") - track_str = "\n".join(track) - msg = ( - f"import_string() failed for {import_name!r}. Possible reasons" - f" are:\n\n" - "- missing __init__.py in a package;\n" - "- package or module path not included in sys.path;\n" - "- duplicated package or module name taking precedence in" - " sys.path;\n" - "- missing module, class, function or variable;\n\n" - f"Debugged import:\n\n{track_str}\n\n" - f"Original exception:\n\n{type(exception).__name__}: {exception}" - ) - break - - super().__init__(msg) - - def __repr__(self) -> str: - return f"<{type(self).__name__}({self.import_name!r}, {self.exception!r})>" diff --git a/venv/lib/python3.8/site-packages/werkzeug/wrappers/__init__.py b/venv/lib/python3.8/site-packages/werkzeug/wrappers/__init__.py deleted file mode 100644 index eb69a99..0000000 --- a/venv/lib/python3.8/site-packages/werkzeug/wrappers/__init__.py +++ /dev/null @@ -1,16 +0,0 @@ -from .accept import AcceptMixin -from .auth import AuthorizationMixin -from .auth import WWWAuthenticateMixin -from .base_request import BaseRequest -from .base_response import BaseResponse -from .common_descriptors import CommonRequestDescriptorsMixin -from .common_descriptors import CommonResponseDescriptorsMixin -from .etag import ETagRequestMixin -from .etag import ETagResponseMixin -from .request import PlainRequest -from .request import Request as Request -from .request import StreamOnlyMixin -from .response import Response as Response -from .response import ResponseStream -from .response import ResponseStreamMixin -from .user_agent import UserAgentMixin diff --git a/venv/lib/python3.8/site-packages/werkzeug/wrappers/__pycache__/__init__.cpython-38.pyc b/venv/lib/python3.8/site-packages/werkzeug/wrappers/__pycache__/__init__.cpython-38.pyc deleted file mode 100644 index b5db47b744edb3387b1040d829712aed1c48fa5e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 874 zcmaKq&2rN)5XbGrNgRLWqiG2Tde0%`P>xK8@Nwj0S~{80#RyxZo=Ub^%Y^nJcn?mz z1W(~BCtjf^R&qpPhCv?h{PwS1X|=N#Vdz=7+;6whjRX0s98_&ufC&6t<>h0 zu!(Ie?(mN2lCI`1vO^rr4)2LR>1*!sfpCedxzC5fBcA2~vQK=?E)PUVLd`?uh(ww_ zJ`!Ux*6brs$V791JS9`jAwLi^GSeI(ACg1OBjh7;q!Fr2L(8{aD{iaWK_dpFu<4|l7bP>TpLxT6% zofz8oKu<~GUTQCgzS5?N?oyoI^#=y(5Eo73FiE#CRKA+gW?;_ql@urwD&2+siy%_k zNSU$P@M^3&rmAe1pzzg#x!P3b_H-phxhk`AS?489u2{Op2;|VSY9{oV^O3vXQyhKs$(>P{lD)Q$g1*2 diff --git a/venv/lib/python3.8/site-packages/werkzeug/wrappers/__pycache__/accept.cpython-38.pyc b/venv/lib/python3.8/site-packages/werkzeug/wrappers/__pycache__/accept.cpython-38.pyc deleted file mode 100644 index 7425ef057b081784c41b5138e2123538798f3348..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 776 zcmYjP&2AGh5cba|T|&a2;BIk=f|Nwi9xFs8Bu?Z2LY4MnmbKG5b)2p3&623MR_Y0! zfEVZi@jkwC>MN8B<4sg$q#4ibSl@i}t-tho9R!yCx%>JXBlI^GyGEgS2ku@%5J+H+ zGTfXbBOj0;f?gp(FG)rP{)`66E!;zsBF0@ywuO5IiEJ=3BIzuNF0dfK=rx*RK}B-a z&05zeL0KE{TH)bQQOMGNRNs}E3}{Gld*VX-tlpef`pTLDxZhjk+yZ|L-thKlh6VN{ zvi(6Z^7InTk_&u6eqsz;Mc$LO>+ekJGv%0&rIkhQrC_-ctX5jHZ<1L#Uo7F9GVEB| zv$d>F*qhPo5$k`F=aqE6&&;BRcA+aF9rLG>O)FD)wJ^C>e#L|WT(4K7TLK&hICPxP zi!&{kQp3tA>}HgKHItZyXYaQ}0N{Aj3N2Ta(uS0CWt8VUD&wS{+PJ-qa^K+afb&A< z&T)Q&?heO(UXDvu4l7f_G%1Glsg!!SFXsExr9Bwe+ik|R%}YRc);u(BXW(5S5O3m-F)~*V_*EfgYI+dgyK07E)`@ z?Gu=@36Em-G=?Zw{IxD7DQ@aP654)Mf?oDTypzTd`#T5?RzwKt;fBiF_+nhtDa9%M E5AT}DH2?qr diff --git a/venv/lib/python3.8/site-packages/werkzeug/wrappers/__pycache__/auth.cpython-38.pyc b/venv/lib/python3.8/site-packages/werkzeug/wrappers/__pycache__/auth.cpython-38.pyc deleted file mode 100644 index cc098378f4c5f5311264e3044c88c6ac25a7b79d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1250 zcmb_c!EO^V5VhC4=~7Y(QQ-ipWO0c=Y66rKLWoL8oX7!$f^sp-+G*W7&erxeBr2y? z>IuGpALxny*(<01Lb))LL{+5rfKV;X?2JeIX5P%~eq32uCUDYU=bt|@LVlyOc;Jq_ z2JufoNg}BsJvx0xz345Gkz~h2vZJWSz>8%9UIJb$=?C(tb_Q>ePL6u<#B;|#2188| zdy!(hF^Z%z`pHg6pGqd<<9aVSAu;LI057Q;TV>c8Iz7pP9@=;MtG1m}R>hgy_El|f zGdk(KPUyNkS^{_Ce6zUn_PP? zRpC^g1tocAB_C;H_!q^U8VnEMPFvnpZf~N>ZT_tFw8fk6)qbgbXmUFoK{z+1RGx<& z#rvhrkxgcF7;~usH<)qjEP^UeX|?P_mhTyLpv-Afr9jbY3v6Sws>YjnApp>wg{s7t zg>qFYgtj^eferG?^d0uyVHW`Qh7h^QyoWG3f6)$uqFv}>qqGHNQ*vXpqmAWoG6P8Y;GBXGyA+dC9plMhLeC>1L{d)?HNCGbHHINa@tS#`Rn4cDqPQ z*`RUwvjudxT-UK}-LMu6O9}83ITU9&k8d7rY^*UH@gJ{#doCFJ zlQyd(#LXR?_CA7Qiffkg_Uomd@|3UriAV)!KQkp%aK=;s!Kt5yxDQo?`v?StDt;!? zNb!fP-#bT5Z1^9|tYzz;ZQLZyc*70hw7Ju)&b6YIPG(<&cpR?LO;k7vR(1O@KKG?pSS?CmCOpQlMy5aCetI76=m`m z%=j3Z{p9<>cZ1}Sg=D+1%SYYJwf!dP6!uYLX=}*T;G7=zlDjoqXZcve5$Jy4;#p?O zqTIJm(8_Jz@2nTo^6}!xtz9TL6j2O;k46l6`I4Cr@$>5Lu%1-Is;G9FvO@i!c4h|v zdgqp!+}b-bKMZHxqlYt-RTUUJ9HHaVEK)b9=I)x5ODA#)wUjZcw(AIt3+{Oy_g;tL z@mH6#GPrb=@-*ew`&Y-thm&0Z_HL}NOoVZTOrhsH={#g+HMf6Df_ z@|8GSPlKmSurx$^1@6iUxpw=$6PdwM564*R`*u+l)I*kos++2so@u{CxXj&Cb|_Bx ziT69_*vl3iw*Q&K+ix2{Ih`S8bKNMgNqqpxUQ^~ZvN6*|Jx^4Dy`k3g!TTyDuniK7 za#oZ@EhRZ_LGPI_&?R#N0sBBt%C@UXc~Lhe!L!eCUQ~*Yr28w3j<;4KiEQf>N9H5^ z+k8y$3BjiXpAjSoZlg1jgVsw!Z4FRx4V9`Pb9BK{e~Nj#$DZDs0QMuo4_{T-r-ll|GqFBshZ{5GT^#-&@u2uj5 diff --git a/venv/lib/python3.8/site-packages/werkzeug/wrappers/__pycache__/base_response.cpython-38.pyc b/venv/lib/python3.8/site-packages/werkzeug/wrappers/__pycache__/base_response.cpython-38.pyc deleted file mode 100644 index d90fc6eacebdeccc8a22fd82a00ec26422574880..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1740 zcmd5+PjA~c6elH0mNRE-gLWPE55iEu_0ZT`+v6~FOR?Q@SXUI#g_FgXL^ds}q!hzJ zZVAv+_X&FHt*3n-UU$k@=yuq9vbDI&Fbvpb1o)HqNWRDS=l7m$Z*MUi(Jya)dLl1K4t2Sjb4cIec6^#A&}kfW~a%fjv5)2Yxj;In+`k|*|orh2CCW=nTP7zLH_~HJ)HJKgo;hL z;#Fhqh0j^#pYlqad1yiGpG^ASrWRTc`f+Y!1*L&3tw60& zf|;H`eHh;xemRVvScv<%ZC`aK)AnxMY8;@-!d8%~;RQYIHFsOKO0%hkW6*=ZMT^uF zd2wi+pg*_sXl*{97f)APZtGIJp_pP2e6(W7&)3Ynho3ilqiR-;%DmjIixTyN+Fcw0 z=-vBjcK_hmJQyw3uO2N-T9#n!XpF8)v(DbIT)OL0wr*q;Z7CzvZF>le3+{Oy_kIt< zliODlGrV$@QboR}MFxhd@c)sg_DOf<R=axVN8auxBvx*wRnLce;(_3YTe@hW#AjEiNOU6<6L%|2aG0 z%2(pNmjut5U`dD^3tVrLVfzE$iPT`Zhf}QgL%XUBY9;NU3a84ZciPVot}^(HO~ffb z^?v3YTiS}r^?zq_zh!MdF6Ij)Zl-GmHm;5!KB$YVLQbYSua>dOu|-sRIsB($32cot zqqOBkUP(!=ThIsQ6LiXaih$jqD`nH&q`WL06XV{;I4_IEN9O$&c1~_?1`|2A*4!~S z@wj=P;1c7~K!)jS# uuUcs*YPhIv9}OLxzyr_}P;-BS5{Ml@@2!W^s7kU7pN_#OO_O@vqC$*g}TlGYX zdV(+D2YTXva^=)tC>Lh3>1w4`1)*A+@r*~AnKyp%hq<{~0xSG^^6?8JA3(m+3 z5c>#}Ac88=r}ggjz1Ku|f*laS_Pss>&ldrB0eHTk@5zJKF?>Z<6V%hoZyfs&3|VLF zdy;MXD1r*_2RkGKDwyyO+Wp{=_@v*0d_lGND$lZ9zmwagv~ES(#H5AGjeVPbPW9>$ ztNhrk+p4uS9PdWD(&&Uvl}Ahg$UKO>2g;F6DyZ`i%{NAgWBX*&-=llpcS->@RQ6YQ zzjiLH-HB2g30WAK#7>GR)*>3FN=2V!WMr1_z*(xJHEFhXWw{Qj$-)cf6<*}Z?^ zP`i_6XRvV{XOi=3mh&tZr9!*S`F0trCPH1sUg~kZYOcYONToP8H=*)aEueJ^6%G@T zTQovi`3_*N&i3!@G&2CmgsAXcG1pPmXMduhk%-ei*A-br^)HoN4O zKu-DuzCcdC&s;s_72?IJogplV2az;XO;s23)!#Ssd0}Cmz=?leeCaYmexWma;Eucj zaZf=>BB>@lI(-Jc-~*9?WG6(j01uv5~flF9I-*^5p|NO}#xi^`>UpEfo()PA9y|Ck+SrhCT9FtOXNZ0wDy zr&YeNCZ#hOv5g315yU+L<;gCU)CbtWH%5tP$7DA=qDR4ZN}*9m7Ir6xt*hx;Jab&C z+^RJ3O7g@=KFYM_Ulq4%Fg$>}%^?=Fi*D+Pqa4+~Q_9f^ez}sT}t^iuVhX z`fO+to%u1B8Q^+7Zl4EG;~6dIolnv|tqznvi^>=pG?{^3L$u13_jMrvuvLZ1$Q8M= zWh_KyGA{&<$0^;nICG0L0N7hXq&jg9!sOy*#}D#Op5<$W$swDPYoi^d^xC={toIM> zi_WO-rZcih4(P6v4y|kFV~g`_fVd_oLPHv`fCj%CbCU;GC)d8LXb!70$v_EF&I>UZ z%0i>v6k@+fbRD6-WN%HCqFks8PLLzG5scAL?{=Yn{ApV_bb`E;5F)I8K*d%9~Ch! AbN~PV diff --git a/venv/lib/python3.8/site-packages/werkzeug/wrappers/__pycache__/etag.cpython-38.pyc b/venv/lib/python3.8/site-packages/werkzeug/wrappers/__pycache__/etag.cpython-38.pyc deleted file mode 100644 index 1d84b1ebd13984c880f152870cdd701424b99483..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1235 zcmb_c&2G~`5Z?9LsVOP_5g<_sX~iW1sR>X{2qBO_oXCM6Rmx>C-c9OuvvGIVO%wIj zNrhCfDFtGzyHg?C= z(<)zBlhV12*hU1h4B{Su@??if>H}=x8>7UtBeD}7(!=08rO+rO3%k>U*5!09o;fa6 zZdICiC3#{bA7@(guZmkW9PPthX84w}yHiyR_|x{2HgDAhx40RNA)M+$D#!h{;{C#; zJ{y@tXMVzE2Dn~N+GhdOcuLDf=aY0-t9_+UqcVmDO=h6i5Uq0UO%CS#&}yPy|F2WoBe(J ztTV2=>5OfX1G?)dpA6dh#Ns>~Ag&3D(2xc!puz9P!t~zd$+a&kTEOZ|GE_p8i$V-X zve0NZh1e?+T}P-d*=tj!D3|JjQ>C>K_BJG|)EZiMP~pU|J%>h2XZ|%3Z?)>jg>j3~Ihc#8%J@Y^oR|2WJ0xLDV|J_g2Odr@ AS^xk5 diff --git a/venv/lib/python3.8/site-packages/werkzeug/wrappers/__pycache__/json.cpython-38.pyc b/venv/lib/python3.8/site-packages/werkzeug/wrappers/__pycache__/json.cpython-38.pyc deleted file mode 100644 index bcba919f13e099f34e91b43e1322d90c42bd7ed5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 768 zcmYjP&1xGl5Z2FnyD@fu0=g+ifF7aB^y7j?Um6FIWHmbBj5y$_%?SB)L6xAw91*rP>ejiM3dwKUyz>|!%R{2a5eAj`gE9bOvuv8BKK0T+z3`Ht=Tuptenmk@J$(Z zBJKG~R;TQF|5=}PKFfI}o$oL+tD#)zN=V22nPlV26kg3tu9aUhp@7%xW&f6d!Y&R? z=kwxR%Z1c1ZU&PXWnjo8qHy?bD+CBmHl@&TRVi)AI9En_&f{L3)MFcGw{g`sI2>?Z z=-fHZZ_wS#fuELxQkA{Rl+aCzUVSE|?j4Eg(Rg8B4C?JPgWBdLu)D#;%}l>s+7|Go z;4T7$6HExf;rvkHr%1TRa!`` zIkyj?%O>29=ur%DRq>~~2r|6RyGcm>vV>jP$MH@UL#*#HthpjX$X;!vypC_h#T{ih GqyGV+6T~3^ diff --git a/venv/lib/python3.8/site-packages/werkzeug/wrappers/__pycache__/request.cpython-38.pyc b/venv/lib/python3.8/site-packages/werkzeug/wrappers/__pycache__/request.cpython-38.pyc deleted file mode 100644 index 431bd187f8d5b9d96960538750ce1e62c66806d0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21227 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 Pr-i9MaPRDVp7Cw%v$8q&kn7^KzJMli} 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 MPydc5xiX%K{}|uRzW@LL diff --git a/venv/lib/python3.8/site-packages/werkzeug/wrappers/accept.py b/venv/lib/python3.8/site-packages/werkzeug/wrappers/accept.py deleted file mode 100644 index 9605e63..0000000 --- a/venv/lib/python3.8/site-packages/werkzeug/wrappers/accept.py +++ /dev/null @@ -1,14 +0,0 @@ -import typing as t -import warnings - - -class AcceptMixin: - def __init__(self, *args: t.Any, **kwargs: t.Any) -> None: - warnings.warn( - "'AcceptMixin' is deprecated and will be removed in" - " Werkzeug 2.1. 'Request' now includes the functionality" - " directly.", - DeprecationWarning, - stacklevel=2, - ) - super().__init__(*args, **kwargs) # type: ignore diff --git a/venv/lib/python3.8/site-packages/werkzeug/wrappers/auth.py b/venv/lib/python3.8/site-packages/werkzeug/wrappers/auth.py deleted file mode 100644 index da31b7c..0000000 --- a/venv/lib/python3.8/site-packages/werkzeug/wrappers/auth.py +++ /dev/null @@ -1,26 +0,0 @@ -import typing as t -import warnings - - -class AuthorizationMixin: - def __init__(self, *args: t.Any, **kwargs: t.Any) -> None: - warnings.warn( - "'AuthorizationMixin' is deprecated and will be removed in" - " Werkzeug 2.1. 'Request' now includes the functionality" - " directly.", - DeprecationWarning, - stacklevel=2, - ) - super().__init__(*args, **kwargs) # type: ignore - - -class WWWAuthenticateMixin: - def __init__(self, *args: t.Any, **kwargs: t.Any) -> None: - warnings.warn( - "'WWWAuthenticateMixin' is deprecated and will be removed" - " in Werkzeug 2.1. 'Response' now includes the" - " functionality directly.", - DeprecationWarning, - stacklevel=2, - ) - super().__init__(*args, **kwargs) # type: ignore diff --git a/venv/lib/python3.8/site-packages/werkzeug/wrappers/base_request.py b/venv/lib/python3.8/site-packages/werkzeug/wrappers/base_request.py deleted file mode 100644 index 451989f..0000000 --- a/venv/lib/python3.8/site-packages/werkzeug/wrappers/base_request.py +++ /dev/null @@ -1,36 +0,0 @@ -import typing as t -import warnings - -from .request import Request - - -class _FakeSubclassCheck(type): - def __subclasscheck__(cls, subclass: t.Type) -> bool: - warnings.warn( - "'BaseRequest' is deprecated and will be removed in" - " Werkzeug 2.1. Use 'issubclass(cls, Request)' instead.", - DeprecationWarning, - stacklevel=2, - ) - return issubclass(subclass, Request) - - def __instancecheck__(cls, instance: t.Any) -> bool: - warnings.warn( - "'BaseRequest' is deprecated and will be removed in" - " Werkzeug 2.1. Use 'isinstance(obj, Request)' instead.", - DeprecationWarning, - stacklevel=2, - ) - return isinstance(instance, Request) - - -class BaseRequest(Request, metaclass=_FakeSubclassCheck): - def __init__(self, *args: t.Any, **kwargs: t.Any) -> None: - warnings.warn( - "'BaseRequest' is deprecated and will be removed in" - " Werkzeug 2.1. 'Request' now includes the functionality" - " directly.", - DeprecationWarning, - stacklevel=2, - ) - super().__init__(*args, **kwargs) diff --git a/venv/lib/python3.8/site-packages/werkzeug/wrappers/base_response.py b/venv/lib/python3.8/site-packages/werkzeug/wrappers/base_response.py deleted file mode 100644 index 3e0dc67..0000000 --- a/venv/lib/python3.8/site-packages/werkzeug/wrappers/base_response.py +++ /dev/null @@ -1,36 +0,0 @@ -import typing as t -import warnings - -from .response import Response - - -class _FakeSubclassCheck(type): - def __subclasscheck__(cls, subclass: t.Type) -> bool: - warnings.warn( - "'BaseResponse' is deprecated and will be removed in" - " Werkzeug 2.1. Use 'issubclass(cls, Response)' instead.", - DeprecationWarning, - stacklevel=2, - ) - return issubclass(subclass, Response) - - def __instancecheck__(cls, instance: t.Any) -> bool: - warnings.warn( - "'BaseResponse' is deprecated and will be removed in" - " Werkzeug 2.1. Use 'isinstance(obj, Response)' instead.", - DeprecationWarning, - stacklevel=2, - ) - return isinstance(instance, Response) - - -class BaseResponse(Response, metaclass=_FakeSubclassCheck): - def __init__(self, *args: t.Any, **kwargs: t.Any) -> None: - warnings.warn( - "'BaseResponse' is deprecated and will be removed in" - " Werkzeug 2.1. 'Response' now includes the functionality" - " directly.", - DeprecationWarning, - stacklevel=2, - ) - super().__init__(*args, **kwargs) diff --git a/venv/lib/python3.8/site-packages/werkzeug/wrappers/common_descriptors.py b/venv/lib/python3.8/site-packages/werkzeug/wrappers/common_descriptors.py deleted file mode 100644 index db87ea5..0000000 --- a/venv/lib/python3.8/site-packages/werkzeug/wrappers/common_descriptors.py +++ /dev/null @@ -1,26 +0,0 @@ -import typing as t -import warnings - - -class CommonRequestDescriptorsMixin: - def __init__(self, *args: t.Any, **kwargs: t.Any) -> None: - warnings.warn( - "'CommonRequestDescriptorsMixin' is deprecated and will be" - " removed in Werkzeug 2.1. 'Request' now includes the" - " functionality directly.", - DeprecationWarning, - stacklevel=2, - ) - super().__init__(*args, **kwargs) # type: ignore - - -class CommonResponseDescriptorsMixin: - def __init__(self, *args: t.Any, **kwargs: t.Any) -> None: - warnings.warn( - "'CommonResponseDescriptorsMixin' is deprecated and will be" - " removed in Werkzeug 2.1. 'Response' now includes the" - " functionality directly.", - DeprecationWarning, - stacklevel=2, - ) - super().__init__(*args, **kwargs) # type: ignore diff --git a/venv/lib/python3.8/site-packages/werkzeug/wrappers/cors.py b/venv/lib/python3.8/site-packages/werkzeug/wrappers/cors.py deleted file mode 100644 index 89cf83e..0000000 --- a/venv/lib/python3.8/site-packages/werkzeug/wrappers/cors.py +++ /dev/null @@ -1,26 +0,0 @@ -import typing as t -import warnings - - -class CORSRequestMixin: - def __init__(self, *args: t.Any, **kwargs: t.Any) -> None: - warnings.warn( - "'CORSRequestMixin' is deprecated and will be removed in" - " Werkzeug 2.1. 'Request' now includes the functionality" - " directly.", - DeprecationWarning, - stacklevel=2, - ) - super().__init__(*args, **kwargs) # type: ignore - - -class CORSResponseMixin: - def __init__(self, *args: t.Any, **kwargs: t.Any) -> None: - warnings.warn( - "'CORSResponseMixin' is deprecated and will be removed in" - " Werkzeug 2.1. 'Response' now includes the functionality" - " directly.", - DeprecationWarning, - stacklevel=2, - ) - super().__init__(*args, **kwargs) # type: ignore diff --git a/venv/lib/python3.8/site-packages/werkzeug/wrappers/etag.py b/venv/lib/python3.8/site-packages/werkzeug/wrappers/etag.py deleted file mode 100644 index 2e9015a..0000000 --- a/venv/lib/python3.8/site-packages/werkzeug/wrappers/etag.py +++ /dev/null @@ -1,26 +0,0 @@ -import typing as t -import warnings - - -class ETagRequestMixin: - def __init__(self, *args: t.Any, **kwargs: t.Any) -> None: - warnings.warn( - "'ETagRequestMixin' is deprecated and will be removed in" - " Werkzeug 2.1. 'Request' now includes the functionality" - " directly.", - DeprecationWarning, - stacklevel=2, - ) - super().__init__(*args, **kwargs) # type: ignore - - -class ETagResponseMixin: - def __init__(self, *args: t.Any, **kwargs: t.Any) -> None: - warnings.warn( - "'ETagResponseMixin' is deprecated and will be removed in" - " Werkzeug 2.1. 'Response' now includes the functionality" - " directly.", - DeprecationWarning, - stacklevel=2, - ) - super().__init__(*args, **kwargs) # type: ignore diff --git a/venv/lib/python3.8/site-packages/werkzeug/wrappers/json.py b/venv/lib/python3.8/site-packages/werkzeug/wrappers/json.py deleted file mode 100644 index ab6ed7b..0000000 --- a/venv/lib/python3.8/site-packages/werkzeug/wrappers/json.py +++ /dev/null @@ -1,13 +0,0 @@ -import typing as t -import warnings - - -class JSONMixin: - def __init__(self, *args: t.Any, **kwargs: t.Any) -> None: - warnings.warn( - "'JSONMixin' is deprecated and will be removed in Werkzeug" - " 2.1. 'Request' now includes the functionality directly.", - DeprecationWarning, - stacklevel=2, - ) - super().__init__(*args, **kwargs) # type: ignore diff --git a/venv/lib/python3.8/site-packages/werkzeug/wrappers/request.py b/venv/lib/python3.8/site-packages/werkzeug/wrappers/request.py deleted file mode 100644 index 60c3b5f..0000000 --- a/venv/lib/python3.8/site-packages/werkzeug/wrappers/request.py +++ /dev/null @@ -1,660 +0,0 @@ -import functools -import json -import typing -import typing as t -import warnings -from io import BytesIO - -from .._internal import _wsgi_decoding_dance -from ..datastructures import CombinedMultiDict -from ..datastructures import EnvironHeaders -from ..datastructures import FileStorage -from ..datastructures import ImmutableMultiDict -from ..datastructures import iter_multi_items -from ..datastructures import MultiDict -from ..formparser import default_stream_factory -from ..formparser import FormDataParser -from ..sansio.request import Request as _SansIORequest -from ..utils import cached_property -from ..utils import environ_property -from ..wsgi import _get_server -from ..wsgi import get_input_stream -from werkzeug.exceptions import BadRequest - -if t.TYPE_CHECKING: - import typing_extensions as te - from _typeshed.wsgi import WSGIApplication - from _typeshed.wsgi import WSGIEnvironment - - -class Request(_SansIORequest): - """Represents an incoming WSGI HTTP request, with headers and body - taken from the WSGI environment. Has properties and methods for - using the functionality defined by various HTTP specs. The data in - requests object is read-only. - - Text data is assumed to use UTF-8 encoding, which should be true for - the vast majority of modern clients. Using an encoding set by the - client is unsafe in Python due to extra encodings it provides, such - as ``zip``. To change the assumed encoding, subclass and replace - :attr:`charset`. - - :param environ: The WSGI environ is generated by the WSGI server and - contains information about the server configuration and client - request. - :param populate_request: Add this request object to the WSGI environ - as ``environ['werkzeug.request']``. Can be useful when - debugging. - :param shallow: Makes reading from :attr:`stream` (and any method - that would read from it) raise a :exc:`RuntimeError`. Useful to - prevent consuming the form data in middleware, which would make - it unavailable to the final application. - - .. versionchanged:: 2.0 - Combine ``BaseRequest`` and mixins into a single ``Request`` - class. Using the old classes is deprecated and will be removed - in Werkzeug 2.1. - - .. versionchanged:: 0.5 - Read-only mode is enforced with immutable classes for all data. - """ - - #: the maximum content length. This is forwarded to the form data - #: parsing function (:func:`parse_form_data`). When set and the - #: :attr:`form` or :attr:`files` attribute is accessed and the - #: parsing fails because more than the specified value is transmitted - #: a :exc:`~werkzeug.exceptions.RequestEntityTooLarge` exception is raised. - #: - #: Have a look at :doc:`/request_data` for more details. - #: - #: .. versionadded:: 0.5 - max_content_length: t.Optional[int] = None - - #: the maximum form field size. This is forwarded to the form data - #: parsing function (:func:`parse_form_data`). When set and the - #: :attr:`form` or :attr:`files` attribute is accessed and the - #: data in memory for post data is longer than the specified value a - #: :exc:`~werkzeug.exceptions.RequestEntityTooLarge` exception is raised. - #: - #: Have a look at :doc:`/request_data` for more details. - #: - #: .. versionadded:: 0.5 - max_form_memory_size: t.Optional[int] = None - - #: The form data parser that shoud be used. Can be replaced to customize - #: the form date parsing. - form_data_parser_class: t.Type[FormDataParser] = FormDataParser - - #: Disable the :attr:`data` property to avoid reading from the input - #: stream. - #: - #: .. deprecated:: 2.0 - #: Will be removed in Werkzeug 2.1. Create the request with - #: ``shallow=True`` instead. - #: - #: .. versionadded:: 0.9 - disable_data_descriptor: t.Optional[bool] = None - - #: The WSGI environment containing HTTP headers and information from - #: the WSGI server. - environ: "WSGIEnvironment" - - #: Set when creating the request object. If ``True``, reading from - #: the request body will cause a ``RuntimeException``. Useful to - #: prevent modifying the stream from middleware. - shallow: bool - - def __init__( - self, - environ: "WSGIEnvironment", - populate_request: bool = True, - shallow: bool = False, - ) -> None: - super().__init__( - method=environ.get("REQUEST_METHOD", "GET"), - scheme=environ.get("wsgi.url_scheme", "http"), - server=_get_server(environ), - root_path=_wsgi_decoding_dance( - environ.get("SCRIPT_NAME") or "", self.charset, self.encoding_errors - ), - path=_wsgi_decoding_dance( - environ.get("PATH_INFO") or "", self.charset, self.encoding_errors - ), - query_string=environ.get("QUERY_STRING", "").encode("latin1"), - headers=EnvironHeaders(environ), - remote_addr=environ.get("REMOTE_ADDR"), - ) - self.environ = environ - - if self.disable_data_descriptor is not None: - warnings.warn( - "'disable_data_descriptor' is deprecated and will be" - " removed in Werkzeug 2.1. Create the request with" - " 'shallow=True' instead.", - DeprecationWarning, - stacklevel=2, - ) - shallow = shallow or self.disable_data_descriptor - - self.shallow = shallow - - if populate_request and not shallow: - self.environ["werkzeug.request"] = self - - @classmethod - def from_values(cls, *args: t.Any, **kwargs: t.Any) -> "Request": - """Create a new request object based on the values provided. If - environ is given missing values are filled from there. This method is - useful for small scripts when you need to simulate a request from an URL. - Do not use this method for unittesting, there is a full featured client - object (:class:`Client`) that allows to create multipart requests, - support for cookies etc. - - This accepts the same options as the - :class:`~werkzeug.test.EnvironBuilder`. - - .. versionchanged:: 0.5 - This method now accepts the same arguments as - :class:`~werkzeug.test.EnvironBuilder`. Because of this the - `environ` parameter is now called `environ_overrides`. - - :return: request object - """ - from ..test import EnvironBuilder - - charset = kwargs.pop("charset", cls.charset) - kwargs["charset"] = charset - builder = EnvironBuilder(*args, **kwargs) - try: - return builder.get_request(cls) - finally: - builder.close() - - @classmethod - def application( - cls, f: t.Callable[["Request"], "WSGIApplication"] - ) -> "WSGIApplication": - """Decorate a function as responder that accepts the request as - the last argument. This works like the :func:`responder` - decorator but the function is passed the request object as the - last argument and the request object will be closed - automatically:: - - @Request.application - def my_wsgi_app(request): - return Response('Hello World!') - - As of Werkzeug 0.14 HTTP exceptions are automatically caught and - converted to responses instead of failing. - - :param f: the WSGI callable to decorate - :return: a new WSGI callable - """ - #: return a callable that wraps the -2nd argument with the request - #: and calls the function with all the arguments up to that one and - #: the request. The return value is then called with the latest - #: two arguments. This makes it possible to use this decorator for - #: both standalone WSGI functions as well as bound methods and - #: partially applied functions. - from ..exceptions import HTTPException - - @functools.wraps(f) - def application(*args): # type: ignore - request = cls(args[-2]) - with request: - try: - resp = f(*args[:-2] + (request,)) - except HTTPException as e: - resp = e.get_response(args[-2]) - return resp(*args[-2:]) - - return t.cast("WSGIApplication", application) - - def _get_file_stream( - self, - total_content_length: t.Optional[int], - content_type: t.Optional[str], - filename: t.Optional[str] = None, - content_length: t.Optional[int] = None, - ) -> t.BinaryIO: - """Called to get a stream for the file upload. - - This must provide a file-like class with `read()`, `readline()` - and `seek()` methods that is both writeable and readable. - - The default implementation returns a temporary file if the total - content length is higher than 500KB. Because many browsers do not - provide a content length for the files only the total content - length matters. - - :param total_content_length: the total content length of all the - data in the request combined. This value - is guaranteed to be there. - :param content_type: the mimetype of the uploaded file. - :param filename: the filename of the uploaded file. May be `None`. - :param content_length: the length of this file. This value is usually - not provided because webbrowsers do not provide - this value. - """ - return default_stream_factory( - total_content_length=total_content_length, - filename=filename, - content_type=content_type, - content_length=content_length, - ) - - @property - def want_form_data_parsed(self) -> bool: - """``True`` if the request method carries content. By default - this is true if a ``Content-Type`` is sent. - - .. versionadded:: 0.8 - """ - return bool(self.environ.get("CONTENT_TYPE")) - - def make_form_data_parser(self) -> FormDataParser: - """Creates the form data parser. Instantiates the - :attr:`form_data_parser_class` with some parameters. - - .. versionadded:: 0.8 - """ - return self.form_data_parser_class( - self._get_file_stream, - self.charset, - self.encoding_errors, - self.max_form_memory_size, - self.max_content_length, - self.parameter_storage_class, - ) - - def _load_form_data(self) -> None: - """Method used internally to retrieve submitted data. After calling - this sets `form` and `files` on the request object to multi dicts - filled with the incoming form data. As a matter of fact the input - stream will be empty afterwards. You can also call this method to - force the parsing of the form data. - - .. versionadded:: 0.8 - """ - # abort early if we have already consumed the stream - if "form" in self.__dict__: - return - - if self.want_form_data_parsed: - parser = self.make_form_data_parser() - data = parser.parse( - self._get_stream_for_parsing(), - self.mimetype, - self.content_length, - self.mimetype_params, - ) - else: - data = ( - self.stream, - self.parameter_storage_class(), - self.parameter_storage_class(), - ) - - # inject the values into the instance dict so that we bypass - # our cached_property non-data descriptor. - d = self.__dict__ - d["stream"], d["form"], d["files"] = data - - def _get_stream_for_parsing(self) -> t.BinaryIO: - """This is the same as accessing :attr:`stream` with the difference - that if it finds cached data from calling :meth:`get_data` first it - will create a new stream out of the cached data. - - .. versionadded:: 0.9.3 - """ - cached_data = getattr(self, "_cached_data", None) - if cached_data is not None: - return BytesIO(cached_data) - return self.stream - - def close(self) -> None: - """Closes associated resources of this request object. This - closes all file handles explicitly. You can also use the request - object in a with statement which will automatically close it. - - .. versionadded:: 0.9 - """ - files = self.__dict__.get("files") - for _key, value in iter_multi_items(files or ()): - value.close() - - def __enter__(self) -> "Request": - return self - - def __exit__(self, exc_type, exc_value, tb) -> None: # type: ignore - self.close() - - @cached_property - def stream(self) -> t.BinaryIO: - """ - If the incoming form data was not encoded with a known mimetype - the data is stored unmodified in this stream for consumption. Most - of the time it is a better idea to use :attr:`data` which will give - you that data as a string. The stream only returns the data once. - - Unlike :attr:`input_stream` this stream is properly guarded that you - can't accidentally read past the length of the input. Werkzeug will - internally always refer to this stream to read data which makes it - possible to wrap this object with a stream that does filtering. - - .. versionchanged:: 0.9 - This stream is now always available but might be consumed by the - form parser later on. Previously the stream was only set if no - parsing happened. - """ - if self.shallow: - raise RuntimeError( - "This request was created with 'shallow=True', reading" - " from the input stream is disabled." - ) - - return get_input_stream(self.environ) - - input_stream = environ_property[t.BinaryIO]( - "wsgi.input", - doc="""The WSGI input stream. - - In general it's a bad idea to use this one because you can - easily read past the boundary. Use the :attr:`stream` - instead.""", - ) - - @cached_property - def data(self) -> bytes: - """ - Contains the incoming request data as string in case it came with - a mimetype Werkzeug does not handle. - """ - return self.get_data(parse_form_data=True) - - @typing.overload - def get_data( # type: ignore - self, - cache: bool = True, - as_text: "te.Literal[False]" = False, - parse_form_data: bool = False, - ) -> bytes: - ... - - @typing.overload - def get_data( - self, - cache: bool = True, - as_text: "te.Literal[True]" = ..., - parse_form_data: bool = False, - ) -> str: - ... - - def get_data( - self, cache: bool = True, as_text: bool = False, parse_form_data: bool = False - ) -> t.Union[bytes, str]: - """This reads the buffered incoming data from the client into one - bytes object. By default this is cached but that behavior can be - changed by setting `cache` to `False`. - - Usually it's a bad idea to call this method without checking the - content length first as a client could send dozens of megabytes or more - to cause memory problems on the server. - - Note that if the form data was already parsed this method will not - return anything as form data parsing does not cache the data like - this method does. To implicitly invoke form data parsing function - set `parse_form_data` to `True`. When this is done the return value - of this method will be an empty string if the form parser handles - the data. This generally is not necessary as if the whole data is - cached (which is the default) the form parser will used the cached - data to parse the form data. Please be generally aware of checking - the content length first in any case before calling this method - to avoid exhausting server memory. - - If `as_text` is set to `True` the return value will be a decoded - string. - - .. versionadded:: 0.9 - """ - rv = getattr(self, "_cached_data", None) - if rv is None: - if parse_form_data: - self._load_form_data() - rv = self.stream.read() - if cache: - self._cached_data = rv - if as_text: - rv = rv.decode(self.charset, self.encoding_errors) - return rv # type: ignore - - @cached_property - def form(self) -> "ImmutableMultiDict[str, str]": - """The form parameters. By default an - :class:`~werkzeug.datastructures.ImmutableMultiDict` - is returned from this function. This can be changed by setting - :attr:`parameter_storage_class` to a different type. This might - be necessary if the order of the form data is important. - - Please keep in mind that file uploads will not end up here, but instead - in the :attr:`files` attribute. - - .. versionchanged:: 0.9 - - Previous to Werkzeug 0.9 this would only contain form data for POST - and PUT requests. - """ - self._load_form_data() - return self.form - - @cached_property - def values(self) -> "CombinedMultiDict[str, str]": - """A :class:`werkzeug.datastructures.CombinedMultiDict` that - combines :attr:`args` and :attr:`form`. - - For GET requests, only ``args`` are present, not ``form``. - - .. versionchanged:: 2.0 - For GET requests, only ``args`` are present, not ``form``. - """ - sources = [self.args] - - if self.method != "GET": - # GET requests can have a body, and some caching proxies - # might not treat that differently than a normal GET - # request, allowing form data to "invisibly" affect the - # cache without indication in the query string / URL. - sources.append(self.form) - - args = [] - - for d in sources: - if not isinstance(d, MultiDict): - d = MultiDict(d) - - args.append(d) - - return CombinedMultiDict(args) - - @cached_property - def files(self) -> "ImmutableMultiDict[str, FileStorage]": - """:class:`~werkzeug.datastructures.MultiDict` object containing - all uploaded files. Each key in :attr:`files` is the name from the - ````. Each value in :attr:`files` is a - Werkzeug :class:`~werkzeug.datastructures.FileStorage` object. - - It basically behaves like a standard file object you know from Python, - with the difference that it also has a - :meth:`~werkzeug.datastructures.FileStorage.save` function that can - store the file on the filesystem. - - Note that :attr:`files` will only contain data if the request method was - POST, PUT or PATCH and the ``

    `` that posted to the request had - ``enctype="multipart/form-data"``. It will be empty otherwise. - - See the :class:`~werkzeug.datastructures.MultiDict` / - :class:`~werkzeug.datastructures.FileStorage` documentation for - more details about the used data structure. - """ - self._load_form_data() - return self.files - - @property - def script_root(self) -> str: - """Alias for :attr:`self.root_path`. ``environ["SCRIPT_ROOT"]`` - without a trailing slash. - """ - return self.root_path - - @cached_property - def url_root(self) -> str: - """Alias for :attr:`root_url`. The URL with scheme, host, and - root path. For example, ``https://example.com/app/``. - """ - return self.root_url - - remote_user = environ_property[str]( - "REMOTE_USER", - doc="""If the server supports user authentication, and the - script is protected, this attribute contains the username the - user has authenticated as.""", - ) - is_multithread = environ_property[bool]( - "wsgi.multithread", - doc="""boolean that is `True` if the application is served by a - multithreaded WSGI server.""", - ) - is_multiprocess = environ_property[bool]( - "wsgi.multiprocess", - doc="""boolean that is `True` if the application is served by a - WSGI server that spawns multiple processes.""", - ) - is_run_once = environ_property[bool]( - "wsgi.run_once", - doc="""boolean that is `True` if the application will be - executed only once in a process lifetime. This is the case for - CGI for example, but it's not guaranteed that the execution only - happens one time.""", - ) - - # JSON - - #: A module or other object that has ``dumps`` and ``loads`` - #: functions that match the API of the built-in :mod:`json` module. - json_module = json - - @property - def json(self) -> t.Optional[t.Any]: - """The parsed JSON data if :attr:`mimetype` indicates JSON - (:mimetype:`application/json`, see :meth:`is_json`). - - Calls :meth:`get_json` with default arguments. - """ - return self.get_json() - - # Cached values for ``(silent=False, silent=True)``. Initialized - # with sentinel values. - _cached_json: t.Tuple[t.Any, t.Any] = (Ellipsis, Ellipsis) - - def get_json( - self, force: bool = False, silent: bool = False, cache: bool = True - ) -> t.Optional[t.Any]: - """Parse :attr:`data` as JSON. - - If the mimetype does not indicate JSON - (:mimetype:`application/json`, see :meth:`is_json`), this - returns ``None``. - - If parsing fails, :meth:`on_json_loading_failed` is called and - its return value is used as the return value. - - :param force: Ignore the mimetype and always try to parse JSON. - :param silent: Silence parsing errors and return ``None`` - instead. - :param cache: Store the parsed JSON to return for subsequent - calls. - """ - if cache and self._cached_json[silent] is not Ellipsis: - return self._cached_json[silent] - - if not (force or self.is_json): - return None - - data = self.get_data(cache=cache) - - try: - rv = self.json_module.loads(data) - except ValueError as e: - if silent: - rv = None - - if cache: - normal_rv, _ = self._cached_json - self._cached_json = (normal_rv, rv) - else: - rv = self.on_json_loading_failed(e) - - if cache: - _, silent_rv = self._cached_json - self._cached_json = (rv, silent_rv) - else: - if cache: - self._cached_json = (rv, rv) - - return rv - - def on_json_loading_failed(self, e: ValueError) -> t.Any: - """Called if :meth:`get_json` parsing fails and isn't silenced. - If this method returns a value, it is used as the return value - for :meth:`get_json`. The default implementation raises - :exc:`~werkzeug.exceptions.BadRequest`. - """ - raise BadRequest(f"Failed to decode JSON object: {e}") - - -class StreamOnlyMixin: - """Mixin to create a ``Request`` that disables the ``data``, - ``form``, and ``files`` properties. Only ``stream`` is available. - - .. deprecated:: 2.0 - Will be removed in Werkzeug 2.1. Create the request with - ``shallow=True`` instead. - - .. versionadded:: 0.9 - """ - - def __init__(self, *args: t.Any, **kwargs: t.Any) -> None: - warnings.warn( - "'StreamOnlyMixin' is deprecated and will be removed in" - " Werkzeug 2.1. Create the request with 'shallow=True'" - " instead.", - DeprecationWarning, - stacklevel=2, - ) - kwargs["shallow"] = True - super().__init__(*args, **kwargs) # type: ignore - - -class PlainRequest(StreamOnlyMixin, Request): - """A request object without ``data``, ``form``, and ``files``. - - .. deprecated:: 2.0 - Will be removed in Werkzeug 2.1. Create the request with - ``shallow=True`` instead. - - .. versionadded:: 0.9 - """ - - def __init__(self, *args: t.Any, **kwargs: t.Any) -> None: - warnings.warn( - "'PlainRequest' is deprecated and will be removed in" - " Werkzeug 2.1. Create the request with 'shallow=True'" - " instead.", - DeprecationWarning, - stacklevel=2, - ) - - # Don't show the DeprecationWarning for StreamOnlyMixin. - with warnings.catch_warnings(): - warnings.simplefilter("ignore", DeprecationWarning) - super().__init__(*args, **kwargs) diff --git a/venv/lib/python3.8/site-packages/werkzeug/wrappers/response.py b/venv/lib/python3.8/site-packages/werkzeug/wrappers/response.py deleted file mode 100644 index a43c8bc..0000000 --- a/venv/lib/python3.8/site-packages/werkzeug/wrappers/response.py +++ /dev/null @@ -1,890 +0,0 @@ -import json -import typing -import typing as t -import warnings -from http import HTTPStatus - -from .._internal import _to_bytes -from ..datastructures import Headers -from ..http import remove_entity_headers -from ..sansio.response import Response as _SansIOResponse -from ..urls import iri_to_uri -from ..urls import url_join -from ..utils import cached_property -from ..wsgi import ClosingIterator -from ..wsgi import get_current_url -from werkzeug._internal import _get_environ -from werkzeug.http import generate_etag -from werkzeug.http import http_date -from werkzeug.http import is_resource_modified -from werkzeug.http import parse_etags -from werkzeug.http import parse_range_header -from werkzeug.wsgi import _RangeWrapper - -if t.TYPE_CHECKING: - import typing_extensions as te - from _typeshed.wsgi import StartResponse - from _typeshed.wsgi import WSGIApplication - from _typeshed.wsgi import WSGIEnvironment - - -def _warn_if_string(iterable: t.Iterable) -> None: - """Helper for the response objects to check if the iterable returned - to the WSGI server is not a string. - """ - if isinstance(iterable, str): - warnings.warn( - "Response iterable was set to a string. This will appear to" - " work but means that the server will send the data to the" - " client one character at a time. This is almost never" - " intended behavior, use 'response.data' to assign strings" - " to the response object.", - stacklevel=2, - ) - - -def _iter_encoded( - iterable: t.Iterable[t.Union[str, bytes]], charset: str -) -> t.Iterator[bytes]: - for item in iterable: - if isinstance(item, str): - yield item.encode(charset) - else: - yield item - - -def _clean_accept_ranges(accept_ranges: t.Union[bool, str]) -> str: - if accept_ranges is True: - return "bytes" - elif accept_ranges is False: - return "none" - elif isinstance(accept_ranges, str): - return accept_ranges - raise ValueError("Invalid accept_ranges value") - - -class Response(_SansIOResponse): - """Represents an outgoing WSGI HTTP response with body, status, and - headers. Has properties and methods for using the functionality - defined by various HTTP specs. - - The response body is flexible to support different use cases. The - simple form is passing bytes, or a string which will be encoded as - UTF-8. Passing an iterable of bytes or strings makes this a - streaming response. A generator is particularly useful for building - a CSV file in memory or using SSE (Server Sent Events). A file-like - object is also iterable, although the - :func:`~werkzeug.utils.send_file` helper should be used in that - case. - - The response object is itself a WSGI application callable. When - called (:meth:`__call__`) with ``environ`` and ``start_response``, - it will pass its status and headers to ``start_response`` then - return its body as an iterable. - - .. code-block:: python - - from werkzeug.wrappers.response import Response - - def index(): - return Response("Hello, World!") - - def application(environ, start_response): - path = environ.get("PATH_INFO") or "/" - - if path == "/": - response = index() - else: - response = Response("Not Found", status=404) - - return response(environ, start_response) - - :param response: The data for the body of the response. A string or - bytes, or tuple or list of strings or bytes, for a fixed-length - response, or any other iterable of strings or bytes for a - streaming response. Defaults to an empty body. - :param status: The status code for the response. Either an int, in - which case the default status message is added, or a string in - the form ``{code} {message}``, like ``404 Not Found``. Defaults - to 200. - :param headers: A :class:`~werkzeug.datastructures.Headers` object, - or a list of ``(key, value)`` tuples that will be converted to a - ``Headers`` object. - :param mimetype: The mime type (content type without charset or - other parameters) of the response. If the value starts with - ``text/`` (or matches some other special cases), the charset - will be added to create the ``content_type``. - :param content_type: The full content type of the response. - Overrides building the value from ``mimetype``. - :param direct_passthrough: Pass the response body directly through - as the WSGI iterable. This can be used when the body is a binary - file or other iterator of bytes, to skip some unnecessary - checks. Use :func:`~werkzeug.utils.send_file` instead of setting - this manually. - - .. versionchanged:: 2.0 - Combine ``BaseResponse`` and mixins into a single ``Response`` - class. Using the old classes is deprecated and will be removed - in Werkzeug 2.1. - - .. versionchanged:: 0.5 - The ``direct_passthrough`` parameter was added. - """ - - #: if set to `False` accessing properties on the response object will - #: not try to consume the response iterator and convert it into a list. - #: - #: .. versionadded:: 0.6.2 - #: - #: That attribute was previously called `implicit_seqence_conversion`. - #: (Notice the typo). If you did use this feature, you have to adapt - #: your code to the name change. - implicit_sequence_conversion = True - - #: Should this response object correct the location header to be RFC - #: conformant? This is true by default. - #: - #: .. versionadded:: 0.8 - autocorrect_location_header = True - - #: Should this response object automatically set the content-length - #: header if possible? This is true by default. - #: - #: .. versionadded:: 0.8 - automatically_set_content_length = True - - #: The response body to send as the WSGI iterable. A list of strings - #: or bytes represents a fixed-length response, any other iterable - #: is a streaming response. Strings are encoded to bytes as UTF-8. - #: - #: Do not set to a plain string or bytes, that will cause sending - #: the response to be very inefficient as it will iterate one byte - #: at a time. - response: t.Union[t.Iterable[str], t.Iterable[bytes]] - - def __init__( - self, - response: t.Optional[ - t.Union[t.Iterable[bytes], bytes, t.Iterable[str], str] - ] = None, - status: t.Optional[t.Union[int, str, HTTPStatus]] = None, - headers: t.Optional[ - t.Union[ - t.Mapping[str, t.Union[str, int, t.Iterable[t.Union[str, int]]]], - t.Iterable[t.Tuple[str, t.Union[str, int]]], - ] - ] = None, - mimetype: t.Optional[str] = None, - content_type: t.Optional[str] = None, - direct_passthrough: bool = False, - ) -> None: - super().__init__( - status=status, - headers=headers, - mimetype=mimetype, - content_type=content_type, - ) - - #: Pass the response body directly through as the WSGI iterable. - #: This can be used when the body is a binary file or other - #: iterator of bytes, to skip some unnecessary checks. Use - #: :func:`~werkzeug.utils.send_file` instead of setting this - #: manually. - self.direct_passthrough = direct_passthrough - self._on_close: t.List[t.Callable[[], t.Any]] = [] - - # we set the response after the headers so that if a class changes - # the charset attribute, the data is set in the correct charset. - if response is None: - self.response = [] - elif isinstance(response, (str, bytes, bytearray)): - self.set_data(response) - else: - self.response = response - - def call_on_close(self, func: t.Callable[[], t.Any]) -> t.Callable[[], t.Any]: - """Adds a function to the internal list of functions that should - be called as part of closing down the response. Since 0.7 this - function also returns the function that was passed so that this - can be used as a decorator. - - .. versionadded:: 0.6 - """ - self._on_close.append(func) - return func - - def __repr__(self) -> str: - if self.is_sequence: - body_info = f"{sum(map(len, self.iter_encoded()))} bytes" - else: - body_info = "streamed" if self.is_streamed else "likely-streamed" - return f"<{type(self).__name__} {body_info} [{self.status}]>" - - @classmethod - def force_type( - cls, response: "Response", environ: t.Optional["WSGIEnvironment"] = None - ) -> "Response": - """Enforce that the WSGI response is a response object of the current - type. Werkzeug will use the :class:`Response` internally in many - situations like the exceptions. If you call :meth:`get_response` on an - exception you will get back a regular :class:`Response` object, even - if you are using a custom subclass. - - This method can enforce a given response type, and it will also - convert arbitrary WSGI callables into response objects if an environ - is provided:: - - # convert a Werkzeug response object into an instance of the - # MyResponseClass subclass. - response = MyResponseClass.force_type(response) - - # convert any WSGI application into a response object - response = MyResponseClass.force_type(response, environ) - - This is especially useful if you want to post-process responses in - the main dispatcher and use functionality provided by your subclass. - - Keep in mind that this will modify response objects in place if - possible! - - :param response: a response object or wsgi application. - :param environ: a WSGI environment object. - :return: a response object. - """ - if not isinstance(response, Response): - if environ is None: - raise TypeError( - "cannot convert WSGI application into response" - " objects without an environ" - ) - - from ..test import run_wsgi_app - - response = Response(*run_wsgi_app(response, environ)) - - response.__class__ = cls - return response - - @classmethod - def from_app( - cls, app: "WSGIApplication", environ: "WSGIEnvironment", buffered: bool = False - ) -> "Response": - """Create a new response object from an application output. This - works best if you pass it an application that returns a generator all - the time. Sometimes applications may use the `write()` callable - returned by the `start_response` function. This tries to resolve such - edge cases automatically. But if you don't get the expected output - you should set `buffered` to `True` which enforces buffering. - - :param app: the WSGI application to execute. - :param environ: the WSGI environment to execute against. - :param buffered: set to `True` to enforce buffering. - :return: a response object. - """ - from ..test import run_wsgi_app - - return cls(*run_wsgi_app(app, environ, buffered)) - - @typing.overload - def get_data(self, as_text: "te.Literal[False]" = False) -> bytes: - ... - - @typing.overload - def get_data(self, as_text: "te.Literal[True]") -> str: - ... - - def get_data(self, as_text: bool = False) -> t.Union[bytes, str]: - """The string representation of the response body. Whenever you call - this property the response iterable is encoded and flattened. This - can lead to unwanted behavior if you stream big data. - - This behavior can be disabled by setting - :attr:`implicit_sequence_conversion` to `False`. - - If `as_text` is set to `True` the return value will be a decoded - string. - - .. versionadded:: 0.9 - """ - self._ensure_sequence() - rv = b"".join(self.iter_encoded()) - - if as_text: - return rv.decode(self.charset) - - return rv - - def set_data(self, value: t.Union[bytes, str]) -> None: - """Sets a new string as response. The value must be a string or - bytes. If a string is set it's encoded to the charset of the - response (utf-8 by default). - - .. versionadded:: 0.9 - """ - # if a string is set, it's encoded directly so that we - # can set the content length - if isinstance(value, str): - value = value.encode(self.charset) - else: - value = bytes(value) - self.response = [value] - if self.automatically_set_content_length: - self.headers["Content-Length"] = str(len(value)) - - data = property( - get_data, - set_data, - doc="A descriptor that calls :meth:`get_data` and :meth:`set_data`.", - ) - - def calculate_content_length(self) -> t.Optional[int]: - """Returns the content length if available or `None` otherwise.""" - try: - self._ensure_sequence() - except RuntimeError: - return None - return sum(len(x) for x in self.iter_encoded()) - - def _ensure_sequence(self, mutable: bool = False) -> None: - """This method can be called by methods that need a sequence. If - `mutable` is true, it will also ensure that the response sequence - is a standard Python list. - - .. versionadded:: 0.6 - """ - if self.is_sequence: - # if we need a mutable object, we ensure it's a list. - if mutable and not isinstance(self.response, list): - self.response = list(self.response) # type: ignore - return - if self.direct_passthrough: - raise RuntimeError( - "Attempted implicit sequence conversion but the" - " response object is in direct passthrough mode." - ) - if not self.implicit_sequence_conversion: - raise RuntimeError( - "The response object required the iterable to be a" - " sequence, but the implicit conversion was disabled." - " Call make_sequence() yourself." - ) - self.make_sequence() - - def make_sequence(self) -> None: - """Converts the response iterator in a list. By default this happens - automatically if required. If `implicit_sequence_conversion` is - disabled, this method is not automatically called and some properties - might raise exceptions. This also encodes all the items. - - .. versionadded:: 0.6 - """ - if not self.is_sequence: - # if we consume an iterable we have to ensure that the close - # method of the iterable is called if available when we tear - # down the response - close = getattr(self.response, "close", None) - self.response = list(self.iter_encoded()) - if close is not None: - self.call_on_close(close) - - def iter_encoded(self) -> t.Iterator[bytes]: - """Iter the response encoded with the encoding of the response. - If the response object is invoked as WSGI application the return - value of this method is used as application iterator unless - :attr:`direct_passthrough` was activated. - """ - if __debug__: - _warn_if_string(self.response) - # Encode in a separate function so that self.response is fetched - # early. This allows us to wrap the response with the return - # value from get_app_iter or iter_encoded. - return _iter_encoded(self.response, self.charset) - - @property - def is_streamed(self) -> bool: - """If the response is streamed (the response is not an iterable with - a length information) this property is `True`. In this case streamed - means that there is no information about the number of iterations. - This is usually `True` if a generator is passed to the response object. - - This is useful for checking before applying some sort of post - filtering that should not take place for streamed responses. - """ - try: - len(self.response) # type: ignore - except (TypeError, AttributeError): - return True - return False - - @property - def is_sequence(self) -> bool: - """If the iterator is buffered, this property will be `True`. A - response object will consider an iterator to be buffered if the - response attribute is a list or tuple. - - .. versionadded:: 0.6 - """ - return isinstance(self.response, (tuple, list)) - - def close(self) -> None: - """Close the wrapped response if possible. You can also use the object - in a with statement which will automatically close it. - - .. versionadded:: 0.9 - Can now be used in a with statement. - """ - if hasattr(self.response, "close"): - self.response.close() # type: ignore - for func in self._on_close: - func() - - def __enter__(self) -> "Response": - return self - - def __exit__(self, exc_type, exc_value, tb): # type: ignore - self.close() - - def freeze(self, no_etag: None = None) -> None: - """Make the response object ready to be pickled. Does the - following: - - * Buffer the response into a list, ignoring - :attr:`implicity_sequence_conversion` and - :attr:`direct_passthrough`. - * Set the ``Content-Length`` header. - * Generate an ``ETag`` header if one is not already set. - - .. versionchanged:: 2.0 - An ``ETag`` header is added, the ``no_etag`` parameter is - deprecated and will be removed in Werkzeug 2.1. - - .. versionchanged:: 0.6 - The ``Content-Length`` header is set. - """ - # Always freeze the encoded response body, ignore - # implicit_sequence_conversion and direct_passthrough. - self.response = list(self.iter_encoded()) - self.headers["Content-Length"] = str(sum(map(len, self.response))) - - if no_etag is not None: - warnings.warn( - "The 'no_etag' parameter is deprecated and will be" - " removed in Werkzeug 2.1.", - DeprecationWarning, - stacklevel=2, - ) - - self.add_etag() - - def get_wsgi_headers(self, environ: "WSGIEnvironment") -> Headers: - """This is automatically called right before the response is started - and returns headers modified for the given environment. It returns a - copy of the headers from the response with some modifications applied - if necessary. - - For example the location header (if present) is joined with the root - URL of the environment. Also the content length is automatically set - to zero here for certain status codes. - - .. versionchanged:: 0.6 - Previously that function was called `fix_headers` and modified - the response object in place. Also since 0.6, IRIs in location - and content-location headers are handled properly. - - Also starting with 0.6, Werkzeug will attempt to set the content - length if it is able to figure it out on its own. This is the - case if all the strings in the response iterable are already - encoded and the iterable is buffered. - - :param environ: the WSGI environment of the request. - :return: returns a new :class:`~werkzeug.datastructures.Headers` - object. - """ - headers = Headers(self.headers) - location: t.Optional[str] = None - content_location: t.Optional[str] = None - content_length: t.Optional[t.Union[str, int]] = None - status = self.status_code - - # iterate over the headers to find all values in one go. Because - # get_wsgi_headers is used each response that gives us a tiny - # speedup. - for key, value in headers: - ikey = key.lower() - if ikey == "location": - location = value - elif ikey == "content-location": - content_location = value - elif ikey == "content-length": - content_length = value - - # make sure the location header is an absolute URL - if location is not None: - old_location = location - if isinstance(location, str): - # Safe conversion is necessary here as we might redirect - # to a broken URI scheme (for instance itms-services). - location = iri_to_uri(location, safe_conversion=True) - - if self.autocorrect_location_header: - current_url = get_current_url(environ, strip_querystring=True) - if isinstance(current_url, str): - current_url = iri_to_uri(current_url) - location = url_join(current_url, location) - if location != old_location: - headers["Location"] = location - - # make sure the content location is a URL - if content_location is not None and isinstance(content_location, str): - headers["Content-Location"] = iri_to_uri(content_location) - - if 100 <= status < 200 or status == 204: - # Per section 3.3.2 of RFC 7230, "a server MUST NOT send a - # Content-Length header field in any response with a status - # code of 1xx (Informational) or 204 (No Content)." - headers.remove("Content-Length") - elif status == 304: - remove_entity_headers(headers) - - # if we can determine the content length automatically, we - # should try to do that. But only if this does not involve - # flattening the iterator or encoding of strings in the - # response. We however should not do that if we have a 304 - # response. - if ( - self.automatically_set_content_length - and self.is_sequence - and content_length is None - and status not in (204, 304) - and not (100 <= status < 200) - ): - try: - content_length = sum(len(_to_bytes(x, "ascii")) for x in self.response) - except UnicodeError: - # Something other than bytes, can't safely figure out - # the length of the response. - pass - else: - headers["Content-Length"] = str(content_length) - - return headers - - def get_app_iter(self, environ: "WSGIEnvironment") -> t.Iterable[bytes]: - """Returns the application iterator for the given environ. Depending - on the request method and the current status code the return value - might be an empty response rather than the one from the response. - - If the request method is `HEAD` or the status code is in a range - where the HTTP specification requires an empty response, an empty - iterable is returned. - - .. versionadded:: 0.6 - - :param environ: the WSGI environment of the request. - :return: a response iterable. - """ - status = self.status_code - if ( - environ["REQUEST_METHOD"] == "HEAD" - or 100 <= status < 200 - or status in (204, 304) - ): - iterable: t.Iterable[bytes] = () - elif self.direct_passthrough: - if __debug__: - _warn_if_string(self.response) - return self.response # type: ignore - else: - iterable = self.iter_encoded() - return ClosingIterator(iterable, self.close) - - def get_wsgi_response( - self, environ: "WSGIEnvironment" - ) -> t.Tuple[t.Iterable[bytes], str, t.List[t.Tuple[str, str]]]: - """Returns the final WSGI response as tuple. The first item in - the tuple is the application iterator, the second the status and - the third the list of headers. The response returned is created - specially for the given environment. For example if the request - method in the WSGI environment is ``'HEAD'`` the response will - be empty and only the headers and status code will be present. - - .. versionadded:: 0.6 - - :param environ: the WSGI environment of the request. - :return: an ``(app_iter, status, headers)`` tuple. - """ - headers = self.get_wsgi_headers(environ) - app_iter = self.get_app_iter(environ) - return app_iter, self.status, headers.to_wsgi_list() - - def __call__( - self, environ: "WSGIEnvironment", start_response: "StartResponse" - ) -> t.Iterable[bytes]: - """Process this response as WSGI application. - - :param environ: the WSGI environment. - :param start_response: the response callable provided by the WSGI - server. - :return: an application iterator - """ - app_iter, status, headers = self.get_wsgi_response(environ) - start_response(status, headers) - return app_iter - - # JSON - - #: A module or other object that has ``dumps`` and ``loads`` - #: functions that match the API of the built-in :mod:`json` module. - json_module = json - - @property - def json(self) -> t.Optional[t.Any]: - """The parsed JSON data if :attr:`mimetype` indicates JSON - (:mimetype:`application/json`, see :meth:`is_json`). - - Calls :meth:`get_json` with default arguments. - """ - return self.get_json() - - def get_json(self, force: bool = False, silent: bool = False) -> t.Optional[t.Any]: - """Parse :attr:`data` as JSON. Useful during testing. - - If the mimetype does not indicate JSON - (:mimetype:`application/json`, see :meth:`is_json`), this - returns ``None``. - - Unlike :meth:`Request.get_json`, the result is not cached. - - :param force: Ignore the mimetype and always try to parse JSON. - :param silent: Silence parsing errors and return ``None`` - instead. - """ - if not (force or self.is_json): - return None - - data = self.get_data() - - try: - return self.json_module.loads(data) - except ValueError: - if not silent: - raise - - return None - - # Stream - - @cached_property - def stream(self) -> "ResponseStream": - """The response iterable as write-only stream.""" - return ResponseStream(self) - - def _wrap_range_response(self, start: int, length: int) -> None: - """Wrap existing Response in case of Range Request context.""" - if self.status_code == 206: - self.response = _RangeWrapper(self.response, start, length) # type: ignore - - def _is_range_request_processable(self, environ: "WSGIEnvironment") -> bool: - """Return ``True`` if `Range` header is present and if underlying - resource is considered unchanged when compared with `If-Range` header. - """ - return ( - "HTTP_IF_RANGE" not in environ - or not is_resource_modified( - environ, - self.headers.get("etag"), - None, - self.headers.get("last-modified"), - ignore_if_range=False, - ) - ) and "HTTP_RANGE" in environ - - def _process_range_request( - self, - environ: "WSGIEnvironment", - complete_length: t.Optional[int] = None, - accept_ranges: t.Optional[t.Union[bool, str]] = None, - ) -> bool: - """Handle Range Request related headers (RFC7233). If `Accept-Ranges` - header is valid, and Range Request is processable, we set the headers - as described by the RFC, and wrap the underlying response in a - RangeWrapper. - - Returns ``True`` if Range Request can be fulfilled, ``False`` otherwise. - - :raises: :class:`~werkzeug.exceptions.RequestedRangeNotSatisfiable` - if `Range` header could not be parsed or satisfied. - - .. versionchanged:: 2.0 - Returns ``False`` if the length is 0. - """ - from ..exceptions import RequestedRangeNotSatisfiable - - if ( - accept_ranges is None - or complete_length is None - or complete_length == 0 - or not self._is_range_request_processable(environ) - ): - return False - - parsed_range = parse_range_header(environ.get("HTTP_RANGE")) - - if parsed_range is None: - raise RequestedRangeNotSatisfiable(complete_length) - - range_tuple = parsed_range.range_for_length(complete_length) - content_range_header = parsed_range.to_content_range_header(complete_length) - - if range_tuple is None or content_range_header is None: - raise RequestedRangeNotSatisfiable(complete_length) - - content_length = range_tuple[1] - range_tuple[0] - self.headers["Content-Length"] = content_length - self.headers["Accept-Ranges"] = accept_ranges - self.content_range = content_range_header # type: ignore - self.status_code = 206 - self._wrap_range_response(range_tuple[0], content_length) - return True - - def make_conditional( - self, - request_or_environ: "WSGIEnvironment", - accept_ranges: t.Union[bool, str] = False, - complete_length: t.Optional[int] = None, - ) -> "Response": - """Make the response conditional to the request. This method works - best if an etag was defined for the response already. The `add_etag` - method can be used to do that. If called without etag just the date - header is set. - - This does nothing if the request method in the request or environ is - anything but GET or HEAD. - - For optimal performance when handling range requests, it's recommended - that your response data object implements `seekable`, `seek` and `tell` - methods as described by :py:class:`io.IOBase`. Objects returned by - :meth:`~werkzeug.wsgi.wrap_file` automatically implement those methods. - - It does not remove the body of the response because that's something - the :meth:`__call__` function does for us automatically. - - Returns self so that you can do ``return resp.make_conditional(req)`` - but modifies the object in-place. - - :param request_or_environ: a request object or WSGI environment to be - used to make the response conditional - against. - :param accept_ranges: This parameter dictates the value of - `Accept-Ranges` header. If ``False`` (default), - the header is not set. If ``True``, it will be set - to ``"bytes"``. If ``None``, it will be set to - ``"none"``. If it's a string, it will use this - value. - :param complete_length: Will be used only in valid Range Requests. - It will set `Content-Range` complete length - value and compute `Content-Length` real value. - This parameter is mandatory for successful - Range Requests completion. - :raises: :class:`~werkzeug.exceptions.RequestedRangeNotSatisfiable` - if `Range` header could not be parsed or satisfied. - - .. versionchanged:: 2.0 - Range processing is skipped if length is 0 instead of - raising a 416 Range Not Satisfiable error. - """ - environ = _get_environ(request_or_environ) - if environ["REQUEST_METHOD"] in ("GET", "HEAD"): - # if the date is not in the headers, add it now. We however - # will not override an already existing header. Unfortunately - # this header will be overriden by many WSGI servers including - # wsgiref. - if "date" not in self.headers: - self.headers["Date"] = http_date() - accept_ranges = _clean_accept_ranges(accept_ranges) - is206 = self._process_range_request(environ, complete_length, accept_ranges) - if not is206 and not is_resource_modified( - environ, - self.headers.get("etag"), - None, - self.headers.get("last-modified"), - ): - if parse_etags(environ.get("HTTP_IF_MATCH")): - self.status_code = 412 - else: - self.status_code = 304 - if ( - self.automatically_set_content_length - and "content-length" not in self.headers - ): - length = self.calculate_content_length() - if length is not None: - self.headers["Content-Length"] = length - return self - - def add_etag(self, overwrite: bool = False, weak: bool = False) -> None: - """Add an etag for the current response if there is none yet. - - .. versionchanged:: 2.0 - SHA-1 is used to generate the value. MD5 may not be - available in some environments. - """ - if overwrite or "etag" not in self.headers: - self.set_etag(generate_etag(self.get_data()), weak) - - -class ResponseStream: - """A file descriptor like object used by the :class:`ResponseStreamMixin` to - represent the body of the stream. It directly pushes into the response - iterable of the response object. - """ - - mode = "wb+" - - def __init__(self, response: Response): - self.response = response - self.closed = False - - def write(self, value: bytes) -> int: - if self.closed: - raise ValueError("I/O operation on closed file") - self.response._ensure_sequence(mutable=True) - self.response.response.append(value) # type: ignore - self.response.headers.pop("Content-Length", None) - return len(value) - - def writelines(self, seq: t.Iterable[bytes]) -> None: - for item in seq: - self.write(item) - - def close(self) -> None: - self.closed = True - - def flush(self) -> None: - if self.closed: - raise ValueError("I/O operation on closed file") - - def isatty(self) -> bool: - if self.closed: - raise ValueError("I/O operation on closed file") - return False - - def tell(self) -> int: - self.response._ensure_sequence() - return sum(map(len, self.response.response)) - - @property - def encoding(self) -> str: - return self.response.charset - - -class ResponseStreamMixin: - def __init__(self, *args: t.Any, **kwargs: t.Any) -> None: - warnings.warn( - "'ResponseStreamMixin' is deprecated and will be removed in" - " Werkzeug 2.1. 'Response' now includes the functionality" - " directly.", - DeprecationWarning, - stacklevel=2, - ) - super().__init__(*args, **kwargs) # type: ignore diff --git a/venv/lib/python3.8/site-packages/werkzeug/wrappers/user_agent.py b/venv/lib/python3.8/site-packages/werkzeug/wrappers/user_agent.py deleted file mode 100644 index 184ffd0..0000000 --- a/venv/lib/python3.8/site-packages/werkzeug/wrappers/user_agent.py +++ /dev/null @@ -1,14 +0,0 @@ -import typing as t -import warnings - - -class UserAgentMixin: - def __init__(self, *args: t.Any, **kwargs: t.Any) -> None: - warnings.warn( - "'UserAgentMixin' is deprecated and will be removed in" - " Werkzeug 2.1. 'Request' now includes the functionality" - " directly.", - DeprecationWarning, - stacklevel=2, - ) - super().__init__(*args, **kwargs) # type: ignore diff --git a/venv/lib/python3.8/site-packages/werkzeug/wsgi.py b/venv/lib/python3.8/site-packages/werkzeug/wsgi.py deleted file mode 100644 index 9439a1e..0000000 --- a/venv/lib/python3.8/site-packages/werkzeug/wsgi.py +++ /dev/null @@ -1,982 +0,0 @@ -import io -import re -import typing as t -from functools import partial -from functools import update_wrapper -from itertools import chain - -from ._internal import _make_encode_wrapper -from ._internal import _to_bytes -from ._internal import _to_str -from .sansio import utils as _sansio_utils -from .sansio.utils import host_is_trusted # noqa: F401 # Imported as part of API -from .urls import _URLTuple -from .urls import uri_to_iri -from .urls import url_join -from .urls import url_parse -from .urls import url_quote - -if t.TYPE_CHECKING: - from _typeshed.wsgi import WSGIApplication - from _typeshed.wsgi import WSGIEnvironment - - -def responder(f: t.Callable[..., "WSGIApplication"]) -> "WSGIApplication": - """Marks a function as responder. Decorate a function with it and it - will automatically call the return value as WSGI application. - - Example:: - - @responder - def application(environ, start_response): - return Response('Hello World!') - """ - return update_wrapper(lambda *a: f(*a)(*a[-2:]), f) - - -def get_current_url( - environ: "WSGIEnvironment", - root_only: bool = False, - strip_querystring: bool = False, - host_only: bool = False, - trusted_hosts: t.Optional[t.Iterable[str]] = None, -) -> str: - """Recreate the URL for a request from the parts in a WSGI - environment. - - The URL is an IRI, not a URI, so it may contain Unicode characters. - Use :func:`~werkzeug.urls.iri_to_uri` to convert it to ASCII. - - :param environ: The WSGI environment to get the URL parts from. - :param root_only: Only build the root path, don't include the - remaining path or query string. - :param strip_querystring: Don't include the query string. - :param host_only: Only build the scheme and host. - :param trusted_hosts: A list of trusted host names to validate the - host against. - """ - parts = { - "scheme": environ["wsgi.url_scheme"], - "host": get_host(environ, trusted_hosts), - } - - if not host_only: - parts["root_path"] = environ.get("SCRIPT_NAME", "") - - if not root_only: - parts["path"] = environ.get("PATH_INFO", "") - - if not strip_querystring: - parts["query_string"] = environ.get("QUERY_STRING", "").encode("latin1") - - return _sansio_utils.get_current_url(**parts) - - -def _get_server( - environ: "WSGIEnvironment", -) -> t.Optional[t.Tuple[str, t.Optional[int]]]: - name = environ.get("SERVER_NAME") - - if name is None: - return None - - try: - port: t.Optional[int] = int(environ.get("SERVER_PORT", None)) - except (TypeError, ValueError): - # unix socket - port = None - - return name, port - - -def get_host( - environ: "WSGIEnvironment", trusted_hosts: t.Optional[t.Iterable[str]] = None -) -> str: - """Return the host for the given WSGI environment. - - The ``Host`` header is preferred, then ``SERVER_NAME`` if it's not - set. The returned host will only contain the port if it is different - than the standard port for the protocol. - - Optionally, verify that the host is trusted using - :func:`host_is_trusted` and raise a - :exc:`~werkzeug.exceptions.SecurityError` if it is not. - - :param environ: A WSGI environment dict. - :param trusted_hosts: A list of trusted host names. - - :return: Host, with port if necessary. - :raise ~werkzeug.exceptions.SecurityError: If the host is not - trusted. - """ - return _sansio_utils.get_host( - environ["wsgi.url_scheme"], - environ.get("HTTP_HOST"), - _get_server(environ), - trusted_hosts, - ) - - -def get_content_length(environ: "WSGIEnvironment") -> t.Optional[int]: - """Returns the content length from the WSGI environment as - integer. If it's not available or chunked transfer encoding is used, - ``None`` is returned. - - .. versionadded:: 0.9 - - :param environ: the WSGI environ to fetch the content length from. - """ - if environ.get("HTTP_TRANSFER_ENCODING", "") == "chunked": - return None - - content_length = environ.get("CONTENT_LENGTH") - if content_length is not None: - try: - return max(0, int(content_length)) - except (ValueError, TypeError): - pass - return None - - -def get_input_stream( - environ: "WSGIEnvironment", safe_fallback: bool = True -) -> t.BinaryIO: - """Returns the input stream from the WSGI environment and wraps it - in the most sensible way possible. The stream returned is not the - raw WSGI stream in most cases but one that is safe to read from - without taking into account the content length. - - If content length is not set, the stream will be empty for safety reasons. - If the WSGI server supports chunked or infinite streams, it should set - the ``wsgi.input_terminated`` value in the WSGI environ to indicate that. - - .. versionadded:: 0.9 - - :param environ: the WSGI environ to fetch the stream from. - :param safe_fallback: use an empty stream as a safe fallback when the - content length is not set. Disabling this allows infinite streams, - which can be a denial-of-service risk. - """ - stream = t.cast(t.BinaryIO, environ["wsgi.input"]) - content_length = get_content_length(environ) - - # A wsgi extension that tells us if the input is terminated. In - # that case we return the stream unchanged as we know we can safely - # read it until the end. - if environ.get("wsgi.input_terminated"): - return stream - - # If the request doesn't specify a content length, returning the stream is - # potentially dangerous because it could be infinite, malicious or not. If - # safe_fallback is true, return an empty stream instead for safety. - if content_length is None: - return io.BytesIO() if safe_fallback else stream - - # Otherwise limit the stream to the content length - return t.cast(t.BinaryIO, LimitedStream(stream, content_length)) - - -def get_query_string(environ: "WSGIEnvironment") -> str: - """Returns the ``QUERY_STRING`` from the WSGI environment. This also - takes care of the WSGI decoding dance. The string returned will be - restricted to ASCII characters. - - :param environ: WSGI environment to get the query string from. - - .. versionadded:: 0.9 - """ - qs = environ.get("QUERY_STRING", "").encode("latin1") - # QUERY_STRING really should be ascii safe but some browsers - # will send us some unicode stuff (I am looking at you IE). - # In that case we want to urllib quote it badly. - return url_quote(qs, safe=":&%=+$!*'(),") - - -def get_path_info( - environ: "WSGIEnvironment", charset: str = "utf-8", errors: str = "replace" -) -> str: - """Return the ``PATH_INFO`` from the WSGI environment and decode it - unless ``charset`` is ``None``. - - :param environ: WSGI environment to get the path from. - :param charset: The charset for the path info, or ``None`` if no - decoding should be performed. - :param errors: The decoding error handling. - - .. versionadded:: 0.9 - """ - path = environ.get("PATH_INFO", "").encode("latin1") - return _to_str(path, charset, errors, allow_none_charset=True) # type: ignore - - -def get_script_name( - environ: "WSGIEnvironment", charset: str = "utf-8", errors: str = "replace" -) -> str: - """Return the ``SCRIPT_NAME`` from the WSGI environment and decode - it unless `charset` is set to ``None``. - - :param environ: WSGI environment to get the path from. - :param charset: The charset for the path, or ``None`` if no decoding - should be performed. - :param errors: The decoding error handling. - - .. versionadded:: 0.9 - """ - path = environ.get("SCRIPT_NAME", "").encode("latin1") - return _to_str(path, charset, errors, allow_none_charset=True) # type: ignore - - -def pop_path_info( - environ: "WSGIEnvironment", charset: str = "utf-8", errors: str = "replace" -) -> t.Optional[str]: - """Removes and returns the next segment of `PATH_INFO`, pushing it onto - `SCRIPT_NAME`. Returns `None` if there is nothing left on `PATH_INFO`. - - If the `charset` is set to `None` bytes are returned. - - If there are empty segments (``'/foo//bar``) these are ignored but - properly pushed to the `SCRIPT_NAME`: - - >>> env = {'SCRIPT_NAME': '/foo', 'PATH_INFO': '/a/b'} - >>> pop_path_info(env) - 'a' - >>> env['SCRIPT_NAME'] - '/foo/a' - >>> pop_path_info(env) - 'b' - >>> env['SCRIPT_NAME'] - '/foo/a/b' - - .. versionadded:: 0.5 - - .. versionchanged:: 0.9 - The path is now decoded and a charset and encoding - parameter can be provided. - - :param environ: the WSGI environment that is modified. - :param charset: The ``encoding`` parameter passed to - :func:`bytes.decode`. - :param errors: The ``errors`` paramater passed to - :func:`bytes.decode`. - """ - path = environ.get("PATH_INFO") - if not path: - return None - - script_name = environ.get("SCRIPT_NAME", "") - - # shift multiple leading slashes over - old_path = path - path = path.lstrip("/") - if path != old_path: - script_name += "/" * (len(old_path) - len(path)) - - if "/" not in path: - environ["PATH_INFO"] = "" - environ["SCRIPT_NAME"] = script_name + path - rv = path.encode("latin1") - else: - segment, path = path.split("/", 1) - environ["PATH_INFO"] = f"/{path}" - environ["SCRIPT_NAME"] = script_name + segment - rv = segment.encode("latin1") - - return _to_str(rv, charset, errors, allow_none_charset=True) # type: ignore - - -def peek_path_info( - environ: "WSGIEnvironment", charset: str = "utf-8", errors: str = "replace" -) -> t.Optional[str]: - """Returns the next segment on the `PATH_INFO` or `None` if there - is none. Works like :func:`pop_path_info` without modifying the - environment: - - >>> env = {'SCRIPT_NAME': '/foo', 'PATH_INFO': '/a/b'} - >>> peek_path_info(env) - 'a' - >>> peek_path_info(env) - 'a' - - If the `charset` is set to `None` bytes are returned. - - .. versionadded:: 0.5 - - .. versionchanged:: 0.9 - The path is now decoded and a charset and encoding - parameter can be provided. - - :param environ: the WSGI environment that is checked. - """ - segments = environ.get("PATH_INFO", "").lstrip("/").split("/", 1) - if segments: - return _to_str( # type: ignore - segments[0].encode("latin1"), charset, errors, allow_none_charset=True - ) - return None - - -def extract_path_info( - environ_or_baseurl: t.Union[str, "WSGIEnvironment"], - path_or_url: t.Union[str, _URLTuple], - charset: str = "utf-8", - errors: str = "werkzeug.url_quote", - collapse_http_schemes: bool = True, -) -> t.Optional[str]: - """Extracts the path info from the given URL (or WSGI environment) and - path. The path info returned is a string. The URLs might also be IRIs. - - If the path info could not be determined, `None` is returned. - - Some examples: - - >>> extract_path_info('http://example.com/app', '/app/hello') - '/hello' - >>> extract_path_info('http://example.com/app', - ... 'https://example.com/app/hello') - '/hello' - >>> extract_path_info('http://example.com/app', - ... 'https://example.com/app/hello', - ... collapse_http_schemes=False) is None - True - - Instead of providing a base URL you can also pass a WSGI environment. - - :param environ_or_baseurl: a WSGI environment dict, a base URL or - base IRI. This is the root of the - application. - :param path_or_url: an absolute path from the server root, a - relative path (in which case it's the path info) - or a full URL. - :param charset: the charset for byte data in URLs - :param errors: the error handling on decode - :param collapse_http_schemes: if set to `False` the algorithm does - not assume that http and https on the - same server point to the same - resource. - - .. versionchanged:: 0.15 - The ``errors`` parameter defaults to leaving invalid bytes - quoted instead of replacing them. - - .. versionadded:: 0.6 - """ - - def _normalize_netloc(scheme: str, netloc: str) -> str: - parts = netloc.split("@", 1)[-1].split(":", 1) - port: t.Optional[str] - - if len(parts) == 2: - netloc, port = parts - if (scheme == "http" and port == "80") or ( - scheme == "https" and port == "443" - ): - port = None - else: - netloc = parts[0] - port = None - - if port is not None: - netloc += f":{port}" - - return netloc - - # make sure whatever we are working on is a IRI and parse it - path = uri_to_iri(path_or_url, charset, errors) - if isinstance(environ_or_baseurl, dict): - environ_or_baseurl = get_current_url(environ_or_baseurl, root_only=True) - base_iri = uri_to_iri(environ_or_baseurl, charset, errors) - base_scheme, base_netloc, base_path = url_parse(base_iri)[:3] - cur_scheme, cur_netloc, cur_path = url_parse(url_join(base_iri, path))[:3] - - # normalize the network location - base_netloc = _normalize_netloc(base_scheme, base_netloc) - cur_netloc = _normalize_netloc(cur_scheme, cur_netloc) - - # is that IRI even on a known HTTP scheme? - if collapse_http_schemes: - for scheme in base_scheme, cur_scheme: - if scheme not in ("http", "https"): - return None - else: - if not (base_scheme in ("http", "https") and base_scheme == cur_scheme): - return None - - # are the netlocs compatible? - if base_netloc != cur_netloc: - return None - - # are we below the application path? - base_path = base_path.rstrip("/") - if not cur_path.startswith(base_path): - return None - - return f"/{cur_path[len(base_path) :].lstrip('/')}" - - -class ClosingIterator: - """The WSGI specification requires that all middlewares and gateways - respect the `close` callback of the iterable returned by the application. - Because it is useful to add another close action to a returned iterable - and adding a custom iterable is a boring task this class can be used for - that:: - - return ClosingIterator(app(environ, start_response), [cleanup_session, - cleanup_locals]) - - If there is just one close function it can be passed instead of the list. - - A closing iterator is not needed if the application uses response objects - and finishes the processing if the response is started:: - - try: - return response(environ, start_response) - finally: - cleanup_session() - cleanup_locals() - """ - - def __init__( - self, - iterable: t.Iterable[bytes], - callbacks: t.Optional[ - t.Union[t.Callable[[], None], t.Iterable[t.Callable[[], None]]] - ] = None, - ) -> None: - iterator = iter(iterable) - self._next = t.cast(t.Callable[[], bytes], partial(next, iterator)) - if callbacks is None: - callbacks = [] - elif callable(callbacks): - callbacks = [callbacks] - else: - callbacks = list(callbacks) - iterable_close = getattr(iterable, "close", None) - if iterable_close: - callbacks.insert(0, iterable_close) - self._callbacks = callbacks - - def __iter__(self) -> "ClosingIterator": - return self - - def __next__(self) -> bytes: - return self._next() - - def close(self) -> None: - for callback in self._callbacks: - callback() - - -def wrap_file( - environ: "WSGIEnvironment", file: t.BinaryIO, buffer_size: int = 8192 -) -> t.Iterable[bytes]: - """Wraps a file. This uses the WSGI server's file wrapper if available - or otherwise the generic :class:`FileWrapper`. - - .. versionadded:: 0.5 - - If the file wrapper from the WSGI server is used it's important to not - iterate over it from inside the application but to pass it through - unchanged. If you want to pass out a file wrapper inside a response - object you have to set :attr:`Response.direct_passthrough` to `True`. - - More information about file wrappers are available in :pep:`333`. - - :param file: a :class:`file`-like object with a :meth:`~file.read` method. - :param buffer_size: number of bytes for one iteration. - """ - return environ.get("wsgi.file_wrapper", FileWrapper)( # type: ignore - file, buffer_size - ) - - -class FileWrapper: - """This class can be used to convert a :class:`file`-like object into - an iterable. It yields `buffer_size` blocks until the file is fully - read. - - You should not use this class directly but rather use the - :func:`wrap_file` function that uses the WSGI server's file wrapper - support if it's available. - - .. versionadded:: 0.5 - - If you're using this object together with a :class:`Response` you have - to use the `direct_passthrough` mode. - - :param file: a :class:`file`-like object with a :meth:`~file.read` method. - :param buffer_size: number of bytes for one iteration. - """ - - def __init__(self, file: t.BinaryIO, buffer_size: int = 8192) -> None: - self.file = file - self.buffer_size = buffer_size - - def close(self) -> None: - if hasattr(self.file, "close"): - self.file.close() - - def seekable(self) -> bool: - if hasattr(self.file, "seekable"): - return self.file.seekable() - if hasattr(self.file, "seek"): - return True - return False - - def seek(self, *args: t.Any) -> None: - if hasattr(self.file, "seek"): - self.file.seek(*args) - - def tell(self) -> t.Optional[int]: - if hasattr(self.file, "tell"): - return self.file.tell() - return None - - def __iter__(self) -> "FileWrapper": - return self - - def __next__(self) -> bytes: - data = self.file.read(self.buffer_size) - if data: - return data - raise StopIteration() - - -class _RangeWrapper: - # private for now, but should we make it public in the future ? - - """This class can be used to convert an iterable object into - an iterable that will only yield a piece of the underlying content. - It yields blocks until the underlying stream range is fully read. - The yielded blocks will have a size that can't exceed the original - iterator defined block size, but that can be smaller. - - If you're using this object together with a :class:`Response` you have - to use the `direct_passthrough` mode. - - :param iterable: an iterable object with a :meth:`__next__` method. - :param start_byte: byte from which read will start. - :param byte_range: how many bytes to read. - """ - - def __init__( - self, - iterable: t.Union[t.Iterable[bytes], t.BinaryIO], - start_byte: int = 0, - byte_range: t.Optional[int] = None, - ): - self.iterable = iter(iterable) - self.byte_range = byte_range - self.start_byte = start_byte - self.end_byte = None - - if byte_range is not None: - self.end_byte = start_byte + byte_range - - self.read_length = 0 - self.seekable = ( - hasattr(iterable, "seekable") and iterable.seekable() # type: ignore - ) - self.end_reached = False - - def __iter__(self) -> "_RangeWrapper": - return self - - def _next_chunk(self) -> bytes: - try: - chunk = next(self.iterable) - self.read_length += len(chunk) - return chunk - except StopIteration: - self.end_reached = True - raise - - def _first_iteration(self) -> t.Tuple[t.Optional[bytes], int]: - chunk = None - if self.seekable: - self.iterable.seek(self.start_byte) # type: ignore - self.read_length = self.iterable.tell() # type: ignore - contextual_read_length = self.read_length - else: - while self.read_length <= self.start_byte: - chunk = self._next_chunk() - if chunk is not None: - chunk = chunk[self.start_byte - self.read_length :] - contextual_read_length = self.start_byte - return chunk, contextual_read_length - - def _next(self) -> bytes: - if self.end_reached: - raise StopIteration() - chunk = None - contextual_read_length = self.read_length - if self.read_length == 0: - chunk, contextual_read_length = self._first_iteration() - if chunk is None: - chunk = self._next_chunk() - if self.end_byte is not None and self.read_length >= self.end_byte: - self.end_reached = True - return chunk[: self.end_byte - contextual_read_length] - return chunk - - def __next__(self) -> bytes: - chunk = self._next() - if chunk: - return chunk - self.end_reached = True - raise StopIteration() - - def close(self) -> None: - if hasattr(self.iterable, "close"): - self.iterable.close() # type: ignore - - -def _make_chunk_iter( - stream: t.Union[t.Iterable[bytes], t.BinaryIO], - limit: t.Optional[int], - buffer_size: int, -) -> t.Iterator[bytes]: - """Helper for the line and chunk iter functions.""" - if isinstance(stream, (bytes, bytearray, str)): - raise TypeError( - "Passed a string or byte object instead of true iterator or stream." - ) - if not hasattr(stream, "read"): - for item in stream: - if item: - yield item - return - stream = t.cast(t.BinaryIO, stream) - if not isinstance(stream, LimitedStream) and limit is not None: - stream = t.cast(t.BinaryIO, LimitedStream(stream, limit)) - _read = stream.read - while True: - item = _read(buffer_size) - if not item: - break - yield item - - -def make_line_iter( - stream: t.Union[t.Iterable[bytes], t.BinaryIO], - limit: t.Optional[int] = None, - buffer_size: int = 10 * 1024, - cap_at_buffer: bool = False, -) -> t.Iterator[bytes]: - """Safely iterates line-based over an input stream. If the input stream - is not a :class:`LimitedStream` the `limit` parameter is mandatory. - - This uses the stream's :meth:`~file.read` method internally as opposite - to the :meth:`~file.readline` method that is unsafe and can only be used - in violation of the WSGI specification. The same problem applies to the - `__iter__` function of the input stream which calls :meth:`~file.readline` - without arguments. - - If you need line-by-line processing it's strongly recommended to iterate - over the input stream using this helper function. - - .. versionchanged:: 0.8 - This function now ensures that the limit was reached. - - .. versionadded:: 0.9 - added support for iterators as input stream. - - .. versionadded:: 0.11.10 - added support for the `cap_at_buffer` parameter. - - :param stream: the stream or iterate to iterate over. - :param limit: the limit in bytes for the stream. (Usually - content length. Not necessary if the `stream` - is a :class:`LimitedStream`. - :param buffer_size: The optional buffer size. - :param cap_at_buffer: if this is set chunks are split if they are longer - than the buffer size. Internally this is implemented - that the buffer size might be exhausted by a factor - of two however. - """ - _iter = _make_chunk_iter(stream, limit, buffer_size) - - first_item = next(_iter, "") - if not first_item: - return - - s = _make_encode_wrapper(first_item) - empty = t.cast(bytes, s("")) - cr = t.cast(bytes, s("\r")) - lf = t.cast(bytes, s("\n")) - crlf = t.cast(bytes, s("\r\n")) - - _iter = t.cast(t.Iterator[bytes], chain((first_item,), _iter)) - - def _iter_basic_lines() -> t.Iterator[bytes]: - _join = empty.join - buffer: t.List[bytes] = [] - while True: - new_data = next(_iter, "") - if not new_data: - break - new_buf: t.List[bytes] = [] - buf_size = 0 - for item in t.cast( - t.Iterator[bytes], chain(buffer, new_data.splitlines(True)) - ): - new_buf.append(item) - buf_size += len(item) - if item and item[-1:] in crlf: - yield _join(new_buf) - new_buf = [] - elif cap_at_buffer and buf_size >= buffer_size: - rv = _join(new_buf) - while len(rv) >= buffer_size: - yield rv[:buffer_size] - rv = rv[buffer_size:] - new_buf = [rv] - buffer = new_buf - if buffer: - yield _join(buffer) - - # This hackery is necessary to merge 'foo\r' and '\n' into one item - # of 'foo\r\n' if we were unlucky and we hit a chunk boundary. - previous = empty - for item in _iter_basic_lines(): - if item == lf and previous[-1:] == cr: - previous += item - item = empty - if previous: - yield previous - previous = item - if previous: - yield previous - - -def make_chunk_iter( - stream: t.Union[t.Iterable[bytes], t.BinaryIO], - separator: bytes, - limit: t.Optional[int] = None, - buffer_size: int = 10 * 1024, - cap_at_buffer: bool = False, -) -> t.Iterator[bytes]: - """Works like :func:`make_line_iter` but accepts a separator - which divides chunks. If you want newline based processing - you should use :func:`make_line_iter` instead as it - supports arbitrary newline markers. - - .. versionadded:: 0.8 - - .. versionadded:: 0.9 - added support for iterators as input stream. - - .. versionadded:: 0.11.10 - added support for the `cap_at_buffer` parameter. - - :param stream: the stream or iterate to iterate over. - :param separator: the separator that divides chunks. - :param limit: the limit in bytes for the stream. (Usually - content length. Not necessary if the `stream` - is otherwise already limited). - :param buffer_size: The optional buffer size. - :param cap_at_buffer: if this is set chunks are split if they are longer - than the buffer size. Internally this is implemented - that the buffer size might be exhausted by a factor - of two however. - """ - _iter = _make_chunk_iter(stream, limit, buffer_size) - - first_item = next(_iter, b"") - if not first_item: - return - - _iter = t.cast(t.Iterator[bytes], chain((first_item,), _iter)) - if isinstance(first_item, str): - separator = _to_str(separator) - _split = re.compile(f"({re.escape(separator)})").split - _join = "".join - else: - separator = _to_bytes(separator) - _split = re.compile(b"(" + re.escape(separator) + b")").split - _join = b"".join - - buffer: t.List[bytes] = [] - while True: - new_data = next(_iter, b"") - if not new_data: - break - chunks = _split(new_data) - new_buf: t.List[bytes] = [] - buf_size = 0 - for item in chain(buffer, chunks): - if item == separator: - yield _join(new_buf) - new_buf = [] - buf_size = 0 - else: - buf_size += len(item) - new_buf.append(item) - - if cap_at_buffer and buf_size >= buffer_size: - rv = _join(new_buf) - while len(rv) >= buffer_size: - yield rv[:buffer_size] - rv = rv[buffer_size:] - new_buf = [rv] - buf_size = len(rv) - - buffer = new_buf - if buffer: - yield _join(buffer) - - -class LimitedStream(io.IOBase): - """Wraps a stream so that it doesn't read more than n bytes. If the - stream is exhausted and the caller tries to get more bytes from it - :func:`on_exhausted` is called which by default returns an empty - string. The return value of that function is forwarded - to the reader function. So if it returns an empty string - :meth:`read` will return an empty string as well. - - The limit however must never be higher than what the stream can - output. Otherwise :meth:`readlines` will try to read past the - limit. - - .. admonition:: Note on WSGI compliance - - calls to :meth:`readline` and :meth:`readlines` are not - WSGI compliant because it passes a size argument to the - readline methods. Unfortunately the WSGI PEP is not safely - implementable without a size argument to :meth:`readline` - because there is no EOF marker in the stream. As a result - of that the use of :meth:`readline` is discouraged. - - For the same reason iterating over the :class:`LimitedStream` - is not portable. It internally calls :meth:`readline`. - - We strongly suggest using :meth:`read` only or using the - :func:`make_line_iter` which safely iterates line-based - over a WSGI input stream. - - :param stream: the stream to wrap. - :param limit: the limit for the stream, must not be longer than - what the string can provide if the stream does not - end with `EOF` (like `wsgi.input`) - """ - - def __init__(self, stream: t.BinaryIO, limit: int) -> None: - self._read = stream.read - self._readline = stream.readline - self._pos = 0 - self.limit = limit - - def __iter__(self) -> "LimitedStream": - return self - - @property - def is_exhausted(self) -> bool: - """If the stream is exhausted this attribute is `True`.""" - return self._pos >= self.limit - - def on_exhausted(self) -> bytes: - """This is called when the stream tries to read past the limit. - The return value of this function is returned from the reading - function. - """ - # Read null bytes from the stream so that we get the - # correct end of stream marker. - return self._read(0) - - def on_disconnect(self) -> bytes: - """What should happen if a disconnect is detected? The return - value of this function is returned from read functions in case - the client went away. By default a - :exc:`~werkzeug.exceptions.ClientDisconnected` exception is raised. - """ - from .exceptions import ClientDisconnected - - raise ClientDisconnected() - - def exhaust(self, chunk_size: int = 1024 * 64) -> None: - """Exhaust the stream. This consumes all the data left until the - limit is reached. - - :param chunk_size: the size for a chunk. It will read the chunk - until the stream is exhausted and throw away - the results. - """ - to_read = self.limit - self._pos - chunk = chunk_size - while to_read > 0: - chunk = min(to_read, chunk) - self.read(chunk) - to_read -= chunk - - def read(self, size: t.Optional[int] = None) -> bytes: - """Read `size` bytes or if size is not provided everything is read. - - :param size: the number of bytes read. - """ - if self._pos >= self.limit: - return self.on_exhausted() - if size is None or size == -1: # -1 is for consistence with file - size = self.limit - to_read = min(self.limit - self._pos, size) - try: - read = self._read(to_read) - except (OSError, ValueError): - return self.on_disconnect() - if to_read and len(read) != to_read: - return self.on_disconnect() - self._pos += len(read) - return read - - def readline(self, size: t.Optional[int] = None) -> bytes: - """Reads one line from the stream.""" - if self._pos >= self.limit: - return self.on_exhausted() - if size is None: - size = self.limit - self._pos - else: - size = min(size, self.limit - self._pos) - try: - line = self._readline(size) - except (ValueError, OSError): - return self.on_disconnect() - if size and not line: - return self.on_disconnect() - self._pos += len(line) - return line - - def readlines(self, size: t.Optional[int] = None) -> t.List[bytes]: - """Reads a file into a list of strings. It calls :meth:`readline` - until the file is read to the end. It does support the optional - `size` argument if the underlying stream supports it for - `readline`. - """ - last_pos = self._pos - result = [] - if size is not None: - end = min(self.limit, last_pos + size) - else: - end = self.limit - while True: - if size is not None: - size -= last_pos - self._pos - if self._pos >= end: - break - result.append(self.readline(size)) - if size is not None: - last_pos = self._pos - return result - - def tell(self) -> int: - """Returns the position of the stream. - - .. versionadded:: 0.9 - """ - return self._pos - - def __next__(self) -> bytes: - line = self.readline() - if not line: - raise StopIteration() - return line - - def readable(self) -> bool: - return True diff --git a/venv/lib64 b/venv/lib64 deleted file mode 120000 index 7951405..0000000 --- a/venv/lib64 +++ /dev/null @@ -1 +0,0 @@ -lib \ No newline at end of file diff --git a/venv/pyvenv.cfg b/venv/pyvenv.cfg deleted file mode 100644 index 853404e..0000000 --- a/venv/pyvenv.cfg +++ /dev/null @@ -1,3 +0,0 @@ -home = /usr/bin -include-system-site-packages = false -version = 3.8.10 diff --git a/venv/share/python-wheels/CacheControl-0.12.6-py2.py3-none-any.whl b/venv/share/python-wheels/CacheControl-0.12.6-py2.py3-none-any.whl deleted file mode 100644 index adbd56e9cabd2cc2f8b3f46ad5e4a404a13c933b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28023 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%0A_-uQ2C75bZ}x=BDA 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 diff --git a/venv/share/python-wheels/contextlib2-0.6.0-py2.py3-none-any.whl b/venv/share/python-wheels/contextlib2-0.6.0-py2.py3-none-any.whl deleted file mode 100644 index 1b46930aa18b658a87d977be24024750c3094040..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17188 zcma&O1B@um!mT~FZQHhO+qP}ndu)4;XOC^$wr$VceeTVl^Pe}l-?`oCbgDafx{~VZ zs$OfQ6r_PcPyhe`AOPYZs+B5?`y-Nx0RZ4s007AUUNyG2b20UBv9UB_qGh0Cqhp{m zv2=E!wX`#{rx#RJk&stXrgQOdiS?0<-{flF_VWu(ed)L8+q&i(0mA}r;{Ryfa+7Zv zndZy_ls1y2@l_xzsjSgDA{wI;OfU_w0n3;o$O1rzY#5yyW)?^_{}%F-%snYlp-b_# ziUV}NBgOxP@^=44R1wX;xz59-o>6&FQ`dA~-`M81%_gZwtvpmw?f;Plty)?77#cxC@9q}QQL&6NB%ez1qkG)ke-LGOT3gaK& ze8*Y3llCRPoah4=WF?$w9(4@l61>cDo#m#=lx-;gq^Ic zH747!q*H9ED#j&au@svl6S&0ZvGgX})N^Q14^=MfG)0Y)v^1tF(wVTQzq;4Vmo;Ba z63)nn+@z{+O0`BxjtpN$$g~9Z0&MVv|Kqf+=D1YQ94{xA_xtmkv zHZ>sD(Kl7_fLAqFnye{9uYipeO-6r4V7*JdJU|x=(VYaWfC8xzP+I4i#*J^xhF^K= zm4U^+G49$1T_y3JFy*mHGWwS(mo*ly?#s4u4D_gy0}wdq0Y+5T=@wI{5Geb2Kj@2^ z^i^EEe5o$!y_lT(Jbf}J2f!;=9*0|s3%mDt|eV9MHw9`XE3U%=#Gp3>vy!Cahqk3s)08Ox72<@ zii#Ph+m@p3&N|qB>Sl$6Fbp`Cq9yq0+!@3*%c0+L8Wv>v1@Pqs^!T?mDY8cmnx>Al z*DM!z?Orr$N4~*yHNn|xIO7%hdEE!Ao771kE}2)F;2ft~*stju@`GlZ+tL{uK<>j$ zk214i)6y|_MtRi@%$>mCSbNtY_4FlSrzmGwy@!;2sdPxdAx&8hN|Tdtg7VS@(?>e@ z3zvZ>?&zz8+;WTJB6$B>O-jOzL(u+%!81 zMN`Z&+Z}4GmUGUDq{Q{YVhBg_mXJS>3-WVs>0G^6@|IJb4rH{ZbxlvRDM>8=0T;JM zw97j*3H3yOpUk9kM;2$-bO$(|4YF^9TWTWUIy)<<22q>^$yzOAOk$^4J{ktSI>T%x z%V=_F?lAyo1i0{VI=6O~G(tWCZ$_808C=`-a{G)~PQXx;RWe)r#8S1rErjszALp312cC6ORm_`&Y1Tz>GmOK$SRA_?VM37?Pe__H@;S) z-dvat8j_=RQHe_;bu+6jrzAl_yIA&pPmxUbNTv6NrK5pCI?C9HckiYxEiY%loSlv1 zac7R8$y}2K7nLJtkf~LUlUGbr9{x$|7P;gLj@$sC{#@c@y@89gF_Zke(7NlGrO%=Y z35IIONduXti9rDNPX>y19>ozG13878f(xz`}?74zf{eTVv# z>{{z4+N0SW&ow~Tl`3Y;wqfaW1ZK7IlsV;&(j@=f#3*wiS*lu;%dAJuC1q~Frm(6* zrzhYAEsU=dc8!8Rv~YjKHgi<+BKNwV1JhZ|`bOu(G5Ary&x}YbNEVox+e2<`&pLY^ zm@gv6s)`d0torUZdds1Y-?>kMV8-ahf2J6{an3oazza}sXz92|A zJlKRwLWtZ$eTzGTK9N5p)$HLh*ND+GY?b2Qe5lPBR^%`3JPm7tQS+H5)^DsjC-YaM zq(GR#cmMe9?-4sc1qGX8PAs_5=03p2 z*I+mhW}hx4Q#StM(lp9!35I%slgo$5F8C7Fkr@61JV8O@o}b#V_!8yn5(wA#krqFTJ<3zN=Q6Jg-RqY1!1~T>gMBsp?IJW3Tloa>3IR+UQ!__h+EY0|C#w}>dxVw5 zxF;_0u_TE5q~pEylwnrf&pCP*h$j_0O$#nNWiaD(nEos7@jy~Ut+xja`U8UKUbTcN zGSEb5#512nrb}T3S5uoM@tP7WC3LVT(#N}6{OjW*$Php0r`50&fo#@)^XmCfVQkRAd4Uev% zh2^@xh44IM`O74!m=TouGS->6Ai1-jFzx+c*cRGdQq3{<#XeQLs%0{puvZD(AEt#dJHy+ zVk;g)c(4#p;hBqe7*W@jk5n4_peJ9_Tp1Zk_6B=Vg{ZrvzJ{+XRWrp7MZlc4sT>>g zBAoPx?Dek3ySCU7>4qLSAp|<^tyN4H2*K7gPnQ*+{-BA1H7f?@@&|fJIv`f@;$Bd7r@?OP=mrJZ+T31ko6f6yH-?>r z;GKvw{%M;-U5hDg@qQ%Q(;0tYby$05WSoJ$PexmIt#`W-z?T=Ll{3(YD*kMLKJC2E z-wK)xm6))OW;_-(>_IPo5+%m}Mp4p&KjDW%Bw z4Loq%uvXbkUbG;tXwa=wulrv1k(Jh$`SP>2>2s}ftPrtU-X1xqlHC=nLw%!HSL6AB zYg5T(yrKbR9*J>xlEC(U7NZuhg9=@Vurq8>6germQZLd`!H31P0w5H$FW<45D`ho5 zaJDFIpYA{8VcOy`B}$>+W&}HJ6<%ZIFg^=2^S_XAoEXbuU}|jQgy=*ZUc!tQ-8|9_ zir}k|a>)pgUGJBe$h4at>yrN34rQv$f1<>!pCI3wnJR7e?BOFbl8_spm@M5)^Y`(2 zK0SO4oCW82O0gwuF`U&CKZ%dS&&k={3FZ>NzDpv9hv$90{^GvwE05!rwYa!EybJDp zy?&e(_OzCoZaB};8YXxa>Z&yWkHVEIQlIm&tqu+}NSIbFD_vzZK>;x#qr(Lwa>V8W zuCJJ#FEz#3Lxc)jylzA&j>cmPuCQDZ_+!gvHQtkEkt_~|6ACN}izJ`x(*u47dc15} zxC)hME>G47MXb%%X@A^qxjUJIPDreXDw2<2$3(Yf_aecFd1JF|nZ9OcTpHJO{6y0?j z*%iO=@wXp>kFzJG5-|}lwxYvlfGX2yhlfW7XlGL*s%Q*6w4DR&kIJA!|7ze31@ViY zk&AnYzTsL@%iN&u=^l^2trY#957q@GDi5$cQy83@7J}_t#COsNRsRB0tE6vTmM)d$ zL-Yh{4~9qYFQRaT{COp`7P#viRz6xbRJLa;CPVG&^6*3KQccYS1)^(lP8t6`ryFHL zsEdWs`8nDV*#6%6`5Yo*0$HrcriR$HcHmt#`urf+3>q5dog_gl?re5tBsSD+0a_1PX)EGTEDg~*^CJ{OvVuGe98!?PzHXxRj4UCP z_A5q~xdq3;JgX{k4P*X*LqT_YScAAZ*OTvxK~?e<^CBD>%(A)!!_26{ta0wvzgpG# zku)LVCG^QEt4Leg`^Ec18Es#eYjIF!?oI29v z6_-#o7RmsTZTb5sPcg}aWKY}(26`*~1DQgGBh=ZP+~}K?X3R_0%-RI$*f%N5Wb34D zhz6Dx;*gvbUAJykVt;lK`zRW(5W`oGKsVznCv8Oo>yK4GWo;X4!ZVJDpa<9w9yz|W@A>9 zYdFYg?(}7^fUw6}0UQiOmJbxZMV**X(DecTg6?Gg8$z!5$PzM+1msPRbv`s?#t(1tRp1wP%&;rn*VK-pt>|DP1jrHrPv9Cfen4I& z9YmL(bR@*n;V?CiyHZGFw(h#xVX|mKWYIFGfjMe#l=@t>#ugSFt401azh79hoshR4 zV{&IrfD$<)?QPAEgR?u8Se7+3sFH{reeNAzN@`T9snYRb;kR6Nd4PTmF8}rk5P@ z=~m$pC$=@F2Dez1qI9P(oE$NYY4n0zG|tihCf^ zuuVNC(HRK;+tk72<}kK-v;2;U6BUB~>};-$y$)PI!!&@#a_8k~5@y57p5eUN>hyYN zZJT-+i8P$6rxqBvn~}B%0M##htdu-^Tc94|qtBBrU#!waf(*%WW;iyV-4}}Yc5-wr zAW9@VF@14KS_4OFH5m229f+591gaHGS-DuHiG)mT1^e`6MJzf+`H4+Wg6r+kGJSQM zt~(hnw5JOHw;!QkCXB( zsM6YY#T8Wqj0wr7b8&MU_v}k$&9ZF3-6%=K79nZr%Rzm({O>OccwKlJx7(p~uFV#t z8>HtmD?7n7A(HCG9JW|?S8lv*v`Ylv7r-ku;I@@O$mwdNt<@U)$+F&TkX=|h!(w+Q z6EnL^Mjm&5>ITFk)Tw}W9`F0tj$+N1z@K0GL5iMwL$?|V6{g&9z*zSKHoCv%=v#IB zAV_r5*251&-fG&)>Z0_RO92R>7L6pxoHw|CDt55eLa?@!;UrM3%?fb;jxQK zz{G<(6FGE7%)C&1M%(aPYi9(-gO`)0A&4E34kWA4KgLi;EOb<0UIW1Rjg*nXP z{wL*#4>H(PERNRme(|C=dz?CgIT?E}9H*@~r?m-K5A(H0KKam)4Htj9nyyWkU%d_b zmg+3LuWzz*bNM_!4?o1=!?J~EZUMwx{64?dlEO#e??BFkJyt{X)U6x7(z82}X}C$X zKM5UOD3Dl#==q*lSQnouSxtO?AEP_El<536m3HkNIZAk_2Ct!7(?+#O3CTY} z4N;e=NSYd-ZjPInMVKOQu~jSYB9nf4>rwr4Pm9v#q2IKFB)PC-&299MdvmPZ950|1?h^~tUh2->mexLY*m=}4 zZn&rG%XxqPT-wa3a%$rO8GlOu)0fCDKn6OR+#$qpTH|RNi`dv(Kx}+{)|dH#k_2}4fku=mC@Ko!BbhUKeXtB~^j*!7<^)B8m!jKv zD`{=+*6Q}C7A#%3GAF*PAYoM>HNlhx!nk8)XDE~vS-)@#a6qFFUphD4g5mH;PCrO8 zR4#E&J*bQB5|TYmlcZ``PBDQy=&hVKUgH_ioW)agmt4uOE85C|v00)@uDJjeTwXNk?ah>nwk==yIbSD&s`q-?T;x}}a z>8z5H(Qx+6hL&k6<~ertNS8INv@_+ZX`O36;9nm(P*N&|}au?`NB(@2=$eT;C3vbHUEwIbP)Ht4AMd+FvzkB~0fU{@%^1XlyLxsjQlqZw?uM?gC@yU)-V?yAu9%(`d#zU6F-3c6Ntu{l>}}+Z zd50Zb>+9bbl~SW;8-T91w6+0kxg#;{r?mj~Deh2{%WR3Sm7h8KcPOze#-v}UA&Am= zguVmiI?OuV1l`(?!UQQCUH}T3zU0dq)SQy9cgEc!boPr#2Y`-WKv#1cyRb{F^8NVy zTztMB@4N0@%TvtJjyyaG)KNyL&zo!eQQ=#QE8e&4?KG$;?1L3Qz!NG&A2YC>0RgA4QGIgqH5=L$asGAvD%QMrP! zFVYcwr1ceSU1`8F>?lq2Im7c7&~cpKlUo*$5@)a^J);)@5Q~VOUf_@QvxNc?Ya6tt zoK^EHc|Xa@t*2Gc3?4wv)}B>_llB3+1NF&GVUot@yBl|rYT`HNm>$}!Fh9+1(lT6z z9<=pMF{{ndG$dsJ+rFIdzm)#|J}ukRe{m`8pZ;N~*>L?GCjvQYN?mo^jjPTYUzpNx zMqQ70)pdE5>Tl6Py2JCU4?KEk-Hj!=uw$E6h8;uMosD|b(@4k@>7z7~XVdvXwyAnD z&}8xMWdVAs*YqOSP<>m6II4K&h2gN;x(?UgcjZ2s@|7sfK6@E=<|TM%td!({E`bL# z{AdHv&HxCGeee#Xiy+r0g}BHzKk0dbv)ZvaK4)gmUohs zpZ)ghfZV+L@Y3zmokx@iY`kP})HDBZK}6DE=mEiL(6ARf+aJnh6RIn^Gq%Wq>%QIH zX>iQ6sTk>X8&kd=hJ&@t^IJxc<{>!>8Ec=ARhHcm$zGMU>@Y}h1yOwpxo23Z{E2rs zvMkts$;`MgTGO5=W}W;k~ejwV7|7hCVyx`F}s&{tM=HLjrA@~+uoUNJY` zYukKa&RIOmnyA`dHgjCG);dLfxRmlZDm;2C0e_|A&0Bsvr*==EmK)9KuFjL?F4m6r z1>7FWSH30btas(+~xx5VQsk%hPqnZP@qH)cLYOhDt$6(rhwvZK<8I5Ok zddS^+EvbwFSrORd5UdyqdRe;j(-WB1e6MGCfRF}NApE~i5CKnd7drNnTG_J7G$Ab6$$32xc=d*ls&YFI%49`?t^2kQA`7^&{zaL z*Eq)2>aZyxBg7hh`oxc?)=1|v^8wzq6&`eA^y2Vr4?@m*hP`jmL;9I5M!r4|23oe# zM9rD+Nop9HLq{&YgbUNhd5Pl1Bo0rGwtL?)!o8cSBUGEy|L>e@p2JTNJl1^`R z4XnDA@msMN^r(Z`z?ns@u_kRpU}b0G!(hmjfG;H^aI}{k8)2RUqkO3er!M~uJ_0+2 zr><|HwwsGCE6T^GP1sDL&v4Audb#b}oweW!{ej3vo3{uSBn&+qZdXzDmFY&)NNz;mgi+Q2T&@_5~q*fp59;l8S$+Bv^ z#aV!^$NT-tD(FVZG|wjcxhntIxqCqlYhvp)9_WCWOvM+C|ViwUvf4*tGul^cYRKdJS8b#qVS*ZH|!xT&S%)2nMKWy|VT`3xHIJ>tQU-XE$G=V`uLRydaDnxw3jB%yed!RfOhThXTq2pufNd(NTA6kl9^{^ya2w z=-UFStNP_dnF5)U92jR!OHKv0h>-pGd3IkcY0kr}G7?Lz<{T!E(qV(4ekRQfN60de(a>?=yXTf)W0 zV!r5(5)&hY9Zq`v!64M$K@uTg5dIRy-Z}+W`k9B#O#ylDjoD)yP2|PVoMpobyLdW? z>oOrnWO%o6?@IeZip?{4m7n4JCM)fL z1tsfeA~W4#Gf2(Gcn;5x!Ye_O?-{XMB37 zv2h^alRBh`rupi@p#N4Uv`*F;;L~#XBJ(QZHQqQGkn_`l#C6{y!D8b38wEgjv*JF} zRyuW+ur;LVYF5Hed@yzLx!0x85fte~u`3=)aFmf-uUq0dY4g>HH)&cDSnvb+JtY%? zJ>qK|cgtk9EZp@={3j)m;d_E!-?&{}y8Kt*rtLwN!tiHLzP5Jt8!fmU3ge=yeT4;J z@(wVwTl}wG&WmY|YuA34ZQHkz=nLpI91nW@FXm4k;p+ZxfXkQ$d|y1j)IH4c0dcJE zH^gv!)?mh&*!2+p6KgXQiTfWANZ`&Wy8r_rHP_Lbq7^4PUC;X^ulvAq{Iy$ar>)kI zL$ehuUC+-Y@jk!#&rM~Q?qB+?+_Ids5Ix|-S7rSXtzL49K6+Yyy%X*iT^2X;(p?2v zu0`ByI>LXg;E+%@9PjrF{yS*EtW(%kG1wjGRT9*S*3hoI2Yml;eEy%Cp0BdJAJX@? zp3l#npXb`2=bN8r{GVre{vUdiS;GMN{$Nh)u%>WmnIC+G{|NS6$UH3u0RaFAf&BMi zkBp?SsGPFszk)rw%JTN>3@AM($~=x%B{8nNwjCLRDAt5=ILgC}Bw-#F5h>eKB~~os7L~UZkp= z@IAmdHs;qw zzvMjG;;^Qcznlc5<p}XK*1v$Kva(v_Xprk9F54kNU?G{f(En)0>Su>H6OQX?1DkgTmZs zck#Y83*C4l>p~0bR<*n%n3H(oJKUjl;BRuAec?ODy;H-L=$z9kW<0(g;!^To57i#0nltHcN_rgFp`+DG8G; z3lUeO3IwrJ^&z&zEbEX`^E8BxhHMYjp>UB;lO{4zq|XzrnaBv%D~8f=j+ZIYIsc+Z zt-NKOdBRaugnDJh%h#!=$tt$S}=t6Tg1!jjrmN&ji7&K>es1S zU>Ukoeo{oqSJ!U`&XVTWgwoXs%3@m^_pNX+0mo7X3q2=UIxI&;`7Ca?SSH5kI7Sze zbj_p0VQbg7^sNk+)+G#)w=%0%hv2c9uR>HP&5HJX38R|orHAp30yPoCPb_(3fHbT0 zBUh1y@}u?8@O?HJxJz-6uON-}ac|}`*^0nZ)B89ilsbSiYiI%Kc}NKefpdm3EMr%V zOyH}%+&0@*uNhz-9mN?~X=F6*Kt+9Sz z4|9O8iG)3)xDL*V-@Q4@(U5zQ#+?#Ii?FFCMmGpuv!Mb9EJAA+(VNw#7QT4P_xbB z7IFtIL!8XXnT5bSWi|@A0hGeXywjH#RVh?H*wwSrRTS3>^TqBdB(t}bM5^pO=XWRO z|2nhB@HMl7B8|2WC9n|$AcseP{DPW_{M;nGytEDJXD%Uth6tZSMth#e+WbusUQ4QKR>!}tX+#0d;% z9Tuq>B7U^oz`BZx5N>jHA|>{r-kY<$Uv9oQ)b+NHh}%o6^9;xfZ)TgA6KBea?c<(% zT1l4U4;Fb@j_laW{2Df}PK$tZpI76+TeY%c0BXfmi&wsoGrf6w8^CIJZk$issF6xd(dIkVBHq*M`?{B3FanDg%1rvo&;fn$|JgFV zWeXbme_O=v??L!qT1H($R8$6fMnZOK4py3$YI<^}QHf!ZdDlsPN}5)RW{kc;NkVFj zhAxsGyh3r7VV0R~j(PqNYJ7%%?ulj@mV#DlYD}gp#YW1z|@xxWBc6`Fl|Qm)g15JLub(x|!PiYhoikJwq*7O))km!?X|d z59s}KuTL#9006Sk-yrmVLg^eltGTV6H#ib^o~RY(!KL{`lLptau+MjXv_nv#kW zFQ-&XbabLZXsRfKq!UtA)jxJxI_?Mn5*tpAl|B+A^XKRvvlh-+l1vBiGli=38_aET z%-mC|u!rWE%sV$rO^4k(L%?HArcxX2csIs6X*=;jemC&xYy5*=@Ge{)0P$c`e>u%7FbhS!bI&O8h>uw(w|}=yx7umMw`P-n2enWNIXT|HfgxEWPMHm} z*330K+dbSl5wT6~&U06wG%_NbhfY88yR@>AYapxS4R{%*uMb1_jp_Xl zWV!eQ@yVsx(k}b~C?|#zziuQG%Z1peB;}^peC}#RBUIFir6Og1_&=^D$|R@RX&B>^ zbZJl0q``D7qK65RIjA+p|yeUaeBpQ0X7uj)L&)Os2N?h9^`LtCWWT z%k1184!PYAi-T?OLSM;qm57wpB%6=cbQ=z))Q-m$4)}$<&5xa1loERz0q*shK)A zUf>WWKu;}^=$N28R(76pvB^+AD5SUbuj`+SY--#C_^@DdU({->bGO^da zRJ|86zH@iKaa&VsGHJo6MNFD(rN*vuI!gu+b23jR#4`4<0~rrLcrU zUFo@AC=AVOjW0TjbC3a5$Vvq-^330=Q`rP6;W77~vk^qjji4FdCXl|oFsxW-?OK)c z1Yb1^)oPeP$dm3Au;~e{?lf})wnD?H5|Ohg*@A8ZyxgUgU>1NxVWGCzse^;DQvG?C z%ke3Dhu?p2nIq?&760vDU&e4ezrd}(al0G^zVE&sP+5Et^gH*vAZcsjJ+1_5)e1md zOY;FXz0NlAN^D8#Eq5Kryc+1aAF#I;Eqf|Z=eHiDKi1E6K*oU~beqX+&eCAlCs-Ch z8VU^MyX90?GRh@>wH3?>3b!bXd{=B`kGq{TMugrQ}wbtw_HDzG5(t6Q(FZrRhG2rSlwhU4nciM4*%bxUlP+N&|&*8xPx zUDV4BZ+HR;v6cTy_~Rcu(iSNgbq=eI{>GT^2gQSQtx~5)&Iq01J0;}PxG{9CSIak$ zx1?2W`yZ3L4qD4Hh;s1w(I4z{icfM=Rod%7gnVF{VX(<+H5V5mV~r}D^jaJ?swF2j z@4J0|{V$0PCx|AI0=3}6n>Gkr6J{u+Sn6Kyv%4?zsN|E!#f~9t0nFK~ywWGy^uvXP zj;?5p?7~253?z@8HSEsY1PG%TuAK9jBaHatJJZw2liJR5f#lK3yn%=wWW&o^(X%!w z5vMVhM8r9f3tD=@Z7wk=+69BtGCfg#$AY!1yuIe>RaVH)A$fE2nVG)b-_6%qCf?L2 z8>KJVTT*qQZIitfirt6B6wDkKXeeMpBW--hIA}a%JE4CyJFHIP8vK|Q7J?Z3$7)?n z0>YtV!m5y;7m9c6Lk!o2)O@@l!wT3|E0EVX9VgXX76<7=-d9K2Q8bWI0{Y5zupGZL zL7;YOm=@VOlh{ED?|?I)SaDYf#_{!buo>WP8{cw)nbv2Y=~WIrB`#<%(^~Y_6FeFf z79lZkQh=bcw{h)&7LN^wuW}Q*${yJIX@`po>Poer^>g-Y)JvuMGhJ(&K>SgHjA;Tox09{M<01?z>tPiOpnI_8qsi zn`<*|X9LR%9Y77ky!^RCP~10 z4Q(WvXG20m_QnU99ALz*FiZ1Qz{3 z0aApO?>^m>jN|H)AnLnS8w_7>LAZ5a0-^Bx+eDpKuS$raQE(bB6KP;iNG;VB*qThp7pq9El zzB?U?blr-GL#q$5R8`euOXoCHZYqTCf?!kpW85KCvUsH2(6FLd5d`_lss7tWL_pId z{4vP)3>wlhP_+y3fv}O3w~8BizziMdlm!?1w%asZsTR9Y7P?3(p7l268 z9dg*)RQ9_9$rq>q7k`hj3 z$ZHdqeC8tg&ex`iRZp{kFQUqMdh5wyOMexjb;Sqi2Z^Q@6=RX<Yp@7{Sc#oxA?(A!4X=V|1AAMuUBUlY%U|C1`*nZ#7%uVIh}xYv9Lh z;1AZY1&a!H(II_-HpeaeU}25D7qkQj{IQ=0(BQR<*$vk93Xg|97S9==qhU~94=bUm zN94H);wh1DXOJw!|Ass|k}BWeu|5MGG{iJnk$S*pHv|ma^}tLUG-|8PIy30&etewj ztY7p2c;_EK4z`)do)6dXP^z}-PI~c)vx8eZ0&QY;J4#qQ;@(B4>6ry_v~4Bl2*xD4hGk}*f431xQiJBe^AI{_W71Ja7QI^`f3LCfor zZI{UA3W#WG@A)5e-=7e{!s_CS)=3mz7+FdCa5{`O*>|0`k6*Az}*L}cAm=EvBz5H&_9P~;-l2i0Kbcz_1Y(1i` z<8?f1mC0VLKG3}L%D9%ZkLWB)tZbs8=~x@<)V_XMZ4uI2Osav#W+UOrA?y@#%?AUJ z**-kgIYN<5AZ0~gaInX5C$eJmPn1g=Ethw4FXRyBS%DcqE>xOoRj;@3t8hfiU)Rf? z<3>r2*QBPq#etv9X2?1N@He+5nk{xu1OQ^%C>Tm-&li9^i@`Ol?pf2{*~>6+7IOox z6dLy6Gsn3~v6sWgsDm#UMh=I=%u6^>3pF6s3x*hRUVxd%WgRMo;t_WF&+8(HJG*;> z6l1Ji_s59lIqLOYy5|Zn(@Th~CR!oQXR{$tMp|MUc*l3QNjURZ&{)Dw@l&^H{zP4_ z^nvKtyc)uJ`+dvAG}m6)5f5bvlN#)}4n+3&G@^ukfhoO)%};?xLZ;P9T=x|5;7I2F zZ?!$?GJ{h%{Fza+G-Cxa?nKNpr*sOIQiLF%k$d#69`!e-KnL)L>`E|g`$DSjT%;i& zWK^J#+4|lC-3uKlas5|Q`IAn-6n8^Gw?#W1BM#W#YV5xZI|KdzwHSJ53fwTxK|niV zz#5Q}!%I6L7W)~2u%G6pE#_DTge2-&Mh7%XdKpsxF;C`>ZGWQ|eX5 z54!Kluo(oH98Td$l`#kEG~z+mZe`gVYmm-EyRqkgCOL}4jJ+s9-%$BRI~ui;lX>8s z^|mHynTPE{)3uz_?B&O0v%ot^8x)~cw@wR35Tq%nG+JcVk)SPc%cF7i8@T(=nw88q zx-b=)W$Jp3&2A|G@w)2v&x)J0{y!Mf15uEv1e1bXeVDFfp#>a|_44``%W?m30 zbJs4yscSI}mnvHZ|9(~+ORP|I&=9>^(O~2Ht(-oP%_ecRzNX$s=Up?HcUq=L;X_W9bD&BXxVD-D&P9F3%6op>}7+~q8p7@tm^ zu?~%{obg~!r_DmoYSO%!CndJ^q8A38jxIcQ>qKqbm^`A-h8~7F!W0+36G3D&yvV3wX=p8EMPm8X{54IgQ>bOJ2nI5Rox~pc zwRofPHBrfA?eSruSi|ZrcH$j*E*dYi@pn}zWSN*c5Q&XXA=1*Be#2Ytb{A>O2yr9& zx*gRpKOMf$O+VR1vOZEzjF|E$Nn|a8U1$4i}cl_2?5V>VlOEDs&rrcDv|X4gRcuz3x7u;3O@x z0hd8jMf@#(lA|+j3l-EyBVI-l42r4}S)|!1e_R4RP-j6j?(JE2()jK5wTGPKS_9lF zSHOL9KJ>_3SmmG6HM-!c45PZIf#gLux$X*s-?P-zPgsVYaq%PpQ1ubrx89e5_-SV8 zOVf=*8qVj1t>u}`^podKRfXM3GPmDnNvj-r2M~I`u)#3k4lBkd54gcX9Kis~i-*a1$Ua6(Dg60ZeL4JMsGsphC(W$H+p0+nEshH_ z+&1~`!yY|JJWF#uX9Ov~gYK(ihQRQJ=8%kh+d0Rvy-Jv3`>@LKOkHy@aYtSCcHg_+ zbD(~}uDgomRs>8{P)*D1A|h5O40u^xPmr!sW)sq?VW~ZuD-kDEExwN~h(%<}ZjyWcTuLjAzLf-M-cYdJ3zwu2knp+=TAI6fDYm#`XpCE^=2 zL+b7KXKAoUeZp|EaS7o9IFHKNJ6t=KfFKKege1 z^N?u%XWsu-ivNlGr)BW`# Lb_M=b`dhr002$}0N~#Tz{Jwo#m3TzmVu6$j)CrfX0(=eX7==g zswxulO3HLD9xkyyvhiD79Xo!0p=qxJ7X8~de4}7kz|H)hZQE}0t)nxX*?`hUk~F>w zWTjQLTE|4=bb<+{0XATn(*)T7=#Y(L(<96RY34sdev)~or7Co(zE*L7?)Rkli74+6 z-$a$s{97A5TvwO}46#~b?o{e@T>QRo+k@hx@p(K7guBe2 zbBFTu{$JmZ(fGyLo6)c6?DO03_WHU-i%mw`=2qKW%av>mzUrFVVd6_u`MCK!oWM}2 zt3REi$*Ypj)Y~p)3-j+tklEbH*q?9nAR&yAd8iXC*$e`ZzcfbM@TRxjc;YjcB`e(V zp+si*9@IemMXqYS2lfl7Sj3ju`?!r8EH;4rkzdc^t5m*G={y~dY_&F3R4a!uc16~g zFlMnH3y!#F+w4lATHMPQb~O>7Lb)W&FuJ^pbn)2Rg);*x)}k=}@x9(}calai=ZzYr z4VC}`=4vah!>TSlYTNGQyQJ2t8k1oMMIZ$#JrOrKnpC@$q?blxfKw73gv4&zbMt@n^kgGA!0(S-n1GZL@C9^K zI-ceid-mtT&!rURUQYa=`&cT^Oik4@HqN@#+WSS0MpPy3Z1v7*@A$k*S2Da?%5M*K zBDz-s9P@w8mDj593}>J+Sw4Dz{YRad33fFusk_18lIh1u?o`XbLD~dPsZ>&qD2ANy zqHefS(cDZ`Fr!qHEzx&s7U^2(;04CxZ=&q3X~3{2eTx}p+5=y|leeBQ`9QakT83BlWQI z(V873Y?IyvVC!}&z-atyWJWI}G`n+pT#LE1Yl>gFXt`)qU`*J_%G+Xc980^zmaAi2 zGMCD*IkJFDeV)p0b4)#lhxAb8vd>c0C`rp=sw15Vdk1Rz%zRl3)Fk1Ie8^3z`=?cF zrR2!)WrR#iVK2dkPWeC2+G|hB1kLes^LT%Lo}S(U`+U$I;9;-)V6A-2HfCL)7A#{` z^Cac_SAZe$X3(f;{Sn9U>cpQ23L-kHyeg{Bazx7V4LRF_fm#{okL%I`VjX?c1P^&t z^Q6g|GxZADSkYwkX9YI8)hhyY!4Ta^zzQjlngFGBUTEC-#%=hOr{5S@?3?0lY|vGb z9tcyPnkAzXO}VVGaCKjIjANk3lpKJ-K@Tyavd^}eLWMxtCk8-Y)ugZE;^oV9Ngu>q z?NZ9FGk&1VY+Mv+QPY}Y>6)#_#^%&?jk(7hUQzvUyAc6*1TqCnR1gl8A<|Y-nGoy* z@fn^C5E?P)f~myz*Pohz(11TGLz_Zvi#nINi1tZFe`o z4$`(NC4^zXxfCtI&*sk|Zdi`|R?@K`D=vYrE}2>g`*F#<(go)^)xr{IZpjZ@Z0^ctZ2-BCwmizsMoi1b-5KRo zH!*hugJbPoht)Hdg`J|DVf7wU52P|60f#kZIVep|!wD+N7EPb%+%H`QpSh#26Y>Up z%oz^x4g3v-z#-dVQYx0qJ<3mQih=NFT$1p1sCic@l_syqWM(PJb?2i z4DjqX8_S~YV%+4QflRibIIokb=MS+ngs8~l{!QD%ty6*>Jg|c4x6Ads1*OTR((0^i z3H~;oamDdrRXEhs@0zogAv0v*fo%%{2x+-9Rg)Y5i7=_#)pFD9DilvM%j|Tjv0BbM zCy^322#X;c%UeSJJ}t`6zh`juUCUcecR7&Jn$|Zz&!r}}0t8&%8PTrn(j+tx{rfYM z$~{?}UGqKQL=MP-5pJ1@fa~0xpc+I;HY96}j4_FwV#Qb(^x7=5nJlBpk-5hpoDtyS z=h^)FdGaXvD7+b6>Q-=F_v_sYW(5I5ZLWK#K)nm{2X&++`&E_a?FY)@J*jW~IiA`e zH^jNHU}sd`IM253mG)@2ng ziPY_!x}1^(3GGt(&jUpY-4m7GJC=?H2I&}M6W)WHwzRyQ0dr0cj>o+@f+llqHe6J$ zoI#dW1x|hmO-1+@ty|=>FF0}|fci_Rll3Mp(&lW+pCaq-6PA99Y9tt{VJ8h_nq~$8 z*uR-5+W8d6Yz*WSZVEQkG)fsOvUC92^8iw6gwSj~x71JcyKG?hDBbi+Yj|U-XMs3tLffRLVggX6gX$*rts}a`(v3x<1AnkQbNN~s1Rsn7 zRwT98)oz9OHmqvH50;~b)R!YxI+n`H#$-oxBIVwKyjRUrI`thIQgiC8n`w{dc0Jbt zU017_G22I^FA$j3CQ|2>JIj*&^OB;>g=DGfP_D9{G?$gR0h`0BkDQ)?7qu|HPuVpJ z|I)(!72C>H$&cLcc?ry5G3y_j7sud70Y5h)tt44wX6^{Nvpw(XePq6j7_Tl#GO+4@ z*zBu-K6z)3rgUNP$3&cS_#-(8@M3JO0QDp8 z4Ejv|m|VM$$6PB$&#+yFfBUI6Ygk#Zy!$+&2}aFln$)nl=A6P`gOUni2H*4Rx1Xzp zr4e^F=h<>6>74Syj9Vrf^$8XC!5IS>b27hYbS71ftHLd2;?OO`SqAL9SwS^v;A1GM z$~-`H}X>nfh?NtVMhff4gkcf4iP}?CzEvj-o^)-vYu|yI&#-!Du4ousYh`f zk8Rz;MLZJ-U?Wu%NGhRLtwOpIwEWBBYLxw^G7?8+weVZr^1= z7rM_a`;qm7*9QA~oS;&WLL_gTk# z`#ICBWPo$*J`hhTc7_&QcG_Up=_n&H?&(lcM6ItE4f+#;=s~rVDKgMRXwt!V{SY*{0X4; z8mt?aXBr*MPsAlLQl`2<#iuA!)O;K?f=+aOZY;R7OsQK#hK5I1(86-V-$HnSG4h;m zHhMzD-LfI59}-&YlknZ7G5Ha?K&1U|U(n_4zu>MocsxX4U(s!|Sot@&ihVgoQ&=`+ z%hh^Rbh2>`n$Z$g4$nA{R4?kPqhfyIXc%j<88r9^58Ar1R*%6ZNo>_)7!MZWIXr90 z4kPNu@`+000QB@*nkzF?$=+Z;st9$D)YtHhrFyo+p%|FcHjQI*L4=e3h`qtpc+VC) zBE!%FCxk%9y{($*5+T@{1}ZelmSqH=_Ufc_+{w&yS1Kpr7N1NNLeam@m|JJaJ5WEX<)<1n~xO*wJ zJ>HK*dnWTQtPX4Mtc)|T_vu*cp7mZ20{F_3v~ngIQRUyAujk#5g*!o$;ZhUUvCOC9 z#)If+akyZ_+7>rwnp>54#^nJw{X=^~9VgyHm04l6tC4ESZ>3cE{=r9%Th?m3smoTx zRSmig>J8tkezLNLa$kPdc73i5j#VO7%e!L-RkHgMb*LZoni@PGaBV8N%r`WktYb0m zE)v+juM*Tkc2J>f5q5@6iee`vSL!7?D)_LNHUNaej+J{hbEWK-N6uEIowI|-d`w$B zrX(r!yUbvx?V=m3T*en+X8uArX8PQZ5+*vYUfa z6PXUv6J658olvH#f@ez1hDq}6+3B(t&t5(L_x@zeM?{M_8V-C!>9oBL#PczE8on{V!${)#wmS&Pf7qx;~lx0|OqVNYwRnZ}D; ztr3D3q3${Z@F-lVV)c0++nV4&gM=B?^0GBn6BG~=GCEu^B1dd4;D*Y%g)&o&eMG3R zrJE*%l4v}(;7ZG7fxotFRujGH7AfLjIHACzut@TGKE2@gpeHM)MQcz==JI4sP{i77 zUG^s(mU~mV=!C?Is3HY;I_c8(DX7pOMGys2t+-z&*PJ1fe5ZVfKXmY-yC5%Mc@#D% z%_?zjhKjBTH_3E}pqr?1q$EX1oj143H~_t6(AFce1qIa2NYUMQk=^l&pa0Gw_yl`$ z8W9r#V;eerCa5xvc6fMXfOZZgqKd}gWBUcb!I%s>bYdfKD2QMDtX$k{^exx2TGl3Y zZ_h;hU6tt1La;6G1ELVYZZ&hPQAz|PO^ z@7FL96Ub6!4mHG{wFB>(+2>TdzyVk8lJre`L$*wlH-QaNXtO2vdW2t%5;t@-v=Z{m zZ4hQ@<=`Wy2whl1|Thz4;>o+sZmgR0~k=4CiCm}N~VhM7^NS=0QTe~qg16KO)kYv{98cCog! z_pJ{iP{m`yWzvER!|L98#u^l?u-?$fUu`J z0UQiOmQNJEC7qa1(2YU=!k!fVTSNQ)zN7~Z?22)naYJwz|Xb;3yVAkPzFdu6dHsw@|k7+jE zVb5(eg;^E<=;|ymI7O|#k5<_X0*#TRtv>|?z-NOMpFq@(pkmmZf#OdKMe|~5$PzM+ z1mw+6^*%IY#*gpu)!>(Q%&@CHH`I=zZRlVk1jrHr&)^y~en4KOokUk(bR@(x;V`vN zds0Z_w(h#xVX|mKWYIEbfw^k$l=@t>#ugSFYsLOFe_mO0oRGJlV)EupfRZ>P?QP9Z zf^)i*SXMMNsFH~seI6WMOKVkXs50jT!@W&U^wG2d!dM>&!n8qA1vt^6OqWmEzL+qur#=?;2Sdv-3yT_ zqLq9ObV+=MI#yKKjZT4ctDj zPKm*!pNzxm9`uc^7|`HP%;j z@plAy3cSz=4wWJ}k{&OT?+LKr5<_j#RB3b`ku(vWLeHF?;U0=K?of|QbOplyF?BGx zJ&JAFs<>z3M1`O~Kc8=BuLsx9G!3A!+Vq_l4rUn;KgWh!V+3%2-;K*1(Zk z3r2nD0OF+`g=zy+RxVL#CLvQ>#Xfso6^l+)erD5?;Cg?u%vjr@>q&tN?XAZD;|DCa zivVNp>J0FH@`%s4od2uoK}baJ^Fut?cofzL^U3Yf`z9jr>!f@Ksk;k2%x)Jdh zbvmGf$NS-}vqbYX@HbIENYPVo_)bHi(v%wx80%rsM)!{#eVcAS1c^@iM)*<4du@Ap zeUu(^82};Fl92?N^CtIi$OfRD>AyD1|#_aiUw?BAJ1DY{3eoQi?fcr*#bK;rQ9GYd_64-kW$rKGSbPw3e^jM3N+j{+8l*=sce_Da~D1%MK;%L3# z7cY9dDro4F6ean^=&R+oVFxKMZOQveOwc=@-x`NnkR&D)@Vx!%J2<~AoUkI(b# z=u;d%EJt|u4nWMs@9TR#IeZlU9^_ouV=Y8a-MaBRBc}_QhMQFTi_p=90*N(o$Y1h8dK*A#`tCsvn9((nAGDXtVQgL zAN|+!xUYFfXTmXsp;1d7)F>V&@d8@mKCwU@W$xVV=^f)oUB|5xhWom{oDUZ-Wi6a4 zXErX7@n`hE{YmTsWT0ayok9#}wVtN2h)sQk#Kt%0{aK$_&R$F4Ev#+t4Pj*3>Mm+l zmrP^28F^8!$zbQ7Xhd0pqM{H!lDShihb!<#KQ$cbPEaIxsk%*flGf&KZEjC$!O}&m z^Wu975>^dSlT6tljJsBLhCe{n`(H#NfXyR>bxwDtz!v;2Lit$n7&GWTOlHUo8cjpOuQ;6;U zPDAGw@G)Z#blvjYa@)!`$Vw zCP?M*0#MNOC125?=9GN9H|`OkvtL3w1a$lcx}M+MgI#8oAHe75;`8G~&51ai!jy85mMSDiJ!D7EpNx&iOH`|3K)-=dXt zmnX3wJbHM;jU}b1bB9)j9Yfijje5+}NXQfEvn-Nl%lT2Zxn?TRWa<8O5qi4M^fJ#- zeMg5ls$}++;i$&C9@pM?^&y(_jVRqdX9aimHF$TtjO36mfd@1EcoWdh00@qK=pLk- zAkQb2xY)KJ`DK!{7rS-7Iqdg}Ep2lK%Xl%xb^#!8p@#~VcZ!vt{qFma+`Q)K%I(XY zN0bO`qI77?v*2h^MABgR5y5H5un#-OAIfD5syn(Xw%CE|p~Ky2Xxy~91nF%DQ@#U+ zgSFiAM@Eq5F(nEa>wu6|mfaD_UX``{C`fP>QGFV@cSNb;nRg_zJlKBO%(y68)1D_- zJML)R1hd^{ByS3iCPG^mTkplXk^%R~S5|f{uCT`PzQtidF)!Y0$9!p0ya{&LL$O}P=?9KM27m9 z^^y?lLSRn0q8#kGrc}kFh6A>;Y2AowzgN}AV8(r}h!vL^jc09U*xh-W9(s zdlj{I(Y$f}P=KVLL`ZzW72&rFdmK4bm%MI(I_aJ!4;HiY{!_amJYH*tQ>pr^*Z)=D zGm+xj>o>e;*4aaco1CNU@9Yoho}OU7MX{^!Q}^9j+m| zJ($z7=+7RZ;DYgYIR1R2dzBUuEc3+*3xE|@lHZifRtD!va|nm0t@V25vz4K|9DW`y z|GMq$V**SovQVFj1oLy;z{qv#K3YUQF>z?m;fdB5rh!&yEP|eE9OGI|*tC!lVl6*? z(&uwqq;t9XAn*Dr4>~b=NqCM2A!h@_{*UMp{p>a)U%v+fEn8WV=IqZDH4M#>BNt!7 zrRmdxM9ESzhbKq-gKs(E{%!R!s?Ax-N_An7ToRh``t;!fA|Sdiu5TZYx^*6FAS4_v zsegDetozo&!O$eS%$kBa$=9IwXJKYh{@Se7NDDn0l)G}x-l}% z^Qi%@s=s#bUXUZ2*m_NeIv^&~F@_r!q|+X6_Axg*v~+L=>heBZ_x?ylt6|9n#LnWRPT{Yr%*u{MkP|>>^-*(%A4G?k zzc}ywL}a@{Z7m3VyhrH=YnjIY%<=1|I(9tWbKDyXw%r%|y;s@`s#pE%>_Tpc39;f1 z{kdwB8-kEOt@D0!b5G~j`Mq1bt)t`9t8Xo1%kEM61G(zX+y%G&^2nHa21dNMZ!EY5 z6ZrWWs`+--&D`;li?cM?=D^*g#Ox@yJ9*k%l-{v!uooV0J1r^eg{DyFVJyvOw@|5L zXYUKVD2yGsx^^tgbZ(YijOJXA0?GrRzsLsBS$}7c)l-G^?xtes+X||y`t3!T3YnV{ z7-vmOP6f7vkn{9){!k)m&cm!S8cTVwMHk5I`s9N>ghTe1`8kn?D4YNGm_T_HH9UyJ zoQcsTJ8V^$^G)I=Z9wXDey6exDL}1;XLbS_!D$ERd<@?LD{JKWyX!QWkhOAkWnTKy zY=JpC%a*q_h0l+|IV(=C&{G02^ebpOBhg_{T)hSRnv(C1aH*+;FS@hT#0X)RlU{!) z2(@pBLfkF}8iEGw^`*`WdQHBl_nPo`fN7?Hly^W8;J`q)h)Fkcd zaRMTGQbV&kf5zWKO>LA&z(y3Vm%yDGrW6{|zpMv9td?sjO1oe|Df(H+O!wFfQgiY6 zGOFiiwL0$Gr~HTjOfMwMY%x#$EDmC~OF@beq>=m{NQ=Po0;N11j3DAeK}X@1PgY(+ zupG&?-m}h77@lv-=H>EoczL`UaG=dc_!%$oWy+`+^3!LkH0EEvU)v?IQl*?-o^k?bI2WUmj{~90>TN4ymH)zIrg| zf7A)BQ*;LTv|PT)yoz~^H%|xU{B$63-M2}wnE3ul0npv7xX-nf&RivI4QaYtl<<=t zO`UumbSZQMMfy}mF1gxQS^%c(0yDeCC+=}x&T!ng z4!G>tzK=#bG&ra?(Qdf{$F64@9(i$tn8iY5Da{x?gr%+{#OL7iPN_bFb?N|7!(@gtFmy ze_Zn4Ljz`?!LEtH?n1ATpjNhpcHckZ`~Tqc|K9d~m*@YIe!Ta7eeM3f)cwBP{=VS< zzR2_c(woc~2FMQtb6STrheON!;w$`zsOM7Vc_|1806+-jzl(ZgB!xxgltuqX)T65` zZ@nK^`FO&EuxJiy;AzS!O$gLl)#*vIBYs>%u93yfo9ep6h*a5(N| zuM58-Y%SL0A9|?q+|R;@BPP-gykyIYCkxXrxZDfGNYr;NZ0fyiL<7dU1l ze12sJ@latq7yIGvUwNF|O^M)hF^YV?ZVdE*IXKSxBCu-~#hUY)`)rHDnpW|88jzkx zXT69Fy4}nEv#GJ z`hj3h;)(BYkJgF5#c}?P?;Q6*4OgmjL92`-0vVb#OLR;*r4f0m38Njz-xLd$qd>FD zogi)S4(Aua6HENlq|ikpNQH1ogv=8wcqG{(Df$BfJ#?%jOtvCKT$v^i#7@ z(?FA5V&{+akUnNqKC~z`C}l=DItd!j)Q^VQD`i+gVr+yfJh5^WDNhke17&e_V%K@F zhp-lCS-hoOQA4sXFL?}&~n0Fx(k|TkT{zwh23j1pVB7W9I z`QDkH(gf2k1>}#DC+-jMp9mjERhCZx0stKTLzv*d=+b0GRRl!@RRmL2WaAeZ5V}9r zr{D=@78(PbHmsnFlnkjGuUuJU%PTFv2sbTJ{df=US`_4tkcJ<3vOV(}zEhE?WHfjb zBR1Bd%pPjq!osK&xXR@0he10Mojr*!b}(RsL8V86cU~d|_w37)%P4v{ghNNun6H!{ z8mJ~~4J{N@QlW6fhvVMi6_M} z8`WSpCQjObooJuwtr(rlwK!Kq;qR{g9u}$;6ZD8hJ<1)^zcijRTU!O_6j^nvHyi^5j#Odx1jV0<%jTKd+^4TrWTZ_nWV38_zpZQFnf~Ydmmk zJoq*le$w;pQsUvN%ZAa3+tE)KjcDdZ)rAAlH@>9-CvMw*?;pRF$VtV^25!;0hc(zW z!^A&Nmh)b_bdxt+qG$U9;lta%N4VKJ7QoPmN*VG7`=1841{bQgD8~_0Czi^-= zDlD%g;=3f>WNm>0w)g%{dv)l{eilgJh>k==2IYu8r0eHvuKql}qU-(I*LPIey3@Sk zKKWTVF}T~4zxuxSiGL0CtQmlGq<`K7q-ogc{xip0ybpU3+Ch-9qVdZeut0u(}$kF+W>sPN)5HjNPo z&p{|b(zha{c;FhZMtNkGw6xoI8+Xp6&gnGxi;F{qhvgV{C%9|g(05Dy21?^4uWbj% zn&+(RZ%$oz=U6qXkz_FRvBqY=ke)uB06;n5nt?9nFEz%vn8pz4XRg7pG+ho|(*BMz zheau|ZlNPS$;bFGifyPR#HhtZbX53W({HS)31Rsba?yo(Al~IfnhKG_iRD}efzP%0H_0|uDNA4|L<4>q|s-LOck zv|O$r03q9t+hRKV@EX(lQU>}J5?l6#H?DI=M+Ps027Q4 z+gM>e+f`^tW1({z$-73`HRbHBydC-IveNqD+H%N3B+Y(oVkA3OFK?|pm;@w5CKb;&2} z*7>4?T)r@qci^pI;nNh7%G}{H1D1KFjvl<&+}xY6C+%zIfWIi&ti>bhCISKZj;aSB z-y}Bo(3GTyI;nS@7)X<1s?i+)n$c=C1Yf9UrK(s#Jj-amUXuu5@AE4m%#%&#FWuG* z3PQuOwduurbeNHhl(Zj?oAf)vMe-xV*UiJy9@Tw>0Z4n|Z$wZ*AL6v|=1}VNe@wk| zqqr-x68)eQDBY;?F)?SygS68-@@RDk0sQ2+S!(o$7cZmObs6f!-xA@A`FU48QdNk# zcyv!X8Ywy-)1w9ru{e$vj%JZQ+D)YQV4}kd^!F2JU}}X6h26 zqB79460+0tu+p?tGgGroN(@WPdrtDx(zH@En$dbdmJnm5Or=bIfe>%nL_Q z6SMU5&onEr6tq&)<1&p(6qHo5$54_otx6OXEDO_0feM(JpU60ma6$7oZ5vn*;VkvyNr)65R3ARz<#Jl!`*Lpc; zca*S3KRY`+4nf9_ETL;=gE$cQI4&Gsk%-klz)H>}I=)BilOcO+hP;lqKd9jwq~V`M zhOjYFVxc`1fa?%>=XS858KFDFpM{{e)o+#+Yk))$nC6!@eg%I;LJiR%Hkqpy1M%mW zNNZHFPaMpaS;J;C;)jB2-9ed<(pvgpV{c>xPAEfA zn2X{iLUr=}kSx6`n}g~VY)5|rJX}YrA)INv7p>YmEkaow6F<*qXPKexo4%4%1*SUP z_eG`9d0YXKz>dW=4b^gcB7Ua+2rSf*YP_eUk!!5v0ep#o`MPPuWuTA#H_(4VM|^Ak zHTcg9NdG+Yzo4VnH!?J~cCdGH`QLsajqjHOW`q&BeUDO{K>+E#2j?ZY2dBvP=nSh? z9)?@~;ic=Ij^Qaj#W)nNYf3D7`X|fh`iPqyY@y>2q?Mj7F1lxWFjye3_6-=ekg&^; zI$MZC8PKHqb;`|4OH=h-oYW{sIi$M*^Yru@3HnIuNz?JG_0`zWlm?pVp-Q#N$f5^P z(-607^`Y?S)gNF>iynZ!I1u!fs)IMwX1n_R?dmM7m$7@9dMHx+27Wruj-s^N!b0m< z)EmP(u^lMo|9M9@fAXDmFO_iEOg0@S1*Z6W} zZ0tHZz(6LK2&h^<@s`Ip2fBtcoYZHwBtiVBxrzM7_L9WR8A7r~wDPm<#bTf@E1Qig0V}IZ?ENoxXNVxv|()zR-I{|gYzVor{uz7(4{ z+>76ej2S}Agw5N|QKE*~fiUYz#lQ_TqlL@*no% zXX3uZrIqKy_TThq@;ARY!=joVw!?swWx^637mxe9ArBCrwU}ZvgmA#k>E zb+NShhru$BwLSKD;_fpw7YYm<`_s@0E}FaE8C=||SPY5vVEmOHNFY{{tX0uI3^V-X z)6UQ9A9H@Qu%s18hX}qklJd@us*W99-tv=s_W0>4t<&R|%=3-u!{0uAIXQW`>1Zqe zipOhL>m+n$=a-}N%y$Rd=}lp8-P9A`W=s2~jVyIl_1Y%3x(O7r?$(vB^XKSv{x1K_ zmVE8xRO`osX?Xmd?w{{bc>A61QGCO#aTBKZwG+`Dys0v3b&hVv>?$yw7jS_vGPCCk zuHTSdHcvzB58K>Tw`H~G{=d!5vR+OPi}L)4MtC#Lpj|7foVJiTmiv~r*;Rkk(a_r& z>lHwISIo>eVd`gL5}rn>JQV*RY(evGr5$+J5)`VU?5n^(o~OeVp4 zFWO|=CpS_*JF21vn1Vi%Yc3m&6e@u%o3J8zIV~>-n~;J19}M1)V|wWPepj1@KjZCp zdpuwFk6%x=d@8uTjri-XdRXf$uO>TcFU${%^-V>Qh02#-Tdj4?tT(@HGq2->mH+`R z!>e!tHda0XmRfqiQD7Yk(4wm;(4gP^82fXDkLTWX@edfnsnP6Iz-H+$P5g~L+s9)DFM*hiOZ#Rq}i8910>i3Qt4OijZ`;PULA zdUF$pqA$33<40J5XJ2YiakzM*Ir+Q;jq=3 zILN9{mI)P5KvH5PZBtoSe+u%D60v7zK0ZQ(dz%xoHfhob`u+@<^+tq>iV!1&e8qhe zGAZ~DZOPW+v8tC~d;tQ%EMXJnZ6$e{@Wfy~!mT$^%Ial7`?`3JqOs9N5F$k1(5$Dx zZ#F0gzbs!-WyB)s15Be|PU9Y&xMJUF z=nkeRlox-CFFVLXytE&l=kNObGMQ9jgC|2$DNoGeJV3d@ctUhSaE)D*F+~=e+Vv@3 z(exesvWd3XnvGK6kna(Wy?QS0I}zFgP<@Z2jQjM<2JEM=bF=~e8O31bOQaAB1YBMf zClRYJ;pr4EwZz35p=PX_8YaGoE%Nl<4hHrht(cDjG=&Qonq;^4_jm+6^cFz;ve$10 zP>?d7wx8kLmiSIFt~wJvk^2*cb1#%HqvnkSnG&u!0TpGrzQJaz=hW3O35PLi!WW$! z7#LU4Jd2HyGKA(?gCs`$qjp@h_%VsJ1-b#{MnhgG_lmQxkj=Yn{+hI{j85`>-;4F! zz-e&d&FKFS>-P}jL8{5t#$SMMq)bvd$bfvLmRxN@R?xS<6oA-=ptK7m&~h33?QJeC zF+td~i?;mWxQGW8MP`98UEn&myFg^%AfOv%H*MFdxT09UES`TzZX$_XpD12~{={9D zmChFi{G7ag){Lqkk3RTb`MtH_lq=Dg52VCET4?SJ%JA4hSEy*bNfN{i4P4GgsK*l7 z-eGAV2iHkNZ=dB1wRRG;!3nnJjMY0=G{y<}!lUM)X_lL+4bY@Jv=_t!w2;{mr~?uN z4b|VIhj|jw_bJ#3XMzr^p=J=_yEhk7JiLnC5WqkRc&b!m(9CHjU;{6xWF=`bmu!x3 z0>F@f5wN6UN*oQ05i>>=1l%8mB+LgL_}A4u(sZ(FOg#+$gkmhM8+|oA0k0a(6}0O0 z?JYto=MMLb?vF#Xw5>A-UQF!j?7vqh6I6kL!*32Un=bx7h%J1U!0@WWGdgPRuWrDOd9lB%eVXC2P?jdy zi?boRjOKsPK z}9Ay9L((zU}Zz%QR87^a0nq3;5-9qoMD)md)*#BgjRH`*sp5Sdg0Q(%rJF@z(U+f-uAVX%L2 zO$=fg(J1W-0hFUw$v8?li;e}KvFwQysFzxmTU;G#2EukMan9dif&>1ZO~W_z{wKo% zuz>Ehy56(3mE0_RU?A{e45jkgr&L!cv5mnUw&DoB5a4nHTLKfZut_2fwY@qU>im7lD)O>Ga0?|6p1#`@)YwxN zYv?HZcvIFoc19f&I*;P^4jh=};dq}@+wmM3&vV$&nFAO>ARva_)p~wV^<>L>6V8h# z*`TVSNNi-tqWZoL;5?swL3Td!;0vC|99|$i=b7^g?4Ikr*IOKvSUlZ`#V9XZuXA3~ zZBE|N*k8C(NzkPFy}gR-m(bXt>5~BLY2zeKE|X%WP$yC(rG2!YF-)73fi@Ng4VK6~ zuxF%8H-dLC)(-M>IjwcL(Lek+FsoBwQ9MsaZ=MA_;dpQ^w@RVx$#uP|b`#&WXJq=EmMLwCF|& zv?StzXc?DP9rGSN>IjiSGLd^kc5xy3Lo*3*9%k`K2P%ggi0&aV*|iiSLR|WW9mHkH zKpaH<;@m(sWvq8S>6l1J0iH-w8QiAtKhK>eM;@Zp#kFfq2{UY9es%_b!H*D(mwP;n zjHLb13A=L@g^v?)Hgh0gSuJ{%z$|7MArpYL)kR?cJ}>dG-@InNrz~@>ka5883Sb4v z3cB`~XKw_FIqhkicyvH-{;i{(O7mK!Jj&4x4wO;bG7AUWG~h^`#ahbS##5lvu4#yv z7uOX6gtZZIS>vJrT5Qd_bBfwp>&DAjIDx&~D%2h#G~lFwfl%WssGN|B`x|97+^sL5 zvSWcRmVEm_^oNyx^wE}i-8ajkQ$(i`I$7_5%#RetRR<_=^27X*AW=;}2*Vik&-f}^ zZGB1b0ZDtmpY8(sTwF0mDg(AuC+SvHJ#hIrsQ-*6zo3S~DXj<}01U8jNM~N|^eLuKPg9Jmof`=o>{5LUj@Z6vq@o zp73d~EUGFQqt?l!tSg%4%~Hz=;=Uo{?wu>XQtImNt%I-wkxIpVEzd=lmi;2#p5QS+ zVFW!dZ53JI*#v!Fad;hiG#{|WG~;V;IGG#nJ#*Wy`7GRKPP$=LqeVcdL{QG62c^D) zovrSghBgXGXwQgho&dG-d4b;XK{uGX!5$Ly1g>fV8nGEquc?G;&HflrnvK;vUwzWD z_$*8Lk^8yreyr9JK-c>*W5yAUlg&Zo*7#whJlxG*KtUvc$oq$~kh6g}?768CH0%$; z>sQ+lgF|3+Qfdy@{+Y=gu^X2GT{>0{lbB3YhriU#ImI<1;+laUK6V3nShb`{Um>#0 zRm@8y>UB!>La=7oiT)5DhyXYC-5>*l2mmeI+rR*f7=Q$L*0SOIn%hhf0ZLbnTPK$! z6(I@MNmBKJ=FYYM4_oKhoLSUn;n?Wdwr$(CZQIEcr(@f;laAT3ZQHh{zs%IUQ}Yk@ zsoHhw-gT{O-Q5Ri9p}%eK_x=cyV^2j*&Ot(7vV2K@N6aUqB_%o(|BEfN4SaC0-D2f zEjy(U%zK^+qumzn(C4+Pq%!M$m&^e#X$P2f?|t zg~yZf?Q|Vcr3k2Y2h(BlSx=I#(tHIna2)9;DjQA|1Y^zz3$LYLIT>m4!~gu^9e1K0 z%kZVIyjp&yfng9#tB8!h><>SZ;if$bz48u=*}|1pN`YNq3BX-Vv6)Z{sxan5yWvp7 zR6$VhlVU<6H~J$t0^HP|LA$ro1WooCkv>gd>5t>>ERzY!~DZO^fqvj+P;Q+n9 zVq>S`jn0uT)Jd?>=Iz+tFl;eYtWA zKFQzVKb)2F{qIq~p4;ENA~#t4AU405bDAWx&K@zaYeg^sBCP1Q0HR7XrxpKM1JpWq zrV_q9eGtl5Pj)xZLAOFBD)=PckoWk*bLI`X)9~o!cD8$4o&S^ukHMOE7=t!r^<4yQ2$>;}eQr zS>@a`O3JH^MF`)q*PO|~Q8}f3#b;q`WyWBHQCxN(^gv)c1Q4!Q@do9#(aEdN(KQJm z@>shyn3xUu&w~>xvbH2NZHmPe2~Q)!5Ue25k!f_N+0oW$T~xntQqvJU7zR)=vX1+xy}z*FhnCG^KYGcFBm?sK2`3R*9f3kW+n6DE|^cA zZ&lHuERMh}J}~x$WxT*Gt37C`YaR(K)Ug>u(1e^5?5sQv8$ot)!)n5(ChuXI!%)k}&XI9)>Kt%3YIMW3pwPVy z;j8ACduN3FTz*^o{V)sKT96z2nhUP>2KSjG3;pnmiu6 zJdY5_DeFKj1^-Mc>Fm~S24GvUQ+#N63_CN73EbR&#yi)Tn8VXn-i@w1267pWDgOdP zGw{mL`}dwOFIK~dv>NQI8TdP&ZuJ39Y!a5G`shBRBiimk;Du$jx5DFDIWM{eg2^P| zwR6)=WG6XQq@wkt1nm;k2&;59lo(1k6}7I6pjD$ny-gdevTSd2Epw}aSvrq1Q1rY@B*7(+Orj7Y@IRa~G8u6OwpfJalIm>+47xr6! zoVkDtdy_r|p4jzqK0~ow0I_k~;6^XoJeHlw@9NtT3BhjM`>IFf%$hm1jN4eE`t|Zq z$R{c?pf+0SC-bJ^h2*!8y#0;l)(<%F-*(W~_pAMnw7Ty{-1`h5lFuX+c>a@LHI~Qp zJB7JA@m(9$ZBAKC%3yE`H=CPxxrCK2-g1AV%vDLEY-%Er&yMTCr7_Q=(oKgYragUh zQ+a~mHu4PcfCKVgAAg9QU_vaIThWbK(A|c5tnWUzq6E6WCnkofIBvc_|AiVSb=sTj zzkRr&BCexqoC3=xbNGLgC<(%$E$ zxjw9ESn00y10OtY0;4!V7;>WFX>ejAzmkmkGNhbPxQtHGC+0SAd7chF2TMkifRjQs>S6SkS6p{Zd9N9-smhXcAxK`^r7Ha zdZaT<(_6?Ne9f$P;eS4H3;N! ze9vj;*wHF(cayXk#bthTO|J?6Sg7F-rxywyJVyR*W`SocVsq!drxepxEEQjSxu_(;s}8y~GhwrM`MO(Ib67W-W(z zvgE`(Ee%h*F8J4LI{j~lL*yiyh5(Dw&rRT%nk^QQGDRE`wcpSfj}(XaT6#C`l3U+xK`_z52sjN4CFq*>oa!ye>+sMP(}2l)+@+W(Q5-`F{*kTi5xVcY~k+!jz2 z@NxDKFFwU8D5(XYGq*$H@x?AWZO9{U4L}A( zaBScw^#lyDkyHuST4iByR(`;-WhySr3SPMUH4H^}?B6>k*r@I~cnmlFDLo0P1~Ug{ z#jT~Q%wV5e=vyu)bJcdo!_@I$mzEYicOA*)+9u~H()x18_!^s6!3_*>-{FGrd!g$c zmfDef2juC$b%o7msR&ycKEe~AID0G#o$Y88FAu7z!HOFELc3#&0}7u)@@0j#*>33{ zfSK^+1OkIFt@qJ}+uhYN8VBjs>;vMxa#}1>Q)9ly# zTX*7@;8~BzK-ya5`igb4ZrAL>|ANt&U^$nc?JKtgEKIJ`y$uho)#j#4^`Ox z?KZiLto~Ii`10n-;k_ascA?iNu_%K+3KYQ#aVV4~i2L?D3`h9l-I_(0+aa)DES-7o zjho49O}=1>p7ruU2$;oO%sHmORCfT8LzyRM@rju;*%$@F;?(85csJ?kwiO1ar*tb?bsfF# z+g8VWS`EYF){;P7*KNvj_Q~+^oLTS7RBYEKAtL^{Q90YH?#Ad9SQ+!)lU%EAMF5Ws zQ*0S0i(qpV)%u<-32hN*blRil&Z8hh%I`#!#a5bZ=Mwmd4*ERu=ZIfJ|eroQbGt0^v6yQ1kqs zMNVJ^mRpwfonj9N5@o?JR{me`64~QbLZ&G74jt4TsW&^Uu2GF(8D$e0R@7Y2wFD+A z!G^PoykB_TX%n&wu9Yj}!?o@cUyrBIg8f-S-84Xf@q*@k7gteTB_$9Jdm^zc+2OU^ zi(ZouA!WLCG~HdY^py zjccQr=8y;)-|?f68_4D#cMW3_TN;8}N1qcWErBR33`fBcoPyu`@hY{IDvoKrU z#u6eKJ+r(v58DB)*(JXha?7u`pZ^1)9ngVlp8r8;u742=g8!dCdbyZ5*qd8f(3_ZB zT&YdOW(of4n$d_(wlOZ=bQz~oMo3`i(n8114_w~2V&$`qrajqM;9dUrxLh?!jygKK zKF_4ac-2HcAfv@A_T;KSe5YAMZ5qdlGj$6>FjhbaMAR0T!(uI2Kk3UqIR59)Pde9C z-22I-{{2Ee8$pm^Sk2>FT$dyxE4$N0cZ9f@Glv&V^5y(8#?34T`YxyQx{^{C%clt| z?v+xqX?{NiR5&w*fDc`Xy}2sFSIC|*a03xk{q5uj^+MN{CZh+T1mq!m^isCTmn5u1zp%W5X5F`pCX)sUE~| zq#YzWIsBAM3B3c&=duI-U6(}#B953RjUtc**G9HE#NJ;N6Ga^u*vU}6Uq?RB%!uV- zEb$r`FcNz#(Vax&b~&FVgRJ1dDRAett?%J_xmx|w7gMo6lyMEbS3ppZGuG@+f72P_ zA*G>{2a~w(jl3*wuJN;smg?5cZV{B*F(8Y2cM_noL>qSx;?lVTp(7MbwejmBwi{N! z*|tx>yKuxEq1@^IW{LgF$VJ!vaU^;`S=gbi9YNFC+0HvE3a23oq1G4!ge$+a0Jn3s zn|dYYlVHk2H0c$&RQ~%dAjxOj^csSO0PD|8DPHO2+&9L5BI|Fji=v8uiN|Bh{|G+* zuhfRi|6CbIuPr`1pAGiJoiCbt<@M9H~*YTTH~J4Rvo-Nvsq z&D_JwwVgJ-m%|W;LEpZ9fy`pWV~AO9l~WIu!)SVKqgnRY2&qI0D0n!#$s^ncl3*B8 z$VsQ3F{7!w2(gSJ+`*rVj~nYiZCfl{mZO*$y- z+s0;&TIK;{?uexzpk(P!_JzZ~d^O#@D|n0$I=W10u7weQ+&$4FoQZFb`k}{$4IDq3 zr6^DbbZ*_<2G$IWyQCbXSMIU;4&S+tte+O;WrK}Pk`(4h67+_V1?za{;gINa1}#Mt z<*`)T{&xM6C*JXO*??~sOdThPlkh+bTYy4+k|lo&!C#|59eci_rVQN&-9D~#I^)(u z8vEdqC5@_(GK_i@mmWhDB>Gp;o6fi&tkJFNSRer|hH+jacL8g)a3@xFgaJ&UGHBGs zz9z(1y1W!I&Y1Q~PA-0~_qyQjg|V!yJK*dH;wYd9;JFu^)ipwhU^aYM@QNM4jJeT3 zY4)9(`X*C4|0F}*jJ|F?nd0B%hmfgMBj>S`ztE8$#07>a(EUK@0JB4+-msfK;|QpU z`$uL(4LBrM`ocigYG`>gca|4mqfIDJfXUi4!UdUF+^gY?+@aL z1)SUu(3jd4iekCXMDgDaPk7YgprY@Wo(^9JuL417Ig~kh7EKQiHW<JuPRV&JPB^i%s(+EyYP~A4U7BZ3BZ6-@2I?g&|PsBDdo!44k-O z54Q7<(c9%S`H(5OuEk1U_;b>jFn}Br;NTb`4swo5NEMzw?4Y_p=5Jo>$^`KI(!1V{ zZnyYtg=~Ol&05?3%4LW&VT&aOQ4~&kEmf{~W0k2GMxDQ9YAYn7KMi7wA^!-)yCkG? zQDW1zU??#|zEyY14X&Z_LmF{*!Z2{esdt5a%}NH4T+-G zqtFBZxTRJt*s*TDTyMV(ad-9Um<`}$$Lpsj@gqXWkNA+X(n^Rsa!k3(^L1A7o_sQb zu&v{Nv(@Z|GW7SQQ)UbuWgpz`i1LFv|M-0=^5O6zLs-+IAV5tq_^Qi_^amIq0!6za zWUfb;2Lhoww+$$&QL^w#al#Xc$ zU*8}ed9@xc2-?g4vmAY1plduAl3yQhqrT@GzF3jNarxFEOFfuDka`E*Jb z7-IYqJ7Uk4cbOF?CIh%EuLYh!!DwjLH)==&mJZ-XbgQ{KSj~Nm2(L(CPNa1fm%OUc zHXsVK-lAMn z?ZyF9k0F6(0rWc{pq2t=SC)cY^`9$&yfW_gv3`kw2=GOBszf61{iyore_0TeiYxib zrV6IZq)8=_7QGl!LA-=&*^iFj9d^E1o>g4%pSSUIn9C7?n(4a^UVYM%hMRpiQU?TP ze39OcZ}H7&Uc{WPzkZwN0#iUA6rYb}Et1_Ym(-kvO^u zUVZJZia(BDXz{2w`1p49`gCmIFs@E-|2)e&&qaA8M%uH2*-Ok=lhpHYjxm=nsL-e& zQQ}FH{5>)9M(VSm3N4KlCNt8ANFXVGuMBUP49W_BO!KgC+d4h$4@fXUo=0>D$!G95} zp&P{qLVzSUP_w~75tw;9z781xEAkL1kf$zi6sa`10OJ@KJPukj1*LqBED+PwTO80_ zyY9y|=w2`q#7V;G6UIa^cv{rCWmq%*uujqD$o*fRi9DJZ(U{agrnx0|x^|F5sg^2# z1*h5OT7O7;?b=59erR#OOgtWUFwS={ihi4M1U%UlN#*yDfF9?84?oA+ zZ}R#r0Zs+qWP&pgCsTJg(|5gYa6emyn1$AosB*v^tlMqRJ{2!l(zr#n6Ksvx@0xkFtKvlOjS}|$VGr;~e+}!jlDpHsONfNF42s7#8&Y}CB zbIu?$BN7l%)f|es=qZ7i8}KBSFk=xYX|g6_J--JIF(F&hZm-StwY7g!#0qBm5Wx#- z%gii{*Nhz9^2(TGWQ*)Xa%b%Q=0pyyV^_*}Ng4Rjd?G=I&VZb*8!5&r0wvRyg-o{w zQ;H^r&1L~Nj>J1A%&!xPSBXFg5=JQ$v=I)ZP8GCClTi9_pF z&_isGAz;aAEz+@y1jnX2;J8X8Vi57u4K_6CEIP*}O2UwYv-RNa_3*UV7p6qC#OOTA zt`p)U+YT$$&5Ah{^5Nbe4WnDV6|4{?&%^G~?|W%^hH-cXd_2v4C4}qzZ2d97l|+)h zp$WbW+?EOLN2Q!Au>a4s&QpL~q&Kq4S544h`x@$N=|!B_@>z};7TCXlK%$3{mOw(x zt=Y|Ia&X_fta>we-qIg?c!0zJa1q_=23>HwmIzfSyliXEm%y~Pd2jcQ7+a!yqV*nQ@NjUTM+L#(fL@57|T5Zb#arhb1W!Trt)PrvW)FIPZ~_W3w3hqn&# z5&QGzbh$=i%TkXqKcTz`gQv=bNjC=9g@>;TQB9HZFrDP)IKIqsG#qdN^jLxlo^@gs zW{inT0pui7LV(YEY_y4eAEDB7Np$B$MkR~=PW*pulmG-UW z#E)2FS5&n=MH*D*qb%^*ymMhOhB3J_S19m8O>4!BascFz12f9dJ#@hmDLhSmKyAqU zSczXL$1z2#LPWn!TV%+{y`I zqOHI{F-K85po;*KZ=V|N0Ac%xfySTeQ$hU@D;Y^LKD=D}m+X9&61XSoJd@@(F&D#z z_#WE(>1D-fKi7GNtoZz6U?4wjb>Eveym=zZen4Im{zG0QurP_4(3cG|JjtyU>M}nZ zrmKUgdl}1)GqawGg#=vMi#-{aHfqT1R#qVR=PH}e_r5{zoOkWdPYl2G>h)e(fi!#} zfhXwmE!h|@wb+nIMA2cSNjL21koI>sM@7+$IEgQH8+K&Ab8J=5F?Q_wFD(G8sfr_% zLn?0tqE=v`V_s&ot_ou<@_0aC^VD0lq?>G=&bv}6DDUW#5w=Br=p# z<|k9Z?OroF7>I6>6=h+DzD}rTadYax&F$28|7-HBO%zMfLDnGRbq}V7$D_b!{mXUQ zSMWhEdxwNNU&191f1$j7{MHoT!CQYB=u)3U`&zyz51YH$rQPNWq5?0=@8?x+mCDZP zaVt2Ub{}8L-9NldZ&f8eK-=eHt;U+uE=y>gZpEj~ANmkcZv*$OGXNCS; z;lY``&Lz_;_wNx3C6=}lEqyW@Qq6bmy6lucE)F?@y1c(L4;E3Raj)lg%-B0P2+2F~ za^D`?4}gKT=J&wF_h62(GgZeYf+(^|8)m(p1;yZ5BmjuI!Yd;jA;rQ>xM&nR+h9zD zjLd|}<)%q^R)$QANg<`z;$N^4S{QZBbVZ4%hRgRhrm^{e#e zWoYhk(iYL7!Zcg1L?+}o)tK%>Wt=A5!D~rkmYt#DTVzNz!dkFpS4OOKWUJRz3_8xe zphZWHONXYbrP2+SDg{@-;Zim78>*pUpSYA-Q-N7gXS@ygF^_YNWoQlz@{lf=c~14R z3HDc_6RBTHaga~8Q!j=98`<|!_}Hbua65KLCHyO>LPpi+ri!9O#~C+(%8ufCNN!FJ zV^u40cV$&4^1%tM)~mm%l(B{v`RWHoX#iU~XuTo8&n|vwX2Yxl@cqHJ)pZ37oTp0I zLObhhJt2K48HCQx;y{4anN66~)+zjzBOGDB&n4 z47b%ccI)!;)g@ellRCNIa7-}*Lakmz(;J0Y9-9!=4z6Dr8;!;()Mpb+@E6JH&A*hG zi>9h5YGSx7AZOabD!dDmD57TEf(#=l^Wo~ukRgyXPGS4wDr|?b>gF~q=!xAbKTu)L_og{Mza7L4|;si+aCO0)h-XjMv(THJ& ziYtycpJ=>b7K5;#XDG6t3YRStnxJSZ*OnU252Cu{4mP`xC|IwA^xN-%QVntP)erxZ8#`+u? z#pDO-s~Y{C^A(eWfiZ&*Tog(TK~5KpAfN~Rw56#-YYC*N4oOK8cRcUW_XObKr>Reu zHNB!2lzt5b=vCN@V9E05SprZ=(Q@hj9MA-Iew7$tYRVT-otU37OqL2_Y-Q_PoO zEhrlclUVUCtYN%!7Hyibopw;Bs|yR-Y;u|^^cWzDKzhsjK1|5JVOhk~?9=#?L|Qtc z>XndOU)c-?gopa%FkzQd)Ej#=iS)y|ks)~4JL3eGDg~TBO|+GLoL?paC*DOMhY|COSjNK{NXr3Ye; zJ+_(59PMImd$ruU9$tww;gRzyW2e9WZVHhGu`gdKS54;-Pfgu=3J~>vrKhV>+@FXC6&l|k)G?Kou0C>11`SFi_1ea%m$mq|8U%*_y7BO{(Y_oKHfZe zv_a#G>8((4LXc?VjPt{~SK8+n6EZkMkmTG9Z9sQ6snpWU5{oClC4lksV0tTA5uOM6 zH{JIjL5awh&VbcPy~s+vbi>c>2Wacu^!g8Fw)FnwMFn*gM%48s0L{@Ybev38V_$*1 zkBTgYnEco+Sz{b`JZiDuC5H%dnZk1F#qAAL0lXCPTVEUqFO(`?r%I=LwYFMN!-Hh2 zV3S%yS$3-@P1pfJQ#49)OXC#kIByvlqkDq#H&sM*DUu*HNkg@GG}v~Prf8FR2nn$m z=@p~LP9b~CECsaTdM9n>7-r<8iZp5ee5HPH=(ysCsWy{#SXtanH&s7rbg|;I_01fP zWINKZr@(=81@E1sdOAbag3F*X=X}ZR`>o|C-9Z|#(&OIm$gbAoIIz@Eb0dAxCT0W| zUAS%^C>KipSWwSfMurj`_V2rRAi6={ScgR%NwMIhuBgQORP(k*yzOV)M4Tty%uCb5 z2xl;~hH+fUAr7W#rpO+zZZiSse>FYKKjD#IqA)08#?45!F`^l^sU1Y)MH_P*{WK3R z%g2^9tFu~I8N>awCMizx@pIIq_JyXR46DZ9%g3mfaC{KU(hjFVD%~(^R~I#7=&#G+ zQvD{M&bR(H53Zx0OgQQJg|pCSzgo$uHOyBuaDcF83!Q2D#br?_k@sd}H89zjs5NiV z4YY+rwJ}4I%o5dp`ILLXPG`bI92p8RxK`$S*EnOaoM)phw>Tw;!t!`WsTwOA)TF2) zScX4g+6O!6hN?IC;z1O=D4lTtRCCZ*9l~Suxfz7AWXjij+kjpmx{0E!`_iqOK61on z?#z=03_oO^*x699xZqktM*q4HAE}uha)pcEf8Jn4hp5E4)wFm?2UHXmS=JR*6wzR* zR8x}on+zkqUoMm>9ACYZe!d3!af&IEU`wQTjz)-p0^~zsp8YSL(A>HBw@JvM@Wt_D zFT2Rbm8Og`xG0}5nkS|74e8Uwi-pPO(kdv!)(`Nkl~}90Kv`tVPUZ{TL?RA0U3*wS ziiCBxJHj2LCxuW!b=lTO1V7=rGSwo%k1wY@1HLTb?h_9E@yS8HNYrp=d=EpnnSzGt z1{ixZE3L8HA%qhWZzB87KN2s((DWE2{i-?(<__iXuO)WHxBCb&I`A95roe|5r2an3 zR<6?By0HdbrzNZ!P=Ek2!nBn|K{xUa9fH!jvoZsT*6BO2MdXXwBqp!EdcKGvPa?_% z8FiN#lUDtsn71&%dI@v-@Rq@gL5vfQ|0q;PRzfhuUe% zYT;=rROILfTR`)+9>7A8_F(SSoZtZ%1Jvd&)`p)$Gg6CSUEfP7l64* zIJM5`R?v`_9@%B5WtT|#pq%LLbD>Ivzc6>{NNd~m12$AFK+{7 zE{;a9x_26gO4^`IoGQ8Me*Fpq!>A`L)1NZNJyMpEgAQI2vK z7V(F_^!Lh=jsEfr;B%O_H&$@1yfw}`rkQ#sqg~B|UUw|mzzx76ii71)hjh|t<;~N~ zz>0GeUOS3!5Vm4idw2yUTLtn)v$H-Mo#E#(bkieHDl2jqwfiR1XT<^8Vnr@Btz*dKefGRpWY^1_T%)ryg%1#a4@*UQ;26%3ukt* zXo-JeZt}xp-H8l)Mlw`r4jLSU4OxKuo$mrF;Jja5jl0J%85;t0#P`%J=vNBfEUnkt zn2Yt$;*xJ!^LKnqkz(IVaK4^Go#wQ;p4Vyka|3KKTp2G2bwum zf+Fy`#sJ&an?&K))5D_bO?uTuDA0YZv0vWsjWTif7izGd#_O;VUxhbhCCqn3P8rwQ z$D_$AsiL++C_O#}eOpmFxQgk$9B-q5a|hO`c}et9uoQ_M+X7_`QTIA#0ldteOV@Yk z&2+_1rpgi*8%P;~Ag7_t0@$%Jf3!>WfKK2Fx)8vD*XP;#px;F0#An7_2_%vjX2d6X zyuU7qx^0&@hMy-^5G8EhxvYEM?O|lZ2d|;SoALV#)r;SD*;i|aK&y)MypB-8r+S@q zV(ijUGsZJ8A-n!NGD2SIG+M6eSi83ak+xX4+k~CE9>f_Rz2NQ-;;rAiA@BQBl?tS% zIWMpb*N6r(0&-h=>$iLSGkrRdW*|%a>fd)ad58;q}}8W*Ns? zs3m5odSqhEJu&8D*=l3W1Y&7oiK0sWSaP-d#;JWt)NzHJoiXTAO2=4zqa$kB=2q-c z`;?hLVVb;^wLtnA2I?G635GFNsA*>WQYJvSat~wo++&q(($EmGD6Bg*wfVLux|MF; z^ZKlE`&@?UM7oqtwR_?mR&FT_Gyq_}sz}$MUmu$8%m(sEG-{-oWh+#FC=E>|>qE^l z9)TeWcj9Uvth|2*pq$?ubLEyDsR?A3t`2x=^$#Kw$S1;`8=ZV-Vkl)yp1_d|P2W;t zu0DHV*0+Pl`k;*wrfyDTRefUH07Z8MbJCw zL!Kbx+&^)Wy*Q-49ubPQi2)4Y~k;8H-lJEoK6OC?IEI zW8>)k1DX81T%CgA_i%vX5DHJH`qzf$9{!9#-m-Wc-a z!s`$f=pg_9(xCN6I;CpTXK zJ-+~7J7@5YA7*G%6!t)8(Syk8P5;^)S3V-6er}Gi4CkdHJmfRjMJ_HgWj3BJeT?@vTe z3J2oPzRsNfm*5%4486&0vo}XTYFOyudx35lcyD8m0V!35n1Ik0mJSJe*ONQ zqmPA$&x;f5r~S>`_4YKQcReT^_jwQPyg%5C0l5kFa@03yfh>R8S#lp?a?x3CgPy2D z9>4$lUy%3oz;C{euvmw|{66bUij@O1CKOLGkgD#(>jnQ?t~mMmL+*CDNPhn;p05iD z3o7R)E7yb_AcBcfP|RvMmtL+yXzHnOW{V@cik{EC2wn0yp{3 z%EP~XAN|d}GEG+gD#RJUc_7r@%&Wg6Iq3qOat_f1Ljq+Tdr9hXl->T)5$|0}Yz0em z3Z$HcQ$JfDa;OzO5}zXwAP_tm5`e^V$+y`V7EIz&^hqRvq;uzk;&OD1pQx;ZW6pZr zcS!<xGp(I0P9)AUvSCHGW80dG14FD0ziv$s_%Sk@f3G%#&8E9>=wA(+AhMs ztr4ydv@>RYH}kvF@9&d!fzihp#5GRf_Ld$=T93g7ZN0TM0B?aAW0fCe2!|r_5EKy< zhA)f8i65A8*D34vIbn^(IfIU}H^7{8;1u~L>>id=fWFHGLwu+r+wI-ZZ3=-~P}kqV z4`9N&wKdJ_Yxu*KC;b_T@Htt@kw<;EMRqfl*)%gs8BU_6V$a3Phqp7%Ou=xV(KkTZ6685AHzB9{b_ABs5`Owzy* zh>=IoCrKU5!K;f}xl4QW_Oc_yNdn3Mma00hhy3ylKX0?0JSWua;`NRL!WYoj!aK22 zB2Al3kTGmpfX6)5!07GbD$Wfr#Ry$mbB^uA+U<5SOhudxR{4BAw9xa$43V#{gOwr9 zA-86GVV@50s=2s=xJVf=h3XrA$eVV33-7+Z`%Jmf>$N%zq-&OWv7fzx_s7R8$XOn@Tg8{iwR$?d&>iuKJ21{ zg(MB(l!Ixfk#Z2Sh>#O6b`omlDk!p89sv%uf`8-Iw9qE+3Hvk;x^bm+J5U2D(&6^c zqp-(`jN@NRGK8=V!f3dnLmBW7UR!<*LPKByub*>Gjl7y#{;U%dOqmK_fA8q|gVDcx zek0YsxuA0(KW*FHim8i!K-ybJw>YWeP>~4RN`n{(qBPw~U}{*wmHx zrusiRf@avZ?AK@8|I zNQbWMvU~j=AY1{17$n(sF3C0_506ElUvjH50fPi(lA2JIq+QA%3EE-(`_?T_Bzt6E zlAI#-ZJqP)37zrURd@4ec3{K8zxC0^lr1BHN*$P&fbVS=@7BYH9lEY}u_g2Q5pDh` z`-I6AgA&_pz2}S&M*v-lmz*liK4NGEM9U)(YX#zn;{GPY7?K{xyG`Wc=Jgj^bwzh_ z3r)nkr+(^|4WO{P!5;dE<>AgT;~x6M^4%mlEZKWDf&IGYIFy#wcWpE<{AX^dx$mn~ zmUoYuglwN z@ryiG>YVg2ONNf@6Q?1Pr3|oKJ;>ZW&THV(^OwmtxdlN)_V2G4+%qi8cuN?P4}`>1 zH-5RcgRfH;UITJg)3@TtlVAs{b6?lT`}F6b9N)GmWuvJ`J0dWdf%k(%9(O4j>Vcp> z-SXXOlukle9AXedAwvV*+XTIObcT9VMmqWUAvBYXZjFURo&@I7G4gb(yy{cMyDs83aUqOJ3qm zRascN-Z8_t9?y^K%hP>DBEuBZ;Ao}C+pj&Bt!A}kB-w9ma?1v$^R7yyKrJX@W}5pW z5b5QJ%S(2`!pP-_KHh3U(erHVh)Z6WI4EWyN-M&~CLD25G`3%BSha#77rq5h$?A{3tjdY2GCUC}4*kMq0U2uM ztDRJ|Olfj1?ZeJ)hsz5ugf`%;4&7-IGxksNJu8z;T@Zqqj=o#1x(f-I4gSo=`@-aH z5AK{3F9;oqOO%24xl+`m(jL8nC*CNpk;++SdGz-FO7{tUMAVmmf5vED$+(D5ZplAH<9d7cYmy95XA`Vh?otwFyn*WI za|X{vS9`hJ-xWRt&*%g-xp1XYA_3q(%^LtZ`@da~Ozu$|=P(Ksr=c;Vc+UB&0G>y= z*yT`WykOK)Z91h@=ltiuJZc*q7}i-(A*b9OI8{g)Rt+Hn3JtL|O{2Q&s@B&E#PuRW zitBM-*L~;2Qc~KvHPy0k3$h$M&->;wnn)dj4C7IexBF|iLeSzOefiiN`VQ*T!Uz)VL2&PGf zH`)C}&=dnWj1+TF4Q_5jJ=Fx*ig=#Fu(7WeHI-#M&@D*u$K&@G{opG8v-ieeAo^8_ zGBh!GYZYTw!lUHAIk}+ZJ(%?bGVA)#&=ny!AQXQAiTtK70&a4PHRmtd87ctn9OVqG zgfLL0jv;yH(aW&-Ht9%yz>QVjVk1Aj3_FTgE5Di$vI$gEelJ&IYimSdQ@;wl2?h8H z2wY5|=;MWi>fo1_l=e_}&W9I8hehg{gjQWydJ%0NemssdcV0&U8yDhxR7Ls$@kAkk z&`Q8(F;=*@-4adRhENOC-y0lVGIHR;abwn~uZ;#HJMo*H-ni|+#cciHS8CRJH4rrY zp}YlOtyv{j**mzf7nd4SPDM*&iZ^6T{2~u(N~AE*xSiYI2caP zU=MLpym`^&8hPVKZfkf94Dj;64uI)9!e0t65`Oo?0=!JDcjEUpTOmadR^oD2S z{fV~0#mqEr2oR{_zeK^o2nI<%``bGdHPhGEvF(Gs>k<5g89i;RI(su* zd$IDxGu0h?JxNZ3&B9q&WVJuEsoDabT0cM~fz5d7A{+m;8-u!1t55aX0@qL8}r}`ZeYn8%UKAlkXNv_2zZ^QAuct7~Uhb zO3u91S0S3!nXJ+UZoe2g`Swhg>5*;7sD(wr8R|Ci*4o$el)0#Hd3Ql6tfCycDF*SR z&_T57HUlTRp&JhDXS!Q^%C9VCFK)d>vAH04cW9ynb@UO07jm&^g4T!^QH%HExO;hT zT}6(S&HOS{Ifo{>i2NPCZ@nvq@%k^(Q*{0>@^CVmS zHhsoz&T?5FXn+OQNNvw>;|>lu zv|1iwX53El(oL)aYXXQIi7F$0G+}CnxYJ{u5()1h)%v}b2;W5#Q7WtOZe&jI8v=}DTtlq|(ofJQzA0kTNd;F^q9;9fSL=W?lp)GWyFTW_VU zOv9KPxvzi4D*yx#@HZk6Gsbn(;!=C>QN z2y2fJIscAR_Z&Glo@uGh1;eVC0xH(e z0hUposMS+?@uFUsUCejr?+H9qqDA(41Sd^>t}*(l?$L2f zS-~2sO%VJfUxKItV*scm^sR~)iJWXkNi`X0tC5U7VuGB3_zW9aX>H=jXcjWRy~}dz zQ%})XqOa6lQo|j(V$qM4c0g3&V;-`oHmxNv0=B5M=zY>(&1I(EcS{KBGgyUf z81vhE8G~4684p!wQSjTkzvY?{4>J~EKp{nEFSO~HgfLC2WK!>nSBX>IW8Mw@;n90j z*P^4RW6ji#!G2YTvh*D#1uuj$ATKl?PZbkgBW1TiZvf?w^IMsw<`!^s5q8Xx<; z5KKfq!SvO8A4%(D7c*E|>fMfm7P7x7y>VvJJNM+Dkk9Kg4DnH$8K%i@gI1W)d?ZHNMr2IB`yB5)xjs7GH7@WUlhvVVb z%XXlra{Q0(_kH8Vi^G@42N#Dgf}WI(pY0mJ>x1{Bch8P4&hG}n!eI3J@b&2U@Nb95 zcLTCh&pA5El~v5$Hcz{L!1FIWg2xgA{HNRN_3Y6ajl_D{`E}>vcfalqAO5;C+`<1k z(E|hY1M9#C?yGZx8h;)l2d~H%`R8KAD*DA!=IY0tOusiexd5 z(VK@4Ro4*5f!N-Wdz0AKN_Doyf<~As)flz!hsHKy&@SyIWnaH_W)HXO2m9g$)7;=+ zpusA3d1R@Yf)%4zi3!IZOmiuZzH)#NwHR;r0*B9%8kw>NPyEmsg=fLEKxNM>2Rv)*)w;jcwd=7cE1x|}b| zt8Q=27Q8dDmg#An4|k(qZvod=@IvW$Sp@*$ ztiEAKo|^*A&IL+N^K_C{pc_u&vQn25$X3swp9cWpy_f-Bo$upx$Ex{p{-x#_*YR!C zndkW@?NQ-5p_6MStqod^$cV8ffqe2vgRCLpeKdkJ2n`b;{W(uTl`lTg`8|+d#$IIw zU)_&>p( zzex(ceiFRIgg}*dFm=M_Y_3-p%v&1P4_;%!~b|O%p zwsmaC*rOE_C`~syR}nbR!HRHFo&la*$;~SVfvSxld`vA2U5zc^&V?Y1O~3hAsip!N z=M_`FQXBPUd6PUxW^Z&U)Ks;aHMKg!(>aNLhQvv{E$$;eVR=&D$p@l{d2Z@3m^S_Jhq^rU3lKa{FWrS{IV*ED&q-Jo&m zHY4k-*E#y-11tCZ_xu_e_yXTaZPGInI!Y^>&eBxt-jP~#?i`{;>;R6-P_gCHHlw;WP~~kl z``zcq9-wD`zxsaI1Od-%T>OcPuP{0VHBd!l22p83d-nI;uc9*az9CLwc%&#SL~SAh z>lAy~7qS3#ZumQrS1C7c$W@?P;wieS9!EEM@hL9yCDh?d4@Nvg5C!XFBoJ<)1E^-I z%8V-C7w9fCau%@k(H@?A0D~~GtXnqyYvN)?ksF;Qz#=H}P}3cI#p>`}ZPr;M;*R4V zAB&kC$X6fW40J;s2?9WJrCkp(GmmWOw@di`@t+oK%mZW3%ony6{=Ul{Tz&FpkuGUC zJ8M}0eK{@IvUO0m25b4UVz>Gd+^vfEre(KMloQ;qpz2!J1waDPdkgi^6nX$i!=S-V zhE;7FgWBKljUoDd^A2}sQP|dKZ9a@}e$XHTQ!Qj|J)=>#)yx(8dZWT-o`ujr?KSq3 z$1y+*GE;h>9Tx)iKz%KBrUkjMHIg@Nyrm9d?$(%cW3c zDLa^|=w4!9$=37B%MyLbZ~^prZ@{>Ju2#PeyJt{n^P?~JOWAOIPakDMBIaz;hQ=kV zrPr@PTgQuv#F##sCSB73?K)ntC6~t#=Hd6G$YnEh&S#Wt@eA%ps(YN)|-1b8V6L6=;g`l>=b#WbaXwPV&r6GvS` z8h;?vA^mb-sNOzsX4f7a3zRv{s>lyDodj59TmN)D-9?Knqr4YjJruyx@E|b+5LL?+ zZu!=*eL8@YBs;Vz#>vPKN47j%OfGE-3xwsJEV7ejK{}FHNAF;WO*we4IY{;1l^PdG z1kO1Wkbn+qvC1t~j>i>h(p}qrv+LLqW42h-`gwDMttLIieKaT9b_PQg3uAiYCpP$<~Hjhb{{W^!!Ce-@`YZN`+8-3u({Sp4+xG8LcrVp_Qd=^ zFz;fCT;W_+^G@Ig!(chR@7HYB5LMx6z&zg2hRJpDqb|&v(*^zWXUf3`M|p)O8?6$} z#k%$|Zu9sCPH#UnaBKwxMxnhgJ@hGbdq4Qf!t#Mv#>=1=I6wWltJ;_o_p-U?mY5lsUn5tZ}$> zyUBqi(F@>~N2l*Zyv=Osy_c52n$fZJaHl=>0WLSpP*^#5}1OqyNdZVyJdZ zRXWyMMy|R;vwbS;xfX1q0XIu-crei{U^|hmdEUIXiB40QEQ-Kck>D#QPjs&hJ4D)P z(^>WUBjL0X9+kU{kdKCG?7U0@7w~EDNT&6czY`a)23pIJwE>Rc_^b#D_%=qL1ECJ@ z8yeSN`sTVVn>9o{b0{lWS(sCbJVtP_QN<=bv0Tm__lG7@q>0(Djg`blf`(yyvlq}N zxHYBLV=1rKT;xyEivJw$a2H)0*;LHWn^*T8u$i` zHHKt}>*qTD(xuMs^bGCU+(Uz~pT9lxqz*O|1=xnyF0|>atw?ZKL(mBIA_#5$-W;C1 zSTRz7v2KT$lGlcXeUrbJHMimbqD}%kuFw$_zf^o#~atPCmlv!r6E-Cp0QYriYIe1p$;Axfyc0O+dnvZRCeXdkG#NA_&v?= zd!Qg27O*oY5BsN#sSP*s>PQgerf>;L* z;}x3(27IeLWlGBzLWq`SB8rsvrehiM*@GB3^riKPlKU`yHd;G&@+XfT>C!9?=!A)- zT?Ggra#EXYqCQnb>C`Sc3zekkxzm;a4{sm9!Zj7FMK7e5T}>O-%@IWkH8>x;KvDM9Q00-hH|*4vWk;eHW^IRBI8_j5 z##3#}Lz$wq=IW0AP%{Gn@Xvo!T_aV7Sy9XfN10K8mnpMFc68GGOoFUZcv8%MHqFsizXta{$J8nKu#26^`7ALUQ?!@V-PSD@kK-sYDdDLOMD zG8)mAKN`U|#9}n+>k;gyY$-5LNdXs1_Sddi35y3(*12ama!)knRK6GqJFJlKDZLYx ziRf$3o?j<66K&8&5sAaMlYa*vr!41QsmsD|r^L)DG4o1DeimKAx6kXeFOkW)oiZXH z>_rx*b_$W`V6;UMb?hQ~74F#t=JvcE$(k9veRs;t0%f#RvS;(&Krs?n_H1UWOa0qY z8Yzn;_x2+yL@IHdiqgRE3B8ZT4gJ5mhwo-NG?YLIPwB=ohOru8&DzY4Dt=W$0Y5>VJoe5Lv?uemCekuCM~od{C+C0QWo zS(1r_uU>qaB-B^QQ>XLt7BWBvILy6mj8B?H2j|a^j`W1oJ;PQw!rvADQ4#SoiDzzp zYTJ*b95jfy*N?iEA;-u}Xe_^;Z)EA#HXrrn;VyxjIkq5t4z%PN6|YnZFJp{-10x6j zF!VaS2tujS)9Thg9i!~H*)p+P10V%Oui=nG>e3rI>y$jmHmKmOMIs?Y`lFNo#YmrI zRg$}lZ?hCjA5xu$YmCMie4v3r8m${#v!5o@qI$@(m^AL*q)X>!vYB=09B=^s6lz7K z7~z1YWl9NqCrKAd^?6hS?u8}+C_I6Vu~Og$ zx7{0KI-k>K(!jf|j8W$1+Bov&Rb*qInqg@6bfWevqk2D*1kdY9$bmR0Yi_Q#Bv!9| z9kGld{ukLH*bgPN<8qQ}1$r`v4j8>zYtzM%wsKvsC7ww)p~dw_mh*4-DU;$;%U13Q zxIrTpp5|f^Ojw3%4#go!EQZO^bow7Y?In@goGm)~;F@?PB-}5_ZO>M+4|}q0y*WF4 zdGwwV!ReBG3MS|1=Up+(_Y5Hn|XnUMx&PC zRGS=WaGa1QmYkd1S1HtVR`Ld-Ae-}k^uZcD%%MrHowKB>#i9;u7(k4HF4|&GYSos5 zw4GjUoQrfq!Pc6*fuUo-dgW(#EH4`&Rv7NCRYPr-tyRYQ>;g(|8Y#|jzxOm`1}tZV za{A%`v}ePVLf4*=x(6iL_f5IJwY8<$)WhACE!nkacdTuXws8`={-oANrmdB1JjF<% zM)dLHHdEC{S53DfuHBoKXl&P4{rk9wN`e+#YsNJIeMskK%lojctM7fJgnxE}bZ>S0 z;gd&{PquS!=SlwS4z|iLLU|Vn>chw1wFKE{=XHzt7UZL8SN^uefkido6^_);CZ zMw?T?(Rg$`pxQE;7t^Mb-}c;K8pnQQL|oA1V&>rTuG=WQAM8hUxCRgz>!3=KuGbkw zsn;UfG+8@HvSIO^1Lv=~fw*=N+!@$|ModEzat*~Q9L+l)4z)uZBqnFPu_mO{dBGG0nzU+Mn(Yp ztFORVawIPz?#OCd3CNwUAna021GNyp9}Ks5cXpoEqXCp)%f}&lAw3k;FjxSk@*M>+ z<5O~b18cO;nk(Rx78Lj*aaCFPC<%qRLxU^=Iuh=cbhEXVWJHnH2!ki>$&vW#(N+Ec{Cu3u z(kwHQxbdLa1_0G2`kZ%mhyGOkni&e{R}Q#TfsV;Hdz?KtzEFR;&te`c60*gxzFDNu z&zOVGIf<9C=f4r2TcJ3#CrL7$CnbfMF44ZrA$70nJma+b#ItgJ^4?{{1!EvOv%+V9);3cGCfC z%%vr?#w-H&D=EM8K0v<99acmmYa~*XUZg#3+aUR>6JgAGMQZq9A0O~2KH&Qj=En4n zvhAQE7#CAcZO*&ooA?VS4eN+004;!YdN9o``=F6SiwH4Gn1DE?IwF02jc4YDJ!!pt zy2jvZH)b;T&yFmtf&FE_mY+jFg9!jTZhAi(I7SMadUmo#N6x6ueB4eX5Lsn+dH zB>46)P=etfj?VH*u&!9e+t~xf{bQS+iIv1(RrhBHt3CZ_7h(_9x(xJr_{1qQv&#&h z>oZy_s9@`|tK1?tZ_rp5cM2#sjMDJ$(4xN57yro$7)Q zp^Zn6je@m-R?vXgdygBa#Ne8zAawohJMuOXgP;~e*rEs=4CIwtHi}EOMN>@Hk<4QZ zu$ay%`311KE9)qtp1b|%K=}!y;H{{;%|pwWcyaQw4$g4@f?l8_h4{5fPx8rRxk!Nn zQjm4o>XzBk$iBzEu#-exev*4Dl#7*Y3y%~`=DEwly#28monz8J^5nfruBqBQrufyM z9weNa6Cks;z<^Zrfxy5h4gCDg!P&XP()iZk!>3OiOB6ZWM_ycECpz?_z|mA=o-6IG ztf&od7E&OdXt?{)mz3~>2bZ+jShc8zRJAyU`iMGGTiWj;Y)R*J_#PEpNZ}F?>Li?y zWQkWF;L=K|1=f=1bHe}8Q@67yt~-40(bI=}kG_BG7KBN4?nL1I5c%3S8tiMJ)~Y;9 zuJg~R5lolaG|nnsQ7SBeT9m0ti$Y6j32$8`#@IsidMi*LSkP*-Tb>y51$&;L#mP4M z;NfC@!lP+ewna3iAR(VOVj-0u;BgTAtKPT*8b$(Z7o6l03JXv2qdjJLNMuq8LG5Ur z_))<-!j?obs5-bY~l(gb)RR7s0s7?3MjeBLm**i zg6)W+_T#CS)uo=?Mw`SLooRiBF{EJqNR|p%xg1N});x-*Acz5#0}(Kw`#QcsIfxFt zhtX@$4FnEmwPDYw%IvAUtnoc#Xp7>jboiQ;7dDCX1r#qq zGFssnFc=(E#zNS_X0*#qDq<1pX>O2K2#@7fsnn>ObUv@!B|H@ThlA*>cCJK|pbCG@ z4zbSdt=dLuPMQ^5$I*4Ja&_So*yL4Z?yE8(ChgdkM-zU%vdMTl4h7rUWdHnfMq`RVb&+0pq(-mL5e z+BX9&c@EKD#qlzoSC}=xVlnm1tM@Ha|AuE8HX$i2OrhYERG+f^Mjp|UHxWXD#pPeg z?M+j3T@_i*zHJrevNcDx0;U;NJ=#i3XrI$U*OMgM<@wt;Z%)rH4qt>eO%O3Zr3;(G zn0&#u=czDa%DIQi)HlD4)QL7n(4jRAN#KpP96DPj`-OtwJCy?fqmq9y%uP`U(%Sr% z4kzeJfBTQjfc@SEZVP0=AU&ZSEA#`jncM;f{dA-_4 z0?qjrjIUV_2+Ca#vURM*a}8x$CSx&QQgHi1xgRwi#J$6WW}M7&0xS!r7dQo};GQat z>`zI<{}Np7e_*agfZwJwjCZQirEzsTXP(~x-~CLj*A2;M8}2JX{n zH;Kx2yf>UQ+*5hUNP-kyM$6I}GJW2hE0}omyuO3Zc6D6eymPZp24?y#Fq4XrLW$s& z+G_(11aB{1Za=*`dP$n4ZraLY=zfK>RP6^!)|Ie@4#|OP%vko2f zSqDoDK=RW05hKle1f3ctorhA@0R_6~4ttdJB6Qjg0;S|NqEnc0LW0Cif(ezk@G2RO zlf>+~#ry&=qom4{BYB5iDmtd|n=J3y{5H}m|5A>Tp&t@24c@B3AK!`}0?BL))@Ylx_I2OvA=h-h z@5x^+OVX&tGhmCqxSxarXrQ%8j;k>va4ENUU^Ms4VY)Ys?v?xZN{pa*FOp!-eaEw< zH_(^WShumZicPgrb)ZXW7gpAMNyw9^%@EixC#}f912g9=4vC~V(B2EU(3ujDpvEwD z&LZ~QxIiB=^|hO)4AmQM(E?D!ecHRHq37< z7P|7&0GW&fDESg2oskud4jO;hkA{QYhe(`a#!+k;R~c>+WqrBT0j8L7QnO-V$7-z%N0W9|w8T;nw420% zc1bx#W7vYl)Q!Q6wn}?OtTDIosY#AyBIfpFPob6C)to>(0`lLWOx>ip;wRN!n#h7N zr~)d;qnAgA$1l$PWumCK0WErMo<(~)Z4kj#NVdD5wd1nR0EOCb+?Zv!J}SpIPsgj{ zY&|V|99bT*e zJHsxHoP80n?gQCsOx(yP?T5tF<`Ybm8J| z=J&O_He9P~!(i9!g8?CphU1I&Q;SuGYTCox8?$(M$2YyXw&^?Cq&;{+OQg$VJF5we zyLogO?2Gs$)^Z+8Y(6{N#C$b(NiXxD^w770R%r;D0 z3M1=y{Ll>qRv>-zVu>E255{1~;J$Z78l=|WisWeDkA`kZQQr86o9~n^5pepP=m%BdezfZa#Nf0C!rQ`0xH-VlU5*Yo zV#qpOsfW&7MqJ-rK6f&0e-pJiTP~BDMP#e4G}88`#@&fo*o=r+;Ku3N1`q|-GV+H&)o|@rDsg52jt=)A4Bd>8^?=Z}4$d6j%j4{o37><3- z%Jk@TOWIT5SPR{RLDs24(`f>&UQe}V_@1(lRu43Kj6#nBtNI1O#i*B1cCNx5spShx zl`WRxb?MEo2y{G3VjedyxVaZ4?Msr3OGtkXfL)`b#_-h#TK$MFwm7_v()unJ=mUk< zd8i1Q(d*0QsN|^_rIjV~Cxh8Qwea-eBhd4Hr0jNgz7$WbuDlKJ9D%bhjg_fUg$&?V z_YFr?Js_+Mv_w%>%Hi4JtGA#OvR+_RCqqa}ebF|I8t5&(s=+$AtWmMNyyiEPr&7qnvk6xa-!&5t(G*ni0qWZ|o zoR;MCI&{#L&h{1ZeT_?)=X7rlVjM2#|GP9kio8{4UIV*bz_hHmU^DzBZ;ELoD{-dNXe1+Tq zhb95at4wapIiQ%)?Rq?Xl}tP0?Ay2v)xauoj_i|Bm5+b`&VUg~XIWk(BMie)x|kS< zl%LW?8S(u*DE2Y4<>N^d zcVk3`XJ-u*t}&Y03^3?o4p*AeA7M^=6nFDSY=z;k0SZsS7MO2ks{F3W>786Ec%#8n zYU!T}VjS7=qy-c^)Kdung{L~04v524*hx{IW6Tw%-fLHV=&u?j)@qkz_1CW|Bl5i$Xyg<3%!Dv9zqCA(F-}J+x0O_3+GuEy=F&B|M(t*N#XiWjb zE&WKh1vIKa>O~UBH+l-19}-G;NqG*71Szv;a zBjp-pu?)S3K=tFR9t5Z#ZN*!3$%53)NL_X?ikh%EqZ71pLzN~fyJzSEhm24Qks&=st5`5Q$C-+UJ zNrjnUGIUq0N6)y00X`p|IY4!3K(tYIoj{4|qhkeRKss1b<@F(KymnLiFU;Rnxb$0!y{$fp+a}nIqgMDVs^=rM|O1$QpM|1FXPfV zWOWjrjWFs--2wx-oX0clE9o`@=n5~+kCPfH3%)R|h{#HLEVv7(|f zsb~2#(J8J3j1f$A5>Kv_Tbz{5{UpaeCU(lhQeTSzbuF3JGv^tsye+N>T2*Oqic<0$ zy2m6f<(Q)a$L;pK^JsT(4Q-#V@p8IoGZIzB7~s&+^EkOwL9f`Eid94>d5QY8#cndX zlBVuV%_!>BtRYaXP7&0{I+nSbx5hx=E<`bChX>Fa zbCmxRJAbxUw)RBua&7Z)`*K=ddD2hgLT5xcGj2dgv{T)huW9Q3tV{mSl6ihZMh-G< z)L|M_V%S&$s?RBdDp|25z65UfhIMLFD>wv&FZ+{-tS{fIyr1NAp4GnQ=+(kHn?PDD z$MbZ8n%w^-N*yI4ESHO<=xiGpu*)VUt7TIe3?)T?&jb*V$$u{qYp6T6Yodl2Qw;2M zLN|+*K8;(>vQ+!UHL!y^Dgf!qr*95VMz0Sqev)hSs{44!0$QMzNlx=6_cE_T7N{Xo zUac_csv&3|{a)41#O~SDV-sz3GY4o^PoUW%nV}v;IU-Q`iShL1bDYj`U;{H!TwayP~1*G7t<3 zCkCP9RM7AQ59Y6UdmaT6K_vvT_|+=Pa~s_qYiJ&ymnuV*r6 z@+>hR!8J)svAR@x2g>-DLm3nYp(cVbcw_b)XwLA&_INbFb6_}Q6gz{m4v?EQyJd{O zQ-9r#G(%Xs8zB%KGtG%?>iWuCqZKQVVj|~DSHM{j3nzP?5~;exCp*ApT!YJI^fEal?VAIuO}`*_0Ht~ z>uV?fU;hJ>FH6ck+z4r$tIs#;qYYcLVz$2@jn3(tH-ZX7V=P5#wfi3AM-|6|^MG=z zO}r?iOV+ps6+}G-HcqVv3sgs9=Q&i-tlk@em0`M!^NrQ?=Fia*B*tcEd z5SIR~KqCwYFX#G%NNeuaZf>sifGE=3v$~qq7lYI=k|&<%T9l#5#$kmL1#?XX;SAW( zX~0w}Qn%4Vl)cvyx7zG#w#XK)@3U1;?xGptg@E8ZN7Mh2zSwxWtiS%@vXrWYV}RQ9 zXRr)U`TAeYGY0E04H!v}&}+u99v=W0>#%`!^pKh`M$i7f`=-dh+}5Z4wv&P{!5U5u zzwZv9zQZeAVz7R-jn%g?j;?TyJ|4P+`0L8mO=lMUDtq##0F%&ceqAq znNpR1|Cs@W#jePt%g;Ej2}#fXmFQ-9J8(vI^7c5oZ|0x7AMN%6=SB5t zl~dMHlrJ%u>T;padUZCwZQq!OQLrd%O-^2|(e`+EhnTg>Kw|@MxpZKlh?y;w{omW4 zTe9)Bk53KLO3>HyOnL3+bFF7{fpfW9+Dzq47eKiVarrZt>Fc=duhi8YBL^as#p5B{)2>afz#GT4rNo<}H zai&z4Dq4?f!k(Izc*i43L(}br$(|4C_we~9zPU-F8%#%lHtI2ki>opBmj%^^ZB0I# zrvDFxC}K|#@&t11bD_^>R3dd_w{EWTd7yLV4H0R_nk0%W^zBmwFH+8e3Da{#vth4~ z(8N$>Mvz0H8AQ_y&yRHHgK}%oqOYcH>8lCqqt#<6>ASW=$BbX5tnO@+$_qQdgv2Xc zpW_J&%Iinwut>$)#ktF8B9m5pFmLVN({cPT+mCayE1=a z_OD)Yrds`KT72#s@06=C8MLPbw9}QBHM6Ws%eR5dP#0>K$)X=ww{iXA^KcfHll-R7 zl2=1m8>6gw!Ck0zq6pJD+zb1;*->hV)ri-d6f`k=3mYf)jaF=dU+4I}Z|CrUF{ltL zqoTw{D{rsyR#_R9S20KF2kjxBe>OGqRdyG{2R(WRNwbH$;=>ltZ{piB+VRUu7bLNo_Zl0*_CM?d1{6Pj z$7&vBP_{{CFOJSaWai{)3)jUvx-FHh>%@L-n5dS@=7nqZF{TifAd(3_@fNPx$n&4t zx@X?8_Uk@7ZbQ(#X3cdQ@~Mzf-r%4wTlNE#tsC|Pj0FnI1EfK3BN*7bk@s3oYq2lh zJ5C&FFadbr6`Hw)W=0{@(&PfU5Uw*`0z?Jboc&>en1UXHcft1yS=y*7Tq0S%iwWn|n0Hb7s^-LUYs zKew`E;l#@LwYhSWrGSDXNsN@F80TfOk7gk^fEK1ULvL0*_s%cX&3?}HeT&Ua^JT?m z9|1!*M#<9Lr@h5hNI9skC9<h ze7c-89je&&1^qan!Fm%ey$VoK!GXBgRibM$svcgZp6+i&TY*FnRIPKb{Oi4v;%3|H zuEq%0T5}{=k0@qtbzB-Pc+`fe0mt*`nUy(GM}UCME(~|L2c3J<{=I3ZLE3UZMwitp z=zFByYePLO+}N0r&CKM!YfQ;>``*qj{}bUqd-|W|zTKk`_Jeso0gW8KbuGr;`>^-q zqtWt)->kL&J%~{Mvgd}9X!3p1PN&xdtc_AFa2PD6eO|YJ?DV~@WnD_bkTUJyMNVG7 z4X$SdD+0OIFeAAZq#{9EF$mfF%s$9deQMa3s-y^*mky>=&wk{bqNvB$96BY=ZgqA@ z*TmG-*^04AOymyZKF;yH2zv`yRg*#3&SQdE%jDB;=Yh|QI!P<1pdh(lj}wUh<69M@ zKoV?76oL42o>I08i;I^@MZV|1X%IA2#Pea0WWZ@3h-(i>x*=0uq0^@cO!g<7D>miD zlPev3T@3XC5w?ckc>WyN_7)SP%fbRp*1oYYE@n&0lUYZrVx#Ef3UeD-nAuhPtRv}4 zCw%KCAOe#u!33nxuTzVCtu^kB<|IQ5KV%%pKE?K86R2R=Y?2e_fSb5LXKnkWO+6go zmu_cSs>_u)Q}u|aSy_R)(-7VK1*ZC*kecw0;q~1Ez#7k{XbKW!eLU;#_URBB>1a>& zeJakWzIg>d?un;lJ49tFzfQ*a6c#(JAXM?i7H>}Fz)!ZL=E=Gw9u6C@zh74g9P9ag zLgW@LU2?lqgBi*RpOuNH$+oTtw$*rNSobZ4Y!hzlF_?v3-OINb2GGpeI$OIJukJ1; z7s3UNGL0f`f3doDKBU*iB~W*oONMXNuIgyZlzt_dvU?F{(}@c+H=~)-*W)5;(tC=N1AFc09-1S|3N-RtiVP2~dOsIdJAK8&JRl4ev!##-4J3x(+tc zz&6b0x@vv?BTrSgFG1?E9t(Zbn^u`u=S#A+}aJ2%Q{ z7QIWeDPB`m_I^;qYus7vP*%(Ox(V5<+$bMUis;E=ftHB`)mqop zi{OQCzV&TSEq-(iX*T`jn3U3pF4DIHnW&#m@c&h}#+z=68@%O6GJ9{8nwfCcxxR`` zlzL3G{cI0AEQM-6J`+=$rq=e-u~of>2-V->rBiz**-knxgiyTEz-Twc9@RygLOAH< zPYF;bRXm^TP}SAderEuRmDCNefJ3fi#XoVSQXL#nf|uOn#V6;aT5C5F_oj;Sn+#)r z(`k4*kqmXITs>T1C^B*oEuGZpQ&Tm$1cr#GuO-O&*ct1{8;V}inNL->Zpr<*8WH%4 zLD;x=9QKTSz~VVyC>Oujm@~;JKME7pS9nO69iedW=Bm)HFd>Pc4t8T7a5}~*DdyRy zS~pSrpzP1%V&ce_`lyUAlZN;?cwJgX31h#<8Uv@$mwSdCuAT{`XP9A0rq{Ro%5_ARwmXAu1IWVF5 zA7Cj=eziZ3ugB9kiua;;V2g8R@q&TdxiQZZynbC^DZRGzdaCcNWnpX_+A+%5^Z_q$ zC=3?^l5co;Ov}_7SIF4K@CuNv$64Tqf`CKerD-r*Rd{k`u=$3h07qm?Ar2S{GUZD5(rF;~cMdf4lOj5VaZ!ZFjNCE7dU zY?5@<#Fmxo=kM#$;zP=R+B`Yxs$AAiftD;(7#y~?#>FfVcis3?LMP6>230U%z*R3t zSaBr4T3Lp&=(gRV(B8~QOe5*IUf-+u(HbWs_4?7@ysH?8+2^##Gc-^&v5O$92#Ah8 zn+UTAG-D0)3TQME)I-$7Nd|b$mTr&y5zI-f4&54T-@voyk6b&GU6;YGJ8E}js)lAP zi|LO1ll*Ln{VBfW@G*Luxbc8$dYM>#=4-|@rw3fV@O)Zo0`(OR`U=1E-kw4B93IiJ1`8jt-*o zn*2YPAOp-WO)rQ_aY6S~)Ct=pE+xbp9tP0K4+_%(XoeaZM_oX(M?0|QCflZEJ;pV* zjijq%o7vDpA&Y!XO|qv_S-D2S35zu<79s{ybF8^dUV{fUfGw*&5(G+(%t7pT0Xz*V zaM|==gqitF2}3K8ZEMOhQDr$>sp7KCCn-^>&bujW-aMC`T%o5--+?!tf5NAHK-)JR z;M55gPDk9_Q_p3NBKtdXj$^as9=lp;v)CW7;wtWfhRbMibz7#Bc<$~iobX|4v=lXN!qt;liX6#u#M)!Ow0<67CGu9i_xud!`U^4nm*XDvN!%ysUw{Fb3+*DU- z2pX>oc=5FaC)1)s>VA%BnVk)YCrmCKYKG9f0Ckz(VZ{6x-<7;FlG$eKo<< z>}y4q~DBkvJWedp?IEFw?^h2wNM-PWqTif4aLbArA$z3?yH^=gl{n!c6hzN z8iES`q^oq-a&ZH5MB7j>dp6yC^9IuA=bwZlX^Dd@@Ly>fp`7C&c>RSk0c82$@bLZ7 z`9+hWZw+|p^m@gJ-$jTi^JOv7cV*n5GW?cf8md)jyI6#I9qRNc^4r*VQu%q12G#Vv8=HRvmR?27BL>erJMz7N3iiNUOlLi z>yFcDm8o(4KG#X+a#61V*ynVzHjj~Q+!>54pLR$p^4~Fbi?th6T=a86viT^nmv=nGQq&6bh-`&G~K;=+<=C*$XYZQUFDTm@i7} z>8btonoebm$J9W{t=__Gn%xcloT+J~>QxsD zLu`DRse~R9U4Xd`EctY*Z8PRh#tP(`JndY$UWtuZ8Mw@F(|V|zcCf|G)W5ndTs84^~g+%)H+T)KK5=B+B}*d&e7|GlRg) zd%lebEX@nACIZW^Lttqjuv`ZLe?j|GGAGgqT`R>8@;_~S(3|eEAI9VSC5L>w&v;~QQUG+{Q8At&ej%T zvgIBhhUT7z@7j@;Od;-1A4W5xHI5=1knS*wzTf9J45KSGZxK4~P!@K|9B*V{RJ9#U zkE(q=(->vCt@$-Jkafq`9-hvhWQoJcqilMup~bL-4y_jmFLvSFd_!BD+3AZq{jWIE z8)0x&G9x)NljAwIgLo1AbX?eVT&!Z-&?07?I-6jlspYyh0_oCL0S{ClfuWr1UE6-4 z@w6UMCxxKpOWvF*uhMP-R+CMM2isyL+%0QhF!A3Ce@Qd->M92#yxg?&<=%VcrDI3Z zOxkkY)qe7|dwi&HFx!ZVTAWcdoBy-=M*W*Bj8%40PaadBrc{Z6;X1_Z5v>^@zq-{9 zXV`Rt6B}(`h;8r=ll4b-{T%NB{Pz-={Ob1C0n52A1D2N+d39H1?QA;rY{*|3iv01% zpZpxBRRxUdDw*TaxN_JsJRd^gW%b4@xAHUeFP>w9J@U7;H!jL0h4{MDp}Dmh|4~!J{5o($A*|ro(2UAnEDbKQZ`KI#0+9#| zZ$6@U3N{-Oz(`mq^5yJGVpvycVJCworEi|+pR`2fdWNa#3sPvK&|u34l5g4Rvq4N@ zmt;GKZzJ!aF<_ZZ9B^|9zu^RQ#Uj|SAx@SR-s(Z2vaiB4R-AjaAmMqd^sZ~tEtztW zXHz=y6<|{ED>X7^jDho~a;i^xW$a9WakZ@C`|0G_nL!bxi9ghc^>B_?fJn zrpIUzRvqU>h1J4iDMb^R@b9ZTtAKQ?47^vSrSvO_^YryE1tqS|qMD zuGJyUHRf(ebKi2@#8F3S1zdO(V5)D}ha3kH%bry6@xb`e%M!WQ2~gJ z9tTf?MmaFReht&aas+EGG{AP;G^fk;byb1!C9MQRKjKVupD`&-A9Ko1l5srwWPsLT z_Zq{2xH$|$3-ch0^a+WI^*_>IA+w)4wv zz2GI|23}m?Zf|VppG0*`@iMwVB1dW|Jh#(DJNH5bT6ZuQ*nGKM z!T_j{Hae@UEXB;6X0|Rk8@sw|BBmrdUvF8H%4Q*Pp5>eUnxs`7L30IDIIGw3N`}xt z%qSwY!PZ6}XyjUMAl9M>3s|BJS!6=d)WfO+ZUN-}tpy^`O-8Ol;kaq1UuaU#Uq+k5 z;m*#Z-S5%M1mhbNlUuVj8}=`DJp$Xtinv2WF)vSI1f@TP27a!y-nX}M+9ZHjzx zr25>#g4Q(0QNv0Fs|h-Is&s^JT2C0m$QkRziarst0}$!%YdU8a{OHXs&}$a$4!&$` z1T6)?hmtSifudX~%Z8%3j?!|Z?2kt5oq82f)HkJWk><_uwdlG_9c2rs^F~h;MX-}2 z)hpn}c!7?hBT7Gw8@p<)Sd&CoS5-_SGgp?&ijBy08^-hijXRTLHoUQ+-2|nb4f!sM zdO*+qUr)XJX<{#9Z*6d4bS`jt z?S1Qd+%}fre?0}J)ShBFCEBvPbJ2EX+L7gsrW4C!$w_t;b%i2X5+fE_;l*;bC*QZP zv9GsJvgZPT00>rxE#lh$J%ijLp zzBn#d>ngjsZA5T95l+%MYI;@(a+f`gl6Alaaz=ABAQY(x2brwZf?s$ zoR^E{KB`jjqHK#KYBKl@KBSe1V7#KKvg@`f;oD7>rpvTw5Y~B`if>MjPhOs%gw4A~ zL`5Qw&t6`qB@J8wax9~WSk z$V=9&K_+-1Rna|YhE>}DpY`Vsa@M3(Q@FOOEp?BwcC*c86O$XDZuI5_xH*bT;0F*e(T z089hE$;;~~?=UjgNrz@u6Q1@G=`^|dt2wtS4dZgT0wouW{~Cl3Cx60!em9ou1^<>& z6W>Bp-7TbFc>X3b^z)HgdGsy3smgX098SfP-qJ*Lrvjnu?WI8YEvi2&cTxKAwXf~r zM<1LEXmWb?eHE=%T5S5d-lyDq%6wRP!#W8q1s-hC;97{JO5U*4>CaTtJ=JfiTopIIWn5u9GGobz~bFj7bZ`GFun2%JO^6!JRr%S<}5;fbVXfn)}(wuaL#b+~J zT^xeqg*GUy9@Xri1&vHgXX$SPkXNBQdK~pL%kd71JS0t?!Ga_-H){56THVyl)QXk- zOzHT}FQxwIWy+qUfaa)QNMgk?KnA@ZM@`D4^?9!Y8Ys>|40{lQ@1nfrkA@*Yoxa!k zH}j;Z5rH{t&7@$R$2cvcck_FYxHzhkdUj}=lW(yDC^r$sF{}Xm1aZUb7suk$!zX`$ zr453Op~9!(@585^zDBt?di02>7-ng+2+Qi`5whV?wTQ9nzU+CxJ&hraNi?WVFRx4m zUzCkV3fsg;W&WZwo!q^m{z(y%0t&{V;hW{@qFI)xQ>t_sWfbYmxDSK@Q~Bxe=&A## zi3AN*cd%S-0iYj_Ei=?L{nDndjrhJet!waE_76Y%;`7HxB6?e932>~)U@D@7Ri9RG zAzl;LYd~|+)=2+l>DbbJh~uI{fGN}C3bZB*lp>7Ogm@t91$z_^)?i!8dx#vf28G}nycP#Ql}2@00Q6MEw$@8jKn7}?y3T*o){j(K3JU;aBWwxgqAQP z5ko8{?jMyMP*<)7xFp33d6!jOq$~ ztO^(a8d2oYb()J3T2?GP*av0$0EL<#hbDQHyyMhC*j+LH{x&V}cXRSDzS*F3k-rLlALTzV}&k z8;su-2M6Hsg5lFV>pylUw3UTVL#M}YVxt4=9{7?D@exRzF0a!h0SGt+kN{xdvjfRf z7uFl~V1dmt7`Q5EIY)W+Hvo~8sQzd%4U-#O^t6tnRT?M~PfXI+sY|~z6s`LVy-E}d z&H6&KTzbt@k%l*+xWB)D_#vZ%f3eCV2+gbUj}I|)L3scrY^}p6Nr;H7;Zb)g!GeH3 zyD31C3QNm$4pzzP6PK5^4@Wy7h@DI%pp_lr0KU)0sItaChT{<3?EoQ7_@{p#qdf{w z|NQdo^~v$G^OIi00*#H>2e~#e4884d1gJ4PQ*T@L@6sw;ta0@>;vqJCC<2&ml433+ zK?(pcbe?!%`00AB`-5>fFXOwk32)K{^lXIyg2_ZP8p-}p4g3%+5H6@EpC5isIYPC% zy2-UUN(b;`QRb*olPS2t;1|6@Cc=WL;{>;&OZxAtn&aLbnH4Drw-pl z0hSB(?dFmwg7>@HnT#ako`E-&cr zBn%eVf(#8c~m_tJ8;Vu+JlGK!kP=cZ45TEgGSQgM^Co@D6Xr&0q(26 z?NR^{WT0A2z^^~_t@fUCJJO5#fo~;_k}|D}v2>2qiUnK!pzb$*Ac8JzL!-y`V;QXi z^nj;&5|hcK=NXyE1JVB;*gvSY;H)r!2y3JNFoX>(Az)8cf**@PKqoh-wLIwA3kt&Z zGzYzUpOT$vi)4hh(+=LPO_*~EfUs}90%rrQAtp$`9Z3D5`U^$kkG%QndR^D}XS zsUKKpvFbo;nbgU$&6^C6;zeDPsgTi_GSpt6lm?iC7u3w>0lVZ6AKu+Z)lKd0X~4s9 zK2Ne3nuhHv0a6FDWsh8(ZB+E)NaRBZvyaV;7?YvOJ;|psF@U%e=pbH#W3U7VWmeYV zi}~4K#D56*^aFgFQo3)38C{#Mf6m?l-6E0}a6Y*Il>CrLyn1%=wf01%i-r0QVL5>n zCS1WOs@2Bn4Z%fV=v2^FDgc|JC?XQ5GEChMo<;`?v%H4C@)JV&3FjFBdufE;{6g^) zB4xK?@3w}o8W!k|61Sw@W>r~`ofsirqX}UagRurtLHbu2gb)RL3P2rD*vQW`sti1F zL<3J#p!UTvnmKkLBS{UMml`7?&q@XehC1H^iM&^^I0cEJBA}`B346fUi zd;}z{A{0C;BM@O6vp}Y^btkzuh!uh(lVO%6&f6rFgu=E}n#00;n@VXjfW|Fw6QW&% zD-_CwkLtL}R-Hs<3q4_I%Yn%J@dwxQ&w={xXUF=ix|z|d)dWgm4vivtt6 z&+=SE7>9!Yij%2tX~!+A;x=p84)buM6#_xsp-aiMz_7a(d3Kj-NkjUiz#wSaOPfUvOF-Q& z7TG(QGXUnqE#|y|+;u5_#?XXpLrE$GY{^09kk%$f7wV=d#=12KsvXh}uB8HIg%4+1 z1>!H5iVkQsIsC-csk&gi2IKW9kH3adk_574-_{^XKv*J0#*3o%M@Qt_cgRsZ0U)QU zyWfuWl(pPR@@s4LCpBbYMva!r-rE=do~>RG*0roVLwN$XExO@c_ml85&I}=?==-O8 zTweCKY{m0sS5yH4N8u}=w){$EU$;>mHBA*5ze6lFpJP(Cn$O3RVRuzQomoJ4s2u2H zck-@r5R|{{84*MGYhX7r$n5d#vFvOYuO8d!9}U&cASFErrr#gJC%sg`MKXp{TPkaE zbGzzR8%F4)Z^y6JuhwHyxLrl4S01>fr^PKnF zbPncN!P0V}pko%rppc}1QML)sr@FtLyQsNllTDxcCLi$@hD!>sYlTFPDH4x`uqPHVhbzm@g&wB+R z|5Y00oDwi;d0Ic+QTxOVceOoTyBR3< z5*0b`7LGfaRw5W6a!xkeu0>W2z{;;7mhh_x)yPf)d!gte#m$gZk+VUSX*ap;$y}^u zSG!;oi!u60cdVBrf9^p&5)TI5NBl!PI}(BGLfZlJiAhLaupdIm9Z9eQF?V1|DDnHR zN=PRiUf!ie_BZXgCTRmh&K2e#Y)WwIvDWQhoqaohbMfMHPGhwz(_B@`or5P?IHHFaXn+f5r-yIiB(*W@nbD@4lCtjo5FQ_k-Taf)L6OPf`=KEZl{f8C-Nidzkgb5{+V z@g72rf_ERSF)qaKN&o?6+7*hLvNAIAr!qu9pGX4*be7S(Y}qa;{dJ$k(p@k%IP?T@ zCK_B2)!LVy$SsmQs~fH!S_^~@{tK4j(4iwzcNnMKQlUtcz%*>^n5MNo=0f=(TnmL6 zOMoxWvt7e8JZM(v_8K1R0vuUxMPm_FAy(>U@45Mgm&jVebNxHSz47;_bc!AEd{GA`JvQ)D%%Z3{HOdWk2U zNVqb4>Hv-QCOaJ2FFB~Q8>+8U+k7USF>}=6l^OJ*Ob)YLZX6-4rK{6TQN#4DAZ-%V zpE4Yzl3C`!gkU&1pNF=o^t#PMz^vps5Mxf1fCn#h?KJ`ITso_Vn&8ZG<>V8>bY52T zx+zzIqlbDk#6P)O)C`?KUe4?spq)0jE_*Sf0pof+wqy52RwQ$lpTN;wgZS)==Th6$ z0<0!F^Cy`s;Y?|1vM6@+0qvAWj9UNL!M?5?<2gjMZoKP5DE;({l!q-|*o(p1wzf@NZco#F1Klfb=q}sbJbi zj()K~w&)~L?l|`Mi|oP1?|-FK>-&GIejSHgF&Dt2sfN@~pRzVEbOCm7c2(5=#jJCF zLKGO#@qs}=Z}wRB9h5|C!4QeN#nkhcBrq)3*e;&r+96ZPl?xPHFGIhfHUpfLyD-=3 zZS*z+dkTzPW^rxhb1-uU%Diz(XC)y_Ms8!`s4eb_^1fR&TvFb%J$eS--H;9Nw1^yu z_rH#mnCO^cqnqw0BL3|nN7(6>4mFc z%1!S^uK#U)L4m~@CXH`{`@3wr>0hV}8-PbD_SNPbj|hWp|Lmh+UwTda};l>S-#@!(7G z&(U)AKSbKZp%cjC*(()VbN0y>yBmS}P3AQBU6^q61aC|To=(N@rP#FvHwO}Rhw~u9 zRlo0bi?oNAZsXwY%L?B{S@CVO`iKNX57xK5ISkNNdJS3@jyht6rEzgVmBuX);w>8I z6`kCj+dpwGaDc>eb-8^|=j4<_osGjVbo2k?v8_GOAEJPekC)t~lm`ZEba30{o)|1C zyQo9n0*5hVZ#-8aP{dnNo_MZ?2{6&Czj^C*R@J;}i$dmMY5%;}ipu=>B(!f!PW@5U zu*ec_Go`EzZTkd+o7LEbPI7c;Y~7~TH1n%}0~GDW!w~-Ay}nWhre+0eQIKcm?F4EE ztK>F8G!TQx7SFW|Bd0?gDk1cEV#g8IVgPn5Q*@pac~l1zLB);NX&m9>5`B%b0napA zfpxFjwC;hE%!N>KStf0cH^I!1eY6{IQGoX2Rikkq_YP80##_Kpi;XZi_qh=WH`xd! zD!{JrLCGz^td`>`xP>17jyWU2+pN*Xp|=vv9dM;016#its|wb)c&6J4x+kITDvYr# zpcVmW46f2yGJtvl>INofmKb8e7uZ|8yhUKlg%uTCV?aBCZ?p8?NLOG+j_wx9X`fcX zr3?*N>x#2FoOueddDL(g3cSWud!1)7Wp-jC>!OQI0b3q85qw;hP9nh&^+P<2$5{vh z+Lh+=^lD538(4CTQp=K9g5yJ4o*)8cny;Y&RzpXuaAYE<3xZDzzDg-VOMYKvO4Da(hiYwi6avPnm(u|eOoSnN!RS+lOA<|z)HXap&Njp z&6OnKqAod&z7ij_75Y9Cf^rFCTv^ZeaWP0mJ(ku^HXd{3u=FI6==~sty%aS~KMHiE zfCnd8Sk%!H31H(^w=1q1Xs<~%(fPm#bHfWvS{a>f;$lIlChAm8!7cH3aAD$fMjwBp z$WZln83<9{#u}iUDrFk-VbM50)C`U>UaiLAD1vWUBJ+dn{6vT z!UlsQyU=7cLA^)lQq$mFYRf;@iz7(|O? zWUYUbXeD6BgK{Fs4roQpba-%;%k~Bs3ohC5IDPFX7-`>d+ zroIwLDF&>RXWY((2u{xy3+lCt(5*j)FWEe7*BtXchEJT+qI_9qcwNex9@)u$MAe}X zFa&4gU4^gHW%)KWw_+nw^GgtetTK273rD=RkV79yElj!r0$eDEotrkXtTm}n^rq%_ zr`F37SygYKRyghx#}pf{B9%mX2rV93Br)lhL1aS0)Th%zc9j+4YSJH1tH8kZ|Gj+0 z;L>{YBjaOyqUJkA*Y~ZARA?n*em(+QGT>B`vL@KQA|OtA;jLcgVb3^b`IzXqR($fS zJ7+TvSL<%)(rXgvl+-7(*$(O0 zvkC&^G*? zG1=P}U#Vhb@Kua~gNaOhP;61P6hsSMtgo{oE~^#hTkup7cm}lR9#Jb9!iNKL+}v_y43kQyD=BBJzimwy6R4zJ zF4yzj01jX?kFJq{syC>l`nxQ>pYlZ|^7ARyDdWejXc;%nG4)N3pi5=uo1S+eKQk#^ z;#Ec!9z4axMaLhoekb-6F)H0;e|!-Gd0P&Ne%ImE9bi36=70GQ2f~a_>NSv%4<&iuiez-n4mC zb;%Jto4ePW99`m+>)1P5nb{PJJb6~!)tpXC%Jw>^8ZNw?gpz9xU^?MQ!}ppB-f1M_ zp!UnCyuwNW=&P80Y`7>xOtW0nXJoKuTQ?4ikBxpTujAZPX6arxH&`CorOuZ zWXhzZN(p1qheDiZH${ZkoFjq`cO6aJ=QJN}1J>bfqq9 zN+RXDDoZ+T(;fGL`M=96w;BEIcM@8tBOum%q4(tx#x9rmaVq#!O7fx_%qTfvw0A|eOw6Z2HWllM_~UH$r6`lj>}s~Q*^dXR zIpxbCF@+|av#8}ywD!1a>;{iEN2*>nQAe#=X*h6kd9r40dfM4Y0?W+3zA*wvgvmeR z%}WfDdPkt|q)#n#SRRRG{tw9%{^e1vBn8}H@8iqEtFA={4p^;X+smBt`Ya#4Skz=& zKXTq7B$k|)PZZ~MLoeq$FpBLMGz06`S1#k9)6N5O9?v2Iw9q@ROp_xBz3kJOez=&1FH=}pJVD~ z${&mL9rMIuoQmxR`ZC9L|9&Ij)SX4>op)GU3 zn4Is6P!)~Xs=q?kcrOyQyL{4@emMX=KD=^gSfM$u(`3^ujW%+o>X+X%+sA+J**?D7 zHS~sQ%Gg;Pd`ZRuuRN659(1sBy#c(Nh8JnGMF z2Tk~q=1yl0%*Q)g>)yr^sWyYw!}+x-spc7$we_7fAhb?&AyN`03})D0SWoHl@a@hQSEhNbn3GDf4JV}o zojk-AZcCK=Bau$uU<{S6lX`Dso6c(bCC$;E=5v4I!bI+HVBmspmLcRkZDij;-EP5Q z40{t`Q$iy=acd@X*Eg`9vnMlSA-B?@-h=m@T$(}P!2xFuX|uwNNRyH;t4vqqkQLI~ zQsE-VW=yfk!GXP~Xm4pivC%VHK`O?g*b){%nRt^&v^Vcrxl(Zr45QSVIgr{!9USVi z+wqmRT`Gm?sBTigLqqdJYvi6n*oXzU*0@ZzBU5dnxPDG3@fHEs`C;aac)EoJa_hLq z0>gf67+aEkXzXFG(6om=akjinCJ#xr@rWA?qGhp+n|>^cXeuO{4gtO4o6q#fh9}tQ zh3OT%p$CAM%;jl>fG^^E|)U*4E5wrj?l}$L)~?P zwC+K>rKE{k+pIoZcpWs^ZUfLWvT`T#0Fs_hDOX+xnt%eE94u|!e_E)UQ1N6E9$~|~ z>1uO#_NYTqLVKasu?h7!$$aYA!PUM|yD(CS8t32c#hQfb1!9t`BaE?o;>; zOQ7p^x#DdBJ`z2m!aDn?71!F$M9|wb=~ywF`FNpv5?+p7x6k8KOOBU^uSF*1fDQeA zbZ1y*+|0ARoEw)($uY6`s&?zPeWR)+_3?vyFJxFgB`~fpUsZ|iBH^F2JOaY+`T~{Do=;EkMtqFD+Rd*y4e4lQxdAC{BkEwn`AwzI? zIZdueXTP1Q7@<3Gj9hdMQ`5z!^{OoBa0u^9yE<2vgzD{Iz{fnziy};`(YzAS-29iP zkhf|y!|m|xaLamg&8=P&<-q!%+6Cjz(CWNUX5@>I&|9OKA@A2)u~(;!{C&sbKxC`Y zspBsEjwOb7(*(jo2+&G|&BkL!47pR8Mc0eiPG`Fwv8P|vN>MZ1b@Eox+*HiXa{r;Z z>pnX9vht*vqm}nHPvurZ%L(BObUi2j<=vlBA8(ft;MY zGmZAyMOJXB3EjO7nr4;7cR7{~+nghJdL}L}JJ0ya_N5(z47Ql=6(nm=Nw;2B1Nt3u zYG&={d#sFx%Zi#aQ#~outp=saVa!wn?5BeG>ds!3G}Ld$I!sIy5)CMf5%n!!GpkB3 z2f{f|f#q+hU*!{KK5a1`pFQu2P0uf(EvrhbDeUie@=_bHZecWy2GlSPttE9@ZvmdY*MN?Bpm_+q>iO7p-E+8hc#@*{s`9o6T?s z__$oIqAIH~`%(fC*l#_1POk@{YJnOrA8y>^cQSu%_tx9Q`T&6fg1fvD%yy@s?;INo zZTN!iTwW46na%JclY+Ns4E2TnI{UQp2QP_vzp6)Am-0ork@D&eS*gPH&^u+vs9pol z)zIxdnNb|{SuZ1oN0x?iG$Tw`spo1Xr_BLX=&~y+D^7ST729Gm4pui8W{iAuQk6K~ z)EWFfoVQWnwZ--6y!wup3JmdFaJ4>&t~`uybO#p#RFlh^JGi!Y;tzs;}k-^T}E%) zPQJp+d@YwTsP&fdB>?Ln%lCR2MW*Ub58t6A)~5=oNdBdJA1GH?h?_`ivpfi_of6jjjP2@1n`q9PsVSM^vXIiKedAp&QL3 z`Qm1l$L>g?xGnQU?T$xr1NO3;e%BuF@vQk6cZXwW9sATg^p)U^Mx$rutpTPjmnT{A z<|jufZ$IN^ZEN^DIE&f{L_>3mp~TL80}~NL-oT|9(Oo#2WDB}t6z@ntI@1O!ZUkZN zoofztFD|M=R5m9xJn^msMHeaZ;|blVXVZUb@Z%e-f!UfH#J{f31xobb`^<3EkWY|E zQf_LF%MqtGp4>04>`FzoQ69u9_FqaE^dBL;|1%q&N-)`L>{YF zNiMoDmu~+DzkSi>I`L&+wW_}ypS}DJU%&h6*~P`l>zB@@*W#7f!-tdKnWrwlKYRUr5Ex#Z{p0;76ZqfQ1AcxsJp7NLzt8E*=O;f5 z_qsHC{dnaJclzhk4Fe{hSo0wvohws9*XqBwvtM97#^Q+nSMA2O436W)4K;!PJxzW! zlS$vFVwv6Cf}M?uMulHdXSnz+Ui3l-eN3|RU+5Rwp~P%^7IP*ln9uo%=cPN=aTJy= z@2h1v%`tPsJ=tTZgQX7C`mr#8MN#H&Q;C3E+hU48{=MebI*P^@SJINHKE0iMkt+Gn$fNcxhA8-{3J{ z3y*{Nl@wut_dSOAqIYcXZMN}ZFol)6L`rTM)9dBEopvm?Re!t8_M>o7x2Itn>*1zD zgu2aCG}nS()S+Ii6io2&a<3_tpPDJKW4csJiLZEoX|I~M;9z-9`iQ>84HY~!g}XTT zrKzGg#h0bfT@-{$e|D65bISY;MI)Du?>YpK<>zvLTx&1&qBaBpY8=y|O&OPY=nB5M z52RM8@8pP~&^{Iw0I>y?y7BI%EY%`1O^(cIVyB+Ju^c`a-Ai$f-V~HBG}4F8TPHXZO4yVBzW}P!f|u^ZqGinyakC5#x9#j#6PAC zwB0<|X1b`qjmq2n!}mpkh!Bo=D5|12I}|M*dzM!}1XMzZ+avkFHI4qM6q_ePlVPQ+ z>jHPfc?+dBGkCXkM#ycXbbptluL8DLTI#>?15CEdt&l*Tr6fUik`;u1cM(3FtnlgL z#NF}VLF-!IrRS!0KxnVndc8fyS>fO&2ZTTlTJ#DTI%>zeA4V7&<#Ysqu2%@fx%Ad( zPXpiIN$)aod`9)It+lal;qHl`GiUCL=q^dQ*^!eg+Srzs9I@S5-fQl+8mR14p|ax> zdrX9G?RALFR=VzX6RsHM4&mzL@P=`vjNjiMR}QZc*&qF@r{CF4atzOblOn%;5`7#v z!l1Wwxj_m3X?x|w&(cB+U^J}BlFmRSREy+o#eq0!%Q1f*`&C`%W=S;NFqSq=7=*8; z$v{~5+2Gu(+g$)H{ycz|i<-{k_*ub7NIvKA{QDo;GN zVW0-Doq@u!kFERSm|l~PzBljQciZ;%nMi&&tK4Y`F0t}WdZ>5mxDf`Ws`|k$Ik=l# z4WtO;!2jA;ytWc&F>o-I-gT$z!l~tOVL1NPQm}a7sR_X=D!#mSRL@BfZ8ouQnk>(n zb$122e8Y_@9AG<&6#`^NdlKSRK3jBnGoiuYdnz7H0TZBC#&{bJgSy}n2%<;6H!JK3t3J?Y6&e z>g;{9?C*+JWZyQMdQtRcQ%|Aidm*xyFP@#fet$OY@B6H%7umBnuRpwd@#pV9ym|K? ze}r}ij~+dGd-gW_@(!vI3*F}G= ze(1LP*%?g03_V4=^27mEJKD-re z2fftOE78xo`8D8Yl6_xyn>GF_7JuPZXKmZGvg1nh1?)qidX8SnA12wWvk#}wPd}W_ zzJ2lX?DgrZvq|>Dzn`7GoP`e#viRra*>|VU{xj?_mZNX_veF~3i?$Q9R{XLlTiV%4 zHZNcii`lwu)}rmVlZ@Nc#Y)V8MrLx^(eYbREN0>!VRw`4u7%AvU!T4I%R6{3TKe+` zeAtc;4i09sqN;#$PO|eHx1=pEH@F@7B+LH{)bgV4dT1dQ?n8V0Jkci0&#tas)XQd| ztNrLLP*DC6=7fYMT9}fgxGC)JOZsgzV^qvw>SsT`ee>?adyQgfpRczI0C*%t9;J@_-PyA@@1E!M z*Z=xjb`fEgawF6*0Y zVeLTYfLn+q@RqVJ``K*NiE1f_v)kb31+*xOs_X;|l9fmd^;}Gm3j*IOyR2^770|~v zYif}#n>G_Lzs%qIX%sk)JH-_MLjLw&?$5Y}$j?`z2CfIEAD(>++)o_n<;*Klv_oro zh7Gd*TH}&O82OVCuzUK@*?QjwPmlx>#g| zv!ys|y&N;!W8f>ridr6%xbpkJaPhU3OKQu=uN&acwOQ4%L;L#YbKT=3EDXPd?Fe0f zZCGousrnIhxe>qu&p(c*K+2+C(2rw%7JLedpNe;44Uz@8E1Ut`&a7FwM9(CP{0j&a z+R(~I{dQf>iE2Tb(cH(=;o~u(o+qz?$|nGGUTr`Gi>s>>+Q}5b0oU%GgOib@;Au>< zhJ+){gFzxOR^qCdZ!mbfqrN=Fm8Wcb_N}HWmSPB zXl{sgARB98jcqNlkdnmoarYV4b0+{8{0q7nuq#xDXw#*Rm85vJ2;5tj#w8C@D~&R! z@WD(i9481ZaNUU(fEs9EeLL_PGP6HXl3^TsETIfHsf){sI8S6YtXsh|qiBtCc~nt! z5wh_>;ByC_&u!)AMMk!ubWtdi?6#;j_DPD*pIR|A|B+IxM&U#!kzvQ4=-{V21xQCM zw*-B&-o$ zqF$`JY$T>vQ-1JVT$V-s^!v+A-EUxLTlm&@V?;107hqV~khZI;tZ(3yUzea@fJy=< zy}_2*vaAI16xtY3-H%rQWUa30_|+>r(u<#_-X`Er}Vyy=f=+077AQG#Nz?;t270TX0F zjoPVRm^&6Ja&_OLV4^-Dcz?Rod>k~hXWdQ>zC|5^OwL*Yim+D{88q?~REX}bgdMRp z?Qwh%FlxIJc)$!vhgE2>k@mL)BcF#FlaWu#zWf-4fm@{PUA+#(ZMe8N67Zt|C~2mw z{prt5S@WJw!ePQ~Rv$LKJkoGRN%uurOx@G-#m^-$oSSG10jgNKucoYM3nU%OO#%!V zP*Govct+Ern*r+-#cDJjqmIE}b|V%rp?nY{#2#p|C)^jz4-&N}IqN!k95HM!PZ#2H zb2ZAz(Ud*uz}n=)6z_z`Yl=q2P$QBr!0PYlB+W?emL1HNpQt|`K*+#?Pe@P&T|^a} zVpLuthj^5u++zFqA!o?{5SVk9u8&e!;H*D0s3@D1PM$S9^qs_$tDL!*&3xyN}war&5Jd(0b&4FT293jpl-8^ zi~K0RxB$%+fX+3{R;;UHZqXUBduTkv#;iudiQuz^o-80Ocxrrf&nfUlkxv}fb>Jqq&+2murV(M{>ilSLHI%v=VRWFKm;rea}{^eFK2mSRiGNTV7 zqul^YXix#Gk3eHy!vZ%e(Ux-?J%kAu5TI3|)}=oZv6hwJZ`VT3za#&BY<&_3gG*F+ zVkpz>{kp)5g5*@-1I7j#5Q_%g-?%YwgylBkViRi}1UV9PTR||#dVr$47U*zCBq?;R zz%DM=L&$;;_rx_XMBV8%6PD?rk4cRwADL`acgNaGvn8xs4Y0rJXP-FfS|#tBJOLxv z#YqNaZ}^rp+Tj5!edo?${y5HlpV=z4ky~hG?`@vGZJXP2LB8sYZmwVIt7Z79JQqNk^LVk?{hODQrZ$ZfN0d|!SAibU8uF(^s39RtS(kCC-> zPm$ddr|p-Tf(vTqaqY&aY!+#KKu73uQ_p3aYOAQ7S})5MRt4rcFdNp<$Y)zO*{W#; z3oBa^(K?aKiu*Ni39(R)+-thw=oE~L3v@|iw{4>{~FkqBL#-x+A|G2t&IJT5K+{+xlwG z0bz`u3F%C9pUDYGUDb$bI8KG7wU)XioT{?ttBgxQcOeYF>IGjn@)EmWclbedm<#9p zYiKCDn9q^2>u`Xc?*EkHKo_qz5&!Q1so%bHR>*7{0G^tMZ@*XssPNxCSY$(tP+emXiR~_>R(|6rLubb?V zYW?V#{X(I|AGh`uXOMDXs^EmaN4kX|x2^1w@L11ySJoIMMAwe7(4o;f?u`OeC<;y9 zNmy-puwl8UJ`wdX_W4w&Z7>@m4Y?RTUn9avLc#l_X*#MPdK~zw$Cg2@sKD&MxM<@rEwPxPW49EY#2$)?s|GI>aG)U(F0n_3J&Q2~GLsBxDLDhm%sR zV{3ajBW)EYk>PJXr_)Qq`?~NbAR}teRip4iN$Zy>sTVW^qDY@OdD>X#dw_!!@p4PB zci3%aklSd)P%4HFgF-TH9ylB(D3Hj7WW@}%?9Ri>tb0WoXC<||E4HNgtu|fHVu>!b z^@Rz1C8EeXB4YU`Uad<%B+dZTADF^s&auO4vh>I0rUXl+FM-7`1V%`SdcFW|K#{-I zv19hS-U|v~L(eVwxN)4Dy1AoZuS>ziS}?#P1ejR>N9a2xFu3zPy{uUF1`iaIJoaXX z8l33tXg2v6klZwtAYZDZ8!GJLQNFm)F_mD7>dP|Zi9mw{N(Oep{A%ghyKCBowM)!b z=QqWb@U(}^Eo$MdJx|<8RMK5717n~JD#la2x=8$&n&iU*C4F9^pfDrSaZr|9NnICS zz$CgkP$xT=OLOFHsvU?tv92K1pKb$bV5^5y$E!#!$ojQH_@o(*&mS}S!g)G^RfxJP zQ4(Yn*WH#~V>#`pztXF%@q9yp+EvY*9BrOvPR|zQmFNOL0X-7;eOq+$5&!-e;~Yzl zu*;UBz%csG(5>5F-u&7C9^0`bpmMY~Ky+wNwxr3qGlRocHN|4KX{#=XG_fY%aZD>c z`ZpD@q)AQ+R{%2PN=3?%N(9O-M7tV4`~KZa+87G6+f68Tz?R+@GYfebti@66hsbYz#Y*Vk3C?aZAEDuvo|t5GL_J-Y@5 zl8ACrK5yGD(_}tzD0ZA$iqh$amkwA^kW|Dl4dO*oRun|Rfxca!U(#bQ(9lYqP|73xG(%g? zLiTFmuSP#|t-0@HthWu8WxM8+U?c;ZUrhT3L>8Q1dz!z{$%T25ExB4)lL-$~4-KZl z8VJZFV@`Eqajm`M8&qJ0;#T7%ZMK_Q4Ia>^6Qmi;GPk?t$pH{)pE`omH$4RFKc6^; z+c`Z5C?@@IUr5PK;OJV?qdgla2dz}HR>taB%? zDvarZAMK3ecwi|OJyG^ao;c&j`d!Ma7L9z3dYkp^V}7upb?AC~2p!Rq;jH*9%fGgn z!AV)S!^vdIrIVrX+JIKxs`QJk{w^c?D_3qO)%Vl|w8ccTnr2B~ai`U*9 zsPHmQcg_Q4@qgMLhD@qQPr5%1X-E?Z(GK^Uf##sBO0sNI99sy@u^s)fWX-oD%@-9( zf)em*`Zb;b#%3A^22QgNRO`0TKH~pfvAI7j2OkrwM9R9G|HPCSx(q zx~usuP(#B5iYed22lN?`1zx3KOZKkb70T#RssedpkyOwyLltPy!a_&}Q5Z{Peo;n* z^P{~Y<=IQ-Dvu&Tn`#nt#VQHLbNd+&kW0rShMDs*AI0goz^?NNYZ3xUlQ+MT1q=sC!>(=wRM&+o$^aerz!PJQ&bBdneOO0_-g3` zM2t8gg?7dw@1eXpkv9O)Scha{+$P4A=s59p- ztB~yHs18iPWIWQPXUNmhGdU274U!tvp5#H0G38TDeA-*-I-!zDixj0UpTg?hyBvKw zCmEA6ll~ALe}^vVYspEPCA-GCGb@eG#SOJ8s;j02d4%D-OEWul=MrA(7(Xh}7W=ws zY70NOlAB&`d&|ioq3~K54r{U)=fND%smg((T&hdxrI7_Rk}9ti^fb-R?hAxP;iG&_ zZ^dg|T;$z#@p*o6kp#v~zWCxRY$U&Z`A7Z+|G{Tpf1{qQ7GKMFP7#y`Wb&czn!3Nx)dN z2{J@Dg&lEz^1T2ArKTA9ID$6IO+|7V;jtiUw@2-!&e)I9!MVZni)T8il;x5qCKWR; z&y6cPM6@&Z=`@Q?#aW^s-6uLl_`$itJMx4%dc#D5jdIy~Qx~^ISz)v*VTs8rfDKEL ziFLPr7CmK&$xK}HIFkQtT_Jky&Z*!>=ya!GQd5R0x-c(0G*VB=ZvHs?Ah4!V0YrO5 z3;y9+h${PR`o)(@BKxkEfiNe3^hDn7t~tmm9lw73Tn!y&dk;Yghyx_}6RAPswo0D! ztMZZE4-uF<$5hU2yLYL-UlvR5wl1`FW9N>-*1#9!Q{Zk z6ME6gzltf4P%pE4)r0WJW6Nws#SJYTnr1?Vnu>%o1~?^_6mw8?Luhoqo0cUyhp&TZ z8nNS{q|!X4F2gfUxr-=7-W9M~6IJ1Hlz6J->qu2-Gt~I&7!vi?we&{ZM6x03#G5^9 z>3Mi&9+RUgqX-u1rsY5cRJ(A$tl}(-GSurIqvAQ!-ObroskRnD@7=e!>`3=;o`?N$ z>)Ymz!Uu;}iJw*3kr5BO^;*?^E2(c$Ux`r#`~`rGC)t`-+VYb=4*)4 zw=X#A`at1N{zk41|=Q27p-%*Xs&~Ub*U>AGXUNDk$-sLN@cfpsY?6)0~Ji^I!bC^q^C(N zPw=q7tfjVD@6jDU$n4ZUot$`^ncNzc31mhzh$Lske~7JdMMS7fk4bw5CS9HyD=)1e zeYE#dc}B=mX1XPv=0Tb1W(BJ}1hgT*_)*C`R@n)RRN2^tJ}xds#^#dxo3xv#hy)tE zp|I`T`Vk?B=wx}PNrseegdkg-p1#Z3FmX8&LlNt(z^Jray4}v&O+8r9mV`{_V-A6; zYdv$Z+hL6XTsHbCwa0gwoz}*LBrgSa^Ptf!6ju7dixu1~Tt_cz3%Anquda5m*tNPF zVm~zea>p{!W)`WqXmyX^x?3b_>`IIjO0bt{MrOi>Jir<}{x*fp01-iD&iFwRx;8i5 zIYy+PL`q$c9IydFkh{ zHiPm))7C_*Fc?D*P|b#3CObOS;?~v6s5+2q8-&IeIDDUQDU z!#C016h6acHcphmnuknmp!}EY^Msh1S{UpcK8O?&b#Tj0JNEx+zuh{`uie=y5}}*? zhXa7q8EGM%pR4ProFqfF?igbQFooAN)+-N<6L zj16sdJ6$PPh?p0j8p(xvM4Z!*gr}zM08cS9z&@+~Qmm)36$Ptt+UGg3g@`es8(Afe z(d+OKVfl>Q6zoaVm++l-GC$Z` zR_lH{RyKoyRdzBAZJM2-z|}Qs>5@`Dqn+ zbed zy!IxgE>z;PvIx_4_8F?;^7pJ=`6VPAIY+oojKj1rlad51hf!3FL>aplcs7vVu_#Nr zc@wLm6EczXY{83+Osg~Gk+ezjlN^a=S4;djp(fl|W)J|7N%nb=M_}eMRBIv<(CL5D zqBsp!qK9r{0#Pg_aXh-k!;lT=cPD#c3P0&xB<|*(U2BX`uoy@?oYUPkNPva*k?%;6 zbRA9HSKp#w-Z5n<94_4YqzTSXnEiaLaufb@Pf1*oi&Ak1ZEMxi; zy{0*xh@3JqvFxN3OGT9;nifo|byE}f*EQBc-wKJ6!t#YJty+YEmz^EeeQ`sQ6a6wE zVK#M7RXa%+Mmiy(Amyfpg^BGM<<*6ii9tH_;-e!pM*(M78%ie|PqP=b z0}JzGln}H~kkOl2Xwr9-{6kVy`R`nF$`J+Rf@zwbi;gOIDoJ0K=npO&9E5Y_D_RdV z)tSF|k2s$TG$SX{*HekxqVAo$jnd9jDHf&{E5C@zi9dF4<2Wp8e_yjC@t8Q$^3{F; zly#0hR&POy-PZGq+@{2Itft6&atveOx7VGhoB0GYqN{lOLf^Tdw_8$lOUWg0>3Il@ z=tJ2S^$V=fT=`e{3jm70dI(XB0tF+qE4Ho zi{r7vLjc<|(sC=yrGT=ek|nE1KzTgDy2|c|rhTO~beM3vSiLixraD&`K`W!i=*am2 zU$_8zpO*BafetgWj`JiN`DVNeUN@Da)SYF6@8EQIdvdxZo64j7r&<;>ra6R~j0HX{ z{OaBVm_u(ZPgxeS;(>XyU@V3+U8|2^aNSrVjF9S&)829WlRs%WEQ$k+3-xk=slRu- zV^bqW;a&l%;o`ohs5#_pfKa-2Bp4=CHEMs-w%Cz#p07VNN241P#y@oGt#8EXfM1aZ zYcM$4@<|vrLuEBg#;S65M{mfeZYE!j6_{-CG{3kwlC|Q6+;;n}Y%nJ)8Ny9(Omp?I z|B(g*Ok9SBmtD}$F1VPHQ!5Qf-x;Q3%aIV%01798$|fGJN?bTOWt_mn$aG5y45vCg zW)GIh91YeibL8=*Rni|fVK*Sw>G6*`6Qzt7%Kmhcedg!eQ`s$lkpJa0@?V}XaUzpg ziIPK{AANBg@OHmHneXZ}`TaltxOef;=w9V6OTsHVq!8kHm!fJ+#a52bjB~8qR`z{1 z6^XC3gu-KK5y04#VSFjV3+jInM(i`Xl$sK|;B>g&Z+pMVrlxa!Y3JVQ%9Ut{!AyJU z0+pd8ilOR!&Nw?T?$%aS*~eF{cAHE4wUfJUOh&S)CO0kMm zsoy8TYIkmx$vt-EGMx{VVnyK8t9l=pVx`R>zKfcul=O0Gh3yc2uSwBXaW93L&%^~! zb^k5b2!W#^E-v2w$9G5go)1`#(vs-1L+M4)>W@^Pfi{!g!OAJ(U=U*I0KgO$q6EHy zH>_~rgsj3yP<#{As*RUS*otImk;f4ZZdhAxlGT&!);kQHDtuUbKXbLi+NyH+fFg$s z!c;lD^DONDk;bLlrc$|hhB34{g$<+-_p3TuRf_`8j5Qy_ zcGZuz;;%lBv)4kW{G#XgQY^6wJ}$(M6#q3-_WA3+IYG2c7qcceNKcHil_IR@0l7*# z??huOY6Yp9VZmJn)h)E^T6Hsm;uSWB#UcjHo0R8#`Ni|I;77S%!b~K))gF#cdaPWWl=B;PZp!Cc z4Cm*u>hc88E3Wl@tuB8F$Z-a%59$Tk>W+zP}JL8_gmd- zDjGI#uIjQ=<#w$xcu52E9eNjRD~l)YHxp{>)_$aTNsHLCy5 zIuW-etGT^+vrqN5~G;*w{ zY-r3t!c-)RIX-xz-%s^lqD_P_%6x9<^`3mF zFW$ucO$eH!j&O%GB|J4-YiA+dm=L!Ghcr4>I{PEA#Efs8ya(oZ&v5T*$N zlWlg#ftho^v!a639%T;~oB?C0BOxJ}X7aDN5#-fvkZpbcpY{t_ewiIr93nREKWPnz z|Bj0O|1T;!9+4jejA)`bqRrV^YQ;`@i6^>DvKjpEL6OmNDCIyOjAF*mkj1=zG_yxk z4~u9{#ESk_`FfFU`Fkht8S8XM>Yif=&sK}CV+cm|*^eOJZCXmtnI%A6pk<9QSCM>C zN>LS~sP%4D>Kn-c#?xzYuS?^(3o`NL(FiEKcx{@}Mgb~+N%I?oR|iV+Ll zPN;cEM5XOMOi2BG+=uwFjbSV_OB!klL*ymw;IdU^j&5qXIcEppKHgEIluC&@20BIwTY z4i)Pqzs0R>Hdh=kvjih~A3R7aXJ9Ha>Qyt^iR2z23gxLA2mUvwheO6(%8)L}b{3jQ zMHozU7|URQ>#yU`I{d)svQ`+v!@>_NHlMte-7EUQ1aK(~PypzAfqw<9})9Tu}uUQn_J6)9j6=yTRZvF#7JKW<=i76#AXFz3a77Xq8!} zd~shy1nw7!@ekLmx|?z>Z=nAL*u1Ix7hOi8_8&2_ZA>o>SbudiC*!`yrg{j3IG5Q&Y#GJ&Vcn+Fs;Wmq` z&%AO~zdQ50wpd@s-@5uvh0MBd+sv-8i`Gh@aZ9&|A)SWe;gXnb6Equ>|~&z zc5f)NR4lH@&LuD^bm-!Oz5-Bs*=q3WB~|geC6`vW0f~ae#Z~;!c$%G7T{9tGw8FRt zv0Rq(l3u;l76_@RCR&aP_+jhL?&9JeWtCYk>ns>(u>o?g4SDsgMtO z2DaYTUtGwJxI|NQQqD&w$!J;_q66oKn0nmd_5&{^aQ0goamM^!T90%U?OTk+ievIC zOS?4d<(P5#II|g%$EFmc9Xf@+R_C?h^6d>_n46sKsVskRXg4`jQEPNmZ6%3cs$exe z)-m1qE55h0`(ldBiYlJO-vcnnrGeCkAV#>-g}t63B%j+8{}`$1?a==~&qji3aXPkvwmQ_p~kUZ`(t!l$VBgNTVDEn|J>yJC-$(w-J2uHt|HZ z|11+BL>&V=fhOwZGF%vUZ^F9&s4X(JzhnD$V+FQXiEdZiTjpy8zsZ5#7Ji9$vMrXs zx3%GW72F=u=GF`GkF`)UvR^@lSj#ZN|`I2O1;w(Z88RKZUaN}LBd0%saFb)BogS1I~{m|I-m-F z%Ckd8SN3}<+CeMzil}ccHD=^7R!CP!kN`dpI?@}*RezO>{ZpMs=OylYdI>XhJOBLn zWB9@nojb`LEIR0$*`iT&1^+|y5-|&=XiaxDCuoVg1R+bt71{GQAJpD!20<2p)G@Sf zMb4eWrOhhP{}K#Fju;FE1^~t%L)S>?sdKb44T*HRf>k=LWcC?p@G*Ukbxjz0?Y@DE zn8WfIUFbNz3Q*dygpi#j7~>$ z{@YLWBRBtr$rg@KmpD&TfVPU2=)tPq*l&#X>t|%~C?A8nme}#pPu01gBjDa)M9w>o z7rha~k@dliA6gqb`6Ij%KKfHe|DLnvg@1qi36s(Wg^0}{&08Kr@vc5;4@7h}Kh-`L zHiL|Vuz&#Dv=6v7_K)N2Pkw%)9$WEbm#F?0unXOR(R`9UdTw=ilx}}{HE*hhvyB(j zEZAn^r)8ZDlZ}HeM3Tl)B*@Il{7%g4znn+j&lZnc!|bohIaV}+BRzCK`Bt>($;F#S z(<{SX>JnWVPO5`deVg116M6ZMHBSV;Y7ToEBi06t?--+yfZ;j|k!52?r61Joi2I<_Z_(-;-@JjXDdB(J0=y@kbB{_Y1%-@vN0FAK%72ws79!`D|#(R{I)7Ch%pB>qAv z=;o!lG#_{P=oO*V_jIeomEgptC@i)$8t?Jq9yqD*BJc2)j4!VCyBhu{>Lad_?J3Nj zdYx8m4{&WO;3YGfFLmrp%%wEJa^ui`MJ2l;Zfs47Z1l#w+1AY>jbjIvgvzS1j-jDn zJO2TWl4yz6hZ@DEK0nV*mR_(5Ik*=A-YY&89WY)qdbi_@zl``F-YiDtNpP(&cAc-t z#L1h2&Ri-hgU1SSMB#TM9Xv>MARYPYmPH1hU2e*1VHqKGpI>4WC=lr#Gb|^6*Hc^U zj2;&9fy@k&rIb1^NBlx#E=6_ z^|M_N+{to1cqrCaST)FEJWl#5q}zo%D@>bJU=W8oR6F}Wj4VpjFh9m66gH$?4Z1JH z?JSHn=KAWt*m+=H6m2XHi(}g8)d57fQ~3jWW1?v}-`6@->@SS8M0`Eh7ogPQ{)k_6 zxl{@lC2ae*MiCOwaWr$P+o!uKih9y!N3u{mzv{TIw!4!GgQej|=1{{k>2Qb^-Atm3 zwfKPep`mO++1Q8`Kl|G4q~d5}x8)@lA*7O3>NJFg1CW8HX4$N@yPPA8h+>7GWTuFo znzbPMcNC;Y+nn)c}&sLRC)ckFtL_ zIWsBcujYB_*+}6|?W91btQzIoA)eeR$!!fL-z*wbD~MQv z+dJy6P>%{Cm8s~iiAMrw!8mgslZ`lpW>uHK)Cl-xx^C>i9+-}HWw}D7+srBRHa44& zfme-MtL+hyXdN0`>ABF@poeDk*%((REk@dFzA_Z+2?Y`K{Bj&r2w)~$E)}n%F@CO* zff4%ME^F%qNujv-2OJ5G`Fg5&)`F8~?Bxr0%;8O=;w^^+)R^=q)0SRrn{1t)XJX<{#FZe(S6E^vA6JZq2Kwzc2)SMb_3q)BGw zN7|rw+r5D6Y?=ie$5^lXfNRWXB+d-88cCO;c0Il5fA4va67`y$*v3T~L@>M>i99?! z?{i4%p*a2GR3t^J^39p3&HD8B_~hi_$wTp?DEC@zwnl_6X5!hCr(cP`s65__H}Q|E zjG)C!mB_r3sW62wTPa@e&9=zJn__M5VlBnDMV+UyQSc0Iq!uv@l^d;AwJG4&MoYPq zxj|TOq!ceNUtGL;a}k*jM#On4Ui|Rt`s(seZ?Av2dV>$4-HF zvNYn79$si&Xs=UR?{@peRM!(~6S=3~sLH?uE(jn{$i7aBT^SqKDE#jF`t_gUN+r*0 zv;7Wel1V)mSMq;rS(&-O*RSKMx+`@0{YK9Tm%&x*tc-Of=VDc>EL{|(%n?iloX9r| zvoB>ev*RPR+~`T1Y-PFtij`8E{apN0m5WqC&o@%vO8r_FAND6FNPFPzxnn}Kk>({m z3m1z#-pR#cc5?E~#kbGjzPw&szWV0kZ_qf{8dFwhj~|!&QbmQ{&`r>^ySjM(@_TH@ zk57^e<|$ss$xXbGmmp0a!eaHKOw5cq@ZiA%`g^@qmEgu&mReRIUlj;m$vuU_u7b&| zR+$uc%4|V$Uti8W875G6FhQe5%_wxUBGJ}+z;G3uHrMs`vRc4D^PL1r5r-Ev;sQFn zO5>})FMbm+gjBA@0$wV!ScH|#)^lXk`KuzAc1r%V@VbPyD$Z0TK|5d~m5K92Mkh^! zGhlPPLojDR2PxiOy%fcorbS3Z;&LtW0`#DiiCQa}@|>~V8Wa+#AXGIfMK$PoG>R7D z9>JJE3j817ba>ruhpMmuBd}JRT9auAXKf3Rw;hOSE=^V>bKsfT;{PzIYA!(LH3;Ea z#~U7sggSJ?w_w!T_CZ{z7v4}m_{)P38B{JplEYwb-+I?LO1C`$bBT^Kx zqEcYY_GjWz6^KV-hz>m|t(Gpfti&(_m%E9A_0gH5@adcN2eFst56l5JG? zu&AO`-sW|d!Bp>pnTRV` z*1DY^-gqvje<77U%K}Dtfu>U@pl-VzNF8a)glYM+G-L_TW}yqHgzZFZQn`^jPKcq6 zxfC5Ou3Fo0rlqNMentQ-m~qR&UegT;z7Jvs&plF{pgiFkv_}M755(!}#S0#<>5>Aq zeOR8gVKlq_!gSWsaKu&}AmJ6XwjKnC6DKHzh}e3f(xQp@HO)vlQRc^Fv1LONwMNwS0QB1TYt)z|S`a%JOxUxo zjsVzjO#w(4xM#tHCHC98XZ^NBG`}G|KwCvoNgoUHfnHlTE$Gm?g+{!p_*Nb-UT>iF zVeyK@--}x8>I$P{Xj}o4eAy7bUif0-%fU*nQ47(AqP80pwVi~JDD~ou=bKpNb58=G zQEl^p5rLhK8mz(AGKDA&LYvBC?B|xUMFp&oPJlXMGw(`<$D<*F2Uzq18>62b(!EP> zV$Vv-9C*v=NcW>)i?vM)&R^(+q$)A~ z+jqekhC3KIVhTzz`9AO>2g1u)9+@XaDi`)?m`2LT9bhsS@80|2hNXw?1&L|e^s#@Z zQ6OTOPey?vo&&?T@gsWMM*OXk8F&af2x0W9o-%@5?GU=ob1Po190Cpn91O6U#^JP;0O>ky!Q*?t!FfpK#NXS>4Sgft>% z!>c=$Wx{~3Ku@^G`hhAZRRY{_E)&xh!hk|$Z5(*O)1U1CBc`XFAZQjsiA%`ZIG!Zb zn0Tfb*M+;S%A~l~b?SbE76gVl#V`{gXplytsDY2bVqq|gG#ZYw z2bQN4@hrls`;rSr0BBWj!r)QmQs>Z$*~~NGjC_(66=L3qC;IwIZSqcTGZ$FNvq0b_ z)wr;c^8g3(z8krx_~20e<%-n@d8tf{wIe@C!jZ@t6Ba`ucDOO0v9v)#Y$XQYvfX9W z)1lnbjJUTVb4O(Yrv&uY{bCG805qg8pX3D z7>w+Q+fJQC9GnjL28#PZfRim1has}82odZwjRcLUa>3=2#0J2l<*jKT&Xoq3M7bJ@ z9}hQyEw%&&n(%jy^-dgOEI5)TH`w|0&fI^1ajs5Xm^w1y`MO);eAm>D2~yOg~~$% z^5Pz>04nNd=+t&5z7#wI8WS}e~{^*d^hd8^G= zAh6gQX_q^kk@1TyBNw4)?J?L|XQn&T8?gq@g{ez&3{)DWD8w4*My~_N?SLHUMd!{= z6zd@}?DCtyWB_HkCl&+{Jo>?*IQfumeUQIP;^M*O#v^=7VMc z{7|!h`G%oo>$Fv1jNTz=#UXMJwiiMmj%Y03`_BNO?z6H7gUaTl3}1Y~qxrRoze36c zvAIF_Kw?_w=!GCi5nITNKyH#4U)@Qui}#SWl9lfjH0MI-S9bZ8GBEEIyZ_gr_r|>S;e%@oA9St7&X~Dzo+)~sB|7-yM zNY)Zil}C3Pl9;gVF&k~w2@UzhU938@dddc|gIn*3HIHS)H>{f;>0oYN;SL=a+T|mo z&ZC0MH_+wR*zx~0c638dtcteL;WVgE3LE29Rb<$_VW`Ifm=@X*M^=dJC}10+Le!a9 zU}1N!HYBZ0K-bTmK0a$2y&T6p?MnK}mI2~o6I-1OYcQ56tyO`zp@>u8uDAl#(87=*>9L8QjiQF# zahJz=P+^@94fo#G0pU?mYY_6|tkhdV64XyiEIGEer`==lvnXeJCXwknViYHgs;`6h zK==q13-18bw%O zQDFkhcdULNFy#GmO;>+)iWeLqBGBxs=-J35f5A@h=do5`%b+g% zhXk!MRh#=C=Qa?+8ux{{f@agd>HhI+5}p_DZ1J&$6xrJq;_AA#f-@}d+9CoZHpqTN zzA0mY!fsIN;#+WiRJ}T7U=&;i-8fukl^jCv#~f|Q{27CdVW83OcWQ?T^oqATt-EMq z3(iE&1@BAq*N)QPEmF1N6&AbKG=hg=(`y!Ont``y>WuKfJI-f2{qBow_g z+pPqhiGU!mUG5c<0$`gdl7hC7Rkr!lej{i1;ibFngW0$JoBLjymORj?{n1bRePUqt z@Bj94|CRuV5|$a>g#nr}(9_^hNp9XUarVBa5hQJ0jOsTAH&;?Iy)fbZp>MCDBi{#>7CJ1h7K~A|1MxZ%sg^^kS6g_ON2IHO^c+)P2BAc z7C&-@x432aa5&ik@iUAj2lyRY9iNOAEh)ys%|o7iI^y#2vO!w4brD4uECyebfI4x* za>=CMnjLNu8zsVjk~3EjP3mwch&0dvSMG&Z;LtTXbO)q0Sb2XD!8QTQ(o!+FH_*sG zBE%q!pyyG+1^YrL-(H}>FWRo$qUlFl{@DiF-Tw_Gv5){G)&4LLIA*D};Ld9SDX@!m zTBF7fCWbrpc%uOrr7&tENP zk6wfBwY9svj!@jswier35oCe$fU)*Ag|TyS8u# z7Q-Gs0wgf47vDl$CC7FDV0~dKdhus2>b$KlxYbfT9dlfD-Rs@mkm0X#^xg6&Ib`qp zgcXkdqJ%q!_GB)e9vK7jtUi8y;+~ZWdyc6!O=)qL_m?JWodNA25aKMFQ+m59f#)8y z*%rmkA$OgG#+W^LH9L@2(Vk?!e3cbTUnywg&8#igwN86=I zC$UXYZ$NEpts!pA_HBS%@MeF+X$Se6&3oWis3I9TcnJ)@k_~b;xoM!p`JUG8W}fXt z17ha|(0;^CDVe(A{OoL9=gAo!#{ueVC2u7pT=0lD{^uQAfQp~S8ux;(bc{zK?XfVb ztK$ZnEGzCR%M2=8*P|(GiU$PJns&puiBS4W1Yp}4+w)-UJW*5HR0DTm$&_m0@cjvnK%A7%*g zI8&E5qi2}6w5^J^)vwD4kq(CjVU-ohO{M;c$djv2(#VwcA!yX z8~aOs9Z0r?TTnUxuaO17Zzw``#QWI9ll-ZyvZ^(*@&beyZ0vhz12kt=HU-BhciSS9 zc3%OY$_B@GB_y2x1ES6+Es+<0q=!ev+XLhRYY1boFFD$^Od1F-5FI>mBp#)B`~{8L zqm*_YSHpn(kq8kFOBCN2^9;xc#lkrtFsu|oP}mjua~l^0d;0dgm4mV6#tsPF9>v{; z?3l_#9yP({PE~{(MFx1HrwJ^MO6Q2IkMI~g5YZk6YMiPw`o{w5Uyg`8yV(&w)1|?- zjN?3JlM!`nJ|{%*YieVsq`lewz^5s;S)Z{)pTlRnNk}OdQ>LvaxMh`LfDL1Fc;-so z00~h%YLTX0n+Zpd#I{$q>1;e!v!`mS?rv&#Fu8yDwkuq&Z*x#=tjlZw)c;P(5di(> zEinEH5`MqO`zTWQg@Z82i@8BWfe3QD6^GuEg4-1AFD#6U#szhBizbxJ)6xcgG^OC< z16XykSx!Y?T^idRjQyFp7M7I&uL=z2h!;ETO3?k;$MB#cVduulLxp2B)Wi__CSmIPb#1#dqKr=tCE@2M-X~onoor z540k8{@_vd0L=L~`)_9bJ-g#$t%8X|Q@4XXzq2kQU< zM&YZ+-qaoZbAPbbg*16kZ{w4rsNJ!Y^miD&=%gvQ#R#%w3bFxRPZrwaMb?;KdA2&D zVkY*OJ4`yhKGw#IeR9vk+NhnxuUdT-J@JmW^m9#D*>&I|JE`7uaJy{)UdXGEj7I1UoG_puJ-|Z5 zzX4E70|XQR000O8jtH$%RZ%J}b29({gv$T`6951JWNCABY-wUIY;R*>bZ>HVE^vA6 zef@XaHn!mJ{wr8}vZ7L%iQSLwsCD`>X*$h2ZJJHedEMi@!{GGc$>}lt^I7nZERVOrtN5SUI)Y-~XR|b~(j=&hpuS3j7u))($b(nKyuOXg zH2AjImOgf!k19);2>MAi?R+Dzh&!#d0DK2tO(@Y-?nvHJ^N7=`Daz+>hrQ# zEMTDOYf-6B>!QluuH*Vjy(rUzy4;Qr0(j(AeO0D0;^`oLJ4@Gf@QmI+Ez6=D2flB8V#ko|O4*nN1IPG?A+JO;*+L`YE*tD3qUP#R__> z3Wb|;`OhNDM*)0T$7Pk$r%m2`KE=W1@e01FPp9yDM15>Mzi!eEl>Bv5)L1=Ft698; zPZi8szL?b8by|&r=_XqylVY9bY1skjyVtK@yiAjtzbvs_GE|C9IEvpI&}XpN4`LptE=iz)kcKp#kbf*0&dcg;B7IuhU5auciJf ztz(3t>i;0$NBYyV{3c#z3AHMf0Nzqh#Vnp(rO9Mn0$$2`i|B?qn9RyF0UFQZB_Ix# z%ce{x)iSQGyo0UQ%dDQvvt`Otwn%G)_)kFBguBB~OF#)A5m%2F4wph06TtEWXtE+i zyh=;>{Gu%0LI?ArT)~ij>1(&_mv5^3vnxbI4WG{7|1i2ggg<{7jIiXh z;lX#WfB1faZ070n*OS-(`^8fm#sDev!BxFlzKho|Gc#gl58j4X_3-P}5}N+z>9>!6 z`u_Fg+4FCn{tT4|S9QIv#t$B>x9cn_$_0HG92_L+oKP7rmqd1o8fnxOuH&=kMV=0s z@f;o=9x&zCn=%ieQeajJs8Vp97q@vZ-2$@=GGMT8BdRop$&XjK_Q%0%V9T&nf?`e_ z+ALKP>~ZioSORD)fz2??c4Lv%uWXLsVRi%T^jK3MzB~&oq|k4(Wd@WAKN<9gV}`Y# ztv#buDj8O&MmeZgcIT!By# z*>fbAs{(@XAfC=(E!NOvwyc6_I*T{RD(j$%w-t4Umv}H3NPU>vX|dP<&w^zQ6gaCl zh-a#ERcw|?fDo`|$=rERNlhd-98Ci?BIz!O%BpIU21h5KeE!$Z8BMq}aM?^!WG0hO z9-f9(x}4)0{dE+~*CW(Yfcvbf#YhHO4VwuE-2w4d5oJ|DnB}vg#7SLlhl+q!n`ND? zm#K@a%77A91qkwD8c$)E70`UJC}5G{P=0#(46q&i1S6hjB`g-M9qHP6ddsAb%R#@z zs@Lfj=Q|uMrDfnfgH4$Yj1kC+lA_YHaf_|%Mx?|!RJdrBnu2a|t=|GzsixLyr@msZ zIde$^KdCEdSLqlbgB+TzsA7>2(i!l=fjtJ@e^FXOm|qkCllcaiBD@TTqre3%;IHB; zuIn4e|7=)_0LMs~>%u;ydeM#D{^YlJy z5gbrmtDzI55A($*?u-BFzBpAJk`_l%hQ$>1jTSQ`e#Iq`vX@-C3XWl^gDgir64(4X zwIqnc4y$5Q!gPRW1$792h7N^;sE*5M@f$7=`Z)dVRDGtupzrf{Rc89zfah-tBB0#1 z;H8TN6-?iz^!N5^DHTAAUv3i6)!ZuUWIh-PR*ww9SjR9rke#FefDV6qmCddK(s!z0 zTWo^c7^EABiB(+Bt|F4Uz|~^lIsyw+N8ow@3fCYP1KtuZ;w-OfVwKcJqbmisS$)O) zb(804D=;ADqQv@J4F?63FS#vPBB1whA14GGm|m0+jQ_TP6E!8ngkRLlS!6?PCStn z#Qf!KAow*Gz9KMuomB}0fg zAPO_=IIs0mlb`_zrytfRRZ^Oi7eClUoF*!+w#bIDCtwl~UO=oW zGIR#5`sC;<^Z(05r@uYXhC)?KV`V&+du#^@3@L@V7_KV z(21Y0%Cv%Y4IMadlpClFEHN)?vyV}_TG!ifxLc*MYzp-dbsErMVBxo5rKiJIQSMR% zHXy9K&?z83ArsV7>{z=+bbe*|CbfPr>(y~}JxO3n!l8iTKmy~?gPV&T|oRKqd@|4b0VgO`gLWu-;INYB_|<+jMO;3b`;F(7g0J7B_6W zP03HTBvu1l26^yiN~)bz1vs6_*ka9#l+ib``N?gzTq11bYN%3ZK&pVU3r$XkatL&u zY7S~SDKNJg+olQ{@~9405o6KkMg6Q940)u&!3#3Pn^7vGTa9zzur!ZPW)JoT9Ymm= zz8P|iXO&Vb{_Ugq6H^`%Qe~|Vgpm{)iRfY(5n~~tt;dXB6J!h6k!8FEDk>1MYdPOm>c{g6R@%YIF}|x!KgX4;+;^$66N#AlKZavKC_>zF!|TFtcHD zZC1)8VR&BAQq77oC3~F72n}UF75yFP2i0pd>tn7b@}<#2NQaqS6$Q}ox=iOON`7<_ zH5%`{O^nKu=AY!+bVgWqJld!9z)KcIm{eB|m<|9d1|V&8H|y!R`zPAa4Wq45DDUSF*$99y*&0y4=G-XoG#Z zKgcfjYi$9_QfYPs)ox&qaDQCaXd01bg}{KgRefCBip4TKwFZzl#6>T!x~PKnZM&Bp z{WCQGA_uTF&iSM+Gz*zz`MhY@!Cu27GZzd-62iEAzz@{)9Na)PHG&h?0Z)gnazayRZ~t==`|7+emFlqxgdf6V6YpF z2Eg+%RCJ-XbRoOfUVn?yr&wRH6)^)mI(cjbN3;u9t!cM_k4*s77J+Qw!NjA!m%-I6_iN1tU@dGyLF8k$9o-f<-3{pl{jcuj0M7th0pc+_&|hAb zp01*zQ2J{reyFQy+0tJRcnMT#qMyRhWl3tO+t|e9j4K14BeHgY(tqqPh*-KvlIX_d)qO19YtTMV^! z3v`UHy$oAC6$*E7H=8d*|EO#`2ml}LC~#CY5zPB=4xG7qKO*Ux8`+seQcXUwSvnT7sN3qY{tc*%GtYa^>Np%d? zxgXP{TK`7IiO-#xCq735iSxp+P-LGKn&*A`THta#_rYa`L~=KJRu50~xy#tmt42`0 z09vs)LN2J2p=Rgv8J>gII$?!x5Zt3;*a*MbWjjvTm5oKks6zXy%X=s8UeYba!EabH z(=Ba+lm8bB9&*X*&?sbRp={{LZY}QA1_SK78j4{#y_C?jI5<6~Sc4!m)!ZQ&0vKsG zA{M~@|KJHbSC&ni*gM=O2D1&>%d77mpMLiFh&>!XeDm23r-r3OLyH3$9=X2|Yxd;G zujqY)-_CVuoA;8f31i`quj(p>9--u4C7<~sl+cQm(gM%VZFHwCL{;ZR9De564g({9 z2f`VDNS8544UC8ujrztW0c~w$c8!Zri-A`AjHzo0Y}V)rP$AD0HLZiMuxRg^_=ze5 zX-e0O^+28j3O7|h(wZ^d@IyBF8^@bbo!t-;?lEfw7yHW_55!fmOe*Rk7~z%=bFob0 zyxEJ>`UwRnik~Cbem&*rG~Js1B_T=-l%#8MbR+Wz z6si{v*D<)pIsEQn>*zE{A_!ZzsO%x@cu0MY0XGO#0QDJ1Vsva?X6(qeVzVsw zy$W*RFgq+tyGuqNb+d+Gl9({#M~sd)_o^-NHZO`GJc%9-2e<^+X?Yc|JHxo>;VO^L z0;n|#z6wt9&qw(6li|SahJlSSdK)h<(T{L>Il>*&;ue2DmI8WPwzu`Vz%4mOe-Z^h zHZI0HgTieW7AUSy(l}NyrY-96rMXXhsW*sGtAsJ37{0t@0Too6*;Tt;Yi4IEenE}n z4pP1()5$qL6B?f_ZdTr5^O$z<-4k1En#KWJ%NAALD^YHGTh?JGPRL7(g*lO2%_j-E zmlt6fdE2oKH7SfXSrFcd0~7FyR;#Kq z3?2oifL}l`av@TTm8M1dBoZ1>Cm7wfVRuBqfp~bN8Z{lj(&C-4N>@u373a3JxtT4i z26M_iH6gNX=}6Zo)>KPgRqmQqC}O9hMxX4kAicq0_;{VC(gdzK)m?TvU-uZOt}`4^ zn=~MJV@l8R_4^p%Q` z`lU9%TL*8-D1BR(v1e6F;3xl#x~qKj=uz6=Hz7{e^n?OS6<7Gz??d|TXjryhYsXX5 zEF>*}ioFob7Pq1kKe@MSUfw0;t7Ly#O_UB>@h2}%wAI`&~|tyL7w5v(!} zd=2T43ppM571?3L%~8DCCtWMG_umd+b z4qoWka*ibg)s+zqqW}bLW}TsmR5rBdgLmdoF_3}k(b-duuJegL0A~NT=lM{L)c@{? zO%-#@Ube`8KJ`vv!HpxCS;ZKZwV_1d*M=py8ke*$O;40O7K0eghGs7GHj-bL5$0ur z6>!8nl#T6hEIc^xuSD(_ZzX-={!AaS4|kgEQZN#q1%5tff5nBrU?V)ZtajY`i!V8) zg%oE_EAIv!T>$}jTa-y<)ln~jJ)d86RIE0u6?%rudh*U`OFSK>Ar&exE#ce2mP5547jNEr1kE!^!fF!Q!)f1l*y!4Z!H2 z&u`N0G4TP|gf#iIEi`x|e$!?*N>?=-^y9kox?jj`l zP~nlZ%k=SO(Fzj9^gO!$d4nA<=Qg>vhSO%<`wAY@qUq+ghLEbXxw0Rp@8O4*6DUT??(cHwdE=1gp}}cVO!)&_}(7pC;%tgS`7aR@}FEiEDTp zB&PkQp5kr`Q>v&1D4)DVnguAI+NFF1U$_*nOYWj&&ve?AgER7i!& zRJI5zI)%o;`#NaflZy%F54X_JrCKd9&mr!+$62{ORuL~{x=7#hK|~HSQQPU_=s|C= zz{5TFe0GHyQL_Acqz}4R^h?b=C=Cv;%5;7hq#5z@Y_&?0EUr^%d5t@mNty_}!v2-J z3IoDCU%?@;^}_}#ry6M*;nW{;`cB}1jHq~K72g<`T$#L!NYSlHat9YW5I(LHoSun zA$Iic(^l_3b9?u>1r2%zqvZs1!8`o(ivRq~v_7FUI(Di$sPGlOhHlWPI9uKM;PB$> z5E?stbn)@f1=^h}xc$pUhBbqy5s8Cq!x9 zW{ibv#nJb+e{iLl7nTL)hygC4hT3=F!fioLT!bfry9u7P%_pTh9fR{<;^W^Q9{=?( z|KsD)gYlPVU;jsRbZ_$J&Aa0ZojQ;p{D+hDQBMi7f_= zZS(PZm?2+eP&_R*IyLby9X#W9VM+-? z0Oy;MxzHhNPO6o4jiBE^^A_N>V-`7M?x$@k9qMU_fciL#LrBsC%bn2c-*xEYKo zl{2}uR-_a)JY|3xtD%6*>2ypftfRlfKi{I%!EHoPbk8J-b(nyz&t5VEMh=|Vf-&VE zfA3TVtW7jNKA3M-6GR(~;_T$%d+$c7-`&l~vM6eIN3ty@q?YuIYs!}qGfL1r63nzl zQEQZbmuE~;&s0$-yC(V*6N*Sqhna<--byPv^I9@&^~%5y_Y7W4G4aSe;Mba-&0Kgu z*g(|%Ql!1<79GGaAbi83`YIXk*g9o0+yj@QoD>X$56od<}?Ld?;6Lca<)e=0jt-cDIScx zY@dEM#;kNI!QPbQMaH|^w<`65VzxjE$c79^$j79q5vT4Y)&xsIa!W+>4KRCPMktfO z%p26S#+t4gz<_bm33Xb5vjXH`mUI3}OqfS|Kp4!fNcouhMylQnl|r{;7|R6&no2Hv zgAB#Du-=I(j!>3NeiNV$Do>N+;PK?-)L>~&%YAzFYZ(nC2H|0Fv<6|{%s!;E_Hoi7 zR*<2*1~sL?5X7M*QzmPBOQ0!k1T6P#1yTc`!(8Ly1#rYDfe!>>78zWUsG8L8bjl)i z*kdoLk=ikfi0lZ7oB7 z#WVR%S|Y2*D$=Yr?bF*B*v>wamx2kT%pgN$&~p=n(=D`@^Gyo)3FsMAV9x4>^Qd8A zo62jm682mbT{-TagB8H}Yn%L-x2WpcN z&9k7jJ+O06vvWVQ!3K&YoqDkSb0gFG3OSt0SwFteUOOt1O)4m_rcF?S|?>{HI6 z0DM}>^X;nEvUN5LVbK{g*JX>~E6wkd6gdOOd0Fn3H(<;={q_VGCFsA?UAgQfU?dive~W;&91>PIDYT(yT;IKANL$pUpJbH8E>^cSI5q_aG#Bv&pn6t0-1rzsf@ zofJTyEBQX{vz&OnK{negD0uIT2tmprQyq@&N8r- z8vo;NX386U?cDgS>`@}CZKH}(efX>|L?uRy;XursPL`0qLmPbVjA#9ifLBU}AUeEr zRjg7Z06M@U%g8;!(~AH;z16_0Yr3{TXIY%X_q!srgZmI=>?|bi+gO_Kkw}#3?No<&Z)Pc8PBXZQY@x5B`2w6|6i-&S4Q_{p&+&ymk#9r&vPQ z?Peykz&3a0;$zjR&t%~w3gYgP9d4D+oh}WM8`V_)Z0%AVQF=*aN?G0b9C+`CwrrGm zHqu+-QgX6gwl`u7Qy5q?$$U(zzr`5etAbrr_shbl&e`|(%`%C0V@P6NeE0i}H8H7VS9=|c#%Jvw9{qsKTlMh#h z557rno?w7_`QT|>ZJ%KmmdhhKQ*=x>2Ofinxw{6tagux*$)|DCYd~VHs3*-kn>TcdN_zm`rux8imlI8J=RLVVm$a!pQ**z| z5606rFoOQ31q13h1R4AOk`jPLY(LO<|8c;-+NyqyNzy2_T9>ZWy69BW2bj=%#5ai- z*&3t{FObZa9bLw!eb}S3sG9t)(W#C2j?u{o6_kD*M7HnMtgGGpb5;8yKt_o%s!F<1 zCbE8*65PhHJf~DT20Nfjx4XTY82Khw+bVycHC=t!SoNd9=!Fp!*HwC_f@*~KsUtnA zg&s_>UL?_mJ1*0{L(79DZgL)<3}nM(4q|K?8#|-!qgf~g8*}ueCiw3Dw^23qF1L>CQYKM!fa6PN=mhe!3G@s5`aqprQUD&Ew;`9e1Ez z%QCWt+M>u9)%z&kf5@;pb@FByj$WbZCLsF*??cJt%E%C#1tq7~WkE+BDLs!H(>nMn z4lwHQ?EIHU7xy29=f8Y)@$vAhKhrHp{^&`sSHO1lnaUmK8eX{CTt|MUpK{s>f&QUt z4wD(&3p!wXqBsp?H^H3bC-4Mw8Zm}OOeb*N&I#o(zHjIrLaS@5g;aK2kaivjTI#6J}7rZX9$*X1enWC{&FAVH#cDG z-{8HPKvC!b4?2j5R(Q>jT_BKL&z1#=nie&Ct_!p!Jo zn?B}I2WtCzw#6P6%Z-X9N?5>4URr$-`vDJ$5}4}T*3A(ViP6e(@s9Nwmhbs!=V~P1$BLoBwXs@MlaRBW@Q1Xp`v6()#din=R=)AUbsk zu_(@T;$>94M%Hv2#05G;k_|;0HS56xqFEuWA6v=K&8#(&Nx#WX zvj=~afu6O~$-K|4AA=Xmc$Q)=dl|XTO|wr|_DC1flf1ntvVS(SBi{DoJ0#pZT|Ami^KxzG_)u@{0aF86prNPEEKpUox3^UX3) zQLE5JIoJt5s~qN!7mG4o(CHcJ#O2PkXV~-yc~D#*hyvJ^Tpdx>Bv|)3Q`!f{92D2~N(;do?hk<*cn#5rC^_6e2H^J+80 zP!Ql+-NKZIqhemR%HgUWY)L+6HP`lN@@JJkWKfz9CRt6e>?|^3d z4!|)kZ09At1Chm7gV^PDPtI)1feH|#Ym;^luhVo%K|Z`g<7)i7z?xNUlfDV_u{&?m zhO!E5IL(Tw?E4``atLm0BW9xSlc1kJpdSt(Dx=@21SpDKNa<(}?0IDN^*wEp-`}I- zNka_QofK_16$*)N{|M1thckp6GHTb(&Gg=(2&$CmW~J_I?&`ra7;hN85kl8^%zMH~@IH+Zr=g}A-6;wk_;klc zALypv=hqj(JD}FyqPy>tXn=LWN|KJr?8K6y0m74q@*2o`cDROTle=>O_Ic_rh{>ZM zKvjV`HifqEQI{0V33c6H2Q;$c)Tu2NdLZg+5Ye|OZ)T}8ZFn;agfLCbQqgH3TinjmF(=WgPIZ0$MGO`ZqWpXVeOmdA;Zg}>- z0}wG+zU|AO&_i=!xiMnrz1vLH?|tjGs@^`mVwaK|fqGW2r}ukY+OzjC%*XZsI~^cM zyFAf>c|}J*`2Xj&Q1(+7yislf^_{Irc!udj!m_^a@!GbVunr8kW*PY-aaDp51#0GO zt5hz!mSn3JEoGk4F%`(*#VJpfxheqD7e_GfU`HqLa=OqC(EQ@*i{R7K&w~g2>C=bN zffHN~2=*9>Udl1|96H>7{v=g=S`H)Cx9cn_%Ebe|gyq4VT#@F@A^v*eXB;qk&|NMm zuFl+$dL|iAdY?c3;pyZbPhY-z_T%%(%ct&1cFYKg^zi8X&F%5U$HO<({T-**%fXuv zGftji#>e5;2mmJO(fKb!tUmk;_DY;#+EdIKu>5IJzn3Ikrq_^;lUY~a=qgz?B-;EvH06mu9_onI_8qq~kcB9i=W# zPOCNrGbYv*Tq+|zdY7(^oS)hSS52l{;(+J)Ps>Z(lslJ8U`$8VuvMO}iC4RUk-~w^ zGp$=*19hV#1>%7!tAYo@wKpfR3?JvM)<~vc&XN2-7`a!=+bGe)Qk6}gH`g?L-JuP| zAht4HfdO|%dV5KgT$0lVPInSr;}$g%Iea+L@mThuJ1Y4hl&2Gqc&M+Vke~GauhX2& z9ZlAI6P|K^D*(>GsZ7Mv(WX7KlnO0q>mwR@P8*h@r!E&|iY?P$yC{~=M=Q)JC7z?< ztXp^;VndJ;F4~l83ejm8E(3Jbyl-xwb(;*$T*rmSFjYG$DiA>cL_aWq%MN#COKmhR zVr|4wa~mt7N|)DXAgaxJP5D3n!L9Cj9O8&hETaAq*T*Y7D**EA)dXc$FMK= zpr0xwh1zqiwAqiks|j;d4kpd@W0Qlr|3ZvK;CnR3v$(9hdNBp#uxo4Uab2gYb;n`@I#n<4I#!Z@Qr~~x*r?&(0=~jrdD))m zGWxfZp|L2xrT7oEWu*qgcfMapxmo##yCX2CZ^8p2$ zc|n6Y&H)UwBs={IzlhS7D57Rs5C%Q~?Nbjj#bX`#Z*IJe*snpFn#6OH>eX#BDtPFf zydkfGiOz-!B+7f)bCMtq>J84f+8D&+D`1u&yMr+efXmeay3g!3=Wk@piM}sD_^5Xx zTMzjUEs~(E4)jvUBzta}rxO~mx^F2Xs-DZHFSJnXj;3Dcp5unJ+)L^nWRAuB71T-s z-^k2O&b%%0`k*NGq-@`d+#?$*uf}FGP&Fp4*S5Kv?iVq)$_kCpzuDD}B+sR0JI(b2 zszIx~qDnS-Y|?45y&iuEFrwe^hO|1=9UD4&>)siTjx1u>H3FH|wn;`6J98g;$biPt zGvP*SP}?*f8$=lfWaY6uTYd_^#Pa7=>X2BdsWtkUTB;)ocAW5~*OETmxbU6*_Ip-pu2QhbraiQZng^3>pg*=RwdqHjTB}jF;5C#Pzi|v>aqNu=RV?vd~UkL?Y5L*+# z#`~kHu&LcLvoSMWxfX*SVw0MWrbcCx#QUCZD2;Q2bIj*Az7*n0F3tRYY0YWm8U4sP z2?p+hHC$eKVJyCXz76ZB$Fnjqo6UKw-II218Uby3yF z5)sKBA4~fa`S0}F!LHUj8hk4KfzG^DoL8Jdu?nH7;T2f2gRNJqu|<^ncZh6nq+uMniRpRcq~pDEHFpf z0mscQ3LqRX6T{;&!p7)hlHQCla@Xv=5e#Zc4|8F=x7)BjrEY8Vd3o@0GMw^Kx`+9e z%qq~a!uFQ66#}P0Yb$^^BdosnvOUjZibdmdJJ6^z8Wo@2C)H)&gb%wK9qw~IavjM@ z;~o^q!~+S+i|>)zFA>mn)SB?YUR)Xc1AqLvetDV#!VIU*GAEa49n^=A*u@e0$s z9{-4-oNAd#`K$%qp`NvrthP7SA4qTnYYi_8S|`&l@gG$2Ca|z(Zu&HQST8;Ebj#z} zmEmxmj~ER-*(Dq&1O*|tTo1ONBvY)6sbYf{D~V&kLg^j$Ogt0hpl&@RM?t2$di$Yo_9Bnc`}<9%suef-nTFIM)2QDcD63&B4Za~TCBpHv-hIR;;=|W=EJHB&e?~fgTs@H zL%+B$SeV7^;PmA3{OCVFUY?#`;7gb{c>46|;2;g9WI12vT=J{{99S{uEKOv=#FR~w zluMRmEMzgf%9BZ{b{QQ0UM6>83Ts#)Xb?tH>EjAqJ!CKy*5AW=DHfb9b1_NzLi)6C zvRH~7#}zo^o!U}6V@1{7tUDTK99{2~uCnT7=)vK40;=P^J* zVGAZx)XH>iK?3;#g%UMrDsrQud;Y&j|6clg%=dlRJ&^>;0Gn_&$wi4e4r*qteChv_ zi44>`mZ+@3+5axTKRpS4Iy}EPIz^6wCioyX2@(&IY$~qCdmyEV6xztm6_ek1RCwb7 zgAXX)+m>oi$|Nn2XxNe8FH?~l6QJ?6Eck*5fUgA*iVPxH;c}U-aqeB1C!&-Lv^a~A zyplzjMF6*&FkXgvxF9%Vb_o>V69^~=28eu(cqs}w18>1|zjqr%#;2A0V1GW^gda{M z{&mgwOymoCLGwUlFaX97tzy^nye24cEZ_uCTovGNaK7Zr=0q?$C6axHTxbrO5y=bJ zQzY-G|JhkNNt1}ZJv-8`D+VL?0V?sg$<+5K7Z}n?KXBYOTje}tlqr4JA~e;Q6&YNv^f)n(W{4cMA=)URfZJCv361kxWf(p>1_-q zMHXOeWucvL*GC~3<)e)G;2PM*hnEl_BJgk!7;+BLC%LNtqF(pg6;O>dB3u+uUdUAf z{>kz{Es}9&Ta_x?(RB8>ARk%Laf39w$*%y2Ut3I*4|1&;leS`?Z1PW941`SX^Erqn zNK63}RPY=8QcehnSDdLxmEgp<(T-J^p@qx+_hBkG#j$hBH1xtc!K~wy$iW*omR4U3 zbJ309Mne|26zXjQmwN5o66dBJgl|T!?7JuoLdM~kk&5O zPizY@;^}g%imdhkYQz-LRJ(N<&_vR(0KTC@y3>|>(m4OIPdi$qkUCs7EO8efgQ8rf z;J^@%`a2-hbiY)6IaBMX6w@;?AV+h?6U;GD9=g`jc?c#Ott6&`_VJ^BIm84m z=L>Pi`&R2&T_;o_p&U_-6Sx{pqW0!;F3L1UcSMCGhy?13-T=f@&6Yr+$k2h;btPbO z{PyJN{o%!>pJYG^;Wh4teEQ6bVmW^PJQfkC1eFuM$Y;+hXwRi6^N8bje_kxo9oQG# zZ7h2k4>@L-gHKh3aRvmFhJl-8<#MRZO_sTupvv{ETueYB;L=y%&ZGqj_(281kOH&T zep<*=eg_t+R``rLVT9GJgG<766|QYCph$p8JO(5jsq2+os>Qgi!4=^AOgf_93EbR* zQ_OP?&H|9v5aBOo8xjj5N_Yv0?{FV52aussHVcF)e1^;=p9*A|R~{)BzSeKNI`}BS zLu)y}g_&ds`lU%|p)>~pSQb;;%D}?p^ascU#R@C0Tl`yK8CDa4jJ$&iDkdCZ(mcE) zp;;h$#bBuQ#PnWCRE@VAnQ7r zuXrkVH3X}>#m)w*A%VQZ5s}0G<+@1RQ;g3BC!qDgsH7q^mWv;$)mrq ze)jQoD_Gm}ewK&RqQ&nAH4S@>6$`CIrOT)u9vM=S{;2pVWwW;1Owlqgv$h5`C~E7) zqbTZ=dY8&invv5Cb~d3ko!FVd<(7SO4eT}sbqQILQj?Awa`Iv zQ=Yjr(L?oqp>lEje)a85-54>!WmqSUpERe=r=3E5IfO^x&<&W60`eGckZ&9sm(p?w zJ7|AeuV=6ms6fiGxGZ()3#uDp2d9!vW4WqYlMLHj?zh8wmgU-vSF7Y*jZ}wc`&!$S z78!LjXF@#%)8}eSM<+TmZg+|sD*KA}mb(&W8(T|Mr-#$(cs zSLxx?m3?eY=&5cObpU`XipMX;H#hyUg&5bPoPEmn36{M46IlXMfBglFskElU72v^* z_c$i*J4HjEnn@L~ zcc&N6e@?PktmJnzi`F5S<1k{U7Zxjyrr0Pz5mO(u05LPyibfu(k7~~u)m9Y3?1jkf zb8r+XVf}R1U#_33b6++2=~M`MhnJR+lmKtnbWg=w%#Zh>vl zp|q10%5n*r5sx+YBD3|2(FrCd&(u6L>nd1oQlRRAR+*%lmOJj-@|NOP&%IA zv0$;{yp{%Fuo&7{H)%{}nZSE5Nv1CEM0AAMAj}w4C8A*sf%MK$j{2Z-LmV_Cj^rYg7NrxYuFjKpV~X zn5W?yh)+dGdWfZjIRL}+Z98{s9*+V4(PQ@Ss|-kk^i+J>zvN+whLKSv{J_2wLnW>Ps#GAu;dsXNLTGB zgu-yz0UB=~f_~b?>7}_++K8Ftq2pwlDDMLCCF1@@BWY^1g(dX|pv`moZg!(W*7D5dXG_jt8`Sn)5-ju;%~JWWSwa%<&RCLcg;sGK|c{4x#eCKKe+ zIo?|pS=UpeuGV<$UR&WR%6?t3`7aic5=vIpW#7#k|x|mBb zh`A~_O0&$4cHYLjQ3lwV4K zmqWJKX->om=4q4}nQX^OT$`Z-CkG zdJNhE*~^Tr$-_@|L#Vc1>mnOIdiL2mPQY_|8it2fV|6p?j#JaB@A)Dq8HG#kZn_WW zI9{WPr*HM*U2aI0yV2Xo3k4u5hSmc66q{b{Z{!nSEQ_^O#&)IKbDv7#yGeHHg5cG7 zgoSzozIU^Qc5efGqqxo5P13H$`-Ra9vjgMgw-Tb@}<7#YF*IQ zQc`c}RO0&D>5D12Hpjt72)L=OzdGz2rmu|ye5IK+A)ns{#gF6fBG`H-ZyPVxK&<}K z<#G*nBbz($a_5;;|NLG2A6qD{_GHQiYnqV}UqX1jA-TrRSq!y+wP{1;1Yr@|OgeD0 zX&TPjVpT)Ehr6F4@eVT@Qm;q4zMxl58+qHq(_Sgwbh}pFxQF7k(jUv@8+p%GDGM%c zrYky2c`!TaD~YSB77~?r^xGVDldsP6JHPIMgk2T)P!nLMC>C6~b=?~2wu$Q8!c`X# zu`a0ELo|PyL>tnPhGe?PbPq&#sBcAmgk6nki(?ZW;k`x2*VFuZ-udBBU6QoG9UXsv zilJ+j3*ZVb zkM)lt$j@8y>kSH@2naiD#U1>uk+fSigld*7OKk-7cBpR9sh^lNVc?IJh-iI%-E%MvQ@6aWAK2mp=C}gdUkhUvU7%%j;QgHil3!CubioZ$4f8_W9=Hr)yjUTyk`Dlw47z zf!hLj;IT|RawP?FB5SH1n9^j;OC?V#DwYjhGBRfiEhPqu?PFb01BP6Ocg2!qq2!w6PEitY_P_$( zD(f@r)-h>RW%UDFfM3P3Fx#4G&!I8A3iMnQkKm}WGe_b4lq5w#tEwo-l-#CZ4W??v zOnR3j;4xBgT~r(vX*H7BBq8wO3nC=2(_CmnMaf38dv-=3ED$0c0e*mIqXappm1aq_ zAa76a(3_Wkt0nvqxGr=!%iN|H?|^55{o8-E{TO(&$H>-#w+n=#o=$Oarww&NJ`W6ZY$5H!k$yzgM24Pc*j z*}VhAKIB~&F&%*HPV9o;4`918z5hPDE*O%duK{LE43esk0bVhLi#`ORB8J$Q8-Tg> z0R7MT7-KgC#7MJhF~)d+yvORtHX)+osKU=I#1M_5NVzcb5eva~zqK`IvS>s(`Qoxk zv40w_Y+in8*&)EzUXTwdbj?b>;K0I*kq=4%2^J-nle?2&JK;SXF>xYw0r&wWn#w@H zTjoeFlG9-nsX=_9i*&-=BcdHyM6P)w$~6tCEpc@0XtePp<`Wy zGR)>)+rVYF5%iUHwrA{>ZUutpJ&Bl#wpDMNcgu3bC9|p5-?TikL&|hq#s#DRpSvEb zxRwHya9>nqgtCu8qp=k;%aRUPr3n|_WWBwh!uhT!TjJVeNzn{H)&H?pUoNc%m< zQMrBwe-vH{&wk{Mf?L>vsVNo>bVC>sFy%*FEM#OizYGGT&vkCU)+Pwc*YvA|;B(Jh zM9(nC?1XyYI8V4O#VSTY7Z^#ZIQuOI`alXJ6Rq~LISBD$YH^tMFR(l~DIg;_t$H@_ zL`i7iE2^mh8W=;yP<=ZiMH*?`-6?hk7_t^H%ew@*-^va#6m-qdpM6T)NnEnTd4Eu# z^fdj!A!(W4N->^q|W!ahG|@#Qmd{Zw3j?)DV9| zW-PPn%0|2Q(Fl5$i`x3y-6Kv(s$yNYz&lag^$D&OfsPRtlktoN*qv46}R$eT-Z02lo5`qk_BQAmNAR64! z4TbfRi>mBaACQLuAnaCTC$7e>US`}v$m9ib5`GJ=FoR`Iln*w`l?wt&bRIoan>7lO zyVO{nVortR6wbPC#E_dqw%5~)_-;lCs|%suB^WPol5e=5EX`~04^KZnjx?Z|dC81k zO>_S}#by{L&{}EMnt4~u#9pz95!d-=CMo9=;Xkj8B#t!*C{iFGs_g%oXB#`|8|gdg z|1Wb2@Q*n)7Tx<%t9N)3KOtFBJ^fN+v%Mmdq`gZfn{)kDv1)8)Z`GJ0o?LX*w)uGr zsn^5FoOETS>*;;EYGdU95!kQC00aTlS~%aRz*6~8(6te%a(#T(dq2MNvf}bops}+$ zyzGokN)It_Wa^5Xtl{-tSq6S*tCk7eM$=Jc!MVbe zxoxCc6}}_0%X;_^i@ofizHE(R{OI1qz(vF4mUb268Zv+5hVjGv8yP0?UUrC=MqPW( z@39|~ajm1OQY5J)wbDhoktI3;d>~rI7??!=yvs~Idpfh4_8ug625Tppw&7o3ibib_ zD1@>{f`#6_%bK@Xy1bJ$*!2EQ0_-QbTHl9L=|0ZP_{xhSb z;JQkKrcvdE!`u?c{jUoq>yzfj4!t^al*UVb@vca%h{`Sy!Fn}?zR6@p^TBh)vZH^F zGn?gN&C%!f14%J!&zIG{$a5gNr{#VmQ=>ztXGI>_2e_<$;a#|Ii~NsBL&# zV}D>bo;F!lR{zXC-gSVf5jx0xD5<)U1e6qcwQFeAZE#QNyJt>EdI64E=B#=Q#9IPf zNy|3p9h`v|!+-7IK2(Q0RX?EBxnvCV1a3FrXAe89xnU09_Ixt|cs!ojvhljzJ|6DQ zq%QY656>&l@9&?Ak7EAfgr=uxy$e@Ds35TeB!SOZ2Xv5bicKc{;S5Jfstp92O;W2w z=@7xN#B`OVT-q~cZwos?f`-7WW}Q`Z>Txm#GXnI&DjY`Q^b2Qmef<}0+x`Gk!1ZnI zYBR6p>pvlZBQp8%zrWv^Ny7i?m2+K$?kfL%t;Ek8?n^`b{dgGr69(yG`M0!IEa;ki z)^$-eba9nlE>FFHf)`mjNSHUkI_L*0c4xW~oz#G5E8;5muTe9Qy7G3 ziQDWAgk2w)$^X4ONSnL1!Ru-I-tzO~T107DeG&^H&ehpj^C)VL<7A;q;mO0%?vu3+ z8)*s%`E0qrkoylLJ=WnH#*e<`16g1r{P!$|;14M`X64D#wjGifg~}K8n<|^7v1hw* zLAy?=yzg^PB|s(h9Fn7M(yB&f`Y6ho*qy(#Yd$;2_AXyW7b7fohfE#u<1|tChi~>P z_ka^bYs-XoG4hB%q3ooP4{2Ubty3cgM^-q`7$|7KC*q>S06lY=+l`|;MEj2xop$7g zo>UrBo_K&wQ+Ma%C7{lY-x%a0pOJ*_H--kL*s@iNpiDhgE&nrxo81^)2?-8@2m33+A^V??;rr$}9F?6ED`Tws4V9en== zSY`{cQawnwv%OQWOQ(L)zWpgus93*h1fAZMG1e*>h?B;93uq_3@cgB}yOzd;cRILQ z->(@||Gp5vr>Bp_Lr?}4E7q!*!?dd${7lo2kGtF>35SKgH zx(+VCC6ufMOZsuzsF37>cC@vq;C*tNMzh`Is$nnNA0d?EYQESCX-N=c!OPOO8A6soocFn zL>BI^Dy|N>Mpfk0Y)G(*jj$EgU&tpFY(aY=zgtyLbb#doPQ;wD)R)C(>HiwfB|0AZ z09eif1Ds%k8c(ex1d zBxYvx^?Nzr-_NdH#p*`Hl*b|11oh@yM9lR94r3Zg72(er_SR^qIr`{Mq!)7KiBIqx zY;YZ33Vp%2uf=P)P8nK&Pq9)Uid^8>oV{Z~>I8tjenTr^%QQ7u6dJ3vn#F_kESQo& zu$Av8U=r**f+?tNMorocVd!!+)|(%6;jLOJY&Qe}!Bw?vJu=R$4_{CLzeQX-FaTT& za8`iG{-OrcA~E?D=`%r-xbmTmZ^OrLZR1GLf`cU_%858M5GEu>$Fs~x`yZX=MjV}D z6TQ6^#%EczY=KPBzgWw-BD5~+|CX6U$+*POss~zXkecHtuuM4yT0s)oFPFn1gOT%n z01{W$Z%JRoEz*bf3&q4?LJcWicAR;gS`d%VZN$Joud#GiX#f2vk zh+Ku`P*E$)Hfgc4;V<@_YK{+lE)KbB;!R2CLi&le%>l$K92+hPD7+=|_3Kz30gbgH zwHiu{svSm%-fx&jU`z6iTm5rHn!)ei;x8bNO#4RIemlkA8JNB@Rjv$w3EsPhy}Tno zgqja_)(VbN;ln8LpnE|YzF|u4sJE80be{@#>(974NhirNv{m))4!$O55VcR85I}zf zb?3Q2OokE>P2eCuMYOl;n2^ajId19w-1`}N%?mmUx=T89S}IPW!SylPp`(j8E5@qX zQGgzSqgbI)`}fWCOq&_9X-+!_&H@bxCLNy~SM%T+;B15cPV^C+p~OhKkgNI^p_}Sh z<$q_T`O03k)**VphZ!|mu+C1lfg9zktL%tPCrtBKO%2&F1{=pRdvvFvK9Io))nmv^ zApO}|w{A)QyCFTrhJv33%{hHd&V44z#{mH3%mD*w9+O)jNdXg+gO_HE8V+q97$f(b z?ht=ZovoO6C-oEnM%z&mW^QrC0dmUzigx6_NUNgyx@yy^ zN#2wJCfSE~O}6-&O99F!k4fCQFI_v8Zu#0Oo_M7>_d0|2xSCzpS{$t}9X>T~CE1#u zc)Lznu&$~d73N@@U&EV!7QjG!ro8vveJIsSOWH~2JCNHbBXw~31{(<60 z>w!&Ovh~-XAky_Xgs1n;vVifl+#?wXK$mLVP-6?v2xeikY(p@f7@~kn)CFrrJ4Q&U zc-lxi^y-+Vu+r*wVwXT-GM7a_3gOP9*-VrE6~q5Q)+ERtLSmZXz=NX!9Gf$PC{cP~ ztxHu8s_HaWTDj0aCk8#H>NvyYW+_ydz za&oe%^J0pXHO?~COb6I+m>6sN)tzi`?2BIJWt-%En?5hY4CZH0r7mAHxth!xPx;F&{iN=s?DsOe8+|eikFptwP}LCt!F!krf!s%=NvCh0OQ>X8 zhs#fZxou31r%!@K*^(F9w2&|&n9Jw=@nD^#%A7&a8@N9x&kviR(8fF8pILoEi}j_s zahQp2JYQnIQ1^BmCteqex1di_Lj8@*|E7Bb4m)bghi*93LjMBSPZb8U#u=82hG}yY zAMJx7!{xz~ZsWF3G{p)FBO@b=_DcA{kXehRhBb&1kcd?}unAxBBK8rzAW!jElsm&& z^@h{*xGL{8tbALLW~wL8kJHkCe1CE{=H&_uL_J53JDSOz{|IOGm23%Rz6Vr9u@pa| zjRH9u(gt)6X|cvR0geUMeb-Pf5PB+@!|^)9F-c`*Ib^*ble&0~VS%{V(!*f zNA+&i@FLC6NQizewwQ9OER+)}$HT2OuLWE}ZM2UVC*OPkyl%et{>fE=xt|3j%F0-9 za=i-yn@E%@22z$Ck%wR0$ASFies1NJ4F$-_)18H<8ygdRMI^6iPUp$`&)ZCKh!aT- zq3Hm^=fY02^0j#898RaV3`y0B4$a&mAtJ+#LU#=~X~?}8BHqvZC{<3gJr=^qnO{w! zfNM<%EWdpm&lu~1U`ELh@?|~SlM~O$k)hP;)66KMry^+Ft1$%I)_T^Az@s!HV*OtN z`HKf<`|;F#YSbf{$_{#LxBB~GcnA0sF}Og)4Pnbv zZ9ywi(iRvYke157SjbSOWkjk8X}J`K2ke10yUqrm>JQD`^G1oIg=%@v@v@y~9jKE+ zZ&Sz$;@o;7iZ;}!UE9IH+!y*V*BYfs?AFfBN|=y7yXXVbJ!cAQEE<=r>0z0Qu3l0n z@2zxLr~XJdxhjdd4GFhf*vL4~YxQeo^FZYXzB$kOO@QXjBptev0OU_SgsjDOwHp&k zK!*z9zaB6E&0@e$$CL(wDz2O(x03P>t)nf+Tkn;^_Ss)9T- zfxVI^I{h#cC?a<}Lv5aT+Xp(mT$pJy=nWT~b$Kh7a2}%e=FndNo0L2&(tAW{1EP`$ z;{EAaTzN@v;;Nzjg*CU%P*n2xJ2V1?PZlI;!MyE!=d{S2N;2T>#7W03IS~3A(7>-N zO_g}+05))u>LwLgbZ$Q2GE=3%djNP5`y z?L@T?kCB;puDEjaYbP+n&h(cW>sF`6Cx-Q29G>;*?cetg@Li$&pFvPOEyD2+$`TmufVCI|k#>~#D9t$gIJA(;BrBs1@KVB&{ z_o%KB%+Ob`8^FK*%t`sfpP{`eI;sd=Ldav!CuJD1`47OKM`K^S<-2bHgngH9?4Yh{ z`wN0#p{K*lbR`U{PaVD`*5j8aGRE9BPDlRCHp{T`_#M1IdhH0z5-Nu|#cl-eNDx)u zxpzUK5agP07t84jt7wuUm7$J43kcNMdh_+YNKO7#SJm+ZY*gUrPPdxLKQ}uykP!j} zJM%J6x4=BSw9-F?J#U(gy15DV4k_RX6BKjGm^mI3#27YyI;3?PpNLe#-jDOq9L5*E z5kN1cMzq-r6&Wk)D5w|W)W7Q#3@uWA09HPanMs1@J~&R&_IY*EHQPfT$Djbt3U{+Y z26p!U zEE6Gid1slFKIa#z5ODeyXKD!tK{wd}m`buj*e;^-bm1OJnG_yVCS`=L-du6`It>kQ zwP7|oa13@n{iIK0{eI|kPp_m&x+_Rep_qA4Rn8v6dA$7<6Z#6m$F9ILOr8(8x>adklLra9QT`Hl=iE8ab z@zF7 z^y+c{MbtQLNKebM`|WS_YZI=OVV{wClj_;T=YU^72MaG(Xqd8%e)^3KxP{OYz}R9)qe#6@W4XU+Tba{zydsw70-)z0LX8U0;0G)qf0&Ce)I{RAhfP_l+9{ zsNM-Z92ruDdQ;4BP`}5wImNfQ?76ywm<*e6Kj32SatD5l*M=r3*I?)%!u~B%v@!9X zpG z#b#0p$ zGKW-Iu*r5-DQ%K15h;^eRnZWYK5L~8D6;l;SWjt{*=YH+UPmh=i5&xRRHulh1iYL& zYo5~-*@V+zh%ghDYsQY6S>qAAou~^mRS*Os1&Ff}qAInIkl^8td`A{(DRvKzqzDJx zKon_CMyYI_bvZ`{?Zu9`A6S9OGIC2y{Htso`#U6&@_<@)aXT6{A)JG(-qYjak(P;m zbh#)2a9nf{BrZRyuz91_{Se9XSn62uu;dDN&(3)vY)%1?>tCOssQvMaPll;NZQ6_9 znOyDp^~GLE#^GJse&F+(oE6A9=03Wi)#&RI_+iRk=bIwBkV@CNH2UR|->1{l+&Ie{ zP3`hyu2r9Ym(YW6R)v;EGi#hdX50X!JmPgEy2q>cWz?oZbHl?3DfXLdmcP;yUBLy1 zv}95rJG4%6`09`S)9Tg*v^`XYc@}|VppVPUh`JbEu2}B1rcr|Vr>#>)l$&5VOHygf zQOV_@X`a=}nFE89M91LO5qlUbG2dSy1H&o;BOG~Q0@n-La4CZWhF!D^!2Fct)xIkk zFwgALwI@*5e$#$yJ}}3pg{A;@6=W(1Ha%c5$^W$1b3^#4cULI_V)qZFIh#3GN^sI! znxO+sEpuX7aeV)aiHFDC!`_qM!ePv>9X%?euCCEU+bHF#!|L0f3|ZaM9hZteT-!H~ z_v8LZ{7;$V!8JU_C3!FhDnwnKTZA`9W{!zD7FeO|BGy^OgP2CaD4Wdm1jM#@E|-Y$E63;PBS;p? zydCY{4=T^?Tc5UceWv)Nd~gPRA!mIkBdrLazi5>G zcF>)b7u1PM?H>l`&--7`TOn%^%!|1rugbsTgI;D4(YLjn#|chSerMny?%`lm^+xt9 zXVV^B5@FKHWV(YliJSK;u2V%QsS9RzRvUbLe#FiSqjApn2rv9eTg@y@vx%HVrg@Cq zJ@6e{57cGR3qN+($%MEVVzVq7D-Anl1VcCU&47XFxhzcRoPt2G;18IG37G%fLA;`L z&;oqj2WV*JzR~N|JLt@#^M{G9Fi=oWrHxWqSO@3G$cLn3I~vkH$?b%{fnhse!m#)L z!q8=`dumLP{E_E#uIa$#bs0Npj8SH!c76^Y`@M?@?N&ZaB5^zU`vieRHo))m-i9nx zrwkBtUuOvg?tAB?2W!EJ?Vq z0?G@47KZy8{{t@Zb)5orp*1kv5+JVqS-jARD-(>=Q9h0-L!-59g|Lj$PD#_8X1j|-#hW*%xx)~+#thwr_suqSK8Z_I$FcMP?C<;-+9hgiPe2h=woJ`g&$vEE{{#LjjKdv7o!8jUDk1I zLa4ATWf_@|(;-jqI*FsA&L2Jy%1%_dt=jZ z9>1i`t{4-xQdmQzNH%W_z|R3YFjB0!Ssfs%LeH}92=_B1o*Q2KUv7*fIA0d4rvni- z$i{-!-Q&DQewq{Hv%%V`%F3_eAvDQ~wTyDsV{|&3&~a^dn1|(d`UF2s8Q=BH{b?Ke zO(BJ+7u|S^5j*etFf8=f^P^H}TN2>z!!)39u#n;`XH8AW!>)c8ehXRqBe+KyPfNS) zO~hGE!zHgRSw0|PBz*J8I{Hyz9oOXfw~VQ=o@-BOUMwxv(!G~6va%mj6T8F z-t9SH4|yLKxZD(?cN}d&4*=||CLJ8hS8~=&(#Ie0h5>AE6HKe2OX@{5_|B+QkE-xR z)pS0tL3aDeBY+*kKY_)7iZ+~jhy>yP5g0X3Yh=7Ud~d?!a`k71z6ba1wpzCM$4WT@ z6CBRw8K5@uRr#)Fd2_vB3)ms!Y$OqQ(^pZC7Y_si85# z@P2M6KflQzJ2s1x+|NfCd6jt%^V!FWbXx}FbHu43FcDI|$z5U+0U6Ui-e2ls96NQ! zSqWEhA-LZo;%#>T@+}@HU_^gMvJ_V`mzZ(pFET$9TjR4=(q4ten&RZPcLHmzY4KOg zy{ZhfPcvxp(Ys2opUy|fR=Xd8vdt3_OL1qwIn<*q#Azkmi~Dw;H@C#dngF-U$%Le| zumJ?Jp<@GndVK~gt}_hbLP$77h`rll1D{kS%z}F185b+$^3h#lT}mKU?@V!Fk3ojj z*F={fuiQH1b8#!W?cVU%T6K~IH2WvWf1&FEj7xJ~*-~}*u$lgBkrq>xkoW!{Ets^h ziZ)}?)8QqcVx;#U_9DqXdD8OD$E^9#-8OxBJ%G3i12?V`wx9jsGMxAcE^xqr5G4+x z4zh+3OQ^;AUdsBQ0K1-v!Jc7nS{ii;jKK#ODl|EkK5c4RU&d0UDo%bv69_4->wcO& zb+zo;vCw#!q@Ov!!WAd$K5bY6{cIy;t@+_tnlf}0k)_WE0_MH`l=sJ>tG>n)0Vc23nMr7(Wl_2Xm=$X;d#Xw=9JkRs z(v8>#L>x5&lFxGzw%Llw)s*U!7N3koisAYboD%&K9ezX-jp2xZT0lQ*%1B43Hu{BT z=oc@nOdv>*U^ke3&Ycg*Zr6q7?bWb=fQ4O-A53Kp%8YgoMvC0Pzcni4v31(-z*IEe zXFR0n*Bmxaw+el&d`Lja>TE2LFFBtg`rVXO;8w-Dm9k+USQ^;lTU?LcpQZ;q#Ia@y z$*TKb8M{%?MWB6k1oPm98R4IarWX&jp^M@~Zl5Z0*xnL@=X&@*`_FN||GXfX;@boW z;aj&I)`wL!s)*I0(R4uwod4P7lOJYU^sK)iwLM;8Tlw>kd!H4CAY@PtjY|V5y_C~@ zJ`C`HxRP@E>_#ysdsaeOuE{u-KJ>3xF*Gr(E2BVIsm3}%z?9FIr84OgRO~vky4C80 zXNd2|ZrjhC+pyi>TAzF2tOa?3&&_ip-^fq+mXv8Jr!qMK+#ai=Wiy}drRD;+-6{a?78Tf z%0xZEtZ!<^$ReRRlXsP>0E<_Kp5psxk(=RGeQcp+4xMm}uVqUwiG}M32mp_e>Br)A z%YL5E?a8yke7N-S0CPExXFwEn>H+R^+v=8jLl~5Vs>-AOP6qGhX^-z$avdp3J;h^pP92`P?idAeOnCo;s8FMW3i#hbT7 zxGsxkX#633C!WV=cVc__Jo&|OHY8Po4)S*Aem1=Q4f>>%;@thtG3klzFQJGB_U9N$ zxAsTAgoUvfX}hk`r`cFT3ye6^zEoyC#NhiT)-%t2?c+I&xqy>*{}}F;;sGw81wFz9 zbw0)ZijCSfTC}^x{GVD%Ge_g9Mr5Wc5SR|+g+$%tXhGc%(%oI=lsCvac30#Zp{$9z z<4Cg*XffqOW+M^U`#Kx{_e!JEddkD_a_=0;+MT*+z2~QAj92i|gctoCvHC@bba}{C z2&Hj4%p@Pul6W&(BFMjPiP*hsAHc1 zsxwxY1KMk7d%{f=v{4~3$_J0ojHWT6cWvc?w<^Z=E}^!p3=P5Mfd)P&A%kWxkuO(b zHoJPP6JOtjhAT$#FHBzoE)lpiKT4vEU2j~%U!6d>tp)C z#52o_X7p2SX6Xe-lm`JbnKhc>e>)7dc7!MI?7{4%z4FL*Gj& zzUwTM!rr?uqBiqj(-TYH4R#2|L-oBO#rMtQyrf*2uPfW8{p^35ru!X*4ld{=I{oMk z@zaXH);IAU7BDrr0o3#g)1Dia0pbIxg1PDEhg=Bp=t!|opi7$~VMCJb-_uy3p26B! zK;VKKP$!7-`CT+CJ`69WK>Ja%e>IxX;6630jhWjK2TcQTmtcE|9oY=++_;Xdu&nz& zak%PhCU{YwD#=3Ffz&h!x=*webViH;dl=1>2fRV7~{nN?ggBsHBb@76>~Nt^bD6%VcngR&CeXJjt%Q zj6K7D8tFY?J2Bxqln%U6!OZG4@>iE>K~*L@EUI!V*RJlppnu3<1YW|zl9DR-q`Q!W zLe-hm{iR>+5XL8I%D7EcVbdM;=dbR62B%`SgOJN$fq;Hd0Rf@@zpSl;v7@cCgQ2nG zzvNW4hG*<%8`95iZa}nso!4_krj#y2hjk(gB}maYVJ4~>yih*v#z_qgG;(+6%zlrj zX$V5Rhg-KRYd{qq^WZ*@FA1v&#;$IibNqxCw<%-_c@*FC7%I$y+z5kvekg z2&uEWT7AC020tmBd<~X9#FLm~JCn_0mhnu=49zH4qlFu2|GG@sE^<@@x@mv8Pb3GK z+7VKX=yz!;J2=aOZ&_0lz7VNWTxvkQd~aW}@h6 zMLZMDtXOL#S;tw*N0t~k>YAxZyJaG(yrO2?p9k8EymZKzXKuiqY+y0%u> ztbB0slxJ#eeWq*U=Hhau3GRF&lk#R=fEiJ#^&QhNc6dI~rk9NN95KjcS+cL1-6oEN;8A$+80(q_rt$DA)>a_q=+O*~(Mu0YUxrbuJH>)R@+ z&!ma~;nqMI<0?m+4Px|9uEsrH-(PPuy?NJ``CR}I*s=np^qXzb3*VA>+Z?-}lG3^F z_GC8A_4kmK&G2o;@-?RRXIoN0ZB17ooeop2TAPbgAxU&EOc~XL9;?CmTM@|b%2p95 zC-Kqdnqr8XM(`42x=_ShXV-G5JV7v|n!eWfCSvFdK#g8f!|YmPy75#0q0CeKyU3Uv zmXw{%a6E}8G=Wo+QtJt?4;RMiT!Q4yIw@&&6!;4 z**JRL8{9fPz{vTJ+MWi|kr?gL11qVl*i82j9G!@b38!J=$Fk9c+cev@!hLJFxlyUB z^q^~kT;wH-pQ@Tb^?-EklToc4N2#@tDcBAQV&ahpf4A(SPzV7#dK+^^r8xg zU?aqn-*T)_`Z&F0PtURDzVgv~-A=wYN1(xw0798o+*F)M1DQFdpu57gdkU@$uzZ5X z;lBR1L3R2z%hDQq%bff3n@HY3PUJ&#(~FjYy*JKRe02v$Z*9%TL!an* z-fUK>-AkJ$=<;g6UZ}`L#t3dLN+4_RSetrC3rIG#IDkIBnBm83Oxhku=fj(0tgYu= zN;Rs;BZF`d6F@4r_`B9HYCPc{J0}DikB_7jGd_nPqKm=|xR7SN=(4+WFx>;A+Naxt z(|ll7@E2Rqw9X%e?B0j#uGtu?4+swj1~elionuv@${akjQ$7wSgys7NBvr)yU+qeTWLYB-?rpPx!F4mPcvd%X^En{3X=gYR_e6HazqJ#sj zHXiLi<+O}0hSv@VS54fNktJZ4Ia*A@EWk@40YB&nN&m7LB zAGi%~RDulWyQ>uOjBaH3nQ>?pu%0d^gnw7M+D8w50eTX2WHpIP2U?BFnfMas$worXih zY~i(Jbwkd5Az*VPUS7Upxd;tgX7CCPeeWoy46n^fbXV_LqHsm8CO+rS)(|rTqBnz` zl-}CDM=^5OWW#|@(R>Mt28%(HesBB01gv$SB5C?u&hMd=*CW**KxST zeq@H>+_eBw!`9u(meGVi^Pj&>_{} zh(MRbPF`K@K4VtFq5<$o_=#iVP4E{iL4ETBoadqB_j$7yf1*&@tSky46kwTejm?Of z-aum_l@<}l#Xm{^0>HG%f$|`6&}mhtQ+r6mc8-|zlu12u(Xpi z9CK2GHCp;~7&N&aQ;J*7Gr+jln-lMBF8U(#Jom@UL$%ulK9Jb(pa@M8`2@pseUuG0 z%#YpkK<~e3m~uFRQi!Q{^2Zz>3_pxB{0$f4Bb|44(QRJrT*3{+!7s{9t(n-w_L8KW zQcnCHuQY zVq+lgqg&kGR!b;SGKd@%dHU_Meh7a4>nC666ULNp*gYHTd+Gg4{2H%pla`tcD@NeP zN*`A=GB-C2{k56M8*X=lGJF05g3!&*WJe^pFjtJ2eVNhB(sfK{$Tv$svo^w(NUq6G zx@K)yw-do!0{V;#+ZoQZ#|_h@f0$F+;Yc$oOoI#?`RK7Vy4er%zB%2BY)9!_+anX- zHdCoWN9SmP1yrki%*?6K{ivMRkUshQPGqh-{1v&5Q_rbeAx5Y_&Esq=K&%k@MoPUV z#^uOonnAnck!^ZWI2v&F_uQ1Z==V5IrgI7qs>jZGM=Sc?6odKGEiYT1>3iE29~DCQ zb-u?d+)hs3`nB?Fv@k(mcCPi6<4|}%O(1x;Y}MY^0K?onPd6P77I? zJdBA*L6<_7jz;@4E7KUBO@aC`k)C`s@2u(8?bRLI-H(i5wkiDyJbV{>yJ*AKGWZkA zQ!dP3_i~PRmOY2WpO)rbIafrK zApfYn-&=QC;B`7gk7hb!s6N#WGweL^P?sT&E{xuQ_OA554+0GY(Ce3#lbinn>bJJF zJKK9gn5&v6=OH4Lk!U<*`9w|;dbY?^}j$r8~$|s@ND|gYEA|^5DW;!O^ z@cLdLt%iZmKzo4Kn0DdgxL$F5K=3XFVw>q%gXv*@PZ{#+DKK@Oj(4wK?$7uS943JA z!gc4F-dLr8Ve@A8m#t@xzpZ~nZmw@OPM*IVouHF(#4LWCr-sT*=~)9$VZF+Io_ed? zxNiCSdh&kOBP4;AfZ1o<+53)){G{f3@_`H9P4nz9rsam&_l_kh)vGj%rT~_+Hh(EwDgXiP{_I`hCCfCLd6tXcs-?rh0 znLFg}+;`1JoLTvQ;Ju~_&~Vs2^EnLa(uZ*) zQ;H$P0%!v`Af`j`#jA{yVCQNm_N}nTS$P5p2|5Wr#tL@cp0=m2uM9jm)4MbMq>r7e7{$|#(2kPzgu_ceI2@XrY~I=FE`h(kFKAG*J*)) z;9_6Y%334?krP{RJ2P2m3~rP=+^#CH6@d|^`V*2b`bG#o8rR8yNHaJ~i)?_#5gwMm zMo)8>>4X_w9Y=8^z!9Z<9vZh__;}y)0>b_RIhpFs+*1*J5+>Z#chV#TlWWah=BGS+ z5QaXxKg1FxZ^;|A_B^8!`IUnH6a+2T%2G$#foV96rUUJpYR*96)KRGh;Vba9pOg$Q)Qi1+Gi!kwuZE^!?Vm`89AHG8{ z+u`==Kp&t%);u#S_99HeV$P@H|KntF&*P`2V*X;}D!&5XKmraV zj1u~Wq5GXCKXZcAz@WdX%D#x;W0>m40FTAYj>fB@)KIKWRRB3EG^07&3-;3iQY$Bp&}PK;xbR*1{*RXesJpF6v<@j-v+ig=h#^RYya*%Er8& zpMZET9ebofP|4gwy@EYs1XD$S&<9D#F0(fHTW)QVIzJE@LWct7BVdTJ<(%Xzc3>%Y zyM{uuO}qLxK{UKlrAEwEjjCJQsmhFi|A0M3oy5X3lwAT0(!j4e>=4}_+oYLA`uG__ z(a$SzA0f}5S4ERKEKb^%nqW|&Wh&#^U*&HH;WRBpy7sJOaJ~#@Fm#K~KW@r-CXhm9 z9lu~WCfG2(iB*@l$SQt1&G?ByNnn7G^-iOwA;ErlrCaEp%fMIav6Eo5Drsw^S7n~A zV=L%UUZe{{L6Ik~$zKTB2R7yxt-_hdb*hxd{^(xpCpL)xg?lz=xI?=mt~DvnFucYD z=U8tDaqVC9&3wfyn|^;!Ubz89YBNvFDi;xWu`2+CF6WT|j-h}}0@(Klwo(1L%9Y^( zUe%K(w;E`F9caP^$V?=~FVhWQ*EB%g8?qLsnXbuI|5BhL9sD^nmwJPpm(C(s_$=yGULDldPfyIaco&y|r{9!&rGXrtmBo29; z;JJhSKIK*Zwv4TSnYOvz4|@iKP| zmbC9*Xl|Lv)(z<`X!>DQ3*2P$PU*N41}NXZ0Vs*^j$Z`meyd zI&sy>Cbk9(Vd5;Sw1o;2a~hr;!?-HLQ4_qvNE8`b3TqrB~1R= zm_CpQ5SF9~NzFMswov@I481p^(TCuEoNPi>a1H#f-U!ZQcKgg?U=-F)zY7mGEp1t6 zd}vZl`D(WoQ8X3zgKE?Bw32{j$y9YVxb;UTJCP@Z*-jY^irS&>N&Z&-0!nzXAIWN>NS{$ zfD6N5yqE6Let{eck*GH`#%;Xo6PvH|7PJ$9sU`lUhVr}kqJ z;nn?o`TB~JqryQYtCkEh6WZ(JEiU!Wdt}l_Ha%Z{ff%z z?t%oVoDawaBXCMmi7qzOTbe`h6*QcK2&Jbi^)T&l^tMQy|6+Cb-;{E7`YN9R_lTA8 zX2%r8$&HC!-sjl@T-kL-0x=0yRT?s%=V|jGfU2;TTKOv$D)~EKor@-&&x`A!-%o_p$hRE}P znQkW2me#_ju!G;ME0&wo({enDB-TXOu;aFbBtR5~YA1>V*3!1j1K3`)(b3P9!33AD z)*r>XdJyF=hRg+xI;(rK&_(L#U)wYuSeZFvRHdFo_H~iMP$J+SFjmiXj z7!tfUjXEbd)fYfstEG$nQjx$!67i)2Ca%tEPeH<)`l1D#+W(cynMz1>0$sSJ>=-0vdF@jEO{zHOpn2TyT{$$$%v^Cqiq8Ga;$7 zpEJe$SmaEDz*b@QMb_nxH)<&l7PaMSu(SGQrisMqz!fEdquW)HFpqz1t3wWtA zHpvQqh=dfb0<%W~@PhF<-+=U$Lo0e-rc#|8sNFAt4h$r>du0Mc?xo^t1@8#c;{8+q z7%9O^vo7TG0vLCOETVLP4xdfNshr>mEOVa5ti2jgk;bHO=g6l?IbIod*)SxlkXQs& z!i*BW0y@J!F~oa<@i)&!6IpdLX?hzcgubea%O@m$)t)W;p{sorClOW`It|$^tz3ng z*{#w|pQiHO+(lW2ye5!%gEFPgp!XV4ys$D9B}H3e{}^d4Xd&> z&yBW=GV=2A*ft4ke^G~X*wSN1bGp0O2;24)|IO?kllxka_ElKHGolN&8c`I099t%4 z_#Qa&@pH>(;+r;cG(1P289Sh-DRgS1>R273OP%0O) zAQ{PwN@MmSqP0h52$sE9K!`)So5>1!9cojwnx49XRV^N2=-N7f5I%e@2&XFOYuVok zU$LB??Q*Ou-1f=&z%PZswZn--&C_iiCl&#eS7F|uo`6) zz(_FcysF-GE3ay0RE9QV$EB^!tvLqPLHMPh6tmF`SW0X=wlzB=&Cd@s!UheW8X>pR z(iWsLf2+F}Ek97&#e`!=OS#?B(%Hnf0|Qk{&nR*`7R)WOp-hL625_&+JZvkXGGw!c zenzJXs-sD@zGK~QUdYl5W4Ki0oDML;d^f~)3u=cP4z0RUAQ?a!uq}7MmjiiNuvip1 zRxg&Ehx0(S+;6FRs7jl51ybRAp#HZc%gd9BMovC&m;ZD>*OL;{iU+zGvTdNL;?%+d z{m20op<3#UYN=zkq;@p?;kKLtu3ry+T2#`E435PqG9OQ7AW_(4a;HKASLl!dWZ|*+ zkZ7Pz9XA^gPO1>O-hg!q5z(a~NO)}mxxl^&>+1-gp1Soes~*a^^C|y?EtJ%b;I)WD z6FXdHsq@x>eR#UJw24-JZfY?ZFp8j>n%so{ zNZjowQOqwXn#Hv~jO(!WqCq$X?=-hfdd zt@*)110E2IhE*NcT|MtlY;!-%^dmN@llH2Br_VoqW7tJqI?nZpQrR0gkL0{q+;K^* zf%o`rsxR={)RFEBE8&hB&Bj(OR8i+HO2UrrV)|CpUj*?&M882Wf34bfe>^4Je)w(( zIJ6i|-%bD(e)z7@Y27Kn<>;3$?9p|WUDxScL~}q>Y>6w+#a~v(;_Dy}F#$m*7|cZ) z7ZT6!7k9ymGZkY)Ow#}o)@|wkm zyx9edUw2gp=SIuOX%^(c#s+w*j>qjas%{tESRA0Ci16zNt6`!0qFmR8$XwvZ#>7hL zcJK(O@{=-8b#RwfxC5NgNV5l&cI#^0^7FMgRS0^1lSpO#gPqaYBiv)tOj>7_)T|9` zL!cT7)zpNq4RA^X5KasNMcoCEAQ(z2*Qy9mb`VJ8INIcD<%2-ZKh}Ds$USa-U+!8Q zXmse{6kspPP$OF>KVhYzwrJFO=z)MrK`~2H`-@Vof=l@!OF7h5irJ=!Wt7F8+OfaZ zWfJmMNlwWQ8v?mE^}Vh6xg)5-W^hoEgvsKr&mVuUGz`8*8tD5-OZBiiW8=9eUWUL1 z<7It(jOM4)@U&0-Yfk+?P)h>@6aWAK2mp=2ZVdBuHwf7>>a@c;f4Y`i&AiA+1`_4dwNwM|`j<7;C3v7PST$u3Jvw9T3# z6_WBxU-q*<^8$c)qa?SxztgXEBoY`527|%OU@+L+*bMfn`D2}5-?TxrHwa$uyn4L_ zfBqbt-DJV>V|!DT!D)5X-lugId|NHbY1-yh8AHv}EDPQp?Cl?(?#Jyz8>Hnl*gHBr zJ309J!`acvDL#a98~JQr)on1TrrD&~xT>oed@qV@f`FPpyq;zs7g<-fY_o^9$S>8C z=8mgg7uBV#lhcp137U4A&<|NWujIF%nyQrFi|YD1FR$g#s*&I3kIAH(&GSNGP^)iE zHMz~&jkbQ=-3Z_#A2-ED_AtrjZE!$O_UpQ;cY|OvnAhp`EZq&t3OaI^)l?122czJy zDm%c7%XwW*vPPlNJgTp4T3>1CwApNK{(flh>vX>1;MLyLSvtjDJ_S2D2#eY5F;O6p zv>iOzKt9Vhcr0RB@0+~A!P=)5VN}Iyq-om9LQ&J!04Hf5=UFqPF3|U3(A+HAych;` zdY|Owe9;brQ!0CKG$iz#&m^7PWC^yCG}WS>0FXspRP(H)FF#c|e7R}cIbbym9%e;7 zpWs(Nv<8Z`jLO@yv*WkG$wgKVgRj#j+pEf}{CZKRZ3R#6(jo^|n`UL(0}INxXEJ>i$CQQ#0m{570%>dN^YvXugV>qaD0CBv39DKI(pHOz=;G6x!vx9FB z_D=wCoyB4G(NvSkGC#f4$hkw;b7zY{gcy!qr+rnl@~9&N_$7|kKdf^Cr8I_ z;m=23{`v*{Kl{mE`zPL7SZ(lY^acLaYyO&-zm`>d-n`69 z0p-ZWu&U25`Q@9#Z=AO<`ttQ5^z`)j&ECFUC^|otojV1Aclg(2@9l@f@0?=e^9G6W z%Wu)(#mmjzzYMp({Nx`$e)Xs4Km6P1*U!H=AD>?!nE=ej#x%R4fy$CuTHnHe@;?br zn*q=AXV0F|zsFcGNCPeta2XQ8b=EHG5?)PnlCWw0Nb(ezl8VSG*~7dB*+asdK%&Ig z>fGl=Au9&A*<%wttLD#!!L#C~c}6WgtMS`aRf8-kx7w_p1IznOWVnf23M8Kq2XOaFaRYNMGMtu@pWA-=1nvh?_5|#1RUZ-@qIjt zvvL{@cDu4!0pO8Hs*u%Gnge^CJ^}?FNNPplqJ+VOMH}b|(1PkJAWvNitaDtli*w69&%%4-N5CArb^XuCsZOPO|9ZFbKoJ z8iaebYoZL(vu&Wn_@nv!{s!iIA1(2tctmmN7S3t>|zqNnF9f+rBgB( zje?JEJNUVT1^d={LnCfOsCqz9KjU;hN4}{(4!nidBN?}CGlu-&WY7g@|8%fufqXOb z!zA2X#>wy>VtTIN9xp|V`S%p!xD&CTJjiEZ7^5l^QR{9)-dUHKmt`U|6kv zUA0!Tr%5xMwMsc#J!O|qSHHNb=1bSPezN$d7?poIB?JMX>@Q(84|f4ASUTVdd?mt$ zHGPM_zxgK+lzKX|0~>pJy>Be7$)U1b5LahVOS--H?lK6fEjodcOqXD;DjswxZ^G!|_!P?S>b?l&=h9DGxpmcGj?B zv?Z9ZUb6T$)`FW~Xv5_rN*=rn{Ohu$&-lU;8I3C{oMCU)6&0Qi&(Z=c^qJjT3nb&W zhJK5EXnI7Az^hqDghAOxYEQ%Uw5Lfmo281Aan>`|JzZi}k6jJcIR8JKypvAKVbFjbe1p!PtZ8k6A~`Q}FemE8G>d5u;&NVXz215K z=T}4i`srsopT!dRw91+?w85msefrq&x)XF{c!z63T?2m=kHHp z+1-!}tea;D$2TZZ8#j|1SWT$MZCqw;QB4MG4b?%1qZ}%S%q!${pRr)Tz}5IVYZEED zBlwc|)Fb(kE292U>u&+e3a+KqJd^%&h8whtd4cY@E1<G(tM29 zY96Oc=W!PE#q5VuM_a1Y#MeKrGtN_U?AjdoVL5+RFM50+_*ui;(Hczjp*DUmF@NL- z$>VzQ*CUfgjuj3V{45bUf@+eN*KGFgDMX@Ckt3FtpaRY4IG42T62&XNUB z|M*Sf^-%3yMfA__nIcwCfB)En+70+YGwl6p=HR?p6>Zwe?EnGU@E*CiXO#Rb@rd;gTl`eb-1JMlhk7Q*$m#00f#a_Ex;U+ z>jdp1i=E0LEZaqO59Q?BaxuFU#+?Z*jW6Q~YKW?Xu-LGT_*hourCq+=M7YkPZkEmnOTiz;lxkJH;K(J9>~kR=)EG{14-cdbRT;E z6z*wdJ&A1@70cxpS`PnWq_rhI3jZ+*ap}0&c!D*6g5oc>+qoYz&Cjr88m?hAsItlo zH${@My{t8{hEa}P+6!IeY)uB!^&#tYD#JLlN9usQ@-5=FYQMpUH$ zqlOw(laYpG z0g%X|@Q>PYt(q9i#83rBXj|KS#mB^%@OE`+bogPs7QO9UY1o!NQD{K1(74D-e%nnG z0w}1Vk!=+G!v0L8-(}ihT+-s|Dt{PKIpiE7eMhEwoxy9UDDfr6v&RcTb+{q$^s-6t zDT1V^wTK~Es{|IK05_`vSzY313NhIL(N#4dVfn00fp3DGB9@_!J*>`1$li62$<&bE zMWJTE-_>2lfgojDKa#f62KTTMqeH+uY4kCP=hZwi@Ea2Fr>u>#D|XL1D)#qD)~Ak* z2(^A5jcbj)R`qOb^y-2nx@hMmLW92&Q(Z>sAcV-sOHdlhyGV>IQ1~Wo(8(P&kL0Y+ zQh-DJ6&h3gF0b1~3iIPGKmhtSmDsyNlhq@AH%TG;_npuB>OsS?m>ZuE)irdG300{oJHbr6f82pYQh%zfa!1`Ea=RcK;+vV6`bH8L4Y?*8GY` zjB_li5`*T-ESsV~A#DJ} zD0*#JU5-wJzr#}=2kKmrw&)fj|KK#O@AEPwi5i6-{6nt0@&nTv*bj)G*HuXbv4=o= zKlZkC!IgMq-TG#?xqvx1MsYbAaM_r^2uEgpW49u2a#%odpdz^wszO1H{SX0L21$z2 z{ft7vwAmDdX*HX-L#eVSFw!-!9>sqo{Bnd+1m*fw3iauiXd3-6T!w!7d^cnU$w<{` zt}SI|U9Hc&ii+k;IYp`tztC%0D(-|d4ev*;#QfHo;5)Q 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 diff --git a/venv/share/python-wheels/distro-1.4.0-py2.py3-none-any.whl b/venv/share/python-wheels/distro-1.4.0-py2.py3-none-any.whl deleted file mode 100644 index bd05d336a65f23ecca83b6e81374f6042e608823..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23898 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 P&oKYvEAJToXZC*pcTuRR diff --git a/venv/share/python-wheels/html5lib-1.0.1-py2.py3-none-any.whl b/venv/share/python-wheels/html5lib-1.0.1-py2.py3-none-any.whl deleted file mode 100644 index c337f9f4b80c3e04cfed697305170ea473badcf2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 120020 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�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 diff --git a/venv/share/python-wheels/idna-2.8-py2.py3-none-any.whl b/venv/share/python-wheels/idna-2.8-py2.py3-none-any.whl deleted file mode 100644 index 1b45c9518ce4707a8e010fb2b58f31dbf67096a7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 66836 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 diff --git a/venv/share/python-wheels/ipaddr-2.2.0-py2.py3-none-any.whl b/venv/share/python-wheels/ipaddr-2.2.0-py2.py3-none-any.whl deleted file mode 100644 index 997d5c8c4d9590990c37369acc2f1f3eabb10529..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24287 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 diff --git a/venv/share/python-wheels/lockfile-0.12.2-py2.py3-none-any.whl b/venv/share/python-wheels/lockfile-0.12.2-py2.py3-none-any.whl deleted file mode 100644 index 9afb7960f44786efcbc6fe32c6935df6f1898275..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21972 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�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 WreC%X;pQn(48qG^m>{b_1qOI>gfV6 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 D4$UnS diff --git a/venv/share/python-wheels/pep517-0.8.2-py2.py3-none-any.whl b/venv/share/python-wheels/pep517-0.8.2-py2.py3-none-any.whl deleted file mode 100644 index 53ce180de12e154392ea3c23abdd023df4f8cc0a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26686 zcmaHRLzHO2wq)71ZQHi3TefZ6wySR0wr$(CZT9_>?tZ`5??DdE8SIReD^F{rhWgV$aIRPRl^YLB~XAY~kcgYhi0@M=z+V zA|bD&Oy}(G9OEq;x5d@5UW8?JD0oI>VU-C~YW77;oZl4VE!YkOhDa*)TRe!Yq(#_9NsgnR{BSLYLxW84KukPl}&_^8WBm zR362@wZX%so>6gFQ`h`Z-`MWD!zQUqtvp;_?f01lty)p?6cS12SgKYLITII$&+F^x z>G;t{xw|n^Bzb$Uy`@pQX^DGULjAFR_g2LaqbcS_rB27i@AI}jC_WmO%cDTJ%ltWa zC{OSA_5B!yUzoKS^@`3uzYTAvr&F-lXt-@=xy`j)&Q|ZE{zofRd}-=0?q42GV5pSU zpU%;wRmo@SZRe7O`FAA9Ebb)i&$oGyV8)1C)Cra>1_8)l8pCaPliO}Q@tMn_74EnY zB2#>KY9Rgs7q#94y9HD%VvDSO+=dMnYe4>puV?X9Dxb(So(>1L8tV$GmBVP;0;@|H z(-`*!2i&u5cBK$a?&S;H>hMpY91><29o|K{IPC5GnE@3mQ5e6tUaz-1NyFĦr+ z3jhH#wH23PRp%bHZ8!2=QY%%B$0T|Rw};x{ z-7EeMe}B!C*DCM~W}q@yK6-%tMxB@mb~P@kyTRa+=*LO!R7=1?+5}FiRFaPTuoFkBUO_u(08gA>00RE1;*oUB5ki}z_2HM3K?cxdw2Udad{hKl-FCtM$^n@ z_^`Tr>NUzI6T71}33J{w+iiCWzPDdf_sE_~&p<)Tr6F=i(#ZHvx!DDDzlu8MZf zSSrEh$OJC-ek!@mHt`r9(nXcaI!jTbBrS=qif|(A9jNXz^H5i%);y#yON<^McuuQ@3ZG{eiu<^B12dU^}!^G17shrRNJwe&XKn00wtu!vF3 zm6Y#a0fxkzL8GGeLmbDe6@Mbg3-74#EUP%n7Ag5_z}XfA)XF%2T$}12-nLgUIeZq2Ve{l>sz*BEEE$zx!exbptMj^J6b(J5WDf)mdWaF3b+*kEA_U4lF#!6iCVd?nCtspN`XJ_F zn_P08{sU!d?W{dGk6;M~Dus zx|#{|Twc#B){N&!W?o8%${B=eBD(AB_x2N|Yt(KLsH*RU!Yy?WpQ2*Q>AJ0Gv%3Ly zkh)baAq)e~rDy?uHh&Ir!*b-il7mx5Ei_@~mi(~A`mSWw8j$;F%e~Ze#H3{0jZt28 z6LU8pD8|lZSUr7N*fG)xR`)UGKq?&)aQKfb2c_|87(rRdqRA7T+okj1Gk4T=eC~j^ z8N(sIzMp{*IAl9aa@lgJd+DilArStIbJCt4+F3pn0Nr&*(gIL~_B;Dw-GW$CET{G4aWQI&Uux&vAAx$@?Dv|>r5hiup8g80hg~DlOnVn8GR*QM3 zL{j2^!HHs1qIWP=$}$=snYjUsZVAexNMglls)1)-__;2OPNpK>elI(P|SHX>&HYvcRhQgr(oS3JHd4*ii$SrkOzi zwkZQe>o3JI8v{9otAaH(jZ*rGEFFN>Jb;uMAv9ahE%g)qE*scAN;mz|8s3;H`O!@o zkFqud<&RM2+(kMH8VhIskhDa^8BlW&wvy>fJrOHt*1_4r>j4X!vryJy(qU3#5QfB1 zQ{OI!>>ntwxV~9gN*^-JSs>2pkT&V5Xn&OHz}iVYtMD$dG$YZdfFCT69KKct!3RVC z6-ljiwOb*+4a=IagXPE}_2uxDj-`^4G1<}V2)VaFuT`_;PCfhjlPqU5|A@ zm(?m}%=QuK3j}7hiIjQe&XOd*+{8#TAz7+gl&h?#Kg-J8fX$&*M~=_Hi<%hUr|cT} zO|)=LVp};Xe?#WDC%z|Rdy%SjfQnLC2-Y|guSADJ)1$E%7G^)34! zHv7t;Pu`iMD4kjSFcIhMDuH&IvG)LogcnF;W7#-Zil z!&8dL5lUt7bPUY73b7x+m=7GM(hb3X+Jbbg&CN=Q{odl41z!;)>>sVeBq2l|pnk-i zK%dDUlWO+ym}|u78MaICZ$H&$4a)PDcb`Z8fKl_AB-U@PIVJN~qohEX!uS08?&oM? zX~dq*d9>U~Iwij_O- zG(V>=&2*@lxdIyA#zeGJ?`SbB|gaSnj%|4fWb<;wWu-0b2Cevj4Q zM5DVuyVa428}X@xKo&*!u%iMK3jpF-iwGe0lR>(EZ|x0DSx2{M6|rkPWO@dg1*99=U{UD8`INGGcqZF7v3#JDdm@wqIB`>gG? z{hVQ1G{8A_AAlznGeZk5JFP$Kc$A(H`*bKNqSn`o2K@;^^q^YI6cJ!7H0qH@E}=C@ z($?Vj%|9SiG&gQ?1v^OrUC>$cca|G1QKl>2V0x2GPw+L;A=!rzqj+>-#GE-ZgH7bc zd~1-YVL|4vFn{Nwu<5?js}glMf+xCRK=}viVfcqd9KSD@I`4`*^7q_PY^b(r;?xk! z(wGl*v#s+JihgJ`Ghq@OUTCcfc>~i<+3wGY=tx<;{tOMWM$J}^M*b_j_ zHCQ(;&onxiuZVL(giKYQig!VVsM$DZIGyPF+*nX&iBh+Q3=NNtpt;3{pSkb?W5hY% zY}AB^n?-$KKP0r~C*iwsL((I3o=AIBU*P5KKXF$aJRTyjE9`U|){@BP<)d zkRb3>tKV2W{0*qsw5OD7NZ8j0X$x9G1Cc zixGKa@kFI@0DAf@&6Sa%WT(F$S%A7n>SOT6QZ-v-UkJ=;lghEVAi_z1#9r@Wv}c1I zo^Ifd6HK7()>g%Ii4bH(1NApkA4rlDN0=5i#p`R2LZ~2a{&8n|te*c1V2ujdaw7#G z+7C2Qux3@?O#VqxO*w3 zJld~>vXJj&uXs+0eodiS~&xasJvv{KM;ZD$axY(F=EaR!L z;UFqX94-j4rp48X=2j(+ae2U1@6e7=+mZKBWmZ`2YNSf?TPa1pfAEpxmbJ=u>arDa zRfBGWdc)_cpRA<5)Q6w7U5{&nW0i>2;_ld9mF&Jq9qI?Yx*E?LT#HIB;|&cc^H_|# ziv+gss|Yop9aQLAgq>lNqR>&vg?fpO3O+Qt4FDm(W96RBOew47k+W54=j`C|FQyG1 zQ=%05T}F`OcEJr+4&#e3Gyf|I$ElGl2ByXqPOx_P(G|=@;q4RMkO;mCDVK}@+08+* zu}p`_i4JMPP6$&)-ZLd;{UrJJ>~u+sM=u|lp@iJTEp zvr4S1fuak-O%fd<=q73`DM(2X%6)WyJP{~qrO?ELKh zehm{bfh?70Q$y@o+4HWMeonOu9B}0K(I9Tg_29c^P?dbcybMDIv#2h{Ff}YUZJfXJt5$V-B8?A!4SBZAD%6tp zy7fi`DtnB-Ok8kgSbcuG@|I&me>7oC8rs1`3*b=)V=K!Cr;adw!zEOWfzn50TlqQu ztC(a=vM+831HGO8iA*8G5#nSw}nC$9|JH?L#aN!M{kg~~R7HWtmxY{Y7O0|yz!oxbAfANo`) zfP;a^@`=K?q#Ydsx-saN-;>OLYhc&km-xVeT{f;gZU7FW+(%LZ7?t&hbqGok=Ju=F zB)kYY_(3-B#Zr;y12LxK-P_it{^T#E42(7yAL<}flsn=oFzfI1vV@ES z0eSONoi`1c(c^nu75JqsGwf>54Yh-48#0kVYuGq?tgFOX+(C(+dx9SQMF7);I6 zo)pr!jhl{Es4SWgS(MCKK#tlwr5+cpk-0g?TA?3JHR4^YA|v(-66aIxV$Qy_1;!w7T|%%6rh zHK8SoHCP3}&7&g7>F+Kpm)^ufP}1=>xFZyG4~a}^u}_byc!iUp;dEwE_A?xJ;Orfn zvNNfps-$%RdBs+9XJW%17|vMCUMOPeGbtyt2Mc<}1SGOB3saI2EDf$J_=fa+w|u0s zC?)R$9TM-MjulmQ!&Bg#s;B53`=n2uH(JtlcP1j9eTqdPw2p=I>%6Vk21bOf2BhrL zy*#)Ova1?p%s^=5Z~%)6YZ0(CR&)Q`JtXb4N5H3?#*~siM1FmzQN3# zDKYqUY@O28=+L^fA_LrIA^G@AsVz-;NFUw6$W4Lk0t)YT-Q?ge*K+qjufngAhPtvY z{*FKoffpLVp<)CF(&I()JpmS6VyG>e3XRSql19Q)=$W%K+(VIu9qMt3t^oK-6MN&^ zqnMVhvU?^@R0#U>^Z9o6I&i%V6Mq_u-Ph+Sm`zJNhKm-ErAYR&0s5UTVve~1SgjzarjKDnKH-$Vp{9hL7umDYF4uc^Xej7h$n zidx#a=UyvnR%HF}$4J7r2}w&{59`C^E59k=b>L}S?}pR4wpx*HkzUR%Z3WYWNU9ri z*kagSxbb$-t`K})0k747+gAf1XR495*J|vhO8c@w_F(A@irgHHO>Hw7dEEG^8xW6C zr~Ny4ydK^r~3ox9RjlkZ7lEgdGLH*R+?` zMd~t_01!eg8A^~jZF2vX?_#Y7V{I$LNuXGn=Hvc5Uohr#E}%)pi-ot7a!%3xEmI9M(C z#);nUb7~9bWbDImoVDSc)y88zF4P`-=Rrd@TsCz#-TQz*AXLljfaFc3%5jr?iAh8D0^F6b$ zF1=8)8hclspgTAhYgd{`yY!77$3Iqs*HEo%p_-=z|4sBzUZYSAR+lMHnx2?xiJhE7 zm?m$vQ7h{vlYV~hRc(5pMQL}}Yu-hYT->$dHhj#zy-|TT!Z(GOEm}^*q#iF~Enr{# z=)a!Fea$^O6OPUgiCl80MsYuh6VMFvjsfZ@apP`J>li=kI&PgX*w^vle7JZiY2j2k zvv!7zJEQ;YPh=M$107556k<55@i2)&Z0yS?Ho7_Q&-}!4@>~LMVQqV_4<*x5cUH5! zWE#^+&y9Rd0z3aiBgzyM6@~DY%$d45T!ABbSw1qdpNVMrJ9tzD@~o>CR0$LIz~}JyW*L}s%sH5k8Yb& zCYhQF3^O2r1I+f2lx6?k(R3)k$@6s2ZboFf7YapvYEe${9lp+VQc1~ZIDcV7%QO-5 z7{7j^%NkMIop$+Sm1{QYy+J=jH!|Z9YH0zfZ~4Fz*U4pWM9auTZQO;xR9`-E1@elw z&?~@f4bw9>b;2D$Xjn$3i#h7F8b7sDnQ?vj4F)=-Ac3k00(+Xl5{>p&WuUzycqIV& z#1qJHTTWBGiIhZD+nxoC?f@7|6K8G1owXDfIsd)_E)PY>7Br6cb=d(nb@{z z8agMBj~RQQ>z3!1+eW_euhzmn(GH&Hu8kjZH|TE!wlTZI=#uR_Y}ZqYt&}ZmPIhi~ zu3(P!Bb+(lP7I+H|E<|fAoqq0(qaWL$chT(=)gvNf_oO0>hVlXN1)rF{_fgVG-CXH zJ-a2TVRv;;Lw9H-mzE{(DPUH2bnmL2W}D5pqMfv)OmrXi4sz#${VuN6O(jN!)Y$nZ zpoASB~C2N(_q;={IUHqBI_%&tRE0vvvqaG1DyCtMUK!-o(+*kxAv0epTgJ|FjwJ-62N;M`f|4JG+-Ha zlxF&zkp*+;Sk9lRZF5M8b6Aqzu}c7mB}5NT@TdB@0)g=LOcK$kp^~uell13MMoA(iF;4;D|YnXTuKLLO)NE=E|sw&kYgs)Rd+qO>a1}EDGle;^?29aSJ$b2=B=c= zJPG~aQNtUqEXf6(JG3(F7|L#J)MFloLLNw;B@sMZPLHz9)l&h+OZTsf(9?Y;m$?S& zJKDsNMYFFAN7Yt!xOP6P4^fnFL}_-}E4Z_-LA&E6B!_hIJeXm}n}D|ZKyd6s_aNN_ zx!x(ng*JIfFO#Ib*sb%;p}$vbshcxcMvKWd3jhHNJyfu~Q>^^#ci)HPX4OYmu3v6E zqC{X5#Y1Brc}I&PlKR7s2#!Mrec0K4P|jOW-BDdJh4x$z9d3?8<0j2TNN+os@*OZ7 ztfd}5GJ-UZ$&tud2ZXG$><&nFs;s3)fr6`u>eI-*BT8k@ydx2%L3YcgMg>uS?0AB- zVvp91G25+2a;M;E!nJg;bziK?8E}t$WM$W4^Q$fHTkIDUbK^XB%m(M3#Ivl3s_kSm zCq!$lQq)IEC{H58qPFAlS3BRmO2MA1i&fmKIbh2h*A1!mdsV&lXWZrrSaF%rc-Cfy-K^G=N*Rz9k)6@n zGydFPNvjPU`tQW)W%UvBKC{wmI^?$rkXrx>J8X*M0rh4GPd!|8<;$dXxwFIDx!|{D zt)kW}nl-E+3Xt@Z2#GJaApCY=k0XcZkk<}SC*ITK!eVybe`=M5#c9rPDph^;`n~FT zBv4#?{)QFII=O3elausp%p6{=`Q)Nx1X|c169-nN#!_`N% z2XR^yRPGT9E*O1>;m2EC3-zf;Fh9o*j9jPeqlMQI6NmI1o@kC?>T8C?An3ZpGOksJP74_#*6`CO zem=KFIF*_W@~*G)pcA7Pg=M=Fa@I5K|A-#Z&u%mF^}93BvXvzMnf;lfhM_rf;NpwF zGw{z4+@@>18ps#~476N^TVJe&)d zUD6zH)-nKAb|O9sf?W0gRzdVf%&1h{UV1{snlRbD}&K(+{F}cMc z#jN~uafYu;8U5!qE@6u_tuUyF7rGQpqwiO0?Xm8W>ezuStHw*51?XmCz_+xVZj9{D z`P2YcMU$XoC%N(rNcMI~iWCoSA>7-Q=E#ysYWI)c4?UW2c*) z-dAB073sZ<6jF+(rZ&z%ZSIH5UZqr&8kU@Y%q&jI6#lBptn64gIRSKLA2ny#K~%8W zi_^|ec$N#))`Gytd!$~Frdc$=9KT+QL&wuS$GwqY+kK($d%2yUdc{9y7ji>Ph!uCJ z@~Ta42txj}*6YpHEsbCM_ipjFmX1%iuC;_Mt4F00a@CEw3vT=6kul{AjCgO~NN^1% z;PW-)&)ZoybH_^#&eC9;J$IuLvxD634CTQVT>!JolQ;Gd4p|fPa{>=h7XR%rf$}J7SRjWP z6Qgrh=&CU1o5W4(fYj;yPI()WzgjiV>;yD|;||dI7`{1H=E(DR*J%*t_vflJi{Si^lGjCgYj1^pBC2$$N!r!p zctrHX`et?h^rpi7Hi2$yI_IIdYQ;f_t*?lb8+}G zs^@1l+HTvY{D=TdFC@!s(NFy>_F}h7fr{az5&Z5*i@@>%#XKF1AmT%TM`0FEmYzbe z97#1^vrbSL9&gKLrSfukxx5;1pv_14=`Zjl%BUFf(`TwQW?w#E+eI-_CJ05bjK;Hz z;&Q(5OYe-KdrQ)Ip=ipU!@#?eCr`Xpe(Qwq<`sSI)ae;t?rLlt2>7J-DWYjUx-jUK z>V#Iw+Jk(W&fjF7g}g?ar-O37+K{+z+ay>_eE*^V=&qLB=UPfe6Ki0b4eQSqdXxy?I(%)$g?6wkV8CE_UVSfXTbS%&u_>dz_au95*fl z&O0{mqfwX8>p1T8_}|Q5Ji^rjKLA(J4fsBIzN!0|6NBPdJ@1HN_^d&UvoRaN{HIo? z#u5*|AdtXak+%N<WB!w}q>YbUGdn%bpJbW%%oNR*u_k!AGX6SUMhG%i{gM3twBx z&OHfwZQQb)v=F`EBiE$^;ccFBir%`KzI~H!m)+*K^3vV;SuTa#>)OKqtl;1fHXN^y zOa6Okz^pUaH8I#-=rt15^0tuf`$v4gAAJ7b+urZezrUm(@4a7NyT32Bzc07HFZjPN z^8CN_#&ZV#@&iGfR-w&d&@#XH3jdMmxs-Wc3IqZG5CZxCW_n~Kg+=9*MgJ?)qoXWu zx50qYd#cRiU|AgP!fVr+F@$187>lDk!blS84&{K7)!_TtjefQvD89AF)GtY2H0*J$u*jmM4URes#V>;k z0Xha>d$k=}OnAJfK6%V9j_6;q#Esr`!coWX7D%&OGY=HzR;!!$y+!EO3t0zRSf{G> z1Hp{M1K<80trLHXff0?jIS zytMv1oNqW!4DnB+LKlr76~ZMEGEa=)kz|Xc=nn|=(6N#**@_Txd8$AlJ5@hoYxIgX zDK$?+$XM{sa2*O4`3z|y6Gi$0(YmpWV7+1p4d+CuBArtLJ!-`r>+Ca*sv^`IGhUu{ zJxx}Ttsl}u+L&SK(4y3!lqu!tBxoE{KN@DQltCGZks+?|#L88KJVgWzl=;<(ZRf!v z>ILH$iRKv3fE-eWRmdoYGSxSF2P$b?0HvZ5p)_ei?uAHjwgf`jBQ>-t?5{P5_*oa_ zduLj5BTTy#kRML2xF5iO?%?k$CYGCjX*4rH008{|Ih7_Wsv;;Ns3PbRKP^2dfG~Xf zsXkR*YHck_Qwa_VnvWHPf2~M%o(?l^I{Hm9)VnjM2HJo5Io&nt1&`toh1kgY-e=2D zH|M09M+z+D$i}bEe;kKsWkK%5g*F|ga z5U|otSH^8dnFNV#Zj`M5(6zr-BDFem!UT0Px^>CY?g30+-H4&TTc!!7Wox|DQ``3xzHA@Q>`h|HzK}KQEP%sIa_}h|A)5LxBVa z=$;QRv?k1W(;29)sUV9a!Wx3VOd<>r+}o26dbN$puulN}jNieRFkcWVs}GP@~1f z$j$uN;HSB0Jz;p@K=B8^2_LQ!C-7ss^~iT_K@7R*Lr#h)s}`+kfbqh==XiGy#b@J= zxyRo*d!P@;*%uBsUSI2M+iXh2e~h93I>ZV;!?dn;36|)=b3KdTrY{C69et4j1QwjV zx_G#KHr~;4U}h$>3HJB>APfG`dv-WOkKA20GbiaB&2 znua8{`{UUN{zzoFwyc@4>6YmLV~aD|;U=ftZV|mB+fYj+l9F`mT_zj@xzUumva;?1 zqx85M$SDo*)m|atzs9pc@42savw;jo^4E*&C|0Gdn}>t1I0WdjX!g-pM@C6UvN__9 z9;iltQE|qYAb3c<@#f(d&U_;rex)AH;^E<((Uoo!jJo4OmCL zZl=3!i4^Or(!DGk*`yAxrmiO$W~OQ1zQ30JB>le?;J)%sZ_-ReSr)W!(NdBq@7HplRs&Z)AyOTw$-0H!6E6ycH4!7}L`z9Ivi-D@i#s_M6R{c#AQd}g= zx|IDBQRbjaWSE5P;y_NSzk7hYdgj(se)76RO$?evKarrcPs> zN5+zZsFkLoNy-f^}$nZ^If{j}~tJsVciJmD>x_tx82teQp(WFRJIT$A z4Dd~_UD!7I3ZHz92N|ZY95K&!(~&UY zH_iFYmsDP38UZROarkCUYW^5jP?2v;Mo52<0)+xFsDs-pF^we(K`OU7bAYzerIhsx zfY>gmsqOLqlKcQ-h8(xvYpR0w zPmZtqt})L1nvYrt&zcyX5nvUa6X&vW#w=WQI%7HG{Mfk6FCA;dY)Zu8iA@NS!3W$3 z2^}1+VD%I&W+KB?MfE<3z<&dT-D&{WY_3E`M=8a8vBYF4Z=*2FD60P?%#!-L?8bnR z;mK(@t+M%Mi=rjS!HCx#uhg95^ol0O-R#DUpD+8i3`)Kj$==8wwULp-6wz`s0{C== zcI)&LlykiL3X_^cjivFMoJEKjHrSxIjBqX+S42*8|}L-l;sVTGVeY)BDug~Ex@LQhUH+* zP871r*lFioz?y;>MtE~@wtfX3lO&0YSgE3}9UnmCD6V z#@x-fhf ztXJRlC7+yvfr5~yP}zQ~{tYYZ*tMM;?oqw%l4L|YOGK`}3r{p3#7si$GcHLs*UC_< z(~Vo?*3u-%hWe-lvlJ}RpHJOz6tqATzB{>MOHm;V8gIFod1k1V4z;qKitNs0kt>x!Fr#WZfFq} zzK5x~6`34E$ACMOTS8hyGON;pYEU~R?S8Wu7NJ0yOwk12Bcp@9J`pxMtn4aFl}861 z8HSAGmZQX^gNd{}9i9GEZB`NKT@b3NsEq2KykQUTlRb_G&p|Tc~3gD&YG0;ns%7f>em|AY<{%iGE=k=hA`dCq)QixG9v}3>m-1i zRm)O=gu*Z4kk>_23Uo(=iBo{{@zZ~yJa-s|S!QBCv|>EAz9JVWED9)f=#MY0L1YdD zYtj-f%JP0XIs4b{$KL$c*EYu;)20Q?U$~vqY?7qXO2n9Y!rnhk3o&fhlUDzW1@o2O zeRSottK6{>ea&+haU5CUf$i16l6sgAxAuANXdvb>`No%-`H@?-#D_5jJ^1zSgs`&NGQ+;ZK;{g zZ^&_wN|(~PX169PfETJ|y!IXgFz6K3&i{2nX3NNN-r=@=N0nRomIeKW>24W}$hG3h z10iUcYyT1_n(s%Pn?OFG3LVtSF&@Dh% zD2qcQy8L`Yz_yO6Yc~ET~C9+=y$^3^o8r>ar z;si$Qj8exKKAN3~a9%7a+SfqTfX)dROv2UO6h8D&9KgGt=uX*+S)|FWbJ%{29?bGH zw8cgvdM;qb0Lw0w*=J=3Cztj-ch(1VZ{4sPY6@3i7R2QjGo2}EH~GK}-b$x)*9#_Ttn{~cl%c!(_nvV|`>fb5t3kVYP<^y`2Xs`c zNlO67PCqyw9>9;e(I7+v-XNsCliBijV%dc>3yT~%)31s$c^dAy6z5b^6qKwyVJTXM zu4E&gL}#MsSjTEo7wpf+?<^MLYkabrp~OXRK;-o9$K8v}tI$=O6+AzXxXyg=zArGe zf!Ff+PRddax^j189R6-GIywFb|6pvdxyyVHS2T=?h0$7mvU@wJeetVLy;kbJ@{HgG_s&Yr>%BY|N2Cll zvH5ANr&c?~dm4dG8kMc(f);yHtPR5B{F)H+Npf7Z>*7K5T2JtK!|2(X-|-#mE>d%{CdTOljO}NJJ09S zh|734eVdl9T)sFJY=K3tV*h|%iiK6H;O*?`GUfOFCFVBwv8%Lh)--9jY<7@I_o0st zdD^=8#-m**Y&oAfuaSLyVc=LdU7tCNRn3caJ7Sfh43>6D7OR9yj}0*XxgYo}Q@gA|r=!#vN8__{D+XWI#wwIe-4|SA z!!6wi`V4N>hnh(_^M7QTYyfk;qR?E20N=```Jfso?i$1R;ZgkYEWgtC4>1CRbwx;R z2W9})1Ggv!Zb_PBlepbVECR!dK4y%AXVYuUu48j6=mB3ok}slhld%|$oIfk2ZQN6m zVWjxI?9;3V7t#5qq&;?Lfilpp8>N%TRa=(Jl4~<$ArB|mChMG@TJ&6^8RaG}0)1&U z2PcS(!Vo5EST4YnTnZ`=FdCQ%{|c5G+6a`AD%bCi%txjEP_EjWK-X<2aX~qFZ?3LG zfLlhVU7n(6>Ixnkl*B9IX4nqOr(llW9_t%_%!1mUJy$ zEEIVs59@w%@JG6K9pAp7^FfaQ|F5Z{syow>F3fe+$t;&G)xGyYJ`wIt05W=ZYaRM? z#ABIO&z`}~3Oh5y?lC;LKU=R(vaCS(aXDAoQ4@$yWa^#$PX)3+`_><<(U15n$op% zg5Qu31Z!q8-5U375c?>n;JfN*MH+9~1XtB4QFtmxFF58*!$~mX7*_$Cf6S(T1!*Gg zeOdltB1Kt>4)gM8@Ov8PJ7q*SO5M(Ws3KuUUyD`AAM|h;o?miJ@y63^IrF3nySi}v zh1*P4>1d^#5J7vky)HGTobv^~8ZMvUHTlcpjM}2}<(xVYg=h(rf7WyAJ4TL_!{;Ar z5V&J$_gtbz8p*fr~{Pk1ILCtH2d&O|Lb3p%CFY z>aBG5=j%u?QS-rd!^R~FUl*@8D$h~4ho}tQkYEM@GK>uQ5d-0v5k)6kocoz*3)49g zVI6#bv#^0~jhR71FeZG;CoB*6Ai_z8z$crT77iEA*XaEhSa%UU8A2UzB#RH<|E7i= z5prk&pa1~8=>MUHM&>3)R{zxST4OtIiv_`Nw|4+Ubv)8$C;(w0--lupwE~SJLW&1R z^+?*(ZF_Q~-}S~;>)Fq2r2er!i)Pg^1Uxfs=w-_Ngk3MTkb-Mdz;~LXvdI&+-9#Jh zD)Mwy;1>6AWuT=&s3t@8sshcV-%@xm>Jj>7dc4)TaH(0+Oc7;zs6`1&^vq?rIe>v~ z*)s;mplr&zco}WiV)#1r-NHbvAQ;rEI@oxtE|L#RsxU!VqxV^#AURO%FT z9$8T=s4i}ONi8`BL|HFCfD;4xDEq!4_@E%exj?fg2l8*KmC}S&fWRDu#F{QT3#$1p zL@Sq7_@Z`-RN-*|7D+D^Vd1%E?FEx^bG7AVx!?}Vn&-u>g*}~Ju$m(@Q~b82u4U;@ ze+B_T2U}6w<9dOpqUGY-0g&Cg?9+rCg%IdOf(W8jjjK2_%r$w{oj|{zdD(e=77$uIW0O=RLIV5CF-j1s90-tATcnU{N z!uSwmrAY|M$4VZeOg;W*>*dB#FSUK@N93Ma2;3zYga8p6O|pG~rKd$)XvTxZ#FQv- z)-+$5PnLLarbR;w9%lNcAq)l+!mXdFuaaluEMVOrs0VFuj^y_$WEsU@MG*nujL4mo zjrF=D+{TwPWc+&bM+Nscf;)C7KEYoh#!w~=l+gZxj2PCZ-_9Hqu4q*QCP}Vn=XH2U-xe~vNXai8lXxXwZvugr)H%rC@g3@X3-d6`aIIN1M80*%HtP5EQ} z)ub35!=OFPguYyb7MhL95JIbV;+rPA^Ah72Yt&4^N;^wk1JbKQF-{LQ-wM4kP%E~j z)eUpJV)N3;l@2xqv=gx97|9}KhjBE~i3WA=MkvpmQ~SQJ5ip-~?Vy2DFU|q>(&nqe zOn$L1o|r*z#GpYO-8THgI7Xt^Q6lSI1RiE-pgx){D$artkNT57TN2sV%F@!&p8N^N z^~Q?tWce(kYrl9c4O2FCRhYapG@#{bw-;t$IjaQ&V6Sl?2a3rhhKbD1Fch3?6$p+K zY;-!7*cgn|ea$L-n06IOm^;GH={HD@46MZJa+fj5DulPYrfe6>pKevcaLz>N;I@Vm zj$}la6y8K(Ts??(ROZyvr}0Zv@=op$H501_X_4GhXA$!~P;3Jq!9C@nV608=^5^|v z2L8SvXItP8Z6P^~+5CAjcY7k*E1!&m9+VYvxhddTr;q*tY9FwWj;&_chC~`|(OB z3Mq-qg&gKz+CMZlSGEO`T1L>psGp>Xw~4w^pZXWpZ6pD;|McNBpqyhgZYQ(#av8#x zkO~+5B77qFQ>jJ7rXiY$W%3|&IONj%<-ffx!`7?KMS=kU03rOxyQ`6%wVk82o!LLZ z_E9&m+hqG+g`H(kTwAxbad&rz;2t1Ikl-5J-Q6`1+`VykNC<90gEr7O1b26L=i}Ua z-;;Bwdh6>yyZXm7s-<@AwdNdSF0`j(eMbjYQ9T`MIYFD#WN^Lpx?XO}-IaRh1wU_Ib&HD^3mxKuuBOXsI^h9$3CDj$BvYZKaXD4Hr#%yF< zV{gh6ZZ1=yccx&^`w}I~bsLp^r`K=$MODN&HCEez`W{dvami{<_?ci<+Bvf}!h6X= zxa_9$+mK!Ab{GJ`xZb1ekVLWG9M66M?7I<0bN7d+9o<`J9@5c=Q%~=gz2h~K>W`@A zwQHAO`O~|XkSb1!xi=opmatar40)a)e4|UaeO4tg?YeWM<(>-?0%&_a1%G%4@O1Vl z#NLUc^Q2&pH_&lXt;P;bx*w^hLQm4c?HUs%aA6UP$LeC2ISF&Y!rDjTR+$Ijsl$D4 zPcPqdDO*P2^;5u;{hYSw(&Zn!v?^&`)RvSJ!jMW2;>(gB;LyN})ZP#NE?vWgh|w71 zWeDB28las_cOn{W-MbC@@h?GZ1%cthcP{EHg;z0^6;^e6qT6J?#Bd$ zvZB4c*H2FyV1%|Nw&F~aMYF&yB=dFWJow^4#0d?gAmxq!&WBlmU(5b!gSH|M-_U_5WNRe0U z+2yqzSc;Dy=53fKMJ(gz@!w~c8(<%K3Rw6@r?&g8I5U=pVNRFlhCIAX90a;W8%gB* zd*yz)EQTr%ibxvbM)sfbAAGT@2wV7AICNfCrCwM*jefu@>IEZP31+Q#td3$pMfW1d zQ`{ljYOjDF9UeFfX+(-3D>^_oYG=&fAnBalO?guURL2;g27F^cP$9#R!H$-0*$$uh z9=`T<$)fxGT_l=YAX2x}o${v6LE6>?C{4Uk7I)a9t%T5WJnb9<8RX0;x+yl&ez7Rk zNX)3pM2#xqrsrjd8sO>AMxJ_BPLrwHQONqeOcEz-DUW)#K+lvTa~jOEg{Ymm6FBz(7-xL8H6ELgsjQmh+{F(en#KL1 zn{!LFOdCfM<#@bBPZc_4n$yo#jM&t`n`~Swd9C*QJ5J&U=R&~kV@<{!G5X!Pn@?E| z=EP@RJj5im*~uy{qZ1Lc`16ata#!{g&8_stIM{>1a$SZy@?LpMF+C1(QDEvwFgs3g zEX{X#*FA%_g0;jmQXfu$|2p{B^yL9U$P zQV-U0{U{Wq8EN9RY)exAZnkZM)}#Q1)eVjd@4gYK5q?9mnmF;t%JMUr z&m|H|3|+OYyPYQ$OfV~-E7Q8j)4R`~^V}DKTJjSlSJtG>sWBp}A0OEAihdv|UFpK- zo@OoIJjgOKvJB-V?^(XRv_5b|XnNpV)&ohhw|3et$Lyy>7E3&MJ^efZ z%;5+W&p7m z+uJ%Ay8KmkQ5u%-W<~n7Lsxb@X1fnF&x|?I$OayY0?$LvS@fgUtj;m1F!7gwT=(l7 zAUTK}o4%FUawuVknb{~T*^%O^;`~iD8upY1_yE6G$EU5Kwd9f0Z@gX&)QTo)XQ*iY zBr8Z;==$X8t)Dl8c!dFdp+E~9VVUPVwxeDe)3a8WIR>`@I4KmhQQ6>XC>D&ERssY(DMBT6#xkGm0cy-)!Od zMjORPUw>N5*P_-xnz1I9PA>NLHh(oifl8fr3#>?O4-9oW>n7Q5q-X{j@!-%fmt({s zx=Pf=gj@|KpOGdG4A9Y9vYS9cH@;uYwgB2_M~yR{nb-ot3) zjXL_8*z{qd-N~Gh4)y2X@}A9-A7;9b3W*`ht(V0Q08_g9xif~3;fMkq>9G69=itEH zh^RzZ!u@-Z_|+nm*k;UJ(Jfm(l{+@|f8gCgxz9qM*IM1n7e1N4rq8g|+)o9QuE1Rv zDMBEhC}v5C$u>4k9_*GXkh(+V_w$slDjBeewb=(7zwHPi5<+Sa)z$ z`OuexN$;wB*Nx`_N5s_~B7@*xnT+dg!h5XImj5y-T+#q#gJnyQ#CF$KX7|O0fJ~DV z=HX}v?SwQ0D78nERM9J8>TCR>tG$yyFr;u1rRp}NYzdndl3(x(AOAO~KGeFJ@|Sz7 zdYIZ`y4^YrwYpYCybt{D;G)oIP!uuPi0(u!xwrqK%7ZCUFmq%qK*n0 z!eo9i`2Df5lO*cpAEH?JzGarAX)yyD_J_Q5sb`r}g9{~zAFoQM&LX1*0U+@SK$7qC z*^V`Nb}?kTjt(a}CW1S`(Hr$tFXo^U0S-AF1BN>m4EkX{c~4bdW1-=`eJuu*!T{XKNshM zBM31{Cio#d<10J=7nl3I1ORS*NLxBOjXnEa!Du^(oQ4vPcH0v1sYFG#fnCfXZmR$!`4YqXE z<8VEDG}&<3_8tJaOaxn@XqT~QunHBQlT?`${r8~sedJo&r=+a|)aZ^x;DE}q(d?QYH z4Pf&itCw0##>`r$<`8y~AIM687Fs~vdmmUF0%NL~3s@{Khm1yHA(Y0mT^Mu4&xXSq zRoVdaui$i|V@K8KNet)5Wl5xBBQMIdQ8CX#F0KljSx>|N^rM3=NF0%V*rH_M6WT0w zJsY^*iPV;+O6Yp4=?|*%Q&z0>4H`vuO6V9L)?<2?qfRSF>}5F!)JJT_Kw#x_kvseo z2w~-cdGQXf`X@P=7;9SSO;uw6=#k{>*-pw;jEAo_%(4}9B-mrd*3b>J?&;3&xuYV% z7bM(%0sSD>i!&;6mqu12rrZJo|_TpaVCn|usMQ+tUgI1eKm>UYKe;4PH#hm<_AHCxZ zIshI{bjRXmLucG2M5d{Siy4>HhWl=GZEc#J&vCRO_8=goOYi^SEM87Eo;yBI=73ezXE zk};H1q;Jd0m0&wlKgkV#0;^^bf%*jl??wpmY~a3yaW4($MxJyzGfv%|Ad@~Bwy6$% z;JXDLF{gNzt-QM{I0A~EDhMqJC7#ehEl@e}7}3O%9ay z-dpE<&2;&aV(GKWBO7S%RA_F=*JM`0@5~yVr)ln&`sM61dBN^OKDCc{+W=Si9{U_8 zCeE{bECcQ#B}j}i7UyHHQq(E~qL)u&P+>&`q`HmG<$(1lAJO zS&eu4-G@VbD_7u-DAn{}{7Inw-1$BKng#?gDxCZxVXYH!o~3kCzE_tK)t;>WOEK@~ z)dk_yK21adT}gVkTqRl>L-dG^?Jt$ssVCvW)M-5T{YBadq^zkdNgX!7ruQAK25}BJ z@jNhaHd1a8F*g(15N_;M=<8B*b_ZoqrmaAa6o)w95ac^_2rEMgp52(IKHBJQbF>NC zZ`x$3+87{*y4wBo{Nb#17dM+De8vGQC81?Nuft-;n&6!|`D>LAo62}6z z*?ev7IbvTFjXUuB;heNrs5N|*JHlk=_hXA_Mc2Ze1wURIp3s$-s-JjMs=?aYWBii> ztFS2?Fr9~_6T~Ypt`xgejRJ++PCLUsAx*zJ@jlM_v23{Am8uG6LJokwNntBaK21?6 z(wI!f98>xt31Up38%SGG=SJT=!{fV+BsaY~^yu}z!yQpmbbRC{st~{W9g6rspWYwc z@FJ-Ff@uCD;`n88uBK#b36uTs3G?5phLo1Q6U#`|>JuPeFsh464 zoJW&t=4_VbN>66N^xP(7+*p&PxU?>?wMJ=5F5?A0^4AFJx0$^&&el=3;mQy}E~w6y z`a)FX8n@H-fn=OgA$m~%nA3A=XU=e)}PZ{R*TpP;nwy=lN9YeiXP)uP|W6Ub;w7Ki)X(E$Ph zziZIp+<+t0!8RHzMLB8wRJ+MaVENonDSuqMd1G)b2l-hk>nc#YGFMgdlK>KB#gvUl zmvGekf=LB%H9?><7n{JwsuZU87MYWc2Dkv-?oNT@@ShI|!|5SIF zo&3_-tcK~1&_x`aOFw#|lfF-HHYC{^#uX}_K@X{Wg^g&AtqxsX1En@pMw3ZsT0 zgI&%2CUzW;YoA(Hsci!RLXOnq2V+n}81|V`*@CjJtr2sCqT9e7`#sfosBupcq3s1v zPn!@=apTd4uidsoxB`MHYnuygHaVZkw^CY#5w=aWmN7PiEWc-KtmC!~`HpW)sp@q; zU8984i)QH`9m5M!j+QHZ{jPT1Zarn%6zt*>eaZ^nf@s`zTk~OPGrWR;ERr z4Cm40YSj`C8-)0CpzuJ7-UF&yu`OiG2ZVd zt<1w;R1#Ic9AX!w&Hb)*7uZ}Jscz}^*;km@xgAEp-_rkv_bXP(J>e4pM2)L)S;c&? zun`K=wmL?)W~B*fq#{dVGi7_zOS0EHC@OcN+qM9;DM0$82$xB_Nsuy8siem?yz1BU zjGxy$@vNlXD3t&yO1`0_Ya{n0^$ydre)xOGpPntWde(I*(!Wi4^(Izgdo%J@CV?j+ z_CIMeY{Q~3Ya?DrfF*TENx+BOyTW-)-6{EO@IknE>rkpo3(?n652bND(vCtV{2;W8 z-vR)%V1L#Rzi3HIg3Ubhf`WrPus^2np_{f4GX&=ni6pW~$!a{J{`=;?a_$ZydbK~0 z(*JAA;O=DT;9%Wp@A7~K1wlE^ zMVK}jmZ)ny=DXr7DNRNFL5@Ykpc)2aur>1`I&^(Oiz|IsuG<0x^lGr$OvX~OxYksE zOm=ALh_?BjYdt-*_)W#FO+{1gs#sg+Tzrg42EI*|CmWyuKor6LewMdT&Q-ph6r4N1 z&>Rn~T-w)Y2-MXZE0tcVwQ*hAPi$@Xy1MRGMcrBr8?(`_^Z@dLEwo^Snz?aZWZL)_ z&)F1bbk9X~^vTV#tbVXg1=vFNkb$0J(=>Hzut81z@$)*^$d#@!{4|J&NP@_}Z7Cn+ zDKn`;U4g`5EThWoCk9}Bnm(y4W{1w5R&vZp*gJBRgovj(kmG`hVUXskmeAQe!Bq03 zLI?=-qqvcD(q^^f@;#w7P&~v4x&YI6>n4Vwy#8L7&76=7%tEo9WvV{YHm=skPZxqVqNw~u7@Oj~7t+#2QAhe%Ap3GpzAxc0vP7PSIPGyzsp z2%)AvGTP~Q3W1rGGxV_jy)^*L+-g_b;af^hfplA7TjcyYIirC>SWLx&ogEAQZB1#v04F&C+hCS7;l^82YK}B4-&nIg%Ikc89@?cbB(3YK@ zBM6$LI;miJq8S z8VstP&-)>%p#tjiAhU!%H9;#gj3rC{8gR)cvOKpb1Fc3{WA&brZ<=sfp$x0!A z#V?(MuNgdHUf}SvFU|zr9UNV3fQ@h%QyfzLs2T$6B=(D}S`B#$Y?YI6w#lfDZjZeu z@QR%BgnEtxR_s#z^Ji1P@vKd18m0bGZD@X67pR;9w@BpR)k57RCxl)Oo^Kk`#-djV>OGO)Bc-WTGqd?&QGKX%0t%kWV9Dveu#`Tt~l-yDreEF6*#bf6az~K zXNA#IRHbeTh@IBMbi$kZJqne7{NLXr+c)~-zfmf)vFPBgWfm$=_ln>3FOUP_(2#GrkJ|+bhQ!oIsa!&R zfAFwP+Dv*K^p~S4Nh1yvKL%(eTvE)v*#&td1_QkTcI_RK#503Pa%fvh^ov=2Aw97NkHCT8YrZ6 zw7#*d!KzRc``>}aejB7^LkRJ-N*s7!n^Y%#TzquZaa4WF#$lJV?r{vqXdyj_hRILK z&6~4C;QLmfAp)Mb)9=4OI2%f?Zx1t7pFqf_f}(%Tms_?6q=UD<)1otsGv_680!?sm z-&JOU%9ojnreo4*B=!FUdWTQI!yg-=P?48L-V)MI>nZZHgV-jI%`euCofPOw<#c1- zJ4crpRqaZ_&`V)DB~T~_EM){qb-4Q9^Xq(Qg4i=1#U9tq^lyu8-J4qD9?e{oC%N~! zYVYOot^dmiy4pO1*VNK%Q_TCu3K2Ql|X z5>6?+7t?AY1FV4SlLnbc2wj&MlyjLXePT?12_U8&-Aarenp1@KPO9$6M;bFyj}<%Y zXIi_m)q}~!e;0lDmtS`;DSUlHv}nPy!@2}r~ zu%~-aYgI&MR%ArDjRFePt!PViCAC+7X9_ne8C1UU=lJTo8*eX-72YztMV+&TRS%EQ zQ;U8~(DzG=r%jFp3UymDp@KcdhduP5-zu$WF;XQ4?uP=*3XI3vVCtk=HrAT?uT&-T z+XC)v`h@5)WGYPS(g-dJGouU7KooAlHdDANAio<4+mtfaRuyUhE-7)wX7M6nX*%c6 z=4V0kRz~qkFMQ-{W&2sNWYPF9NWOon6J~51JM`MF_A-#A>X2=_Hkyk;Y=B9C)99ki z_Xx4J>v_ZeR#3Lr&TnWHK2?CX@>FpRD%x}aJoqs>S^LuNezx|nh`re() zAX8*7kI|{)zGjaAJ&Eum2zN}AdB>E2>OXS<&f@T=#iLYbqQ!n%bUPJ4_hLjy-iA?d zXq>)e*ezX+D|v-Oh6)?gN=K?ES-;SN1y@6uVRqpxTA(s{Es`nZ0LkIx<#iSa(IS$X zXlQ~y=@_Ld0VNV~idiqPZE?pH(XS*$eX67aU}bdQzb^V8y9MBolJsN!E~GeFnGyzj z{Kk)#9D&uDjFUDv=6kD!8K>Ay`ijwrK$$%slb7tbar!+Rik!Z4|HiNJ!QvaFY=Jlx z%KPts78SyCDJ70Mi-@i|IL%(KBQzC2UCS_#!sj2w9G8OP4O1sJDZqZd;^jbJ&15sY zV56so!T$)++0Ow31IQG_+Wy$C#p#@QhZ%lzNNF!WXuW?M)1{GF{h(CdblR;VLkYZ8 zNe^$4$5?lzmfeNHCS4%e)4N+&Ir<*?)#C+ck7{%u{xhTScpyQ)!-v~5f@RoEPB z*86Rv<`(6Ch5boKfHeki%=s`#b58}<*v$8c8x{W zU_-~52`;Joiklg+OPA_ADZ|O$1R^uuqNmhDL!e~n4%13R+|ddHo@_okm6)T(4BMZL z5=yP7K=LWi?>z$wNGU~b(aWSd`|K$<4dO$B#qhYARaXSGJKx`B+AxXHq&p5}&ZDSeIk>MO%mi1`i4a3>LO-GShm{m(a_tF# z{<=MLW^r@b$%0wKp*_tU*SQz>LQ&{>$JiU0g_V;yeDlTU;dU_La^kW|-BuUn09!)| zb~I)S5Swj{fLhoezuhFM(P20+Fj zaeZwzKhiz@u2mpgRTa83d$amEk*dGcsQ?31YFy%6X{&;NYG6}L~>VNODb zvEgjv#YcZG=tHD^z5Rl;MZs(&>TC*2%h#D!@Q#mte*I}$LZM1$GpUgO-@`%`ub+=A zvl3qw7jbN+Yjr=$HC}1T%sf@9=E3dL>8_K)jry^tE!`OU#sV*l_IqZis@PM__!{?=gaeH0(BQ`ys#0t!8M znV|OtGwDS$2N$l~kDwO*GgMN&KktxA8OI#QO2z;=%K$<9OQ6U09nbkv+zlsdFZNBe zk=x75kBFjMt45|LRj&}chVwLFW`b`0vV0cWIY6b;F!90Qcyuq0coz$cw`~3xZg5V2 z=8;NMn|Wj-l$mOd?WHMGj#sv@s<$pVGLP5vNH`z(7Xq|fsny@kT2-D;aYSDdcWx$k z{BPg)2Wkhc{jpY_-cqitA3oV@lb0#Rk)C3l`Hq6q9a$Pg{m1&ZWw-zqLgLA56}&R? zR0k23$<$y^$v=Nc5oOa=Nc7tHOdwQ@_wzu$coj(>7Ea5I3z}*UL6Fgb={IqGtsE?G z|7*I|eIh^gG&TUhh4KG4tk%@r{GX%${|RT9=J`(BWOM4h)ejuo7Pl%gy}ImVv#;B< zo^f;9l(y+zlgzC3)rtxsaidHWSLj?Jec$EA2l&@Cs`U){Zo8jK05PP~!WWGkq&Z&!!PZQ5bZkRn zP&Rg4m@HR}n>aZ&+FZiIhA0B~Y9=>^*cYy`xNb($?|-ho@v0ix^@IeQY_8NW3Fl_) z)){2BNKKxu;l%a(PeTZt$+c{ENp`x<&AL!tE=T@g%y55gBN%E~ZI-2+ByFtYM{oFa z$ZuAbtF@F+v$+YVrI9iqYE-eT;uMU%N>mD}q29heN#s+mFS#!uwMb?GaxA_ii}D7T zst6p%6`xHy>fSCsxa~}IR$EVg6Pu{ByG2Yz+rc?$p;h@3%dCRRv4U?O#!X*CohUuG zOnX%xA_Mx%ZcstS`fmpL*(s2k3zbN7)-A+lpPS9WfXd{}Ls+r)M(7ew`skshgapo3 z)oyoJMptG<0(tPJy$yEt>*u#uotC3Pcv`vUml0(7wGB z##$^~vFQd{T_ZnRe@-&5_Zi75&ifg-@^FqHE4kQeRUn~p(IJQ69u6%+A3)QYe%)d( zLRJGNQaeZ@h85D-l|;-W-uR+N76OF{(%3qOI#iJNpTou{63n3RRf^~Ya#E_&+EL?V(p}hs zr|0;hS*Ek#C6m^;6>iv}HKIN*1glG=c!U7w94Lv*L;89TfdD9#D9CCCK$eSy+(p~L zHtCyN3y=ZRMODkBBwpwa2>-FE$7LY>7olr%Y3o`Az}3h|=-^m`bVNgwXf~ldKz_C` zAyP?WOY)L0X45G>NtAb(9dY=qFTdO=ksXD>HT8673R^zqL6;l{(g7KsUbgBq!Y_c4 zO61ywlF`i?oe0U!Vj`r!ExxKBmputdIk3yx<9K27lC2zQKMDws= zQgQS%UWkGIX})Oi2b$sMaJb^*NktGpS)9Hsqke$dzs(wLS?vJCKM40#t(uf6nX*lP z)vQ^QYX}PqT}kb(U_v^hGw8h$AUYDN7Apgl0KO_QN{ze^Br9Ere*HxVAdl?+9`x(l@%K?6j(5P!=vSAwa&nIR4BNShKBv&#fgSGxUGh= zM|VJp12s3R9Ara1JNeiJG;zs1V8nWMYRX?{_<2t$UaEGYGz%Xq+P=%t@U&5fm0q~l zus?WVUq=Vq96@kA@wY5CV;*13owLpNz+M<5xEPIrR}n>S-XU|BABfz?h!aW%;Il<< zvsl|nC|C5Kz~%QLsBdQ7X{R5sMMv*lVAZl8-VkKP4?0zb!@C06#L$*`T%E0JTv?<4Nm$1+8cj! zN~97cV97SxN=Pv(e8g)JJjkGO{EJ0B?T83{!}*iCR~V2Kv_d>QVk7_dC-qtPYg6)a`6iQy=Mu&uebaW5GJ)HbL4$n_m@?gf6 zggK%JQuUyUG8)K~FFWP~+SETX#tAG2`qRyA=UrspNVxgzSq$y$P&HCB0SL&x|CN^< zW`JJKnA0L8`+1W1pO(IYs8|DG3U-aF5QDoSLj*%E+HU9uzgV5SN;RM2W;i`bX{gpm2^erHBnOYLRc-hoimzU!S|ae4<5GB!jtE2sn}%6xsxRt7nb$ z?ij3TqG0o+PX!)WWL^MTs@hw*gyrUa_i$=@YIe@&MxHg1e&!>W-{y+K`3Y*ZC|*&X z%6r`paz^+TzvFWD=Di4TY31)}e(e_K&2OD7Ng>hUE;!Gypf{OHbqU#zzOltXpID#6 zoHqJR&o$L2a541CYg;Z`{zG|k2nstvERdRv>h7p!Lr~f5LWDuE)2859RE#o{&lIGF zw~Cu!&TQo~$!fs_@K3=`Fs_jMnMqTUFE(WR$%Nt9Fl-(+YpBT1WNYitR$+p(YGDZR zCkdgo3*6S`>s<^US<;v03>6q(!2q%?)goO91Z-_Cl7rDvxR{$cuO|5-TvmZYwNnEOBfwsYTGX-AGgR@duw zs&Px48oS4(Lr5OYMOQq%ZyH;;M3VN&HQ+-YeY-)QR{MBo00J!kv@^f>!SeTf+)wBI zQ_Mf2*ZqEdyg!jYwP+lzx7a4^(|GO7@}SYU9gH9xc?mCKYZ$QxP50UN zs~A(az#^T%^k8;~VXv3WQOmOAVg85K z4l93WV{kiQvw0Qy^m!aHg>cC{jD`Rn^W(P6g7M_ay~>d7nj^Ke+$#P(bD+E{=nHMyv@Wnf zf06__m5dz$uLgF4!}Tcu*LIUZ2q?_+%P>+v6yJ+oq6$=nriJ6tdBPBIADxICZnb#kw zYn((fU%kiln*+cCbzGVm{;-NH3&dKUJsi@!=f& zS}fJ5;dY7Jy8c8Ik7<&p*REh-1&{$=z!(zv;u}cN?X8F~2zF%y6##u9{NJLuR+v?SNBJByA-(n1AnK>!#i0hMX3m!sp z%b*S$WhfTYGk7JapP2o)6wrSq4#af9IAU~}vw4=I08$Hdr;(+M7b=$WY+)L;#tp^H2IqAF?v=*~y4$gsYZ)q5&LwWi`ziN-0krHng2~ z3X+g*IQauF7{Ffw_ry#oAVG&Ev{f`*=Z?uzyDV2IKE%AGk-jBtBxu7XlKCmG(o@6u zT2OHRtpwV!c{%awjKO=xVTTtD9$dz-l!_SfY(I0hzsmCyLW+o$gVn~Gbx0<&4!5LC za-Ok5$%8AHLKPkp@Aei(GGql>@B*;RbytCS38=@-?4@k`Ufu>NxZU+eIV7PJ;KFIP ztf=Qm+dEB_eFWyk61u(rf(yb$^5oE}=~MSZnv&V=V4K!46m zWE)l$7p`g0O|FUIi>&)Hb)s>fa(5xB{zF^W?|FiL(KX)-{Q>5)T z)O4Pb5*0|jHy9_u3x%t4UMm=?(6FhA0zxLv5)nse$oc-a&PX~%0Kkq_eDNSRV$9oA zU4U*q--bR8GnZ4EyZMTmUfweHzL$k$XWF2kVIYi%vZ6^jUq2823x1$02mcJJ1g55X z^K9h#BgqihYXHQoo3e;Fd27Y_1i|COQd~rELZsLGb+cJE ztB-uYw~Z!U!KGxS{w^CF3xij<5qP1{wcf`84UIeH=5cr6CQl=lCXBP?*Jf2pXzU_* zMCw+b5}GP_xG&g8$Dtt+#`k&VOug%ws!J5nB|i*2fI;F+szU*8SKX#IM2;4S%FWwS!lY4>8F*q_ zlIgZgV(T)7+kBN05wrFR*WXaZi73Iw$;RKZe&cKzX%G>Mnc*^Nm+k{#)+9A)Z(&8cM339LxfMYt_Xs@avcKxol zkB9e5_Ildqf(ljpJ&0-_*4sYlvIF7jmZel=ey{gFb&P$7CkR>ejwiUEa8MXK0*J(X zj>bA1pu(<*^zRR}WQ=Y}U#t;P#gZ=RsyOigeEgE+(%3P5`rE}EXfO!?nFnYABBhOG zOH_Ea7y%u?8Tg}~%U!GNtyqcGnq(FFGQt6WY@Yd{D<(JtlAnM_g9j}rO%MW?WwIft zbnpE;<=-JYz8@PaZrolzvpHsP0GDEa8~Y+T92c+wBF6U5mC4>I1$TyzQ79R>DQ}`b z3E4oxI0eY24c{LADn4Q890fD}21By~v$LEPm!z;%EA$5BHRdw6_6tf112@?;)*8X( z1%@f%d@RvouN}i~toB+CbO(`~I$3*(U`5iY3ypktaDdj^Az%|vSYVK~?xo}m3}u5m zZ|1g_BBNpG0D&zMy5P%cUm|5xnHquIjYauWhJil*IM6P=@uNVz{S7pCo^yNisOg1H z?zNg3);%~p7-7BR7>A{!4sertiw|EKxDTEFJbVv4kMK+7#HtsDZl%jNxjw1_Yp$hy z5oM!PCA;56k59xE<;QoyQ>2LX8gO^-49Vf405el9stD9LHJibRXPB{hRv!M0w!*|j zpRguoj*ZfRWS_ly@Y>ZqZe8lO`f-Vf*K^{K7i*x*827(Y3TD3Fhe02)=JC(9& z+k7Z z8sYHnCUHAJaq*q(U@>#e;E^v7Xg@q|Dih|u#0{xs48&H+Hu5d7Y;3~V^b1Hmz2%QU zv+KlZU*=%IEG1zD&gT2+n)7%-nVKxG`dKTJAq zp@B6uY>ab1{`+_Az6Kwq8QNhb$tx0y(`j?hm~zNrlRtA*OmVK|kL5=S%}$*pyyGXn zI^#|S?f7987sIg3##_(}tsXf$@MsJ}9}rH}zm)ipZHH<|s;|zwM4o-lh+T%*x&sfSgFx%j{EYt6*A!P@t0o!LEj+6rQM*C~hGkU7y(bZMe$ z1QA%!_?sy^T@7Qt^5d19^Z?Zu74uGv-b2Aq4BrZ2x7w`6VpIZVlsG@XXkp|KC-I2c ztQ^Aqz98I>+8G#5n9i~Ubk^ZqT)N3wKT@(!EwQEOJ~eOMe5Nqci~a!jtFKlDR`sPQ zKhD06KSw!L1=f{8H~1$JkdcN32idg;3h-a%S7!-lGAyD?0)lF@EQQwxr6SxnQ#%+O^8mz7)dpu}MtNnhj{CEB6x^7U9xJp-K^&yD`X zptERMw7hWv7b1Wb?T?oU7P(p2fKWo3_!ZNlmQf{ajoPaSeYUEnI!6~);z@rP&UC0_ z_uB@zOmv-WZ}?6)bK55S_3FD_aMUKKvWzXl)FUab#N>gcUFsW&bpy5svVU#oS^5Ga zy#ek=RxZskQ7a7?3FxYvF(Pm4?jQp)&lfXm*=8Lz2sYc*6mN6j$c)NP+KVrcR#?T2 zpX(Kg*TYvtU@@52mUh^EKtm!17zRopjoAIc(BNrZPSv20zhR-0p)EmCyD`L2O$+S9 z5Dd2;9vwI8^@P-?ZJPH+D$TtB!Yfz~jN1p|r0NTeBQRCU`Gq8nB-v6g=lj#zJnh&3NvykbAv)@!!i>r>aK%T!)L!69L@A83|cH}kcx3Aq;p%;E$FC!d?w~(_Q^C?(6OB7 zt`ByWEy+6?pjbE*H>t$w?jV5%rWSIdnTg^tjlx?~iCi2Rzl&SdUwR$+R1m5;CrY=z zFmFla+*+D4^PT2?il9kd>|1sl;Ktbe*K#xqF&jm(@h;dN%oB4wO%V=&e_uiCnh)sP z>imsphGs~k=4FYkW?pkZtTnjyMbJO-NI}BS&Aha6yMiZlnG+%dRPkk3GL)4b!Am-9 z#R1(+s=T3M3mq8cnu(M>Vda3+NO8~W!`@$?(?uXX$+_;#yIf|(&=*Q0v*?PE= zvOtY|Fof4v(g^^g#`TE~DbnX9za0n%u3vSEVd#ne{*XA>?2<-JnhC&i33EHlQf=}3a6IP3)wW=A?_ z`?(W}{xQPa?0M0o4gpsTRhAwpbwpmu^@AvV2nYT-JQJZGZhq`H1NwT>=U)N516k2Hr12P_Gi)sw~}(^t1C(P zNe06ioX6YLLt!gy9<0x-hU6y!nut+PI<^rrs*YtkX#3Vj7-2FbF40@C zH8NWxZV1;lP-L;@mQssYM#GAS;;jozB>30CgGF?H;o}3g7DSKB3)YPLsx&WX+(Sft zK+;>LWDt0$A;)pwVEyw44%f0O-ZcqBNaumuD+-NXDPx0+XZfZ3H1|IJDaHVB+`OFa zex&&AkK%8Yw?~~tb>F7=Y^-h!ZpVF@0c-EGh`A!v?3Qy=QLT4DB;yK{=X)Vc4NrTe zX9UBg&o6x9x~eRsI>kSs{t+w;^-)hm!E?w1#6C~O?3h1+CpCU7>{5Lnycv4@FPBsb z-e=RBfY&aHQ{SRRXt_FJI)-`xyr&`v?Sg#74xE?N%+<9Lvo4kB9sAO-V!4DtgkAxJ z@Gn`Ad`0e>e)XSsQEV>ocCv`Zf~Us7eNJh4x|~hqmKHbHd~1Xr+0KePp3JhrR~e)6 zFzqLfbygeeUO<*jrHiM~dT=y&OM*@Z;8KTrG(3zdoOPuJJ&@NVot=+%s|J9HJ=qv$ zQ_oPTKA_o!N;hmraW`Ju)a+C(i61Xv&qlb&>-k~!a|^Imxd=VMO_;nv9}M(298=## zXOQ}^1*;;5fNFyah~Q%e4SPG_98ZJDNTeAy_(+&IxDyNBY4%mhqV7#^-)RW3mSZy# zvs37v@KqWjh3GUN7H=nkoj(j~EOJJ_E^2p~TzYph!=9gK^TZH;QZYy{>r{R0@yi%y zNiWEOso<`sqmL>1_)K*qKEu-3W5=1#7t0iv-VB}mF!h4yS&(PdseR7v-*mckCj$SX zV{UCvHlr~2gNYg@Ed~ph2Ii32LrCbsHP2+nb6YY@7eyakb;a(UpVCaqvq+hrj=$!d)O#5U&)sl0vJMJj$tuHn0}SuN7q-@X;CZPD zVt=~A=8GkbQdMmgT!FB+*_C3<&Y&{M}3@07E1I0NnpR+x!2!ggZzcOBZ> z!d=92(FJx>rjdOhJvD3k`EoUD%y@7`@p-9;VuIQX2If|>t*t8(z(0EUKz=Zgc`=rv zeEKb72|Lx_%)8iU3#DtnagRxS`p)EtKx@#o6pK2Ug&byKeM7p<8T>45sFG^M;?$LT zek)?u4K;q=L#nWRn0&i{lg3dH=7@00J^Gl6!+tIYRiEF%7QuHKpLP|=)a??l?#|#4 zQ-eSSuoF(koTjeZtlnBwl>kn1lGPmTTh%CFsPEPLaCoP)m%EAYpQBEwe421hp3=Lu z3M7Vv-&7a@>3xALI2z`Hn0+c#KegH|RG6Z63j3X8tB;w8f8UW7%ZiVoKRtI6XB3Ty zUDBVC#`ut+Gz`uGD78rc_Ete54dJ$Vd$YQ-miW$dTG2sM3UX-JaGtU5$JlPtzx|2p zCgV2s#r&)fw4q;KEotoW-lFS&=cLvl_x%%yqvOdNf|B(;UFhKA6(3?u0AkU7_S+Z8 z$&@NU8$X0X|-RkvT`z)Be$Qnk0(|p|se+e(q()N9rG9RA_ zI^fD7HUOVjX{^(Evpc9=01@BOF1rDK)>Mc_JGz9G*0`cr#kiu7xfLNd1#6&alp^xu z7#s^8992FZVPuTQSDf&~YKk{T=4Qcb zfvX9n_anANnpe0-+t1e*m}lvY5>pN$uP)cogp_ro4##aJu9p<)_iET1Pks%kon;Zq zMX)vt0tA=w0sV?7sOu@$nc4MeV0O=5q;s(%#S6|DlNxc@?}?}#b;fm^<-#yYrnPI@ zn@UFP@@Ue^5MLTd&HX5QC^BU>+cJ#B4<+4>c`X+(H;`k#nd)GA6=I=Sna1YgaP-|+IAsK}kk0|B!t}%+gm`5ApF(v1EF4Q| zIJ*L|3$SE79ecN5Jp=Tg(;rx;G1r2#pXCBU&><_{ga?4W<~0q=TfW@P zaxX5=!fJO(F>f^Y+8N0$s3tcTU1YB;?kT=%AAXo_{#yshba(Ul>B(}2iZ?ju&c3<` z1smeb;-1Mz{#|hlDHY~g?%LerFFzS`qk;kD!WH>9=7vdAjM=6uMvf(87M46>^KWt1 zb?Fzek>&bC_Sdo8)PVOEehfG{tE~m6GAWEb=Vk#+p$#p=umXhTF{sJSMe@*o28RW( zr|h9tTc%EV10V+)YB&4l@Szdtl7H)AcF?Vz!v@&mI+X%FLWYy2)-?0K<{e{nP4eS|!>VhRa0n(&RU;kdV#}qrO?g+&IH-Ev9F7E%o!YE)4!9{7h3xNCPiOyLejKLW0pkcxbPe_8zUd{V z=HWA?7hr2^>)fi`8)5gz)?pY{^8S`C^1OkIbs1j(#M3X%60@$FsGkPoHC@-l3#N;B zh3H>`Z)!QP#&t-PK<^v9?M^zPk$Vo&_t(3Hf_M3SS5_^tU%>xlxSGrfehCl&0B;xo z0J8s);q?C>$xDrzqV>@~s@v5k#0j#wa23M;_>(9!zAX%GDh)6oL9O&G@&L*tHJxFnF3hMy#J_Uv>xK2Lcf^&$0J)4kWWJ(ENqIk_zQ?fb;DLr;TXA}We# zbMPKuM2X1Hpmo&VzPEGuly2__KN#F{cy0fah-IwHLQ2L5zDw93?~#cftY$Q!F4E$~ z8xgHsXpXtO>D+K-L{YHjSOal5U*xotbmx>>&NEXNSLiL<|7_RUpzi#Dv zC2bGED52vVV|L;Y*DCOp=>5muEWf5fbJ%Ayx0cp?waWSZdiE;~-`~$iNcVC0ewEMJ zknjMm4N&oPkg06ykBBo(*ub%8dM>qEVI_{W3uRS-Hg2(FPPrg1&?K7nHBnn==dY)6 z71gyZf-NDvlAOhHh~R!vN{c4-7T>3|G-@5U4ws@PB8SS&gUau@!D-q2r3+GT44WV0pxzVs2X!{;-Yz6G2*3+IW1CEs3-o@$VT zqJG3>``ySD|3G4toM4P@F3~3?G!dCQDlZ~7rE854)b1he6T`}t1XT=b6+ntj%&{_R zx*iCuJ8pBmvlkIap#hNxK>f(W<`U?~4YBfWkAkWvrbkr{`U20~h$Kz2B}Z|Er&3SX@vdj>gz0P=GBx6h;F{M>K@3ea4q-Gar;}USd786(0Ky9Wgt`-75NI8))^m34B1rQDG{bx;}c$lvymz?Fa~~ zr@6Q@m-;l#OOveYU%>x~Mfeviw3h#>?L1@v0K)$ni)<{7=o~y#G&b!vIS_nb)e-1` z#%qXdvRVP;+~+sx>bvtT(LsX*@<}I7!q7kyqpJMAXB5yA6BGZbr0T~r1~Zt^;RfTI zRl+2?54PF2FH|dz5*!AT6O=3#ZkMFcWbKd&VO7Po;ITkgOBr>}Skgv`Yoe0X35Z0< z-r^Kwiw{1Rtx}*X0jI8q+xDUD>C{2^E}uV|tBHgy6cPHW+YLY|LAR}qNGSKsMdM)t zq?N`mzLc%u8XGUMT-4Eu4M?+xVatMk4Kk`>(^BGCkxl(!{7TV^;VWXW-l%!mfQnW8 z2(%vr)o8YG?=7gYnImGvF`G#H`8cx94f^u4PJO*-lwBf50l zOr#5gu8DvcM|dP}GZq}=Myix{bb8uI)wPlINsa~{M-E~uQYI@yOzzmtL*k6i@v<*^ z%wAQ7=RfQG{ogO+XX}1q*y7}tRg}SKk81Y|BXX4Y0;dsp`km?Ew(vsR!j_oWoC@gW zAyCOTE(jTs$Cwh8r^g}_fV<86yZv-Ra`5EkV_C zR74)F=r!0xuzi*PBot2PZ=B;5d(l~j_gG+_D9S!^{~1LX0)&3nO-J^yDq+?TbE6f< zOmz63&3auAzm(sI-XOq-_$(X7OJiQ;|>oa;S&g(2S6ma7-tkiu=YEw+UMl0Olc zCdi5*NDqlMte=!vhhS9HgR_-QY53Z{R@Q~KJD`YVJHl*-gze2)Aa%7;{7vbq+HW{S z(IGvm0KJj?z-5D(jfe5_-M4@Sirp&MglBMZbrl8CQES-M5e_L&X4+N+{q=jpy(e3f z7`yxXi?vOM=fNdFnABfcAK#Q6X|$E47OXq8RfU`gEHyuGou(Yx> zWLS_5ceg7MXf3PbZD3z9cU9sqxL0Dpj9P{_97yTFmU9@=fAjc#vf`Rc2>xiyxFr$o z*2%rqd4Ic(n9LLLR5q_U?Y%tPU7rMiHxdv&{{{Zf;6#)!+0Wrs;f%S27Qr1b6n$1H z>_9hTazIr^?ok-Lm>r%}!{79EkIgoW%`+qyp3NcHCx%MbRZKJN(IB6X9&(b)^?41pMwD?a*WAF^6(td#V~tm zfOtV}N#R!M>Z)aLR-)-Bsg)dmD|r0z>%C}$;=V8m!#p2igM2u$tCA5GZ>P2Znvp){Ur5hI zZ>}n}1JwS-TA@f^Eu(KhBpEEYQMJWGtB z&@FBs`!Dzn2hM_1bUnH`6Xxw?(%+x4s?eeNEPMUN%R2krpJ!UAQ8kV&!{TZx7C7_! zBhjZRwyqo&h%c3^BN<4&;uVFn9sYUEyz@t9-_q5in4uldv{Urf@sL6jvpVyFh!G!)fcxT=To#)2*T@b8L7(eN7PT zABA-dkWzcx$&}t3!?nKb|DQZ1#($3&3=9Ae4haB2`akoOv$2zW}Y`!{Ico%MJYYSlZR4Hp@V7a1499<8|n!G3j3tMebuS)H=Z{cMi zjcK3-QsBWeQruDAc0N%*w1M>H4gz0Q8iR4$;Dx|hXCA)0)hz{C#f2KUiv+~A5!BGy z)FZp(@2sUsVb-~Bx0Dp(R|Lq7SH~Yv58A1M`8XaAY7@gV@@Anzm#jP2%B|mA92JNGBB7IjTcs7_<*x# zlVVwn3D5LJ6!XS4uBPVL`Q!EV6!K9H+Ar(O=NCeM;@)|U#auT}<M!_`HJ#QPwjo`o&;Pi5|c#iJUSlfiUf8zh-k^~&5e1;*n z*UDwmua>U{Xf>u=|I0E8!`-B))XRCjJCg^aq64}^56P_($&{SY7sEn8EodB}HiL&MS4Tw; znrh79oX#)Ef}O;)sqE#0`tjT(OD z_;`4Gv-5Sv56J&{i*=(Zh1dZB09=3o04VO^2`XlH3=>g+=2VQUkc zC@&4nh%kKnjlxK9MyP8oD7C)55G>Rm431jI$h`^nXr41(yKQf;w7H=~MfOK$C+mG$ z`eA(oYXvazrFO4qAJ%*?xvohY?d$kmP==$3K$kSuUEvNdVs=81F0!vDD_69)D5&+U zv{=o66tW7{>%kRaVzYvT`${ZZ^V|g%MGrnJ1sH9$XQL1Z-Q_GkV&MdP``l`dn&5#$ zym#`@5o_<+6553j^bN4W3r%g%Xc?o%B%&ae zuO)K?kyj&DuP81|Hnf6MUsCVT{A+G-Xv>2ASnJ^_l2xY0s8F7(;J(p^RL+xes_xnw zXNq)1>|&5EY2Hstt8>Z^z-j%gQ^EqRCoNo$?W0fm`PVQP*Z5@J@8nItaT_@;*#18c z-`CloHy#uK!0TVBPw?L#zJn(-o3XvEgQ3em^vuzawLfG-=>Al%XG2TX7XJsC2GJn8 zCanVS&?wtLyeOdp(#g|eNT7*Q2R|P@grr(|ajjfyjc;Zgj~x1qG}a}w%4R9ns*T14 za55j}F1LAR3u_}214B>iHD#4vXd7g#t!0dKs;1*r)xlU=nx20UTPkXl1R~X`T~M*# zvC=Ly)8TR_fuO6Fsc736^|b76a-@VAG)vTXsm^E=VYoDN3 z*Kw-@93KdvEoYySk7ZM|DyVL99fHGQGc-9x`~6C(UN+Zr@1BLfjJuqw@KLLhO^K3H z*OLN%GXh9%N(^_D?lYsXs-jq3M`|!`PMaJ~O$ntGH3hj}HH>@JMxb)9G1um_+&(~= zr~9uFz(>3LiOhZVh=`+nPS-61@f&0A3mvqyFz%rn4N3crKUDj|qA`r!uU_Tx`TTx{ z`Z9W>ud8qYwm3(gJ@4kAjC;%C?MJCigtsl`@3ktc38^E%5soSxxH2T0tFJ{iv~{V^ zBe=6Qrx(fnP$1J!Xt-D!#}Yrfv=Krc8@IzikX~8*fMXUPR;CE>GZbUx0?A%@+D?*X zIE%(=VZNA#_J|R{r<+kq%R)m3uRW&=WgwMp6ZE!9$s=+R5QMVq>HNOOS)V4dMV-T& zit@Ji8Q?~wEnyZ8$jJ~?4e(zD(Xz0>AU=|$xymMBIQsl5@cXkmdQ*qQ5laW+x-zSAQe@{gZ^X@6n*+nqczO)NW=kEdRG3p`UT{Tj->{x4(}~rpVxH)r zaGLhIvoA6v3NG1m*e7g5Aq%5caJT8Gvh%Yrc9@-&WE0*sL_Z4)d(C!fu@395b8Qd( z=lY2X9oU<4r0$n;>&%|aa!+16FMeNg*7YPb{<_DY&=(6+d>7fA$n0deM{ z?Hr!FoEA*FyDZ1S*%95l7QTVkRCX^xEx}(LZImWy&U)5DJ_q<#qff4bt%BZJ;M_GD zi}>u{EK}y%g{Xh8NAkFGV$S5P^8B6zbqT%?1q0(6*VDQ7QO-rpDBLHx=8ksje-&E- zy-Kg~X*ZWUpQv*XUG?eIjM2-S5jX6_i0Pw4#mUP7*ir!q+}u%k0QP7%lEt;!C9``T z@Bgma>yoEjv3H6JX!RC7t8=XK2JBd_yBlCRRqpgi(x!cJo9%dg)I3#Vz&I(mz8vd@ z8oohx9vL|6vBh0efISAE;&}?=``9e+Gs)Qh{MUIIW@5QO+&Djf8bVD4mUZt3h|>hurFZ4(6Lh8SQ(UpYflRH?Ff`Z=ls8${zdmNtS!pztn)&WnneBI` zc(O(^bC)OH=c{HUJD8T?N4(T9zp<<7!xr)q&5qG^xfXl=O4P5ct?x7X{qlL3KB+U2 zp=UYXkLQe$XXN9&Io^#RtW<$l5vMBGvD3}J3_tl+T#`su*1E)L9!kT1J!tZfz^G@I z#?J+Un{{B>5ZEp|l9<88O5RoWtEz!^*o-cG3`S)00>enPUPW4Z0G?_VaXDE2FS^bt zN|30@)@9qa(Pi6qmu=g&ZL`a^ZQHhO*R7d(`e)sF%J-AGB6sW^@f|-*+|_;%j8OKE z+jz8@_j%P4?UaVf5vho;B1YVY5K!a;G@s~kL0ZLlT~NjM4~;bhO(mLc{-bD~hE!xV zy>Af9gv!QRFv5Aj-E@G*Rs1^o1?jS~3}^0yg0L|Av<#=gW1+GdXzsyh7HRV%<+U=l zFt|;D6|G_ZNS&jx9LE11b&<=DIZGS}y%-kiiyUgp)VlAX z72jF+Tekp`Ev8}e)9NbO*a3CokFRlIibNon_Zb)5$Ioanz}F;G#@JYlK$0ZPHl! zWjOLcGpo;4WzA2dv;lR8GZqjDB|6(_KivVySxd#1u56F(ym#*i0bsQtmUqQ#=iaGw z+VhoiOx?*;=tGu zEH9F8XHeyVIx*TvH{>Qf<4~XcJ6|~JtbY+AlDbt-doV_zSt*msW7o&qaH$ls68QmT zFu(NY@MKuRqWaT(@$Yiy!UG1)pvkLG%ur{SYFY~-hh_2EY&=sNp3T3af%iAC%0|Bj z7d3%;#(iBGMJ{&_RdBiMK?m;bHfB>?Gd%i1L9ayD)|(Ta``Z|NhZEi;L}<6x_#;8` z&#vE(rqzBZJ3qPyW+Dgr?-=d&5W}+)hZUdgU^8*m*$a*J4XykJ8*aYiEdvM{wsXlN zQ}F+ev_SlqnMHp~QNpjV|3Au+qrQu=?f>-U#tAYuLG&=eFIoLXk$~Y20EHYPsmj5O zg!w7IsA+m-<)>?BMt^-~b;6Ikw<8WtH|WCscHtY?r+H24%|*vCI>gyOyu$Lx!wMcH z_Sb$Fr(14_h2`Z5q6mQD75khlp(b2^drPV>T(1QQdoZ2K=^+Zh0kNVDl#`DVi7@F~ z_F$ZWfU719Q8jeF}(ord;a=m_F>xunnP4rieqYD9x^H#xs^YkaqSw*>}vPk zhS`vzeSIr?sy|Selk=w{YN{F5v1}%vTQ~Qqcqd?3+BsJ8dWtwjq#3>Mj~uCU0R>4;%f>nx?d_L?xNQq( zy*6fNrHOue_tK!Ty6>?eYe+@Q)*xqn9@S7!6}o#iAv3b|(%w5;5f7LN;& zRkyAbX`?Kh$ZFRS^{#j;ocsQ$`*)F(le_iex!JGqggcf=`5>e!G7ZCqL+h(4337zM&WkH+EHqN_o1V2uGAS^q$0UoBL`j2+$C?)zsb{j^d+}#2RFO;< zCvMsgOatE`D=Sjuj7-Q%#K!1|QATVk4%Ale4zr^VDT!5CU22hlbJf6iI#O4>*fCQY zVbH}s>7;O(WJGjQJ2Z1luiIj>fQ6Ko4>JLa`JOpP5vw`wHnl~mTuLSzu$1oU)}_jPV4!Ae$QziHk63fQtD|~5@M{B=fBz@ z5~P^-S=KxEeP3FiaBfU^>LU}d`l}hZhs4FHEAS#kD#tHL;;UDwEiI}9b3AAO?#jgL zxY2YsGI$!YZMqcLW;aOH1$Ms#;J}&wJa=e*H~M^Bk2tq~zf8TKzYmO5SV9R4zmu*n zK6m*z-Gp+tKRqLm)+3pS+U&KY_K1Z?%0@|Qw}bdrO3Z|(6(P$h7iBWC7OZ+mNa`Y2 zmROUA6W47N)o+%Ytsz6En}p(MsGVn*meIHo`igM5+2oRzyviHsbsQ|zOfHaimV;nW zCFa##ChE$k+jlf10+MU{etw>PJT*P7F(Ra2iHKeWo`55^JTF`%d0R*(O@=gSWGW~K z2}-g^+g#FuI-C9r4?NFduQ}KqYh(uZAy?#U^Qy8Ux3j)X5Fn|sv>r%$<)Vo76f_!3 z-8d3=*SJBoRa!xeb)I&gA_UKlSygD?xZ%-mx<&+doR1(3wK8*+Vm9OzKh0@ zm?+3?J>#hsvv5atHTn==ch~!^kGFSVf=)tr=i_SQcRoi&edS!pQFJjO-#p=+OQ#ar zjh+ecF+d|Cgn^)C;rD>fE-{};wWCz)JmZ$)sts5S0q z9YqQCyQ;0310LjG(`NU<0~Jl%1dqfNaW{`0i^*7{Of;&4;5Q`afPWiT4S9;?s$$@==275I(L>h#Lp$gc>@pCaa>o zb((J!_o(jMtTHHt%Zx2>#?|2RPWZw>=T=Jq8+zac^7?>_+V`(2!;+99G?vWb@&0b>39+BB zM$e<6BNKU5x5eH<-R|qnm-c7I{#V8JggL5BH56rSPZoPb>W^PO;vow)cK9RW}hy zjBFGfH$2q5^1*Y#CX?)@Tt^c;QI2vD8o+Ly$1`WL=~Ve#x}6@&9MGPeIB_Y0U)T+y zCly+OgO+1|vCiQtz3d!6>y%EDo{q?DabztSei-G0#molGIzx3dh0TqLBQTMbi|4eH z3mOJ`>$|nnbbUNK^Nb+BV7*N_$sgnQE^kwR=vm$sFSdWbew) zw*99h1*{}0y;=^a5;Cz1y0?h&gwqwmPp@!ln{Dz^S?Ms%uXm?>@aO9FyU2U(11dEs z2lD`cHV`-lj6i6t#A#`Ph5p?JnU$vLR{kEG^#lCd(q;x;Y*`!ENz50F0H$J{i{Y_j z(}lO)5(y4dJ%4~wdzCs$0T(V{t4lw@+I7w>%m4*+*3%qO4MD{KPxu+7%ov{Y`qnX} z>^!Vp^Z|L13*Mon#(#!D;KWo|92Tt+FcG}ZL0Oc=bJy6K79?Q}@@KvxSWv&iem~n{ z!HLLO5gZ0=L3L6g_G4Z3CK4%-poo_!l83kXLN9XDfHs*-B%zo~0m}1)ohNTK!_hT` zLOT2bF?`U!4^*9#|8xA^8J@10pa~X3ncvTA9UG^l_YyL<3;Zv7;2N5@R5C?g-kpn) z|F%4wp5$Lc70ojJ+^KOX?#2X46I7zE;> zYTj-7_=)!(jA=l6x4ckDwE{?-u5(@Yv#zuCN$U(H0K)7p3Fnajv!f z(hxu4e{bkjG`60mVbup%e;8Y`Kj2uM*0|b5E(rTCvI30FG$d1 zws)QVsW_z_3yyX*Dgs$e(Ya#&)RHXlG%Yh7F1S%Tmn>9xT7+|kN=w>|gu751iy`A#vMy~gCt0Z?#W$inif7o;z zh?+R#;0jMc3W@xK+!|iN7N_udcadvR=OOf~v~8yq+7*Tf7vmLp3A=(S6f!n-la+7UipnpipNUGeJ`|Iwy#_VEo zGGLSh{==72)KfajmKbC)732ulnKxl!xrfs9%i2eXnlUA?tQoN)#z^vG z2~NGLI`(8)Nd}eBDvCyXRiGzOGW`y!lHuL8aZ2b?a8CkXD41WP0t% zv_+mb=Q$^BS3+nhpnQ#c%;#bV#E0Zyno~brMr|P!)f0}i^X%GEi;oPt00_Z+OZs2g z2l8;h*OPmYN4l*gCqOfEV=57;!c9D&;Ba<3Z|o;eL*$8UKO1idJ?g<9{Y5#| z5RXXX_mapOIt^y`iJWwT}5T z5|{A3N`p?hdmVmL5RupbK@=iZUAM|s)j=X-b!1JO<*|*4V=QVtHZXJPnboLgSmO=A z$|th~6JT&wK927u?W8= zMaXd z6+eL*1o%NCU&rwWLs$$WO@l6NY;jBP?`VoJ%Q#>*{r8xphlYaq*ivZ}x|b%Li$RNM zwr^#{Z3)THq`zPeEF&b?{jN>*Axw9(^pJbbfl0~)xI2~|+`2-Is%F|H~Qq=`1i88e(vqUxr-iR|*7vG^d;W>lVVr!OC;Vgs2{J;gp zIJ#u#ySu`VOMQi$%(Nu$f#kQL_|~JJ8pk|%_apDpXs*sXwf3&vVQ)B(o@MjN`O;>Z ziKuh`xtTL$+&R2jY22J*D4(;KMlyElFB09RnPn+0%p%R`uf6;rWa0HF&F;-6jTE2V z@m)@AG4N4;)y}`$%-)cI4ju?GA7a*BsyAD-%KS^GEGt+&hwHJ-1>~@pdf{OI+xN0!U z^5D(IGp;KS6sN3Kx)DgFgu|uqdeaoF1{HD32Gu#7R%>rJKXaoQ0yvL2Ic>n5OV-y8 zn?o#tmwrW_(8J9_Vz;O3c0Tje&P?7@^lTV-#GB`IPvq190SHb+ggwQGF@@$*PrF;_ zld4x24-z1qgx+>G|Jv2&Rf_h!%ViZ%)Qp`F-J8`_U9T8E&=J;_;GfylPm>I2rjWLK zHXuF|tOXdsD*T5jMSj5RWIJ}tRDq%V-SOI2RRQC}HlM`FWWSe72If^B!1!P;_|;}= zF_ZXA(h5L%rJA2(%0OEnDJP$&Nvpq(Ul@SwC(GqyC-!_rS2cmsJ<}Vd@Z!IxdG!6x zBGH~bBU&z%Td3p3;_h%@)#{ zS!@IDi`zY{rKr+rKvXAc@ttY9(I| zt9(U`x~JrtsC9kX-%~c#p=!>Rc#oCl^{Lcj>6$8*hkd$1Y(|@qQ&plnbT*E>o+s)X zx(&`U?Ndr)4Jb`D5txmW_ebvZHL!!qWN8uOjFr%KWTd-&) z#b){&nVgG%>hLbP&Ioi(X-8czVc*W*kS|XyH2BH443rP;J(w7NH2t2fnReD-Ot*ch zcK+9x^;SyOj14pZK)~<32-g4K5pnvjeA&*u3QIe7qxH_)7xaQ4F3N1_@LpaI5PfXx z$OEuiqBeCO0RuWX#f+|@zLc2sroE?|Nl3DQVy(kG6MTe>W8m$3f84vuX&|XB?pl+U z**59gC)2PexuP5qUWSrwE5a(sCW-2U*qSs`H0{`+Vkrl8p4pmMDiNwGnRPPzy-m|M zbYkrG!*EMndCtNwADDJ&`r3)j89R6H!!`n4Pqh5{OZ|$GfL>pH=%s&=Tdemp<_3fS8C<8i6LBr)f-8T<;6Nn)t}`Ayrk@l_gfwiB zPqR#C56V6xhgQo_nBilwp9ZlW)(uHYuIG6U;17RIPL0ijcO^2DA zu8l!`Sf!Fe2z-qQb{*9In2+ z%<5BkY+;(rN04$&xK^s?C+bq|f`0dO#OfN|wdN`ZElEF>UP^3s^*ry#R)qLw?t);* zWeN>qm@>NX?~cu9t-pqIy3v*M`6B7lmQ!p#%1l=!lU2yj92@!&K}@UC;z96z=mm8L2lZ&BkNKfyTnz0B_>GIDsC^ zM^KTyl2RQkRfZx+M$qx;H#(hsBr28T;$&;~bn0JXQvXF2=wAkM00~NgY9=6B%L`5^ zF29Gs&u$Ph@&U8=TXBmpm}aYXuU3p$=`U;=ZqJMF*YXGcnZ*7ctH#k5hgYdN9$=?% zBgc}<9i*=I|Gwqp`y80TleX@j122xJrwLTk2REd!$wE0Bn#9t^1%9lbk)aq`HRf`K z6y|F2+mmlWMaBQact=|ZWw$=j9)vPQ!DQg(6qTkWMP=dFH-yZut`(*ciSwvJgPXDp zkxkhz7+-rr5`!>T)YPa9qOT8+A8FYd;=-utChXsa*0w1rU&GU-Mn;ImDXk`bh>8+4 z&ENdT8cUpFj)9)YQnpUqm2%UnYo^16!x3B@KoY)Pn7HheW%5sfmHz_VsR=zOGl97j zIeBm`8G$yOYG7Qkc}Vkzp1na&p|pd?PW<_^Csa#)M$t^mT%0I#NnCB+-Sre))p4Xn zJ{%7xDqdeUE_xo2Y8Z(gH|*au*p1R-7X}x=KLXm0q%JV%G&A$;7fSyeg#ej&*lRE~ z`r37*2(ZlVn#Fb>_TE4QbJNhR_OjKoc4x~xQtmMW{rCmKy##&sy{2+N{uSRo`nEal zIa9Pn^E>TZXz|k>(>XT3j~aK0@Qvs3tTBndZU?Oap#N@)23%|nDr-LujSuT2!-}Qq zBPoXA+)*xGn)L>h0c8hj*VNQyJxB5hFPkynGiEwjuwQ&yP?+Cp@My~dw5h;M zyX%wjp1k*-8xo-@XutgX*c%Dwh6u1>%$%%DUmJ#Nu<{XDotjVKQwRhmMv3Z?=T7xv z&_ZkrdVO~RHXgaeKW6A~nh)%OhsuWV{&g>!=h*bh^bEe57GNbEa#*_{JffFQj~<#k zIQ_TN`{=c&_Uqhp74J1guC^{FF&MlQ?4e&RT6aa2?cbHnxV~JgE`sX0;bko7qdm>o zpZ-bg8dCPFNou`yg@kb^sw*;|^r+fsc+ZA5{cmPo2ZLR-RIeUN_9^C?QzqvU5EEYf zz|6^^ImZSK9yUbJX)mf6Fm8`ARI1BUo8R ze!{k17i?zL6qxx`peIPdm1rMKe7oLu#FPN1+o;@+AkZ!UgAJYh{73m)0f;L%_;o5H_ z8f#~agA>RZFI)I_KvogCN4A5u^JDfap1K?uO=O+94m9@?N0at#&bh8xm%onv=7rPr z42o_$5oA46T3}mOG{EK~iNp)9E?*clurZwCH~^JAN+>72Vo;p&p?0ag=(V0eeiZrc zv7DfgmonT88yzTSE790=x@~(7w^*nxd_NQ*bq&l zm$l&Ux}daS7!OUa2Uky_FZkc~A~nJo9dHR7cBkV=%%A%GqKitkTM(>xnKZqAd2BRR zI9tuIDsO*giZ6BLDKJ#1g5Sb|#`0W; zQF-@=w;Eg`vWbn*VICC99H{0BjFBYG2@bqaQB|M;2M?m1W>8hOt|85hzHJ!n0!%NJ zpuHY#1FVCIiR(!}0xpu3FB?4j3~lOz&~EhS_vgC~1S>Z*-J(2P2(}<8jaOJ%{YEyS zRwxWxEQR+7iH|?XFS>0c#ES2CSReYl8nKVT0+SaPi-O(>qf;(Y+4Lc>@u*F8mP^_x zh0mHuF3tj1UcVd>K0YTBLTx@1TC;F&iqomRMlvo9CI#Meov6`p?3UrTua_5YbeWQf zVkonj$A$18tp7{^;3YzIpSzc)^ey}uZTygmaf)rz3))6Acy@%~I#^wKgzu&H1i{Cg z2plEI4CjO!DW9NxZ1PTGhqoqn0*G#Uh>%{0?d)Dm_P+Fw*=&?&+;n{K%rs2yv7Vqu zS#|dnwk6X1Lx`r$u<_|mF)gg(Cr5$W+0p&&h6^%(N6pXvzIVlW?gaL< z2|e>=r{!6l1ziYjJP_`1&GwEQrce^B03;M>seQRa4^fJ73y*gTJVcc;0^c$ zvelkJpE68SlGnxh0^OD*xa{eQ%EpHjmaE@Fk?Mq^0}zz&<*Vq%58dF-v%H63Maz*Q zfN^MsZ-z3WK%ehF&9D2^hvD|$Y53URQzQKUw>STDaJojehW|AUU!{KW8~Y;tT=xXn zA-YhJSW3rICiMbn&%mzR0A{(PCd#+8aiZ0~*c)effb zarkxS2ESA4bm>vlh$- zi3%s3dL)l+#Uyh`Yy$ZQW38nj){}_J{&_~fDJ5IlwlZ!@Ucco|wqTO7pBOW$I*h4I zJEn^bTUA!XEP#bDqSCF_`Mu`t?@1661YC* z>09>5Io%N!v`~0>ushB-2CzV zitUNH?uNt5X%^|IK%1Q8O;k{I_xlwcQ;PPqmdQrOFrrnfQU|wWwCK34swZO zBqx^jPCl}amu`Z)2U~7}rPX^UA(+$7!&I{2YX7d!hVW+~>6pQx{t26u9x3U;tU?sC zyDtJoO?UNTTBV{&TO#$15|7+`hWQ;yhG!u+9DyVmI_vY>kv7pQUO`^iA?Hh3a931Q zH%6ZrHIer)4YkyRp(2Bvc7br#?*nj?_&9nzzaM;D937nvy)AWIJWTM-YCJab@^V)` zCyV16Ayz)W#mUl`!sW>K13{_t#vJ6RZF0fQ3eXlE@#p%~)7>S`E>|PpA}Kp<(>r87 zH&OJ6Mcdc^a1#0diMR?&G=vZ6PXT^{mptq{;4z&6O9)vWfhqF_Flt1>{T->ro4xj2 zeE;KJC`)b9e3lC^F<8%0m7<1qr>Ea#4GODVPvj1Hmho>i;mS>LgZ(iHgK9QX6Gw4< zA_OHip~#j=Nfnb~@{C8xnDGn4_MO_e1 zAf9M0UmJEiN5?=kKUHk$E|U`Fu^=1t9DUD#!wsn&BY~G*Lp#V9AN-e=e3!Y*imC`17)ZZ*_Qskfwe!nV03Jd zG}ZcFUY9YR+N^D~;o|uGT_+#%|gSb00W2P#LIGHdc*089<@1fgCzKKQtWTt>8 zv&E*j*9@ZGE&M;C3 zvuWL!#pWeDSttlwcoA4jd~Lcdxbo|+Vd5?9W|;4ulaSJ~p!gEO)0nY+*nF(v-F2(? zJ{}HSyAB_@ZUH6Q0e55swLx!Vysr9<=s52|?0Li!{yS8>!#x?>No+?>Mng7huE`6~ z3*Ag6caN`V&;t?M6r9WhH-M}8VL+K_ewn=hc^H&$-h`4E|01x40q*^cIeXXO91qM~ zFa*U-LGu9f(M6z4e{Mg>HzbylMOH&y@nt23o|}(BR{P`~tx2Qq!Fvoe#n7{7W^8MG zcs`D%K5}=ox;*S3KQB{tcXGSBxV@kDkLH+OJ)9pu*CL6rp0KTxDjPE$>hca5FoR-J z-KE#`y{wkTC|lx6cgFO(w`apQZ#FKFwwD#AM%5H3j~bjVU_bg8M&$9C z0HinfTBS9%4 zr3Hm|Nq7^yhNLcFI@cWax9Sw8hIV-?@ua2CPKbQ!zI0cg;nO79isBBC;%6ydI#xa8 z@NrcZPKqzw)m~76D~~^3VeSgioz%bjEX4L{K-_j>jV+aonVLUa;Sam`+WmKD=@d?YBG zWxUMuHPA3Jf{GB;N}Q$y@J&b97HDrwuP@p;gO%(mSLM=&f#VOXAfvGIdn;s1;9(Z^ z?`_MT-TrcM!LxoGjcvpzlKPe_?IqLr$R3ytU^8>eKfWf&^*`Y!XbVm8d%$4<)ME!+ zhD7XejzP+-vKIp}U#36Xoziio&bEGw5dfZ&A!PF0;TWkLaEZh7LwPvXsEh8%OYy+0oI} z<#$wZ@MK3e)#qM>4?e$1^mvk~`gDL@X6QOJ+X7ZZ5j$Wyc#OX74l`)xwtH^0z5QE53?Cip z$(i2e@;=~~_xyQ7x*@|a93a?oxXh` zrQntJpwNFb)IwfemCKSSWCZj5zx_Ks_F4k}fO8W4*s#9A|EKVixtUk;Kmh>Il?MR$ zef;O7pN)yR>95v1;s&XsH|;cJ=YNyyaz4Ks)W?!{RjKdYX4bTASyYhhTMg(s`%3 z9xt<7$>h9g^RE(Db*6_A2G=0}Wre;~`Sa+)NB+9yrB{iy%@or&mFt&>#StiQ6*h~k z;X=6}oDiQHcW(N}&UJkE%B$Vkwa<2A!ZiaL>4>?U6UsfH+9K*lxsT>n-+H90gS=lK z!MEhL^3$HJmt%N^!o59-1>J?og1Ff3%klJ!12?M<3p|)sH1ICv$be3Hk=w(IDmps4 zaa*FHa!axz!H1MT{2prV+edAKF%LsBlSO3>cFSl)NIxX6y<>`P&KP<=GzmXI?6LIFyQXe1grd1+EA z|8@l}gnHE4n)SW?Z_SF*A{)}}-XDWYWXIK_-UTiWu!W#BTmS5DM%De1szGX;awC>S z&AKyi0XbwQO0K1^X28|<-1Vl`WFXW6$%`gUC6(! z_hwG!mIZM%<##^JiaE&HI~`OvWxvRQn@w&FdZPxyWsFkMJxB1y`U>oFuoTu8@M-DW z#4q>iotb2{mtNs4FNh;YU3c9-#bdz=wv)@-2; zs8>T<^d%p<4rdy;Pmp_>QQeS7f^@0S^LZV2@#bA+jlw6zR}7QxDLb>V$eNF>>i%F0 zOQ_w1>Oano`i->}>&wW&sJqhZ9v~fkvsFokx&_XMCKAwB^-}V1Jhr?lz+dfO=9Jsx zfsS2|U!ZN5z2VJz zAs`qu^XTDaVXES`!Jw2a+7$7i0EW}!5vhe6fW#Z4X{-3PY$+Rl?~81#?CRWuVh>#9 zJF(Mg>&Txv5rU&Y)S@uhcE0K5fkCsMA~wK~X}l^Llx~I{Am+RG#R+L+a4j!ENLR*H z?2_BUb82a@@FGEI%CA#DbLcXjHsLlP>1ND996PxyBA=5^kQw7fig`6Oi+0B93>e#S ze494n7Zj3#;sz9ryW_$9tF*Xw&#zPzs}9`9l0K>E!aRhI#itFZ!|PMEA(9lH_#$AN z8hApD?Fhj%D-IHvccZ;Zlr_d3ELkndN@nbe2d3f`_wKSmsJ1Yd9X+FO3>{za?89!; z07dy_RC=h!vl1joNL&C$xd}eq^Vs`29tp+c30J@XeD@f$cHa>+03R^4ofPSH9C-+t zYkrAHHr|r&j+$FxBKvY3t=t0RPLFX!W`}S(-Wy{389MnU}k6b)Ei^-Ca+q$lW8OrHRw%dMR1rpXjWL( zotv#87m|}+bV(p!VS`;d1iz05 zR8v8e)>4j8BXH8E@UyVmQ`p+wvy|k$5Stgo*3%;}%>R22iXz}Z*|!=~bLM@>=@Dq6 zQAnD>INNx!<#7FEvK5=Y8qZFXJJIY#tS#5rE_Zw;TtKM%p#AzMFpr$5&*hRHV&f|iQCG)&z-?b~vw!ko=l`=ut@_Jm2Dpqv` zGlQUfq)28B8TE5qu&R2$V#(BE}xvC9;=0#w>j5gHX;HwD228(s zDCi3kSL0ms>;;-dNu&n5y@gSFLVE!b8{UvQZUR$n$Sp{6oc*RTu48e*bzclJ4&b_+ z>oC(a;wB=TZw&Z!xtA?1+my*9xIs7CMuyI!$q(7#~#!A#{NP6|v5_lUxr1N3BR zcpr2Patte@a--CCO&6PhE1+qQN6wZGDloEXkU~Yi>9h^AOWx#!a1`hKtl3+ZgR#@&#Mq3Q6<~XkULu+{7+hWE z=d@b<8C>j%8Aa_L#@+PTrCJ2-E(qVuQV1S(f*nN>G0}O0RwcOvfo0UB$dbqCrdZC; z_}ass6->E$G*R8q`?w6md_|by0&Utozxe&U3J>T%GT^tMCoyg#3Bo=Tp=~}|{-tRy zP);$!ZkfR3K{%<8b){K(bRsV4?vcuQntu$3;QyemNpQGUKPY)?6Cn+QlmGfXpKqnV{LuON!F7WSl8?VTJZv%p}*hWb+yb+l2-CrA zm{^{_0Gj{0>*p1C0{AasbRdYqkRihAmG<9&)j@7w{4Jvt9vkV!N%suwBjZ1W9bnM> zM`oOd#AV@LcCv}Aa$JzmiW(b(!X1umB)QlvV~1zIZEFn1c)onk6~5gA#Qv7|jxjOW zeJlPF?lA4uqrZia{r**D+BJgm^&%eiGq`QY3OwpEPk8f$q}R*)!c4c1Hq7eP>qBa; z&%@9~P4`#9s{iDo{12dh#GQVYIg8z48lAt`ncoiXiYA|vQiE9v=4;i32-Si#31FDH z2@n(Gbbm;d>j7Ae#_!EUt=p;Qdiq6~BU7U9`NTjaV2i}SFX4%&n?Owc>A6FN#jjgP*|7LF%0agA)Dq_oed9QlA1{+um^%}|E@UWn9T2&7Np{oiKnHFqDqZ*^sc zQZU65%qmT{lgPS0I>5{+o5=g#tPSF~W7*C^l4tbzO+>LYBMf|XX!Ya8bRMOcmk&j8 z+FSp?+a`hq_ohX^LpG)x}z;lj3>>!FMokIK&Gp;%iGJCvR=+Ulh4-i|oL+sTe zz4490C#g1mXd3T203(U>zUk<9CNJkbV$d*RJjt&4h3(4unWh(V)_BYQ?Vlf5KGKN! z-#tisQJqUfFKPu*-cXZH+LNU+m`!zr`YN*-n2dySnVe!I=l`M#s0c1RSP`h9AII^4 z!n|qn`1q&a9T>2IEJZ@)h|%|ThbA7EN2BtCGC_{*UB^%WtRKRU9gJ2}AB-oV7ny-< z)Aixj45G7mWUN|w`8LwR5$1^*9`&rGgCy;Lr13cXP0~lGoaq@#1^^O#J0I;muuJZi zGnOkSZeMk;?WvQ*I(x?aq)c1;%+pWBL**!Kkj^J6QY$XhAy3=V8V%(x18YNl`~Kwa zDYt7#E=mq?XiC`|H}156Px8D01mr04bI*w=EzMEpxj!M#zB*py8DR>`E$f?ZO9qXz za5~I8jhLko8iZx}ig{N1MAzj&#?RRDVr9$t4rc)qGKk7xFU&17%7IwZV)MwhE~7!D zx_aFj_3okrWI@fn#YAWnP-vtSEhAt|JWPv-XMcu`ufgRb8i{`)Kc_|Yxob)QQW2Yd zV7szySh#kOk!tVxP6sIfnwe74h37*{)(o%|a`|QL4Xj?c4RfdI+jL)pgyo38_!O8Y z_Dg5^Ee+&Q!RMBY24}T&v*7neOq+_-^Z8r0Gs2Dpot+&Aovjy6!X{Wk(D)`h)Wo`; zK2TxqJ~yU_Q9PX|t((rC9hf$2Dm@ zaq6Qh1DROcGTm?R`J3Yb$tx7`!S(Mn;_L#)}=M=+n;EBvr^7Re#W7O>)WFAJX%J+K6tR=^nv^u9^zpZ_EsYn6S1pV#~ zKsPON2y=hZknOOkVkHe}kpjoDSOwo`4i9D_v}m=gqsToquwy6x?G6zm(_)h?4t75h zgTU8fJMJZcxOw4Bn6f-L)BX5ZuRYmYme>D9*Ra*EAemP`aHQ|Gn=2=n0d6KJpLvA= zjl>i6Py!%g@y4Dy1}*LpGIzFuj04W8t}pwuG0IB;)-|o6%gr-ZHNJ$!b`-@eo*W~4 z6V;Ey)XlU^LR`!#fQt74HLHSA$I=CaoC& zLm(hPZdq|jp7a2O7X(q_cT_#@qsWVZ{s+-D0&!3a8^AjV!n&r|N*7GV3t=x72?!1X zUHA)4NP#J$`R48l6|I|>aTD)SpSn^STU&hV(l!)(9ke4KScUC*GnqFOLg~pZO)(sM zpgNPH_$LCq>^SFUaT?x@ocdB6H096+Etr&CWK==b`P}i-iijE$x3HEZRQc=YP@Qn4 zhWUi66U_ufWK0ACwNw4@y&3Uu99T)a9vbhHoyp-1aJbuW?R^Sz1Z^P7OE>;9x&9+Z zX(D~#=S&$ULp3HoaDi9^)T_~-INz^7NJj{X(7{!k!XWQ*3SPb2cypO? z$?xmPEO~y5w}*iAB@X9OvJPTEz7F-hjHl^ky-;y_IhCh`?3ApS4po&3QagKG_iA}kEwv4uH=tLiq z$>Y>&21Jc9XSVFLs4V&<=2k3rvqi5RY5Y2GS#ZaF{p<#GD6UvF0y^O-_xZ7_Q^YlI zDvE9C?E5%%!L}dk`{@Q6hc_?XS3>`;1J^|X8aPZcG^b^xdQ%A&Va=bXDGUM%!9_IJZdq=Q&g!CHWj zK#5Yi7*fKI#dA?P>pZ8EFfNDBtvspGe2r{hT5(4c7>%H8ucwM5NeYNk;E2yIg*P*& zhCI4AJ~mLyJuYj9`D%L&p*Dsb+-{l&l5l@{2$HUCM#y`eTXjPgF!$AVPEgSomR`ou zt;8vN8}fh=$2<8hf9%cSXgK>)4bHF4O_O+B`~(}Lf_wumWYbmRdO_>BoU<6o%b*^tdmbgPto@?ICJP1BrE1y#jl6FH&TrAyq4 zSc&n$LM(!Sp!kQ68@**cDSk(jdO)!FDQaR^+5|?|j_T4)y=&G50f+7P_c?mjpK!Iq zY{vXl+|6f#uuIsp@K^M^a<^o6Xm_$xIipo^z~I-$f8Dq}e6U!+-IF`5e+1v|Qsi$_ z1kawq)a}QS1O`xpG*@3$0-MO*g#hw^Z}?~g-5FmBfKB#vE$Mwr2@j)-f^=Jh#EwHM zVole2DSs~{!$}M%i7RvGzGoGZt3Ue;nU?9T%Y4A%=9?Wx?((0orTIQ&RU&kZ?i$!n zeGGv?Fs9HKj@?L#cM!fBUnSt_0+_J$8+r{Oho)kL4gbKnC&8M4@w0JHz;a-&ljSf@j==<% zEK`^}jO2T0d(JMs_i-q=TsvRlG(1=W+L9hV;~p_T>l=6q`RVlU+m=ILjLn`EHL~eq zLE-g%AOAnSN-QD}#?0SjzvP#+fcBqWrIE3nuCtT5)vsF_tT+{uN&m}fLut75Cop#R zljL{?eXivZt}p`vZe?j^X~sUfa*dJzI+GL;$MEdVeH-T4faE+9f|2|vCU%vimQQTJ z>75OJWv-2`rqJ1w^nus^i+9+S2fmp21UL#ZR9G{s;p**p3hX=!-K1AOxhH=o;=aDL z6u9q-LXU+lYS5R_V}z2P0hh4} z8`MduHt3IM?G^Z$;Xe~;71 z+VFpM2C6#$lgZ$-QnD-W7!NpNwGv{D(OGphPr#QBBF^e~0p%B88W<&HPINT*@z_B~ z9#@}a4V)aZobUQ`?D~`DPsEfhHA=fq!aszoUJ$1uSMXrS0)@o7H&D&*UB+ z9~V1&_s<3|R|mK6kGr%lH>dB3qYHx>V|=*Fc%m_fbtX6IRV)e^+<>F-WRgtc9ABF?*TvzGegEn;$;nU^-i) z$xe^yRSS;nc_qW*1{aLvyZY2h5>Z~N*u)1)+8?Ze7XGx5C`;XZo|J`ktkER)Tu<(- zXvUzE4XY{5&rECE6+?kYsWHxQV3KY!nt+}Qp1X-BX0u3LUE>c>RHF|{J4%bSm2t#Y zj?EAZl*_FZuQH*!TY}?yr3_p;Ah7t;DU*-?Rw)Y$j;IIE#WSIJ23=%2)l)I!+?3aS zAVTc-=SSXe>!imF^p(`v|2|CmyJfo;LZHI&B($VSO!_(NUxbmA`NSb@tuWKFBNwm5 zcXKk`BXqqRSn5*Q(#ERtKTk>f_ut_y$kS6`J^t0H8sn$64(db(XGsB1`KtBq{njN0 z^5=at1}fe()#0}dc#cwwxhxs(F)~ghes9(dA9eQyP>w>$AYkpqpd);uDiG?_S4?6h zYVud00+wkdI4o@DuQ8%6KSDQ~nC^12aqhCPM!!oP_U9CFkzwx3M7D2bu7~PtD@Z?$ zPU<|atZy9k5zNSri-%II)!n5WP@DjT=sY+Uc_txh0<{_xBEpXHh|v^q?no`@Z=@=! z4~05~B8qcEjnEjaRg7umQDX=MtJ9(qr^N&tow5RAw{fcye0tGZ@n!FWtzfGk)8_vM zK1FZZ68$?_OuQFrl?U5)jx9d`=2a&ehR{AUbFY~cwMey5a##2AEUDe_5$_b7xypu3 zNxa14AQN2-dcm6eAvu$|PWLpU%3NSqN6Shd-KLKt&6UQz3Ft=)q~plCAvFJaAw}j~ z?Qpu4?gqTCo+E5qfIq;07VadeD4D3CINX3A>(*_I*WZG!nMtc}K;oYCYXwixKJ5YM zhA+ifzXnd1_D2nW>?7;+>mD=iLST-s`yzr|-MV9(rYrtwrZz-QAKGh31Mt7u z0RW3#oXP(c7rP+5A|8ACCbKx>wu+yle@NS581Q1U*q0MIh!0)sjfU=94m z@pNFUF}i3G_15NjbQ{DQBb;US0{8c1$u3l?=TnkK(d*awuaW*zU zXE9Ck>fl>@Pj>0ON>4eo@E>Ap3%@{AJwdBeBJ`_|nW}@>h^01EP5RcC zwHY!|PG^sqs&lbert&bH>U-I49ztMN%}`Anrh0;7;R0IeUxtK^sB`l+0SCiZN%w-6 zA(tFwbu?%p>shmtEGjtDKh)-L*k*L1p-g76L3O|fC0Z@1_tPWO)+k42Tit?em_I(2 zZh{B6yRiml0pVhMc8VTijeRSFDju!-zTD3s;EVz3*0xiJZvjY$#s-~Ba7@9`g_YN| z)T2UXDNl}*K$zhyw>&??W|@rO`_Ub!t1!E4mVIal-4$7ZEM&)t<6J^8I2&F`rvzYB z?R{(Nb%QSw$z?WQdhX8F11UOej{~*(EgK4K!67*B+^!KBO>e8T{|XcxfEED( z9#5plD8wAB8c6QGv#_av&Id>+v z$2${b6fj({-4gEpwSpxqi&`kmDvzf~J(RF46(>H9O|>Rb|9O5jY0aJ+LmJkM{AI&8gd~sD+(Nh-_>SHw;|S+HTs~eZNnzCi{-@D^kaR zwrhOPe_5eOgc{H6836#s`T+obW0n5n-u}N#m@6-<1gw_0TbHkJNTu?>Ml?q$Y)R{z z$GAiB$V&R+#A9~y_o&DMmsB1ZyyP3ziq8mwB% z%g-&&JL@`F20j&ACN07WfUYktO&gl2!(VM6w*Ven)5}jrKLf&7dgU^#6W<}P8(m5Y zHj5^&Ka=}w%vxS@D;KSE^O~15Ru!Z&Keu0a2dEYK>X#=e#T6}CR;$dyOVtt6lPgY6 zkUDJRj$mNrD_7iL4W%m<4Se@a%{TLv;alw*$Z%3Pr5&9PU z!K}6Ubfs1wm~6&#UrD@wE;X=2PZ=0*e1)p*G`c$qhMHA1(NcPaTpBAfip(bM;b6hk zr*&)Bio5BfT{HAKr+i0mtG-;6Dm5e?(lX+Kp9U?l8pvWtdFgCkOj?;V6sWiGYbJSJ zj12aTpD#A*)t6hYI=8IuZg3l=w6rq1tY9tKc9b^qH8j(VYOeCDm5+)_G#Ap@eVQ#G zOeTsqE+*Uz*46M zPs7{rS*@qsiA^o7`5yTT@-HyoJ=2fuK0MR8Ybb&7>qOi7rG5W;5Az)wT=EDa((CkZ zoBdnQY9-1lYjq3rp*7Yi zJ~1yl9yPVI!&^kN>SDq1Lee8>rCJu=V9@B$t|hK;(xO7_E4YPT$!8vUeB(j`yRSgJ z!+2cZ++47X@X@=rH;0;L&* zS!aA{Nntbfgo=V>G7!i}4F*rIN;xQBMHeQ-1lDUzvAL^o==ys&(LnX{{g#u{^SbAT zi}cSpEYpGZJ+gfmy^+a(uQvC?cxSR^V_D zD()c+-0zj2RcZyBcR~pZp4;>ow9=xiP-?S%%Zf#~A!YfcK_dYrieFnb0AeZ}$MTG% zqTcyFu(k?dPBrb1{YjWi4BuK)?;X<)ZRfWwzSZY`&Qs>;)Frlp@7bFNbxozezj zt!JhOd-g_@4^ZwyWo2xb^ng^kksu8H=`=*(JU*!3abaxKbi_9LcSVf01FOs|xi!C$ zIry<@PxRk5Yh+olWh2(<5>$!_gE=NI(e=ExFHOSABkR?59|OOg8Eqb~G_R+jng--V zQ)&h({6(aK-%NVPfiPd}W=8DQRI@ppscjsBzv|bS8G%zI42pYh>x zd;Z)&!>D!ubcVxa)56JOY{vV#0L9!(U7X~a$$$U8ztM4zcm0#b>Bn9|m03WDg_tTg zad*n^kY(69Zuyr!R@@xNJCEN8Bs()W#m6KjtcODjxpJj$R?rs8 zoomEF|J*F}WSDJ9mcP*oCk=T@Ct_80Dk)an`7I%#yBt}p?QXE9K5knZ~)Yfq3TP`Ij#HL4) zs0j~N@^(fUKD9mh3-E6B*CV1Z&4ftNyy+~t#ag0X?O#owEdT@4_r?biqn)HQiR#tN^ z$zGOj+N&RGqc2mNj*k`EPq`_48$_^kWY#xi1p#VWsR!R&jn6{{9{~1aLtzN4tHe!i zf=%nq7}jY<2*c}jU*hc&1YEmoY~&+`m4Ex$qQ2;aW#8BRJp$n>!#Q@9ijh>G>cR z_G0A<+h>=wpS1;t~nVb3>7f z_PVs_)CW>x+p4UhgAR#a%OUfGs8mqZkh`c%&lf=VkjB2Glg>~P3e_om{H8n>yBXC) zu#`FE4LGK~UiJCv>pF21fzCvd_pi-m0O7Mr4n6r%R_5$T7R3O+Tgoc2rEHVTHvBoN>QzQ0NEzKuP zV9U*9&AOMqX25g8oo7JBj0jY)k61HHuMEXY%~f^J^!mHV&0e_EBq{;`10mQ3!7!s^P#OgY*!QEx7iK>^gj-N%0y>cEsV=E>dPq8kzaU+ zU}<_7p#}-|MzNO^LCi*&`c4;zRDVSAT5K@67P^NJZkawj!zEsVjI?sW`XZ-^d5^3c zgeBY_aYsIs9{BBGotc6_;9hrKWqJe|ixgpyVfAKKYeYn+($W{w9Ei)dux3xh7-rYH zwKi^cY=jV^{tZZnn-c_SqOx^leI>D@~JWyk*j^vD& z!)K4RDmVU>>yW9L;?J;-K5_7|`{c<-VLSdqw|B^~;6L6jsPi_vCqFV+uRz>f@WenO&$w0CjV?;pb5_vhksdL8#vFt^pRUpg(z_gRfe*d!To zCrBiGcb!r8*l*4iwa6`~t$=Y0l{3MGWg#aT*wvd6ykIkVONr#o4O@s_xCNM=eM&a6 zm)8>Y-cnY&Hsc<4O&cGCB6d(^boU#ejD7`QOb51hN<6wYR;!9G;Bgp$KcdL+vC>@8 z+LlrIcv;x4k``AncLL|ayf%ZK(}rtIhS)G+Bwaf@D-$F<(gB0QC^)8*8xm$&V{?DB zP#x7fbVq(+hCH!FrMTX_SWVh)%#ERy6uS`ztcdnm4Hs7g2=tg!qj~)K39h$EMT{1mcU~!Sa?&iBRk)4BM=z}IA!TM% zv6Y(7N-z%2A_xF0aB=tEqmyo^5$Jfva+O?TC3Ap{7#p>hvUao<{jI!`jxo1A_-GGQ zWS0&WoZ1I^!-_YhEc2w+l4!$j$<$M=q!R@^xCjP>RDVo#>1>#&dR$xN#YAfE`P^@Fuf6F=eWc)yL>^S$y zi4y-lUFGzjh%0ixdkRtdx7`1{EO{HR=fY>HzG_S?^PJ2YM<7p`LaC zBMr$1;M4E5w_>3K+VkIv^QMY7+l`1Pt00Ay(vVT0TtbZ^7hBVIAr>L>$K@g;*vdC2 zyzLlHO#>!UOi{9^Ip1;*%j^peHKgmSF5_UCEMDfS(|}v?xoJVlaAq>~jyE}wQoG`_ zZ9Fn6T1iEtZ8QD;{N;*T<)c7}8mu7r=Hvp|-M3^ykoYWj!11K*uYov>?@iPz*@u>x zsr_4qo_*gN?*)e?QG#SYrD~9DY-y1w?lbO5(r!f^Y`DbWHw!m3HP6tqQQ?;{ET`AN z+!f9J10O7PRWIhPlHA3T37@=ylUTPNR5A=^^Z4r33(hM$W@TiPJa?B1DHmIxR5t~d z%GwdGJFohxWIgxHRS<;HXk*2-Zk7(hm;<)XFLM~EF}2^g_`1qN2Vp_V0$pv%t$~&u z-IDC#Qh&AAyQ9>K$d9;r{h$j9LC}|;A88WnEpEQqoh_L}1v)QQ?SYTqEeg0ERt8hP z1IUf@)l|pn$p?=WS*kHxqHW1yc+i}$w#Qq#X6ug6;<9a@wcRu1+jD_uWvUtAXV&hp(v*Y6D6GKFl~3CgL0nzTYU-$sNP zOelLLu^lpV=s+kxkDfACN*5Hwer)*1wyC0>qpoxInkJbzIP)A#h7>z0mP*Vcw`d0M z$Q@qS7aEqb8TGmGa<#<$D7~JzDZAxiu z>#i>Q+F=nnG+(mfP3gWflfpN5ked0I*ueF5iTPC@GgjV)fYm zKO&Y@hL=j!u_HylnM>8@%f5yE`*5y_!oKX@!Mj&sPC$2{BmNE~he_NO{aUKCULd3L z?z_IjGT2)A_|P(So<>OJsD6kUKM&`=r_RcwAZWuWCMUkX6qQz^a{{b0k;p23=7uhz zoL#n_$Q5Kfda2%Nyl&6$Q!h5zUq?@$A15_EK5zF!6|6EjlRX~q$9D-MHn;)*zPBwL zz#Sa#75>RS)^o4CdEHWj;``e;QNS_Dvcj3rzP_x8xWoww|I6;K7ywVpab-9bE8jH- za1T43cq_J))0Nd`$gp2BkegRRAJ8dCN;|+IC+%*}|J6N_nTlw-@uCUoAu+waA zg+4mBPwLYpn;Aj~rj)k!k^J|N9pNr=(fIkqe91t#hHWQX$u}j8{GP@?)wfb}jh+u^ zSm8%ZEE{U)^}4%c*}@wKUH~ueOdXK>cwC}kJ|I%`3+vPAX|E%N{{EpRC0~$Bk^N@wb{I&W! zv|ks>J20)26+~sicFg6<2yFkF9Rj4S_v192JlY6teymv-rdO5C)d8~*93}5z7638S zm!J;t;n845rW%BM+NQIm@8880-UVK|>`BgVfzuX()Y*vI|BERx5yo<`1ezT_D(5jPK+Od3ti_yBxLNZ&tRFr`gO z#N2_`_}{GTA42$oX>m2w8vvppqghA*FbcXV=z%AK7r00j;^MXD&HA|z#7ed2_<)uw zddH6am7ed-w#(pLYQIm{VEhB3m4X%Oc`&}GGSj+6CA6Y|=N=^|4v2ub5g5s`OVSWN zN4rDP^wV<9JMciSusA(^W%SmjII@#9(Gh5NJ)*l%t<80#Gd;QR;8Ju$m*eS$ zgpN`~^tnr6K8++=c-=@!z-kL;Y+}(l5=7opKVU_6ig_>`3Q9vWA@gP6KB7ADI{Tq7 zrku{NPM=8Ny)rd*bkPV*cX(sp{Z;K*NcTyj?+06UHV1}n?$f0-Q5XqoVp`TssStd; zRh1pv7CNdBPU3YW8dX4`Rj2PT!j^)C%d69TQ<`v}FNYS7mySzr!dE@V?}X=5@dt$$ zr&W0M5?0)Cl}t2(h3AQvLRKL|1_tqtDd%nYxA%B0$35c4e?;dr?cTos)G@kp#H|RK z$eJ&cnq}A3beM=@-6^MLJTltPGQ`TTHwUM!T`2#=64)Gnl4?DOol?5|P4*(Woi@ou z@KRLlTu<_&3^`f9tvDK|!o4oYvYe-~*LU;z)#Sx6fg&H2> z`PZ51CKNYn#A)*9_9Ikp5y+k+Q>(%wuaoZ(3`B&M|6dpkaS(Ihf&I>aUy{c3449uC zb-NwiL>b<+3o=9SS84DTVwM^FOR`w8e_1#6F&@Pv$$6uFy+}dqtc5&-z!hajMPn+& zd&z^1za5>`BQ<}9Ya@gYkKElgDDs}MJ1S)*sSRCLTFHI1Na);%e(s3{60jq*+>O6 zlP|q~7)nSRqiXFa=-3S?AJC$@-S|tI_NQ+UHiUHwKs$}g4JPqxiZ3!|B*>BB;gO!a z8SQx!b$p(VO7k4tq_x-M?IY)2Is9{C~dy& zhFrumuz*-6bF5Syp|E7C zwkDT4N0| zhU2aAU4Q9$om$a>b&ENYlvuC#4Jt9{Ec493SP(t~?ibr(^vjuFkr}Y4e{G;vzkyUS zpg@CFnt=`swypbk+{a^?6}$h6<@Wn_M;a&alv6!|lAUh%tnS^L%HjP(eF8GfBFqou zDS?*gIFyDT;Dqg)VY*|WHzCp(FJfVkKPx^vPHIjssQCptVMFAw;(Wr1($|U<`xty} z4J{eOn(uoui0j`i(P=;)XTl6Fy-T4X;RJ3x2_gac0`PEmVC0oao}zv)ZqIB*SY}XZ zN+^u>wX*J4Kff8j+~O1f*z`~EM|CR$#Qwx42!c>wRk1f)-<1-(zrP-ws!ZJA`J;6` zTRVl2YN6!37Hn&PaRPUD4f^LG$a~iQDi6QbhYj81He@bly7BNX>I9Dl07J8@g>Lw% zc3+gY@FM(T)Glmsv{n<9qggmGC`s$O_u})~%@>T(DX_gMf<2I|0j~D;;R}RSH;-e^9BF346X;?lFY4^dy{+lx@8p*nWvJVK?G%6Fij@l~Opyx?U=C$+t$Z)GR_XoP zr~1hftIWJy2d=8G-jWST)N-P|#Q^$TH0cSK<*7>Q7p?hf4T3O9A%%AWEIi+}A( zE`5N6o4%l`2(CthJEFrEUVKv33%%Raoma{R%He7dt1DRQ1TVMgSDs-lx9QCete9HK zRvBK|(Uti24&CB;H{zV;XK!o`gpupomnVUT=z2wj%`6BJ)Wy!z3zrT?)7Br7+cH2c ztHns8Mg24Y`R7X}s8tYz4Ox3~4B4Ro3i-p+?31)H7)L$CMp+Af1Flbe;~d|utS)e< zM&JO=ox^)pS+e0k6y%zY*>+-0v>opiZ}r-;cZsQ{UydvpEq@#(OqzZ-W6v!;b8zv} z%MIhW>XpFu6WN(y6J?9>i_+E#^B6A`qmdJQJD%9-e_InPjax@kDMB8+c za|3un{B=U=IA01yJupyhx&i(MU^Rt>;d+K`d!|7s?FaFqc7S#JHl^c#aaN*vL*2@gMt@jKb$f}XT?{28NEM&OvZ&_u`aJ9? zVLXi=fp9E!%P`OMg~G96r)oaGDNN#ei&MD6!=raTvWoL%NvgYZ(uFDg4hYxxu3I@$ zn>`4_il2bDgQMLJ9x*rt8BYCD{Zb{)rwwTRE3U3V8gyGBch}nI7znJ|cV=E1n~*iQ zMfg+JJ>(kIH4;sug>7k8yUyj&gsqLL>S+yL!B(mbdt~4lF;!YWepKXYYNjABTKVma zpVm7j@|!9gg<-%EDgTd39TXMzByjr9wQbUpJWRAaH1I*A4T+%IGI}XHfQxpm9^BEk zjk_!MG;z)b=JSW&QvPln* zUkNVgw-JTTW5Kwq9e1_2na{9cTc+wn&>5$b%L3!4|Ji+7B%^pnJq(0f9r(m=Yu2K# zfK+y`wpNn+l&DAR5tL!E*mwvUFtKNK&8{L`77i7EZuA%97w*=*7e8>_jUFfVD>Z*-*o}Ev#gWN)98StL26ASvjaoS z{6ai~#y|K2TOOBNs{qJGWF}Z*t0BSAXYOQQ$6E)Mq|s}nb;NNT(+1tjkfM35mF?8r zbpCAHuAY!1Z&ntHpCG{ZeR(9F3G&s1K~iFA?N0Pa2>Jd-q$pk05qfSDNIx`c0!lGW zjHrzwe<_$MWVaL)F%~x8sU|;A2#ML~N~xu!zGeqj%5Y{W6}>4#p+^X`n*H@gE~19% z6=^qW;@UNYX;t>N;S5d%Z-(LieXTBblx^uN)OJMO3k*bE9qWb&ztD(e$9Qo(}Y~7BSRMs zBTxiK$?f=q*F;f|36D4Y6g((o)P-dAu8lLzr*{ImqotBrz`(3fOz^e2Ps0*>iY)s; zo#LUiVsdi_bb9*d`=@3O+{kP})mA|66s`*E`n(v#Yea6ROtCtCeAv6^9+c^|`E-_h z=;i5-SfM5K;=NvT_Bf%CXXv@lF1_*%2`5os@1;76eRIya3)l8UB14EE4B?6-{F$@? z)pca!j>V{>S3{B2yhr0n8;TAx`d)=9G~|53PKs5-AeuqZ(Q1T`&PL@%a|;$2WYok> z#;s zkJsyd(ve=^Qj4fw<~K}VYoR7$-G2ZL){|p4(o`ngtu;W zp@>xFK5~xGn>Bu-I4l7+1_?2eiY{Yx64y0X7#H~!gVs$qI8kaLQpd1SMlwnc z#@3;Ca{8taA^xEua{u?e>*yi!QcM+(OU^D@!v_^ufOAfu`0OL}zhzvj&o&oCMZJgQ zYdw%!_j7;B1<7omM&3cDc(Ar|i)*D2PG-aEzOD9?^b|Y`7kS=h&a=NEI`g+o(Xt>P zCK@@(#XmF`3m4pePiDN|e=Zh4g}nhU7HE%X&AirAEqC4ub5vqIv~hbUAE!PGo01zvuMqcNkl33vN?xo7`H6Bg?sW0F~p{ z^gTpg&k3yN?N5hQX?7|!iB~f%3J8PdiR5W+ahtlpsHr_8Wm`1UooWE5|CO&{NWL2J zLA#%Xk%-rKf(66U5=*qpc{H)y_|uxMm+0ss1av3HJK3vnNP0*kPkL$Xk#;$L6Rt_q zW|%JQNq{`tF|i?UYz1$p^)_hWs$8i6Xj>A6ma5Q2(md;zQ8+C+<-B{OGdOa(6yT7J zu-OjT-m{Fn9V<5K7S@RE4xCGd>+UHFtOT63=#O2j6F2*!TnUnbghFHxN4wy2YH{HR zC-;O5m#lf1x~=lA-d-6jK-(%p9;gnNl;nL(Y(>+x$GCV zi+cOJ;5`m0ek{+|o6^tKlD7sjWqN!HNkr5zH-F#Jdz>_}PzQh4M%M1ECLN%X^THl{ zIjE%5^PK=Y9r|Du;{15{%c%5@V{np~B)wupsVG8ip@Y^l-P|gp|YGU+a3-iZy=$y2VCp}NL z^>!mLJRV-7x`^;8bf))={9y7@Thz(NmSp0ZwQAmw=gCC^|88(@WLe8<|bkW z1OcBbZ&hGdN9LXSX-$Xv4ouyO#t%#$^(ku>7O5O^exI!%xA2Bk$kmcOrsCE)-Hpvz zxNAxEUuT{uD)b|n9~FRL#qv`}-U_=jF~@DcNND-yIKx&(Qo|jDBOr8BZ6s6But%3t=`=KvH6XSAqEmex-`=@#c@8VL)QM*L*K*)5nLj9_kQ^k zTf5B3lwE(Gu50=XC8qpXew^MaTKXLC5~IZB{*A=}%W7=QM~y$?Jl#5+Mg#@-{qX#F z$a(^)|9UAM4Vt^|mkA(XfrnBWTfo(Q3`}``@v{4K3Ru(5p=ZQ`1=)zaI3c1|xe+ZR zT|MdUv9E~Zrar>mgTG}p66TRkU%uIUbGf#hsUX${d&sD^)Q*l1M&~`ERFiLFU3z`M zXJjsi|Dv~NTFrV-%=-p?8PH%iCL~(ui6i4sh2MRhd@4L-!GW)>y|8s_LVL(0x&x@K zceX`87xU+GLrsFOShepGmTsc~jh9K4pP}3O9y?L&xjsLamm}+L;ktY@2XjUqmw%cH+>fVrSUn1TFJc zVv_n{62`#i=U5}vN@-wyZ{p_iCSGN=vqe63dRkuLZi;P>*-|LSEn#po-hSNbl27sT zvbnPRU0!?fvu->tAb>Gm@i1b`+$bHFV$X$wcaynq@jbLgV8+)!SojuAP z!2B*pWEJ~%;AeBG!Io^o69@1o^bK};E=953A^y3`$xSTGu1=urN1m4B-aEdT*N;l$ z)}T2tQP7&6hG}DOh?_z@g2eY#SVB`@j`|R2s zcJ;(j?i>5#2{$jvQm6$|8{>GzA)tidBiqpg`H+His{6_tbTQRfr2|&WI}j&IJ&4Es{>iI zDJ$)XC_nDs5N&5tdIvjhVM+-Iuk63KJx$^O@q@dIIa3H^M>KMwOQ$k^F8@I#JqtG( zSE~w%pj400j0ZJS;BQb9mC zI}8aMqKR_ChoCVxdf08dh-n`;b9cc<>3oH0b?{g&WIpTp=MsA8X9sflh=ef)3fSU3 zT2?v6l9!yGDam%Q+CnKKkh40l)ZLWNFpC_H_bSbc-JQ|6ku}>~BdIZUDd}7mfx-xX z#B0@J5H7855c|}$wWeRlgkBuF#=dyQ0`OlnNF=_(Gg-m+Oym>DzauKVrCIG|H=Nq*TId5t=N&6gLaa z%iW2ulE}#=_}8%H#WLAD6G>0lXxJP$Xl5po)$y$zJUU!j=jk_5SzC9>;55gsvmFY&nTm@2Z@)@(bVyqV>K(^tPymp6Z(4X~=kO^l~z1uDOieT?NRj)0Pwc+Hoi$@+fhMayK zJA$rnBUfx&uQjH0VNDkBF+YESEjrbdhrBUA>-A$GzPK*zvg*um;iK@vYzG2&mi*E6 zCOGZm?f)2>`TkYbj~5; zmE%%_DcwyV$!{8T2||{6d&U=9knZ}%>VKq-e_R(Cm2VQ9ktx52*5-Ei052RBCYhaP zHrj{!?wq&zz$A0udXhk=SBld>_m<@Q$HtbRQ%qmwZ!kswJ)q{v)S(3`&#jX0k_NlSsC)Wq&IwpO|fd8N^7t=1T& zJ%17g-0C7pUm21=$TnF9?9{s1NmM2hl;$n9L2w=Ka5H5e5Jz`A8~<91Op=Zq?BRej z=u*H}rfPzDEMpMqy?J>c#GFzzNLQIg2*sxGw73Z9l!mYxX(e8B$&XOAR#An_gT4Hx z;PP37UM;a&tegNc0<^p65}6VhmykIM+9@9g?ITnDN!w*kI|MBJ-|{NJ(JgZ!lL?qw ztYC#XEnFP}jEY=tR$x(_p~#cB}kc^i54of(JcRS2b&iei#Z zHuY&umv-uWmzjIq?8Z;un$Ke>89J5*jiQG0S0$69LmnC+Rs654mgIQOCM|x-+zV&V zO0ib97%F=au3+dyG$2ShhA6lamyv%C%3NKd*tOsFdSiO~_lnFRb`})Bh4Qg3c@AXE z)w)7b>+X(N1Eip_b9SxDr#ux;nWaoLoGW0HB%-2MyD3MvTgxJjfhUI!TntFI->7^U zBasO0zRx{!EK7|5!&P)9ms#!$eq2lgUFH`sQvl$G1)ty-HR($%9s0Q`>3r3dS~tY# zaaNZ7nFx!x^c2LmH5)_+ve#`iJNsxYgu)V)J6gJ>Ywl(&s+H7hzPQIkEni`ej zU)UkSmfz0|hBJX+2IT{<)%o_4>w7YhO=)jm7_$$x^iv?(`X{^YE}yTSKq$R1=JENz!V8TG=<1rq)1pS*o> z0us#45^Mt*dTx05w4_J3;#Qp;{9K7Dzf+fZX*CUcC_tO96CrJJj951R7{t24O+r>T zQZso1fcr8fuxC;m%4}`m*O}`>;<9aETj*-veWc5rTPa}JWaVyFOKw`_-+G{2o;viX z3cq&%d&GeYas4jTRPO7*K@(4; zb+IX7H+tpaqiSE(O^lgeXSQ`7pW+2n?Mngs#wkAB2ePbGj$Ar?7Km;=<3-<&i^eA}ij;v`${ zeY9ViIXM_VP(>ReeWZ}+Ie66}h)SQ|FFel~QTJ6~>$0YoP}6$SQ~~=rSdiJJPSRhU z-SB5-Ft|&kf-)XAY|H(ws;in<PoB~qkkj#WfX;#c)$sD*2gR`jt zY~A$GWHyfsmkxc|2_VTd$sk{^7D}G3>2iCRK~Vo#AIs%rx?7ko&)1WagNaI=Ygj=I&|; z`{5zFpD867J>B%NMDb}61Wc9G3`88UXncdkpRXHYV%}kc6T2|Kp=hIf z!nZr(HRoY>+W<~%xFn?MzMWDFgZ~4OKyJV9!Uwd!9e|$W@fiNUgZuaQ@cNfup+zsC z6aE5nl!V66pVYO~XE2?YMhm5emtO)N)&YP-jK83Llny})-`gM~we$1?Yl5ski8DHA ztZBg-<4Y}CEM_;tj~W{&OR1$V%haK2@>S%Z?CL!Yh>vpo&ANzzv@#K97m#ZHL|(*&Q0L!IQ1luqW{Q+I+7Vv+SFgcA;^}i!$OXdHG5*?uZ@X5zH5Ab*`pZg>eRW zLx2^3<{U8gLeEcRlqXJSv5`+8V}Qj~Z>&l2c32Y#+ zvW*Cl$x~r)MWogJ6D2=xB(G(rm_L#(oo!^FK|462UYg#)h5B7Q`8QVOf5}WKabfXuFKGt+4#%yU zHn!!>I@0Fgq1QF<*Dx}};RNLjlQ)Qf=Qj>k|>pO3Za>aa8C?>M9!~alA0|XQR000O8jtH$%j>u1I z>jeM++!Fu*5&!@Ib7gdOaCC2PY;!MXY;R&NaCz-mOK;mo5We$QOr--Q*I{i3y%-RJ z!f+5Dk{U^Sk_Bl+j?As8C9}JV#QyruzDP=<6eEYChw@^IJ3EhWzM0weU@(Z@^8y81 zBRm)7a>>OrY&0*pt`qoJDqYmTAT6sJ$`ve(%mP-jT*G6n^HRXu*9`7IDUSHk7;$i_3*X1|N5+nG5XBi4uks}J2L=dG0{wzvq z1P0_|#Mf0RHIyp6Nepi*v1U5Wqi8;7MKPbl1f~Py=im|sJiMSvS%rgH6h#@XY^D)wqN!rqlRQwxG-m^mCnEa=QEPqD5k%AB?xY7mzvqyooXrN*cl$aNdQVMS{-|`|$naq?i!|ZM!Qvx5#Eq+6J2^&%H7YqxR7A#{{ zfznKB9QxcesBvT5hvlzrwmxWw=cAfFf*`v_h!jh6; znKGf~m6#2Qs;IlR4u)WiwVbK>nmzNh&wr8$+S-qPA?Pk}N0p-bwui@cAiVzZ5hlI{7^1A6Fza^60$YIfs82DX(G=oilU@z#W)e z5j%G@wCp^%869Qqq=&mRxa}#u{voBEc!#jqC(d}`mtAjS@_DmHK?74OELOx_%8<8d zK%rWq@?~CECJj8~;GduFEX)bOqoi&_3QP+WD=w%H1}JI1lL~gc&8zbb&h$niEu=Y< zEG5b)81V!Xknz*gyQjO`c$|df1=oI>v|ZGstEK)iJLrpQJ3<5KK||Qjgx@pu(z9T{ zwbPT2A0m-)YR<)+ERjLWq%-U|mcH)s{#fcN3fyXvD{PSMCbJk;ItsqaK*zqovcF0$ z+AXd{MbXdDu-b@J6G0S}qj=MRL~X#BCKnXX&>o!3SS_07P$y1T9hz!; zwhHd4#2qxR>DZX2SZU=(t{poxoN0X8^{WM`((DCQ$4=95N2)aBx1EWS4!R_MV)|lX zqGAEtDp90JTEW;+8Y{Ql)$%2M7QbR3w@y7MlaNNB86P$R3m zg{1@9)k%(d)Q$(&xxPl7$j#*@nI>oM6t*{tI@%h3fx?Q}gB7@}`wOhW>s3bDG`W(b)_zcr&@DxOhLu<_ZCYCBxaz1rqhYr~+sxja zDhGc?Iy`haX0%#yb2qn05}U`()jXyCd90)7fb()cdJ5D!xB#c9&3_Zeqvs+%@S5`JSZZ zx}t7BibvCnchlLJknG6JZ8r8LmmN_@;&$GvHs_t(s^hG>HZg%CTZuv@)0{N*RD92_ z19@M(PLM0hyicXT=2Fp9N_{S$oH5=&7?qO=EX^&g$Jt{^E9e|?|0_AXL(t{y-Yx*6 zJ706jY>s^USGXZqVbiK9(u|@sm(HzZmHlQei!|{El&b+OQEw6Hn*4QRE~-mX_=4Ii z9KuJ`taGx=N(8Lb1!FgX)QA{E@gOS?7e?{RK>YCd^UTsIY~A- z3v3`jfB-?!prT7O>n5-<*$|cB#+6+nB*BU_ZfQ%yIe=FJ!Lw^~GHj)--s)|=m5Y8a zy|?$)w(`SPaF@`82+A*ifKVH2)QO84OH3BBzW2TFOZne=B)>`iUjC!s%dfc4lmFfCuYTm_tgMWJL>WDv@R=8G z`)`u``(gh(WEcDX4H<&>wB};+BD@c-x{(Cf+d+QE-Zznx?7fKWg!lcAKHP};|0i7C zE{wI4(7jC;8@_2EEht;V+5~5y zOTOe;<}EzrBQ#WTlhJQ*(@hy1ryLe+n(drgQDEudW`))nf}d~kMNOffV}7!vAh(Ur zELkZV7f16;X30~6+7^q?ztT&$vAkyEpiS#At*nfu*fjD0LQiNll~+3cyty4fvl*y2 z2@2R)8ahm~Iw}oZecg)M_H7r;K&?Al#+Pxn!)l;FfRLBGQjiO8A9;v*S=xdI!g0r2M6y^Np4TrRRb4y`Nr!4)7Zqd8m@|AdyHP`v&yqLAu*Z zUr9$~=SHU`p*|3RS@DbX`MmTQmTV=^Oz4mX(ot_aMpFRKZHKY{+K(mwDHjA7V;|XE zkViVlV(;hOv<=E6YYXPG!Om0bIJHdJyV`Y)`%%)ziUUOaf8VQ~#@Wifm( zEPv4^E^b{?kQeBZzAYX+c|ZMbGD%8PHWyepX-OLtiDXh9Jq=_sd7#}OkGF;GNL7%+ ziBE@-!cGna&q)>!5=EJy6U9Z_IT)BcPWpKp)X}#a|HW%=mJbovaU&cW}>3+_w<#63jZa)g)cIe;bwy?j#4Q(-Fd*IIsf4MN`dG1b# zM5du@(pb}AEay*fauA(Y0nu8H1qy=tR|0YHNUOQ``#JXCfKRs{K+FIF_~te4{?N(M z*)Sg|VW*o88+AqvD~Ff2Ll^MCm}b9rznX=ZYB>Uy45fzn0(Xs;!|SD_HMT%0(fx!k zzGZ8GTcpv~e8oC134 zEOQ(UNhZVQ53n@9!Aoy4A;;3jBT(Zq`gkVf?YxGA4zlt;Ah9iXqFf=?-`*eMZ)rRX zIo$N_OeSp#2>)B?I>;6^j^bB%sM2vUv^mYNxuc<;{Hbn5a=^A-$W0k5KdcZUfr5N^ zHFC&dP*07Y!(q~Ltk5gSoMUkUhPI;Aa2(oTh5A~GZUrtN)!3?bpWcM03-aN0zn3ofH3-MhYy3PE5amRd9|kPLlElyH z=v;4U6M!c&S}tWssV$eXvj# zWx;@6J9KRUyjr&x%te$QC=l+40%xJ@rL9B2Rr8^N1vOsi=(+Uz%McL*tW*%VK~2u| zHg>}p_oDLY0a7zBBfl<~2Q3Wog(!)fD4aewGFhieAc`t4X_{(!9mxfdR62OaU$)F( z^Z=xvPxwE$>1+nF7`PjghcZj(hIa$(|Tc+T>#m8=L9M=1-K@3Kjq!TwSLL zdvAs00umI6RA7dA;FT8{&v_eNQ~Ng9jk`@m~qU&txp>nIFwO1@gkGn@2;Uw z#x>1N!`M&TS;L`k8c>8U8qK5A^G*w}Gs!Z;6Xxd{ns-Ihpt3_2&Tnq)>jykKWlRClif%r_=(IMy4Z$W$~HxY31;y?P?bT(xuN3`BIAreHfY-X_1+iIQQp}&Oo z)T(lPpxo?~H+pEzGzcp(O`592hNX$*MC5WRIih?xBl4liXny8}8_T$8>Z{KJqYac5 zY?W_7(8&mDB}XEcQkCu*k#3Wb59xsW8KASEMarW`reBSjJAqksk7k#9K9|qY?(@`Y3dZ-B++pft1U4pG>-_Kdfxb~f4 zM;Yh!TkBEs?MJmeYI1Zmr;(0bn1V!hFdx8ccfD4K(p{eJ2Zk-eH2Tt2390@m%j?^1 zr(VT!qp3SFS~aIAk$mM4zwHuAo6Vp3hwA~t0uVlOC=yF0d=T4CE-RnThVF< z03D7KP>OmhWWQ_MrFD>D^IHwJaD6*HH5-(Y()lphoRms`J`?7MBCLz1%*199Z5g@X zC9=TU=jdyiwQYD6)V*;Ed8?3hdc;yg$Ik&8T53icr8b(ObmV)roLrD}^>umy#3d*( zYx6`UY;n_%3$O#t+p2VU0CAa>aK2m5GMa<6+!1M-QOYXJ-L}fCZPm2G2sD%xbZ9oq zuIJ4glebz>E?J?}<_U>B49TDV58yS*BXN*vuDBZp9tU(|fi5-8!2vnf?uttjXlova zb8!aU3Lm68t_q<4bmC-@aP+!yQ;13y9X_K>q6JFJ5pXmZ2EXpu9a7%>=xVD$PnlhR>G)+rT&N_&eA zDSu4P0-XGi@{v)RFbW0`cPLSV{5h)4E9x8C2Rjj5nwTs^3_J^AJy!lqFGSK4A=|); zdL3VNlG4dzoxl8pHaxtAn2aZsKFxNBOaw9bE6!lpCY=wQlI8^lr0Ii)fCxFsjBiep z537@+x!eAVO9$|k4PPAl;%%o`si2TRxn^5fP1Ea;2cQvRaHFniF|64@YjUn8TQ%7N z~#h5LVMj@c_HwOE$l3wE}5z-9qk(jS{B|Z7dehfQQbcrdl9M zV`X$=o2ld$DXV0qlwNYPEPzObnQDunvUs}uwqr<|19(eQNoS!;u)A_MG`m@~&=>SP z>i~<|EJV|Z%j#%{nsSLN4j=b8Ttbrz8YoR>`SLfolKJxJi+Vn2tr+-EK(SDc+vT|% zW`pdEBSZmxLWk%LK`IuqwNMu9a{k6Oz?V=ucIyUKmsJnt>Y+S6l&^;h^w3-kQGPO( zB*+u}6YD+rPn}O&b9JMnBYLB~E+&8MpH&O28Hwh3M^L>~z!1?3gK}))hWZsP)uEQg2K0q43D*{W2nOMyxZ(F`I$$xa>BW@j4pH z1*G;+bst@W?BMEC_Jan;8MaIax%%9G0o(D*1x%ZWT1d+g6dKinxR0+=x`meJI47l% z>X`D-x+{q;Q%Y$8$TN97G>~Mif(8I^835O{gY5vN1)-kW+5}4}7xICp>~&^&8m*WF zsu%v#Ct`YRVp2PZRzqPhI_JHri>j_}oP|AzwyWFS>FR+3w|2TN+=ZF$VrGp+tL`Cv zo6?A@yEQk;;5>B40-Qgg@yXF;g55*vEWvYfnl0S>FHnF_8RDDd(Btu-w&8og;ZSj# zMG5mtga`3+|D82)xw_4L1-?t}thplJ(dHh8@9XZY8J1_Zxi$E<+zF(Rskq|2y*b`= zD7r}8>(s=(cWco~_!@?<;b;kbU4gGF(c9oF4qx%;T)noa*k*xJtapx+EzUB{6}Q*L zn=SxR0@mVQPTZSb7>WLk;qQB$f>iZsIR!9TLDyG)Z^f1o}1#Ozi{=aRRWh0<>zqG{~RRxB&HWEoZJCPQ|KD)Fox6 zK#$;vvij!%#4*1>XQ86j4j+s1#wZDW(M)230#cwZ&~0U*sV}Jjc$qYeiogpNk{#>< zn3D{~+;kxcqm;f+Sj`w!OSj$utyu-CaAOtf!#f$NL78_o?yiOK z6=?r{C!}=p1r-SJFaRi}`?1(sX=)>W(9iGC%Qb_&n}X&p#@fO_zPXK-uOSn)f@Bux zLTnmRknLQ#eOfUnNMhhmIP*+f0N-sc%fF%0q%@nssDBE<)lm9jA&LR*y+ons zSZt!Ow+b1%+M9diRJ*HN%EmIA&j8=B8c6e*=r0@BLG$;o#y)5Ot+lps6NV)W--qF( zGCKneiDnBY&sA9yq1|hz0IoRfaS(6Nc1)H8Nbq1nJI%JDb%6th3kC?-KFkb+x{+7| z#{O3_R$p15&+B0fLInL$B1kkZy?7%kTwYr100oBj+=?4j|xDH9L5 zo&^?I00izIZcv-!`>P-1xHa}vTx*t#cb33w+kOn-GQWKNtC>*9$oGH48azR|zzZZZAzh36w)9YIGzb(&?9Ax)Cxj}k{uG#jRnu~{G8bmaXck$dZV}XlYJIL+&x84r zG7fFj2Iq=s3YbPosnjfR()EC$8LGl^rO948AqOPz8ngBVAhafzQ?BEbH3C-)c?QbN zPRXP^2AK-9yZKF-WL#^CW)Sy=qh|47xW-L;Z^8zGT_zjTP3@X#RC-PTm7~oiXw_!A z2L;zc4N3y}vh~v>G6RdvP7i>Rv(jzKR)Le}!Hi-sMGM=ETD3rq(`Lw54jJVM^d0C< zrT9i!B*$M~L|0>h(3Gw3)UQYsw(Y{Ek#(y-sjfK8lxAH{`$#jY$)V7Tz%A;YSMYh@ zJU)Z_*|U#5kFh6Z&lBt!X3rz=q=N&R2KG}CtrnA}w=L|(fAn;=zAAp;WdP))3=;e` zYErA#UBQ)tBN-ewP-%9`^(6>2fhEy3Z&N*$Vz#fm2$VVtmSf}RMB#It(4nxd7~J7SV*>qgRkBP z5X`Ywo>-oU1WwgQtJgk)zoqx4k?;K8nYgHLEV*5t*7CSvfjp@^nYCpk>o91WB{l|d z8v}R=0dPej0q|!8SS<$L!S|zL;7xpg9~1?A%VOXFzBh@1J@{TO2L3Azy9cQu6h!87 zi+c~b^+BdWDVrnOf=GF_(kv1}#tZF1%A+rW1aC8z>(vIrV&FxP?pHxP0T8{_X*!|A zR*O$jkc(pAFiazur+! zI~&f>^ZoE-OIqslJ&ey^VB=T?F`aCzaQ(9PB?t~O0Wlx?R}A9nz?gATxv|M|#%K~@ zw4hwl9lDw+JdCX(K!U6S9L;@s78o1$y1scJXyi4I#8-eXj7($=H}i z^cj(2m=yRJK6maIX|J0eLKV69EnLfwtrMRbVgvpWE)vHc5x2j_;=e8aXaTBPu}7sJ zD6#KJbCuZl#o!B&Ho&TH(a{!gQRkt=XyCHtGIGZV&h*Y=R4&B8EtfS-&z3Kl*N`9* z-Wt^u74%QlG}I|q6&dLOCW@HQE79}{0lSS_+bq`W1ITOv$ z3&!lW0UQ%S4Yp#^;r^sPazRomqZlXkwRx}2=HKLxynu5cohHz4j7ASPR7}y(UZk@E5cXX^DH+V)l#SOkc+PDNW>;Q^*pTy)8+c|}eHP>t&Lk?3E zCV>Z;9J-n`NM~ldY?{fC4#^kw=|p2fB^cgn!er?t!W#bE{cews_J9qcMCL1(?CSH3 zKw{+mEhZ!D&DQLt(E}mZ#lnut1Y#)nSY~w(W7LOm-_zD4$o znKt&Bv=Dx{{icwsA7t#a5U6xl(vOQ0QdXX8XOU9Aw&&SVJgWQYSN+&In47DW_eAp) zroCxEc5DRP2~6Gqu-b&;wmFHbgt+D>AfD(?;EM8slO||;@Pi7dB)r7pY6+Wg+l;Mj zRz?>P5_+2T4H9+RiQW&Py?;lO)deD{jyKfX-dsW7k7`<1`;Li)PHxf-PHr*$y##+> z!CxHy?z+**t%EfG1C7hkDt!cGrwy&Ikn0x-t2ALm`JMiJP>dflp%LNe6a%>Pw+ppf zwP*)CL#;TUMCW%nc}@|u4rgkHx=HA87H}QTIT;mXR%;aq_Gh$IX1ZHr(IN2KZ4 z8hi6wVju&l&2<9HMuUwMhnDjp-l4jB4l=;u%_(HK)78!RaRuT-qp1m-%}c7gLuRII zs|F<%5y}tkU>Myv1|wyaz_qL@Xi1`^tSaV`IE^#D>p0YON&{oG6!UL>K58QDOL?T5 z3u;@wOI$rf06jtSDwl?(nl>YFz`eT#IkQH~aq3H0B}DEf9k@^Q$&AP+CgTEqTMROC zstE?Ol5czg%#u*0*-ZmC>d1=$^k35|1*p1QarN-_=I+fuwVfjuv4kR4fC>T;o_{QF-YM%rud6JxK? z1@?OW2zvz&v)4;u_WCbm&0jpl7@D~FP&MDlYBGRiOxU9#RKUpHab2tGWJpcoxo{^# z7D*RGFnnn_%W=hrBWJXn2hcTxAr8am*1cEEFt~z0g;w7N!_kN(XgN!|*=lJO4sdlG zxjX(Ta<{%-T7;cOZ_G{X&D3e#kUbl-*Y*A`x!?hv3+5;P<{9WtX+oKD>87TyLRFtD zm&R?(_Gc}JKIh*&KOQ?jwE~$wyVh}JYIt@;2@7@Y^o7Z6>BzL-X)WX0A+DWvzsG1WqiD$plznThn#*U;*m59567*s(^g*vYNdiV}V{7IkfbB?Nzk-5#%x zjrOgsxb07F^%1JcG2)6Rs7rOlLax5ms7V2ZRrjq{v+%RFp`m^S`M9oT)En&BvBX9| zuD-soUa%Emxjtg*aA_dc`kBW3xCOZ?i!9}h$8F|f`m0X>@1I=%yu+$K`n+x$P$dV_mp^7Ihs;dt;-W3aWNmlY64cy9c zP^lpp-t64En7Cr(4Ad&W)zS>Yy8yX+EDF~pQ1CJo?xYhL3jKNu+W~QGakLA1cbom; z_22E5Z%|6Nv%TK@MtoCcX3`l0HO)i)bLPvRbfLyt6qXdr#KVD$#+Y#3S5heB}qm+geP zQn4i5G5?3lYQLteL`f@joDivbc9&WD2TO~5qclsRz&W;2)SyJmKU(4ey+pscaTCtS zr_tP&h2VfBE2RM#MWbBq=jmiVu}R>ici3>P(ba=4dtNtPj=_<2_Dr_U-owdv08Y^i z$eC)y)pRd(VUctLit$yt#FSXC=xRdTa>os#^Lph;8><8lOdMTyb2QSL=HG z2KvufkXje_8ynQ-ZbvElk~I6sVC0h&<}_mLu;)q@gd1?06-ji{H%b#uHb%|WqiEL6 za~T-nO}b}91ysvov;`)51vd+H-;+Gk;^@C#>jYz9SQ+RYDI@zp9$Z5tm1c6J?+hfa@9wl@p1bs&<0 z<8ezONj9dt&O@yfZMw>6zy|czofwFh!MN<0D~YIiR(Pwcv&Bb|Kixz zoPo~3a&dbF*x~i%xG-Mw^%5)Yi%bvkUsu7GTFmqfZNAc(OPgmV6b^HxGF-6v6lfC- z_3cUlgGBw}E24SGG^7siL5zcu1jS~8vV}KDSw8KwkDdTxP_6^w>JYXKH|BuucAh~t zuwB7)gp`eL?eu8+C-o~vv<+>+pAb0dngfj2jbroRB^;Z@FgUhz_G!o}axQ%ZraS+1 znv$E`)^UG?y#o{xTEGytPnUSo8U3C=m!{+12Z=d`WRXUI4mvqATZ@j?_%moNr!$Xz zx;&3{hL1}5dPm5Ud~}%Yn~;%Qz;V$`bzwBkM?V@GvyGNyhrh*e5Hjf8MBgVguaMp} zWg#a|aMM{jm4aR|j#m5?cX)0e@s@&C16^@+b&O5hHqCK-!_EHg<+f9UUpZXnsbQx) zgANTQ@$un5stlr*WwnKS-$9H1H`QkHl`0F4LD^^(VUQ!Uk+%U6120(l|)=d8p|eQ|%mokstEUJW}HGJy=iO2FT+tG;dr`ZjkpzJwl22dBOf30@!`aW8y~Ciu`cvF zuF>2rpCC{YOy#a4)?|4HRU-(9io32L% z8>VrWK$i6fPf0GL%Tjm<6b)OLG{;DF|Hc2nt^S(_|Dtq4!F?DF824dxAB-zmW-%Tq zJaNCDtD#$1SvV94bbto(kp@-`KmtrHYs9&cPFD}Jw`SvJ97niPm~g{VM(H$s8ExVA zgz~RE(!-7H!1d5?K@mwuj9gpT1B$!q>IXbMzgSL=6ydoX_w&Dau<)cbqvm;ASo}9k zt)uF)3u<*Ab2o>mWsoPfV$cIOD!JI>3z=7J^rO9pFo$b;De@cVB*(^SZ zJL|2c$_~?=m89BAB95byvv{&p0=5eD)-p2)hPdPM`p4QVtrIJq#kn$d*U$?f_S=Ao zOKy=YB`YQKVn?%iy_cO3VcA@{P|^6P9>1_nXw7C>`*ioC>)V7ok4iIJF5N8UGKjnm z)6JC$Xv-)xhBu6Zacj+`jnEeVtlsI+53SS3dKfYP8v*@qJ^_Xi_o8Ok-?q#ec)&1C zp3e5x#{*#y6+LgzlV-Ndg1s7K!|MEd9yorUZM%bh!}?u0Y^l2{!OzicSI2WBZg0ri zA1`7C-&Ka)u9s)Qe312PeCF)N=d>5`S@Z%vOMd~+HQRHJuvgY=>^1FK_DX%4z2@v- zubZ~R>laU@hG(I<&Fy-Hz4=}H;T-~t@-T*j-7ryfrgHF&CfiO--1W-LGOjaqH$2nP zPD}muOiWFfoGLTmb_Uqz`4PKqS8OKwDAV5n``4l?2byq=Z!_l>G~kp{1mK`c43r>D zWBRogTvz)|FGBmJSqkN)Nea!9%vFq`_VakCW&e2g}fQX$0I~$9%YOF~lac)<7yUzSGg! z)ZZ5T0zf;07?B?cOE-s}|MD`@-w|=I(Q#zs#KMTv9eO$o)BXAP)8coS5GrpomIuP} z8R*Lm=1?#WS)evI)Qo^`=D6_~Xi>Iv9*Bonkk`JEWFKVm&LmP7ebQMo*MV>U+QL&RtK zt(K^9piQxpdF3r$CrwkfuH~djWMd=f zqk=!5e(!x$IXdV^eW(s((Tjtq;(;g!5LNDR6fxJn+rgNa0!GL>UGW!nok&Xa(jQ(# zts8;V#f^kPLpA_iJGu}^@tA1zM?~&{3ic0-=o=t#JTN>caisUabeMLm0H|+xSf1XQ zil5kTTFxdYsJJdJxe}r!TA~bJk;jh(kpLumP8p7)t6v{+@}r5-!3~090*)b~Y z^1ta$;A6fAFs%-#&4OcC&W721AKEYB-skaD2c9CZ?|*hO`d9rJYX++%JiinVd^UZ$ zO`}(ElVY6#UEX@x_iEhc+SdsTyqWbJ*t&Qg#6^Js8DC(O4bPb%uZ7C<&>A}h6`r~a z*PL zce>_-aS;0LZhdT`H?~!xuk>7T??UwTfG+E9Yk3+Hg$l(?XaSX#EuaRT zgmKec-Jl68&D}f{(9}yh0kzI@w3ImdZO|_LCbirgDz}8xUqCqzt|7OUtx@NfIi2^& z7s*BX9`5(<15#*NVw}c19gz(KQ1%wwFj#;aALY|u9mWOT#4*(cShU9Ah!Ke3-2uj;vo#d51B9wQ&_PLC5EiTHUSDr_zuSz-po> zlu1J)j5n2W0S*+)a$XGha2W6;6n)}L%~QPqJS*zw11-kCY3$y4l;jtET|97SME+SZcFn4OvodS)-a=Cm`Axr7Wcs z37|QvZAorkYisKyOz71UkQHw+i)o)|jAKX8p1?SH1o8jCj!>szoJV^v z$<4UU7M%~se*QOP<>(x=2=liM>A5^q!d%pF0o7()wvF<*91c`Qw?JIGQu=Zs^UC#K zpVvHZhE~%b$D=qd+ffm%d+GH4O@HBu~DKPUh`Wy**cckUY6x4^4s)SSv$c z0D5~d7yWq|bFh8#m8$^W9|b640NP$Gj~*J0-}eQx&YleG87m;8lRSACLN_6ay6Hay z0D1Bld^6R&u+vQy7Ih*Kl38JxpZdRGx=rZd+ejg4rLB3;h)MQm5i1$&>8YUJXm`+Z zR%d97yVE70W5Twru^m7a(m0X^C}aW(Fc#Ah$leeK9c(c_8l8sGpt)<+g52q)F(CKa zh7rFh=*S`@IUjJdPkWdA5Sxqoni~WA#|B;*8wigELJcEmJ+7mbPK=2(+_QNjzMXzPc5bq zq)M3arh2K1Ik$1OIORP%MW6C&k@rbwJs2`L*S4UTY3K#Un8(iK>2q!6I?&U$z+9V0 zb1-_{+Qfu=<&-|*Hud6!Yo<^1B{)7*xt5fompy%yty=e7#cvS+ZDw*w?nx{vX+;5m zCPghMQ{II(%-q>BRd+v|Pp-S^OSoDQb_$8nA7j=NtcRC2 z;>@)QYUwrMQh%%SJob&w1&ekbP>koTsrnm-3owil%#MJQx+=GL!as)rye@1hbr{YQ9V?phYskWm8Ce881ZY2fbQzPkerjZG=j94 z;v1s}Yx<<;qg&~iKKJRP^zRq+IOf=}Wi8~L?V}ejqpLGxbji9+V?xEOEaGG+M2n3n zWIBhwLf2!t)b+8ZAqTMG+Yn`=2H$4tk0wX(n*{psTWmEE1#Ug=LKPu3Hikc9GPm&+ zeD5;PK~8Pl%>ouZ@B#~1SwJa82*`^JwF?3!(PcK_vdZYMd)ea8BaN*!NZPD`(ji8wyOLs|DoNd^KOUj(1y@sd#!!;F zry_NKI&>{{_Yl!7xth}F-hh(pgiyJG>0ld0;-dQLC2=3WJSwYo zLZn#`&?o?b$M)OZ^xr2Wmbk~axdeYot1H%8cd5g58PBZRx?1aE9j;4U8In^mkLVvu$rw_Vqr@6m&%b8_y!2IF8(X#4nL2sZBIDQOJ=&NJ?S`~g{ww_ zML&!HTNtV`sM%y`Zei?h$B?>|-!jdIr`~9Ze)a^+yJ)p? zBp+(Ut(M0~wHX~UrlLc}L=sWDXONST%ew3JGgqC)=JO@1KgHvzp=}^`XCDH>LXw#S zwYF6YtwMAnNK{|QC9vw=yfImwy*VzWC;BNWB*(O2MSZf5Yrx(VaIb^;%{cO|w4yLb z$Mr!)o7D6LJVa$9G}CXS?>pHRm_ZCI&?CB>dXE72Z6A-OLtrWzoI_}Yh=DSkXx4!M z`=b@K4$tfPK*2t`qd0keL6&}|{Ou3edM3Lu<)D2Io&)DPQcJHZLu=ZqOOWdtmqR&? zLn$bRmX4GlCSBuq=w$#$WOJMoa4gwS?4|Fc!~7QxV~5}P>VmmtT;l^!Na2whH}&4Z z*7Bf;akc>+jcUD!Xo_v1(G74OA6<9*HK^X8!w^?oTkxmt&`|(%@3laDqCJ*;1J^hg zO7hX-h5AXs+x-0r50^8J52ONRNRwvxImRgqu3&lE?Q{+xUF+6v_h>oK;^c%&qR`d# zi}b#iav)HXI2JP_(eLuaM(lEW0|;w_Q~i5zw!3cUI}(z4SGfz)*4twYY|xSOxa_ zc~DV1yAeY#eMa|>Vk&l-w;57XZbU)p3MBf9zx?;n+ZglOY zQ!@az)9)WiF7+eqJ^(;pq`@<_RcI%8_jmU@xr6xdk(i@ny-3m$C-pjc$8ghEOvZZm zQ-q@b3zW~Mh4wk~*eG}OGjGsZ=mc$U69s@{$uszg6I2F?$J2GBti%}ER?JRMeQ7(D zI6qaDD?WXQ9IE?$Z=%7 zV7JRWi6nL>GN9{Wx=9?Z#T95}C{;G2Yaig$`x%P>LHYrkuvV$nF_Pf z5pZ9eC>eeN!_!NjN`{}raCYfW zFq{VAHq@v#to94q=~{Km>S!7^vPL^iT(MfUauv)-D;kpX5W3A3LwD~g!G{wc6?4nR z+-gCxu(Q2(H!q3gtM3e$jk2JG&5n+y3($09wNUSftWU+{6l5E%2+N@Ff5ohe{6;qt zL*@G;{t9Pc)>DQuw=R)#NV`9!wlE^ifhnlgzLjdlI6-rrkDjAj`q+VmF%}(`GDF+A+M_M&u8mHHo+Zs^&}&D+ zJ+%k^f&`qq50jlnaQ{TAH8w)5%g!=}dfOm(IdhS}Esz z4v*fJGu0jMA!t0<;7shzv9(B?KkRJ162ZXMB1JDG=D~yC0yC-2RFc0@z)dSK?g~m~ z$?3K(u(zPGm&CncpuLZDYz>u_(bE8$R@r6>gypZ9`I}q_O{Kk`X_}W5;b~c@5U+AU z>VE;oxujGwEcVg>dM)DxVl4Y-etxl!&OD3UQd_H*=Hl&Znsihz!4tj9OFii2cBZ^# zVQH;&tKZ`n@ggq#zpAnF=!?iebMTW>t_Q>J z#gWz8S`a3{_E2M{g>?K-S@RTI9nOalsQkR+Ari**q-Iet95A_b6przq)QxNUd z<~Eb&GPfEkp#rEba89~SX^wO9uUdxkrPP+8borN165nx`#v!dj%fvu0pn+p2@g?c9 zsWN(TY4jtOfQz{77;QS<1B3`#G=uG2xveXjQd!oraHVt!vAu2}VgOALcf8G^N<&NW zESPTkqFJ`E?Hn`%Z|`%(Pxc18r15vN%2QU}1r6$wzrwb_7)r|+jsl=?Z%MkeICxGf z6%U5p06d$%->o+?tIY(>(;KIyjkYwJMfW8@jF13H%gmL%Ui5W1C8c$waM)v*!P1+} z*h;8hfv`$Grx`}}zs&3g8T+&Zbw5Huk7f2iBk-Bm(>iS}bCW@9U?&p2S~M317jHR% zwiV~fMpcfJWpUJ`J)Tf=Kg~dwVHf%@mO`zI*55;_`@z&&e;0{GK1~Vnq9f9DyPFog z%k*EzMd^k_cH^+miv@IDNfuDG07pQ$zYDMQQj73f6?7a&&u=zyb_jl zuCdRMvYpN~_FVar{`wm!dKrrHcszxjo|7@B+voA9u72%Z)fIzYxy4QId53Aecq7eB z519Wk(98P)3fDGJLdI$By9fbVL0#OZ<@_40lJ@9IC6*%b(10hjoZW0;({WJ@pa)X% zbSVSK0!2SNF|b*1uyY(uc~pVa z#K{2!p_wNWerM4s$-~w}Kl}lPzj(01z$@L(`nq<##YYUbE_>=G=ox+98r9F26!3!) zcB@oDn?Z@-KI&3ELjICnhMe&4O5O))U{^>bE|5|piR+^%DT_nS+X6jO!LQf_QWJiK zikp-YeKS<1VJ(G`_E6dI$k&yTuXy5XWCtBrY;5O1CAK&&%2vnF28(_}O^TWe)XXeQ z7B(t^hR!zH)(unX!za+gY2DZe(8ACIeIb&cZnO7%?k@U|z07w?xXM#%4jv-?yAD#!Tz)li5799%UbmVVmgmACTj1M_ z&XnW~-b)7WKGHt88sd+T4tyI=Mi;~PN{GR0-2mof@5yr~KRbCQvrFzDyh!>0$_fw_ z1(v~2j3=A29RRmcXc8R&yCHpPAtX$FpulQ72VVkwnFrq=JfpnNkvGU`au(~UKV;#Q zIW2fpfZd1c^+8>TnH8@jU3R~_rl#@bM@P<{cXd|p#>X4D}QexnQE0;d7S6uW6X-L7-F>l+!9X+A zl>NxL?aSCLmN#fW$kTq1tNmau%}D@)M!3xD^N`PQUbmgX1v~BJ3g*548TpDt{07=E z9|aJkc0szPeZn?feRzvZqtEZ;YUs~uIF8x*%gEXS;r<%X6Rq@>#Dz151iYwn2kO$( z-b7ux2iN!=Ma<82mY=7q-%jj3cJ_?=#o4W_qL|f??;m>R|obY{q02I53{129UPE&kOk<~=Z@y#k*`cpDHFcH z6G1;URO)`Yqh|u%Lw^bRX1}@Kp31ywbC9s_>Q89vfKcz_i1lYj@k9^(h`ky}`--U5 zOQ#|jJ$`i5#S1|joxEOAu`^2X!cMeZX5OP!^2^^+prk? zsX;%L*u%P^4VO-NI_b2&Yv!T1Gq-tHH~RPfE2;o`kKc`&ac){tGfqVx>LM@wG+pm` znDwqFo~s*jn^PEZ;*CdDFteF#1C^?59`RzvRl!mB zW4+A$Ys>s(Hiup&-Sl<+yjya_Z)VDAHz(gZW(crQ&*;&Nx7k^~=y>QH=rm|_)k#Jc z%{^e31Ybw>TlaRJ=cOd-5aX257{c+*P@F--r`H9Fq(;Wuz)@EAn(;?W4mKan2n z8hg6rdtK~w3F(ZUN-W!<2J1MwVXnX1c4|2~om>1?S={@A(%6=?^dhhU|xv9(~#f^<=sjqsLT3^H?A&=k!Afby$u{P$Wr7oe~)r` z(FUV`(Szh(-f^!W--X*}Ez0Hm^^?gPr=y`IDg5B+nJf2K45!Pp0fCv5qj{lwx<^ue zu^;_fAkl=0wLGaa6OTYv@T59!tnODI?2dOK=3U48Qa#=;_XFPX13`8iWH=Ayub)JY zp8jI+-I)^LyTr)LGZCpKl}PRu)TIJ+a@2?h zW^+H7SdRA-n?==qA@fO63(x}YKLPYocna`zEEVKcZO|#L)#7lZ6+W;N=d?77oSaSG zVBLB;3YDf$X5XxLEB05U=SFW}Ko;oMF;KNUg#W<8pM?Sp?{v`0;;Kolm>&nVN)yE3 zMVv1;GwoYnU?N$Y@!)RJYq(8|$AKaripDDQA5nMk)PRM;(pi>7+39Y91&Pz5Cn_(t z9_EteLhNu=x&B#YX?d)ilhc(|{4k4AHVK;i2=XmVkMFW5m?f`1;*}tCOan3}IY{q? zM?y=+U8o6FS!>+%^FpRv;wgLv>PSV{4ZQMQ!OFN}m&DF83%f90EkzXB`s2<`@CD`@ zX7YjY)+aAe!j|uZt!}Ld^ZCX~6GtbzRBMxxin%O$u3e1z2CPN~-*~tTFT%S@wpQY) zj7~q_$mO%eaSL8gc!s6m`K|HV28(ZOYok9`mI|7>P~F07saOT6w1CP?I+A<3H8qTh z1<<&EU;(2uYBYw+gW={&r2Ww_!!&ibB;OTw1ija%kd4oqd}0%b@_HFfBh8Xvsh?}feE-BDB!Ns1>6iJ(mgiu7dx(z zarX&Onu;Gh*(#`yfue3He9KTB#|0VjM=v2GHplVEj>g{?T5@Y#(U`bvAa(trydkyD z0s<2A*ICqBLA{qpiE^(1Pe-jF``VVIffSj5QY4L6wEXpXEzJ{9iX0y+MM4!jD#-C@ zK1;KN?z={K1Q^l~o#b;1Tic3I2l=)PSDw_n;%dchvECBYcf!5J=x-dt zy?K!3H$cft4eGt|&`MhzMk+GQFNN6yB9vj)r1}9@90q_1M>&qk$pq*e$9*Fc$}mnS zZ-K~@Ov(Pv9-UB@vI)iXcRL#<6zK1bOxSJ|pj4E%vc)LJRUMy^3ak4==C8(VjZ>awUt zwIVmpju4I#xOFEJ0M!DBBx5Q{7$q`E`LGWrXrNBd-9Uq0UvsANmUj9Jr8=fXvw-ZB zH#FP8>CbSQ&SG-!Ea(Luo;YSNi_IR+d{53$+O2Ax;5gGn9cSdNWEvLyKfs&?n6vVV zD40Y7HzsEv^hae^}{)0lBRD;?DcdM7(tc&|k@kaCMstVtiM z(-@NF7GeRBqg)2Phiqp(L^kiJm|czd9G7okj!$~WRaFps63=YS6(>K&?J6b0M?Xbr z^G(iQvZKPL&3;QBpC}j#_2)N$-0WH$>;kz7AP-#PNk$>)Jzpir0oZ*DQiNkr3@|(J z9^P?}Ag=^oV$|4t9XXDS5)W-I2AWgrF3eupTA{+EH#?v>qR-n=VAX%dXn*KQIT%p%m69meX zqSIfb-vNRw*d=AE8S0X8$n+o!!Brm-`ciMuw=9$K8Xi=RUZ1!Fr#Tf$0%ESrgK0Md)b$A34qNinEoL@(u)~5U(4ey& zM3?*?+(X8D!eOAF3B!aujlOjtxp$`@7WL{V;C6x;uUVALSQwbRw?hf-UYhxWZqIqy zuJ>5mm>oEIhh5cK`@)D>yuW7(G_3f>u}77N%j~rcsKEsv^UEvcG<$Xr`H75 zVTXJ@tvJ98*BcLvEG)8a`rT_u9D5I%n6cd~kj_XfHI%r>#iakffw8k~c|pp#6GQ5r zxlnxT^Vh?(Whe!AC=Bv^n1lvT;-OM$tvhijWfi~!9E+8Nz&SDC#sg6~=TR?wp7jmsi}>VSsd!mQ#m9I{ z7q%||w&l0+z*r_>t+s_*E@j~6NDzx9&?(BMVou6wb1!IJ*56wFHQuh{Pr+N3qW6ji zBX0WM1>JJIlZ3F&!lTA&3&?865%I~FP}NEa1)U$`9cQ#;uKw#MvBZsg^k0aU?-(6yc!z zbjKm=xEt^eJ(ih-kdTZK`<@ckT}WKw_8h!x?f|x*69agfbfiqcVN9VNuKuj63O<2% z5FIN~cDe4|x5Z=R!6RKyg9biAhjbHBeW+5r3jY zrz8@>XyqlWiYsKa5einp(@||%Zzs=`FpTioHomOoa)xZt@$2BSochqVS`r`I4zQ7) zz;R87$Qiwq!ZSE3^Keu=dW_B`qoZ*b!xte8tZ9yRar>Pt4l6BWEpY%(Jb@?Gd+}J2 z&KSV*V(=s`!(fxDQ^q!_f;Fk+?=`8CJi}7;u@v`>FDqN4K(i()tXV1ktQBk2T&GiE z)u$w0YgCKVxsB1xFt%^cKi*gpKtMb@Cr2=dK_AfHxU(zJSP zONrhVXoO)8ei+|kP07~VVC*n3e$k)M0%M2Xg54nYnqEiO!Nz6ylXIcIDDZ12gyj}S z*jhXO^I`R_5XWH#ve`^eUO1yx-Eh_LYNhQenH!VAlm$qVsrG)R9?cOI6d#xdTWA+n7nsNqRvY##Z#E=TtJ&x{yfb8 zPw=Vavt4>KVTcqmB5GK{?ue?VXP###=q!zWI9&(!vMprXb(=~T>Urtx5ph?9rWZy4bHEh4R=I9O={VJ|mgp!6moy%7+H&bvLya=vSK% z<3PoH-XKjJ-Fvw?rr*`&>WNOI&yG|2BTc4nzQT@isseral@av*P6KD}Ni^`^ zW{+HNqo1$E-yzAPO|OhBi!x>6^6!(&qJCVIbX=6D(52VFysN`RQ|+?Qgk-dkxwQAu zj-Mk^{h>Rd$!KF+<#I8K}sZ#>;*9b4$?f!mpN+j5_B$`oi~o|??-b-5;5VO!Zt%M@^dE-7pUqO5tr}Y49kSRa zwhGS0cOI2y+#_F%P8kUb_eiN)wN?HCQ82dVIvuCQAZ`H`&%oQ!tp>R$w28TV4>wH@ zxh}YgD=zNk-1Nl3gzK)LRmbgeeEnbX2XNxM!8mW{^s40t@u#O^h7EUyHk*dkW-F92 zQ!m5H%Gf@p469wXLK!YIIbK+8#q;WX>x?Mhy3(W-*TwKKKtFDt`rXUfZ{9!$d46}* zj_mp0CU#^;fk{VnH91oFmU1a&b9HD_0)^>gQAqzL3eXJeZiAH9I)nB>ndFH7#^tI3 z%bkSYA$XiSdu%ON{o;)aomIyxRM=Mh=Rb2C9(T+IG9UfH7VDTJ++N%R|H?isfEG}( z$AiB4jjKO%>OXAg(Q^6{r_0n*1c~O1@eJuq#V9;y2P3y-7T(_BvfN#qD+x}=QF%b= z0@AP+MyebxYqPd}bZrYrAD##Rz%u63GFnG+ z3}<;f_-j_Y#}hT_h#;T`8^`8-)fMyVN3qD8yM#rkUgsX-M zrBZ%A+wZ%8=bF(5oQY%X$`=FYnCM3@1L#Z~H@YyNZTCT+Lkr#}MU-_Y^tL@FdL`}{lK$M8#(Jfb^$MQ2xu#cQ_?y81_zE=EI` zqThcj$9!yb`>(E%w+%$+K<9*9(288Q4?9P`KtnU|jH)X40oH>bOdXgF*=Yz53`VCU zyK>aaLCc}c{sCH&(y=d}{Vgsdx%vPzv)z@8POw21)e(B68~wmhgP=cqX5^B|(Mx51 z{0#ai&4o`*E@0SPRU4g)S8^TB|9f5%H8rD*zOxlrPv`ba(9Ap0@yIq%>1Dj`)pBA< zHZMZJ=z?n;z*=<&u+}91;&lqhznxryfAMGB8UN-2QKT`V$Q|Y1d>mX0<6rYA|K=w7 z7k^)DOUX8^Pt&$;Trie*PtEuy@4CCcF~(oTc;-@Q_X1Le^qc|Oj+5$vv#>UV` zr|CZ`mCM=h83meLMY>1@q}& z*t>wf$KG@4arT}^JK1|aeVx4*(0%NkM}NcK#q{6VyM+GozY#;Hw!ulCW>FP%J9}5r z0DCW?o7vkF!IZAj-OO?a3EzknMTd0CQXx=Uu~17>22aCX%Y|%{^}>1ghZQQ z!c7hxnqVb>3E{l8_C7Prpjhu~?(Kc|b#S@Q+26H4XYaN4UVAN}_c!>6a^}Kc$sAi-J{wf}Ip&Gd)p_(8l*v{;Rjm(NCZ)NX=AzXHEthA3N%a{dwyWlz7V8&MlNKNW~U z#S-o^P@me`2%&o~5?5&L?~><@fLlM<3X=FW{P0L;AyX$0MGb_9WSW&0$u!R^qbk1Q8(_X%<-eZ`vtj`0e3MifeyZL|748kF)TLi~EA_sYaz4gq zYV~Ky;~7HsBF!5LMDBd3*CeQyXPoal^N=#MjeCz5W9u7t zOsGH8>a3SF_8cM-XAyOB=qt$POXwg-bfM=E5|Zo-1v~^`{wKk=3G@FW@4S(8s`@pegCS}oNCqT z-1eE{eI`vuH?+&0pDCPIRQB60zbHmM*0$5Y?BJW<#879u(yn&4DilY=sG8m#21bl> zcVRfVo6uFkf3pFW15Cx{4XI0&)h>|LrOF}S+68iFlfv0dazEkA9mb_EE{P>`Hp!jM za*XxT01h+`3|z#pS%#st{&}1S=LkSOzyW~Q0QLer3$S}9T7my*n=9qvHgE-S1#mmS z?EtqE+)i-2!0iIJ7u;TO`@rpUE0Mop6rGA*sW4u|O7{V%b{Uw+T_}eP?Rd0t2V&^| zOlvRs;CJcYBG4S(xNi2&K0Ml%Iw5MH6T-f~{9+%J>v#mq?fD2=I_42lUvHmWp?wmK zeNw%P^a)1Z@hChW0B8lMOI1ugQ@cRn{ED>R*QE9S-7jmzO^P$nS6@L)(hIeIF?aaI zgGd8?_Lai<53pfWGtl{%>r) z%|(4D7%oNMMr3PI0%w`%xi{zK2b zK^BmIPr-&&4$u>6KNOGsdC>^@*Q3ZHr9}3Ud z!V6mIu6 zbL9G4blh~|PMX2kK^Z(lGjJXg`9q!+W}#dgxRDnbAV>WxLi%Z4#tW{@R?m3h=pNs8 z-kCjgJMRL~;N{)%B3f3B7x>IpVb*ifrq^$@zD+M`YmZ3V2nV0XCEuiSCE-p&m~)|8 z)tnT8L7tKDqI4&PLlAi3jLj#hoE9bHlKJgMWn~NUgY=G@GjRtwNNv&7{FFg~qAt8C z_LL;;sHwhfK*dJaWujsO+3au`UMF010P3WSYD53$F&ps%pmeC`Y2x{)8&+k~qP|s6{GLZ?zAY#)$JDjiRbAB}pRp%*q&UeO);_WCetIhC5?Vywa*9Q4EzDVxG$_263cN#s|OhtFl4xmeAS**$yDx7^AC1ihnm}oFj z*~SR3z+(=L0$eLS8T+rWQNbzQMx{$K66Uj1K`cb^hCZ8_nggPyGtiL6udBRo#CXPl zEe#t(O<9a)7=!DLHezW5O>11kc!fG%Ov9SyPqJIgoUh|879|zDSfcK z|6SxNLRw$!5#i<D_vWH3RQ1;H?FbO>l0BnklludNyk2hTGk653cc+aEbluMCF;urge}66vJS+IzKFx1)!xbO7a{I9A{5yE_YOj);uvf+f3?a|3C)$Cgu1bG?dPT6mFUT15RcZUjAOX+;k%F_XF@NTf&CsR~~(O2!3Vn zF9>b?!qb#rnSt&B@M{B5J$-}x3g-Uz`4xi0ko=022M^9BfO3FBfHeTi0n7ktPybN- z3KqtTSm{>)4gj2Z`oDu;iFww?ue3fhB)>BI8PX>hc}EI77Xs{f=I`(;82iTf6_W3N zieHiPZUY=T0J;GB0F>aZ1_%eZ<=G#KU!iSefdA6~mID+&`vdVSzRj`hEa7dXWC6vz zhj0Y_K%I3vaMw@94R`j-xyWuqii{ltq{S|jPm=Myf=fvauCb9>LZy-(F{>_;Bj!-b zanPfLEa4-R&bf-=$Y}yH9Tf_wvjxlJc>fH@Bto%K%@0Url|Ak!6maX~l;s%lxc>qA zPp{@Un8yjj@Wo?+3`6N-H!Ktor3~aHMj(Z7T+%k=(Fpuw*E=Nde@x;RNV5zyG@q*8 z>trYGRk7o7Yx(!PMX{{!Jx7n>Mghz-yDQlk{j`# z54t$4zs!z~&(*TpxJjrz8}Hf%#U3qisbcGqLMN`DxhlWN-{75LHE_BwX%P zkhM(~Sem8=BYEER2_|?M({ufjVFJJPFWrroua8Wq?>Rm72!D7Q(whp6pNuUa&D4SU|22M zJmyAa*t$Hb4BIyzMTV_g936p7Mu;mi7*=!77~zRsK7M)6F0WvZ&%hMjVAUVb%HFa< zA4YJ<;2ZFZzvP}r1yn;M!-GxT2Kb=nplo=ISI61J=;N$*A*)(A1Qt$pFto2{v@mJ_ ziwW@Pil7=B2KLr*ric*4oph#X+vzt`cyI6DEH%S@LavSsd5HY?2G0W?P|AUyiGKEWuCA&(MTTi5 z%R&)_uVFQqos!73h-ROL3w1xEcX7$pAr#dEzxdshcXd^^I7NfTjaNeW*>7XEcz%X= z9&n#XNqmBcV!2L@6NTftQ=x5FI=8AAE*>!K#LQ#QCqq*ZzsP~MAe#VKaF8qaf=2Z;maUbWg8s}r<@ljH(c~~SW}8hDa#g`zNgKqyw>8;@G#!99xn7eCJq=dP!B8x z)H-aTQj5Y7D%8~}j_#w9UBt*&Cq&5CpC7Jvr>?8%TcK)PG`8? zb06_C^4x`H<2fApz|`VQ*CI@Rn`mT7)%R>&QPoe*t~1;zbEUKEI|O3G@GuY*anjlK z?b*O+UVx-{B&`z9@~FfEc-nRpY&8p;Q1l<7`^%)DOj~7Jd}SNk;#ST@afCLZ^nS8y zkcCQ-{j&pPxAD0r^q;a5v7pEdjDZqaboGPaHLl!N;ISs+YkcK7E*$9yUo3(TJ1@&7 z6Z#&Oh76z+4N=Skk@U@Yp}bZ2;|}uOw0efah!oi%-gMd}L-aPDC$bK$Zfm{oX!~sz z`z&BRP@%A!M$s_g=D;zJ!~aB*$ELY zzksHuGW4goIXxda8?-J{o3|y}Ak3svfCr?`Y=dtg+Sq1ZnocZz(Goo4ea*(70Y>2R zi#*_~Aeo}3J*;9E*(D-Nc__UZp}7<&VyLBRk8-t|>i3Bp6QOUq?4pQ5L9>K~e4r5I znL4j>5+7xOI|Rp!p@Wj|x;i=Ep1-oAi(c53#8P@g$O(|~q?XwtGOpyHJJPWDgHosj!M|J_wW zp%V5!KAux?lZC>%z+Kc%7r~HJ%5zIRr)DoyRci5V$|+?$;N#VqoQRsmFb!%E zBho2(*{I_^evS@2*bJdbLAHeMr7>!{Sp(74m4Jv@4iIhEo?Fa9)&VmAY#7G}JLbhD zawD;c%|fZdr}E6%q(no1+*!)i@UZH}$vj=a-L&9xyAztk79xDPgQzTbaeZV%S^o)c zCpSS8PQ&mqt6gza`|PW=qy=GqYu}EmY%Fh7>zi=*1!zwqEd+1Jpbdp^QQB2*VwanR zS5e1K?*bdFJd=v)2C4$`A1nN^)~gvoc(WD-)N%g24JNB>vv9bT8nbKi>b_O|L{gAT z%ZzhzSE&dIcHz<$BFuZ(Z|RD_X;qCHs(Z?ah7DrdN&iX3GWb%xJAC1|f}sAm=`SMD zE#UTE7+>YpUhQm^5$zsTC&+%EGNK(fP9@FKRO2+?*!~njLvS9TdER+Vjn{8Tq=ir8 zbzg1n_f5urCI`sN*MH)r@KO17Uz72BpYm&^JG0lOSelLpY*}JCL0G6FIv=C(1f~q< zk6xK(pRt!6rrBq@($K0J-VmVt8ow34{jCg`V1^%MO~@Els`n@T{@?cLkcXch+Ey3B z-V$2RPIWfPoXxU?FYUnzpKp}Qzes3?r$%^cN@xYXyj{kfi9MRo$__)#KB8UT^AX>$ z!pGa=BqYr{TS~E6wMe3KqXJo}_O}RuiF48$4+c&ui4P7jC)JW9YW7cAWJ=PX+%R6) zG$=7c6MOFAja?}291f_YOJ6t8g*c~p=0dxoAAqV*h7?V?8u>cm7fPa5T;IrP2Tf@j zXMO*W!rtE5<9jbp zsK*GNPI6SRC`vp02=2CX!{A-nbMcUt$>_N#sbR{G3Rlpli;A-=Ajr#Sc|sOC;utpA zP;->~W+4ph=!P`ksx#A{yu)+FSdssjzXVh?eA@AeYw)gSoK1EBg&5&`GXvc-I*M}h z>gFH}Cd_-F&@y@xq2)^L*6Gm5e4|iCCm2|RBlI6`odh5MQeg%1%cpZ(nGv3woG`Oj zeg=aJg;bp1id(w)FwDkzMXss7g5UosP4y*mncSd1!hHbDM0_O*6OKSN8>UDo3Kp9W zH8oFSxtUtDIKI4{gUs}&H4m4_QM;pdtJ0?Mv{TwM(rf36twS_#1tL^#Z$(p9ZsS+% zhjnII^?U5;y5R{byE5U}hTjfnraco;JZlK)|}sJpt8!BQC4}j zJ7t1O-@I{@FdcOlAI2lj0a?u#_R*6}f10+HS~fzJJeumgkS!|hA%pz_QnHcs2zVER z*N^Zkhybe6hfU3S_QzZ2`;|XeDu0ad5-L6Js}b3M3lIsOauo`69}gnli89x{$kOj->F!1B!0ZZE)zBZ z*aqMxfm70Rk*pbO<~E`*^o1-GF1;NiwKxw)p!KXr$vGfKh=2%fB!ZeK`Naq#>TX(4 zgSwm6sn%LOijkp+IgRCl8A(6+#a4BzJ47b?x-W3r(P zpp-LgiCMx}1-0Jps_Xy~-hd2aY<=8n8PVO^y9cYF4~j%WG*p-aJ@q{CY2?;m=S9U& zBqV915PO9j(cdeK+~#d*ud>qk++I!1ZmN3hjw%$@pjoh=xFTqJZWIKClOP=pYIH@= z_IGiefa&YeXyUj}Sc|Gvd-dPtY*`vViCyfT{f;^VN$uqkxF74ZQ{8;n=Fgy&obl~%tE*g|VYH!qD^4grhxYrXER$m2n2$ zJ=Zu*U81nN(n}j=3s)SpN$^~tPw+U%Aw>?fsj;iQ5J_V2ec$H`A8F8T;_khS0ruUfqV zb#u?}OK4>0!c_Ei!sqNQ)otvTD7o9njs~v_;1vvB=RA+ET1|1D-w)})`JOs`=!nx! z;|?vM-!jQQ`B|7l(taG+H>V%)%^|wD@$9F(Nv%K5w(v6edftnRU{7YGFBL{<2yZ#i z@sY4(;L(z;f4R%p;mT~&cfxcmJ|OLXKj42-Rtp3xmVSAQNN&kv2J`-B{jN+c+8u*W3biNG0B(vf zm6kQ^0q;CWKaHK6=~_0MKXgWLnY8)_y8;MQ9 z*UTVhH@Bby3ymvf#0->ZIIMLo8!?mDC{A`KDbrZCZeft)N+?^5$64!YRlLR^nzYTv zP9&Y1Qbq)Y#^v_2i+N4mq7ls=u7}BH&^>EPco)XchwK0^fcN@h( zyuAm+@MHwqn_=&v7nal5a7U#W${uV|gz+JDCb4!=aFA!3KDUbtCIQddWHu34G3cWf zqDEdzyp<3?8TY#Imiz)dXB*9j(ApcYj&e^>oeXg28>5X~*a1*SO%2u%+Yomd?yDPK zeRNZBayweO07gKw?AL7Mn!@1`olsbJ+Ia5R~0y~ zz{vOzx0Ib%!dOj#Yj|?9!2q4#{yG^uoz8}SeM7}0cbc5!8s@AA8eeM*C1>_HjEG(* zqgE~r6ggh98)~4eAOj`SJ5Xj6I4gTY*?+f%EiZ5>aIo~^V8Mqg@Gy-JX-Wy69_qOb z2Tur%Tth}rKeq9c?~yj9{wkVDvTq2X@>fp;uW_>@l-!ES;^r6VtWzN$h{?+nw);*JUZG}_7n4MXr#-gE$qczK%VoHaWHap z=Dv;dpSe*_Q-J32DMBPEK#=?5(OtSa_F6Iyz0$EE$~eSR8Ha;}D==v%98H1={3J_q zd!6+e(|ye>O#YniW}py6T%cxztylasBWz`T)qarVbFE{ozp#=_MA7Gdn}ad19(5bF z4m2R|%5AO9?Qb@o#>p9&Xm*$@x24G_YCWONMwAs~YI8-mvDGYS!ibG5FI7}(m&iEn z0n~U{bA%h&)4&))7%nK@*vcv$CeeWw*c8!?csf~6lwq+8(%4yP>~!I51vy6^Aqx8{ z0&ef$Q$cU<<7SmBv)41OyFtaOAZG@0{;JuCmLd&!+|t8F-Dl6TYc8A!BChp@X<-pl=|i?6>LJ7+C*j>YLfg ziMR;^%r2xzWFRL^jR6|C+1Nocy8|AS_%IzFNI4S|5p!0P$OMD4Mt?|CqoE08^c!x5 zxe%woW_Ao8rUG&r=w4F=oU3+!j zaFr(<@+Io9UfQc=L#VG-c>W?W2G%Qb;{}`D+t4OE4wwjtL1qFxS4qSjeVpZ}{&kV- za2rp<%mjb?JFUvvi=!EnLn=snjfAuLxkKG~ z==aW|=kG^p=-=LtTjA}jk|AbPM;lN#Xd{>McQZg+X1nhvn;vac6iR=YdreqIcLOZ@zk`thEhJ~}x5=HS#B3<$d6i^7P|!DXl}U*bW=00XU3i`Vs9r#5pz!%SL_Vwe#%BTjABH?S#* zIK0?f6Bz?IH^ZBpzRBsEk|B0UV0 z5kLJ9KZO@cr8|;*Q+qyCEfMR=MP}IK5M_DrfR;0q@F#tcM2bnIL7pd|c@TAJN&>W_ zo6YW&L{e!K^6;j2Kzc=Qd}YVB^DxMd3`nZra3{hlQFW@jO#P0F+hSBh#XxFR+t9A9 zzZl~9Y+LBDT2)-`_uLft0#xh-Omqzy7^Op{<16Wu!k;38X$zTDHuyebXS~v`JvBo9S4J)v#mmVJ)FL>AH zo5<1f1${p|PdHeNGLxQnW4q(IRyI1GyTDF_bsHx#sm ziPxT1dO98jb1J~mS{!%;{MYq99Ph;g;7%26pL)TEy7%sQTtRPAB}w`al-D#8-a%MHx|-a{-St z8`<}H+!Q+nT=wxS+sbSq97qt`9YB)^p=xqc1z#Jr;d7ZPsJA6#3yEJ#1~xBq71_eV zC#khK1@1-twS;ays|hBWYW#`|*)9WK&ZNG!8qm*Ln6V~)g6kBKeSrX7EJpKel zIS5fsD3QWZsRxnwdYeYeG7AR|4MM7~P(ry+NXJZi6_vd?!Uh{XL+*g7Ho8aA2~3jq#y?dd6eV6JA!hjIA6O#0?idDD)B{H$A&Jz+nD8^P(CalB^p)4{E75^6w(8ZZ1^sK%Yw;pG#Vtx1J&alG^d^7B;FfNHvF?X6QZX6rb#OU}2c=u%4 zQdVWTjk`0>9>oCdRPD|~tn zp(@C#{<~sQ4r)9kOuQ~Y&>^c4RDo*`(7W;dW@j3?Y_O81r+ zr7O30Ydl_emT2k$)7*7tW%nU1r>Y$Z(^-fosCJwaI45IolCxPE&-HFO2ARa=itJ3t zDfT@aL(YChrIPRWC~S(=`VTABkU}NSPXc^AZ7>bu9;0BhVw1Uz7ht{HjcRpJnG&6m zIte|YCOiZkz9M&m?-h1p4WP!uvW0uBC^@j)S*ZdJB13o~9gRdHd4k6Y6LCxI0+1^x zqG?3-2VRtzU2cab7}6-Y5cK;1)lgr+!`csEo*5w=&i77Fc)8VYx-|I75tvXY4yMm{ zHo*esuIzmA#ex@IrgKD`#ARybP2n%tEH*CggmA0?Z-KT#{{(~YRG>g%IL-FqBh1V9-<-Vz$VWVygv!CN`NPNF zVSI9HoR0{{Ea{E$!z5_b26VfyV>r!+05auIXI}?(Y|um zqllh_Zv14fDL(fww~ntojcuBpCH!n~%JZv9%EC3D8yEF+Za$%YU^GLI5ISwr^w4zCGZB^IsmtrD3%M)eh3`p=RjHBRDn#&~(1->yLh(YXeR z8qbWqTJGk(GImn8Q7va9gl%hZq~LatU|Hka{W#;l;2_xt6NuXcQ$?R}VS!{fkDDRf zu_ka$*}wWKC6Tf9p8H{u?!-gOaVS3~*yKnBVVrEQ!pFtgbt5(V4r%uFcBkAuQOQn8 zsvDVbmL09x_btliHOCv(+-P@_h-P5J;&b~v3iMI9OnpfSXSv4J0a_`Ieb+g$^wTOD zpG)<*KPi)BemewafluY<^Z_cXnH*oJp%6`V2{A}QuqL*sk&DrPN3@V~vxLd31KZ=5 ztFCGfD)KQ6l4ccX_Gv_umYmg|ShIyLSr!+<;sL*$Z|+-t6g8_3{yp_A!yEuO3D5@64KM1Nr2Y@P5^uX&<8N4AIbu_3t$nzN&q{+Ljb!0UIN$$ z&;-x|&;if~aFfU|Hv`NDNCj99U<23yPz~@Xz^?(`1ULrJ0`M1rK7c47rDFgL087c{ zaNw^a!oYl%WMJ~|Gcf(jff!z6@P*y?8w2x;afYkX6j+Lit@%2(Ot;R;>a3fJSY2LO zzExLXFDucN+spE-6&15W{p01?trphmAEujD!N5Nzxr{5$*OiuGKGr<+1wTtEdK46u z=IhLx*}}3?63DTZwZ&G5f;tAKPAMlLvmk^a@4j?p<-LH~dr>(%t9xX-D*WQ!^&n^iaGMU!0$P!xVS72 z)7rUGwy4Cav)b)tb{)fnLFX=8v?L>g`rs>*v2gJMzgH$@i79E};sKwfb7Nv>hlM7U z>MZ5u#YK4*wg`qyp`}7sVu4|40e_aYmXxzN6pPC&FeD4Dx@4WV?Bb%ec8h(pt_bRE zw_Eer;?1){&Bazrg%t*NDQn4NNeaK*Z>i8#aOLG?b_lUrN^}K)d`X$z3VFa|35hd{ zVoULh4GX}=|QE3rd zWGOCsfMg%K4CBK$f+$%brEV>^4&HT}%Q(9~uCsItSsg?zDXUB8` zb1Bf}S&ECXFlZ^n>Gr&`l5+Ct&bTA5*nX?7fGf=-ZA$R83?Nln!P>bz7Ag<_NMK5F zvB^?I>yGul3+qij@6s}EU7@a`+>&P{%>@I%QXJ4={_S<=p!V|B-AX%e=`z~hY#|_B zR+?v>b>r>f#VrQQz?=}jfdcZS@VnwLoGT@>P9O?}R!cd>7USK0ojPtTDjU>q1L@`t znXZD(zfQV2n68|I+HWYbvz(=Ppo6d{Nkoh{d&vA(mzCnQeFroY&fa8V_2qwOd|W->;0Uy0t>>CvQ+xWp&~Fll@yiYLR5tPjl-QQq85(!0C;SV1_Xj z<=M+B$_iLrRuQRXa&)w>Jr>bP595VG>{+vBG4o)3UT24@m0BPISGvBmY-8zkm@T`=cANPB9!?Q|y{;A*d!+y^@{GNCEJ@4{+e#GxN z*x`84QRRRIS@EFb!R?OlpdeV0Yieo$p_mwl*-;Ct>x^6C%-IfDZ(&h3oAK(6Zib`Q z0jU^RmJ16DRjQCp<>ed8%LCTqfBjIm+~B_%zQ3!(uKr5{O6huk)z|n7j8WzHC%eHv z|Mc7a{^U3K=S{2oXE*=qJMjHR>pM{I!9Fs=FgmKXJF9CR{7J2=j(^Dg(}#EL-1W$#k3Igg-A_FE z^QV6C^fS-ydG7faUVQ17dw=!omtXnKtG|8icmMwT*WcK;|G>dF-}=Mb@4Q>zaH#R{ zADfzw96fgY#Gg){I(_E7v*+Ib;KP=WK0bfp&!2qSdhxT*+y3K=FNOBMcsl<2)z_Vu z{&u?8E8l+C_kF+k4>LqVGdwrM5dE|3|IaS}znmc*I{be``=_NPl$0dkt^vd3 z!*8a}1V0@v*%k#9;x;s^0cgwvsXxd+1C70tMsyrqfe%?QsR-pNv?&(w3rU# zV?2z5;S4bO(jH4TuwrE!Ggv|xqkm?F)xKn{4S0Zs0~9mvctF@9O9h*hhg_w(teh(+ ze)OGY!|L``7A+z;LD7H#AOiRRT8JHKAE+|a92x-H0h$9^ z1sVt12$~973>yx9$x9Y5$y^r2%mSVl-@W@uv(}Pqz`rD)xGSNo&A?TZEG;Wz>FSvF z53H#fRd;T6UQ*G6*0`SPh2}LN*kejPIA5P7a|M+;YS9A|6yuic&%Ufx6=$v zKLR}0gL_VT#_)&y;uX#@FvW8W*TrL$J}~_Bpzw=>!cPneU!Q33)%ET~!;s~4{^9BpS$4tct+oM{q#RyeEsl0n+NLF;rHA!DBd$m2f|)nI&^zja{|lr z&u91w12cKW(BZidW*HP-KPdkLs{+IQ`!#K~fmyx!`t?0%8#+C@$BM6?{^aKCr~jnt z`r+?x4-6mNpRYf5{q&~Y*AH*obA9|*yc8Hd`1_o)mxkjn_m_qt%enCC_3`LEbp3k% z{Fs4RdBs;0GX^)YTbXPA{&lwUkDaY7l`XKATJ09rnoM`hl39DPaf7uK){G_yWAPLs z8Mn*5ClRH}Y)cWFT4v8EDqUA>r7I-!7?VuSOr&VAO#W7pVP*X?O|z8d7X$t94d!Yp z%jb%%sYS)s#g-B)#QvBu;%P{LNeLueR8$JZ&%+e3^xIjk92ff}rW3KJIVYEK z*cv~gaq_7rv@GU=HCVQ}+{(NQlufafy$aF0mCL-lc)k|=H7TF7+o6@co@vU=(n6AR zzHw6?5L=KKGA9QVla+wWkij3w7gnTL*K+IDS?y-1E_U6QGKoeZTVODnFz{WCCaQnHz0!m(wR7)|)x z3fN>>ii`5em;nli`H^y&-&x8$e3MR7?!jl@iAy5B5frDpm8$DSS94&vLg7tD#$p6C+11TQnom= zbR$ry%&!OrORcm!R(UaydZ(IxCG`7+o_*Z!9X>q3dA=;Qn5!tnyytTT1y(zZ?Jwku zl1-L!T21JQ$qHXvEGzRi5F_}Yl3vifj$tYos4O62tz+n=1UwWSi0{h z?`2Y>4Cr;>Xqe>UvI=Q-U>>5QMZ!OcdD5>oOE|WiV@VwYVr4VI_~rS1^P8nv4hv0U zG8mXd$}M)QueMo%K7e%#;^^1^Sr&T{9#kYT_ZgQiHZB6bAio%xrc%XH7}sPlGw;(h z`AZ7u`*isLmxA?!ncX}0B(YG?T8_0=Bwc%b{MYZF|ErHq^0_j9kp}J6aq(W!)lv_E z;qo64w}1Wq_x~1uVR-9z6&(Ofw8XZ(UBWe3itmtcu9DpCQn*tJua@$`3wJ1r z^R)E7N5ba?sk~oG{`)2TPDY z4f*@0qWy#YhCXzl;X`kV|8w#FA%FkBj{)iT|M*ZS91V1sT&a2i7OXYfH*cRJ`M>lj zb@#kT-KuABmj}3$tq$Vuh4>B6fBd{|hS{{=c-6-`X7$ImkMFuV{@IpKTCXt7om*+j;=j^8yJRW+ziRH@F+S-B zeU~v;-mmz-)jRfSCX@ z0HOeN0FeL@0O0^y05yOTp!aXkCji3VX#7@iTL4Z290vFUz-s_606Yuu6u=IEEdb>J z!;}Mkj(s`{+Z6izp6yam*0E!Tgn@oTl%*ME9r78Ow%B zdP6^R%0HI=G}KEwiH>WppZ_y{w$*IT({S?yAo4&Zqz~lq01X$K( zxN7|TA5cpJ1QY-O00;n%2(41s4y*KwnE(I)CIJ8y0001UWps6LbZ>8Lb1!FgX)QK1 zE@gOS?7e$hii(PgjUra8G&u*b z0w$h`&15^3wzk#Qw$|$Ft<_g+xhf_Ea)EFOiriG4f*KM!8Pw8#TC95P!Huy75Nm?a|e?IAd{3LVngY*ovq|@{Embvi! z@%`oVuzUixvJy$U=W&}f;!So#BCb=KAZ4bcOVWq%GGD~C<-<>o=(0tMhf^fUjz3c0 zQ(9mVgCvrx5`_|vAHMesO14~!G%0!T=2#?0#{XiF|EGVQlC(VK?8%e0dlzf)Jo!N! zAnd!Xe;yY=Gr8iPyS2Mv{?8Y6N*BQ2-v0S~@PD$%CVg=^7KAYwhV@wn=BuB)KxCvo zLSLmUc#ix*KHvXAPygS){|o=r@NBn34bOMysA0{Wr-qlfUCK=5Cgo<;_{J4vpQ=Wy z>8TH}lWTDDj=ZjRw@3Wx7B%v)sg}3!GMHCSm*-%x{M#mJyc(Hh39`-_bJ@M}*ea}F zkym70Saoc+ZZn%==T#jWue)lxmJRi@rnhFRY%@E}e+o6I*8TZiP1f0}*%(XlbU`88 zg{rv`UIX5PwZ-O=RZwVfQlZO5A(hQ{t18pnWhz_Zp4DU>-&AaoR5sh~3$P~D*x*v` zRPIn_H?}4IVSn>(QLDe11B*aq_ICzDe$NIq9CDXY%pR3B$ScxSc0AOo4Oy<5^;O3% z)@@Bbb9S90)T$p+BOy1EieTgkw=V^sez#AJ%ybt3XlmH+cJb?TfkG^C7f5o=>kkbIQQ*(+`Z%ajH6ZC{4 z^;lB1*bor-Ai&lP)#IG-{n?U4)43W~E`K5e0egz_#RexORAK^qUs;83Dr-?$4_}*! z!Df{`AqLFT#vKSTd)8fr@6{V{WbbNB8t=2?7Y;XdHOLOA>_nu@K?nxj;N3u{J*LWz zD&eJ)ye<>as>Jh!8qVYQLUT3sno}O@mmp<^1<-_-QKa4}ugHg2U+AEAyH8%Xg%^s< z_L7<}w1BVb6e41CY!8IS>%)9q%@%!-rydgJr|Nx|9`v)0cC*IR1_xO)qS{v8mX3(l z?J=>+=Y6%4Rlwsv_RI20B1==Mq?jdApu7YoqA3u*tO*O93&8U?a|n#wzhTF-?<@b^tz~0f%AKCe^g+gIV@t<1A85tLE_RFr8O?1e6=+4YE(_L-zRi=ODg! zK&q!6M|6)G3Az{fBiGFH>?Z&;z?%j0AeZSp zv=32sHsl2aTM&f0RV?7cX)VN`f)Y<_31BXJ-_r`OlMv-BRP?od)Zt0|xE-<0`PwJ= zQ0MRp8v=&-(<2f7Af$ISGJr#6L3f$4$qd_n2ep{ayY?ZX1+n?32yWBqPgMJNQSF6^ zYDb-=+K}k*!1%T^M%EK5gT%cgD; z8IQakFdHDrZ*32Hw=DT8P`(LRCl$#Yq zh*>E_0M};s62Jl^NbHCo$xyKT7|{=9l>{C3w3^Q2dy?r=fmo;!f7Zo_P6evBVPT#; zR;ntTtmRP2CddvH%e#J2tcj)q%2G+s4k*j)Q$EIlz@p)6OlJ4MYxtTpz6&H!w%h12 z_3?b0RZvKvV$KsE#V2+;Kp82vMvqwp)hd9efD#B)_#bYRhWMB_AhEnfjl7eE>1;Ef zQQMbYH8-i|deytDQkGYwgz7cN)C|owHCvB1rASCIDO1Gx=to#JN>|)Hh!*ff0Q^>h zB%Ud3VfHeJ2rCYGh5cFx)hb!oe>Y~i6shR3J?f?wCW0^}e8Xe|Vm1Xi&NK=hw2gazzAqz}FkNy?S20zeknrj6u zX?6s>`!Q|lIC*S{y-4Kr&O1lR`v4qx*kjDscK z&%I(IgKQ&T2$^VnW5Y_=#(3t3PvYRTaOH$)23fqrOmtXfVuF$VAi5&^31`qcMtoN8 zQtrI#_GAL6GUxrHEfUMV3w{-%k%g>dhW)gOhLbwE(^X%}n^8cDBNk)qqbt0ZYk@pit?l^0a%6O5_ zB*gD~+zU7&^YX51@_cg5?}$8Y<6ljHOg*M{fzfjs@U9$I_9nIAm^~P=H=l2jjL*iZ z5A2u~unq+*&z_iJkz%HLy^V6P5kMu(4%>?$ z3%8w%aM`o-p?i?k4Wa^wTj4RIG4bn(l-PNJNK9Kb5>aZgrxnm`6tt#>hgwu)eSvB; z0J_I48i;rH^^iOECH5iW91NLCBC0h2M0yV!~?LMG39JdleM6Zej zb94Aq&|~E_59GlEW;z|JJUIL|MQNFz9=XtW4zbOfx?&v^Z-he(s%|-*%{QmpBQVG@zP%M?@H5GXT z$KxU+f$(Z?#yGt9xP3xC=6}BcM{PIG?WiJ%(3~7pd7Nu4lXr~=Bn!HIVL*t+-ahpI zH+OD=egXOij2=hDjq-{efz_7yzkvKkJ4E{`&QZJf7@wwTslogPHJk&&b}4HK7#&vy z8ltIsk$6di7ps;#ckbNf%hhl$VpYIw)xRqRcrt2pRkI;rw&-1r@>rjQnc#n*`j|9Y zk}3-@fA|KFFmA|!av(U}up9n5pgcS{{B^=#kG?zh)LfEpRk<-2{-6Z>h$0Z!jXzWf zo*aKV@ux@M-dUC9mZCEODbL*hAlp-#S+BWa3cJ>)X_M-J{ngrX<Wo((>Z^Wn=!;r+uBOLd?^hdm4&~B*5|6rBis1>%`s+ zW8*PHM1~ykD%VWKWs3c=Zc;rvV6Jm2O1c`-v<#T7+FZyII}H7ERg6fUpzsZOFybyu zsQenbpQE(A z%+|d-Xl(}?7o5-@C~v%$4b4$maSl@*s&$5=OR>sYmb^l-8XcYL(>TzcO##+Q*d2Wa zq#{~NrAz@{1qtmu4BhLe00=&YGBikYlY-%(+f|CP=6V(6X`V8PauzlU{U8W=@@~5M z7NMAdbZC52fSmVbNpRk$Y2h3L+0e72lpSN6!ZY0qRPS*uBj`P%%R%pYOR_KqNhfNzEb&!`j-Q_cM|7-J&-HQqb1`XlO%#%y@RFkw+{s2j;aZ zwZl}@IFDe3!?k-+McX?GGXd;&v_cH8vrfHO%bq%0OP@Mf2YzuhW>X^%pzc;UMBk=* z4`>$$VFV@yLE6gS7A$&#dM7{rYI4)t_|sIY%1&X+$Fb$%DnM|9>g}!w!boW2f^2KN z0vv;dKkqHPh2KtvVNkR(HUAT}=vf+zh1a3BfqWHnweia#SL|Y{OU>Vpxu~K^l&iNc zxwkHxQajY`sgM2|a&N~|W^fC>VS>qc}Ye0@ZF2sJ79Y%4mN>F#Tdv|~}l#be0I$<}2fhUxX z+JTxX(AuE8uyn$9ifvXg7KCzK8j}JP3j&NSxlssTyJLH;UY?Z(l6fe>>NBP-8iAu+zDEb} z?6-q}DX+B6GCCZwn^9wMd3Nw~$$$ZBqp>Or@>-S+L&ohQ0S*MhE3c3wKieIH@>OX4 z^2;kn&jPaOs9NGKl(Z}?T3|ef;G9wj03XRuFcX3{5&c4F=D?5vZl#P$;8q`63E7no zA4#%x>?XCQRr?UU1pl7f>UN`R+ms+r2mgtqcWC zARv-1R{%orqgRl4Z)}+JALR>_0dx@2f2*WXflW+Vuit_!>N-$7 zuT{GnP*u`Dy*4s5eQxz)%0%2qG20U*qsb-PlFF*aw7PRpiP@v&K~Eor zFwgLkCBT7z{|qB8pF(==FE-;Ndj>rCGUymIbsN0zhw1Mp z6dGWh=_2YlM!f=2%h4vBAqM6YFeG@@&uz9Z%M#1mX|Aq-PyiOz;Mq)`6IbW8MlN@^o3J4CVd(P|gB!zV#Ee+&OJUs#AD zvFlc6reFy*FFCf*ScTMZ(4wR`w`X6`(`a&)f7h6Z%jr#qHY%Wv_i$8Tv|leKgTT0= zX<5MdbUR;t8IYjSI8(p8G)|28zfV99XI-4g`B?_#d=hiwMkl|cHz&iK=Kuj;&YzPp z|HB!pM`1!LB$&=w8)=jt1|6MODHN`O%J>prJTIZh-s4co{nO%6=@``vQ2=e*30&=3 z8f)SI#!M|!CCL|B;+`+B1UXq*ja#68xnxt2)uSl5mEU&|%Jm?w*6h=n_DMw-m*x13?y*Yd(@_4<@X(1jD}V zML&`s&nLs^oms57C+O{vAA1SstN0{_jXy!yc*G{jA(Si)uSFXHB#tb+Y-hmQY;Fhg zQHzMNtWv37DwS70*r87Xn%A9&H18Zh+CvcHuUt+vZ_pZHY2RWxcR@6pVN>Ed093Y( zzds!lulBJUZKdUx~D!i zH^3ftc@75h&7#Q*XF|7f*o^Oj-cKujB)V65h3Y+4k)?WjD$|s%5}QlE*zihPI`qoh zqfLknN9)&O=-Hc=KseP8<4|gCR?O|@Mrvtt#eWmPxMAXhxhe>-2jE$$!h9u@j0F8& z;?5!aBT9#y%V^K$mp_j#w?=7O#9E$EK+xI z9?D^Qc`!0@2bylmdjiJPlaijl8l3?6wS!^s!nTuWQ31wQ>>}ASY$aQ4xY!M%Vr)c! zWu0s;c4L9&Vh27z7=>J!)id%^a^o9Lv6KWaVz>o_TMe{R1q`-;NSeInCwU;??X4UQ zsw!^)B350VXC5+5qudRMIsyL5bEE;XLD%#=7^&SL85+OHfmN-TQtVt~y2D(Yt+JF_ zhiazCD;i=Bd0i|2>O!)U>b7)iEXB0OYpU6?EI4p42Wt+nV*%F5_WJ6gs2s5meRW&R z&AbLM!nn%RY&H8H{W{*C`N&c<5Fh)=1q13+x_k(#s8nT9Eh}IwCXg+;u`2-zPhF`b zT7qWIK{?sn2rcQu`7{_&qwoSfS0ulA6*pnY0svdi0s!q@C#&hz-)t9~I9*4j#3oKl zirDwsgHrE26n$U?E)KBmr7Vhjdw$jdkC}ef2@l%x!@WO#&r#DX@$3kA_v#A&J0PED z-$2ot%))%-AW15GR;co_3Tk65E_NZiqfPr1h_i~Z&Fm`9^93W>&u%kKxn_+dc+=o) z5|tJKxQe$~n}kN`3BmGu$XK}z4KyvFb&W+Ucj*K5vr4U@)~aF2t932r`VXM{9UPk6l>ApK8ETUDFGzG==XPboRc)vd`WZg*8VnNkhFA2IaW6 z(pPt}f_q~#-9G&BD-86!qEvMVSFmbtP0ztmakXKTh++W7D#$3Bj-CwYB+9#wq~TI%Tq5uXXx2Dpk!z+xzy}Q*J@?2@E`!A@hpJL=?I>~x zwKAipSPpH+5$GwALz5}y8aXtP0yk<88a=b*&=>S}n>O6&xmyl7>8)H2As>jUHYCX< zQoz{g2zb|P7prU*1omp@D)O2yGUfNA%E8ZozEy^VBY%B+PjoPpz|ky=I%wl+OzB~$ z=dcxquzN!RbPm>$yylzC0J}pf@pdb$X*KF>vcCb_fIK-4>;@Xwp`Aq4s_Y+=b(k!{H3gs|G`J|u0S8gK&7*Y&<#=QN_ybUk8ic1c!_7} z87&2nahn{|d{rA=iqYmPfys}jE9|Hoxd=C?)}>v3qZAQ=ia_BG( z{?FvlzbWvL9Qq>#7HIbxJ(Y6kd!P?Sk1mJWD0;D6vlA*>bsmCuquDaoUzDq*gR+Acd$T-+;F7U?=FqqsE}lYX?`q}9-9_mOKJM~h0_v4D2EoG#C5yD zrP=3(uZ*RHuS|?-bUw~B43&_PfSam_DRM;`KC&t^O5@lRn@qEYbqs}HpO#iCzgN-| z8xHdaj~t3iEiH$zt%Q~I(0g{Ncl}aFpnEsM<`5NUP{kG25>^k>v(%xiqq)sgj4!%N zyhlsq>yP?@k+9@RQw6AY57u&s)@Rq<|m)DCrPE+7r8J^*XB`!L9M zk?93SPth`~Vr{Oqs^;d{cJ%haDwOvCYt8&d)ojG}(_viwvVm3=M6vWLZ-E@jq4SV#r|#30IFLng0F~;~=t{Kgd?m8(4zkQ_;}7E=C{Ta0)S@g38U*W( zr7G+GE{R16y43RH5{)Jhfm3RE7v@K5#mmMC++XZRA0&|1ghj9kEn~Qg{W4MS_x-^1 zT;_I#o%GaKe~q>jZH(XB2?7MmE`_SOgX#g1NJVwuQ%}&3^!Dh(AjbsE@s%q%N0s*? z-9eLs)?8o@*H0m&!Qt^2&2-O_Yi8gW;bdNd1LvqrLkzqK=BsOiMa#jLe9{>}cv54z z5SyY=7FUeJG$Qw$iF|ZkzUKDlcSCv>uv_S=FUU3m%XRS&x=oWJZ~%fByNeI)A$)ac z!{OJ~uRsC+I~0Jb{hs=ydGKs;lPf8OTN9H7iyHgd!)p2o@3qT+yFFpe~JQ)zmBWp;eDsF4G68 zMso^9MX!hCsUC{Iv^V}cIeI0=-vgWzpFncY!zU2hvG@eaIvk&i<&ca|;CE^8L=H8Z z(AFof*h2h@_gsN~kKQJ29BqNqJ|&2feCqe62?GUC`=%U{Ln&mRPR=mudzy*pGeFCs zw-@LmN|;W|5(ttU`2$3ku1RSzq%bWM5lA_a zm)#{EGvIC39Vm`Il0y3Y?;I9j!foMf4b9|sDH9D!yDN)JY9Da~j7(E$Do)QR2|tnr z5ryzllmS0eFs2M*f&rs(7Kqu`Cl{`0WZCCJ1aRFY?w`n^08KTlWoTOtdCAFho=q(; z2w1;gD*>Y{%9De6M6JA=?`$kAstQ*4icOVdm zFwyp&O63QDD^=x%RcD4gz-*`cz~0F051~qEHhUYFgaA>-%z@Wf8UTaw3Nsb&{$y zh)j|KvVtQ3Q~Arh&;LspF46nt zS{%|6GD-jTU!wUd)v!liQE&95=vbRCmTvS|bsGd7YGg(n*2!^L?PhUSEC;t0CSzW; z*@|u-in&2WtAc5jpSS@{+1bNV(M{3yFI2%|R>+U0n&rY&1FC1`qyT%Qpp=yt_L=~C z_iAfe^@;p~l(X(@TxAja8dj!^7F)NV4`$nYB=V)H{-y(P2TCrW)u93NSoIVZ%i53p z4Xu?Ri{w}YZ^CD<^JbapY<^4VE{+tzo_)Yopml!gQ6Wuu5vD>SWW*=ukd%O-SwVEV zi^~aAEo;Pgm#3AlhSD(?vK(#~(ut_Q@BL+3GU6Sj=ixR9_hmE^;=^J`(sbs&g_csb z+jN?5ip8&*&Trl%yI)q#KHU*fQ+Us1m~|_}uEAPps#m>9Tn9(y_Os~kpk+rvI9b<) zGWwnX>rvSe?#mP19vOrVgTlO7DCp={hkJwO_Si()VdlnV*x}g&^Pp-u@AMB{dW{VQ zWJdt5y7LP}kpOG=M|=)%hL&&E2dvwTo{K7uM3jR@Pwt}BRiK|cKgBW_cT`W$itp!8dk(l;m4hf;d)K8zo1;`!(JC9W|}U*PK+mC-wT|#+Tsi^+ABvt+T_> zMO#e-gNm}*7Vhfn`^9RFsR0zX3MjV1x_cd=_)8oLg`hYJP<*F&zth+K4^W)lSJ~4= zh5mi!w#!Oy4IN5A!%jTvaF6SCC|`u_*)*~FPUmKK~-+!#Ly*| zK<0fQf?+Po+NJ;{&foZFN$TXLI2S& zVRmDGUj!FZ@^Iq!xUExD^sBm+JO`SyuV6*_59idF%P!)h(E*sWJ~qufEwYUop+*?(`c&sPu_MjFRcSg{NFPienV zvm=8zM_yB&H>lD{dq*IuLz92^N)oWhdNS4~_JOpx%{dsp$DP;b_v2@WOFUnQDZu_O z_n35M!`Nner@fwQk>tqZD7ut?3xm7NLNmc7?WfnWp}cE4%)}hFjo0lm&E=4Or-jCu z(-d8<7^f}zP+o-81DNVW;GceI+#MTLQq!dmgG?zfk0V90BKx~>J5goMJgQ~r0jPNO zEvpp>xh%=A-@j2YK~4PA5_R?JSQ>`Jw!OB-c8>ab`q zxv*llzltea`4aR{G0sDW?Htv6YRL!j9qugZL8|F|=~V$69uWBa%*JK1JlbF14;ihk zDueEs6Z2k`q=Dl^1V%02vraghP0J)h#c-ZCLXslajp2M)V$*F{2V(sR)e7>*MK|q7 z)5DTeurO?_DfY-}JPXMi$qk<9k<2HA4&&Z_p%&8o9jv6NEZzf8WA{vHIfW_*l^*67ESj2bZGX+4K&z`>^V5u5@#i zJnsiecv-Yx*-g7rcc}6k#{~M+n5yjW!8L1kEJ8EOUyj2lmpOo%s(49|?t(tQfdTRmGEsnB4xJzncF3V4VjGa{ zLFblnN}Ut}*$C}glIqWVc#sElt)bcw~>YmqO1KrK(5*(GeHKY1#Na0bs|E8krxNmYdxYeT9EXKRB*=E?`fQ9yLUnS+BkA~rala$}u^%ByAr z)UHP{%RJ0-Nu33t%AYz}8z0X)smVGSJ^2zv^9B};Tw_taO$&3HN?`E+8&rq2=!6!_ zZL%T;PT+sWDB3I-Fkc`Ty$M=;f)D;c!0XQ+e7G;vPCBc?jw!5@_v{hgQj`4hihW9G ziFJ%V7M8Y?Jg8Jwi}Y-|ywY~-geIieNZ1JP-f5P~vnd=@$);GDActX)}c zqp5BIfQe4FwIw3SktBMXpn<4&P~Z5iSH>MeQFwQNI#ElLnjJZW3+JW(LOFNL;%|l8 zFpHe#XNvP#v-qw`DSm*=SmG{|GzAYD!n9%qexYL&h*OHVM+;P@@Q^3~;zH0}hW4*n zs9MYcouLNmij7Zf#em{&`&Ot7^lH?@u-bopi1xe=P%ZY`4+Dj^WYe$>VJ~gs5M~Tcx zRpgb8{_q_(_;bKt*4(470Y&;T9y`iERc9M3(AYR+(T}K+$QY<;4fe6lR#a;N>{g8f zm~!?##6JIzDm#tL%3ZzNhYKj?FbmjlhCw&n{DLH{#p-bzdYXkc7a?UqZHieBtJ&LF z@qL}&eRC6xr3;UD-5fh#UU7>BP`lpmUB76UlD|E`>aUFiZ41!<yscKyE%&-e=r~9L1!T0 z?o0<9StBe})WzJnzfe@&`+CZi5vRbsPs`Q+?&`@j-_Z_S$ z+Tf~m7sf!*+G-rBSXxuHKsuNVbA7;QOu5`GG1o&)-uEl$)Gf`Br;Yz+r%C1ooWuT}An`Mw=uh-9o#5?BxPx8| zd{7&r8mn+qO2T6>PotA*>}RV{+2q|l#4i6T98Ym*ykjzf5o&(qAfr1CtEmrz1>B5B z0U4e8YtiidtIt|G}$SB%C+qOzt`wSO57^I$9_& zRQQ~VGpguW+V+8I8WVROLjCu|X?gpsn8ZH&7WG<;g?qcP ztW`D#9_d<@3vc18v;5(?j+ixkr$db_%K9%;<*$ zdv;YDdZW#M5Jq;)BX}0rdQe$|T&*j#R%g0ZF6Ht+U@-{4MZ;Rt;j9^)vrepH(OfxZ?7uKHW-8$znNjc;vQ08Bu$ zzn<}Jww8s4fst!P-`0x0trdM+OMSaDOO4!|6NoH1XroTaE7Oq3%|$cG`V<_ugCwgT zMIua64)CAriAeghR{p65>3+7t6FoSw&gC1f?|W#k2mbjXTh+&p2eRaZ~1B zVdhT5V(KH~FQ6%{---K3ZQ3Ay@>|nH`|-p#cH)}Ip(5tQ37Pe=^(2dLyw%aL?6}C$l*oEe{V8njQKLH_*+n0_|%Qwj@{WEgr zD&de?3*5+Dk6B`$iLBMf5lxm3hirBJ5u>NqhAgfNdNX~BYGbvD%YNxdwR~G$Xaw?3 z%vF#Nxk#;yeF7_d_#W(lWa_yfb7$-k{j~F;&`&iy=Gbo0J<*BABhdMLbU->6M&O?x zVCIiBJe(nld&%u*cUr5#eBx2J;({!^^T+z52ZA_NVa+xuk+~B z6_Gnd2OmVa8CC*twCcpD+60HIb`5yX8}MGx?>(Z-65GRS#7Xj3QCTOlpd3)SFiVO> zH5LPmz*5Q_NpW-t&7y;jUX8u(G^%hcEM!MRt&JR#j8?PLZ%OY5q~GG`2c&q<8}MGx z?>!mF!9N7jZ^`%pkQ6r%NWZ0a4xwj5vJGo5mQZl~rv_PW(7Qvs7?0MmP5h6*0ZJip zYye&+(w6TOJW~^~Kl>r>Vr_@jc$_F-W0FlP?n51=mUbs(o*zRAEw5MR8N^#D{b_uS z<*z2y`}DUc_(WJe5k==8psW05I@7XSWcc_{lGL(&tB_iH?U&}njn7C@8;Gdp#I?`R zSq2ELekOiSk7du@h30!x%Ql^uZe-7d2$S4&&4XgkbKvoYi2a7YBQ>pl4%%;4MkB&E zS7Vnj)Kra|B*jhD-S~jamu;uat9prRK6Qy1f*4D2YUPA}h#qB9dU$QUFf`z{p8c;M zVkL$c1sV*VgPzBt#GZp{$@>BEIsduY zYe{lM)Es`%mZT}7bwQrXy@D|vAPL~E8(`AZC}y6ainqz)ZI*a*iMM&;ZLoM-Al_`^ zZLxUkqV6%GY83IMhvjq>Y4%?!%+i-X3j`ag~H;8G+^=>z&pV z^dSarbp;pGTR6bh%}=OX2WTRPhPQ=|Hv8FC=nQ6?b~Ep@YTNK z4&%BCx$BTj_#@X^VnZ;tR>X!WmTgk$sQFBHVK8o#V9HR^S`{0CCG=KMWrenSuz<{Q z!wUWGSwg`miz^tO`q)U2W!wuUYy|aVR@|;r7S~~L%XUtHJ<#93pJc+EgfD+sO%M!# zYA;{$scEtqd1`rQSHolaaQ?~XD0tvG1=?BwdHOOG!y0^AHeXL^WbXRRV|F!Iv=QM) z99<1LawtrTzc|PE^t2kbhG*ol;yg$*I=(epQo_Y~uaIN;#oV*5*BKpX>cn+@j_8>n z=H5SqHaSQPYRBD&V%imvL#T_eeB2Gme;`MVOt(NItk`X~c)tx7JC=>`vyD)E-8iHp zv0IE*7eElb3ca&Wo7x29^l9xJ5TjMr1RSaUD|DWXJN~xLQmt9*V`+e(dCkyI#o^M1 zdv>s`plqjbCmxakM3qC|(#GtJoI04aT1#x$yOy|8RRCGpMqW%!dr!$V8zHB>0*zO+ zD%kwKT_9I~zkLwT=eu2WrBy*Na(Qh#RB_C+FTk3-4lNUHHT5~hiQyH8;YT(;K*1dE zT;wJiCVDJFCKplPOeKWLHl`Idp|~8nn-oG6n&r?RNe-Hp2g;K2?ohfM$Da9ToUd&G zwv&gh5Eo+&v{&+d`{@AGvHj?hh8m`)waI>{gH+=Qzo7;%fvR49mMmU7AlsS~NU=R< ztFVqL%zhbi@;?qnLkFzbo~aA3hREMyWX)ib86NwLV4Oh}2Ma$@sFP}bJC`m$OVt;X z!-9S2vuM@WiL@$k*;%sMFl%|E$X05tzn=M<9DL;2vhVzaM&UPq!coX^S?HFP+9Fs3 zC9A(f2TkWgzb0!5Qm#wMZ{$L?e4lECi41!2qy`!2a=@7Eze$+Z zg+M<)F3{hZIF}=4caWDRTpJ#re>&Z#k1?hNH^5|rz>o9HUjW)D_E7$a8>dNkV$gxw z$hCR=d)i!~b7ITTpc1yf|0UT!H_%r7KHVNE&Woku`HH0bNCxhC^OVrd5rM z?m-vDzjRUmj(&k{Y~@eVE2PeFa6=?*r=(A?I=*3JuSF?I!|H#F8u>*K9l%Y|?%igK z7~>=vEHb8;%)is7zIe8?nn^wh$>m0gazp=5%QXVCe=mauHZ^7_1Z{K$}6ear=7!Y$O1{cB7-Ro>w1v1D`W*t$_QLi{7>SE>ru`=ldYW{VaNE*-wWe9;%}oIsw3&Y z7NxRax&0M7soY*PMH_-H-^ThJwV}hNS{o2wqjU*S;ok4lIQ*4Mg(xENQrS-4o)cf9`w6q3gGa(E zeL?h9VJ`cVNPDVZ+OI^~B9XQrIW4C1XR&Xrlav~4<^5hO?U*eE)_vq|M=86|9UBYHcJ8HSqkEH@<;91Q^m8EW7Cp^VAMKLx zQiFqfh7u{Y^79)(TLm@40iACJYQ5Yz;n0Q|Co;8MjxLa) zyCIGL!mtF{^&x(?0uiG5ar}J(QNvC}FtLbb<2h~CPUjHpmQ9G`xER#(P2`#IICbB+ zr^O-cdIc1VD$0Y8$D2&(l${s0kFB++**-t|R|JS#Ic;?WN2|U`-ckVLj zo-vhKstf5vZN9NM&!$ggKG!st{kJ1D=d^M77&L7>KGLR1zGp0YD*xqin92S$80hPp zBnSPWw!fV*?$K8?ZQ;jwjEdh9L&O}T(hZLGwNH@9q00W?VyCa@mXBd^Hh3qK{^AhzKfW80@fb_mp2L-qR6{)+us{56efhw)T00I`G47L3`~ zM$QQ!@{GbY0;nKOodz7Y8C8$dblK)?tA$$lI&zJLBq+Qo@n5v{)B}9v);3}C0#Y<4 z0%3&zUMyXohA-113oKf(T7GDa*hk*N7h}(<;K8RnoSl*;s zVTdICd1z@u8<{=$d%H1p;*d5%>+_^$`}g~LExl**F95`N3GbMATonA{W~8MS+|WOx zUt*t(H{U&{lpPMR9>us9nb&84WlFO}c$)0cfIO!Jj13OYL7cZ-n74zz72{#*V1gKr z72(ykXkkdJv(~1mX0yD)gDG42-}cj_4jGt%?&0myMgj5or?2X?OG|~{bp3CbC%x$! zQ;Oj!DNh$(flJqq0rqJ2DsQ?@H!vNh_{~IqzR(?y+TDJt^EVBf}s0_!HBK1uU_(fjn{e~Z6?w6OVjqZpggeI zQ|}Lt*#=>9k?-fiBK&90;$Q1y*}vO~)bon~`$&ms?i9t_reA70-=hwrexhYH+aKI1 z)=zAl>HOY6x$3T+;<%)LE65Q$?1{Plq6yky)p{BN z=jq*vz#(*)EX1DzHUEU#4&1WQv%?>`-r{LRcg9JWr0IdQbe>ncoO%dU+?-86aSKu*ZX_;@MC^R3dNKCcJJE2wM9& zM4?Qlk1B7DPZX-QFk5pFUFXrBB`Q_qHUvBbP>M7^^q?s;NF|NFFX-z8y2@9$AtBne zH2dieSHRd*Bl-U7_#N%U2koQ&P3+!XAgS+N`uzTjp2DEwzo%98H`tNvy;bhy-0Uy2?qfEjq9)g=D=>o9Etro{`# z?|YbJ(tvW0P5M8ZddU+}N^-CyX< zmh8PY5xUzJkY@HF@sxI$RZ@9ok(lr|Cxn zs}lEV_1)E_vYb-Zg05yk>n62(N5In_nDD;FRaVvm$ts)3t91oAfE4D;1 zBh;m@24ZLdAqRd>)9)$zJxRYO==V7N9;4qL7k-mbfqG z4}mQLV5u@Wq|%m8UxjqEvo=-revH1ZNKE1xzdkL{Dq(q#euxoq^L_Xq^ibFgn{eoX zW(v@@Py48}q2bwqH`x;(Hl4v`pe1b7h82l&at$67#WsHvw#I&CIzvm5)%-%P>BdHW zI6g~Wf$=GBJ8K7LZSL*heFNdX86*09Ha``{!NNvk;xl+-*AIOH_5j!JShVClA>y^F za>+5kvs<^)o9^P}Ajhvh2dC+hXu{-p7cIi<%eK-rmUxV#VF_9FPz}AX$ezCyH&Ib? zz2PXyec7?sc*W*~12(^}H;8;{FwZ}V=RY_1`F0Q3Q~!a#ENu+4V+dgeiWzvfVC<)O z?_V1K4PZuWwrU*jSX2x^KDi~qHiY^?00)s}ec1=|Lq+yQkWVW^nE!l)V9r;K6CDe2 zho3Wu;csm^JAC|io8qTeUVem5uT0y7r&nS-`I1D!lOn-Q3E1tm1Nu~e?$dkmqDqh} zFF_~3YdX~KqXBPyATM=m4?fg?~s1msl61cn*5Z62?(!D&GSO z)mMV|j03s-I+e61eKP+Q05h(T-`8@6*`#4y+ANGkZ>QqYI)T^NMeHX*!3i{+wkyWh zW3Oddok2jEveF04SxTKI7y44VeA`ch+LS`dlSNNg*v9VdFI%+bN|#@DxU_7~4z`)L zxc+z!UEKI>H)6OPI!tFR?axB}*D_ltWKVNc$)UZtuhT4S@R6A)%GK5r(YIG@Mq|=Y z1R}t)WcjH^)A{%o0%bj%BEkiyWINZl|QkPcfB6w3+&*T^3*))%?bQb%Tn#XTREJ5nRhJisDx`F28{GrRC5#S7NY`&HSzsDowa`0N_hfuRWjqdot+G8)8&Y=tOV+66^)BE25jbCd) zgwN`v^#KUK2|c>^1=u%)j@xN?0aZ`pS43{i_LI#y^0wQRMu&_yiXK#+TZel5#;F;4 zX6-P=Y*O)m1Kt&$ioxn*<`7A$*iQ5kMF}kKXHEY6dH`Wk3%ZYLc>4zQf%XaUW)RGi zSY4*`eVxojms{~@XS@bAzfBNN^x`3c;9W*gTaLL`RuI-qD#;eIh%$9_kjqZ=Jg zr^q!QBziU;dPb$r*0)RKmC!k3V+x{xF3$}QQ;en*mHry&Z*Dl1UaOCt#%^vrb2pXd z|3x>y(F9Ij3qYT>t9wuVpsTp$A6*ae)TisvVVVv^)3=L&<|R5axnF0pKvK4dUaY6T zx$)QP<1Yi%t!PPJ>Ex!7-$DluaDCqd^|OZ6=zIN4{(8@j_8vbd0ttA}$6s#1ZmhvL|Rez%+_WFZ=^_=ji;)beA7d0HRB z2iGSL4O#&~KB~oU%Xz0g--rYAJPpi#m36B$Fcbd{(Z=Uv@&1eevwa5xlSczHk#Bsj z7sP=A)!ubtNPfY#@z30N_7aMA`SV~%@*!%58yjgcoqzc`IWA+R4~lQuKgBcLmwDAZy~Ya)IE1KB{VO_8X(W ztA=Un!|RY8(y23L%0_K69X*T1&g~zah0$6nc`|$%@Sf6B0et*Qig%}6W4B-flQG$} z=(h$VccZa0=>5E6q`YDfIcD+m@D3`_x*e*yRrMaN{7PXP@|!>kzM!P`LO1{J9n)Nc z)`oD70JYz=u=UZSq&Ne-pgNwiEWBQgX!)mAb{gu!R%FpiLsM@n+fbYOiZ$goLnAJK z?d0BiLClG(1k@1ovxM~vxyu0Mkjrb8YM8hglU0x)Q&ThZ= zYduY6RzI6#>;5w?lu~GiwT;@*3%T)`L$U5OoiEHs|BW8M7gULXehbTLjN9@d(Q z>t$asQo4X`XWQu3dpew2;}Z5QZ==?V(+&d=Wc5&CZx+*O`6;4i3n0JE@7=7Yu@g}| z4FX|-n#+C?fCYpW!duaQ1f+dL)kT-7ky~Lp_AJWi!)4X@9GFxiUw11`%;z*QxTiQV zJ~27GD%R`t-8U-A!fhu3_Oa3 zX&9oQSP`GiLq}h9MLdefwYKuhp#<<9yf^fu=0JbM39E(Os5DRYY~kbnh+PDF$bcR) zpofurT?zT^4Bx0(fF^o6_YXXHkHUJm1QoE5dlf>e=z2m2=2t|anl4LWL{hdnUmx=z5sZB4)FWDxZ}9kJxF$qLfT#cv>oWX zt^#d`KH1-TCPCXBewH0v6?Y2q>?>uRes(;_qLD=wM5Jjj8R*>m&z}o;wwcZq_u*Mo z%@Lk96w1Y}Fr7>0Vq&&^Rf2+V^@p>&S0egtl|$zWJd{IYD6mbgL4P`?&+{JD)9|)Z zw!qeX$6}bbS*5IL)DD5yKywL4th-F-h4&$Hclf=Z3u>giODH{0T@}aKM*$%g-8uvB zol9W$+ml6ro^JTC`1cNaz0R!*H)nT7OkZT zzjpz&1^v_=I55DHhV~yPJh3@`bo>r<5E^gtHfe5{A_M`5Mju7sWut}h7$DdcM5(i6 zP8?JP0cnd0TkPcFatrtOj#kCINb~W~)a4493iV%O`iHUxn(WzmjBZ!{~Wd4j!jP0TC1}dFF{AS<>(Ad~0o`g!SZ@F5195>`E z{=LeD8&-L?3^~uA;Zv&{kTe1q->B75%(2QxN$JNYSa7XIbHQ;pZ^?vx^@_qnBjn!u_DGMVsaqHDPoSi zk*JAq2AN|L&g4PH@BT^|Ti+0<0x<_f%t{e631T`#%!?uhICA!fBIdUurVwJ96(Yno7i17JItMB60n- zc*mj-iqFo9ew|@}XS{ZHxbJ#38SYjwmP)N9kTjSFaCip6Sf(VJjQtx1Ytw)7|DjLu zAqyELKEO9+y?(Qppj#5(-ur5KpZm{%&+u(d`V8NDeV^Y8T6f_0_lV7l5AZd|z(cIc`^(0!ta#lpcg&4hD1dX%NiAV4gmizI+QZ%ogNZ3I6$~ zMEOw(5$6zc(3l}UtsVbkS-Gm*qROoxY>U>D&sLSAGK4N}g`f`h;1^*~bj{@#z0zkJ zZZTuGFgj)HcTdI75}?(2&g~=@7Gm}xrgOw?wCj=1TKJ_C?b}9z4idbcW$y@YkE zVy^r5m~J{%dvAj6vy&(MGEi4l(Cy*?9#MRD9l0$4@)V7E`xSJ) zqSIoLY;!((B!p)re17E66XX)${BVAJ!{Xjs$OlypRg!h)|7-6};G#ORh4JbIXqu%P z1qIhm#KeTCxFplq8oQ;5jW&h|D#>I4p%EfNr@2=#aX}jr@yd)zoGgFag>ovJ!@s#$hz zrI$fppaBlJ>cR@Cp0^3JnD;fzyFBRarrv|Nw~={|40>Nry_K2FJMcDcs2>CO;Y>-R za0P^Jn@dA03CDP_9dFZnY??pdG80zd=hm}3gJGxEQ+<2w>zSx)q1$#`xD#W%_%;>J zI=Y^gRDSerc1^SPj4%;%8K)d^F?FQuO$G7JIO{+83I^G7*^+camOGibzc z)0VFj0yjdcr8K*P!f1Ko+w9KCFr|g>=?nt@TeyEOc`)}k&^syYp~fNW@jX56VRlOU zv+!{82o0e=66QteVfJJqKPsg6Woma4`g~a9j*42^yXXEYZKoRqu;GR?l8~|GB## z*>1iJcQt27pJYk0JpTc_itx3d&#DtiR_z(_TKU!IdaSM;&(amQi?pF?6?`=_+Tp*T zU9=bePhPsyv2q0Ja7-PeWY*uQai~uK_oH-&FJ{m?H}dGMNUY!#=#|Ny0Y*R5CcVqw zYCvMLuS`Knovjjk4FaE~5X1Zjw1IGZr$P*8{*b+CMGo%x_%CSKs|$#R>9-RZZsIU} z$wDwV-ojQ2SgUPSLQJ(S4_y$Cz*Ua7@I@n3xOc%UCSqu@7lsOhP$FP4SA*g(S<-66 zam>3wCyui}IHhJpHv{mU;yBZw7b5MZt^56LseyiuvkfS2DqL5eu@)W2CoRyyTF~FP z+hN;R*~fpt;IN(dT`B5qd*%=DAJF4%x_&NYul-DuK}-T$rYYm&F-qW8hw0S|y7Rmm z9()@&u^^0I90>nw#BoxSzf~(3mf@y*^#Z6e@oL+}`9tK>~AFq}Ze?_%sLo07F> zj`dg09@kx@O`TbH2L{jz+Ox;IIlY8=VNj4H?AAqHkGt4?xGu+u_tA$8)Qi>F_r^42 z&}Zf;{Yvkoh1q}!N5%3n(^u15YrExJRJqkqp5VN6P(B&Pcmd&77z0l{4UDJL zChK~dy8EnU_!a=}gTg4Y04XqTAqw2?zeFV(V&%8j1~H@T!Q)|ElwrqOn#EIVd&=T3 zPlp`U^H>v8ZgVd$}EnVaRoB6#ad|j!lG$7kB zwPsUfGC49rY8OOYPN_jj*pf}z)!xO}sRD7k!W<9sdrDt##w#auGZSTN-dsleN6GeX z?muRu$UwXLp!H#)m)o{eh_PF*6$ewH|6;rYz}uy)gLBIUf@M+=@5uKqW2gP8DA_L# zrSkHojSrMhT31fSO|Np;x1U6dka>ZP5K zs_AzPZfVz+NOd!po$d%X^N6;cVlP+WGK}o9wflzItrZ&KN{Kqy*(vo{rOPq-5WM{# z{*-#Tpc{PY3zSrFj3|_AK;bYd(V?Y0wgHZs-HCM@Vp}?ZcKR!YcC-^7a zU5y$(u7*W%BCM^2Xs9qTiRv8*M8A0&LD-vT=v}TqOrw&Y5VvkX1T1g+$i1HoGW5fq zq(WJ|_jRMkJ%}$w74WRI#Vmy}xNVs<tq8@srC0gUS&G{IA7b) zIj9Fco48Ev7>{Q@9TcXTDhZ#nlQI9IG0{XEQ-5=$y!9Ep3Qz4x(9y>5=YviGi+J`} z|96M{s5r+&Gq&+z7`ST{!8}!Re~#>2l37W3X$s+j@ga)oQ7fd2Yo`Y~q&0BhsqSh3 zQZbud%FvQ2MAg@S*}D$*OnetbI+-!%3_ffgEe~18G}=3)9c`!)@69M$H{i-%d`NcH zhu!rQPQP|j{S$aBU8qcv2Ap%D2ruEv)KaHN`g81QDVOb-$&c5B&ZHYOrdrf`;J*** z!^VpJBqmH9EFI4)9c-XDL^oIsKb-}l1uV1iKaVo0RTLLZYlX{vn+Cx%_TPEeOo8(t}*uXfc>X_iZop6Hn^ z4DW)g@F-w0^hx@_a*IDq3nt*0qFZnmpVm`jWxpo7fw=1|P4-BmKR+53o9EFK0!JFZ z48zIRRd^8Pf%qQA+}$X{*U;oN7&O4YxGrL~IZVzAPU#eeW^I@DG(J(klaKz3l1q?+ zyd4kJv$c^Fw)?)|96JoBHH(8Ptlgpqwz$ced=*TB-(*t8iM}UdWY_$j(6WJh7*0`r z?&B=nKKqQEP7e|@z4264R#^Uh>WOlyTY3Yx)-$9l@M#TLFP^PiOsK?=^p#UO@2b1Q zVB2G==}j*!%t%xca$P7FWU4_0ZvMrIKv7im6Z{(JJLFJM++jQycbG=sR@tQ}^;Md{ zBN@^@x3rxL-5d;&xmn>t2?OLjDsZH1X!{lJw$I!Xl$40wMex)bg(aviB*^0L?m~J~ zY%d-r-&~1Pb%p_Q=$t&AO0RLDv<|+NVyZ#DGRt;Wut~L4Jum9q!2eRQk)0?FvmMr+ zC^tcGvE4tJzH7!_YR{C;v>|KcOj}IE>pG%_M5B^KTyA2@WGodv;4%wnovHjQeuUp` z-X%=xHUWk<<(7;rZ>B4|@llj%K1&y43J&5~<~j`uaV$&wi0PVG`zXJ~l$DC-&req2 z&Wp#@A#MC?Dtm!9uqPSY7Jd&?w;LazXb{F{m^Km*yyzF7WO(*b~~g-+{Ep=rl$OtdiSyo_rz-sQBrapL%!-t#0-{p6Xc>b zJuameKFpWWUDzxnPI}&tdpTQO%P6%jc!OyquZkz)kl_1b@<2sR!a;&?B;C6MXa~Th*-Zh@!LAnu9b*p%_ zEI!<0aaTU1D70*Wfp`*dh+jxuuvgB55j0?c2=XJB)UgE8b}^=+^M1~QN8>_42v-tp8I(DH{xXj%Gl;5Ns`LFr z|AhHW$=Se(D-e7u%tJAzL9VocH-dw3mz<)f!{bZ{G5~`>eNMrK%RrJ|xt)oNus3){ z%lD$)wrhSOxKxi%n;@E4Q_3Id=z<^|wR{CyP*qsH)2iuMXNF#p?DoB)RJs&EspvQH z97DD~j+1u-$^+87b63glKgbVU>Jl%LxBh0eqO@(K%ciSo5%gSJT2%+g-AucigBZ|b{kBP8oK$ItVL0(VdVVF}Upmdf;Ja5mUWS#(%l$%_S8gi;mY zm9y!!H2)U1Ta}12VKx)lIVj)%G8PHEaXWT7*Ctx!Z`CkGJj?M2)wEG>ZNszOpcIxf zIbVG}U{~8Ggx}v%_rq?GPSGbd8ZV+A(*5#A%KQj}?JHhM#%Te)P}F>PcKgc#GtRms@Z8(R%gjonC_xujS4%Pc#*m%Yu$q==<&aka|E z$V{mXCV%;yk2a*3WWD`zt*C9UvQbbRClB~-j|0o7--HMObwp=ljTbeqG`g1kM8}%V zh_K7Q&_KlAZkPd)T#nMYC!B6GJM_{m(W>rND>8v@>40Oi#?1CThEdU}$Z*ebNEa|y~X?^i;19_S#*%I`$HY5A3e zJrj|sLAHX<-Y)4Nr4ISi-!L{b8##-6LlbhN2?cp^69@rnR>!s@k?ZoFDSp!$UNh{M~PH=^glVUl+a*H+QJWp%gat z9+fGC@%n9)y>LqJ*3BSN!hWDR$6u*D`3G6jd1qaQ-VM}Kx7d(TU#QsLqk`ntOynZ> zVPUwk6*eDCq=I!uhjb_d8bcFEQWDNjfR2!`AegHETov%l@1d}8T|)k9%(#9Xp@N7@ zZl$v1yBsO|{09_kq7a#>+hN-)o{|noO(~5|U9+=}g_UYI&?wtc{JhykqjZG-P7UAS ztfK(~@sOU=c3^Q6Q1%P-X~m{RKR8f>;H!WW!k6$-Y}+C6W2f{dDjI4FpfpmfQz}Kd zT_F-OGu6I~+_SA2*K6C`Zr7n@#}c}DyO~<{EiuyRvdvDPtC?Y@Y;x=bS}p#Nl8*K- zHfw$FS?}oMs?X>n?7`PSb~;v?#ukw7f})#L7Q2ZGZGKM!d+{a&tCB1f z6F)>*Tp_6B;ox}ow8{^(#p|*3?rsb8;`k0J)LmFdbJSw|K#P&rN&a+HPwR|1*L9LV z6_#?@)86bHl8I~vOVS~JD$ERGmto*5g#DrNrs1?8!XRmeUdn=ga{#8UQL^DZ-;RA)*pYVjB6KM)ajNY z^A1k7(%he$Y`5{rc7pus13jPr-QV+MOQjWYzTK+Mw{+2Bm$J>Z?}`aj9azVd`$v2% zXh4czI~j%w`i6VA5gVFv@JyLq}%zohk8i_CdWKuW@n*}F<(<*0*CYw zUbRb>H{FjnO4Jh5t6IF+`)h%)zM@TYMV9Sz6RJ`oTP6^u>-aBvCQOZw$YtV|ILeIU zC4`z+kn*f08kcnarTcKUy67;i+2yibe-3OS;Q5V1+L>uPjh*OpUqzFg#qA)Unscm&wZx17;nnx*yP{? z$|Y1CefBssGhUoth1x~kY4ae)a$2!xU8qk$p7H>0?Oha#-Dzc~i7*hz@ie5R!Pndy zp*!K`yV68GMcGw&R8&6T7@SL?!tzSY}~d6lfN8y87V6U*CjUtwKf|dU8v?Y3vmMnTHRE$l2fSW4Zd)2;REU0YZRvOZKqI%z9(K+lq_J_ zrGu{eY_04%#;75_OJ9)JQb~oQsA4|lkV}`F>~*fV)}?HNl4P1P4l4=$Zoty)6l48+ z6}i-}9?syXdZLz9a};KH1T26nOeK$B#KCr-yo0&4y?8NrM^@FB!?e-}H_78)XH$8- zOCt~16ukR3+*LnQL&ue7x&CMm3&zi?G5judMcqjWPUrlxAwM>3(u=~gis{vU+sC3) zesp>0_&^y1K0f?u8LDa$EGhv4$^UaEi%%Kw@1=sc(M0G;P}3-w#L z3L72LF=SQ7;-rbX5R>HVmhm%n-7@ul#!F%TF9uJQR()HYt|54^zS23$upT(rO%Rq%UGw|OyQ}HZ_p{Z(S?7=7EuFF* zhkga7^;%Qya!lNIRCw39a?vQOV>5kLRjW8!6o+Z+K|C!>K7HIl=> zM{(%h&#a%JanzTbb*^xxMmonS!fZ7Fq>u(F2)Edd3t20S!Fam&UAWC!at@=U0qz=c zL`a-*7-t~FN$QBhBAkb)7-yW?Fvu^YIi%gbC-PEa~%1-A*cr<+jNt|2PfT#^YG2PafaTRAa=0>2W)S82bEbrm~|gz_)np zE~Ob}{>uKD_0D8Xwbdv_X8Lz%+ZbEd+V(a;C}4ZAfT$*A1C1O#iU}z|a=f_jrP7yE zj7mbx(Giq$}n(-#vIMKIx;eqkSg5z>YtyKP0ucGGfPxCI7> z;$dg?sSQM8UD4{10*;igkq}I^xbti~WvY>Jol6f+GgFSA(N&9vOx^Le*C>a7G+_4s zs9%~0$ohJNw?lUnM!ZSZw}^SHh6pEMV4P&yTBAW5R7t$7S**@84*x!-?LkyY)nMBu z8eE0jT)Ja{J3H5t4YKn8s9ga)U{Tykomx@g3YC=R|4}Di<~j~jN;wvY=aqH#{S07M z3g4ASzXwYMU|ZeNTa?3hq#c8+i2uiWBO2XpnXs4}36(vZ&rW({s3FNfO)|G~DqJ=9?W9bT0 zi|bNWvP-gR#z@HE^k!$LG&PwOxvApq{?EhU)UjM)=B-KJhh5x%)@hBX}g0R9+@6#fTe$mJcz|UTNP9f*d=xhiybHj zPBh_TMWIsjlg>CTsNlzm=M9I!rxF$X91A4Kf36BP!1gLknyIewe@xY*UPJvMzXz&% z!uF{J|3JYHf4|FJXHRt1xePNp9h@UmI7V^2UhTjo{QJA?>l4AHzCu%1^(5~3AEP-| zZOEwECm8CgHaj+&0};TXdz~xKBIBAX{~?yD(unU$10RWsV%qYB$(L}piP$5EXk4}^ zITuyx3c3vA54hQlJBQc-8XQBK@tCdJc2LMo*)NQnbj-nKK<$}vp&d@xd zUe?a1+eANw0cW zTswi_v&4fY;C>t0pc4sKO(5YodfK)L{o6(=C?s(*5QoyEBw&0SxwnAMA<0lh2FKgj z3@8+mT{&oF*wtmgK($<1lZ=~R>#H608OxyWQlXJ-D4$*E<1lUcx*z;^%Ix2*r|yUs zBo$q0L_dQX)*?ipy?-DIEM|dv4xpZL=7*>@6fd=0A!p84t9tN!q%))eIUcK)w5_9J ztu<6{fKx)(=Mc4o+_Yub}&tvrVHt_L}Nk|6>YA*QNV(G|LKbOvxG#%-fJV9jQfq6>8%&Y0!9WTjk z0@fPNeu3ZPq9NQ-eZU@w^q!OYlN8FF+QzoQvq&dwEr z0ho%Y?(wl!J61L&yH+@p-KJW63@4-JjHzxLaym6X2vt&4hO`6Os~02bQJfPiD@iWG zLr7GPPK0d0<@CESq_?5aVpNFOs(rAt)B8jpj}4@3r5GW@y;lA&q$1#ta4IPC7gWuFZFT*5&e0n)oJkOjB>M+GRy{QIq0U~lb zpsSc_U%_1uY1dGsJ={dIn`-cNX*5;~ix4!JY9G*0X7T=|bc^KV{8;}*{d}wcVi+uK z@yvDWDw+eUBI%SP1(q`w8n)R~iUhL4fpGmg#)mlR+* z`XOxrcOmEdf=B1lPi-f#poo?@greY(4#^Kia1EsA@r49liET(kDwbXrB4D$fntu<} zhUxwb_%ixMz3G9kDB7%a&onFSW$%xfBaOSNnUzqq((M+k7R281mX2lsY$HU5V(XpG zl%4Xl4ZO_rAgoSy+CE?U0bd;yM%h=s!e$@Z1?<(IFTK1Q*bQX{tE;egXW_(5$-NWk zq`D~1y0lR?H?&3=oN-pXT;LY3pc6#@9=ev>V6cP|3y=m%f;np1O*M}YcIplN{>~v# z7-w?!w+vy|48$9hgu_?RLFqd$?!Wa%ZBkS)_FPyN)td*X zOsXzQG+csaeHNBTZIke2RV?NnTFmomG515RdL!;;KADU=F0N%ea3<-Z6H(exmrbXC zcb&^ZwYlf{UB?uE{)bfUQtfVs>30pNS$LRi@%E_o`1%UQ6)`!sn&fI4sKMZr?C0ot zFUrUa!y?=1OtA+qIpM&rcVX#)|1GR!k85(- zLpt~d^eC7LOi}q^V1}us_KXlMR{}6n?3mY9=$0de;LLo!;UvXitpjm zgM2$R@w>(9oliUpO1$iF;7k^~^eMHuq;E5A2cRV$Derth(6Isd$~=Z|TVGTjW*sHG zmuWj99B@h6Ok0!Co1OlrNl;HM3qn-d#U5dp2WEyjhYy*@bTq9*|2Kd)OrY+ubO{ zj=R;jL{W(de0ljy0j_IL8enOR8$8~{Zv+O(^<`LXtiQ20N1d?t>dQ)p3H*SCv7Khx zq`oXy)Q2dmx}K%{%zZt6!QiVg3U2mI)=1yVjoa8BAyR!dxM}fKTlwW}Y=9RgxTKF< zDaTy48)ZV*xzUc9ZJ1-LZR1J9qR@*ld>I7;3&H@MTdX)ZFCJw8Qr7rooH z1y>7@>3q6n(dv}8XWEXtq{A7etX<&z>a%qE5Tad=F-(^94}2gmhLru*FfmHbnX7VT zcoP{WKZt|xaVrU@2V$E8DK_Ipf|~)yz>LLrPz`T~Ay8AJI#1`KGWP@WZhWBxImXu^ z;@M-a{)+4Dany&1+8u|=U)`-{BrA6-OgaB|{b3T;VE|K2tU}etWzxh;gNdJ|FA=t# zz0~y_f?rmbzJty-?I52~&9eXQkd<&?x>Gs`iK1{OAokY*C?1R93`)ZM{_LeTeobA1 zc!7PvYwDz&bbC#`(^Y`bHxk^1Fpv-2Jr8?Vv%}vyI1^@|tho(&Q>5s{KT=k*G8RYqfAp|zhf)E%y*Q9E<#!x*)((i>? zk64$1ome%2)GqGJsk=6i2sVvjX~3-dN29;STAfk*ff%tF^9q<8XW#GNFqFWeB@B_k zk{S42K_)(WLuro_!qgH)+1!V&)1#S+GvE%STG+9?GjFp~Jkoqk!w@opWH~ z2X>e$q_A4Wa}H~j29|S8#KK*^_-hFvs%mO{df|}_Nb~k&uQX6!Mt74E%5Z@qj6}t< zg?qYkJo*OUi3|pyn7zs#SjT*b7X-I!@Lb}a0l2NQiAo?c8S~=CR$aY2QD0oQD)}|a zeeRaOC_&0)yJnOXydU}K<8_HHu5Zp=_<^h5rO&L-)#;baa!b2Vr&j&IC3BIKV1R6J zaJDTA_?awS{C3C6Nrv@i(YQjBDQR7G+CYSTMViZRRG`RI^~p8^)e+Jdl7n;HDPgq3 z_F*t5r^$W7Y5Q_XUx&1VN5_aXzN`^XI=0fo)7&}ORaYgWA{%IeIxF6|%f>+fxfH6V z8z((_Ng8sqYFNuy>6Hm8w}Z?MyX)udixMqL!iBy_Ypb}jy;eC7s0?b>h}zQhkYB*( zzo-@Q8Oxd3in7mkN=#uA1$z`F;cOrEIv(mXrvuf8=v4R?wFM&SnU76I0Tc+OBpgY^ zM=Y7}DdS9cBoeA?!6eTt4nBy2yF<%%w1zTN@J^#=se@s8pOn zt!NsHkN-&*m^8sr6yNu6H`FhR(6}TW%*LWD?c&0)v=QW*VtiaP0==%p8^ZEZPjCuZ z<53T*kQr*zF_i-)^qDPS3mosUnS8MSTpv^I%1*mSY)ZEkLW2kxzC@n-2xHr zZ02lW!+^&e1Ma$W+~FHj&23bXLk4^w1>&&~y?7xq>WlPhDZX?`30rPM=IV%;B0v8i zCXKI#y-3}f#J-u5$$vnR$IZc$=wD&M+HeOcL;B_~6P(u3!myQE;PuCC7Y56({SIR% z%!Q~K^<`n2%)*_n`e^e?jbmJs_)&&*IUTeKoCk}Pg-=udH zHoJ6tWG_qM8k&L-9+p{n0GzE!!X5|89DU?S+3D1^;-RPAl_nD5YE~m@G#Xu_mbj$` z`E(fNQ>Ig)%(OA$-<`TI9sGuf{9zI2dQl4rM2Al08Fhb$^ zF=M2bE}qBI3!fWs13ML~!wEb=D!wF;ijTAwu?NocGo`_9iRw+Gr_Wa0R&gOms@Y80 ztoW`E<=$F=Xqn`BYhVU$05(B)jEQg1S2SnRlle@kFMUpZuPfy}m+pxC#-<)vwrHN1 zh2FEkhc%&k|K6mtU~`OJcrp(t zq3~lIv_E;3){;y2lN)P)szdtFO$qEh44QH@Q`c9%Vp9)XX;nVrltpBT-iFv|V5K~V zNr{`CY0%?LwGYt+_3ijr0`?DFZoMZT*w{moL-Q#|e_LP9(I1p2zR^R_AMfIw2K&m@ zRH+4x5ZhCP-55dlQvhEALGC^_(>4*+a{tPu?85)082>EnA_s&pc_1e#tGn*{c|q5R zA|@&4hQVnJjHxi=!PvH<^P>0H>^^v^^ghn@!{xgR*zL?o1?rrCnF4cpW8xEc5^ z2Y6j|sq4)-FRLyRoSL3G!)5gZA7Tb4XA6NZ-N&vMxqY~kt z0^zoAT_)#G5VU5u*kE;c)pO2YXbcrR*~jEP4BhCU?{b&iZQDup57Xy*)SKej>8ieb z)Ck|3z6?nPSkCSRjwplP-2O-$FAH~d7Ln-?p<8(;d(Eutt#T?kNFPPFT@?O?b)g)9 zf*Ko; zLE?h`=-4k1Z`#yImG+y3$VsM+s}cv&`xYqUElnxj| z!BuQ`OAr@%c)-cL9p(I)xYk!N_~pyn(&$~T)H}A@XYhrrpB||Y!N{Zn*Ay~kd?6u_ zN0Hu<46?QQGCy{`@UCtm6=qrRhOCtEBd+$P_&xGdX=L-W~XowZX;beFQSh^|$%j<=DJX+9Wz0e!X3pz){jMz1=I}18xWv9h;65&_=#V+KN3TJ@R9^7VR zo0l)%+0EvqPMTqt_Qwnx zABV{trgAum!|5E(=FrRG5)M~z_!x(O=5Py#O&lKK@DhiKeR+NyPT?@0!+SYg&EeA= zZsxF=!;d*U$6yyJ_ z9FF7A&7r_yHHWJ?e3rw1^sDMe=nco!ISj79i$OyPgI#~kuQ2!9`*-iJ{)!7q%REIE zp~5o9BUn6DrGllfqR3+@_EpTYczqRxp32G*#?WwuK2L$*3H7rKtt9Y|{?aSNvLZ`) z1*YXGw5ZM`y`UT&i%ZLkEZGZ%l8SN~KokmQmw6zVk%t>{g_rt{0AFVB6u-jjDW{=_ zR~Gt8y}}6Z!Ua5EUj`tb&9EY59;qaSq=NW}2mVHoB2or_&_1M`h}3)yYp-&#tn8YO z`UuB=P+?}G3n$@PvpypuBMg7nr;=B z&|u3IR}M)Ydezm#uDLely5S>6rj8mtX6*Gh{K}d(&NhC+jT7yTN$JjvnGA%4!1Zu&=4W*tei}D2;~bUrInU~%1Y0?*<}kYMWU~?e2%3YlA7;f zp-Rh3h0=nu(tBz0##{^!w2dfvAf{!uI0x*Og%zSN6xR`!Ou+&{=T%e+P}aE~NF9sg z^HhpuK;Ffc!h*6g%nWJ@aT;D&G0#i8-msB{Wxi`H#bS9Oty79;K?hRhm4Z(!6rk|% zk9s=G%CZVdS=q7Nqp{qyYnE4tb4o0g-hx68t*){P$hK33h1S=oF7*{GyN5O2^juco zLJ1&UQC{d7@yqKYG@n$=2U9~FJ2ENa_>Z=tzgSL3jLvA3cnZ8MB@FkgpDE{p(uyu^ z*AefA9^+LCML!eodW`24p$6uc`UJ6{tfP^zHEBQ$H@3(0@2V)rp?4%y7LLGlPzXF?UL7A61~YJNZ7m?4np&M*y#i*_VOLwT zXH~=e3X^blHtxAuhE=bqhFAoq;gXUPgCU~I>s{dWUN-;!zy7ma_BSl}ce&r?e=gvR ze(tZPo4?K>mWBLje&Jte{N*8k+F$sm#1rL?O4 zH@{u|;6o3u`Q0OrKKA(UpLp`Ar`N7~=Go_-f8oWK*8ky;FTe7qKfk)+|Gf5>*WcK< zY4e*~{`%J2TmRP3xNZB6olU!%ckkJ|Z~uXVE$_Vh-l4-sjvo8_`yYJx(Z|PIKl${; zXPFbpI!j!Y-^qS6tjN%sA*O}tV0?^2atZ{|S5!dLxye_`O|ZT%5q*_G8zHki zMdh9lhg^}_vMS1{V~)sSfq>~?e2jzPFbw+Bc#}QqUd$|5239P{5h(MG?lUSqzME&? z4Qr0f4zAq6^8);Dymq_895o#$BZ7~bh}x2 zzyr_$tN=N{5l}^pY5hT!K+Qk}K|MirL9IdMK^;O>LXBd@!Y}>iX*bWvO(r8?{f%~Y zKWfBmnhdzlE28jrp5H=P&CHu#Q6cm=@pk%Y21S!WLKGQPWF&)fBgvq#1~O=Lzt+T- zJ`G8O!${27)g(rjATHOi3}JUO9uE7+xxV} zxAbZ-d)55DznYK>!wAV!^TTvUYqKMJMUY-aiKN%qzND8Xoe<2x12O%%h_lG?7{oIXWy= zlV~7`MeyZDkVNoH91UUP4J01i;=wH*+~P-@y-C+Zk-lS#NMFru#M~a+8r@=SFnA;K z!?RgiHv@u^mKb8$kwh#)BH+;%aOguUnqDNSy>DwmOGjP5J`NU8w zjwB@`ExZo2@E4$k4U`tJuD!6XjH9#`L1|6RtJgF_=E4_$g5{Mo80umy@Nd43*24JK zU_C$`2mqnpk^mQ|iy+?1rW0bz=}0S%(PygaA2kd5GJL~T{}9?&>+)mpZ-eh99_A95 zhvpGdtj6iBC%vHzy+@mZahBgo$c9@x;_L+Tg_U+?y~R#Qt%LsYQM?8St<2VW!4m!>zn zBfZ=?gcQQ}(Fq1M1Ea}6pxuE$Lj!?^20~c|j!tUr+X8(gl#ZrD-Ow_}K$(HwbD^!l zJ;?{*3>snpoY{C~plwFW9HAu!&qX1 zu_TrxKE%e7q~S3cgN1m=zc;j3FVZ_b_BCU>p*6fk-=O6<<^^dm4$2F3_->RpX;jSh zLj*G!4C8%&NU!ghUcT7&=vHHkp+PO1H5d=*7Q#^4jn$Ia(Z>sJeYUBM930ur+Cd~cnw4Q)lnHq>G3df#U98yejUqIb04n(6JlF37~I2Rs_d{cm71kn|~(c(NG%7jU&c)!}%Nu>tv|k zc&K0C1=u*A8x8dlMaS`^WaIUH#>8#wicOG?kPd-{5~s(vceJ9B_qP~G2hw^7`!Uq% zvz_@6W9mQdD<_)>8MG^eZmuwrE5;^~E57U3p4i%_CBC7TH!k0-@-*3T@j4R!tl4YI z?-+j$9)$51z73%?F&+4y?#H3_j&Z1iE;M0U5;j&tGy@{Z0N?{dN|GG~G8PML?TM9Cv0oys-v zV6dosU6lym7M4$Xg@|=?Ba2bQ90~b5ritar zUFh|Y2IBOTd4$W*w&`=#^SNMszD%(ZeLkpj)zPh=QC>n*hTIE1UW^Qh3%LC;L=U+1 z=-r~ttaN&2i*x39eA!TVY{<1(mYM8ml@$s45xTi6D&~sboA_ZXGyv|CJcvH&1zth) zAx#LLDuH~d;rj~oSPVuRt;~_sfWtETs#1cKkfwmmgHW6(U zjdR#SAsD_IQmeW2bTt!7eItfvsFEl2v!Hb-4U%@PyP}|o9}_xIcY0>l00dl;33<) zPY0;|kF?&Q)FHb-Fg{aP))%37>uwP}zJ=Ky9}QAo$jBFJ^=@pF+|t6ioSt8~oC=}B zawwJ4t(n|X=%( zvLY|D`hylG#7WZ2Dk}L%LRK@%;P^Yp6CtI!SrojYfMxuBr%!8!o!hf{oax*>hr?Ms{abn7W!xPPK`ex=`v<`1Napom~i_y2d27^dFa z(9`MXd6?kymoHp?1^0gOID^l;z~HjAtrrm5msC@@9>O<1_x^L19+F>ni9tJuZ~VgW z4h}a$_=C@W_G~}$`Lpt~zwSBxCC^aPEx?f6^8TIgTgYAS-~ImR%fr8S?Bmw+gp69k zV*YT6@lmKt813m@!vEizXY9i}uiO5o`D@6}*G2Z|?&G&#VD($A;r==XTT&U!=J~2| zRl7=;3U3$nr}DvhKl1xx+&+xkBf0(Dd1hDH;(Tsbm%hWeJx&dOj@f&0dkeSs=Js{m zp2+Pb+@8ekc5d&-?FMe|ucmjF*#~g@dTt-Y?JKx_Ft=N{-NNni8D>}eW&3Gnzf!F? zZm&}D;dWK-DV5vrRnzD83*4T_?P_HkxIOWSe=WrI1Fi$s5!N@Y?L zZVp`>Iytm+IG#f*hp8M65O@7$l&{y3sb zd)RruE}QhPflK*M9WT^8Rb15drTVM(GQak3**K7$lS}@YU$*m~i{Hxewv6e1eCley z#MkF4#2@x~8+^zCV1LEOkMOlAe0}(P`0)5L6~1Zk&C_(Gi}A)0wwA?PqNq6ab@=cd ztMA}5L)ekxaS^3}(YsV7`ilu>!n@n+1R?x%qj3N8wuq;g11~yPA;4 zz#I>7J2&qDIPDtXufe!Mqya(Ge`2V*sxi3G*blUkC7y@a2Q~6@U-Ipdo;H4Zvj+03S?q0(<)o>t_eR zwi{s%0QZvs@0kc~7pWm{0sL?x!w2C7ZbmrC&hm8v++b&UAspj?IA9(N@J()h3!rln zqbr2V;ERUzYXFV~hC3e22>%4%IvB(@06d${(mx0Aq!aLjFy{a+&ww_6xrtxd0Es*8=7X0L@caJs`YoD$oYF-wyDbsVx0= zfbV4ij{xq60Ir?})2LBHq2*>qGYB8O1;!U}f9w{j*MK-N48YAftlkigp25l}%p_#* zOjgEy03EYXrw;T}fVHz&_!R)hsbLewN4k3&13pNSYzc0Dw>3#@yEd z`~xhPE`a+h0MqV(I)^mJ11z`;@CI`cz?be~d94Td)m<#^Nr2zxL)(D+4*;VISeR&l z&H{!5!bRMS@HK9>&xZDeuMGP&z?a}#h3Ny_F`K2+4DgX6R<}Cl%QwL}tzd_#J#+2>%1X#q$|`Rs%c(-x@HV12}UD&<&XL0M;#qIsx-4 zfNQIv9b+J0fVVA!HUe`Iz^EE13z(w;X4V1zG5CTQA)mrm4d%}PPFn?Z3Fd5oe}``~ znDMRB*oT0Az-$JX_Ymuw2*2j;?En`(4CMv<7XiFw4KwEg+{w))z>HjcgtY}SG{1Tb z`WM8t0+b$O?YIhH_3vSh0yDyv-?O?x*yjmmP6oIWzC;Mq3~;)sN5B)z170R%_$w^^RDjYeES*&VcfEpIdo`%P zgy{an=vEK#g+DQRSP$@nKf{;>VLn8-0p@5hBmDLM0a^re5x|+R0X|^P12}pUtRImk z0lvM7wPORo!<(7;7{C>80nQKx;n}wsy`2O2&D(75OWq1R)`19>~j4KL(lrGs5pa5KVJxf$VMZbsStbKHy&W!lk#7r4^T@31QY-O00;n%2(3~O`TQx*i~s-t0096J0001UWps6LbZ>8Lb1!Fg zX)a}WW$e9wd{o7`ID9sHvN=gMISXtcK!5;2(V(JBH0vg?G1(B6;Kr3*A|%0zG;V22 z!#RLg0>QIub24nDt={Twy_Ji8FTJ<-*0%D)R&bZlgb2zne}GUMYt)I08cR$TvgEwa zGiNsm*!$kTe|`UX;gfUD%seym%*^vV^E@-p%vL|RgEMj*$HSkdaom1R|L5fX_kR@r zvS<7un|mew&6)cROWvIMK;xt9^Vc@*=zsuDX!~*xNyV z$KE%QlkB~S?1cCIk3QUp`Tr+e-7bz>VlZ-s-;$bSTsLPlWE#>r?hObm)#D~y2M-HN z)O!KHQ#dX)ktg})oCdwq^yC%>h_EB?kr(^7;1b8p{RjH=fBV!|!s|8ABZ z*(AaH^R5I!*jD~(n0$^~b#v3|hopx%t}$OPlbZ#9Z(R)s^*V3X!MMYPSe`*Iv+o;l z;eWhE|Np=LoBwJ^MS&1<8`=bCpi92wS>`P~Y?|$yT2Wx> z;AVx^8G@g0@kLFcpJRTqq#(DA&n#If8y83OOJ>Pag4z~~&%e@3x3RotTgI1hw!>F3mQl|WT2f%G@zQ$8 z2;qFlJlb=GhgvrCnJYsTe5RaH)l$4t%0YafLbKygQ+fx-VWj+}pYx5D1*PYK^u3>6 zf)4N-8hNOa@*t5&ANvOM=RvyLOJ7MxWambwC80hLfLZa2^!dE>8J27%&`ju%2GUV) zJ4RCg&uxdX|Jsiw|0x#)7-JvVT#!dP$71j2-LwtLBx?)ivcb+%>o~PoJecMtgX+qH zJo+!Jzs$j~G+sP-pJ8zgZDlchFf4!3CN6GWQjizulD;h-Jb6F;ZZb(qQ#Kb^IB7{6 z6p3U~9z6|YGI^lgAdk0&?MPLS!ii6Zk-|<613(|FoWuzlu-LHJO*_pa z4QN>eL~y&NX+VP32B1A4`*wJfL+op$|27x!oIHLfmtV#~LFstjtPHsO6;dbcX z<+iZD!VPUPV|(Dw3V*pU=6UW;h(xBLYtmTLU@YfPaB>ixR{_yljs*&W`d0#R@JOq< z_xm~a-+)iIA3)3i0{G@N?*7op(b+H`DPgCZ4jXkw4J(J2w?h~3z?f#gcE6g1m})r! zmJFqa_yTv0mc#3%q&2ocDbf9eFTi}zz65bt8F7T}<`VQlfB*^)y^3vgoDHo@*>Y3p zMK*;4wz-6F4Q(>$@}SM)44eXb>MU~{4M`@$<`1wmzrjmyG9ky(#v@SUGWvKXyI@JD4o6RweqQt;&EIV5B!2~`^FfwK{H;Ocql$ko`YcAwsarwj7ob-$M` z_%#T}&};lW6cFV^mmdZ!!;-|$>F8WbwRFC)J$m9({Dk1CpQsr^5Q@G*>pB# zC`Yv3Hz5*4v213r(%WjC;Gw^S_SC9!e4yOyls9^4%`^xrF-@AP#D=AbODnK+wquY9&V^mr|AP8If+2kq_yB`x&6Kphe1~ zN2XtmnLB}5b&qD3d*s<3x*lc|5(~L3Zm%YrJ@jlgP@JpBb z8>Kdyp>*VXwVYg#boF(50mLOJF>CWgC2Voij|;E^&D*MUcmQ#km2kdW&oY{WwcHVD zno-Is%-y!itZmh_!U!~!6?AAe%dY3m8N_PGY4mDIxs%7;eDTzIlIP3bf!y#{#zNVr=tM(|~U z*Bi=Tjgj6I$#n5Qq2LT1?lXjg3L4ts$tU;~IoucQ5(7U$^7fFkAUmvs9cXgH#AuN- zp%^h3gkbdgHj~m}NY*J8f=YXf4k>?3&H|kLkn)jHnlK6m5O*k1gZw$F%`55~+6Oxk zT$-3HL<~F&VLevO}( zv)5VVA4F5(CHd`jR*cA%S7Ai1RBNxx!-#zOK8(nhs_bh|(i&1>yYiNW&1(5J-HFVi^OdeONvJjnwxes-^VmN{HqJ0dR zQd%ctd74@mhZ2{G2Tg7&K&DzCN@HboVw~j9bHNclpI(F*@ zR+m)|s zc}GyaRKO6?3xjfO;fDGZT}eriJ9u_#*M4Nx*+*)CKuEO}V<14Pfld+uz!?%PgJ-6O zm2P8FPIR(~v7oNqk%i(|PPy3LyBlRkLV$V6R~?mR6y^`pM{Wa}trSSrS~Z(gHL6Q_ zlI_S^H?@qD#*?h=Q$Xfdt&`IzcMHIoNG0z`-7y&wClbgsk}go`dMt;B*a7Fd6xpg& ztxJJQ4ABfCK*>%X6Fchb4)Hn~$_1qMP<0<&gY4kyQ}%-f#~HRv2)X*)egWI@%LPoE zh+0U?5fmELg1C>bQo4nf<~S#%k?NT8(7G#$E>lWr0mw6XJT#DGt%3#sa2WvCwS(;d zr3Im$+S&w5DHrmAr|flRc^a*l1gaPQ(kFgoYGs*9?wZk&ZZh_MX%?a+)pN z`!7&{PZ{EyUmu>!Pe zy)?+5)3^ZjaV=-A9!|xoPSho3ra+J2h_d?U0mL!CKxd(%)(#(w^2R6$ebG!}f&x;Y zF3@ddp{Xya0C<@+jEcYu7Lpz80+^Ew#@uuv38R$0QiwC<ccx3sX>`{HSVs3@D*tPekY`K@&y$L@Gt-rzK)$(+maicbwSr_8=t687QjqOjxqVtOC`e-9PdM{TTL9l}F3Z26(xfz- z!Ki;8JGkiASp58Xkd4ID<}*P}+N2fj#>lBGvQL%ItIa*C+^u}U!?$Cw$wvnZL8_Ug z&mnM+c02v55YTgt{Vo6i8>uo_77ndmPY z*Fp35uf{%T0IjvQaTA6m4Bv<0q%u1L4T)w8C(l(`6QSK}rvR=v>~Rop&~{9g1W52; zLOad2qIH1-h6@G=*gnh*gu0Pf1IGSWGFD$%pwH`J3_=9`Q6fk*FTHppDqLP#>i`9Y z_S}ijjpOjy#lBx*&tDYdv*-?dPDeucY&JBA8t^a0ea;3>$Iw1!n z@EWuB1t7F0ms76elr;iZ3wZ|0%udOqJO-Hxw7dCDnPgmRie?b^hNEWjV7SIjdvC%9 zf?XyX(@pJ~X;gYn0F|T7C1}-Vx(5ZYi8ddEh)ggZtUDk3EmECuPqQ>=|ayBk-hy1DXc* zQxUBelcu*V?8blebhf@Ke&A&QI7b>{R7(Z zV^#%lL4fo{hEv(9z#eAor;s<;lE9D0E(zdzz@^kNO9Cn65UvM^!EZxv*t#5N#Xuc= zwM|e%XAtvHH+#MY&(>$YglFKC7?=V0lq&}ifK#783@>qeCd9QJnwMX)eB(Ir;34r~ z%W{}Pm2S~C0A|U6Ei4`kL^eT`KP?jDYt`V>kj)VhfB0YNAdm`znKpn9Vb4ML?qHqF zx^55a(mkv*_pnahgPqyC0kT0o3eA`9QK(V6U7>
    aWIfsh#V;nI8v;f3CNN51*q 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 diff --git a/venv/share/python-wheels/six-1.14.0-py2.py3-none-any.whl b/venv/share/python-wheels/six-1.14.0-py2.py3-none-any.whl deleted file mode 100644 index 3547cc17577cb0c2f99937f97bda7101fd6d6c02..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20256 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 oikgX!$LIBP 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 diff --git a/venv/share/python-wheels/urllib3-1.25.8-py2.py3-none-any.whl b/venv/share/python-wheels/urllib3-1.25.8-py2.py3-none-any.whl deleted file mode 100644 index ee038c93936150e5bf246e143edb0d8ef409ad50..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 127041 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

    %3yop|!WB|~nD|_<{*>j#uu!)B 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 Q=va3PWLLyOnf`eD57TgP*Z=?k diff --git a/venv/share/python-wheels/wheel-0.34.2-py2.py3-none-any.whl b/venv/share/python-wheels/wheel-0.34.2-py2.py3-none-any.whl deleted file mode 100644 index a8ee5d78c45aec386feb07f88039231e206c8eb9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35611 zcmaI7Q>-Y_vIV+qb1&PrZQHhO?`7MzZQHhO+kX4pm-lgQa^FWK-JSH9BbASk_YVogI&%fw8}NNa52YidU) zprR};r>I2h?Cu=xEfc%N*|Fp68=UewVBWud!#fIw3Ea&0*|zN}*E%}GkqIbeC_(Kb zPg-12qj^j?PAd>+^4A(HeHuR#03EVnYDW28vp_Fj8Sy>!zO=d^_CWBu-}iauIX)QwV&mXputZF^8`G&YA@o?w^h zbM8=%&hP8{F%qvZb2IW4oo#*_-cC=aV6o9~+styCbGe+g-bYPCD@1H*Di&zeZc|eY@1CnSd(k{!nQi>Q!tyD2}Xx!kv0}bya{ zxZVPQ-%NGIWmv_zM|IncY?s7JMSU{lpa3LKxhL!>VTq4~#@tsNuI7l1+DW!7K5&4iK zZo~~|GMcN2GDd_-q6PX+^&)KxEj<5t>`jF2H8mL4q)#FJjBD?19|sOkW3NS$oY%iGUeyb`HBg+f(}G2` zN{)nF{|Yc9?hG0wjUVDTZmrl8eqLBdg=bmCS(b1~t^r3|AW$pA{Bdo{-)IM)6oEq? zl^iM3=5*bBRu(jAy;=T^Znd(%I$(%y#9;a4NR5C}+Aq|uyyMnbVwdV zU2Ky|uG4;?Os$<2Xi!rcqiLJ1#>VDUb&R;i>|arRak>!!clgrgUpn{v2rE7CaT-pRa{7T$5eYeX_Vpp7!IAdZr4@bEt;I&)kw7wpibl%vu9-9c{UnnvR&1jJq+& zscd5G`UghaxeTkNEeknDIKk>ZCLc(qK>`kI$goowpN8U>l`NV((Yjqa4?c56UdQDO zc$?85;_3St2!cbl!z7h0m%5jpS{DN0%{V9S`JtWVLjllUcO)(Vg-d*ARPFI#^pD$d zYqjwRR}{8V>Pdl8lmuKD`rxhRKL-=?ZU5!VT61e8pt4v^!V*}pbHG!61d8NUPH_j$ znb60z+iWO_w2g9=g$6R-g5tPNq?$j(N)x0ci}`ok9%_{oXzz|0NVi?8>m?vXI+apu zX@lR?aK;(Ki&^2xG2LZPN@G&j{5+SO*b4CX^3ITEWtTdxp77tw zjLP?6D2ZlH$#{4dGa{{UmMVXK+)zU`9whCoqA<%2HOr|mn#z$uEgK&m` zi=Sun>*tB1WTWt=w8>k6wcW3GFBoO`^flRTo&0sq$RAYU7Hn4)9=9JTi}xfxb?3OM zgIrMZhk59Gk{d8E^S7{M3auRsxxZ7cpRxulG6+3R>9ta>R?@N)>&0p<1!0vdr9ThkNwiOty6>3U>VHVa7#eXOT(zX+Wc8V{vasFn%@8!0YBJ#> zvSsx%G|RAai>S*&zi3>;mwmvI8vxW^iXE*saga7=lPU|Wx=)z<&8v`LD2E-@k*S;M z`C*&VQM7W&k6G!-$X(^Fsi+mxR%B=awB`XMRSBS3dv2+o=yqAb?oqnwmez2`RLG8Q z%D9!ZAt-(XGv+SRP|%n;@`t3v!_R=41F;lMU+M{2Kr;`{7G4jSS)Bzl4-*d)8w3A{ z4>k4evdd^dfyMUC%24=_V$1?@R0p?7O-21hnGUF()Uyif5=}J{iS+-$^vLFIr5AWG z{JSEdwXS+A$h%=#6MC>5F{HK}w$iawQZgnpniVel7T~pNmei?dU!R;+Yt>A1Jh$ty z4(PI4#e~s5B6Welq&ks2uhdzR=$DfaVJ0X;S&MR&`J}O|#0A(KQg!6`47{lM=lhgR zJ->+tu1Rz&TRAs;zvsn2joGw+Y+mdS9}4)nAxSy$A`??b(4EbBSMMX!W!QLCQG&i@ z|HEcq8T83JQzV5mvmXZHoPDLlAi#@}m7;GaFNpt2NJtKrPW~q9N}HN1(=`)5UiLV& zEPPmU5g9_MG_H<;IcFi(0~phR<5Zd<_)lA)uC=*YDUsh>9FxE+g1G&ob*Kb{@B`G3 zm=owT*<)hOJ}y&@C>{NF3Eu6e>a0O|-tzAAhz1xHuSr7v=9*IyUo}cHgeiQ_ukU`g zCZ>AK*_=nqorF`;3lmO>OvEQt%m+slVARR{p5d8fDULFisIh&wAV&$X(`Fgvq`tR- zgbLG)WtC@n6oftW+VCyJc~m@oC#W{1`l+m-D9oYHg$-%Sl)5z))J@eMUDco6@yn@8 znuF%&w56F2RWnyW!`tZacB;LN#a8I=7@xde(Tg)suxX}*{97%qLo7UX`a>bMnG#YZ zqi;?P!;IEIs8=}IJcz9PZxL2*M&sszP(VujZ^?Pe?Xo@=8MXT^#6X;4;(tvyMk;@i9+_62hu|y=c&%5QGmZ#f;(p#)6|Bd1T^R zgT!qOe&2ipf<<%VCRebNQ07e>sPGSXRv zU(B}#85yWMj$%TzO%tYu zn3u+UsG4n^pHTEeqL>I0;c!E0mB|_ycgl8uPDDn^>h))Eas7Vpj{IjV$Jyt`vqPT% zYOcY$ak!_^!F+|CoB9GSZ~uwA!r<``zFk?j^}8;d7O^#jn;Zz<07bVWP;{fGk8JrW;-H|DC@BKtyM4x1GA%>`i&x+AuF7o$BJ ztgti#ckCd1ZMU{6#!G}iD{83R41FL84s0PB*krG-J#xW<*!jnu>9KmgFMu^lWXp|Y zfG9uE1c91WeKWa3-9&8=%UCf_sJgR2*9~<2{46al&-N{+wf$RzE&}i_#96=8t>Nya zFtA5gw`cfZ0mUcbP4fa(+7K^)Mdll0AA~mQV^y+F{Z*VP2+4MIwpp0Wt zt}bHOzON$Gd^S+QYhgC}P4YrVMHi|iT1xnks5StE{En4-Rx`!SmPd|O#htT*$6O2> zT*d@R^t<#x$L)d}%xs1iAtt_8V)j!bnLilnTi8L`VMkXm6NR@=v_ryp$|Ri9{G>Mr z#m3SdCMP;1@jJnc6?xAT81<86+q2UpEgrqRq=w?M6O&UVTd98D-Y;iIPyTb@?9a(I z1g!>hx?-oXF?iY8d%J<0VmJ4RWbp7jZ#UmuH~nQXTr%dDS4a1OU2iu}b3z_gk~0k# z*_tExFM{2*`rr{bl7(vX-Zs^N{`zqoWS+va|ch zRJ}bDv3C_BKMR36poC?AEzaeKre_3U`)q~Z(!Bi{g+E%1WWOxxhfI0%<(FY32 zT_Ato2(0+;yGE3bR}7TwSc^zeySv?e5xZ4VGC+Z7Tb+_8elBRo7!m5CVYGjbclmdI zc7MNy2^m3_%Co2-_N?rA)=WRA+W8MSvzMf9+Uql=8@=$Y34@z0xYombs};GRBcTo&yN2BLx65dm(?2Jt?Z;&l|yPG?dXLoY(*8* zcPI=R2ImU@fEish7hHZ;9gG8~FMu*F#OJg$fV)sK$?vPI?Y<8uBjk8lU>ku3hj=B5 z6Nx#QUK@%Ix0r+0Lsr-b+ZRbew9Wns1`)3!j{pbdC$eoAYrY_h3#P_L$uPBI+nZ%p zC9MBhIAoXC*%?tMYRU27y{1=@c*D31MFz8|F8*U`SZ>-lf9F@N;`Brk7xo(bY?)c8 zCFOPNjR;is7(gmJd!9Zv2Krpb`zGkI1_6 zbDXP?XiU5>W(Whlo%V@LF3le7WJYHA!$LjoDPwA7jCA6Ym}$Iy+CEGTO9OF4#)7U> zwZiCgf;M;Biw{X08#RUNa*a)6>X81NH5DX38otELWmtpEXOcHE;SxatOp zBJRuJ$C}{tS5azt35YV4kB&nV8Zyw;(wpP)v0}fJc~OCufAxBiDp7! zYM%Bak;ZM@bhJWb&;&^%rO*7cRo^M}IBAT`&Dqxq{irKnS+X3Fx1XYN=8S<7IKu60 z%uWKcx)hmL)YT~y2_3v2>|cv(l&dMz@L=J$o%gtb;)j{6&gp}S4d)pHc+wn3pc7#< z8e&ximn_y`P zc5KSdB#){R*ZJiXTFsq_40~WWVlaB4h@{RWoy;CA=osRWNJA}5iAONiIj`Uw((>K% zk;)PKXu+{NY>pM3Ay*l7X{He7S6Bpwq6?;5VjhS zvP$>z;DSl7YLqYnppnA>{wzkH5RbxA2R4{!pL8|Rz+BA_^#rI>V4`+!#<7U6MRW2F zW@Jx^!mnfLl&(gF)TI^~;4BNu#a&8nY05$R=mtb=@?RH_d$;Q*1%0`ey9am`ew8%T zm38rT1bFbjPzwwdBRG&8FOu!?Gvg3JZBbXKcODTp5}ZQMoSoqu3ODRfjf;2r!&jQv z8{Zy9w``T&GjgCp(4C*px3krO>!q9grMB38eV&5Zw6vqYXt6xI*nXL58sw>X<{$!E1wnN*K1Q*;}g;(hd zEW3*UW9H%n@P6`$$FQ9HtKm*SNay`SG}v$y(g*X&<=p!w%>V1CbO)-qzEgfp83toa z{N+^C(#|#aT2Zqi^Y?y?IBc7Mq~!ImK2)yqn;c#Tp4#(cIrmxQP6u$ zdud&SE>j5r0o0PAIH}Vn*KheQ=6Vq3wi28;ij`?T&cE~J&wTa;G>Mq32NJ2LiOtCV zc}I|6jN{yu8_|(B^fxfkkoIIYtsxT+ z6tCe9{Py~}zJd0MM?!OOhE!`AB*f4?U@zli4R&_x^?N}!lbGLW8RDZf7A3QT z)q-!V$n8Fdwm^3JJ`DR=8}?ak9OmOf?XhU(Ci(6sI%|a_j+RJDEvLhxsdx>kgl3l!*^O%7cw;$iPjf^gEKi2O8_13 zGc(K53k8d@cjXDXgLAQVrHPbF-{^7NV>NgU<+>KCd2�f``%?xk`|lba~?R#7s-f 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 KGB8B7f_MNoQv&S(