From 6dc00f7b2bc523b810a5c932159b2ba0c1dceb1b Mon Sep 17 00:00:00 2001 From: Angelos Chatzimparmpas Date: Mon, 1 Jul 2019 13:16:07 +0200 Subject: [PATCH] Typescript activated --- .vscode/settings.json | 0 __pycache__/run.cpython-37.pyc | Bin 940 -> 940 bytes backend/requirements.txt | 2 +- backend/venv/.Python | 1 + {myenv => backend/venv}/bin/activate | 56 +- backend/venv/bin/activate.csh | 55 + backend/venv/bin/activate.fish | 101 + backend/venv/bin/activate.ps1 | 72 + backend/venv/bin/activate.xsh | 46 + backend/venv/bin/activate_this.py | 46 + {myenv => backend/venv}/bin/easy_install | 3 +- {myenv => backend/venv}/bin/easy_install-3.7 | 3 +- backend/venv/bin/flask | 10 + {myenv => backend/venv}/bin/pip | 3 +- {myenv => backend/venv}/bin/pip3 | 3 +- {myenv => backend/venv}/bin/pip3.7 | 3 +- backend/venv/bin/python | 1 + backend/venv/bin/python-config | 78 + backend/venv/bin/python3 | Bin 0 -> 8632 bytes backend/venv/bin/python3.7 | 1 + backend/venv/bin/wheel | 10 + backend/venv/include/python3.7m | 1 + backend/venv/lib/python3.7/LICENSE.txt | 1 + backend/venv/lib/python3.7/__future__.py | 1 + .../__pycache__/__future__.cpython-37.pyc | Bin 0 -> 4180 bytes .../__pycache__/_bootlocale.cpython-37.pyc | Bin 0 -> 1304 bytes .../_collections_abc.cpython-37.pyc | Bin 0 -> 28997 bytes .../__pycache__/_weakrefset.cpython-37.pyc | Bin 0 -> 7510 bytes .../python3.7/__pycache__/abc.cpython-37.pyc | Bin 0 -> 6506 bytes .../__pycache__/base64.cpython-37.pyc | Bin 0 -> 17107 bytes .../__pycache__/bisect.cpython-37.pyc | Bin 0 -> 2746 bytes .../__pycache__/codecs.cpython-37.pyc | Bin 0 -> 33953 bytes .../python3.7/__pycache__/copy.cpython-37.pyc | Bin 0 -> 7149 bytes .../__pycache__/copyreg.cpython-37.pyc | Bin 0 -> 4292 bytes .../python3.7/__pycache__/enum.cpython-37.pyc | Bin 0 -> 23795 bytes .../__pycache__/fnmatch.cpython-37.pyc | Bin 0 -> 3385 bytes .../__pycache__/functools.cpython-37.pyc | Bin 0 -> 23862 bytes .../__pycache__/genericpath.cpython-37.pyc | Bin 0 -> 3803 bytes .../__pycache__/hashlib.cpython-37.pyc | Bin 0 -> 6583 bytes .../__pycache__/heapq.cpython-37.pyc | Bin 0 -> 14410 bytes .../python3.7/__pycache__/hmac.cpython-37.pyc | Bin 0 -> 6161 bytes .../python3.7/__pycache__/io.cpython-37.pyc | Bin 0 -> 3464 bytes .../__pycache__/keyword.cpython-37.pyc | Bin 0 -> 1857 bytes .../__pycache__/linecache.cpython-37.pyc | Bin 0 -> 3837 bytes .../__pycache__/locale.cpython-37.pyc | Bin 0 -> 34603 bytes .../__pycache__/ntpath.cpython-37.pyc | Bin 0 -> 12967 bytes .../__pycache__/operator.cpython-37.pyc | Bin 0 -> 13948 bytes .../python3.7/__pycache__/os.cpython-37.pyc | Bin 0 -> 29748 bytes .../__pycache__/posixpath.cpython-37.pyc | Bin 0 -> 10451 bytes .../__pycache__/random.cpython-37.pyc | Bin 0 -> 19404 bytes .../python3.7/__pycache__/re.cpython-37.pyc | Bin 0 -> 13852 bytes .../__pycache__/reprlib.cpython-37.pyc | Bin 0 -> 5398 bytes .../__pycache__/shutil.cpython-37.pyc | Bin 0 -> 30593 bytes .../python3.7/__pycache__/site.cpython-37.pyc | Bin 0 -> 21829 bytes .../__pycache__/sre_compile.cpython-37.pyc | Bin 0 -> 15251 bytes .../__pycache__/sre_constants.cpython-37.pyc | Bin 0 -> 6339 bytes .../__pycache__/sre_parse.cpython-37.pyc | Bin 0 -> 21405 bytes .../python3.7/__pycache__/stat.cpython-37.pyc | Bin 0 -> 3928 bytes .../__pycache__/struct.cpython-37.pyc | Bin 0 -> 382 bytes .../__pycache__/tarfile.cpython-37.pyc | Bin 0 -> 61833 bytes .../__pycache__/tempfile.cpython-37.pyc | Bin 0 -> 22193 bytes .../__pycache__/token.cpython-37.pyc | Bin 0 -> 3647 bytes .../__pycache__/tokenize.cpython-37.pyc | Bin 0 -> 17778 bytes .../__pycache__/types.cpython-37.pyc | Bin 0 -> 9022 bytes .../__pycache__/warnings.cpython-37.pyc | Bin 0 -> 13814 bytes .../__pycache__/weakref.cpython-37.pyc | Bin 0 -> 19158 bytes backend/venv/lib/python3.7/_bootlocale.py | 1 + .../venv/lib/python3.7/_collections_abc.py | 1 + backend/venv/lib/python3.7/_dummy_thread.py | 1 + backend/venv/lib/python3.7/_weakrefset.py | 1 + backend/venv/lib/python3.7/abc.py | 1 + backend/venv/lib/python3.7/base64.py | 1 + backend/venv/lib/python3.7/bisect.py | 1 + backend/venv/lib/python3.7/codecs.py | 1 + backend/venv/lib/python3.7/collections | 1 + backend/venv/lib/python3.7/config-3.7m-darwin | 1 + backend/venv/lib/python3.7/copy.py | 1 + backend/venv/lib/python3.7/copyreg.py | 1 + .../venv/lib/python3.7/distutils/__init__.py | 134 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 3196 bytes .../lib/python3.7/distutils/distutils.cfg | 6 + backend/venv/lib/python3.7/encodings | 1 + backend/venv/lib/python3.7/enum.py | 1 + backend/venv/lib/python3.7/fnmatch.py | 1 + backend/venv/lib/python3.7/functools.py | 1 + backend/venv/lib/python3.7/genericpath.py | 1 + backend/venv/lib/python3.7/hashlib.py | 1 + backend/venv/lib/python3.7/heapq.py | 1 + backend/venv/lib/python3.7/hmac.py | 1 + backend/venv/lib/python3.7/imp.py | 1 + backend/venv/lib/python3.7/importlib | 1 + backend/venv/lib/python3.7/io.py | 1 + backend/venv/lib/python3.7/keyword.py | 1 + backend/venv/lib/python3.7/lib-dynload | 1 + backend/venv/lib/python3.7/linecache.py | 1 + backend/venv/lib/python3.7/locale.py | 1 + .../lib/python3.7/no-global-site-packages.txt | 0 backend/venv/lib/python3.7/ntpath.py | 1 + backend/venv/lib/python3.7/operator.py | 1 + backend/venv/lib/python3.7/orig-prefix.txt | 1 + backend/venv/lib/python3.7/os.py | 1 + backend/venv/lib/python3.7/posixpath.py | 1 + backend/venv/lib/python3.7/random.py | 1 + backend/venv/lib/python3.7/re.py | 1 + backend/venv/lib/python3.7/readline.so | 1 + backend/venv/lib/python3.7/reprlib.py | 1 + backend/venv/lib/python3.7/rlcompleter.py | 1 + backend/venv/lib/python3.7/shutil.py | 1 + .../Flask-1.0.3.dist-info}/INSTALLER | 0 .../Flask-1.0.3.dist-info/LICENSE | 31 + .../Flask-1.0.3.dist-info/METADATA | 124 + .../Flask-1.0.3.dist-info/RECORD | 48 + .../Flask-1.0.3.dist-info}/WHEEL | 2 +- .../Flask-1.0.3.dist-info/entry_points.txt | 3 + .../Flask-1.0.3.dist-info/top_level.txt | 1 + .../DESCRIPTION.rst | 134 + .../Flask_Cors-3.0.3.dist-info}/INSTALLER | 0 .../Flask_Cors-3.0.3.dist-info/METADATA | 158 + .../Flask_Cors-3.0.3.dist-info/RECORD | 17 + .../Flask_Cors-3.0.3.dist-info}/WHEEL | 12 +- .../Flask_Cors-3.0.3.dist-info/metadata.json | 1 + .../Flask_Cors-3.0.3.dist-info/top_level.txt | 1 + .../Jinja2-2.10.1.dist-info/INSTALLER | 0 .../Jinja2-2.10.1.dist-info/LICENSE | 31 + .../Jinja2-2.10.1.dist-info/METADATA | 67 + .../Jinja2-2.10.1.dist-info/RECORD | 61 + .../Jinja2-2.10.1.dist-info/WHEEL | 6 + .../Jinja2-2.10.1.dist-info/entry_points.txt | 4 + .../Jinja2-2.10.1.dist-info/top_level.txt | 1 + .../MarkupSafe-1.0.dist-info/INSTALLER | 1 + .../MarkupSafe-1.0.dist-info/LICENSE | 33 + .../MarkupSafe-1.0.dist-info/METADATA | 135 + .../MarkupSafe-1.0.dist-info/RECORD | 16 + .../MarkupSafe-1.0.dist-info/WHEEL | 5 + .../MarkupSafe-1.0.dist-info/top_level.txt | 1 + .../Werkzeug-0.12.2.dist-info/DESCRIPTION.rst | 54 + .../Werkzeug-0.12.2.dist-info/INSTALLER | 1 + .../Werkzeug-0.12.2.dist-info/LICENSE.txt | 29 + .../Werkzeug-0.12.2.dist-info/METADATA | 83 + .../Werkzeug-0.12.2.dist-info/RECORD | 95 + .../Werkzeug-0.12.2.dist-info/WHEEL | 6 + .../Werkzeug-0.12.2.dist-info/metadata.json | 1 + .../Werkzeug-0.12.2.dist-info/top_level.txt | 1 + .../__pycache__/easy_install.cpython-37.pyc | Bin 333 -> 333 bytes .../__pycache__/itsdangerous.cpython-37.pyc | Bin 0 -> 29348 bytes .../__pycache__/six.cpython-37.pyc | Bin 25003 -> 24991 bytes .../click-6.7.dist-info/DESCRIPTION.rst | 3 + .../click-6.7.dist-info/INSTALLER | 1 + .../click-6.7.dist-info/METADATA | 16 + .../site-packages/click-6.7.dist-info/RECORD | 41 + .../site-packages/click-6.7.dist-info/WHEEL | 6 + .../click-6.7.dist-info/metadata.json | 1 + .../click-6.7.dist-info/top_level.txt | 1 + .../python3.7/site-packages/click/__init__.py | 98 + .../click/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 2741 bytes .../__pycache__/_bashcomplete.cpython-37.pyc | Bin 0 -> 2391 bytes .../click/__pycache__/_compat.cpython-37.pyc | Bin 0 -> 15450 bytes .../__pycache__/_termui_impl.cpython-37.pyc | Bin 0 -> 12923 bytes .../__pycache__/_textwrap.cpython-37.pyc | Bin 0 -> 1350 bytes .../__pycache__/_unicodefun.cpython-37.pyc | Bin 0 -> 3226 bytes .../__pycache__/_winconsole.cpython-37.pyc | Bin 0 -> 7456 bytes .../click/__pycache__/core.cpython-37.pyc | Bin 0 -> 56579 bytes .../__pycache__/decorators.cpython-37.pyc | Bin 0 -> 11496 bytes .../__pycache__/exceptions.cpython-37.pyc | Bin 0 -> 7752 bytes .../__pycache__/formatting.cpython-37.pyc | Bin 0 -> 8566 bytes .../click/__pycache__/globals.cpython-37.pyc | Bin 0 -> 1898 bytes .../click/__pycache__/parser.cpython-37.pyc | Bin 0 -> 11485 bytes .../click/__pycache__/termui.cpython-37.pyc | Bin 0 -> 18863 bytes .../click/__pycache__/testing.cpython-37.pyc | Bin 0 -> 10257 bytes .../click/__pycache__/types.cpython-37.pyc | Bin 0 -> 17506 bytes .../click/__pycache__/utils.cpython-37.pyc | Bin 0 -> 14119 bytes .../site-packages/click/_bashcomplete.py | 83 + .../python3.7/site-packages/click/_compat.py | 648 + .../site-packages/click/_termui_impl.py | 547 + .../site-packages/click/_textwrap.py | 38 + .../site-packages/click/_unicodefun.py | 118 + .../site-packages/click/_winconsole.py | 273 + .../lib/python3.7/site-packages/click/core.py | 1744 ++ .../site-packages/click/decorators.py | 304 + .../site-packages/click/exceptions.py | 201 + .../site-packages/click/formatting.py | 256 + .../python3.7/site-packages/click/globals.py | 48 + .../python3.7/site-packages/click/parser.py | 426 + .../python3.7/site-packages/click/termui.py | 539 + .../python3.7/site-packages/click/testing.py | 322 + .../python3.7/site-packages/click/types.py | 550 + .../python3.7/site-packages/click/utils.py | 415 + .../python3.7/site-packages/easy_install.py | 0 .../python3.7/site-packages/flask/__init__.py | 49 + .../python3.7/site-packages/flask/__main__.py | 14 + .../flask/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 1850 bytes .../flask/__pycache__/__main__.cpython-37.pyc | Bin 0 -> 477 bytes .../flask/__pycache__/_compat.cpython-37.pyc | Bin 0 -> 3330 bytes .../flask/__pycache__/app.cpython-37.pyc | Bin 0 -> 71414 bytes .../__pycache__/blueprints.cpython-37.pyc | Bin 0 -> 20472 bytes .../flask/__pycache__/cli.cpython-37.pyc | Bin 0 -> 25067 bytes .../flask/__pycache__/config.cpython-37.pyc | Bin 0 -> 10210 bytes .../flask/__pycache__/ctx.cpython-37.pyc | Bin 0 -> 13986 bytes .../__pycache__/debughelpers.cpython-37.pyc | Bin 0 -> 6625 bytes .../flask/__pycache__/globals.cpython-37.pyc | Bin 0 -> 1777 bytes .../flask/__pycache__/helpers.cpython-37.pyc | Bin 0 -> 33264 bytes .../flask/__pycache__/logging.cpython-37.pyc | Bin 0 -> 2406 bytes .../flask/__pycache__/sessions.cpython-37.pyc | Bin 0 -> 12272 bytes .../flask/__pycache__/signals.cpython-37.pyc | Bin 0 -> 2438 bytes .../__pycache__/templating.cpython-37.pyc | Bin 0 -> 4987 bytes .../flask/__pycache__/testing.cpython-37.pyc | Bin 0 -> 7860 bytes .../flask/__pycache__/views.cpython-37.pyc | Bin 0 -> 4800 bytes .../flask/__pycache__/wrappers.cpython-37.pyc | Bin 0 -> 6794 bytes .../python3.7/site-packages/flask/_compat.py | 101 + .../lib/python3.7/site-packages/flask/app.py | 2334 +++ .../site-packages/flask/blueprints.py | 447 + .../lib/python3.7/site-packages/flask/cli.py | 910 + .../python3.7/site-packages/flask/config.py | 269 + .../lib/python3.7/site-packages/flask/ctx.py | 457 + .../site-packages/flask/debughelpers.py | 168 + .../python3.7/site-packages/flask/globals.py | 61 + .../python3.7/site-packages/flask/helpers.py | 1051 + .../site-packages/flask/json/__init__.py | 357 + .../json/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 11443 bytes .../flask/json/__pycache__/tag.cpython-37.pyc | Bin 0 -> 11106 bytes .../python3.7/site-packages/flask/json/tag.py | 300 + .../python3.7/site-packages/flask/logging.py | 78 + .../python3.7/site-packages/flask/sessions.py | 385 + .../python3.7/site-packages/flask/signals.py | 57 + .../site-packages/flask/templating.py | 150 + .../python3.7/site-packages/flask/testing.py | 246 + .../python3.7/site-packages/flask/views.py | 158 + .../python3.7/site-packages/flask/wrappers.py | 216 + .../site-packages/flask_cors/__init__.py | 32 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 1122 bytes .../__pycache__/core.cpython-37.pyc | Bin 0 -> 10310 bytes .../__pycache__/decorator.cpython-37.pyc | Bin 0 -> 4716 bytes .../__pycache__/extension.cpython-37.pyc | Bin 0 -> 7025 bytes .../__pycache__/version.cpython-37.pyc | Bin 0 -> 218 bytes .../site-packages/flask_cors/core.py | 378 + .../site-packages/flask_cors/decorator.py | 135 + .../site-packages/flask_cors/extension.py | 186 + .../site-packages/flask_cors/version.py | 1 + .../itsdangerous-0.24.dist-info/INSTALLER | 1 + .../itsdangerous-0.24.dist-info/LICENSE | 31 + .../itsdangerous-0.24.dist-info/METADATA | 16 + .../itsdangerous-0.24.dist-info/RECORD | 8 + .../itsdangerous-0.24.dist-info/WHEEL | 5 + .../itsdangerous-0.24.dist-info/top_level.txt | 1 + .../python3.7/site-packages/itsdangerous.py | 872 + .../site-packages/jinja2/__init__.py | 83 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 2556 bytes .../jinja2/__pycache__/_compat.cpython-37.pyc | Bin 0 -> 3369 bytes .../__pycache__/_identifier.cpython-37.pyc | Bin 0 -> 1867 bytes .../__pycache__/asyncfilters.cpython-37.pyc | Bin 0 -> 4799 bytes .../__pycache__/asyncsupport.cpython-37.pyc | Bin 0 -> 8147 bytes .../jinja2/__pycache__/bccache.cpython-37.pyc | Bin 0 -> 12736 bytes .../__pycache__/compiler.cpython-37.pyc | Bin 0 -> 46865 bytes .../__pycache__/constants.cpython-37.pyc | Bin 0 -> 1730 bytes .../jinja2/__pycache__/debug.cpython-37.pyc | Bin 0 -> 9346 bytes .../__pycache__/defaults.cpython-37.pyc | Bin 0 -> 1480 bytes .../__pycache__/environment.cpython-37.pyc | Bin 0 -> 43275 bytes .../__pycache__/exceptions.cpython-37.pyc | Bin 0 -> 5044 bytes .../jinja2/__pycache__/ext.cpython-37.pyc | Bin 0 -> 20065 bytes .../jinja2/__pycache__/filters.cpython-37.pyc | Bin 0 -> 34410 bytes .../__pycache__/idtracking.cpython-37.pyc | Bin 0 -> 9980 bytes .../jinja2/__pycache__/lexer.cpython-37.pyc | Bin 0 -> 18537 bytes .../jinja2/__pycache__/loaders.cpython-37.pyc | Bin 0 -> 16600 bytes .../jinja2/__pycache__/meta.cpython-37.pyc | Bin 0 -> 3693 bytes .../__pycache__/nativetypes.cpython-37.pyc | Bin 0 -> 5149 bytes .../jinja2/__pycache__/nodes.cpython-37.pyc | Bin 0 -> 36109 bytes .../__pycache__/optimizer.cpython-37.pyc | Bin 0 -> 2060 bytes .../jinja2/__pycache__/parser.cpython-37.pyc | Bin 0 -> 25204 bytes .../jinja2/__pycache__/runtime.cpython-37.pyc | Bin 0 -> 24612 bytes .../jinja2/__pycache__/sandbox.cpython-37.pyc | Bin 0 -> 14214 bytes .../jinja2/__pycache__/tests.cpython-37.pyc | Bin 0 -> 4436 bytes .../jinja2/__pycache__/utils.cpython-37.pyc | Bin 0 -> 20813 bytes .../jinja2/__pycache__/visitor.cpython-37.pyc | Bin 0 -> 3376 bytes .../python3.7/site-packages/jinja2/_compat.py | 99 + .../site-packages/jinja2/_identifier.py | 2 + .../site-packages/jinja2/asyncfilters.py | 146 + .../site-packages/jinja2/asyncsupport.py | 256 + .../python3.7/site-packages/jinja2/bccache.py | 362 + .../site-packages/jinja2/compiler.py | 1721 ++ .../site-packages/jinja2/constants.py | 32 + .../python3.7/site-packages/jinja2/debug.py | 372 + .../site-packages/jinja2/defaults.py | 56 + .../site-packages/jinja2/environment.py | 1276 ++ .../site-packages/jinja2/exceptions.py | 146 + .../lib/python3.7/site-packages/jinja2/ext.py | 627 + .../python3.7/site-packages/jinja2/filters.py | 1190 ++ .../site-packages/jinja2/idtracking.py | 286 + .../python3.7/site-packages/jinja2/lexer.py | 739 + .../python3.7/site-packages/jinja2/loaders.py | 481 + .../python3.7/site-packages/jinja2/meta.py | 106 + .../site-packages/jinja2/nativetypes.py | 220 + .../python3.7/site-packages/jinja2/nodes.py | 999 + .../site-packages/jinja2/optimizer.py | 49 + .../python3.7/site-packages/jinja2/parser.py | 903 + .../python3.7/site-packages/jinja2/runtime.py | 813 + .../python3.7/site-packages/jinja2/sandbox.py | 486 + .../python3.7/site-packages/jinja2/tests.py | 175 + .../python3.7/site-packages/jinja2/utils.py | 647 + .../python3.7/site-packages/jinja2/visitor.py | 87 + .../site-packages/markupsafe/__init__.py | 305 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 11335 bytes .../__pycache__/_compat.cpython-37.pyc | Bin 0 -> 820 bytes .../__pycache__/_constants.cpython-37.pyc | Bin 0 -> 4388 bytes .../__pycache__/_native.cpython-37.pyc | Bin 0 -> 1453 bytes .../site-packages/markupsafe/_compat.py | 26 + .../site-packages/markupsafe/_constants.py | 267 + .../site-packages/markupsafe/_native.py | 46 + .../site-packages/markupsafe/_speedups.c | 239 + .../_speedups.cpython-37m-darwin.so | Bin 0 -> 10584 bytes .../pip-19.1.1.dist-info/INSTALLER | 1 + .../pip-19.1.1.dist-info}/LICENSE.txt | 40 +- .../pip-19.1.1.dist-info/METADATA | 75 + .../site-packages/pip-19.1.1.dist-info/RECORD | 618 + .../site-packages/pip-19.1.1.dist-info/WHEEL | 6 + .../pip-19.1.1.dist-info}/entry_points.txt | 2 +- .../pip-19.1.1.dist-info/top_level.txt | 1 + .../python3.7/site-packages/pip/__init__.py | 1 + .../python3.7/site-packages/pip/__main__.py | 38 +- .../pip/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 206 bytes .../pip/__pycache__/__main__.cpython-37.pyc | Bin 458 -> 458 bytes .../site-packages/pip/_internal/__init__.py | 78 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 1850 bytes .../__pycache__/build_env.cpython-37.pyc | Bin 0 -> 7447 bytes .../__pycache__/cache.cpython-37.pyc | Bin 0 -> 7058 bytes .../__pycache__/configuration.cpython-37.pyc | Bin 0 -> 9752 bytes .../__pycache__/download.cpython-37.pyc | Bin 0 -> 20920 bytes .../__pycache__/exceptions.cpython-37.pyc | Bin 0 -> 11750 bytes .../__pycache__/index.cpython-37.pyc | Bin 0 -> 28780 bytes .../__pycache__/locations.cpython-37.pyc | Bin 0 -> 4439 bytes .../__pycache__/pep425tags.cpython-37.pyc | Bin 0 -> 8169 bytes .../__pycache__/pyproject.cpython-37.pyc | Bin 0 -> 3186 bytes .../__pycache__/resolve.cpython-37.pyc | Bin 0 -> 9104 bytes .../__pycache__/wheel.cpython-37.pyc | Bin 0 -> 26080 bytes .../site-packages/pip/_internal/build_env.py | 215 + .../site-packages/pip/_internal/cache.py | 426 +- .../pip/_internal/cli/__init__.py | 4 + .../cli/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 281 bytes .../__pycache__/autocompletion.cpython-37.pyc | Bin 0 -> 5094 bytes .../__pycache__/base_command.cpython-37.pyc | Bin 0 -> 7801 bytes .../cli/__pycache__/cmdoptions.cpython-37.pyc | Bin 0 -> 16865 bytes .../__pycache__/main_parser.cpython-37.pyc | Bin 0 -> 2367 bytes .../cli/__pycache__/parser.cpython-37.pyc | Bin 0 -> 8945 bytes .../__pycache__/status_codes.cpython-37.pyc | Bin 0 -> 410 bytes .../pip/_internal/cli/autocompletion.py | 152 + .../pip/_internal/cli/base_command.py | 713 +- .../pip/_internal/cli}/cmdoptions.py | 1418 +- .../pip/_internal/cli/main_parser.py | 104 + .../site-packages/pip/_internal/cli/parser.py | 501 +- .../pip/_internal/cli}/status_codes.py | 16 +- .../pip/_internal/commands/__init__.py | 158 +- .../__pycache__/__init__.cpython-37.pyc | Bin 2504 -> 2509 bytes .../commands/__pycache__/check.cpython-37.pyc | Bin 0 -> 1334 bytes .../__pycache__/completion.cpython-37.pyc | Bin 3078 -> 3083 bytes .../__pycache__/configuration.cpython-37.pyc | Bin 0 -> 6911 bytes .../__pycache__/download.cpython-37.pyc | Bin 0 -> 4722 bytes .../__pycache__/freeze.cpython-37.pyc | Bin 2855 -> 2879 bytes .../commands/__pycache__/hash.cpython-37.pyc | Bin 2064 -> 2073 bytes .../commands/__pycache__/help.cpython-37.pyc | Bin 0 -> 1249 bytes .../__pycache__/install.cpython-37.pyc | Bin 0 -> 12896 bytes .../commands/__pycache__/list.cpython-37.pyc | Bin 0 -> 8740 bytes .../__pycache__/search.cpython-37.pyc | Bin 4294 -> 4315 bytes .../commands/__pycache__/show.cpython-37.pyc | Bin 5821 -> 5896 bytes .../__pycache__/uninstall.cpython-37.pyc | Bin 0 -> 2705 bytes .../commands/__pycache__/wheel.cpython-37.pyc | Bin 0 -> 5008 bytes .../pip/_internal/commands/check.py | 83 +- .../pip/_internal/commands/completion.py | 188 +- .../pip/_internal/commands/configuration.py | 480 +- .../pip/_internal/commands/download.py | 409 +- .../pip/_internal/commands/freeze.py | 192 +- .../pip/_internal/commands/hash.py | 114 +- .../pip/_internal/commands/help.py | 73 +- .../pip/_internal/commands/install.py | 1089 +- .../pip/_internal/commands/list.py | 645 +- .../pip/_internal/commands/search.py | 270 +- .../pip/_internal/commands/show.py | 332 +- .../pip/_internal/commands/uninstall.py | 149 +- .../pip/_internal/commands/wheel.py | 365 +- .../pip/_internal/configuration.py | 762 +- .../site-packages/pip/_internal/download.py | 1901 +- .../site-packages/pip/_internal/exceptions.py | 523 +- .../site-packages/pip/_internal/index.py | 2225 ++- .../site-packages/pip/_internal/locations.py | 405 +- .../pip/_internal/models/__init__.py | 2 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 269 bytes .../__pycache__/candidate.cpython-37.pyc | Bin 0 -> 1302 bytes .../__pycache__/format_control.cpython-37.pyc | Bin 0 -> 2272 bytes .../models/__pycache__/index.cpython-37.pyc | Bin 0 -> 1173 bytes .../models/__pycache__/link.cpython-37.pyc | Bin 0 -> 4992 bytes .../pip/_internal/models/candidate.py | 31 + .../pip/_internal/models/format_control.py | 73 + .../pip/_internal/models/index.py | 31 + .../pip/_internal/models/link.py | 163 + .../pip/_internal/operations}/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 205 bytes .../__pycache__/check.cpython-37.pyc | Bin 0 -> 3635 bytes .../__pycache__/freeze.cpython-37.pyc | Bin 0 -> 5620 bytes .../__pycache__/prepare.cpython-37.pyc | Bin 0 -> 10549 bytes .../pip/_internal/operations/check.py | 261 +- .../pip/_internal/operations/freeze.py | 499 +- .../pip/_internal/operations/prepare.py | 806 +- .../site-packages/pip/_internal/pep425tags.py | 698 +- .../site-packages/pip/_internal/pyproject.py | 171 + .../pip/_internal/req/__init__.py | 147 +- .../req/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 1716 bytes .../__pycache__/constructors.cpython-37.pyc | Bin 0 -> 7619 bytes .../req/__pycache__/req_file.cpython-37.pyc | Bin 0 -> 9232 bytes .../__pycache__/req_install.cpython-37.pyc | Bin 0 -> 24994 bytes .../req/__pycache__/req_set.cpython-37.pyc | Bin 0 -> 5677 bytes .../__pycache__/req_tracker.cpython-37.pyc | Bin 0 -> 3228 bytes .../__pycache__/req_uninstall.cpython-37.pyc | Bin 0 -> 17291 bytes .../pip/_internal/req/constructors.py | 340 + .../pip/_internal/req/req_file.py | 721 +- .../pip/_internal/req/req_install.py | 2143 +-- .../pip/_internal/req/req_set.py | 193 + .../pip/_internal/req/req_tracker.py | 96 + .../pip/_internal/req/req_uninstall.py | 1088 +- .../site-packages/pip/_internal/resolve.py | 747 +- .../pip/_internal/utils}/__init__.py | 0 .../utils/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 200 bytes .../utils/__pycache__/appdirs.cpython-37.pyc | Bin 7915 -> 8031 bytes .../utils/__pycache__/compat.cpython-37.pyc | Bin 0 -> 6148 bytes .../__pycache__/deprecation.cpython-37.pyc | Bin 0 -> 2609 bytes .../utils/__pycache__/encoding.cpython-37.pyc | Bin 0 -> 1284 bytes .../__pycache__/filesystem.cpython-37.pyc | Bin 0 -> 669 bytes .../utils/__pycache__/glibc.cpython-37.pyc | Bin 0 -> 1688 bytes .../utils/__pycache__/hashes.cpython-37.pyc | Bin 0 -> 3607 bytes .../utils/__pycache__/logging.cpython-37.pyc | Bin 0 -> 9031 bytes .../utils/__pycache__/misc.cpython-37.pyc | Bin 0 -> 25027 bytes .../utils/__pycache__/models.cpython-37.pyc | Bin 0 -> 1949 bytes .../utils/__pycache__/outdated.cpython-37.pyc | Bin 0 -> 3950 bytes .../__pycache__/packaging.cpython-37.pyc | Bin 0 -> 2621 bytes .../setuptools_build.cpython-37.pyc | Bin 395 -> 395 bytes .../utils/__pycache__/temp_dir.cpython-37.pyc | Bin 0 -> 4922 bytes .../utils/__pycache__/typing.cpython-37.pyc | Bin 1320 -> 1330 bytes .../utils/__pycache__/ui.cpython-37.pyc | Bin 0 -> 11760 bytes .../pip/_internal/utils/appdirs.py | 526 +- .../pip/_internal/utils}/compat.py | 499 +- .../pip/_internal/utils/deprecation.py | 93 + .../pip/_internal/utils/encoding.py | 72 +- .../pip/_internal/utils/filesystem.py | 58 +- .../pip/_internal/utils/glibc.py | 177 +- .../pip/_internal/utils/hashes.py | 209 +- .../pip/_internal/utils/logging.py | 371 + .../site-packages/pip/_internal/utils/misc.py | 1862 +- .../pip/_internal/utils/models.py | 40 + .../pip/_internal/utils/outdated.py | 325 +- .../pip/_internal/utils/packaging.py | 155 +- .../pip/_internal/utils/setuptools_build.py | 16 +- .../pip/_internal/utils/temp_dir.py | 155 + .../pip/_internal/utils/typing.py | 58 +- .../site-packages/pip/_internal/utils/ui.py | 845 +- .../pip/_internal/vcs/__init__.py | 604 + .../vcs/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 17040 bytes .../vcs/__pycache__/bazaar.cpython-37.pyc | Bin 0 -> 3441 bytes .../vcs/__pycache__/git.cpython-37.pyc | Bin 0 -> 9085 bytes .../vcs/__pycache__/mercurial.cpython-37.pyc | Bin 0 -> 3703 bytes .../vcs/__pycache__/subversion.cpython-37.pyc | Bin 0 -> 6732 bytes .../site-packages/pip/_internal/vcs/bazaar.py | 216 +- .../site-packages/pip/_internal/vcs/git.py | 673 +- .../pip/_internal/vcs/mercurial.py | 210 +- .../pip/_internal/vcs/subversion.py | 234 + .../site-packages/pip/_internal/wheel.py | 1915 +- .../site-packages/pip/_vendor/__init__.py | 218 +- .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 2867 bytes .../__pycache__/appdirs.cpython-37.pyc | Bin 20617 -> 20617 bytes .../_vendor/__pycache__/distro.cpython-37.pyc | Bin 33491 -> 36330 bytes .../__pycache__/ipaddress.cpython-37.pyc | Bin 66460 -> 66460 bytes .../__pycache__/pyparsing.cpython-37.pyc | Bin 0 -> 221818 bytes .../__pycache__/retrying.cpython-37.pyc | Bin 8098 -> 8098 bytes .../_vendor/__pycache__/six.cpython-37.pyc | Bin 0 -> 26422 bytes .../site-packages/pip/_vendor/appdirs.py | 1208 +- .../pip/_vendor/cachecontrol/__init__.py | 22 +- .../__pycache__/__init__.cpython-37.pyc | Bin 558 -> 558 bytes .../__pycache__/_cmd.cpython-37.pyc | Bin 1567 -> 1561 bytes .../__pycache__/adapter.cpython-37.pyc | Bin 3067 -> 3044 bytes .../__pycache__/cache.cpython-37.pyc | Bin 1769 -> 1774 bytes .../__pycache__/compat.cpython-37.pyc | Bin 765 -> 765 bytes .../__pycache__/controller.cpython-37.pyc | Bin 7648 -> 7644 bytes .../__pycache__/filewrapper.cpython-37.pyc | Bin 2162 -> 2162 bytes .../__pycache__/heuristics.cpython-37.pyc | Bin 4697 -> 4682 bytes .../__pycache__/serialize.cpython-37.pyc | Bin 4255 -> 4246 bytes .../__pycache__/wrapper.cpython-37.pyc | Bin 666 -> 666 bytes .../pip/_vendor/cachecontrol/_cmd.py | 117 +- .../pip/_vendor/cachecontrol/adapter.py | 267 +- .../pip/_vendor/cachecontrol/cache.py | 78 +- .../_vendor/cachecontrol/caches/__init__.py | 4 +- .../__pycache__/__init__.cpython-37.pyc | Bin 302 -> 302 bytes .../__pycache__/file_cache.cpython-37.pyc | Bin 3222 -> 3236 bytes .../__pycache__/redis_cache.cpython-37.pyc | Bin 0 -> 1558 bytes .../_vendor/cachecontrol/caches/file_cache.py | 279 +- .../cachecontrol/caches/redis_cache.py | 76 +- .../pip/_vendor/cachecontrol/compat.py | 58 +- .../pip/_vendor/cachecontrol/controller.py | 740 +- .../pip/_vendor/cachecontrol/filewrapper.py | 158 +- .../pip/_vendor/cachecontrol/heuristics.py | 273 +- .../pip/_vendor/cachecontrol/serialize.py | 380 +- .../pip/_vendor/cachecontrol/wrapper.py | 29 + .../pip/_vendor/certifi/__init__.py | 3 + .../pip/_vendor/certifi/__main__.py | 2 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 265 bytes .../__pycache__/__main__.cpython-37.pyc | Bin 0 -> 268 bytes .../certifi/__pycache__/core.cpython-37.pyc | Bin 0 -> 477 bytes .../pip/_vendor/certifi/cacert.pem | 677 +- .../site-packages/pip/_vendor/certifi/core.py | 15 + .../pip/_vendor/chardet/__init__.py | 78 +- .../__pycache__/__init__.cpython-37.pyc | Bin 852 -> 852 bytes .../__pycache__/big5freq.cpython-37.pyc | Bin 27187 -> 27187 bytes .../__pycache__/big5prober.cpython-37.pyc | Bin 1128 -> 1128 bytes .../chardistribution.cpython-37.pyc | Bin 6314 -> 6314 bytes .../charsetgroupprober.cpython-37.pyc | Bin 2235 -> 2235 bytes .../__pycache__/charsetprober.cpython-37.pyc | Bin 3445 -> 3445 bytes .../codingstatemachine.cpython-37.pyc | Bin 2892 -> 2892 bytes .../chardet/__pycache__/compat.cpython-37.pyc | Bin 363 -> 363 bytes .../__pycache__/cp949prober.cpython-37.pyc | Bin 1135 -> 1135 bytes .../chardet/__pycache__/enums.cpython-37.pyc | Bin 2626 -> 2626 bytes .../__pycache__/escprober.cpython-37.pyc | Bin 2613 -> 2613 bytes .../chardet/__pycache__/escsm.cpython-37.pyc | Bin 7074 -> 7074 bytes .../__pycache__/eucjpprober.cpython-37.pyc | Bin 2421 -> 2421 bytes .../__pycache__/euckrfreq.cpython-37.pyc | Bin 12071 -> 12071 bytes .../__pycache__/euckrprober.cpython-37.pyc | Bin 1136 -> 1136 bytes .../__pycache__/euctwfreq.cpython-37.pyc | Bin 27191 -> 27191 bytes .../__pycache__/euctwprober.cpython-37.pyc | Bin 1136 -> 1136 bytes .../__pycache__/gb2312freq.cpython-37.pyc | Bin 19115 -> 19115 bytes .../__pycache__/gb2312prober.cpython-37.pyc | Bin 1144 -> 1144 bytes .../__pycache__/hebrewprober.cpython-37.pyc | Bin 2978 -> 2978 bytes .../__pycache__/jisfreq.cpython-37.pyc | Bin 22143 -> 22143 bytes .../chardet/__pycache__/jpcntx.cpython-37.pyc | Bin 38022 -> 38022 bytes .../langbulgarianmodel.cpython-37.pyc | Bin 23636 -> 23636 bytes .../langcyrillicmodel.cpython-37.pyc | Bin 29092 -> 29092 bytes .../__pycache__/langgreekmodel.cpython-37.pyc | Bin 23594 -> 23594 bytes .../langhebrewmodel.cpython-37.pyc | Bin 22223 -> 22223 bytes .../langhungarianmodel.cpython-37.pyc | Bin 23625 -> 23625 bytes .../__pycache__/langthaimodel.cpython-37.pyc | Bin 22202 -> 22202 bytes .../langturkishmodel.cpython-37.pyc | Bin 22225 -> 22225 bytes .../__pycache__/latin1prober.cpython-37.pyc | Bin 2935 -> 2935 bytes .../mbcharsetprober.cpython-37.pyc | Bin 2240 -> 2240 bytes .../mbcsgroupprober.cpython-37.pyc | Bin 1131 -> 1131 bytes .../chardet/__pycache__/mbcssm.cpython-37.pyc | Bin 15686 -> 15686 bytes .../sbcharsetprober.cpython-37.pyc | Bin 2993 -> 2993 bytes .../sbcsgroupprober.cpython-37.pyc | Bin 1621 -> 1621 bytes .../__pycache__/sjisprober.cpython-37.pyc | Bin 2447 -> 2447 bytes .../universaldetector.cpython-37.pyc | Bin 5837 -> 5837 bytes .../__pycache__/utf8prober.cpython-37.pyc | Bin 1978 -> 1978 bytes .../__pycache__/version.cpython-37.pyc | Bin 447 -> 447 bytes .../pip/_vendor/chardet/big5freq.py | 772 +- .../pip/_vendor/chardet/big5prober.py | 94 +- .../pip/_vendor/chardet/chardistribution.py | 466 +- .../pip/_vendor/chardet/charsetgroupprober.py | 212 +- .../pip/_vendor/chardet/charsetprober.py | 290 +- .../pip/_vendor/chardet/cli/__init__.py | 0 .../cli/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 204 bytes .../cli/__pycache__/chardetect.cpython-37.pyc | Bin 2693 -> 2693 bytes .../pip/_vendor/chardet/cli/chardetect.py | 170 +- .../pip/_vendor/chardet/codingstatemachine.py | 176 +- .../pip/_vendor/chardet/compat.py | 68 +- .../pip/_vendor/chardet/cp949prober.py | 98 +- .../pip/_vendor/chardet/enums.py | 152 +- .../pip/_vendor/chardet/escprober.py | 202 +- .../pip/_vendor/chardet/escsm.py | 492 +- .../pip/_vendor/chardet/eucjpprober.py | 184 +- .../pip/_vendor/chardet/euckrfreq.py | 390 +- .../pip/_vendor/chardet/euckrprober.py | 94 +- .../pip/_vendor/chardet/euctwfreq.py | 774 +- .../pip/_vendor/chardet/euctwprober.py | 92 +- .../pip/_vendor/chardet/gb2312freq.py | 566 +- .../pip/_vendor/chardet/gb2312prober.py | 92 +- .../pip/_vendor/chardet/hebrewprober.py | 584 +- .../pip/_vendor/chardet/jisfreq.py | 650 +- .../pip/_vendor/chardet/jpcntx.py | 466 +- .../pip/_vendor/chardet/langbulgarianmodel.py | 456 +- .../pip/_vendor/chardet/langcyrillicmodel.py | 666 +- .../pip/_vendor/chardet/langgreekmodel.py | 450 +- .../pip/_vendor/chardet/langhebrewmodel.py | 400 +- .../pip/_vendor/chardet/langhungarianmodel.py | 450 +- .../pip/_vendor/chardet/langthaimodel.py | 398 +- .../pip/_vendor/chardet/langturkishmodel.py | 386 +- .../pip/_vendor/chardet/latin1prober.py | 290 +- .../pip/_vendor/chardet/mbcharsetprober.py | 182 +- .../pip/_vendor/chardet/mbcsgroupprober.py | 108 +- .../pip/_vendor/chardet/mbcssm.py | 1144 +- .../pip/_vendor/chardet/sbcharsetprober.py | 264 +- .../pip/_vendor/chardet/sbcsgroupprober.py | 146 +- .../pip/_vendor/chardet/sjisprober.py | 184 +- .../pip/_vendor/chardet/universaldetector.py | 572 +- .../pip/_vendor/chardet/utf8prober.py | 164 +- .../pip/_vendor/chardet/version.py | 18 +- .../pip/_vendor/colorama/__init__.py | 13 +- .../__pycache__/__init__.cpython-37.pyc | Bin 452 -> 452 bytes .../colorama/__pycache__/ansi.cpython-37.pyc | Bin 3350 -> 3350 bytes .../__pycache__/ansitowin32.cpython-37.pyc | Bin 0 -> 7606 bytes .../__pycache__/initialise.cpython-37.pyc | Bin 1671 -> 1671 bytes .../colorama/__pycache__/win32.cpython-37.pyc | Bin 0 -> 3865 bytes .../__pycache__/winterm.cpython-37.pyc | Bin 0 -> 4613 bytes .../pip/_vendor/colorama/ansi.py | 204 +- .../pip/_vendor/colorama/ansitowin32.py | 493 +- .../pip/_vendor/colorama/initialise.py | 162 +- .../pip/_vendor/colorama/win32.py | 308 +- .../pip/_vendor/colorama/winterm.py | 331 +- .../pip/_vendor/distlib/__init__.py | 46 +- .../__pycache__/__init__.cpython-37.pyc | Bin 1050 -> 1050 bytes .../distlib/__pycache__/compat.cpython-37.pyc | Bin 32060 -> 32060 bytes .../__pycache__/database.cpython-37.pyc | Bin 42533 -> 42581 bytes .../distlib/__pycache__/index.cpython-37.pyc | Bin 17346 -> 17346 bytes .../__pycache__/locators.cpython-37.pyc | Bin 38653 -> 38732 bytes .../__pycache__/manifest.cpython-37.pyc | Bin 10298 -> 10298 bytes .../__pycache__/markers.cpython-37.pyc | Bin 4484 -> 4484 bytes .../__pycache__/metadata.cpython-37.pyc | Bin 27693 -> 27694 bytes .../__pycache__/resources.cpython-37.pyc | Bin 10894 -> 10894 bytes .../__pycache__/scripts.cpython-37.pyc | Bin 11070 -> 11084 bytes .../distlib/__pycache__/util.cpython-37.pyc | Bin 47891 -> 47962 bytes .../__pycache__/version.cpython-37.pyc | Bin 20434 -> 20434 bytes .../distlib/__pycache__/wheel.cpython-37.pyc | Bin 25084 -> 25370 bytes .../pip/_vendor/distlib/_backport/__init__.py | 12 +- .../__pycache__/__init__.cpython-37.pyc | Bin 492 -> 492 bytes .../_backport/__pycache__/misc.cpython-37.pyc | Bin 1089 -> 1089 bytes .../__pycache__/shutil.cpython-37.pyc | Bin 21405 -> 21405 bytes .../__pycache__/sysconfig.cpython-37.pyc | Bin 15870 -> 15870 bytes .../__pycache__/tarfile.cpython-37.pyc | Bin 62735 -> 62735 bytes .../pip/_vendor/distlib/_backport/misc.py | 82 +- .../pip/_vendor/distlib/_backport/shutil.py | 1522 +- .../_vendor/distlib/_backport/sysconfig.cfg | 168 +- .../_vendor/distlib/_backport/sysconfig.py | 1576 +- .../pip/_vendor/distlib/_backport/tarfile.py | 5214 ++--- .../pip/_vendor/distlib/compat.py | 2240 +-- .../pip/_vendor/distlib/database.py | 2675 +-- .../pip/_vendor/distlib/index.py | 1032 +- .../pip/_vendor/distlib/locators.py | 2587 +-- .../pip/_vendor/distlib/manifest.py | 786 +- .../pip/_vendor/distlib/markers.py | 262 +- .../pip/_vendor/distlib/metadata.py | 2185 +-- .../pip/_vendor/distlib/resources.py | 710 +- .../pip/_vendor/distlib/scripts.py | 832 +- .../site-packages/pip/_vendor/distlib/t32.exe | Bin .../site-packages/pip/_vendor/distlib/t64.exe | Bin .../site-packages/pip/_vendor/distlib/util.py | 3511 ++-- .../pip/_vendor/distlib/version.py | 1472 +- .../site-packages/pip/_vendor/distlib/w32.exe | Bin .../site-packages/pip/_vendor/distlib/w64.exe | Bin .../pip/_vendor/distlib/wheel.py | 1972 +- .../site-packages/pip/_vendor/distro.py | 2320 +-- .../pip/_vendor/html5lib/__init__.py | 70 +- .../__pycache__/__init__.cpython-37.pyc | Bin 1321 -> 1321 bytes .../__pycache__/_ihatexml.cpython-37.pyc | Bin 13768 -> 13768 bytes .../__pycache__/_inputstream.cpython-37.pyc | Bin 22659 -> 22659 bytes .../__pycache__/_tokenizer.cpython-37.pyc | Bin 41560 -> 41560 bytes .../__pycache__/_utils.cpython-37.pyc | Bin 3313 -> 3313 bytes .../__pycache__/constants.cpython-37.pyc | Bin 66225 -> 66225 bytes .../__pycache__/html5parser.cpython-37.pyc | Bin 97822 -> 97822 bytes .../__pycache__/serializer.cpython-37.pyc | Bin 10838 -> 10838 bytes .../pip/_vendor/html5lib/_ihatexml.py | 576 +- .../pip/_vendor/html5lib/_inputstream.py | 1846 +- .../pip/_vendor/html5lib/_tokenizer.py | 3442 ++-- .../pip/_vendor/html5lib/_trie/__init__.py | 28 +- .../_trie/__pycache__/__init__.cpython-37.pyc | Bin 434 -> 434 bytes .../_trie/__pycache__/_base.cpython-37.pyc | Bin 1517 -> 1517 bytes .../_trie/__pycache__/datrie.cpython-37.pyc | Bin 2036 -> 2036 bytes .../_trie/__pycache__/py.cpython-37.pyc | Bin 2239 -> 2239 bytes .../pip/_vendor/html5lib/_trie/_base.py | 74 +- .../pip/_vendor/html5lib/_trie/datrie.py | 88 +- .../pip/_vendor/html5lib/_trie/py.py | 134 +- .../pip/_vendor/html5lib/_utils.py | 248 +- .../pip/_vendor/html5lib/constants.py | 5894 +++--- .../pip/_vendor/html5lib/filters}/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 209 bytes .../alphabeticalattributes.cpython-37.pyc | Bin 1325 -> 1325 bytes .../filters/__pycache__/base.cpython-37.pyc | Bin 859 -> 859 bytes .../inject_meta_charset.cpython-37.pyc | Bin 1879 -> 1879 bytes .../filters/__pycache__/lint.cpython-37.pyc | Bin 2643 -> 2643 bytes .../__pycache__/optionaltags.cpython-37.pyc | Bin 2770 -> 2770 bytes .../__pycache__/sanitizer.cpython-37.pyc | Bin 16445 -> 16445 bytes .../__pycache__/whitespace.cpython-37.pyc | Bin 1363 -> 1363 bytes .../filters/alphabeticalattributes.py | 58 +- .../pip/_vendor/html5lib/filters/base.py | 24 +- .../html5lib/filters/inject_meta_charset.py | 146 +- .../pip/_vendor/html5lib/filters/lint.py | 186 +- .../_vendor/html5lib/filters/optionaltags.py | 414 +- .../pip/_vendor/html5lib/filters/sanitizer.py | 1792 +- .../_vendor/html5lib/filters/whitespace.py | 76 +- .../pip/_vendor/html5lib/html5parser.py | 5582 +++--- .../pip/_vendor/html5lib/serializer.py | 818 +- .../_vendor/html5lib/treeadapters/__init__.py | 60 +- .../__pycache__/__init__.cpython-37.pyc | Bin 948 -> 948 bytes .../__pycache__/genshi.cpython-37.pyc | Bin 1545 -> 1545 bytes .../__pycache__/sax.cpython-37.pyc | Bin 1495 -> 1495 bytes .../_vendor/html5lib/treeadapters/genshi.py | 108 +- .../pip/_vendor/html5lib/treeadapters/sax.py | 100 +- .../_vendor/html5lib/treebuilders/__init__.py | 176 +- .../__pycache__/__init__.cpython-37.pyc | Bin 3329 -> 3329 bytes .../__pycache__/base.cpython-37.pyc | Bin 11252 -> 11252 bytes .../__pycache__/dom.cpython-37.pyc | Bin 9282 -> 9282 bytes .../__pycache__/etree.cpython-37.pyc | Bin 11861 -> 11861 bytes .../__pycache__/etree_lxml.cpython-37.pyc | Bin 11801 -> 11801 bytes .../pip/_vendor/html5lib/treebuilders/base.py | 834 +- .../pip/_vendor/html5lib/treebuilders/dom.py | 472 +- .../_vendor/html5lib/treebuilders/etree.py | 680 +- .../html5lib/treebuilders/etree_lxml.py | 732 +- .../_vendor/html5lib/treewalkers/__init__.py | 308 +- .../__pycache__/__init__.cpython-37.pyc | Bin 4006 -> 4006 bytes .../__pycache__/base.cpython-37.pyc | Bin 7002 -> 7002 bytes .../__pycache__/dom.cpython-37.pyc | Bin 1731 -> 1731 bytes .../__pycache__/etree.cpython-37.pyc | Bin 3538 -> 3538 bytes .../__pycache__/etree_lxml.cpython-37.pyc | Bin 6647 -> 6647 bytes .../__pycache__/genshi.cpython-37.pyc | Bin 1905 -> 1905 bytes .../pip/_vendor/html5lib/treewalkers/base.py | 504 +- .../pip/_vendor/html5lib/treewalkers/dom.py | 86 +- .../pip/_vendor/html5lib/treewalkers/etree.py | 260 +- .../html5lib/treewalkers/etree_lxml.py | 426 +- .../_vendor/html5lib/treewalkers/genshi.py | 138 +- .../pip/_vendor/idna/__init__.py | 4 +- .../idna/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 266 bytes .../idna/__pycache__/codec.cpython-37.pyc | Bin 3073 -> 3073 bytes .../idna/__pycache__/compat.cpython-37.pyc | Bin 626 -> 626 bytes .../idna/__pycache__/core.cpython-37.pyc | Bin 0 -> 9069 bytes .../idna/__pycache__/idnadata.cpython-37.pyc | Bin 0 -> 21440 bytes .../idna/__pycache__/intranges.cpython-37.pyc | Bin 1806 -> 1806 bytes .../__pycache__/package_data.cpython-37.pyc | Bin 0 -> 220 bytes .../idna/__pycache__/uts46data.cpython-37.pyc | Bin 0 -> 176100 bytes .../site-packages/pip/_vendor/idna/codec.py | 236 +- .../site-packages/pip/_vendor/idna/compat.py | 24 +- .../site-packages/pip/_vendor/idna/core.py | 783 +- .../pip/_vendor/idna/idnadata.py | 3564 ++-- .../pip/_vendor/idna/intranges.py | 106 +- .../pip/_vendor/idna/package_data.py | 2 + .../pip/_vendor/idna/uts46data.py | 15839 ++++++++-------- .../site-packages/pip/_vendor/ipaddress.py | 4838 ++--- .../pip/_vendor/lockfile/__init__.py | 694 +- .../__pycache__/__init__.cpython-37.pyc | Bin 9916 -> 9916 bytes .../__pycache__/linklockfile.cpython-37.pyc | Bin 2297 -> 2297 bytes .../__pycache__/mkdirlockfile.cpython-37.pyc | Bin 2659 -> 2659 bytes .../__pycache__/pidlockfile.cpython-37.pyc | Bin 4859 -> 4859 bytes .../__pycache__/sqlitelockfile.cpython-37.pyc | Bin 3758 -> 3758 bytes .../symlinklockfile.cpython-37.pyc | Bin 2182 -> 2182 bytes .../pip/_vendor/lockfile/linklockfile.py | 146 +- .../pip/_vendor/lockfile/mkdirlockfile.py | 168 +- .../pip/_vendor/lockfile/pidlockfile.py | 380 +- .../pip/_vendor/lockfile/sqlitelockfile.py | 312 +- .../pip/_vendor/lockfile/symlinklockfile.py | 140 +- .../pip/_vendor/msgpack/__init__.py | 132 +- .../__pycache__/__init__.cpython-37.pyc | Bin 2078 -> 2078 bytes .../__pycache__/_version.cpython-37.pyc | Bin 0 -> 227 bytes .../__pycache__/exceptions.cpython-37.pyc | Bin 2183 -> 2183 bytes .../__pycache__/fallback.cpython-37.pyc | Bin 24555 -> 24555 bytes .../pip/_vendor/msgpack/_version.py | 2 +- .../pip/_vendor/msgpack/exceptions.py | 82 +- .../pip/_vendor/msgpack/fallback.py | 1954 +- .../pip/_vendor/packaging/__about__.py | 48 +- .../pip/_vendor/packaging/__init__.py | 40 +- .../__pycache__/__about__.cpython-37.pyc | Bin 728 -> 740 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 566 -> 578 bytes .../__pycache__/_compat.cpython-37.pyc | Bin 1018 -> 1018 bytes .../__pycache__/_structures.cpython-37.pyc | Bin 2870 -> 2870 bytes .../__pycache__/markers.cpython-37.pyc | Bin 8869 -> 8873 bytes .../__pycache__/requirements.cpython-37.pyc | Bin 3887 -> 3991 bytes .../__pycache__/specifiers.cpython-37.pyc | Bin 19796 -> 19768 bytes .../__pycache__/utils.cpython-37.pyc | Bin 1464 -> 1456 bytes .../__pycache__/version.cpython-37.pyc | Bin 11982 -> 11960 bytes .../pip/_vendor/packaging/_compat.py | 61 +- .../pip/_vendor/packaging/_structures.py | 138 +- .../pip/_vendor/packaging/markers.py | 597 +- .../pip/_vendor/packaging/requirements.py | 268 +- .../pip/_vendor/packaging/specifiers.py | 1523 +- .../pip/_vendor/packaging/utils.py | 120 +- .../pip/_vendor/packaging/version.py | 861 +- .../pip/_vendor/pep517/__init__.py | 4 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 291 bytes .../__pycache__/_in_process.cpython-37.pyc | Bin 0 -> 5634 bytes .../pep517/__pycache__/build.cpython-37.pyc | Bin 0 -> 2769 bytes .../pep517/__pycache__/check.cpython-37.pyc | Bin 0 -> 4817 bytes .../__pycache__/colorlog.cpython-37.pyc | Bin 0 -> 2923 bytes .../pep517/__pycache__/compat.cpython-37.pyc | Bin 0 -> 1027 bytes .../__pycache__/envbuild.cpython-37.pyc | Bin 0 -> 4211 bytes .../__pycache__/wrappers.cpython-37.pyc | Bin 0 -> 5492 bytes .../pip/_vendor/pep517/_in_process.py | 207 + .../site-packages/pip/_vendor/pep517/build.py | 108 + .../site-packages/pip/_vendor/pep517/check.py | 202 + .../pip/_vendor/pep517/colorlog.py | 115 + .../pip/_vendor/pep517/compat.py | 23 + .../pip/_vendor/pep517/envbuild.py | 158 + .../pip/_vendor/pep517/wrappers.py | 163 + .../pip/_vendor/pkg_resources/__init__.py | 6411 ++++--- .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 99587 bytes .../__pycache__/py31compat.cpython-37.pyc | Bin 0 -> 651 bytes .../pip/_vendor}/pkg_resources/py31compat.py | 5 +- .../pip/_vendor/progress/__init__.py | 304 +- .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 5567 bytes .../progress/__pycache__/bar.cpython-37.pyc | Bin 0 -> 2659 bytes .../__pycache__/counter.cpython-37.pyc | Bin 0 -> 1471 bytes .../__pycache__/spinner.cpython-37.pyc | Bin 0 -> 1436 bytes .../site-packages/pip/_vendor/progress/bar.py | 179 +- .../pip/_vendor/progress/counter.py | 89 +- .../pip/_vendor/progress/spinner.py | 87 +- .../site-packages/pip}/_vendor/pyparsing.py | 12189 ++++++------ .../pip/_vendor/pytoml/__init__.py | 4 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 385 bytes .../pytoml/__pycache__/core.cpython-37.pyc | Bin 948 -> 948 bytes .../pytoml/__pycache__/parser.cpython-37.pyc | Bin 0 -> 10065 bytes .../pytoml/__pycache__/test.cpython-37.pyc | Bin 0 -> 1248 bytes .../pytoml/__pycache__/utils.cpython-37.pyc | Bin 0 -> 2147 bytes .../pytoml/__pycache__/writer.cpython-37.pyc | Bin 0 -> 3582 bytes .../site-packages/pip/_vendor/pytoml/core.py | 26 +- .../pip/_vendor/pytoml/parser.py | 715 +- .../site-packages/pip/_vendor/pytoml/test.py | 30 + .../site-packages/pip/_vendor/pytoml/utils.py | 67 + .../pip/_vendor/pytoml/writer.py | 233 +- .../pip/_vendor/requests/__init__.py | 256 +- .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 3496 bytes .../__pycache__/__version__.cpython-37.pyc | Bin 0 -> 559 bytes .../_internal_utils.cpython-37.pyc | Bin 1317 -> 1317 bytes .../__pycache__/adapters.cpython-37.pyc | Bin 16518 -> 16894 bytes .../requests/__pycache__/api.cpython-37.pyc | Bin 6484 -> 6500 bytes .../requests/__pycache__/auth.cpython-37.pyc | Bin 7845 -> 8351 bytes .../requests/__pycache__/certs.cpython-37.pyc | Bin 642 -> 642 bytes .../__pycache__/compat.cpython-37.pyc | Bin 0 -> 1621 bytes .../__pycache__/cookies.cpython-37.pyc | Bin 18567 -> 18796 bytes .../__pycache__/exceptions.cpython-37.pyc | Bin 5330 -> 5514 bytes .../requests/__pycache__/help.cpython-37.pyc | Bin 2703 -> 2695 bytes .../requests/__pycache__/hooks.cpython-37.pyc | Bin 0 -> 989 bytes .../__pycache__/models.cpython-37.pyc | Bin 23935 -> 24117 bytes .../__pycache__/packages.cpython-37.pyc | Bin 519 -> 519 bytes .../__pycache__/sessions.cpython-37.pyc | Bin 0 -> 19437 bytes .../__pycache__/status_codes.cpython-37.pyc | Bin 3064 -> 4175 bytes .../__pycache__/structures.cpython-37.pyc | Bin 0 -> 4388 bytes .../requests/__pycache__/utils.cpython-37.pyc | Bin 0 -> 22048 bytes .../pip/_vendor/requests/__version__.py | 28 +- .../pip/_vendor/requests/_internal_utils.py | 84 +- .../pip/_vendor/requests/adapters.py | 1058 +- .../site-packages/pip/_vendor/requests/api.py | 310 +- .../pip/_vendor/requests/auth.py | 598 +- .../pip/_vendor/requests/certs.py | 36 +- .../pip/_vendor/requests/compat.py | 147 +- .../pip/_vendor/requests/cookies.py | 1091 +- .../pip/_vendor/requests/exceptions.py | 248 +- .../pip/_vendor/requests/help.py | 239 +- .../pip/_vendor/requests/hooks.py | 68 +- .../pip/_vendor/requests/models.py | 1901 +- .../pip/_vendor/requests/packages.py | 32 +- .../pip/_vendor/requests/sessions.py | 1507 +- .../pip/_vendor/requests/status_codes.py | 211 +- .../pip/_vendor/requests/structures.py | 208 +- .../pip/_vendor/requests/utils.py | 1881 +- .../site-packages/pip/_vendor/retrying.py | 534 +- .../site-packages/pip/_vendor/six.py | 952 + .../pip/_vendor/urllib3/__init__.py | 189 +- .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 2124 bytes .../__pycache__/_collections.cpython-37.pyc | Bin 10537 -> 10688 bytes .../__pycache__/connection.cpython-37.pyc | Bin 0 -> 10157 bytes .../__pycache__/connectionpool.cpython-37.pyc | Bin 23718 -> 23662 bytes .../__pycache__/exceptions.cpython-37.pyc | Bin 10408 -> 10409 bytes .../urllib3/__pycache__/fields.cpython-37.pyc | Bin 5877 -> 5877 bytes .../__pycache__/filepost.cpython-37.pyc | Bin 0 -> 2769 bytes .../__pycache__/poolmanager.cpython-37.pyc | Bin 12583 -> 12729 bytes .../__pycache__/request.cpython-37.pyc | Bin 5573 -> 5591 bytes .../__pycache__/response.cpython-37.pyc | Bin 0 -> 18756 bytes .../pip/_vendor/urllib3/_collections.py | 648 +- .../pip/_vendor/urllib3/connection.py | 764 +- .../pip/_vendor/urllib3/connectionpool.py | 1801 +- .../pip/_vendor/urllib3/contrib}/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 208 bytes .../_appengine_environ.cpython-37.pyc | Bin 0 -> 1104 bytes .../__pycache__/appengine.cpython-37.pyc | Bin 8846 -> 8323 bytes .../__pycache__/ntlmpool.cpython-37.pyc | Bin 3256 -> 3250 bytes .../__pycache__/pyopenssl.cpython-37.pyc | Bin 0 -> 14486 bytes .../securetransport.cpython-37.pyc | Bin 18029 -> 17905 bytes .../contrib/__pycache__/socks.cpython-37.pyc | Bin 4817 -> 4914 bytes .../urllib3/contrib/_appengine_environ.py | 30 + .../contrib/_securetransport}/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 225 bytes .../__pycache__/bindings.cpython-37.pyc | Bin 10320 -> 10320 bytes .../__pycache__/low_level.cpython-37.pyc | Bin 7465 -> 7501 bytes .../contrib/_securetransport/bindings.py | 1186 +- .../contrib/_securetransport/low_level.py | 689 +- .../pip/_vendor/urllib3/contrib/appengine.py | 585 +- .../pip/_vendor/urllib3/contrib/ntlmpool.py | 223 +- .../pip/_vendor/urllib3/contrib/pyopenssl.py | 921 +- .../urllib3/contrib/securetransport.py | 1614 +- .../pip/_vendor/urllib3/contrib/socks.py | 380 +- .../pip/_vendor/urllib3/exceptions.py | 492 +- .../pip/_vendor/urllib3/fields.py | 356 +- .../pip/_vendor/urllib3/filepost.py | 192 +- .../pip/_vendor/urllib3/packages/__init__.py | 10 +- .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 322 bytes .../packages/__pycache__/six.cpython-37.pyc | Bin 24410 -> 24410 bytes .../urllib3/packages/backports}/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 219 bytes .../__pycache__/makefile.cpython-37.pyc | Bin 1317 -> 1313 bytes .../urllib3/packages/backports/makefile.py | 106 +- .../pip/_vendor/urllib3/packages}/six.py | 0 .../packages/ssl_match_hostname/__init__.py | 38 +- .../__pycache__/__init__.cpython-37.pyc | Bin 563 -> 563 bytes .../_implementation.cpython-37.pyc | Bin 3322 -> 3322 bytes .../ssl_match_hostname/_implementation.py | 313 +- .../pip/_vendor/urllib3/poolmanager.py | 890 +- .../pip/_vendor/urllib3/request.py | 298 +- .../pip/_vendor/urllib3/response.py | 1331 +- .../pip/_vendor/urllib3/util/__init__.py | 108 +- .../util/__pycache__/__init__.cpython-37.pyc | Bin 1000 -> 1000 bytes .../__pycache__/connection.cpython-37.pyc | Bin 3136 -> 3175 bytes .../util/__pycache__/queue.cpython-37.pyc | Bin 0 -> 1049 bytes .../util/__pycache__/request.cpython-37.pyc | Bin 3230 -> 3230 bytes .../util/__pycache__/response.cpython-37.pyc | Bin 1911 -> 1978 bytes .../util/__pycache__/retry.cpython-37.pyc | Bin 12326 -> 12664 bytes .../util/__pycache__/ssl_.cpython-37.pyc | Bin 0 -> 9556 bytes .../util/__pycache__/timeout.cpython-37.pyc | Bin 8779 -> 8779 bytes .../util/__pycache__/url.cpython-37.pyc | Bin 5189 -> 5189 bytes .../util/__pycache__/wait.cpython-37.pyc | Bin 0 -> 3141 bytes .../pip/_vendor/urllib3/util/connection.py | 264 +- .../pip/_vendor/urllib3/util/queue.py | 21 + .../pip/_vendor/urllib3/util/request.py | 236 +- .../pip/_vendor/urllib3/util/response.py | 168 +- .../pip/_vendor/urllib3/util/retry.py | 812 +- .../pip/_vendor/urllib3/util/ssl_.py | 722 +- .../pip/_vendor/urllib3/util/timeout.py | 484 +- .../pip/_vendor/urllib3/util/url.py | 460 +- .../pip/_vendor/urllib3/util/wait.py | 150 + .../pip/_vendor/webencodings/__init__.py | 684 +- .../__pycache__/__init__.cpython-37.pyc | Bin 9684 -> 9684 bytes .../__pycache__/labels.cpython-37.pyc | Bin 4098 -> 4098 bytes .../__pycache__/mklabels.cpython-37.pyc | Bin 1920 -> 1920 bytes .../__pycache__/tests.cpython-37.pyc | Bin 5061 -> 5061 bytes .../__pycache__/x_user_defined.cpython-37.pyc | Bin 2673 -> 2673 bytes .../pip/_vendor/webencodings/labels.py | 462 +- .../pip/_vendor/webencodings/mklabels.py | 118 +- .../pip/_vendor/webencodings/tests.py | 306 +- .../_vendor/webencodings/x_user_defined.py | 650 +- .../site-packages/pkg_resources/__init__.py | 249 +- .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 99636 bytes .../__pycache__/py31compat.cpython-37.pyc | Bin 0 -> 646 bytes .../pkg_resources}/_vendor/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 209 bytes .../__pycache__/appdirs.cpython-37.pyc | Bin 18603 -> 20697 bytes .../__pycache__/pyparsing.cpython-37.pyc | Bin 202102 -> 203052 bytes .../_vendor/__pycache__/six.cpython-37.pyc | Bin 24410 -> 24410 bytes .../pkg_resources/_vendor/appdirs.py | 86 +- .../_vendor/packaging/__about__.py | 0 .../_vendor/packaging/__init__.py | 0 .../__pycache__/__about__.cpython-37.pyc | Bin 745 -> 745 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 583 -> 583 bytes .../__pycache__/_compat.cpython-37.pyc | Bin 1035 -> 1035 bytes .../__pycache__/_structures.cpython-37.pyc | Bin 2887 -> 2887 bytes .../__pycache__/markers.cpython-37.pyc | Bin 8895 -> 8895 bytes .../__pycache__/requirements.cpython-37.pyc | Bin 3900 -> 3900 bytes .../__pycache__/specifiers.cpython-37.pyc | Bin 19813 -> 19813 bytes .../__pycache__/utils.cpython-37.pyc | Bin 514 -> 514 bytes .../__pycache__/version.cpython-37.pyc | Bin 10580 -> 10580 bytes .../_vendor/packaging/_compat.py | 0 .../_vendor/packaging/_structures.py | 0 .../_vendor/packaging/markers.py | 0 .../_vendor/packaging/requirements.py | 0 .../_vendor/packaging/specifiers.py | 0 .../pkg_resources/_vendor/packaging/utils.py | 0 .../_vendor/packaging/version.py | 0 .../pkg_resources}/_vendor/pyparsing.py | 50 +- .../pkg_resources}/_vendor/six.py | 0 .../pkg_resources/extern/__init__.py | 2 +- .../__pycache__/__init__.cpython-37.pyc | Bin 2424 -> 2428 bytes .../pkg_resources/py31compat.py | 45 +- .../setuptools-41.0.1.dist-info/INSTALLER | 1 + .../setuptools-41.0.1.dist-info/LICENSE | 0 .../setuptools-41.0.1.dist-info}/METADATA | 34 +- .../setuptools-41.0.1.dist-info}/RECORD | 296 +- .../setuptools-41.0.1.dist-info/WHEEL | 6 + .../dependency_links.txt | 0 .../entry_points.txt | 0 .../top_level.txt | 0 .../setuptools-41.0.1.dist-info/zip-safe | 2 +- .../site-packages/setuptools/__init__.py | 52 +- .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 7710 bytes .../_deprecation_warning.cpython-37.pyc | Bin 0 -> 564 bytes .../__pycache__/archive_util.cpython-37.pyc | Bin 5145 -> 5145 bytes .../__pycache__/build_meta.cpython-37.pyc | Bin 0 -> 8303 bytes .../__pycache__/config.cpython-37.pyc | Bin 0 -> 17707 bytes .../__pycache__/dep_util.cpython-37.pyc | Bin 871 -> 871 bytes .../__pycache__/depends.cpython-37.pyc | Bin 5280 -> 5280 bytes .../__pycache__/dist.cpython-37.pyc | Bin 0 -> 42103 bytes .../__pycache__/extension.cpython-37.pyc | Bin 1991 -> 1991 bytes .../__pycache__/glibc.cpython-37.pyc | Bin 1556 -> 1556 bytes .../__pycache__/glob.cpython-37.pyc | Bin 0 -> 3766 bytes .../__pycache__/launch.cpython-37.pyc | Bin 870 -> 870 bytes .../__pycache__/lib2to3_ex.cpython-37.pyc | Bin 2449 -> 2449 bytes .../__pycache__/monkey.cpython-37.pyc | Bin 5127 -> 4650 bytes .../__pycache__/msvc.cpython-37.pyc | Bin 34459 -> 34447 bytes .../__pycache__/namespaces.cpython-37.pyc | Bin 3628 -> 3628 bytes .../__pycache__/package_index.cpython-37.pyc | Bin 32143 -> 32714 bytes .../__pycache__/pep425tags.cpython-37.pyc | Bin 0 -> 7218 bytes .../__pycache__/py27compat.cpython-37.pyc | Bin 827 -> 827 bytes .../__pycache__/py31compat.cpython-37.pyc | Bin 0 -> 1225 bytes .../__pycache__/py33compat.cpython-37.pyc | Bin 1419 -> 1436 bytes .../__pycache__/sandbox.cpython-37.pyc | Bin 15552 -> 15552 bytes .../__pycache__/site-patch.cpython-37.pyc | Bin 1518 -> 1518 bytes .../__pycache__/ssl_support.cpython-37.pyc | Bin 6807 -> 6808 bytes .../__pycache__/unicode_utils.cpython-37.pyc | Bin 1185 -> 1185 bytes .../__pycache__/version.cpython-37.pyc | Bin 0 -> 344 bytes .../__pycache__/wheel.cpython-37.pyc | Bin 0 -> 6997 bytes .../windows_support.cpython-37.pyc | Bin 1027 -> 1027 bytes .../setuptools/_deprecation_warning.py | 7 + .../setuptools/_vendor/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 206 bytes .../__pycache__/pyparsing.cpython-37.pyc | Bin 200957 -> 203049 bytes .../_vendor/__pycache__/six.cpython-37.pyc | Bin 24407 -> 24407 bytes .../setuptools/_vendor/packaging/__about__.py | 0 .../setuptools/_vendor/packaging/__init__.py | 0 .../__pycache__/__about__.cpython-37.pyc | Bin 742 -> 742 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 580 -> 580 bytes .../__pycache__/_compat.cpython-37.pyc | Bin 1032 -> 1032 bytes .../__pycache__/_structures.cpython-37.pyc | Bin 2884 -> 2884 bytes .../__pycache__/markers.cpython-37.pyc | Bin 8889 -> 8889 bytes .../__pycache__/requirements.cpython-37.pyc | Bin 3891 -> 3891 bytes .../__pycache__/specifiers.cpython-37.pyc | Bin 19810 -> 19810 bytes .../__pycache__/utils.cpython-37.pyc | Bin 511 -> 511 bytes .../__pycache__/version.cpython-37.pyc | Bin 10577 -> 10577 bytes .../setuptools/_vendor/packaging/_compat.py | 0 .../_vendor/packaging/_structures.py | 0 .../setuptools/_vendor/packaging/markers.py | 0 .../_vendor/packaging/requirements.py | 0 .../_vendor/packaging/specifiers.py | 0 .../setuptools/_vendor/packaging/utils.py | 0 .../setuptools/_vendor/packaging/version.py | 0 .../setuptools}/_vendor/pyparsing.py | 96 +- .../site-packages/setuptools/_vendor}/six.py | 1736 +- .../site-packages/setuptools/archive_util.py | 0 .../site-packages/setuptools/build_meta.py | 254 + .../site-packages/setuptools/cli-32.exe | Bin .../site-packages/setuptools/cli-64.exe | Bin .../site-packages/setuptools/cli.exe | Bin .../setuptools/command/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 752 -> 752 bytes .../command/__pycache__/alias.cpython-37.pyc | Bin 2420 -> 2420 bytes .../__pycache__/bdist_egg.cpython-37.pyc | Bin 14214 -> 14208 bytes .../__pycache__/bdist_rpm.cpython-37.pyc | Bin 1799 -> 1799 bytes .../__pycache__/bdist_wininst.cpython-37.pyc | Bin 990 -> 990 bytes .../__pycache__/build_clib.cpython-37.pyc | Bin 2469 -> 2469 bytes .../__pycache__/build_ext.cpython-37.pyc | Bin 10039 -> 9723 bytes .../__pycache__/build_py.cpython-37.pyc | Bin 8599 -> 8599 bytes .../__pycache__/develop.cpython-37.pyc | Bin 0 -> 6480 bytes .../__pycache__/dist_info.cpython-37.pyc | Bin 1395 -> 1395 bytes .../__pycache__/easy_install.cpython-37.pyc | Bin 64577 -> 64851 bytes .../__pycache__/egg_info.cpython-37.pyc | Bin 0 -> 21697 bytes .../__pycache__/install.cpython-37.pyc | Bin 4027 -> 4027 bytes .../install_egg_info.cpython-37.pyc | Bin 2428 -> 2428 bytes .../__pycache__/install_lib.cpython-37.pyc | Bin 4104 -> 4104 bytes .../install_scripts.cpython-37.pyc | Bin 2307 -> 2307 bytes .../__pycache__/py36compat.cpython-37.pyc | Bin 4640 -> 4640 bytes .../__pycache__/register.cpython-37.pyc | Bin 0 -> 797 bytes .../command/__pycache__/rotate.cpython-37.pyc | Bin 2546 -> 2546 bytes .../__pycache__/saveopts.cpython-37.pyc | Bin 941 -> 941 bytes .../command/__pycache__/sdist.cpython-37.pyc | Bin 6237 -> 6799 bytes .../command/__pycache__/setopt.cpython-37.pyc | Bin 4539 -> 4539 bytes .../command/__pycache__/test.cpython-37.pyc | Bin 8114 -> 8192 bytes .../command/__pycache__/upload.cpython-37.pyc | Bin 0 -> 5205 bytes .../__pycache__/upload_docs.cpython-37.pyc | Bin 6150 -> 6150 bytes .../site-packages/setuptools/command/alias.py | 0 .../setuptools/command/bdist_egg.py | 2 +- .../setuptools/command/bdist_rpm.py | 0 .../setuptools/command/bdist_wininst.py | 0 .../setuptools/command/build_clib.py | 0 .../setuptools/command/build_ext.py | 12 +- .../setuptools/command/build_py.py | 0 .../setuptools/command/develop.py | 29 +- .../setuptools/command/dist_info.py | 0 .../setuptools/command/easy_install.py | 38 +- .../setuptools/command/egg_info.py | 75 +- .../setuptools/command/install.py | 0 .../setuptools/command/install_egg_info.py | 0 .../setuptools/command/install_lib.py | 0 .../setuptools/command/install_scripts.py | 0 .../setuptools/command/launcher manifest.xml | 0 .../setuptools/command/py36compat.py | 0 .../setuptools/command/register.py | 18 + .../setuptools/command/rotate.py | 0 .../setuptools/command/saveopts.py | 0 .../site-packages/setuptools/command/sdist.py | 21 + .../setuptools/command/setopt.py | 0 .../site-packages/setuptools/command/test.py | 7 +- .../setuptools/command/upload.py | 196 + .../setuptools/command/upload_docs.py | 0 .../site-packages/setuptools/config.py | 158 +- .../site-packages/setuptools/dep_util.py | 0 .../site-packages/setuptools/depends.py | 0 .../site-packages/setuptools/dist.py | 330 +- .../site-packages/setuptools/extension.py | 0 .../setuptools/extern/__init__.py | 2 +- .../__pycache__/__init__.cpython-37.pyc | Bin 2434 -> 2429 bytes .../site-packages/setuptools/glibc.py | 0 .../site-packages/setuptools/glob.py | 14 +- .../site-packages/setuptools/gui-32.exe | Bin .../site-packages/setuptools/gui-64.exe | Bin .../site-packages/setuptools/gui.exe | Bin .../site-packages/setuptools/launch.py | 0 .../site-packages/setuptools/lib2to3_ex.py | 0 .../site-packages/setuptools/monkey.py | 30 +- .../site-packages/setuptools/msvc.py | 3 +- .../site-packages/setuptools/namespaces.py | 0 .../site-packages/setuptools/package_index.py | 53 +- .../site-packages/setuptools/pep425tags.py | 13 +- .../site-packages/setuptools/py27compat.py | 0 .../site-packages/setuptools/py31compat.py | 19 +- .../site-packages/setuptools/py33compat.py | 3 +- .../site-packages/setuptools/sandbox.py | 0 .../setuptools/script (dev).tmpl | 3 +- .../site-packages/setuptools/script.tmpl | 0 .../site-packages/setuptools/site-patch.py | 2 +- .../site-packages/setuptools/ssl_support.py | 2 +- .../site-packages/setuptools/unicode_utils.py | 0 .../site-packages/setuptools/version.py | 0 .../site-packages/setuptools/wheel.py | 211 + .../setuptools/windows_support.py | 0 .../six-1.11.0.dist-info/DESCRIPTION.rst | 27 + .../six-1.11.0.dist-info/INSTALLER | 1 + .../six-1.11.0.dist-info/METADATA | 43 + .../site-packages/six-1.11.0.dist-info/RECORD | 9 + .../site-packages/six-1.11.0.dist-info/WHEEL | 6 + .../six-1.11.0.dist-info/metadata.json | 1 + .../six-1.11.0.dist-info/top_level.txt | 1 + .../venv/lib/python3.7/site-packages}/six.py | 1782 +- .../site-packages/werkzeug/__init__.py | 151 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 4725 bytes .../__pycache__/_compat.cpython-37.pyc | Bin 0 -> 7157 bytes .../__pycache__/_internal.cpython-37.pyc | Bin 0 -> 12539 bytes .../__pycache__/_reloader.cpython-37.pyc | Bin 0 -> 8682 bytes .../__pycache__/datastructures.cpython-37.pyc | Bin 0 -> 99066 bytes .../__pycache__/exceptions.cpython-37.pyc | Bin 0 -> 22970 bytes .../__pycache__/filesystem.cpython-37.pyc | Bin 0 -> 2263 bytes .../__pycache__/formparser.cpython-37.pyc | Bin 0 -> 15939 bytes .../werkzeug/__pycache__/http.cpython-37.pyc | Bin 0 -> 30820 bytes .../werkzeug/__pycache__/local.cpython-37.pyc | Bin 0 -> 18697 bytes .../__pycache__/posixemulation.cpython-37.pyc | Bin 0 -> 2822 bytes .../__pycache__/routing.cpython-37.pyc | Bin 0 -> 59841 bytes .../__pycache__/script.cpython-37.pyc | Bin 0 -> 10438 bytes .../__pycache__/security.cpython-37.pyc | Bin 0 -> 8527 bytes .../__pycache__/serving.cpython-37.pyc | Bin 0 -> 24496 bytes .../werkzeug/__pycache__/test.cpython-37.pyc | Bin 0 -> 29637 bytes .../__pycache__/testapp.cpython-37.pyc | Bin 0 -> 9488 bytes .../werkzeug/__pycache__/urls.cpython-37.pyc | Bin 0 -> 33149 bytes .../__pycache__/useragents.cpython-37.pyc | Bin 0 -> 5259 bytes .../werkzeug/__pycache__/utils.cpython-37.pyc | Bin 0 -> 21128 bytes .../__pycache__/wrappers.cpython-37.pyc | Bin 0 -> 75013 bytes .../werkzeug/__pycache__/wsgi.cpython-37.pyc | Bin 0 -> 38796 bytes .../site-packages/werkzeug/_compat.py | 206 + .../site-packages/werkzeug/_internal.py | 418 + .../site-packages/werkzeug/_reloader.py | 267 + .../werkzeug/contrib/__init__.py | 16 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 809 bytes .../contrib/__pycache__/atom.cpython-37.pyc | Bin 0 -> 14113 bytes .../contrib/__pycache__/cache.cpython-37.pyc | Bin 0 -> 31000 bytes .../contrib/__pycache__/fixers.cpython-37.pyc | Bin 0 -> 10101 bytes .../contrib/__pycache__/iterio.cpython-37.pyc | Bin 0 -> 10994 bytes .../__pycache__/jsrouting.cpython-37.pyc | Bin 0 -> 8317 bytes .../__pycache__/limiter.cpython-37.pyc | Bin 0 -> 1765 bytes .../contrib/__pycache__/lint.cpython-37.pyc | Bin 0 -> 11885 bytes .../__pycache__/profiler.cpython-37.pyc | Bin 0 -> 5459 bytes .../__pycache__/securecookie.cpython-37.pyc | Bin 0 -> 10337 bytes .../__pycache__/sessions.cpython-37.pyc | Bin 0 -> 12933 bytes .../__pycache__/testtools.cpython-37.pyc | Bin 0 -> 2675 bytes .../__pycache__/wrappers.cpython-37.pyc | Bin 0 -> 10440 bytes .../site-packages/werkzeug/contrib/atom.py | 355 + .../site-packages/werkzeug/contrib/cache.py | 858 + .../site-packages/werkzeug/contrib/fixers.py | 254 + .../site-packages/werkzeug/contrib/iterio.py | 352 + .../werkzeug/contrib/jsrouting.py | 264 + .../site-packages/werkzeug/contrib/limiter.py | 41 + .../site-packages/werkzeug/contrib/lint.py | 343 + .../werkzeug/contrib/profiler.py | 147 + .../werkzeug/contrib/securecookie.py | 323 + .../werkzeug/contrib/sessions.py | 352 + .../werkzeug/contrib/testtools.py | 73 + .../werkzeug/contrib/wrappers.py | 284 + .../site-packages/werkzeug/datastructures.py | 2740 +++ .../site-packages/werkzeug/debug/__init__.py | 466 + .../debug/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 12618 bytes .../debug/__pycache__/console.cpython-37.pyc | Bin 0 -> 7383 bytes .../debug/__pycache__/repr.cpython-37.pyc | Bin 0 -> 8677 bytes .../debug/__pycache__/tbtools.cpython-37.pyc | Bin 0 -> 15631 bytes .../site-packages/werkzeug/debug/console.py | 215 + .../site-packages/werkzeug/debug/repr.py | 280 + .../werkzeug/debug/shared/FONT_LICENSE | 96 + .../werkzeug/debug/shared/console.png | Bin 0 -> 507 bytes .../werkzeug/debug/shared/debugger.js | 205 + .../werkzeug/debug/shared/jquery.js | 5 + .../werkzeug/debug/shared/less.png | Bin 0 -> 191 bytes .../werkzeug/debug/shared/more.png | Bin 0 -> 200 bytes .../werkzeug/debug/shared/source.png | Bin 0 -> 818 bytes .../werkzeug/debug/shared/style.css | 143 + .../werkzeug/debug/shared/ubuntu.ttf | Bin 0 -> 70220 bytes .../site-packages/werkzeug/debug/tbtools.py | 556 + .../site-packages/werkzeug/exceptions.py | 719 + .../site-packages/werkzeug/filesystem.py | 66 + .../site-packages/werkzeug/formparser.py | 522 + .../python3.7/site-packages/werkzeug/http.py | 1054 + .../python3.7/site-packages/werkzeug/local.py | 420 + .../site-packages/werkzeug/posixemulation.py | 106 + .../site-packages/werkzeug/routing.py | 1784 ++ .../site-packages/werkzeug/script.py | 332 + .../site-packages/werkzeug/security.py | 270 + .../site-packages/werkzeug/serving.py | 787 + .../python3.7/site-packages/werkzeug/test.py | 909 + .../site-packages/werkzeug/testapp.py | 230 + .../python3.7/site-packages/werkzeug/urls.py | 1004 + .../site-packages/werkzeug/useragents.py | 202 + .../python3.7/site-packages/werkzeug/utils.py | 628 + .../site-packages/werkzeug/wrappers.py | 1970 ++ .../python3.7/site-packages/werkzeug/wsgi.py | 1195 ++ .../wheel-0.33.4.dist-info/INSTALLER | 1 + .../wheel-0.33.4.dist-info/LICENSE.txt | 22 + .../wheel-0.33.4.dist-info/METADATA | 60 + .../wheel-0.33.4.dist-info/RECORD | 32 + .../wheel-0.33.4.dist-info/WHEEL | 6 + .../wheel-0.33.4.dist-info/entry_points.txt | 6 + .../wheel-0.33.4.dist-info/top_level.txt | 1 + .../python3.7/site-packages/wheel/__init__.py | 2 + .../python3.7/site-packages/wheel/__main__.py | 19 + .../wheel/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 210 bytes .../wheel/__pycache__/__main__.cpython-37.pyc | Bin 0 -> 603 bytes .../__pycache__/bdist_wheel.cpython-37.pyc | Bin 0 -> 10095 bytes .../wheel/__pycache__/metadata.cpython-37.pyc | Bin 0 -> 3786 bytes .../__pycache__/pep425tags.cpython-37.pyc | Bin 0 -> 4721 bytes .../wheel/__pycache__/pkginfo.cpython-37.pyc | Bin 0 -> 1581 bytes .../wheel/__pycache__/util.cpython-37.pyc | Bin 0 -> 1326 bytes .../__pycache__/wheelfile.cpython-37.pyc | Bin 0 -> 5481 bytes .../site-packages/wheel/bdist_wheel.py | 372 + .../site-packages/wheel/cli/__init__.py | 88 + .../cli/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 3052 bytes .../cli/__pycache__/convert.cpython-37.pyc | Bin 0 -> 6221 bytes .../wheel/cli/__pycache__/pack.cpython-37.pyc | Bin 0 -> 2510 bytes .../cli/__pycache__/unpack.cpython-37.pyc | Bin 0 -> 955 bytes .../site-packages/wheel/cli/convert.py | 269 + .../python3.7/site-packages/wheel/cli/pack.py | 58 + .../site-packages/wheel/cli/unpack.py | 25 + .../python3.7/site-packages/wheel/metadata.py | 141 + .../site-packages/wheel/pep425tags.py | 185 + .../python3.7/site-packages/wheel/pkginfo.py | 43 + .../lib/python3.7/site-packages/wheel/util.py | 46 + .../site-packages/wheel/wheelfile.py | 169 + backend/venv/lib/python3.7/site.py | 821 + backend/venv/lib/python3.7/sre_compile.py | 1 + backend/venv/lib/python3.7/sre_constants.py | 1 + backend/venv/lib/python3.7/sre_parse.py | 1 + backend/venv/lib/python3.7/stat.py | 1 + backend/venv/lib/python3.7/struct.py | 1 + backend/venv/lib/python3.7/tarfile.py | 1 + backend/venv/lib/python3.7/tempfile.py | 1 + backend/venv/lib/python3.7/token.py | 1 + backend/venv/lib/python3.7/tokenize.py | 1 + backend/venv/lib/python3.7/types.py | 1 + backend/venv/lib/python3.7/warnings.py | 1 + backend/venv/lib/python3.7/weakref.py | 1 + frontend/.babelrc | 8 +- frontend/.eslintignore | 6 +- frontend/.eslintrc.js | 22 +- frontend/.gitignore | 2 +- frontend/.postcssrc.js | 2 + frontend/README.md | 21 + frontend/build/build.js | 4 +- frontend/build/check-versions.js | 5 + frontend/build/dev-client.js | 10 - frontend/build/dev-server.js | 105 - frontend/build/logo.png | Bin 0 -> 6849 bytes frontend/build/utils.js | 33 +- frontend/build/vue-loader.conf.js | 11 +- frontend/build/webpack.base.conf.js | 48 +- frontend/build/webpack.dev.conf.js | 79 +- frontend/build/webpack.prod.conf.js | 51 +- frontend/config/index.js | 67 +- frontend/index.html | 3 +- frontend/package-lock.json | 4854 ++++- frontend/package.json | 53 +- frontend/{vue-shim.d.ts => shims.d.ts} | 2 +- frontend/src/App.vue | 6 +- frontend/src/assets/isovis.jpg | Bin 0 -> 5940 bytes frontend/src/components/About.vue | 3 +- frontend/src/components/HelloWorld.vue | 53 - frontend/src/components/Home.vue | 13 +- frontend/src/components/NotFound.vue | 3 +- frontend/src/main.js | 5 +- frontend/src/main.js.map | 2 +- frontend/src/main.ts | 6 +- frontend/src/router/index.js | 42 +- frontend/src/router/index.js.map | 2 +- frontend/src/router/index.ts | 36 +- frontend/tsconfig.json | 21 +- myenv/bin/activate.csh | 37 - myenv/bin/activate.fish | 75 - myenv/bin/python | 1 - myenv/bin/python3 | 1 - myenv/bin/python3.7 | 1 - .../pip-10.0.1.dist-info/METADATA | 78 - .../site-packages/pip-10.0.1.dist-info/RECORD | 580 - .../python3.7/site-packages/pip/__init__.py | 1 - .../pip/__pycache__/__init__.cpython-37.pyc | Bin 206 -> 0 bytes .../site-packages/pip/_internal/__init__.py | 246 - .../__pycache__/__init__.cpython-37.pyc | Bin 6200 -> 0 bytes .../__pycache__/basecommand.cpython-37.pyc | Bin 8163 -> 0 bytes .../__pycache__/baseparser.cpython-37.pyc | Bin 8305 -> 0 bytes .../__pycache__/build_env.cpython-37.pyc | Bin 3095 -> 0 bytes .../__pycache__/cache.cpython-37.pyc | Bin 6838 -> 0 bytes .../__pycache__/cmdoptions.cpython-37.pyc | Bin 12713 -> 0 bytes .../__pycache__/compat.cpython-37.pyc | Bin 5465 -> 0 bytes .../__pycache__/configuration.cpython-37.pyc | Bin 9779 -> 0 bytes .../__pycache__/download.cpython-37.pyc | Bin 20957 -> 0 bytes .../__pycache__/exceptions.cpython-37.pyc | Bin 10748 -> 0 bytes .../__pycache__/index.cpython-37.pyc | Bin 30625 -> 0 bytes .../__pycache__/locations.cpython-37.pyc | Bin 4248 -> 0 bytes .../__pycache__/pep425tags.cpython-37.pyc | Bin 7265 -> 0 bytes .../__pycache__/resolve.cpython-37.pyc | Bin 8501 -> 0 bytes .../__pycache__/status_codes.cpython-37.pyc | Bin 406 -> 0 bytes .../__pycache__/wheel.cpython-37.pyc | Bin 20684 -> 0 bytes .../site-packages/pip/_internal/build_env.py | 92 - .../commands/__pycache__/check.cpython-37.pyc | Bin 1382 -> 0 bytes .../__pycache__/configuration.cpython-37.pyc | Bin 6426 -> 0 bytes .../__pycache__/download.cpython-37.pyc | Bin 6019 -> 0 bytes .../commands/__pycache__/help.cpython-37.pyc | Bin 1200 -> 0 bytes .../__pycache__/install.cpython-37.pyc | Bin 11150 -> 0 bytes .../commands/__pycache__/list.cpython-37.pyc | Bin 9789 -> 0 bytes .../__pycache__/uninstall.cpython-37.pyc | Bin 2532 -> 0 bytes .../commands/__pycache__/wheel.cpython-37.pyc | Bin 4767 -> 0 bytes .../pip/_internal/models/__init__.py | 4 - .../__pycache__/__init__.cpython-37.pyc | Bin 301 -> 0 bytes .../models/__pycache__/index.cpython-37.pyc | Bin 845 -> 0 bytes .../pip/_internal/models/index.py | 15 - .../__pycache__/__init__.cpython-37.pyc | Bin 205 -> 0 bytes .../__pycache__/check.cpython-37.pyc | Bin 2697 -> 0 bytes .../__pycache__/freeze.cpython-37.pyc | Bin 5892 -> 0 bytes .../__pycache__/prepare.cpython-37.pyc | Bin 10336 -> 0 bytes .../req/__pycache__/__init__.cpython-37.pyc | Bin 1554 -> 0 bytes .../req/__pycache__/req_file.cpython-37.pyc | Bin 8653 -> 0 bytes .../__pycache__/req_install.cpython-37.pyc | Bin 29365 -> 0 bytes .../req/__pycache__/req_set.cpython-37.pyc | Bin 5784 -> 0 bytes .../__pycache__/req_uninstall.cpython-37.pyc | Bin 12769 -> 0 bytes .../pip/_internal/req/req_set.py | 164 - .../utils/__pycache__/__init__.cpython-37.pyc | Bin 200 -> 0 bytes .../__pycache__/deprecation.cpython-37.pyc | Bin 1765 -> 0 bytes .../utils/__pycache__/encoding.cpython-37.pyc | Bin 1136 -> 0 bytes .../__pycache__/filesystem.cpython-37.pyc | Bin 661 -> 0 bytes .../utils/__pycache__/glibc.cpython-37.pyc | Bin 1558 -> 0 bytes .../utils/__pycache__/hashes.cpython-37.pyc | Bin 3335 -> 0 bytes .../utils/__pycache__/logging.cpython-37.pyc | Bin 4032 -> 0 bytes .../utils/__pycache__/misc.cpython-37.pyc | Bin 22090 -> 0 bytes .../utils/__pycache__/outdated.cpython-37.pyc | Bin 4341 -> 0 bytes .../__pycache__/packaging.cpython-37.pyc | Bin 2258 -> 0 bytes .../utils/__pycache__/temp_dir.cpython-37.pyc | Bin 2812 -> 0 bytes .../utils/__pycache__/ui.cpython-37.pyc | Bin 11863 -> 0 bytes .../pip/_internal/utils/deprecation.py | 77 - .../pip/_internal/utils/logging.py | 132 - .../pip/_internal/utils/temp_dir.py | 82 - .../pip/_internal/vcs/__init__.py | 471 - .../vcs/__pycache__/__init__.cpython-37.pyc | Bin 14147 -> 0 bytes .../vcs/__pycache__/bazaar.cpython-37.pyc | Bin 3848 -> 0 bytes .../vcs/__pycache__/git.cpython-37.pyc | Bin 8502 -> 0 bytes .../vcs/__pycache__/mercurial.cpython-37.pyc | Bin 3874 -> 0 bytes .../vcs/__pycache__/subversion.cpython-37.pyc | Bin 7472 -> 0 bytes .../pip/_internal/vcs/subversion.py | 271 - .../__pycache__/__init__.cpython-37.pyc | Bin 2851 -> 0 bytes .../__pycache__/redis_cache.cpython-37.pyc | Bin 1816 -> 0 bytes .../pip/_vendor/cachecontrol/wrapper.py | 27 - .../pip/_vendor/certifi/__init__.py | 3 - .../pip/_vendor/certifi/__main__.py | 2 - .../__pycache__/__init__.cpython-37.pyc | Bin 285 -> 0 bytes .../__pycache__/__main__.cpython-37.pyc | Bin 256 -> 0 bytes .../certifi/__pycache__/core.cpython-37.pyc | Bin 1220 -> 0 bytes .../site-packages/pip/_vendor/certifi/core.py | 37 - .../cli/__pycache__/__init__.cpython-37.pyc | Bin 204 -> 0 bytes .../__pycache__/ansitowin32.cpython-37.pyc | Bin 7063 -> 0 bytes .../colorama/__pycache__/win32.cpython-37.pyc | Bin 3886 -> 0 bytes .../__pycache__/winterm.cpython-37.pyc | Bin 4575 -> 0 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 209 -> 0 bytes .../idna/__pycache__/__init__.cpython-37.pyc | Bin 266 -> 0 bytes .../idna/__pycache__/core.cpython-37.pyc | Bin 8892 -> 0 bytes .../idna/__pycache__/idnadata.cpython-37.pyc | Bin 17256 -> 0 bytes .../__pycache__/package_data.cpython-37.pyc | Bin 220 -> 0 bytes .../idna/__pycache__/uts46data.cpython-37.pyc | Bin 164492 -> 0 bytes .../pip/_vendor/idna/package_data.py | 2 - .../__pycache__/_version.cpython-37.pyc | Bin 227 -> 0 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 95301 -> 0 bytes .../__pycache__/py31compat.cpython-37.pyc | Bin 685 -> 0 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 3919 -> 0 bytes .../progress/__pycache__/bar.cpython-37.pyc | Bin 2649 -> 0 bytes .../__pycache__/counter.cpython-37.pyc | Bin 1583 -> 0 bytes .../__pycache__/helpers.cpython-37.pyc | Bin 2983 -> 0 bytes .../__pycache__/spinner.cpython-37.pyc | Bin 1500 -> 0 bytes .../pip/_vendor/progress/helpers.py | 91 - .../pip/_vendor/pytoml/__init__.py | 3 - .../__pycache__/__init__.cpython-37.pyc | Bin 339 -> 0 bytes .../pytoml/__pycache__/parser.cpython-37.pyc | Bin 10963 -> 0 bytes .../pytoml/__pycache__/writer.cpython-37.pyc | Bin 3850 -> 0 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 3390 -> 0 bytes .../__pycache__/__version__.cpython-37.pyc | Bin 559 -> 0 bytes .../__pycache__/compat.cpython-37.pyc | Bin 1539 -> 0 bytes .../requests/__pycache__/hooks.cpython-37.pyc | Bin 1006 -> 0 bytes .../__pycache__/sessions.cpython-37.pyc | Bin 18494 -> 0 bytes .../__pycache__/structures.cpython-37.pyc | Bin 4414 -> 0 bytes .../requests/__pycache__/utils.cpython-37.pyc | Bin 20605 -> 0 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 2431 -> 0 bytes .../__pycache__/connection.cpython-37.pyc | Bin 8847 -> 0 bytes .../__pycache__/filepost.cpython-37.pyc | Bin 2678 -> 0 bytes .../__pycache__/response.cpython-37.pyc | Bin 16212 -> 0 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 208 -> 0 bytes .../__pycache__/pyopenssl.cpython-37.pyc | Bin 14115 -> 0 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 225 -> 0 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 322 -> 0 bytes .../__pycache__/ordered_dict.cpython-37.pyc | Bin 8416 -> 0 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 219 -> 0 bytes .../_vendor/urllib3/packages/ordered_dict.py | 259 - .../util/__pycache__/selectors.cpython-37.pyc | Bin 16397 -> 0 bytes .../util/__pycache__/ssl_.cpython-37.pyc | Bin 8958 -> 0 bytes .../util/__pycache__/wait.cpython-37.pyc | Bin 1673 -> 0 bytes .../pip/_vendor/urllib3/util/selectors.py | 581 - .../pip/_vendor/urllib3/util/wait.py | 40 - .../__pycache__/__init__.cpython-37.pyc | Bin 95350 -> 0 bytes .../__pycache__/py31compat.cpython-37.pyc | Bin 680 -> 0 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 209 -> 0 bytes .../__pycache__/pyparsing.cpython-37.pyc | Bin 200960 -> 0 bytes .../DESCRIPTION.rst | 36 - .../setuptools-39.0.1.dist-info/metadata.json | 1 - .../__pycache__/__init__.cpython-37.pyc | Bin 6301 -> 0 bytes .../__pycache__/build_meta.cpython-37.pyc | Bin 5925 -> 0 bytes .../__pycache__/config.cpython-37.pyc | Bin 14362 -> 0 bytes .../__pycache__/dist.cpython-37.pyc | Bin 36763 -> 0 bytes .../__pycache__/glob.cpython-37.pyc | Bin 3857 -> 0 bytes .../__pycache__/pep425tags.cpython-37.pyc | Bin 7196 -> 0 bytes .../__pycache__/py31compat.cpython-37.pyc | Bin 1561 -> 0 bytes .../__pycache__/py36compat.cpython-37.pyc | Bin 2208 -> 0 bytes .../__pycache__/version.cpython-37.pyc | Bin 344 -> 0 bytes .../__pycache__/wheel.cpython-37.pyc | Bin 5813 -> 0 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 206 -> 0 bytes .../site-packages/setuptools/build_meta.py | 172 - .../__pycache__/develop.cpython-37.pyc | Bin 6423 -> 0 bytes .../__pycache__/egg_info.cpython-37.pyc | Bin 21071 -> 0 bytes .../__pycache__/register.cpython-37.pyc | Bin 616 -> 0 bytes .../command/__pycache__/upload.cpython-37.pyc | Bin 1408 -> 0 bytes .../setuptools/command/register.py | 10 - .../setuptools/command/upload.py | 42 - .../site-packages/setuptools/py36compat.py | 82 - .../site-packages/setuptools/wheel.py | 163 - myenv/pyvenv.cfg | 3 - run.py | 0 1434 files changed, 165056 insertions(+), 99555 deletions(-) mode change 100644 => 100755 .vscode/settings.json mode change 100755 => 100644 backend/requirements.txt create mode 120000 backend/venv/.Python rename {myenv => backend/venv}/bin/activate (50%) create mode 100644 backend/venv/bin/activate.csh create mode 100644 backend/venv/bin/activate.fish create mode 100644 backend/venv/bin/activate.ps1 create mode 100644 backend/venv/bin/activate.xsh create mode 100644 backend/venv/bin/activate_this.py rename {myenv => backend/venv}/bin/easy_install (71%) rename {myenv => backend/venv}/bin/easy_install-3.7 (71%) create mode 100755 backend/venv/bin/flask rename {myenv => backend/venv}/bin/pip (69%) rename {myenv => backend/venv}/bin/pip3 (69%) rename {myenv => backend/venv}/bin/pip3.7 (69%) create mode 120000 backend/venv/bin/python create mode 100755 backend/venv/bin/python-config create mode 100755 backend/venv/bin/python3 create mode 120000 backend/venv/bin/python3.7 create mode 100755 backend/venv/bin/wheel create mode 120000 backend/venv/include/python3.7m create mode 120000 backend/venv/lib/python3.7/LICENSE.txt create mode 120000 backend/venv/lib/python3.7/__future__.py create mode 100644 backend/venv/lib/python3.7/__pycache__/__future__.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/__pycache__/_bootlocale.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/__pycache__/_collections_abc.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/__pycache__/_weakrefset.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/__pycache__/abc.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/__pycache__/base64.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/__pycache__/bisect.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/__pycache__/codecs.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/__pycache__/copy.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/__pycache__/copyreg.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/__pycache__/enum.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/__pycache__/fnmatch.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/__pycache__/functools.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/__pycache__/genericpath.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/__pycache__/hashlib.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/__pycache__/heapq.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/__pycache__/hmac.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/__pycache__/io.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/__pycache__/keyword.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/__pycache__/linecache.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/__pycache__/locale.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/__pycache__/ntpath.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/__pycache__/operator.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/__pycache__/os.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/__pycache__/posixpath.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/__pycache__/random.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/__pycache__/re.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/__pycache__/reprlib.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/__pycache__/shutil.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/__pycache__/site.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/__pycache__/sre_compile.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/__pycache__/sre_constants.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/__pycache__/sre_parse.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/__pycache__/stat.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/__pycache__/struct.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/__pycache__/tarfile.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/__pycache__/tempfile.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/__pycache__/token.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/__pycache__/tokenize.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/__pycache__/types.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/__pycache__/warnings.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/__pycache__/weakref.cpython-37.pyc create mode 120000 backend/venv/lib/python3.7/_bootlocale.py create mode 120000 backend/venv/lib/python3.7/_collections_abc.py create mode 120000 backend/venv/lib/python3.7/_dummy_thread.py create mode 120000 backend/venv/lib/python3.7/_weakrefset.py create mode 120000 backend/venv/lib/python3.7/abc.py create mode 120000 backend/venv/lib/python3.7/base64.py create mode 120000 backend/venv/lib/python3.7/bisect.py create mode 120000 backend/venv/lib/python3.7/codecs.py create mode 120000 backend/venv/lib/python3.7/collections create mode 120000 backend/venv/lib/python3.7/config-3.7m-darwin create mode 120000 backend/venv/lib/python3.7/copy.py create mode 120000 backend/venv/lib/python3.7/copyreg.py create mode 100644 backend/venv/lib/python3.7/distutils/__init__.py create mode 100644 backend/venv/lib/python3.7/distutils/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/distutils/distutils.cfg create mode 120000 backend/venv/lib/python3.7/encodings create mode 120000 backend/venv/lib/python3.7/enum.py create mode 120000 backend/venv/lib/python3.7/fnmatch.py create mode 120000 backend/venv/lib/python3.7/functools.py create mode 120000 backend/venv/lib/python3.7/genericpath.py create mode 120000 backend/venv/lib/python3.7/hashlib.py create mode 120000 backend/venv/lib/python3.7/heapq.py create mode 120000 backend/venv/lib/python3.7/hmac.py create mode 120000 backend/venv/lib/python3.7/imp.py create mode 120000 backend/venv/lib/python3.7/importlib create mode 120000 backend/venv/lib/python3.7/io.py create mode 120000 backend/venv/lib/python3.7/keyword.py create mode 120000 backend/venv/lib/python3.7/lib-dynload create mode 120000 backend/venv/lib/python3.7/linecache.py create mode 120000 backend/venv/lib/python3.7/locale.py rename myenv/lib/python3.7/site-packages/pip/_internal/operations/__init__.py => backend/venv/lib/python3.7/no-global-site-packages.txt (100%) create mode 120000 backend/venv/lib/python3.7/ntpath.py create mode 120000 backend/venv/lib/python3.7/operator.py create mode 100644 backend/venv/lib/python3.7/orig-prefix.txt create mode 120000 backend/venv/lib/python3.7/os.py create mode 120000 backend/venv/lib/python3.7/posixpath.py create mode 120000 backend/venv/lib/python3.7/random.py create mode 120000 backend/venv/lib/python3.7/re.py create mode 120000 backend/venv/lib/python3.7/readline.so create mode 120000 backend/venv/lib/python3.7/reprlib.py create mode 120000 backend/venv/lib/python3.7/rlcompleter.py create mode 120000 backend/venv/lib/python3.7/shutil.py rename {myenv/lib/python3.7/site-packages/pip-10.0.1.dist-info => backend/venv/lib/python3.7/site-packages/Flask-1.0.3.dist-info}/INSTALLER (100%) create mode 100644 backend/venv/lib/python3.7/site-packages/Flask-1.0.3.dist-info/LICENSE create mode 100644 backend/venv/lib/python3.7/site-packages/Flask-1.0.3.dist-info/METADATA create mode 100644 backend/venv/lib/python3.7/site-packages/Flask-1.0.3.dist-info/RECORD rename {myenv/lib/python3.7/site-packages/setuptools-39.0.1.dist-info => backend/venv/lib/python3.7/site-packages/Flask-1.0.3.dist-info}/WHEEL (70%) create mode 100644 backend/venv/lib/python3.7/site-packages/Flask-1.0.3.dist-info/entry_points.txt create mode 100644 backend/venv/lib/python3.7/site-packages/Flask-1.0.3.dist-info/top_level.txt create mode 100644 backend/venv/lib/python3.7/site-packages/Flask_Cors-3.0.3.dist-info/DESCRIPTION.rst rename {myenv/lib/python3.7/site-packages/setuptools-39.0.1.dist-info => backend/venv/lib/python3.7/site-packages/Flask_Cors-3.0.3.dist-info}/INSTALLER (100%) create mode 100644 backend/venv/lib/python3.7/site-packages/Flask_Cors-3.0.3.dist-info/METADATA create mode 100644 backend/venv/lib/python3.7/site-packages/Flask_Cors-3.0.3.dist-info/RECORD rename {myenv/lib/python3.7/site-packages/pip-10.0.1.dist-info => backend/venv/lib/python3.7/site-packages/Flask_Cors-3.0.3.dist-info}/WHEEL (67%) create mode 100644 backend/venv/lib/python3.7/site-packages/Flask_Cors-3.0.3.dist-info/metadata.json create mode 100644 backend/venv/lib/python3.7/site-packages/Flask_Cors-3.0.3.dist-info/top_level.txt rename myenv/lib/python3.7/site-packages/pip-10.0.1.dist-info/top_level.txt => backend/venv/lib/python3.7/site-packages/Jinja2-2.10.1.dist-info/INSTALLER (100%) create mode 100644 backend/venv/lib/python3.7/site-packages/Jinja2-2.10.1.dist-info/LICENSE create mode 100644 backend/venv/lib/python3.7/site-packages/Jinja2-2.10.1.dist-info/METADATA create mode 100644 backend/venv/lib/python3.7/site-packages/Jinja2-2.10.1.dist-info/RECORD create mode 100644 backend/venv/lib/python3.7/site-packages/Jinja2-2.10.1.dist-info/WHEEL create mode 100644 backend/venv/lib/python3.7/site-packages/Jinja2-2.10.1.dist-info/entry_points.txt create mode 100644 backend/venv/lib/python3.7/site-packages/Jinja2-2.10.1.dist-info/top_level.txt create mode 100644 backend/venv/lib/python3.7/site-packages/MarkupSafe-1.0.dist-info/INSTALLER create mode 100644 backend/venv/lib/python3.7/site-packages/MarkupSafe-1.0.dist-info/LICENSE create mode 100644 backend/venv/lib/python3.7/site-packages/MarkupSafe-1.0.dist-info/METADATA create mode 100644 backend/venv/lib/python3.7/site-packages/MarkupSafe-1.0.dist-info/RECORD create mode 100644 backend/venv/lib/python3.7/site-packages/MarkupSafe-1.0.dist-info/WHEEL create mode 100644 backend/venv/lib/python3.7/site-packages/MarkupSafe-1.0.dist-info/top_level.txt create mode 100644 backend/venv/lib/python3.7/site-packages/Werkzeug-0.12.2.dist-info/DESCRIPTION.rst create mode 100644 backend/venv/lib/python3.7/site-packages/Werkzeug-0.12.2.dist-info/INSTALLER create mode 100644 backend/venv/lib/python3.7/site-packages/Werkzeug-0.12.2.dist-info/LICENSE.txt create mode 100644 backend/venv/lib/python3.7/site-packages/Werkzeug-0.12.2.dist-info/METADATA create mode 100644 backend/venv/lib/python3.7/site-packages/Werkzeug-0.12.2.dist-info/RECORD create mode 100644 backend/venv/lib/python3.7/site-packages/Werkzeug-0.12.2.dist-info/WHEEL create mode 100644 backend/venv/lib/python3.7/site-packages/Werkzeug-0.12.2.dist-info/metadata.json create mode 100644 backend/venv/lib/python3.7/site-packages/Werkzeug-0.12.2.dist-info/top_level.txt rename {myenv => backend/venv}/lib/python3.7/site-packages/__pycache__/easy_install.cpython-37.pyc (58%) create mode 100644 backend/venv/lib/python3.7/site-packages/__pycache__/itsdangerous.cpython-37.pyc rename {myenv/lib/python3.7/site-packages/pip/_vendor => backend/venv/lib/python3.7/site-packages}/__pycache__/six.cpython-37.pyc (98%) create mode 100644 backend/venv/lib/python3.7/site-packages/click-6.7.dist-info/DESCRIPTION.rst create mode 100644 backend/venv/lib/python3.7/site-packages/click-6.7.dist-info/INSTALLER create mode 100644 backend/venv/lib/python3.7/site-packages/click-6.7.dist-info/METADATA create mode 100644 backend/venv/lib/python3.7/site-packages/click-6.7.dist-info/RECORD create mode 100644 backend/venv/lib/python3.7/site-packages/click-6.7.dist-info/WHEEL create mode 100644 backend/venv/lib/python3.7/site-packages/click-6.7.dist-info/metadata.json create mode 100644 backend/venv/lib/python3.7/site-packages/click-6.7.dist-info/top_level.txt create mode 100644 backend/venv/lib/python3.7/site-packages/click/__init__.py create mode 100644 backend/venv/lib/python3.7/site-packages/click/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/click/__pycache__/_bashcomplete.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/click/__pycache__/_compat.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/click/__pycache__/_termui_impl.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/click/__pycache__/_textwrap.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/click/__pycache__/_unicodefun.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/click/__pycache__/_winconsole.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/click/__pycache__/core.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/click/__pycache__/decorators.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/click/__pycache__/exceptions.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/click/__pycache__/formatting.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/click/__pycache__/globals.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/click/__pycache__/parser.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/click/__pycache__/termui.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/click/__pycache__/testing.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/click/__pycache__/types.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/click/__pycache__/utils.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/click/_bashcomplete.py create mode 100644 backend/venv/lib/python3.7/site-packages/click/_compat.py create mode 100644 backend/venv/lib/python3.7/site-packages/click/_termui_impl.py create mode 100644 backend/venv/lib/python3.7/site-packages/click/_textwrap.py create mode 100644 backend/venv/lib/python3.7/site-packages/click/_unicodefun.py create mode 100644 backend/venv/lib/python3.7/site-packages/click/_winconsole.py create mode 100644 backend/venv/lib/python3.7/site-packages/click/core.py create mode 100644 backend/venv/lib/python3.7/site-packages/click/decorators.py create mode 100644 backend/venv/lib/python3.7/site-packages/click/exceptions.py create mode 100644 backend/venv/lib/python3.7/site-packages/click/formatting.py create mode 100644 backend/venv/lib/python3.7/site-packages/click/globals.py create mode 100644 backend/venv/lib/python3.7/site-packages/click/parser.py create mode 100644 backend/venv/lib/python3.7/site-packages/click/termui.py create mode 100644 backend/venv/lib/python3.7/site-packages/click/testing.py create mode 100644 backend/venv/lib/python3.7/site-packages/click/types.py create mode 100644 backend/venv/lib/python3.7/site-packages/click/utils.py rename {myenv => backend/venv}/lib/python3.7/site-packages/easy_install.py (100%) create mode 100644 backend/venv/lib/python3.7/site-packages/flask/__init__.py create mode 100644 backend/venv/lib/python3.7/site-packages/flask/__main__.py create mode 100644 backend/venv/lib/python3.7/site-packages/flask/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/flask/__pycache__/__main__.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/flask/__pycache__/_compat.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/flask/__pycache__/app.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/flask/__pycache__/blueprints.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/flask/__pycache__/cli.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/flask/__pycache__/config.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/flask/__pycache__/ctx.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/flask/__pycache__/debughelpers.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/flask/__pycache__/globals.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/flask/__pycache__/helpers.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/flask/__pycache__/logging.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/flask/__pycache__/sessions.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/flask/__pycache__/signals.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/flask/__pycache__/templating.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/flask/__pycache__/testing.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/flask/__pycache__/views.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/flask/__pycache__/wrappers.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/flask/_compat.py create mode 100644 backend/venv/lib/python3.7/site-packages/flask/app.py create mode 100644 backend/venv/lib/python3.7/site-packages/flask/blueprints.py create mode 100644 backend/venv/lib/python3.7/site-packages/flask/cli.py create mode 100644 backend/venv/lib/python3.7/site-packages/flask/config.py create mode 100644 backend/venv/lib/python3.7/site-packages/flask/ctx.py create mode 100644 backend/venv/lib/python3.7/site-packages/flask/debughelpers.py create mode 100644 backend/venv/lib/python3.7/site-packages/flask/globals.py create mode 100644 backend/venv/lib/python3.7/site-packages/flask/helpers.py create mode 100644 backend/venv/lib/python3.7/site-packages/flask/json/__init__.py create mode 100644 backend/venv/lib/python3.7/site-packages/flask/json/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/flask/json/__pycache__/tag.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/flask/json/tag.py create mode 100644 backend/venv/lib/python3.7/site-packages/flask/logging.py create mode 100644 backend/venv/lib/python3.7/site-packages/flask/sessions.py create mode 100644 backend/venv/lib/python3.7/site-packages/flask/signals.py create mode 100644 backend/venv/lib/python3.7/site-packages/flask/templating.py create mode 100644 backend/venv/lib/python3.7/site-packages/flask/testing.py create mode 100644 backend/venv/lib/python3.7/site-packages/flask/views.py create mode 100644 backend/venv/lib/python3.7/site-packages/flask/wrappers.py create mode 100644 backend/venv/lib/python3.7/site-packages/flask_cors/__init__.py create mode 100644 backend/venv/lib/python3.7/site-packages/flask_cors/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/flask_cors/__pycache__/core.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/flask_cors/__pycache__/decorator.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/flask_cors/__pycache__/extension.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/flask_cors/__pycache__/version.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/flask_cors/core.py create mode 100644 backend/venv/lib/python3.7/site-packages/flask_cors/decorator.py create mode 100644 backend/venv/lib/python3.7/site-packages/flask_cors/extension.py create mode 100644 backend/venv/lib/python3.7/site-packages/flask_cors/version.py create mode 100644 backend/venv/lib/python3.7/site-packages/itsdangerous-0.24.dist-info/INSTALLER create mode 100644 backend/venv/lib/python3.7/site-packages/itsdangerous-0.24.dist-info/LICENSE create mode 100644 backend/venv/lib/python3.7/site-packages/itsdangerous-0.24.dist-info/METADATA create mode 100644 backend/venv/lib/python3.7/site-packages/itsdangerous-0.24.dist-info/RECORD create mode 100644 backend/venv/lib/python3.7/site-packages/itsdangerous-0.24.dist-info/WHEEL create mode 100644 backend/venv/lib/python3.7/site-packages/itsdangerous-0.24.dist-info/top_level.txt create mode 100644 backend/venv/lib/python3.7/site-packages/itsdangerous.py create mode 100644 backend/venv/lib/python3.7/site-packages/jinja2/__init__.py create mode 100644 backend/venv/lib/python3.7/site-packages/jinja2/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/jinja2/__pycache__/_compat.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/jinja2/__pycache__/_identifier.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/jinja2/__pycache__/asyncfilters.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/jinja2/__pycache__/asyncsupport.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/jinja2/__pycache__/bccache.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/jinja2/__pycache__/compiler.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/jinja2/__pycache__/constants.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/jinja2/__pycache__/debug.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/jinja2/__pycache__/defaults.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/jinja2/__pycache__/environment.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/jinja2/__pycache__/exceptions.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/jinja2/__pycache__/ext.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/jinja2/__pycache__/filters.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/jinja2/__pycache__/idtracking.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/jinja2/__pycache__/lexer.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/jinja2/__pycache__/loaders.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/jinja2/__pycache__/meta.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/jinja2/__pycache__/nativetypes.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/jinja2/__pycache__/nodes.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/jinja2/__pycache__/optimizer.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/jinja2/__pycache__/parser.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/jinja2/__pycache__/runtime.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/jinja2/__pycache__/sandbox.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/jinja2/__pycache__/tests.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/jinja2/__pycache__/utils.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/jinja2/__pycache__/visitor.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/jinja2/_compat.py create mode 100644 backend/venv/lib/python3.7/site-packages/jinja2/_identifier.py create mode 100644 backend/venv/lib/python3.7/site-packages/jinja2/asyncfilters.py create mode 100644 backend/venv/lib/python3.7/site-packages/jinja2/asyncsupport.py create mode 100644 backend/venv/lib/python3.7/site-packages/jinja2/bccache.py create mode 100644 backend/venv/lib/python3.7/site-packages/jinja2/compiler.py create mode 100644 backend/venv/lib/python3.7/site-packages/jinja2/constants.py create mode 100644 backend/venv/lib/python3.7/site-packages/jinja2/debug.py create mode 100644 backend/venv/lib/python3.7/site-packages/jinja2/defaults.py create mode 100644 backend/venv/lib/python3.7/site-packages/jinja2/environment.py create mode 100644 backend/venv/lib/python3.7/site-packages/jinja2/exceptions.py create mode 100644 backend/venv/lib/python3.7/site-packages/jinja2/ext.py create mode 100644 backend/venv/lib/python3.7/site-packages/jinja2/filters.py create mode 100644 backend/venv/lib/python3.7/site-packages/jinja2/idtracking.py create mode 100644 backend/venv/lib/python3.7/site-packages/jinja2/lexer.py create mode 100644 backend/venv/lib/python3.7/site-packages/jinja2/loaders.py create mode 100644 backend/venv/lib/python3.7/site-packages/jinja2/meta.py create mode 100644 backend/venv/lib/python3.7/site-packages/jinja2/nativetypes.py create mode 100644 backend/venv/lib/python3.7/site-packages/jinja2/nodes.py create mode 100644 backend/venv/lib/python3.7/site-packages/jinja2/optimizer.py create mode 100644 backend/venv/lib/python3.7/site-packages/jinja2/parser.py create mode 100644 backend/venv/lib/python3.7/site-packages/jinja2/runtime.py create mode 100644 backend/venv/lib/python3.7/site-packages/jinja2/sandbox.py create mode 100644 backend/venv/lib/python3.7/site-packages/jinja2/tests.py create mode 100644 backend/venv/lib/python3.7/site-packages/jinja2/utils.py create mode 100644 backend/venv/lib/python3.7/site-packages/jinja2/visitor.py create mode 100644 backend/venv/lib/python3.7/site-packages/markupsafe/__init__.py create mode 100644 backend/venv/lib/python3.7/site-packages/markupsafe/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/markupsafe/__pycache__/_compat.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/markupsafe/__pycache__/_constants.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/markupsafe/__pycache__/_native.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/markupsafe/_compat.py create mode 100644 backend/venv/lib/python3.7/site-packages/markupsafe/_constants.py create mode 100644 backend/venv/lib/python3.7/site-packages/markupsafe/_native.py create mode 100644 backend/venv/lib/python3.7/site-packages/markupsafe/_speedups.c create mode 100755 backend/venv/lib/python3.7/site-packages/markupsafe/_speedups.cpython-37m-darwin.so create mode 100644 backend/venv/lib/python3.7/site-packages/pip-19.1.1.dist-info/INSTALLER rename {myenv/lib/python3.7/site-packages/pip-10.0.1.dist-info => backend/venv/lib/python3.7/site-packages/pip-19.1.1.dist-info}/LICENSE.txt (92%) create mode 100644 backend/venv/lib/python3.7/site-packages/pip-19.1.1.dist-info/METADATA create mode 100644 backend/venv/lib/python3.7/site-packages/pip-19.1.1.dist-info/RECORD create mode 100644 backend/venv/lib/python3.7/site-packages/pip-19.1.1.dist-info/WHEEL rename {myenv/lib/python3.7/site-packages/pip-10.0.1.dist-info => backend/venv/lib/python3.7/site-packages/pip-19.1.1.dist-info}/entry_points.txt (71%) create mode 100644 backend/venv/lib/python3.7/site-packages/pip-19.1.1.dist-info/top_level.txt create mode 100644 backend/venv/lib/python3.7/site-packages/pip/__init__.py rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/__main__.py (89%) create mode 100644 backend/venv/lib/python3.7/site-packages/pip/__pycache__/__init__.cpython-37.pyc rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/__pycache__/__main__.cpython-37.pyc (71%) create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/__init__.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/__pycache__/build_env.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/__pycache__/cache.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/__pycache__/configuration.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/__pycache__/download.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/__pycache__/exceptions.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/__pycache__/index.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/__pycache__/locations.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/__pycache__/pep425tags.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/__pycache__/pyproject.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/__pycache__/resolve.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/__pycache__/wheel.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/build_env.py rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_internal/cache.py (85%) create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/cli/__init__.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/cli/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/cli/__pycache__/autocompletion.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/cli/__pycache__/base_command.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/cli/__pycache__/cmdoptions.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/cli/__pycache__/main_parser.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/cli/__pycache__/parser.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/cli/__pycache__/status_codes.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/cli/autocompletion.py rename myenv/lib/python3.7/site-packages/pip/_internal/basecommand.py => backend/venv/lib/python3.7/site-packages/pip/_internal/cli/base_command.py (56%) rename {myenv/lib/python3.7/site-packages/pip/_internal => backend/venv/lib/python3.7/site-packages/pip/_internal/cli}/cmdoptions.py (62%) create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/cli/main_parser.py rename myenv/lib/python3.7/site-packages/pip/_internal/baseparser.py => backend/venv/lib/python3.7/site-packages/pip/_internal/cli/parser.py (89%) rename {myenv/lib/python3.7/site-packages/pip/_internal => backend/venv/lib/python3.7/site-packages/pip/_internal/cli}/status_codes.py (95%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_internal/commands/__init__.py (94%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/__init__.cpython-37.pyc (84%) create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/check.cpython-37.pyc rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/completion.cpython-37.pyc (90%) create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/configuration.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/download.cpython-37.pyc rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/freeze.cpython-37.pyc (63%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/hash.cpython-37.pyc (80%) create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/help.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/install.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/list.cpython-37.pyc rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/search.cpython-37.pyc (77%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/show.cpython-37.pyc (77%) create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/uninstall.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/wheel.cpython-37.pyc rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_internal/commands/check.py (83%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_internal/commands/completion.py (95%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_internal/commands/configuration.py (77%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_internal/commands/download.py (65%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_internal/commands/freeze.py (91%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_internal/commands/hash.py (91%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_internal/commands/help.py (90%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_internal/commands/install.py (80%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_internal/commands/list.py (79%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_internal/commands/search.py (93%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_internal/commands/show.py (94%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_internal/commands/uninstall.py (85%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_internal/commands/wheel.py (91%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_internal/configuration.py (89%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_internal/download.py (86%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_internal/exceptions.py (90%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_internal/index.py (52%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_internal/locations.py (85%) create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/models/__init__.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/models/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/models/__pycache__/candidate.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/models/__pycache__/format_control.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/models/__pycache__/index.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/models/__pycache__/link.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/models/candidate.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/models/format_control.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/models/index.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/models/link.py rename {myenv/lib/python3.7/site-packages/pip/_internal/utils => backend/venv/lib/python3.7/site-packages/pip/_internal/operations}/__init__.py (100%) create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/operations/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/operations/__pycache__/check.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/operations/__pycache__/freeze.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/operations/__pycache__/prepare.cpython-37.pyc rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_internal/operations/check.py (54%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_internal/operations/freeze.py (55%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_internal/operations/prepare.py (68%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_internal/pep425tags.py (76%) create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/pyproject.py rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_internal/req/__init__.py (82%) create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/req/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/req/__pycache__/constructors.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/req/__pycache__/req_file.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/req/__pycache__/req_install.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/req/__pycache__/req_set.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/req/__pycache__/req_tracker.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/req/__pycache__/req_uninstall.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/req/constructors.py rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_internal/req/req_file.py (77%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_internal/req/req_install.py (61%) create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/req/req_set.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/req/req_tracker.py rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_internal/req/req_uninstall.py (65%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_internal/resolve.py (85%) rename {myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters => backend/venv/lib/python3.7/site-packages/pip/_internal/utils}/__init__.py (100%) create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/__init__.cpython-37.pyc rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/appdirs.cpython-37.pyc (70%) create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/compat.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/deprecation.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/encoding.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/filesystem.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/glibc.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/hashes.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/logging.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/misc.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/models.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/outdated.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/packaging.cpython-37.pyc rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/setuptools_build.cpython-37.pyc (65%) create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/temp_dir.cpython-37.pyc rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/typing.cpython-37.pyc (81%) create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/ui.cpython-37.pyc rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_internal/utils/appdirs.py (96%) rename {myenv/lib/python3.7/site-packages/pip/_internal => backend/venv/lib/python3.7/site-packages/pip/_internal/utils}/compat.py (84%) create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/utils/deprecation.py rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_internal/utils/encoding.py (63%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_internal/utils/filesystem.py (87%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_internal/utils/glibc.py (90%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_internal/utils/hashes.py (82%) create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/utils/logging.py rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_internal/utils/misc.py (68%) create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/utils/models.py rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_internal/utils/outdated.py (66%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_internal/utils/packaging.py (75%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_internal/utils/setuptools_build.py (97%) create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/utils/temp_dir.py rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_internal/utils/typing.py (92%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_internal/utils/ui.py (90%) create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/vcs/__init__.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/vcs/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/vcs/__pycache__/bazaar.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/vcs/__pycache__/git.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/vcs/__pycache__/mercurial.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/vcs/__pycache__/subversion.cpython-37.pyc rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_internal/vcs/bazaar.py (53%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_internal/vcs/git.py (55%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_internal/vcs/mercurial.py (59%) create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/vcs/subversion.py rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_internal/wheel.py (64%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/__init__.py (78%) create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/__pycache__/__init__.cpython-37.pyc rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/__pycache__/appdirs.cpython-37.pyc (99%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/__pycache__/distro.cpython-37.pyc (55%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/__pycache__/ipaddress.cpython-37.pyc (99%) create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/__pycache__/pyparsing.cpython-37.pyc rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/__pycache__/retrying.cpython-37.pyc (97%) create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/__pycache__/six.cpython-37.pyc rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/appdirs.py (97%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__init__.py (70%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/__init__.cpython-37.pyc (56%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-37.pyc (72%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/adapter.cpython-37.pyc (64%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/cache.cpython-37.pyc (84%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/compat.cpython-37.pyc (83%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/controller.cpython-37.pyc (69%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-37.pyc (77%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-37.pyc (79%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/serialize.cpython-37.pyc (67%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-37.pyc (64%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/cachecontrol/_cmd.py (72%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/cachecontrol/adapter.py (77%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/cachecontrol/cache.py (84%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/cachecontrol/caches/__init__.py (97%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-37.pyc (57%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-37.pyc (56%) create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-37.pyc rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py (89%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py (68%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/cachecontrol/compat.py (95%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/cachecontrol/controller.py (63%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/cachecontrol/filewrapper.py (93%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/cachecontrol/heuristics.py (73%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/cachecontrol/serialize.py (83%) create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/wrapper.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/certifi/__init__.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/certifi/__main__.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/certifi/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/certifi/__pycache__/__main__.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/certifi/__pycache__/core.cpython-37.pyc rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/certifi/cacert.pem (90%) create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/certifi/core.py rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/chardet/__init__.py (97%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/__init__.cpython-37.pyc (78%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/big5freq.cpython-37.pyc (99%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/big5prober.cpython-37.pyc (83%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/chardistribution.cpython-37.pyc (97%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/charsetgroupprober.cpython-37.pyc (92%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/charsetprober.cpython-37.pyc (95%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/codingstatemachine.cpython-37.pyc (95%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/compat.cpython-37.pyc (60%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/cp949prober.cpython-37.pyc (83%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/enums.cpython-37.pyc (93%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/escprober.cpython-37.pyc (92%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/escsm.cpython-37.pyc (96%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/eucjpprober.cpython-37.pyc (92%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/euckrfreq.cpython-37.pyc (98%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/euckrprober.cpython-37.pyc (83%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/euctwfreq.cpython-37.pyc (99%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/euctwprober.cpython-37.pyc (83%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/gb2312freq.cpython-37.pyc (99%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/gb2312prober.cpython-37.pyc (83%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/hebrewprober.cpython-37.pyc (94%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/jisfreq.cpython-37.pyc (99%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/jpcntx.cpython-37.pyc (99%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/langbulgarianmodel.cpython-37.pyc (99%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/langcyrillicmodel.cpython-37.pyc (99%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/langgreekmodel.cpython-37.pyc (99%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/langhebrewmodel.cpython-37.pyc (99%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/langhungarianmodel.cpython-37.pyc (99%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/langthaimodel.cpython-37.pyc (99%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/langturkishmodel.cpython-37.pyc (99%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/latin1prober.cpython-37.pyc (94%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/mbcharsetprober.cpython-37.pyc (92%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/mbcsgroupprober.cpython-37.pyc (88%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/mbcssm.cpython-37.pyc (98%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/sbcharsetprober.cpython-37.pyc (94%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/sbcsgroupprober.cpython-37.pyc (88%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/sjisprober.cpython-37.pyc (92%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/universaldetector.cpython-37.pyc (97%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/utf8prober.cpython-37.pyc (75%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/version.cpython-37.pyc (69%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/chardet/big5freq.py (98%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/chardet/big5prober.py (97%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/chardet/chardistribution.py (97%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/chardet/charsetgroupprober.py (97%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/chardet/charsetprober.py (97%) rename myenv/lib/python3.7/site-packages/setuptools-39.0.1.dist-info/zip-safe => backend/venv/lib/python3.7/site-packages/pip/_vendor/chardet/cli/__init__.py (100%) create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/chardet/cli/__pycache__/__init__.cpython-37.pyc rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/chardet/cli/__pycache__/chardetect.cpython-37.pyc (93%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/chardet/cli/chardetect.py (97%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/chardet/codingstatemachine.py (97%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/chardet/compat.py (97%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/chardet/cp949prober.py (97%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/chardet/enums.py (95%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/chardet/escprober.py (97%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/chardet/escsm.py (97%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/chardet/eucjpprober.py (97%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/chardet/euckrfreq.py (98%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/chardet/euckrprober.py (97%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/chardet/euctwfreq.py (98%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/chardet/euctwprober.py (97%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/chardet/gb2312freq.py (98%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/chardet/gb2312prober.py (97%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/chardet/hebrewprober.py (97%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/chardet/jisfreq.py (98%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/chardet/jpcntx.py (98%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/chardet/langbulgarianmodel.py (98%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/chardet/langcyrillicmodel.py (98%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/chardet/langgreekmodel.py (98%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/chardet/langhebrewmodel.py (98%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/chardet/langhungarianmodel.py (98%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/chardet/langthaimodel.py (98%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/chardet/langturkishmodel.py (98%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/chardet/latin1prober.py (97%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/chardet/mbcharsetprober.py (97%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/chardet/mbcsgroupprober.py (97%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/chardet/mbcssm.py (97%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/chardet/sbcharsetprober.py (97%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/chardet/sbcsgroupprober.py (97%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/chardet/sjisprober.py (97%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/chardet/universaldetector.py (97%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/chardet/utf8prober.py (97%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/chardet/version.py (96%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/colorama/__init__.py (87%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/colorama/__pycache__/__init__.cpython-37.pyc (51%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/colorama/__pycache__/ansi.cpython-37.pyc (95%) create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/colorama/__pycache__/ansitowin32.cpython-37.pyc rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/colorama/__pycache__/initialise.cpython-37.pyc (91%) create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/colorama/__pycache__/win32.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/colorama/__pycache__/winterm.cpython-37.pyc rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/colorama/ansi.py (96%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/colorama/ansitowin32.py (88%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/colorama/initialise.py (95%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/colorama/win32.py (91%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/colorama/winterm.py (96%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/distlib/__init__.py (92%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/__init__.cpython-37.pyc (81%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/compat.cpython-37.pyc (99%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/database.cpython-37.pyc (65%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/index.cpython-37.pyc (99%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/locators.cpython-37.pyc (80%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/manifest.cpython-37.pyc (98%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/markers.cpython-37.pyc (95%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/metadata.cpython-37.pyc (72%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/resources.cpython-37.pyc (98%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/scripts.cpython-37.pyc (87%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/util.cpython-37.pyc (66%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/version.cpython-37.pyc (99%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/wheel.cpython-37.pyc (60%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/__init__.py (97%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/__pycache__/__init__.cpython-37.pyc (65%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/__pycache__/misc.cpython-37.pyc (82%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/__pycache__/shutil.cpython-37.pyc (89%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/__pycache__/sysconfig.cpython-37.pyc (98%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/__pycache__/tarfile.cpython-37.pyc (98%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/misc.py (95%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/shutil.py (97%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/sysconfig.cfg (96%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/sysconfig.py (97%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/tarfile.py (97%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/distlib/compat.py (97%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/distlib/database.py (97%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/distlib/index.py (97%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/distlib/locators.py (97%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/distlib/manifest.py (97%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/distlib/markers.py (97%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/distlib/metadata.py (96%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/distlib/resources.py (96%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/distlib/scripts.py (96%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/distlib/t32.exe (100%) mode change 100755 => 100644 rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/distlib/t64.exe (100%) mode change 100755 => 100644 rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/distlib/util.py (96%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/distlib/version.py (96%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/distlib/w32.exe (100%) mode change 100755 => 100644 rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/distlib/w64.exe (100%) mode change 100755 => 100644 rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/distlib/wheel.py (97%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/distro.py (81%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/html5lib/__init__.py (97%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/__init__.cpython-37.pyc (89%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/_ihatexml.cpython-37.pyc (85%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/_inputstream.cpython-37.pyc (99%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/_tokenizer.cpython-37.pyc (99%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/_utils.cpython-37.pyc (95%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/constants.cpython-37.pyc (99%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/html5parser.cpython-37.pyc (99%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/serializer.cpython-37.pyc (98%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/html5lib/_ihatexml.py (98%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/html5lib/_inputstream.py (97%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/html5lib/_tokenizer.py (97%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/__init__.py (95%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/__pycache__/__init__.cpython-37.pyc (59%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/__pycache__/_base.cpython-37.pyc (89%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/__pycache__/datrie.cpython-37.pyc (93%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/__pycache__/py.cpython-37.pyc (94%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/_base.py (96%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/datrie.py (96%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/py.py (96%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/html5lib/_utils.py (97%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/html5lib/constants.py (96%) rename {myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib => backend/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters}/__init__.py (100%) create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/__init__.cpython-37.pyc rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/alphabeticalattributes.cpython-37.pyc (86%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/base.cpython-37.pyc (83%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/inject_meta_charset.cpython-37.pyc (92%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/lint.cpython-37.pyc (95%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/optionaltags.cpython-37.pyc (94%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/sanitizer.cpython-37.pyc (86%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/whitespace.cpython-37.pyc (90%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/alphabeticalattributes.py (96%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/base.py (95%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/inject_meta_charset.py (97%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/lint.py (97%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/optionaltags.py (98%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/sanitizer.py (96%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/whitespace.py (96%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/html5lib/html5parser.py (97%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/html5lib/serializer.py (97%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/html5lib/treeadapters/__init__.py (95%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/html5lib/treeadapters/__pycache__/__init__.cpython-37.pyc (81%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/html5lib/treeadapters/__pycache__/genshi.cpython-37.pyc (87%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/html5lib/treeadapters/__pycache__/sax.cpython-37.pyc (84%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/html5lib/treeadapters/genshi.py (96%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/html5lib/treeadapters/sax.py (97%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/__init__.py (97%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/__init__.cpython-37.pyc (95%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/base.cpython-37.pyc (98%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/dom.cpython-37.pyc (98%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/etree.cpython-37.pyc (53%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/etree_lxml.cpython-37.pyc (50%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/base.py (97%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/dom.py (97%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/etree.py (97%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/etree_lxml.py (97%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/__init__.py (97%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/__init__.cpython-37.pyc (96%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/base.cpython-37.pyc (98%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/dom.cpython-37.pyc (89%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/etree.cpython-37.pyc (64%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/etree_lxml.cpython-37.pyc (89%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/genshi.cpython-37.pyc (90%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/base.py (96%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/dom.py (97%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/etree.py (97%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/etree_lxml.py (96%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/genshi.py (97%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/idna/__init__.py (96%) create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/__init__.cpython-37.pyc rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/codec.cpython-37.pyc (95%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/compat.cpython-37.pyc (74%) create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/core.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/idnadata.cpython-37.pyc rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/intranges.cpython-37.pyc (91%) create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/package_data.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/uts46data.cpython-37.pyc rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/idna/codec.py (96%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/idna/compat.py (95%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/idna/core.py (90%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/idna/idnadata.py (77%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/idna/intranges.py (97%) create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/idna/package_data.py rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/idna/uts46data.py (91%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/ipaddress.py (97%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/lockfile/__init__.py (96%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/lockfile/__pycache__/__init__.cpython-37.pyc (98%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/lockfile/__pycache__/linklockfile.cpython-37.pyc (91%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/lockfile/__pycache__/mkdirlockfile.cpython-37.pyc (90%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/lockfile/__pycache__/pidlockfile.cpython-37.pyc (97%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/lockfile/__pycache__/sqlitelockfile.cpython-37.pyc (96%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/lockfile/__pycache__/symlinklockfile.cpython-37.pyc (92%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/lockfile/linklockfile.py (97%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/lockfile/mkdirlockfile.py (97%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/lockfile/pidlockfile.py (96%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/lockfile/sqlitelockfile.py (97%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/lockfile/symlinklockfile.py (97%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/msgpack/__init__.py (96%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/msgpack/__pycache__/__init__.cpython-37.pyc (93%) create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/msgpack/__pycache__/_version.cpython-37.pyc rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/msgpack/__pycache__/exceptions.cpython-37.pyc (92%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/msgpack/__pycache__/fallback.cpython-37.pyc (99%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/msgpack/_version.py (95%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/msgpack/exceptions.py (96%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/msgpack/fallback.py (97%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/packaging/__about__.py (70%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/packaging/__init__.py (51%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/__about__.cpython-37.pyc (56%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/__init__.cpython-37.pyc (66%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/_compat.cpython-37.pyc (80%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/_structures.cpython-37.pyc (50%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/markers.cpython-37.pyc (73%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/requirements.cpython-37.pyc (55%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/specifiers.cpython-37.pyc (71%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/utils.cpython-37.pyc (77%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/version.cpython-37.pyc (63%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/packaging/_compat.py (83%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/packaging/_structures.py (95%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/packaging/markers.py (79%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/packaging/requirements.py (78%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/packaging/specifiers.py (92%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/packaging/utils.py (87%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/packaging/version.py (88%) create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/pep517/__init__.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/pep517/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/pep517/__pycache__/_in_process.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/pep517/__pycache__/build.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/pep517/__pycache__/check.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/pep517/__pycache__/colorlog.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/pep517/__pycache__/compat.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/pep517/__pycache__/envbuild.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/pep517/__pycache__/wrappers.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/pep517/_in_process.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/pep517/build.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/pep517/check.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/pep517/colorlog.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/pep517/compat.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/pep517/envbuild.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/pep517/wrappers.py rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/pkg_resources/__init__.py (94%) create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/pkg_resources/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/pkg_resources/__pycache__/py31compat.cpython-37.pyc rename {myenv/lib/python3.7/site-packages => backend/venv/lib/python3.7/site-packages/pip/_vendor}/pkg_resources/py31compat.py (86%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/progress/__init__.py (57%) create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/progress/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/progress/__pycache__/bar.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/progress/__pycache__/counter.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/progress/__pycache__/spinner.cpython-37.pyc rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/progress/bar.py (90%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/progress/counter.py (82%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/progress/spinner.py (86%) rename {myenv/lib/python3.7/site-packages/setuptools => backend/venv/lib/python3.7/site-packages/pip}/_vendor/pyparsing.py (73%) create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/pytoml/__init__.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/pytoml/__pycache__/__init__.cpython-37.pyc rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/pytoml/__pycache__/core.cpython-37.pyc (53%) create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/pytoml/__pycache__/parser.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/pytoml/__pycache__/test.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/pytoml/__pycache__/utils.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/pytoml/__pycache__/writer.cpython-37.pyc rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/pytoml/core.py (97%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/pytoml/parser.py (74%) create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/pytoml/test.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/pytoml/utils.py rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/pytoml/writer.py (70%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/requests/__init__.py (79%) create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/__version__.cpython-37.pyc rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/_internal_utils.cpython-37.pyc (90%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/adapters.cpython-37.pyc (51%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/api.cpython-37.pyc (71%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/auth.cpython-37.pyc (59%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/certs.cpython-37.pyc (74%) create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/compat.cpython-37.pyc rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/cookies.cpython-37.pyc (51%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/exceptions.cpython-37.pyc (71%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/help.cpython-37.pyc (62%) create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/hooks.cpython-37.pyc rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/models.cpython-37.pyc (54%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/packages.cpython-37.pyc (73%) create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/sessions.cpython-37.pyc rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/status_codes.cpython-37.pyc (57%) create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/structures.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/utils.cpython-37.pyc rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/requests/__version__.py (76%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/requests/_internal_utils.py (96%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/requests/adapters.py (92%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/requests/api.py (82%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/requests/auth.py (95%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/requests/certs.py (96%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/requests/compat.py (92%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/requests/cookies.py (94%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/requests/exceptions.py (96%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/requests/help.py (91%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/requests/hooks.py (86%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/requests/models.py (94%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/requests/packages.py (97%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/requests/sessions.py (89%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/requests/status_codes.py (75%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/requests/structures.py (89%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/requests/utils.py (87%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/retrying.py (97%) create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/six.py rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/urllib3/__init__.py (90%) create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/__init__.cpython-37.pyc rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/_collections.cpython-37.pyc (50%) create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/connection.cpython-37.pyc rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/connectionpool.cpython-37.pyc (66%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/exceptions.cpython-37.pyc (97%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/fields.cpython-37.pyc (96%) create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/filepost.cpython-37.pyc rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/poolmanager.cpython-37.pyc (64%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/request.cpython-37.pyc (76%) create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/response.cpython-37.pyc rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/urllib3/_collections.py (91%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/urllib3/connection.py (83%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/urllib3/connectionpool.py (94%) rename {myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport => backend/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib}/__init__.py (100%) create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__pycache__/_appengine_environ.cpython-37.pyc rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__pycache__/appengine.cpython-37.pyc (55%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__pycache__/ntlmpool.cpython-37.pyc (77%) create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__pycache__/pyopenssl.cpython-37.pyc rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__pycache__/securetransport.cpython-37.pyc (54%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__pycache__/socks.cpython-37.pyc (83%) create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/_appengine_environ.py rename {myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/backports => backend/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport}/__init__.py (100%) create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-37.pyc rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/bindings.cpython-37.pyc (98%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-37.pyc (70%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py (96%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py (96%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/appengine.py (90%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py (96%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py (91%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/securetransport.py (94%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/socks.py (96%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/urllib3/exceptions.py (95%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/urllib3/fields.py (96%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/urllib3/filepost.py (91%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/__init__.py (95%) create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/__pycache__/__init__.cpython-37.pyc rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/__pycache__/six.cpython-37.pyc (99%) rename {myenv/lib/python3.7/site-packages/pkg_resources/_vendor => backend/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/backports}/__init__.py (100%) create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/__init__.cpython-37.pyc rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/makefile.cpython-37.pyc (63%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py (93%) rename {myenv/lib/python3.7/site-packages/pkg_resources/_vendor => backend/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages}/six.py (100%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.py (97%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__pycache__/__init__.cpython-37.pyc (74%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__pycache__/_implementation.cpython-37.pyc (84%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.py (95%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/urllib3/poolmanager.py (96%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/urllib3/request.py (92%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/urllib3/response.py (83%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__init__.py (95%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/__init__.cpython-37.pyc (80%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/connection.cpython-37.pyc (52%) create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/queue.cpython-37.pyc rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/request.cpython-37.pyc (95%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/response.cpython-37.pyc (64%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/retry.cpython-37.pyc (67%) create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_.cpython-37.pyc rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/timeout.cpython-37.pyc (98%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/url.cpython-37.pyc (96%) create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/wait.cpython-37.pyc rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/urllib3/util/connection.py (86%) create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/queue.py rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/urllib3/util/request.py (96%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/urllib3/util/response.py (87%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/urllib3/util/retry.py (95%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/urllib3/util/ssl_.py (79%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/urllib3/util/timeout.py (97%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/urllib3/util/url.py (96%) create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/wait.py rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/webencodings/__init__.py (96%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/webencodings/__pycache__/__init__.cpython-37.pyc (97%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/webencodings/__pycache__/labels.cpython-37.pyc (94%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/webencodings/__pycache__/mklabels.cpython-37.pyc (92%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/webencodings/__pycache__/tests.cpython-37.pyc (95%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/webencodings/__pycache__/x_user_defined.cpython-37.pyc (93%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/webencodings/labels.py (97%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/webencodings/mklabels.py (95%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/webencodings/tests.py (97%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pip/_vendor/webencodings/x_user_defined.py (92%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pkg_resources/__init__.py (94%) create mode 100644 backend/venv/lib/python3.7/site-packages/pkg_resources/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pkg_resources/__pycache__/py31compat.cpython-37.pyc rename {myenv/lib/python3.7/site-packages/setuptools => backend/venv/lib/python3.7/site-packages/pkg_resources}/_vendor/__init__.py (100%) create mode 100644 backend/venv/lib/python3.7/site-packages/pkg_resources/_vendor/__pycache__/__init__.cpython-37.pyc rename {myenv => backend/venv}/lib/python3.7/site-packages/pkg_resources/_vendor/__pycache__/appdirs.cpython-37.pyc (67%) rename {myenv/lib/python3.7/site-packages/pip => backend/venv/lib/python3.7/site-packages/pkg_resources}/_vendor/__pycache__/pyparsing.cpython-37.pyc (65%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pkg_resources/_vendor/__pycache__/six.cpython-37.pyc (99%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pkg_resources/_vendor/appdirs.py (87%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__about__.py (100%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__init__.py (100%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/__about__.cpython-37.pyc (80%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/__init__.cpython-37.pyc (77%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/_compat.cpython-37.pyc (87%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/_structures.cpython-37.pyc (94%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/markers.cpython-37.pyc (98%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/requirements.cpython-37.pyc (96%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/specifiers.cpython-37.pyc (99%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/utils.cpython-37.pyc (74%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/version.cpython-37.pyc (98%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/_compat.py (100%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/_structures.py (100%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/markers.py (100%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/requirements.py (100%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/specifiers.py (100%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/utils.py (100%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/version.py (100%) rename {myenv/lib/python3.7/site-packages/pip => backend/venv/lib/python3.7/site-packages/pkg_resources}/_vendor/pyparsing.py (96%) rename {myenv/lib/python3.7/site-packages/setuptools => backend/venv/lib/python3.7/site-packages/pkg_resources}/_vendor/six.py (100%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pkg_resources/extern/__init__.py (97%) rename {myenv => backend/venv}/lib/python3.7/site-packages/pkg_resources/extern/__pycache__/__init__.cpython-37.pyc (85%) rename {myenv/lib/python3.7/site-packages/pip/_vendor => backend/venv/lib/python3.7/site-packages}/pkg_resources/py31compat.py (83%) create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools-41.0.1.dist-info/INSTALLER rename myenv/lib/python3.7/site-packages/setuptools-39.0.1.dist-info/LICENSE.txt => backend/venv/lib/python3.7/site-packages/setuptools-41.0.1.dist-info/LICENSE (100%) rename {myenv/lib/python3.7/site-packages/setuptools-39.0.1.dist-info => backend/venv/lib/python3.7/site-packages/setuptools-41.0.1.dist-info}/METADATA (66%) rename {myenv/lib/python3.7/site-packages/setuptools-39.0.1.dist-info => backend/venv/lib/python3.7/site-packages/setuptools-41.0.1.dist-info}/RECORD (72%) create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools-41.0.1.dist-info/WHEEL rename {myenv/lib/python3.7/site-packages/setuptools-39.0.1.dist-info => backend/venv/lib/python3.7/site-packages/setuptools-41.0.1.dist-info}/dependency_links.txt (100%) rename {myenv/lib/python3.7/site-packages/setuptools-39.0.1.dist-info => backend/venv/lib/python3.7/site-packages/setuptools-41.0.1.dist-info}/entry_points.txt (100%) rename {myenv/lib/python3.7/site-packages/setuptools-39.0.1.dist-info => backend/venv/lib/python3.7/site-packages/setuptools-41.0.1.dist-info}/top_level.txt (100%) rename myenv/lib/python3.7/site-packages/pip/_vendor/chardet/cli/__init__.py => backend/venv/lib/python3.7/site-packages/setuptools-41.0.1.dist-info/zip-safe (50%) rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/__init__.py (77%) create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/__pycache__/_deprecation_warning.cpython-37.pyc rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/__pycache__/archive_util.cpython-37.pyc (95%) create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/__pycache__/build_meta.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/__pycache__/config.cpython-37.pyc rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/__pycache__/dep_util.cpython-37.pyc (84%) rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/__pycache__/depends.cpython-37.pyc (97%) create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/__pycache__/dist.cpython-37.pyc rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/__pycache__/extension.cpython-37.pyc (88%) rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/__pycache__/glibc.cpython-37.pyc (89%) create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/__pycache__/glob.cpython-37.pyc rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/__pycache__/launch.cpython-37.pyc (83%) rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/__pycache__/lib2to3_ex.cpython-37.pyc (93%) rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/__pycache__/monkey.cpython-37.pyc (52%) rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/__pycache__/msvc.cpython-37.pyc (85%) rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/__pycache__/namespaces.cpython-37.pyc (94%) rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/__pycache__/package_index.cpython-37.pyc (68%) create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/__pycache__/pep425tags.cpython-37.pyc rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/__pycache__/py27compat.cpython-37.pyc (81%) create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/__pycache__/py31compat.cpython-37.pyc rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/__pycache__/py33compat.cpython-37.pyc (53%) rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/__pycache__/sandbox.cpython-37.pyc (98%) rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/__pycache__/site-patch.cpython-37.pyc (89%) rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/__pycache__/ssl_support.cpython-37.pyc (96%) rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/__pycache__/unicode_utils.cpython-37.pyc (88%) create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/__pycache__/version.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/__pycache__/wheel.cpython-37.pyc rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/__pycache__/windows_support.cpython-37.pyc (86%) create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/_deprecation_warning.py create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/_vendor/__init__.py create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/_vendor/__pycache__/__init__.cpython-37.pyc rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/_vendor/__pycache__/pyparsing.cpython-37.pyc (64%) rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/_vendor/__pycache__/six.cpython-37.pyc (99%) rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/_vendor/packaging/__about__.py (100%) rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/_vendor/packaging/__init__.py (100%) rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/__about__.cpython-37.pyc (80%) rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/__init__.cpython-37.pyc (77%) rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/_compat.cpython-37.pyc (87%) rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/_structures.cpython-37.pyc (94%) rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/markers.cpython-37.pyc (98%) rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/requirements.cpython-37.pyc (96%) rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/specifiers.cpython-37.pyc (99%) rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/utils.cpython-37.pyc (74%) rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/version.cpython-37.pyc (98%) rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/_vendor/packaging/_compat.py (100%) rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/_vendor/packaging/_structures.py (100%) rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/_vendor/packaging/markers.py (100%) rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/_vendor/packaging/requirements.py (100%) rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/_vendor/packaging/specifiers.py (100%) rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/_vendor/packaging/utils.py (100%) rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/_vendor/packaging/version.py (100%) rename {myenv/lib/python3.7/site-packages/pkg_resources => backend/venv/lib/python3.7/site-packages/setuptools}/_vendor/pyparsing.py (96%) rename {myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages => backend/venv/lib/python3.7/site-packages/setuptools/_vendor}/six.py (97%) rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/archive_util.py (100%) create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/build_meta.py rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/cli-32.exe (100%) rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/cli-64.exe (100%) rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/cli.exe (100%) rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/command/__init__.py (100%) rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/command/__pycache__/__init__.cpython-37.pyc (83%) rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/command/__pycache__/alias.cpython-37.pyc (91%) rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/command/__pycache__/bdist_egg.cpython-37.pyc (89%) rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/command/__pycache__/bdist_rpm.cpython-37.pyc (86%) rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/command/__pycache__/bdist_wininst.cpython-37.pyc (83%) rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/command/__pycache__/build_clib.cpython-37.pyc (90%) rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/command/__pycache__/build_ext.cpython-37.pyc (50%) rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/command/__pycache__/build_py.cpython-37.pyc (98%) create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/develop.cpython-37.pyc rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/command/__pycache__/dist_info.cpython-37.pyc (86%) rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/command/__pycache__/easy_install.cpython-37.pyc (55%) create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/egg_info.cpython-37.pyc rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/command/__pycache__/install.cpython-37.pyc (94%) rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/command/__pycache__/install_egg_info.cpython-37.pyc (92%) rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/command/__pycache__/install_lib.cpython-37.pyc (96%) rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/command/__pycache__/install_scripts.cpython-37.pyc (93%) rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/command/__pycache__/py36compat.cpython-37.pyc (96%) create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/register.cpython-37.pyc rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/command/__pycache__/rotate.cpython-37.pyc (92%) rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/command/__pycache__/saveopts.cpython-37.pyc (80%) rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/command/__pycache__/sdist.cpython-37.pyc (73%) rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/command/__pycache__/setopt.cpython-37.pyc (95%) rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/command/__pycache__/test.cpython-37.pyc (50%) create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/upload.cpython-37.pyc rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/command/__pycache__/upload_docs.cpython-37.pyc (90%) rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/command/alias.py (100%) rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/command/bdist_egg.py (99%) rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/command/bdist_rpm.py (100%) rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/command/bdist_wininst.py (100%) rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/command/build_clib.py (100%) rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/command/build_ext.py (97%) rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/command/build_py.py (100%) rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/command/develop.py (90%) rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/command/dist_info.py (100%) rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/command/easy_install.py (98%) rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/command/egg_info.py (95%) rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/command/install.py (100%) rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/command/install_egg_info.py (100%) rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/command/install_lib.py (100%) rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/command/install_scripts.py (100%) rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/command/launcher manifest.xml (100%) rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/command/py36compat.py (100%) create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/command/register.py rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/command/rotate.py (100%) rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/command/saveopts.py (100%) rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/command/sdist.py (90%) rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/command/setopt.py (100%) rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/command/test.py (98%) create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/command/upload.py rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/command/upload_docs.py (100%) rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/config.py (76%) rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/dep_util.py (100%) rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/depends.py (100%) rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/dist.py (79%) rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/extension.py (100%) rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/extern/__init__.py (98%) rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/extern/__pycache__/__init__.cpython-37.pyc (85%) rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/glibc.py (100%) rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/glob.py (93%) rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/gui-32.exe (100%) rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/gui-64.exe (100%) rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/gui.exe (100%) rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/launch.py (100%) rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/lib2to3_ex.py (100%) rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/monkey.py (84%) rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/msvc.py (99%) rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/namespaces.py (100%) rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/package_index.py (96%) rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/pep425tags.py (96%) rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/py27compat.py (100%) rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/py31compat.py (57%) rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/py33compat.py (96%) rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/sandbox.py (100%) rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/script (dev).tmpl (66%) rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/script.tmpl (100%) rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/site-patch.py (97%) rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/ssl_support.py (99%) rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/unicode_utils.py (100%) rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/version.py (100%) create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/wheel.py rename {myenv => backend/venv}/lib/python3.7/site-packages/setuptools/windows_support.py (100%) create mode 100644 backend/venv/lib/python3.7/site-packages/six-1.11.0.dist-info/DESCRIPTION.rst create mode 100644 backend/venv/lib/python3.7/site-packages/six-1.11.0.dist-info/INSTALLER create mode 100644 backend/venv/lib/python3.7/site-packages/six-1.11.0.dist-info/METADATA create mode 100644 backend/venv/lib/python3.7/site-packages/six-1.11.0.dist-info/RECORD create mode 100644 backend/venv/lib/python3.7/site-packages/six-1.11.0.dist-info/WHEEL create mode 100644 backend/venv/lib/python3.7/site-packages/six-1.11.0.dist-info/metadata.json create mode 100644 backend/venv/lib/python3.7/site-packages/six-1.11.0.dist-info/top_level.txt rename {myenv/lib/python3.7/site-packages/pip/_vendor => backend/venv/lib/python3.7/site-packages}/six.py (97%) create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/__init__.py create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/__pycache__/_compat.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/__pycache__/_internal.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/__pycache__/_reloader.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/__pycache__/datastructures.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/__pycache__/exceptions.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/__pycache__/filesystem.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/__pycache__/formparser.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/__pycache__/http.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/__pycache__/local.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/__pycache__/posixemulation.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/__pycache__/routing.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/__pycache__/script.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/__pycache__/security.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/__pycache__/serving.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/__pycache__/test.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/__pycache__/testapp.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/__pycache__/urls.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/__pycache__/useragents.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/__pycache__/utils.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/__pycache__/wrappers.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/__pycache__/wsgi.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/_compat.py create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/_internal.py create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/_reloader.py create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/contrib/__init__.py create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/contrib/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/contrib/__pycache__/atom.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/contrib/__pycache__/cache.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/contrib/__pycache__/fixers.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/contrib/__pycache__/iterio.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/contrib/__pycache__/jsrouting.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/contrib/__pycache__/limiter.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/contrib/__pycache__/lint.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/contrib/__pycache__/profiler.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/contrib/__pycache__/securecookie.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/contrib/__pycache__/sessions.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/contrib/__pycache__/testtools.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/contrib/__pycache__/wrappers.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/contrib/atom.py create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/contrib/cache.py create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/contrib/fixers.py create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/contrib/iterio.py create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/contrib/jsrouting.py create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/contrib/limiter.py create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/contrib/lint.py create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/contrib/profiler.py create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/contrib/securecookie.py create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/contrib/sessions.py create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/contrib/testtools.py create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/contrib/wrappers.py create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/datastructures.py create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/debug/__init__.py create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/debug/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/debug/__pycache__/console.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/debug/__pycache__/repr.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/debug/__pycache__/tbtools.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/debug/console.py create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/debug/repr.py create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/debug/shared/FONT_LICENSE create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/debug/shared/console.png create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/debug/shared/debugger.js create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/debug/shared/jquery.js create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/debug/shared/less.png create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/debug/shared/more.png create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/debug/shared/source.png create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/debug/shared/style.css create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/debug/shared/ubuntu.ttf create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/debug/tbtools.py create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/exceptions.py create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/filesystem.py create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/formparser.py create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/http.py create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/local.py create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/posixemulation.py create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/routing.py create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/script.py create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/security.py create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/serving.py create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/test.py create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/testapp.py create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/urls.py create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/useragents.py create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/utils.py create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/wrappers.py create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/wsgi.py create mode 100644 backend/venv/lib/python3.7/site-packages/wheel-0.33.4.dist-info/INSTALLER create mode 100644 backend/venv/lib/python3.7/site-packages/wheel-0.33.4.dist-info/LICENSE.txt create mode 100644 backend/venv/lib/python3.7/site-packages/wheel-0.33.4.dist-info/METADATA create mode 100644 backend/venv/lib/python3.7/site-packages/wheel-0.33.4.dist-info/RECORD create mode 100644 backend/venv/lib/python3.7/site-packages/wheel-0.33.4.dist-info/WHEEL create mode 100644 backend/venv/lib/python3.7/site-packages/wheel-0.33.4.dist-info/entry_points.txt create mode 100644 backend/venv/lib/python3.7/site-packages/wheel-0.33.4.dist-info/top_level.txt create mode 100644 backend/venv/lib/python3.7/site-packages/wheel/__init__.py create mode 100644 backend/venv/lib/python3.7/site-packages/wheel/__main__.py create mode 100644 backend/venv/lib/python3.7/site-packages/wheel/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/wheel/__pycache__/__main__.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/wheel/__pycache__/bdist_wheel.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/wheel/__pycache__/metadata.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/wheel/__pycache__/pep425tags.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/wheel/__pycache__/pkginfo.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/wheel/__pycache__/util.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/wheel/__pycache__/wheelfile.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/wheel/bdist_wheel.py create mode 100644 backend/venv/lib/python3.7/site-packages/wheel/cli/__init__.py create mode 100644 backend/venv/lib/python3.7/site-packages/wheel/cli/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/wheel/cli/__pycache__/convert.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/wheel/cli/__pycache__/pack.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/wheel/cli/__pycache__/unpack.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/wheel/cli/convert.py create mode 100644 backend/venv/lib/python3.7/site-packages/wheel/cli/pack.py create mode 100644 backend/venv/lib/python3.7/site-packages/wheel/cli/unpack.py create mode 100644 backend/venv/lib/python3.7/site-packages/wheel/metadata.py create mode 100644 backend/venv/lib/python3.7/site-packages/wheel/pep425tags.py create mode 100644 backend/venv/lib/python3.7/site-packages/wheel/pkginfo.py create mode 100644 backend/venv/lib/python3.7/site-packages/wheel/util.py create mode 100644 backend/venv/lib/python3.7/site-packages/wheel/wheelfile.py create mode 100644 backend/venv/lib/python3.7/site.py create mode 120000 backend/venv/lib/python3.7/sre_compile.py create mode 120000 backend/venv/lib/python3.7/sre_constants.py create mode 120000 backend/venv/lib/python3.7/sre_parse.py create mode 120000 backend/venv/lib/python3.7/stat.py create mode 120000 backend/venv/lib/python3.7/struct.py create mode 120000 backend/venv/lib/python3.7/tarfile.py create mode 120000 backend/venv/lib/python3.7/tempfile.py create mode 120000 backend/venv/lib/python3.7/token.py create mode 120000 backend/venv/lib/python3.7/tokenize.py create mode 120000 backend/venv/lib/python3.7/types.py create mode 120000 backend/venv/lib/python3.7/warnings.py create mode 120000 backend/venv/lib/python3.7/weakref.py create mode 100755 frontend/README.md delete mode 100755 frontend/build/dev-client.js delete mode 100755 frontend/build/dev-server.js create mode 100755 frontend/build/logo.png mode change 100644 => 100755 frontend/package-lock.json rename frontend/{vue-shim.d.ts => shims.d.ts} (96%) create mode 100644 frontend/src/assets/isovis.jpg mode change 100755 => 100644 frontend/src/components/About.vue delete mode 100755 frontend/src/components/HelloWorld.vue mode change 100755 => 100644 frontend/src/components/NotFound.vue mode change 100644 => 100755 frontend/tsconfig.json delete mode 100644 myenv/bin/activate.csh delete mode 100644 myenv/bin/activate.fish delete mode 120000 myenv/bin/python delete mode 120000 myenv/bin/python3 delete mode 120000 myenv/bin/python3.7 delete mode 100644 myenv/lib/python3.7/site-packages/pip-10.0.1.dist-info/METADATA delete mode 100644 myenv/lib/python3.7/site-packages/pip-10.0.1.dist-info/RECORD delete mode 100644 myenv/lib/python3.7/site-packages/pip/__init__.py delete mode 100644 myenv/lib/python3.7/site-packages/pip/__pycache__/__init__.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/__init__.py delete mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/__pycache__/__init__.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/__pycache__/basecommand.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/__pycache__/baseparser.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/__pycache__/build_env.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/__pycache__/cache.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/__pycache__/cmdoptions.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/__pycache__/compat.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/__pycache__/configuration.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/__pycache__/download.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/__pycache__/exceptions.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/__pycache__/index.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/__pycache__/locations.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/__pycache__/pep425tags.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/__pycache__/resolve.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/__pycache__/status_codes.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/__pycache__/wheel.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/build_env.py delete mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/check.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/configuration.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/download.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/help.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/install.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/list.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/uninstall.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/wheel.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/models/__init__.py delete mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/models/__pycache__/__init__.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/models/__pycache__/index.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/models/index.py delete mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/operations/__pycache__/__init__.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/operations/__pycache__/check.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/operations/__pycache__/freeze.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/operations/__pycache__/prepare.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/req/__pycache__/__init__.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/req/__pycache__/req_file.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/req/__pycache__/req_install.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/req/__pycache__/req_set.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/req/__pycache__/req_uninstall.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/req/req_set.py delete mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/__init__.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/deprecation.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/encoding.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/filesystem.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/glibc.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/hashes.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/logging.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/misc.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/outdated.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/packaging.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/temp_dir.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/ui.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/utils/deprecation.py delete mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/utils/logging.py delete mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/utils/temp_dir.py delete mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/vcs/__init__.py delete mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/vcs/__pycache__/__init__.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/vcs/__pycache__/bazaar.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/vcs/__pycache__/git.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/vcs/__pycache__/mercurial.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/vcs/__pycache__/subversion.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/vcs/subversion.py delete mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/__pycache__/__init__.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/wrapper.py delete mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/certifi/__init__.py delete mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/certifi/__main__.py delete mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/certifi/__pycache__/__init__.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/certifi/__pycache__/__main__.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/certifi/__pycache__/core.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/certifi/core.py delete mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/chardet/cli/__pycache__/__init__.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/colorama/__pycache__/ansitowin32.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/colorama/__pycache__/win32.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/colorama/__pycache__/winterm.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/__init__.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/__init__.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/core.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/idnadata.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/package_data.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/uts46data.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/idna/package_data.py delete mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/msgpack/__pycache__/_version.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/pkg_resources/__pycache__/__init__.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/pkg_resources/__pycache__/py31compat.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/progress/__pycache__/__init__.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/progress/__pycache__/bar.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/progress/__pycache__/counter.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/progress/__pycache__/helpers.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/progress/__pycache__/spinner.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/progress/helpers.py delete mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/pytoml/__init__.py delete mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/pytoml/__pycache__/__init__.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/pytoml/__pycache__/parser.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/pytoml/__pycache__/writer.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/__init__.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/__version__.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/compat.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/hooks.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/sessions.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/structures.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/utils.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/__init__.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/connection.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/filepost.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/response.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__pycache__/pyopenssl.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/__pycache__/__init__.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/__pycache__/ordered_dict.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/__init__.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/ordered_dict.py delete mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/selectors.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/wait.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/selectors.py delete mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/wait.py delete mode 100644 myenv/lib/python3.7/site-packages/pkg_resources/__pycache__/__init__.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/pkg_resources/__pycache__/py31compat.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/pkg_resources/_vendor/__pycache__/__init__.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/pkg_resources/_vendor/__pycache__/pyparsing.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/setuptools-39.0.1.dist-info/DESCRIPTION.rst delete mode 100644 myenv/lib/python3.7/site-packages/setuptools-39.0.1.dist-info/metadata.json delete mode 100644 myenv/lib/python3.7/site-packages/setuptools/__pycache__/__init__.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/setuptools/__pycache__/build_meta.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/setuptools/__pycache__/config.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/setuptools/__pycache__/dist.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/setuptools/__pycache__/glob.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/setuptools/__pycache__/pep425tags.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/setuptools/__pycache__/py31compat.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/setuptools/__pycache__/py36compat.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/setuptools/__pycache__/version.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/setuptools/__pycache__/wheel.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/setuptools/_vendor/__pycache__/__init__.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/setuptools/build_meta.py delete mode 100644 myenv/lib/python3.7/site-packages/setuptools/command/__pycache__/develop.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/setuptools/command/__pycache__/egg_info.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/setuptools/command/__pycache__/register.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/setuptools/command/__pycache__/upload.cpython-37.pyc delete mode 100644 myenv/lib/python3.7/site-packages/setuptools/command/register.py delete mode 100644 myenv/lib/python3.7/site-packages/setuptools/command/upload.py delete mode 100644 myenv/lib/python3.7/site-packages/setuptools/py36compat.py delete mode 100644 myenv/lib/python3.7/site-packages/setuptools/wheel.py delete mode 100644 myenv/pyvenv.cfg mode change 100755 => 100644 run.py diff --git a/.vscode/settings.json b/.vscode/settings.json old mode 100644 new mode 100755 diff --git a/__pycache__/run.cpython-37.pyc b/__pycache__/run.cpython-37.pyc index dc684e39dd36b4cb70241ffaf649510b5e424883..cd15aaedb42aa303fb246d2494941066e17a8d16 100644 GIT binary patch delta 21 bcmZ3(zJ{I0iI=2.10.1 MarkupSafe==1.0 six==1.11.0 -Werkzeug==0.12.2 +Werkzeug==0.12.2 \ No newline at end of file diff --git a/backend/venv/.Python b/backend/venv/.Python new file mode 120000 index 000000000..a7e44c698 --- /dev/null +++ b/backend/venv/.Python @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/Python \ No newline at end of file diff --git a/myenv/bin/activate b/backend/venv/bin/activate similarity index 50% rename from myenv/bin/activate rename to backend/venv/bin/activate index 0ab92ff4e..eb7bafbed 100644 --- a/myenv/bin/activate +++ b/backend/venv/bin/activate @@ -2,14 +2,17 @@ # you cannot run it directly deactivate () { + unset -f pydoc >/dev/null 2>&1 + # reset old environment variables - if [ -n "${_OLD_VIRTUAL_PATH:-}" ] ; then - PATH="${_OLD_VIRTUAL_PATH:-}" + # ! [ -z ${VAR+_} ] returns true if VAR is declared at all + if ! [ -z "${_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:-}" + if ! [ -z "${_OLD_VIRTUAL_PYTHONHOME+_}" ] ; then + PYTHONHOME="$_OLD_VIRTUAL_PYTHONHOME" export PYTHONHOME unset _OLD_VIRTUAL_PYTHONHOME fi @@ -17,18 +20,18 @@ deactivate () { # 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 + if [ -n "${BASH-}" ] || [ -n "${ZSH_VERSION-}" ] ; then + hash -r 2>/dev/null fi - if [ -n "${_OLD_VIRTUAL_PS1:-}" ] ; then - PS1="${_OLD_VIRTUAL_PS1:-}" + if ! [ -z "${_OLD_VIRTUAL_PS1+_}" ] ; then + PS1="$_OLD_VIRTUAL_PS1" export PS1 unset _OLD_VIRTUAL_PS1 fi unset VIRTUAL_ENV - if [ ! "$1" = "nondestructive" ] ; then + if [ ! "${1-}" = "nondestructive" ] ; then # Self destruct! unset -f deactivate fi @@ -37,7 +40,7 @@ deactivate () { # unset irrelevant variables deactivate nondestructive -VIRTUAL_ENV="/Users/anchaa/Documents/Research/iStacking_code/istacking/myenv" +VIRTUAL_ENV="/Users/anchaa/Documents/Research/iStacking_code/istacking/backend/venv" export VIRTUAL_ENV _OLD_VIRTUAL_PATH="$PATH" @@ -45,32 +48,31 @@ 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:-}" +if ! [ -z "${PYTHONHOME+_}" ] ; then + _OLD_VIRTUAL_PYTHONHOME="$PYTHONHOME" unset PYTHONHOME fi -if [ -z "${VIRTUAL_ENV_DISABLE_PROMPT:-}" ] ; then - _OLD_VIRTUAL_PS1="${PS1:-}" - if [ "x(myenv) " != x ] ; then - PS1="(myenv) ${PS1:-}" - else - if [ "`basename \"$VIRTUAL_ENV\"`" = "__" ] ; then - # special case for Aspen magic directories - # see http://www.zetadev.com/software/aspen/ - PS1="[`basename \`dirname \"$VIRTUAL_ENV\"\``] $PS1" +if [ -z "${VIRTUAL_ENV_DISABLE_PROMPT-}" ] ; then + _OLD_VIRTUAL_PS1="${PS1-}" + if [ "x" != x ] ; then + PS1="${PS1-}" else - PS1="(`basename \"$VIRTUAL_ENV\"`)$PS1" - fi + PS1="(`basename \"$VIRTUAL_ENV\"`) ${PS1-}" fi export PS1 fi +# Make sure to unalias pydoc if it's already there +alias pydoc 2>/dev/null >/dev/null && unalias pydoc || true + +pydoc () { + python -m pydoc "$@" +} + # 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 +if [ -n "${BASH-}" ] || [ -n "${ZSH_VERSION-}" ] ; then + hash -r 2>/dev/null fi diff --git a/backend/venv/bin/activate.csh b/backend/venv/bin/activate.csh new file mode 100644 index 000000000..118152293 --- /dev/null +++ b/backend/venv/bin/activate.csh @@ -0,0 +1,55 @@ +# This file must be used with "source bin/activate.csh" *from csh*. +# You cannot run it directly. +# Created by Davide Di Blasi . + +set newline='\ +' + +alias deactivate 'test $?_OLD_VIRTUAL_PATH != 0 && setenv PATH "$_OLD_VIRTUAL_PATH:q" && unset _OLD_VIRTUAL_PATH; rehash; test $?_OLD_VIRTUAL_PROMPT != 0 && set prompt="$_OLD_VIRTUAL_PROMPT:q" && unset _OLD_VIRTUAL_PROMPT; unsetenv VIRTUAL_ENV; test "\!:*" != "nondestructive" && unalias deactivate && unalias pydoc' + +# Unset irrelevant variables. +deactivate nondestructive + +setenv VIRTUAL_ENV "/Users/anchaa/Documents/Research/iStacking_code/istacking/backend/venv" + +set _OLD_VIRTUAL_PATH="$PATH:q" +setenv PATH "$VIRTUAL_ENV:q/bin:$PATH:q" + + + +if ("" != "") then + set env_name = "" +else + set env_name = '('"$VIRTUAL_ENV:t:q"') ' +endif + +if ( $?VIRTUAL_ENV_DISABLE_PROMPT ) then + if ( $VIRTUAL_ENV_DISABLE_PROMPT == "" ) then + set do_prompt = "1" + else + set do_prompt = "0" + endif +else + set do_prompt = "1" +endif + +if ( $do_prompt == "1" ) then + # Could be in a non-interactive environment, + # in which case, $prompt is undefined and we wouldn't + # care about the prompt anyway. + if ( $?prompt ) then + set _OLD_VIRTUAL_PROMPT="$prompt:q" + if ( "$prompt:q" =~ *"$newline:q"* ) then + : + else + set prompt = "$env_name:q$prompt:q" + endif + endif +endif + +unset env_name +unset do_prompt + +alias pydoc python -m pydoc + +rehash diff --git a/backend/venv/bin/activate.fish b/backend/venv/bin/activate.fish new file mode 100644 index 000000000..143e707c4 --- /dev/null +++ b/backend/venv/bin/activate.fish @@ -0,0 +1,101 @@ +# This file must be used using `source bin/activate.fish` *within a running fish ( http://fishshell.com ) session*. +# Do not run it directly. + +function _bashify_path -d "Converts a fish path to something bash can recognize" + set fishy_path $argv + set bashy_path $fishy_path[1] + for path_part in $fishy_path[2..-1] + set bashy_path "$bashy_path:$path_part" + end + echo $bashy_path +end + +function _fishify_path -d "Converts a bash path to something fish can recognize" + echo $argv | tr ':' '\n' +end + +function deactivate -d 'Exit virtualenv mode and return to the normal environment.' + # reset old environment variables + if test -n "$_OLD_VIRTUAL_PATH" + # https://github.com/fish-shell/fish-shell/issues/436 altered PATH handling + if test (echo $FISH_VERSION | tr "." "\n")[1] -lt 3 + set -gx PATH (_fishify_path $_OLD_VIRTUAL_PATH) + else + set -gx PATH $_OLD_VIRTUAL_PATH + end + 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" + # Set an empty local `$fish_function_path` to allow the removal of `fish_prompt` using `functions -e`. + set -l fish_function_path + + # Erase virtualenv's `fish_prompt` and restore the original. + functions -e fish_prompt + functions -c _old_fish_prompt fish_prompt + functions -e _old_fish_prompt + set -e _OLD_FISH_PROMPT_OVERRIDE + end + + set -e VIRTUAL_ENV + + if test "$argv[1]" != 'nondestructive' + # Self-destruct! + functions -e pydoc + functions -e deactivate + functions -e _bashify_path + functions -e _fishify_path + end +end + +# Unset irrelevant variables. +deactivate nondestructive + +set -gx VIRTUAL_ENV "/Users/anchaa/Documents/Research/iStacking_code/istacking/backend/venv" + +# https://github.com/fish-shell/fish-shell/issues/436 altered PATH handling +if test (echo $FISH_VERSION | tr "." "\n")[1] -lt 3 + set -gx _OLD_VIRTUAL_PATH (_bashify_path $PATH) +else + set -gx _OLD_VIRTUAL_PATH $PATH +end +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 + +function pydoc + python -m pydoc $argv +end + +if test -z "$VIRTUAL_ENV_DISABLE_PROMPT" + # Copy the current `fish_prompt` function as `_old_fish_prompt`. + functions -c fish_prompt _old_fish_prompt + + function fish_prompt + # Save the current $status, for fish_prompts that display it. + set -l old_status $status + + # Prompt override provided? + # If not, just prepend the environment name. + if test -n "" + printf '%s%s' "" (set_color normal) + else + printf '%s(%s) ' (set_color normal) (basename "$VIRTUAL_ENV") + end + + # Restore the original $status + echo "exit $old_status" | source + _old_fish_prompt + end + + set -gx _OLD_FISH_PROMPT_OVERRIDE "$VIRTUAL_ENV" +end diff --git a/backend/venv/bin/activate.ps1 b/backend/venv/bin/activate.ps1 new file mode 100644 index 000000000..bb51e7723 --- /dev/null +++ b/backend/venv/bin/activate.ps1 @@ -0,0 +1,72 @@ +# This file must be dot sourced from PoSh; you cannot run it directly. Do this: . ./activate.ps1 + +$script:THIS_PATH = $myinvocation.mycommand.path +$script:BASE_DIR = split-path (resolve-path "$THIS_PATH/..") -Parent + +function global:deactivate([switch] $NonDestructive) +{ + if (test-path variable:_OLD_VIRTUAL_PATH) + { + $env:PATH = $variable:_OLD_VIRTUAL_PATH + remove-variable "_OLD_VIRTUAL_PATH" -scope global + } + + if (test-path function:_old_virtual_prompt) + { + $function:prompt = $function:_old_virtual_prompt + remove-item function:\_old_virtual_prompt + } + + if ($env:VIRTUAL_ENV) + { + $old_env = split-path $env:VIRTUAL_ENV -leaf + remove-item env:VIRTUAL_ENV -erroraction silentlycontinue + } + + if (!$NonDestructive) + { + # Self destruct! + remove-item function:deactivate + remove-item function:pydoc + } +} + +function global:pydoc +{ + python -m pydoc $args +} + +# unset irrelevant variables +deactivate -nondestructive + +$VIRTUAL_ENV = $BASE_DIR +$env:VIRTUAL_ENV = $VIRTUAL_ENV + +$global:_OLD_VIRTUAL_PATH = $env:PATH +$env:PATH = "$env:VIRTUAL_ENV/bin:" + $env:PATH +if (!$env:VIRTUAL_ENV_DISABLE_PROMPT) +{ + function global:_old_virtual_prompt + { + "" + } + $function:_old_virtual_prompt = $function:prompt + if ("" -ne "") + { + function global:prompt + { + # Add the custom prefix to the existing prompt + write-host "" -nonewline + & $function:_old_virtual_prompt + } + } + else + { + function global:prompt + { + # Add a prefix to the current prompt, but don't discard it. + write-host "($( split-path $env:VIRTUAL_ENV -leaf )) " -nonewline + & $function:_old_virtual_prompt + } + } +} diff --git a/backend/venv/bin/activate.xsh b/backend/venv/bin/activate.xsh new file mode 100644 index 000000000..49f148a15 --- /dev/null +++ b/backend/venv/bin/activate.xsh @@ -0,0 +1,46 @@ +"""Xonsh activate script for virtualenv""" +from xonsh.tools import get_sep as _get_sep + +def _deactivate(args): + if "pydoc" in aliases: + del aliases["pydoc"] + + if ${...}.get("_OLD_VIRTUAL_PATH", ""): + $PATH = $_OLD_VIRTUAL_PATH + del $_OLD_VIRTUAL_PATH + + if ${...}.get("_OLD_VIRTUAL_PYTHONHOME", ""): + $PYTHONHOME = $_OLD_VIRTUAL_PYTHONHOME + del $_OLD_VIRTUAL_PYTHONHOME + + if "VIRTUAL_ENV" in ${...}: + del $VIRTUAL_ENV + + if "VIRTUAL_ENV_PROMPT" in ${...}: + del $VIRTUAL_ENV_PROMPT + + if "nondestructive" not in args: + # Self destruct! + del aliases["deactivate"] + + +# unset irrelevant variables +_deactivate(["nondestructive"]) +aliases["deactivate"] = _deactivate + +$VIRTUAL_ENV = r"/Users/anchaa/Documents/Research/iStacking_code/istacking/backend/venv" + +$_OLD_VIRTUAL_PATH = $PATH +$PATH = $PATH[:] +$PATH.add($VIRTUAL_ENV + _get_sep() + "bin", front=True, replace=True) + +if ${...}.get("PYTHONHOME", ""): + # unset PYTHONHOME if set + $_OLD_VIRTUAL_PYTHONHOME = $PYTHONHOME + del $PYTHONHOME + +$VIRTUAL_ENV_PROMPT = "" +if not $VIRTUAL_ENV_PROMPT: + del $VIRTUAL_ENV_PROMPT + +aliases["pydoc"] = ["python", "-m", "pydoc"] diff --git a/backend/venv/bin/activate_this.py b/backend/venv/bin/activate_this.py new file mode 100644 index 000000000..59b5d7242 --- /dev/null +++ b/backend/venv/bin/activate_this.py @@ -0,0 +1,46 @@ +"""Activate virtualenv for current interpreter: + +Use exec(open(this_file).read(), {'__file__': this_file}). + +This can be used when you must use an existing Python interpreter, not the virtualenv bin/python. +""" +import os +import site +import sys + +try: + __file__ +except NameError: + raise AssertionError("You must use exec(open(this_file).read(), {'__file__': this_file}))") + +# prepend bin to PATH (this file is inside the bin directory) +bin_dir = os.path.dirname(os.path.abspath(__file__)) +os.environ["PATH"] = os.pathsep.join([bin_dir] + os.environ.get("PATH", "").split(os.pathsep)) + +base = os.path.dirname(bin_dir) + +# virtual env is right above bin directory +os.environ["VIRTUAL_ENV"] = base + +# add the virtual environments site-package to the host python import mechanism +IS_PYPY = hasattr(sys, "pypy_version_info") +IS_JYTHON = sys.platform.startswith("java") +if IS_JYTHON: + site_packages = os.path.join(base, "Lib", "site-packages") +elif IS_PYPY: + site_packages = os.path.join(base, "site-packages") +else: + IS_WIN = sys.platform == "win32" + if IS_WIN: + site_packages = os.path.join(base, "Lib", "site-packages") + else: + site_packages = os.path.join(base, "lib", "python{}".format(sys.version[:3]), "site-packages") + +prev = set(sys.path) +site.addsitedir(site_packages) +sys.real_prefix = sys.prefix +sys.prefix = base + +# Move the added items to the front of the path, in place +new = list(sys.path) +sys.path[:] = [i for i in new if i not in prev] + [i for i in new if i in prev] diff --git a/myenv/bin/easy_install b/backend/venv/bin/easy_install similarity index 71% rename from myenv/bin/easy_install rename to backend/venv/bin/easy_install index 1d8ca79e2..a640a1323 100755 --- a/myenv/bin/easy_install +++ b/backend/venv/bin/easy_install @@ -1,5 +1,4 @@ -#!/Users/anchaa/Documents/Research/iStacking_code/istacking/myenv/bin/python3.7 - +#!/Users/anchaa/Documents/Research/iStacking_code/istacking/backend/venv/bin/python3 # -*- coding: utf-8 -*- import re import sys diff --git a/myenv/bin/easy_install-3.7 b/backend/venv/bin/easy_install-3.7 similarity index 71% rename from myenv/bin/easy_install-3.7 rename to backend/venv/bin/easy_install-3.7 index 1d8ca79e2..a640a1323 100755 --- a/myenv/bin/easy_install-3.7 +++ b/backend/venv/bin/easy_install-3.7 @@ -1,5 +1,4 @@ -#!/Users/anchaa/Documents/Research/iStacking_code/istacking/myenv/bin/python3.7 - +#!/Users/anchaa/Documents/Research/iStacking_code/istacking/backend/venv/bin/python3 # -*- coding: utf-8 -*- import re import sys diff --git a/backend/venv/bin/flask b/backend/venv/bin/flask new file mode 100755 index 000000000..099826af8 --- /dev/null +++ b/backend/venv/bin/flask @@ -0,0 +1,10 @@ +#!/Users/anchaa/Documents/Research/iStacking_code/istacking/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/myenv/bin/pip b/backend/venv/bin/pip similarity index 69% rename from myenv/bin/pip rename to backend/venv/bin/pip index f9e8cda9b..49812c19d 100755 --- a/myenv/bin/pip +++ b/backend/venv/bin/pip @@ -1,5 +1,4 @@ -#!/Users/anchaa/Documents/Research/iStacking_code/istacking/myenv/bin/python3.7 - +#!/Users/anchaa/Documents/Research/iStacking_code/istacking/backend/venv/bin/python3 # -*- coding: utf-8 -*- import re import sys diff --git a/myenv/bin/pip3 b/backend/venv/bin/pip3 similarity index 69% rename from myenv/bin/pip3 rename to backend/venv/bin/pip3 index f9e8cda9b..49812c19d 100755 --- a/myenv/bin/pip3 +++ b/backend/venv/bin/pip3 @@ -1,5 +1,4 @@ -#!/Users/anchaa/Documents/Research/iStacking_code/istacking/myenv/bin/python3.7 - +#!/Users/anchaa/Documents/Research/iStacking_code/istacking/backend/venv/bin/python3 # -*- coding: utf-8 -*- import re import sys diff --git a/myenv/bin/pip3.7 b/backend/venv/bin/pip3.7 similarity index 69% rename from myenv/bin/pip3.7 rename to backend/venv/bin/pip3.7 index f9e8cda9b..49812c19d 100755 --- a/myenv/bin/pip3.7 +++ b/backend/venv/bin/pip3.7 @@ -1,5 +1,4 @@ -#!/Users/anchaa/Documents/Research/iStacking_code/istacking/myenv/bin/python3.7 - +#!/Users/anchaa/Documents/Research/iStacking_code/istacking/backend/venv/bin/python3 # -*- coding: utf-8 -*- import re import sys diff --git a/backend/venv/bin/python b/backend/venv/bin/python new file mode 120000 index 000000000..b8a0adbbb --- /dev/null +++ b/backend/venv/bin/python @@ -0,0 +1 @@ +python3 \ No newline at end of file diff --git a/backend/venv/bin/python-config b/backend/venv/bin/python-config new file mode 100755 index 000000000..2eae02356 --- /dev/null +++ b/backend/venv/bin/python-config @@ -0,0 +1,78 @@ +#!/Users/anchaa/Documents/Research/iStacking_code/istacking/backend/venv/bin/python + +import sys +import getopt +import sysconfig + +valid_opts = ['prefix', 'exec-prefix', 'includes', 'libs', 'cflags', + 'ldflags', 'help'] + +if sys.version_info >= (3, 2): + valid_opts.insert(-1, 'extension-suffix') + valid_opts.append('abiflags') +if sys.version_info >= (3, 3): + valid_opts.append('configdir') + + +def exit_with_usage(code=1): + sys.stderr.write("Usage: {0} [{1}]\n".format( + sys.argv[0], '|'.join('--'+opt for opt in valid_opts))) + sys.exit(code) + +try: + opts, args = getopt.getopt(sys.argv[1:], '', valid_opts) +except getopt.error: + exit_with_usage() + +if not opts: + exit_with_usage() + +pyver = sysconfig.get_config_var('VERSION') +getvar = sysconfig.get_config_var + +opt_flags = [flag for (flag, val) in opts] + +if '--help' in opt_flags: + exit_with_usage(code=0) + +for opt in opt_flags: + if opt == '--prefix': + print(sysconfig.get_config_var('prefix')) + + elif opt == '--exec-prefix': + print(sysconfig.get_config_var('exec_prefix')) + + elif opt in ('--includes', '--cflags'): + flags = ['-I' + sysconfig.get_path('include'), + '-I' + sysconfig.get_path('platinclude')] + if opt == '--cflags': + flags.extend(getvar('CFLAGS').split()) + print(' '.join(flags)) + + elif opt in ('--libs', '--ldflags'): + abiflags = getattr(sys, 'abiflags', '') + libs = ['-lpython' + pyver + abiflags] + libs += getvar('LIBS').split() + libs += getvar('SYSLIBS').split() + # add the prefix/lib/pythonX.Y/config dir, but only if there is no + # shared library in prefix/lib/. + if opt == '--ldflags': + if not getvar('Py_ENABLE_SHARED'): + libs.insert(0, '-L' + getvar('LIBPL')) + if not getvar('PYTHONFRAMEWORK'): + libs.extend(getvar('LINKFORSHARED').split()) + print(' '.join(libs)) + + elif opt == '--extension-suffix': + ext_suffix = sysconfig.get_config_var('EXT_SUFFIX') + if ext_suffix is None: + ext_suffix = sysconfig.get_config_var('SO') + print(ext_suffix) + + elif opt == '--abiflags': + if not getattr(sys, 'abiflags', None): + exit_with_usage() + print(sys.abiflags) + + elif opt == '--configdir': + print(sysconfig.get_config_var('LIBPL')) diff --git a/backend/venv/bin/python3 b/backend/venv/bin/python3 new file mode 100755 index 0000000000000000000000000000000000000000..8e1f2b49fe2438795c05cacff8e2a132f794f570 GIT binary patch literal 8632 zcmeHMOK%fN5bhyBvS5M3uC%Z$$RI#GRx=BPhgN%tS{sIy=_yOGExTh5t9yzSEXAYR}>*-ErOoF%~bxGy!>Z<;_=Ib7-?Rxd` zzfZ$LI733rE)znmgU+rH;(;ijC&UKm38<8l#p9(brSoSwniVH&E@~0y9|TG{Rk}Qt z4N>#+*)gGQG>^<8hBD zv@>|g@cgHgK~>(2{6>%r4dQ*!c{$Gp9;N zPnt7aNN`@5#bHy7O&sIm_*T4Lzq30L?+YPCN4IwX#>~)+?|n8==hO)X2-#&40Jr032t;^zg!Pw z%a5y`>w4~FH?B5AVU}C~-tQjrv=dkq@^lz#@^_r4_?mGRxC4L5qqs+0@K`HzmJmCj z|4JK@Zh2qkeR>Qn^`5?4v(MiwIow0@>K6fw1V;R% zx-jmZ7tT!H$>)Ygdg>;w9lGfOYmwn>khLrWmI2FvWxz6E8L$jk1}p=X0n318z%pPN z_^ucj-I_nggnt}ou}>AlWf}Em6tB-kq9>yKx^dM0yK*|L&7AgYA;y$AQZ}kGsiFm_ zcl(_3^OB{<|2HSoKK`3yIiIC1)XS9ohEMaC1Lt3d@^6fXh()9R;-H@;Ui#PHXf|BG z)v5<>wj>DOke-9GqrxQ7cQ9<%{gZNhWkIBEXPNjG{oD7M5iyVL_8FNjb5u6z=wB)L+9y5qtxtXGcV>4fN^*jrU1HCioilUp=gjc&=B91o`FG*L zAOCgTvi?aQ*+Y~^c=bO3gymQwC-R~oieg2qiZxLZ>%tz{PEKr$ax%ATIeBr#DTqy{ zD7Ksxan)HB+s>M}=9I*avo5YXwz%PJh?~xpZ!B?3?EYwp-M4vXQ*Mge;*Ko5EjU}i z-xKf4BJiug?}`uP3h-^<9|B(me$C(?$u;0Rz!~OCz^|wHI`A97KNe+a1HTFUp7=y= z0KWzNQ}LO+0(@6|-m@xue7I^^UFk(iuxQApW3Hw6!Vj4rdeLOcV}B4x7VvO1<0Hwu zF)*oXw%y>~m<4_)nXhSQJeF)2smX6_o8dW>Jf11p<`c<&%gS#0y;o+PY3xTK54tjt z5XQ>YGJDEH!Q)7sEKM3V#OmG80krc2sSX1^V&zKNwqK5=l2sN$2_6I|)k~7Tz9gs0 zAearJc+9wx>{nmJvuPl;o!X;Gdoqe~&Gd<`9ZRL5yz7Ub?4EJPS8yTws`h2=K7a5Ka_|`^Hqnk|`|^%2-?8kV+qua2{-tHzMys*kYq+h( z^G1v0mwA9lmaD8hkg*v(80y2vvdkjI%0nL!C_iL6R(?2IsFgA5HM-6HR%*z3?JKr@ zF@nmZk4{p+S2|`YjV(Oza_oEKBqxR{nlRTL&L}fnm-&-vq~hgNK@j0-?s;+=OMxtF zhK8$0iGrY9%oCEyV>af;5^;~&iHup~c{8P?sM;4-vni&1FHSVQsAHmjlD6!n9|UXw zyO01=uHq~svO=H&2%ys?5t%QLjEU;Qlp~l?HW9O|Try@4ZTKlw2iAkG7$3$`8SAQS z5{VhI5*D%`Lis5cN-2K1PveNqpsT6SR2vBVVJ0>Yr;E=vm~By@4MO zeHn-f8&V%J*`&wOEI?PFU}Q%!^BJRgLK&aVdhQgfi7%?Sn_;iX$C?74sz9%FaLK29Bj{EA>E2DrW%bTGW z%!I6`qHANgvK=i#nwY6>@ga{B^?L||m=k`d3Qc>I2 z^OEq7eQK@qt9+oN07kh<=FPWW`tjI>QL!Yq&$pm-7^90M?w)VYLZ4jc20ls#`8eMi zaHURMuHD1d(P3-8wGae0(R99ntc<`9;`IC)g5ahJ>LMyqpKjyCKgDbL79;S8z+VVh zIRbeCMFJ%P+m?s5izg545nf#dkQOcobTz=`;YSPC16&|5no9)66}m`ZTovm$jO}?T zD*&&E&GgVn91rm7TL5ozZ!Fh(lLySbDFEh$g}u3Ur7$l=>DfA8pJXTMeDhq=REqPW zmch`unypQbTxWZ+C7n^%AntFL!p+F~&!B#!aro6yuw%~aPa@A0fv$IvVqAISy5Ebr z_h(e8OVOzNh?x1T4=~D5)Q@F&To3#~eR_f_4jF+`#92=W-i+j(JTHw^m=jzp(rA zx?kXdzo#B}$4R$r`_fUjNC6c2|LFoaN>!OZT<}?Lfpp5J2LaY-b9$Wf8I|Bq`0V;S z8vLIYPFs6@ciCwdPl9t^Tfr`qH@AU^Tuixx>Ux3NdQlh_-r`b^%F4IZ7HNaRQF5wG zI2Gw<>fL!V# z4xn}k+#x`vxdbSujIz&w=n_CFS6V5RO6!RUE2orLr&KR$6JTDX>!JD(Xk|rxK+^^o z+KRbDnst|miqYDoeWwMQNcNe#<RKoZVOZdY#4 z*IZXb9`a@bB>JL*$#vFoAh#R6e&dOA1L!x6cB8xB$DfD&R;%+JW_K`qc+@}YHryx8 z=S}(x;@ml#+kf2aw2t}>xB2v0r`vaKpOL<6_P=#|{r!I9X`_9P@~qoz_rbM&&?k29 zo$WblHxD{b@K>YRhaRn-vwKE+yx;A9@9y{9$4?Gh%Yx37?)5v*oSSD`_S@|a6o8PP zNl|5Tld@Eqj4}>0iC{u*98P(yOu*HG{G~vLZNF)`oAi1-Cv)S2rXI5{< zsWu81;D;nf{taheIrYwo6L0LKgbHSN-n=)SdGCAQd-fN*y9uN5XZYxc@rbcMym38Z zQa-0?&qx59G2jr?e8#&qm<5ur!ixyPOOE$p2L>?wmCpwHt8F5K)sVAqnf^Fpa&(g5 ziZlO{vE(rNCBPpch4|`x0=qEo_3xQZzhf|gq_-hBWcjVL-}kb$(rPX0%rP5xNS-?<87P#MtGC$#&6>O^ga;dnv&||4@-q*li}A9@_wpK` z($+}<_mbDdD0|+9uarKjxHo9{HK6&7rhT7;V=KN2Fa>_d95H>#Ah^qjk?{H1;Kk9G z4<5hvck)3S+O2H|i&`ApcHFqdc-x!X` z*I%pRg_URvp{u13#lESUwbafQ-$*M3R?9*iI#Hb{eO&rv3q=ffW-+H#YA8;nJ}u@- z7t?7`t9h~6x~0*Nrk@t&+?cC))6KTML!hWk3yH+J)Z~u5?)dD7Bp8o*#L?Tccj=_i zfJTAXs9K)N`d_qp8amn{QaoLGa7|H{R?g9PbEo&hw|(dPJyNWvo$)s=y&2N%Tz){x z%}PK3tPX$T=lmi%XO}+Mn|feh5A-l_;Dyhm9rhe|@$#UDlKQ8f^0)BZr7i2hcKL_# z|DgJW4xBTL9s8L(>XKE6ce*}_E(R`I4KKMzXdlwE5dcW1DoyWx~zphR(fID(X+4j4-OBG+IUk7w=lTAN~|5CwA5z*mD@dX zV<#khZoaxHpNt}&^P_+MW9r%xOjVXW2p<}6lW3FfUAC{3TXsz1Ex$Y2a}L$Kak4|+ rj+Vj-+PV?HW7!wHji2EX$Ng$=2FpTvKa1BYUUAd5`3X zL-*uD9?vn)FNdM1-d~%Ig!#uMF3{zlkhnmWcko5eZIqNh=JmKwxyL`U z_;vm%_i6W;kF5N0@AxLe9{k$*r@iA3p83SGty{<46YdDoPk1Mgegf$ykUnzjggfe< z#QV|LEcaQr_an>g^o<`oY?moQP z=bc90Gu|2G?PXqx?K81H6WecM2TW|h#0E`l$ixnt*bx&uYGRL=*kgxH+Wcg4R5byf3=@@n(PU<^{Yt?;gOL1K#uAY43&2 zWd23Gd&%v`yZ#{8dAzyc4&cpz_af?e$$JTPTnOrT**%DqgWgL>dD(jzDZ@d^MRyP> zgYwNq?;=u;1u3t%Lr59&p2s(@p!7@bVLTu9UO_2|{3Y)a@;)BqebpUC+HjEes`o0= zoFHw|J%Y3&NP7|AO?s0^dm>1?>>fheA@3sUxa?g<%9SAHihC3(N4>N1)s#1dv}vYE z?5c?!GO=rn0nRD+QGEHRH-$1^^IpSuuS*`rGC`hc_YvfIMDkqst|R3Ol7}(L0Yxbb*8(yv0%oT&W zSG?L{)tzbfUcOf>*NSt?UbAZ-*UG_IBrRz0MNlN6gR#nZMq`u}=kj&@w z>qUQ2GN#QZI>yxAR>sWR-d#`mW!9FQE!RDll~!s+)QMuIip$GVOlHa;pc$X_YR$}z zHGz@wo*Tv0RiLAp3tooL`+~?jW$#`y{f4*UORN_#t>|dxo#OJEr{n2a@6MW6DS6HP zrtsiJ=E_FRo2@BSQr{oNXK}9dC&cKdHiGgGh&*LueS$?X~C z;He|{v+BebePCmvSSc+Qixbn;(%OnwsreIcd%jmxrNxQzY^_*Y0vMpG>rIsX;BjIO zuf2*pao4NdotP_ECdS7nmdkS!s~ezdyIZ00LUCad*>#b} zStPN_D~X$cy@uO=9YMpoZQYNpUu@XZ)(7YA$JfUjF~pADPc-6<#BF;irH1(1h#x`4 zOKJ5&EjDYtW!)Ki*JA8W_FWA5Xk~2X=4iaxQz)#cYN60f7Yc5|TJSzY!> z8_yk0Htnf=kM2HxGmh-dlzwX3S0W@9{NxIyMX$6}2(lAme*l4Hr|gXU%h?G#6-(P{ z3~$>|7src9-2Mmx&&u0SS7NT6k9!F>=EgDT+WDlHqM{=49yf({^r&8B7dQ;oh&|p@ zxHVmMixpo=)=|5e@V({vPWXX_MfB}L;XQr|I$Bn&ejx1b<6&w^QkaOFa7#@?h%~Gk zu|80<8#a^`V4PS7w$(UNN8=h=wq2dzi&!&WTJ{y2+zCs6q2RC0l_)J2tJS4K;eBM1 zZe{_08M}TY0#|#^nb9;US}Cr0plAj}uDWZ>jAsjlJ8Q+|Af*>oELUrOp`h3bfw8$y zs?-!z&$R>Q@R5|3cHBfn07}Oav1|fJ?ZszB`M!iSbFuJA+z(4yvVM2cviNQK*r=^e zh2LqM65uANLwb!{97~a}0!RtXw_MU|Vt#Fu@tC)8yi#xtKnQ+rNZh+s>E3ya2O=kD!C+ zWv&1%mRdGu4ALcg-2|9Dt0=ZK-J%`EbjdW5Yu1P8AnY3T(kw)~Q*`cfu)?^GVZXNM zK`97E=kbgaTyJ}|HC1sc-g?d1D0|DU=LTOviBQEdw2RqVbyWssY7?z5XTY3&ZE2%1 zVUuQ3s@06*5N_cXNQa7h7mr#9BwymGEDw+4J8ql{1)VY+O@%p$%kI}8Ju0tCvSNyWu zl~d|Z81`|>3zez@r?h=LgGRp!xSD-!uN75=X7=s1O0B%&T~(^8wvi{v(sI@JzK-l7 zhpc$a&e;PP+oHITJZ~9 z7h3K-@-qv_CLr&bY~Lj?{3I9~9`6L`A;t#+unV~ zt(wsyL`#y42x&JB8uSVQy3_0XEVW}qm<$9xhXE1xK>mu;CgWS^5J`D&(WBs8EUx)b zTE{8w2Pp2_v+ckFtfo--bpjJZV8!bZ7QnQQETHqWi8jM=90nQ@O}~3pilq1r+`1CG zOC??SjAipfe;7d^GX_JMv585x=$P>tbrtDS1=x)&FG_ZxXzr|v{4*9GvRl@!N7zj_ zzLVX0w-*xzid}e)5dK5fOX`b+NT%Z@#LdNqPvZ8kA&7FFo)F{{UeZhlQi%7_eks~X zkJd@@X|I>IOyR|hOc-*C)ota)INpArb@e0Q5anWsx{mO5QZ-gz?aGt$s=6ZDN|6Qx zjF6S;n(r)xrh=9N@@^Z0jzzSUb{1`YK^{)RU{Z0n;U(hv2ZUG{Hc=mzlFV=x;aJIl zoctxnN;^CH+*)@nY`1ppQ6<}|dDqI~@aM%gsQPaj7Rh}@&0$fcU*CO2Vz5W$<85t*x{FPT+C`8r~d!y;|=Jna9Fb@CGq z`=VJt(LukiO547!(pUs>9A!xtYC*M&TxRv(!!6uIxtvaAKTq9_rm?N^mvX7ZS}F9S zHnVN$3;Tv1D*rb>5(x)W&Go>93*pygASEt@syi!e*O3jB6FB!wx&K2jQV2rpOazq9 z!86^JTtX?1s(L&Ri^K68C4-)%M}r?(`Adkv$@__cwMP7fA&g&BvYX zM?k?8)i|o^oPcdla;<{(fLS!j;{nOFlJYqyXvBZk6mPc`--V;dtb&!@R5PLL7udGA z5(Mv=vGx<1kg=ee9nt6#m9&$wcF@XLx7q`D5x6+3B%QlzWrn{-kRz&WAPNM8oy~fL?CG#RO)TQlTx{+n?$1|&&Z5Mvgd|%`u`bG|P=OZJ`Aa*Ch=lod6X?ovaM@n150lBf?vHRM2I$nb%D{6$vXjt)V$jhV6w^n28aw`qz9Ky94t zst&WMubTG2GTCa+U$|xRb8q~f)n2iPT_YO0StDC0>8|YxpK@;SW3Wbc!AboI^Rl~U z8(Jf^YD*5-LA4b-;4GWYo)$GcwwnDTYqVy(lCITef0XXOXL0xe0cBS*8tu^*m=B@M z%J@YY(*e*f$`XNnK4g<0gEC9*+bRoDp_U<{%-WQKGtt$@t}9enj9vCBg~AfS6^Rt9 z_leg4#xqH28_JBl-C3D^6QE!W6FB!wv?@Uebq<*Khe9wOV)$akyAX#!EreCc@Rcax zmATl&N!$->9o~;`G*P+=_6Sj~Nw#n;$X=I69XyFbxL#V)4jWh`tw#tmWc)ZloK}|4 zLZKN{1PTezd#2ErL$n3c4Vd)zZX4;7vC0r%KDL|W)xM#F|9JYgK%h~luTAnvu@RsU2 zPup1~BRn6m7IGP}^|^2~jglH~C|WM|4aR>0cht!t;OMws(n}Q8g5OLm-E;j;*2V<7 z1P7!-;ah|@kT(ZHpCod%q_z=?l?tJDmN|b3*}%~P^qxuciv%MgbB;tnc?gDP-McU} z;rgp#Z96gaH;^&P&~6NlvM~N&**hr<;Z|!IJTy3Kb2D6FGjyO8!}C76(c+t|m(BOl zofh#NU25^W-`k(>r)w?Z2k2gl-vPSV;`g9;Fh59FTf`5!k6{#fT+y4Rm&%U)FIjX9yU#VKMXKNzgwvd3lnn^mU@Cpg80TD`2lvRYJS zpH+;kD$ieAfe+k<6zZ>fo(m5^pE>1g-&-kSDYm42{^rZ;@JNF3+;crN+LNjZg`n02 zIJk_-SNIy02WPC#-kTzp3x$6~HYPt?ScOm6 z{kSu*8>a1g2EK#n#LU#a3v>3qLtCusGnm9B8dwDZ<6#vwsousHEl|}gAKyU`8t-rN zg=2yz5o;1oEUf+0u)AqE4RlEQOwc9v1RZN9SL_1d0-*SR1h4J%mN zutGP)20Wkyr(ZNU73>nR>OBO%O`vz8J{xbqr-(P4ybJYXd&2KtsPEk=6n?ima+%Zy z9U+{;E%Sv2`q`%NUi~+r+`xr+4KBp+j|qDXB@{ck7HqN-SFCKbq+q$Sx`r+-5`mKF z2G)k7vIsI!3pS@5EeL{9*M;?FAHE|+_#A0r#6sLEWM`!cKuYw|5qLteOIK!rPwHiE zUeY7LffHz0Gghv3_K;kGpo_Vh&cMG<#GoSC)P`uMe*n#x*m>rUHcDU&kaE&I2t`1n5&c0Df+BzBI_ zw=#5Zz)3Wqozg;KXw40K9I9D=DVU|t_| z7)jp=g@MKc6e4C&2pJ>#!F>pf2Z;y@A6nY%4TV&SI@s_3wxRF|jY9P~;ZW)m9Ad7d z3;okBNX$lSZNnnF+!St~Uc08(c3?5ovd|TQ-C^7fYuLIH_^v$!)mx|`&DYs2Xwcq< z=8|rP0JbE5H% z-A_UjP9j$dDX9jW^)FeMv3Cu3YS5aAd~xU8yH+FN_Mr4MN;f6pJL=KjV9BiIyrj9k zOEL9JZie}wjqWQxi-t{AS1{1(Sp~iJLswwTTPUt0BR{q@Fk7+a-19JkS5DL%Gl9_l z{ulI^4!Mpm^<;wy9FSWJ4OiAM;hJ|gs%zorMGOf#m(0fCKP%HP9}^Q@t^?owwPn}n zAe?dl5~v>YYZck?6aiDFX)DxH=IGRlc~XsAhfo+brAWrhA)M86@@)M zMT||N&uoPAK+%$XYz8o3a7MwcH=If>6qUQ|`7+^K#6$=x)rQ_-6;23cPF86(qWv40 zXDOHSEUiX`g}?0h;>oSN6Ix|jSt~6X5at!;dT^ei(xe+m2fq++INnwdz_DBa=tom1iKPD(X|JfPi~KlqgQ> zFY{fA?@$t)oDsNu5a*@?2%mh9IQUulV9P;1aPG?owwAoHv;ts`xd4eA!viJM5(2{(ojgp*=oK59T^RT!H>hZ zLJ36?C(15Fi(93Ysf)=)x-xqI=VoeQCk1U zwnl(e4b_G-n{LyCo`AluMt~eJyESX$L2?_Q6kt=hwWk_%2N)UpscXJx@!Io0NDPWJu22*)bcXw$;N(qXl*@)1d3xm{wNJDfE zqkXUqoC--hE+GQ=scYC9S*`+bPJ^u?N3m6e+eF}C!GGK!@?i{{MPl!X3eOpjjomls z=&|~lh|9rhb#*n|D1>oEyLE~_EkLzZfGl+lpQw3|$3+D$|G#=v?OG_yWI`|c#(%xh(!xs`fiC7ccTd*hhCL1JkhFA;@>gSS4e}s;b$*?2I$mxubku%KoA(>s~WJ(Is zkU)1Z&kh{rQS};fg{H1;QHvp}%pvN1!%;vgAc=O3AWL^x9Kv!`tJj$Aw!@Q&!Xv!B z8>ulgmSq?%wgAczpo0>YKPfmoCdOpi zWu}n^_B6~^&uOJj%In8OYlG2CiIOgCcB6p=|EMSC#e(Ex7+RPxP??(a~k)GDBiY^o$@ zO3zp8j7fhHta1yS`Z9yBF!*T(PJ6%}B)Y~J!5PAn){e5tY%-mKc9a$^sjq|-a}i~e zxP6+#qWVzOtqyvPY{1-p-AS)HK_k*@PW#+MJ}Zl_18NWj3#f)CNv^FUo!K@;=@*Pw z&G?eH5oxCgiG4J$*B~=j3Waa7sVomWrVj=u6JY(pq|cPtKwkVcQtucZHqz{xM^G(f zodsFbQg4VdGp1! zWz6HCzRXlBlz6rlc0t$vDr#-^1lc-U6-PZk$JS`;TnwxaE(%XuAQWx*GfkmsZUf?* zO%bnoif%T?(aoXIMsv_8v8cwm3>1JBC@lo50~*C;?q4D_+H|8w73?w`Y~eUq?t_Oy z+sHy~O00O`o~kfn5{UyXp43qjLKZ476I*sWH7u0}pc@H{21 zNb1-UHKNw~od|&w0H&GXi4W>$2v@*=HxcjTKh7in0U;Ar4g)WyrUp7aacAj$o#ONy z%VJkoA2Rre0eM;d6$Y$TeT{+4Q^nQQ;bSYHgb|VTRo2cy2ut;uY$DSG@tKf+?SAjb zW=-PW;w=>J77O+#$~jk9QcneY6Dgmu*D76D(Fd)xA)AFtCt~;GAXd=5SGJY@EWgya z!x0(!>y8$19?j+XLgAmY87$7SP3Pr-EfA7ALw5#bz3jZVgT*i^Z?kx(r1GvEQJiFc zD^gu3kAv#8FPTkHaPgOPGOcv&2dGb$4`MU*XMXBA`hxHn3fQ2+LnZEy@O9ASC)NE? zATR|}4lFj?bU)e?yj5s%--`ei3b6n%onZ#1mD2#I^Q?of^WB>a=$8?}v%^PW7n1Tf zSU!a^Jv-9zjxB|3=_GES>h`vytei0d29a&7usY~XtQ37xZFde~oqFP>JDd&Mkyi`* zmT0$5Sb_$ZYT54?bijrE4aiB2i|rTvkiSJMa^!7jg+Yy)DRvo6e%I7!*AKO7jC!#} zd4u(pa0eSBZ(CQ<16~K)1nYvJ_YSN`SFL{&sqjFgLWo`P0}dPmA` z+Inta1%EQoHeG?z-M)QAX5E82oUk{IK8gE|+HcUplyiqbH@zAi}kKK>m zkJEYiHl|faU?Y#r6i-Ig4cO7+OX<}M@*Aoiv6*WCkyO)KQBwPxaQ3^RzRK5};Wq8N z5rj+sA|?Kiz-JNRoPdWO>T}>S^1&alk_eaevN7gj3ny`lbvG(mwhlk& ztv#X;v~w2Wr+k`XDQ6I@V}2(%;_NRZHI`qnM3VNOk>8j~%jz{T#(_RQbMso*BZKXu zVyzIW{xy`@jimpB4b%E1?G^nXZ2j;%=Ik)af8zveMk%(J&=LvKX3nq$+I}u&fiXc( zSyO&!YW^wVG1NTR21!WH?!K8jiwf#s|Al2!myzM2htQjg&6&jQQ!qzK7@dM49v(r3 zlMZmQW7l&XAzH)xUi=Y@%w{ zTh>+g?^w0TW~PLswGnX_@et0V?#Ch6oM0Xm>^z239kd}>PDVZyb05ur4f_=wse_r7 z4dlk^zcxJ%J6mM3c$X_(Vz`BmVW~V{hCvXM5;3a73zDY_i7Qc6!6R|CT9NYyMfYwk zA~_B$rThp6H+lfgSJx`=R&=#_oMoU;Oh^}CW2=m5-@|)6lL$keSWYD)Px*0Mg;Jd( zWt)c!?IgmXT}8Fzsc;jxbl^?o>_&GnPYe<1;tiJ2v&0OFhpSvK?`ie?i!3M?RHmoatbFQ0IWFk6hg83rVxP4pr@H5OJmMm@!Slo=Pu|W zX!olto-+cpA_FDPsIyuuE3-`KICKXsI%iJR)^I4@%VNsZhV~X(=bdTdR@-sSr`%Li zC&D%uoM*77KGXyB5c1>1XAYlPz$Z7}- zr8t=X4k8T<`!)11y|C~l80GH=jN-J(0oLG1SJ-Cs$Xx(`ej5b}vJ8Z0vsc)>GZ^R!YKcRlmug^9#Iq#As;lm}R zKoLsZPc~o!l~TU-uC@LsCcY{CWk>2i#uzDQ1{U7{jexwhRTl>Hky}^CoDWW(ye0;b z0N-DfB=D8sIhg270QK6#`l?8dYps3^KBaiL3iAn0v#iiD(4}(#SU0q`XlFwR47d

{>QmF23G>o-MzS~|bR;jR_j#c{-&d(Tw z^g{>2f9(woK{mH>LBofB$%3whh8Y8DtHAmsJjzR|yo%)p=Y+=U3AzKEXy-7z(>A6G z*8YK-3j7QfcinW?**&Rkxiaf2}Vjy-bv3rPs6bu>62 zhIKn)SkHxj4N2T z6W1TJSpudO?;bWch*ylZ5NUsah*4d81q9v#S{Mnc_Ndb}GuJDww=VrAn6oyMWxk3a zTyXs%TDb%yhWg}Sc$zTg2FAp1MnGblBVY-)oG9sXE!WXYaH22BG!I9l#$L4U+jlTQ zfKU(3<>!O>D>Pr2%c=k3Xe%29tpdwy3J}hC#(`)(TC7UxqQjdTb3{n zM4+cg$NUC-Bo{&FJ%wA`s@ENHZ5x*LH_p3`%BGH3r`Is%U4pc5HB%%>H_$jm*&t}d z5PdOax^*Z5(l(PV4#p+iV&7bc7a)1@i$RsC%tKq{R)9(rItMefffNUEDa_-(xr9wlFX~{MzHq)5jhOAR~@4>-;$*S zXoB2;Yo7~8Qec(GWcI2{bSgv+{AwKni~%QRxE9`&9BKcim@ps|Hb9XEwF-{=q)0`6 zV@lCE5R5d0`2rmUzOEVRtx$Gi?-oi;+?mE%$noId%|!i=XUB!*M@0P`b8cZzj;hIT zb@cAF#J3Ma z{_NW7YE|K2@&!j=5naN^X?Cqqkl$D3kkI1t7$D_6slxP=%R~sDK zv>BP5si_YN*K#1G$3*gPGb#1stYlQKgipG0^sgZ6CYj|?M68~EjDP)DBTnF#osRsS z!wtg>T-^1U;~M3r*Rl7J(@=s$dA??F=0lzVY{SU!D2tp7OA*2sD z#{-??MF2r8Nso8#dvKc?3bpzuxu6!#|$?ASHgm^ z%GN@vB;j-ElsJdC!-~F2*gDo_C@A&1jI6Yd z33L3V{5chvf6{?DsF#0MMa)C^(<)*f8WvAQ8wMi1AG9yn3z~BegWHa%M^LH2YiuQi zhv=Qc-Nj7A{v3`$LQTU)y4liVs$ai}g2LhakwA|#EczMjLsD^IACih4R1&F^+TQne zu5+tlsC#2=cEtKw3U2&Gf!c_OVPijlkk;=5hwwQM3sXE;8hQ;K0rrBSW=a?F0|Ri} z%=-U6>umQX#~%kzuDC{UQJuUJKMEkt1}e_5-m= zYteUz)>#Bwp)_*VveSm--xtg{$tNS^wU%odQ$^cicJE%b1y4L zCdAm@Z1H<+K!@2PoLU(=XuAdB=Y=m?TN&QOL+DJneu@57u6-1v3Dl)=ZMJH}hM|cJ zTd*%cTRCFIvz!;nkiku zzi0CZt_6p(t!$|?sWQ^r8pvT(8p!D$sS`0g>RItG&x+Oemh|*Maf7Wa%7*Atf!z_% zuh71rRk)F0F705Qy9V!ST3&)n`-@&T6D68>m+_}bjKz^NG+hdnGI&}-?+`7!RgCn^ z5I-UuyWmG=zyFcQ5!xrj*w}I@3=}8YZixzB{55pvm<+T)=FoBQmCzJ^m+Z{S~#;aXy?W6 zGDe8BWn-POUuEF52QnygsQ+~WB@TnJL@(_ba2QO$nvqH;;Wd~VeM8(7;mJN%Ql!52 zu(^#GH*!EL!jz1Y4F*E!rI zoON(A1z(F6Z4!P4)#2z0Ca_P1@AG}^B&}k<&1{46E)ZW~P7#jzoOBtJKR>Wstt_;^ zleP7H7DlF4wk-B)x1MscNMN3u@p^eRpG9C^VTCSenUBRe(;6Rkov;PIdWNuO1EVia z%vj&Z_nH&Dm)P~OP5T);z<_;Rw%s&)%~mIIG}XSHWE^qO6F)e;!Yu2IA2Z=7 zf@V@Mgn33yH8XJdud0o^a6%GgyqOeE5uLM{AgQ|XDgLaI{&O;y2)h5<2of>O@i5=x zANk=Qg`iCoPd#8^JBKv>%St$inIQK$A;;7bt1V##!NVE@4W{?SYv z;lcjr@Y~-%04rOV literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/__pycache__/_weakrefset.cpython-37.pyc b/backend/venv/lib/python3.7/__pycache__/_weakrefset.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..157a96d5f3e34f0fba0ec9be8bfee8880b15cb3e GIT binary patch literal 7510 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 literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/__pycache__/abc.cpython-37.pyc b/backend/venv/lib/python3.7/__pycache__/abc.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..105a1cc6bb71bac8b96d8171d1bc9d2ddd1b3d82 GIT binary patch literal 6506 zcmdT|TaO$^74Gio+3B5~z1V9z4E-5b$b6A}^8n3;YItK|k=q6Yo6n#CNJM(>q>Y5~K)v)HPkVQ>W_O zzEjuN*V_i3e>JZB@^2Rn;~!Kh9|s?A;#Ge|!422oCbu3MuK8nwH@N-K;I^<%8g2vi zCSO5)McAk}QEzbvbw{kA-kR?6Ro;%A(W<*TYP;>xn!7gYxSi3uyFS`*H%6Q8=4i{^ zGL4@b@oTmr&fRazKbZ#oFmo+BKiYP;X*TK|vF%-W--yru!oWJ~d;{xjh>KWf8}&`T zh5DA*=I1_cxR?0(cZ}Zl?8>#FN~Is9?7FW6+lzdqgks%m*Y{M9`9Y9K9>xbOP1xIS zz0Iz?{`&X(fr(wyL;n`uJ-muei<@)9Gv)?JTmIkCeT{Je5`LOU7REdb{FJEq<)R~z z9wuD%+iiyDuJ~XQN-Uoq`Y8&*(C-Jt6AKjsPq$EKpv8p@j|6A?G8wTj?K5^wQ^?2a z>4&~zevQDXDJ7}EkK-g|L!oDfu}b|o4gD0PCvhaOt{+7#*~c3AT;iJfQn2JmNEvc2 z;=ZQwF1UVdAeO-zEC4a0tn?YgQzA^ej1xKXBRzdbO~yj*=%HXfIP~LCjmiUhPx%Mp zYJOOBVEK0Uy45kgQEaStRa2ue^t@Sel%MyhJ}&mzXzGRg68MfiBK&PA8 zcDaH+`Fy+nPoG24YvW5{z7vkZ$d_bVCDoi@VGaMauxo2RRpPaA-5^p=le(s}Q?gr| zxI+fY#aIfMxZr&TX|tVE1CGP=@bvtAyO;{Q6Fx7LDjaWDb-v4pS(imD!}pnM1bc4W zvRuZSD~!2f&R#iVoBfJ#ix!Ffk?_2%?RlewPa^v6c-{vSKPq}!p2w2_3lVpEjcmPG zJrGe;azH!nnUY*+&P@|vFXL4!D4Y%3vMot%0p98%zUlcq3Vfm56s#)^gU_MC^$A~^ z3fC8Xst(r&cAxCEPU~NN(%A}pdc>EY!IA{76{TlMf*EoZMX4L4Cku7Gf!ab{Up-5* zHGP$9G`T~?Iu#pKRB9((x3|{mc1!&z|U6 zCWvzB)Zd2=KMNxigF{hj-TwhwuXXhaAxNvg=hZ{IJjF?jsm^Q z)t2!6wK7{cBe5zF9w`suq?Akpk}Faj0Kx#~kwW=nN_r@}(I474kVllqCU|9<9C=fa zM$=u);gnRsiUP`6$ks;ThnK@R&lW)J{koZzQmQCTVksh>0R>46KEQ^S5oLt}5S$Gs zVU$+%1f_{svYJ*A0_S@Doug2ufJ6(n)egISnV7`h3wA>~ITZlrBLP$FIE?aqh>nOd zrzBP(GB{*U)#g>1K9yV0r+$5p4W~M*D*3D!3RO9`+hdfTkU!YPe)3#%napt#@1#r} zCdX_t21c#ufN`*U>+T)ah3t{PB5_qoG$C^Ajs%-MO6l|_NURu9%?(H6NKoRVoe@E1 z@^ZZ7d6|bIX(Zsvy2w;3I$9D(p^xK0B<=QkIe4by3dmmRAt*thkpjQ^I*QadG43Hn zpPO@Q-q^S2_V3LH&D5GVPfXL8H=)<&Z9r+7m;t)R;ur{(0(x)7wMWPeGMj*{+Z^Ju zK)I__QDZ+4*~l~+OH0bY$D4D*udn6u5ofB{kTI*-BrJ(@s}IK_>^ z+&r;}z1gqt7H$Q4y{uTI5QWJsa%4J^yCR*)nC=x8#9;tJ3cyhz^Jx8Mdv1L-9 zoi&zoD1tl9|N?adoYEv>n|)Z)yW^%lMgWp2-Q zZiwOJfE|hmMojuRmSLQGBgg?5i6W?+_GhgPs-9nsD}wCFMfoTgdrw69Tbj{k;g6QQA+GhtIlsScjkvD8j%9Q=#Y@v)8{3qk9ol z@W=4C%yz!-k`OK(K>HJn%Uyysd%5CvftTboANSlW?=D!*!O^oAe(A{!pIZn`jh~0d#d=!O^&Y9?vJinyaBfmifUA4(B6+J3mqv9!BPm zh-+vKYV$au<^KenO}9=eN>Ww7^T`#afepxSqxcMOjS ItgY|<2f@n1CjbBd literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/__pycache__/base64.cpython-37.pyc b/backend/venv/lib/python3.7/__pycache__/base64.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2183fc572a446e5246959eaeea1940f97fa35267 GIT binary patch literal 17107 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 HYdiEWb(qLk literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/__pycache__/codecs.cpython-37.pyc b/backend/venv/lib/python3.7/__pycache__/codecs.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..552bedef527927c7fa96f6e0b816f2435cbe3c72 GIT binary patch literal 33953 zcmeHwZHyepncnnF&+P1Qce$h}e(1ABisG(JE~#&dk|mN$(xy$VcqAoSBiZBGsb21I zXJ=O3vm|#iyh}tSaeODAFLyyc&Jo1RkHh^jaKIry>;OLCaLA7YNPr72LF0ZTcR+H+ z9TFgRkiY@#JkMLz)!nnRD@vkdACO&4^;dP(TUBqp-&K8be7usw-;WDVz4?Rpa=E|Y zMf`UVC&%#%eIsa!Ru9F=c5RY#8bYJP1DXN6YbQtooDJ>%wlcc~K0Ik{@l$@M1v zl5+jx&fG2M9p`dRVEZrdQd&29#)=uMD11k)T3&@dQ2TqQ)*g0u0E#@szYi<9acxK z9ITG0C#q%jq?@abRx9c$9Jf@*)YH{*^-Oib&tKiDo?XfZ|JkqL$z*k#KVIG59`nb{ z)kJl>U#Z^Xk5zZz$-VwWb>|my>N&OR-JIIx@48i}?#A^|wHw#FZ{@3daP_>}gR4FM zeRz65u8*k~aQ%XRKdv9Z^^590T;C_pAH?fAHwy^>H%Co;P1ip!?-@K z?#K20a_!;zgnAIy52Ch5aCK5WgsX>ewO75R&Zv=ho$5aIRrLi`#@VCli|XNbbJhLo ztnzStOnpf`g5v@8WwjT_DRoZm!*N=@q8`QZarHGdrw-uF VvRZZdSpgOO93C|9x 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 bxC6&sTtgiHqh30!%zwpYt!1}Tm@NE1w?f_{ literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/__pycache__/copy.cpython-37.pyc b/backend/venv/lib/python3.7/__pycache__/copy.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f0c54f9ac561daebb881e07f4e712b363abeae8e GIT binary patch literal 7149 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 literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/__pycache__/enum.cpython-37.pyc b/backend/venv/lib/python3.7/__pycache__/enum.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d82d470510f1ce3824ee12c00592f71d94a4fb9a GIT binary patch literal 23795 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 OGuv~|BG;7r$o~OZ!D>zb literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/__pycache__/fnmatch.cpython-37.pyc b/backend/venv/lib/python3.7/__pycache__/fnmatch.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8209d5bdf01dcdd61cb33da956255012c189c051 GIT binary patch literal 3385 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

  • %hTy>n6U|(*u5YC5yl?5ypM&-h{NY%Mf!Fn?Yy91rh!- zv#S#ZF1cK>Z*6YgX*##+_EyWO-@4`8+-%i1m{YIcbl7da&bRK|+*ofqTX%2Qx3-$> z&Ru@@<~rX1f3=w;2dySL_*hR0DK}|dzb$LTFj*sjCB^Kd8UtZc!VGyzjUmiR`)FPY z(abXN(o<>-;)JT{Ne)3hxjb=JoSh=c!bJD!5t3B;%`R(gSe>5jILIaCkFrZ7I?4ll z;V;n}DI+yjkJVT?QAb*=F{N7;S7U8g`C1*W#>hUq1@Vxf-_u69IJcM6l~`rDdsOQ8 zfaUAJ$^)w-vGkE1>w9^LRghT4dy4-Ja7w`Wt;8ve@^OBzC~?XX$3U6iE6JXU?3u!> z-(%J^X8nhpRUQ@M!k!^xOp?BZMU?B(z8nA!PWlG*LiP;==$%o)E53A)#f0 z2%)BlBEe)cXV5kc39=Dcz#!@x-sfwj+&&)CB0thu|9?R0T2K_iT>A+b!G zYfaSLXKT0(JX=GMTxUnrP*hzt)DlV^Wl3F> z<$^5d)t75Sol*_01pM)TMy;v^jas@UYM^!+Zpd)S5M;Qah2V4)P^uB2BXw69E=Ovl zF-mb&!CO|0AkIZOI);i|f>rscuYnVs9f1hgB4cT7oh(btYHP zbah@8tLXcd1{`9Keq@mJeS}ZWNhOKZmKtlnhO9O9@HgY@(O_ui z5+{#2GDjq7;|s@+&7e;y1Ts&`GqOt}Fl3TS7d`X(e#dn>W^WKily=L!5*G+cIBKd? zWi6MgNGJTHklt#~YpY~g{hHdFdP2Qs>H6|thd$e}WGIwga)S`G3B8yon zq}`=T6*sA4oeByF6Xs`F(r!tmzr;vLK~&L8`6}#fN}b7zO~PM5v4ee@NBxrLkb= zSHvAuFF@&US@ibAqN0w5pq_K<$`$^I{%l2u!Z`g%gA~ml;0u2N4#<2W^+*fnBNz>x zsOVAC0D|5dfbwK8N9u@1w9}FI<%lLnw5ULHNBOKSM8!DI@X~ga8x^Ax&5w&+UBonw zmUdh|k=YZ=#o73>vVapEYR(@UIQJ{j)QNhcBA^wr_H@?H$Ay;0be4avBJaqtLRS(0 z9?ir#;yu<`v0D=ViQHzEvMD+G-x$?pu2344Sz%;E)xEh<<=_yUmBE?bMJ^_yxD;!# zaXin;%s9atA>^5gs>gHj6tzdw2REWiwB9mC@Sb*UG=mvagcVQ66~a2wc9hXH-pRJU zP-24>?kFQ8F2~cy^T^O!uK9Z1e73QAvzFd$DA>qL++%r$ojr=l*QcgR5 zrNavhUPf>yr6(upxkL)>PjMRT?tZ)ynzUTqdi?H358vOg9({8Efr&R9T<_=_Mb~Fy z8h2Vevh)UsgW1~^k)a>q;^NspLrp^?jWvv>7dTxjbPxH9cVLd+QdXuo_aG0R^|n`m z{DOqp5o;)4$b>4_blbIs#K0pCo&=GxASJ_1HYtCO>@CfW^78aZ%2e4x*u%u=@m?T? z&s@Hr#=bW|FUjFuKx_jNZ&R}z;qffQ>l#nWmV~X%+oxdtfee_9N-DWjcap=SY+|%T z(6iDtOHq(Pc@S&!+H9jt=e|WJVxu(P>4qNKUeqvLs4F$DMxJ$vop*?x`;r~Gt+cD+ zU9=lIgEcpFF9`bLCxoE)1%KAi1-cW}J*R0IivI+(kR~fdq*mGtMQn9SYJEz=3rL%) z+Dw`Dp`;e5L_>;MQXVMnQl`#73h}xZntl+W zZ{V|490s&!r`1mF8q#Bn1&(Dk<}J(i_U&P4oo3+JL>>vsX2cu{!bP@VS>h^nQAQ`T z8hMtdXU^$C*1#D>*(EWOIfse5uDQdXJO(55;RlhYl%0d8Z(k5T8=9L&X;; z8Wqc;Fd-)(d-H-OOi^xqQuKm$8#zx>P9LYR(1h0I!6{R=(!KQcewz-I@DU1K*9)ZE wlCEo|H%qfd(OA%+SJJgEcLK?;rfF5|&my#4y-P4s+MJQounSe-F6#yL&+gC05C8xG literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/__pycache__/heapq.cpython-37.pyc b/backend/venv/lib/python3.7/__pycache__/heapq.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..aea3a71e248203271deb68b844a5f6dc965ec57c GIT binary patch literal 14410 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 literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/__pycache__/hmac.cpython-37.pyc b/backend/venv/lib/python3.7/__pycache__/hmac.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..03b534f5bf6ffe18d532cca0a0fb06113231eecd GIT binary patch literal 6161 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 HT&n&Xc1QuJ literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/__pycache__/io.cpython-37.pyc b/backend/venv/lib/python3.7/__pycache__/io.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..93e3c9fe3fb4b706863f6153a53fe41432258274 GIT binary patch literal 3464 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 literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/__pycache__/linecache.cpython-37.pyc b/backend/venv/lib/python3.7/__pycache__/linecache.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..779a28a26e2cf181103063b958586c31518bdd5b GIT binary patch literal 3837 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 z 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 literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/__pycache__/operator.cpython-37.pyc b/backend/venv/lib/python3.7/__pycache__/operator.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..65601420ac0850074730f9708f80119d377ceac7 GIT binary patch literal 13948 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 D!0L1` literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/__pycache__/os.cpython-37.pyc b/backend/venv/lib/python3.7/__pycache__/os.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f7606f4e74c8170b6f996f2e47ecba9e857d1293 GIT binary patch literal 29748 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�GN)^(~52gw!+z$+<3%due!IK*~f7#Uk E1@kpEJOBUy literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/__pycache__/posixpath.cpython-37.pyc b/backend/venv/lib/python3.7/__pycache__/posixpath.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..853fecf98a00707c6f1fa803b7661e19eff7c76b GIT binary patch literal 10451 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 literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/__pycache__/random.cpython-37.pyc b/backend/venv/lib/python3.7/__pycache__/random.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..28109248c7060a0e0364ae279c17f414528f84d7 GIT binary patch literal 19404 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 literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/__pycache__/shutil.cpython-37.pyc b/backend/venv/lib/python3.7/__pycache__/shutil.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..954402f7ea64ac480653eae89b470981408ade9d GIT binary patch literal 30593 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 a3WsPL;%39YQz+8^2hUEvzi?0Cq5lsAYI9Bi literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/__pycache__/site.cpython-37.pyc b/backend/venv/lib/python3.7/__pycache__/site.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e735f0f6fa9ee7f316095f5b80f44846b637cf2a GIT binary patch literal 21829 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 literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/__pycache__/sre_constants.cpython-37.pyc b/backend/venv/lib/python3.7/__pycache__/sre_constants.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bfc074ee11c1693782fe63a43e2db065b4b75a05 GIT binary patch literal 6339 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 C(ROJ7 literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/__pycache__/sre_parse.cpython-37.pyc b/backend/venv/lib/python3.7/__pycache__/sre_parse.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..05f55119b5de0add0db8923e9bd5c2e2b19b478d GIT binary patch literal 21405 zcmcJ1eQaFUmEU`BzK6phMNt$*eT}Hkk@aQyTaj&15+%!#DXmCZHsg3Q;(e5cq-Mzb z9&Kv!#_^i=TFxd}ZrWzELF!7zB1jiTPy|7C8?@UX4chHC$Zm^t5xlmkn@zX%_5;BJ zEl{H9_V+t?zBrPcvgvL-EMD`(E0uvBEyQPIhW8&$DodoqT19Pc>Z3A__{C-F|=ox(fiM%}dA zb=^TcgLt=_b$i@icb(gJo%Plu-mlWj_Ov6hu4XLLjCD6-*=DS#8S8Dv)-k5~zM7oe z;10MO0dc?`lyDQm9=FdOns%iLk;8oh}x-k;r*z3NbOO3 z-?S$mQ~OjNDUYlD>H)l;P!Fqv>JV~{sl)0BQa+|0R7deXt`3Y_`A4eT&y{^wmy2^b zZ*hLUqW#>BidvjQ|0+7?Y4<}iL*5SU{ngB&mp<|7efj+lJpJ;npc=*d(_#9^gGV2F z_>o5+d;E#XWFtN~(1<<$MDgmBa;Ha5o;p2xX7XY4b?tg-W_IpIxiY_?J%90)SC?*9 zO^LJ5oO|};=bsz9aPikJjZa*D{>lq4PFCZ&RJyw>vuY<+?c}PR3GMW%-Mwn3R_(4; z`=xxc>bz9Ma~01to-!Vd$H(&uo|p1zgd=!Z;v^o0=QJJ<&p4h}@m#?(nNNmxDYVar z_Knc?LVGE+i=pj@_Tm)j(D=i2FcTw#h-*#S%EE-OK~N`5Jn!nO70(^ZN5W*GP%hqZ z3xzOUC>XjTo+%U-7K?Kx=kHs35I`hYEgrt?x!OBiEKgl877w4UOfBAU%f5H`lIyue zJ$3zXY1}VP&6dj73R4y39xi$H&%;-d?3UHxSKRU|hv!OH56|E9uUE8I`lf|R8&g>oR|&9ITqRWs zxe1k4U3e!|Ms?$zQZZ1ZCrn%{`sA@Gl8t|Sv-wkayln`S9asgcWFZ78ukp)K{E8@x zL><$tl8=V5>AB)HFHBw2mBo2gn)1UgiN0D={&g?xovT!4ue#SuWhKcT7&q#rH^ffhm z?Ra&z8aGJ&8nT4^mQ&3(S~FQ=Q=|+3qIhC>ghp2pK~q-EVS~3pn>)5GDSl)&s(1NO z1vK8U15j@^rC&y=*zGvK?l`qb04gGN0;Qb54xAt|9T~t7qCDZn0{gfXIOs%VtlHyO zD!CiQ^39w}&uMqs)j7YCD}rk7I3d_+@V=z|P)BS3;oH5rq*S6S3kZYM?hr`Y8dJZaNKWlwY;FpK%GZfOqHJt}aH zr}YLlOs>-#8RQUz$$5<~YX7Dgpgc1UFc2&cGuD*xCPpEohY&oA$KxuJbds@5B%Q%K zA~{n?Z2pm1PvG%Bg`g>vH!4R(Ab=xkP{mXnG3Z|^3DFxJQtMP7-f6X7_2b=TG?U4UEMl9&^!Vb{IxWW5a7mL{hk*#0wSc(;PD$#%YZOlq zC=}sFfE%`rgo*m#g;7=Xi(yP=RAbGWHEG>9(S z8=>E-=;s|s*r*>v*L**+j74i{e-JxueR5dp#HCIQW!vfn@nzInIDf@j7(m@P>VCIg z_n4muVk))?au+c614g124-)$QM%yaB5qW4ceme_8}nh0EIXG*≦qI5$2q9;QoPsSNF@3~})w8q0T? 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 literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/__pycache__/token.cpython-37.pyc b/backend/venv/lib/python3.7/__pycache__/token.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b223973209cecc48a4ffca9f5100974c012b01b2 GIT binary patch literal 3647 zcmcguOLN=E5gvfx3w+6X%a+%)WZ9x@iGIIUeo!JPaZQ0TNm_FmA4XKkdo^}=v*`XvcSOocd#up(C9&FQ~ zfr70D8Cb$LV=Te)w)|N#3r6OEp?tQ;65s7#EH$@{M!ec=SazjhTk+|)W^*S#VN>_q z)9pQShBbmTMKnr=~CGZjW z2?7K`0@?saA%ZYLgaEe!JBktX5u73DCm0|YBp4zXCKw?YB^V<(OK^^0oZvjcHv|_5 z;sh57CI}`8E)h%-Tqd|eFinskm?5}IaE)M=V2&V3aGl@=!A*i&1h)z95ZooWM{u9u z0l`B8%s;DAn&_bj{H~oy@CrU z38|d$2(@O_+y$%}!c%M5LdDfIZR=yr-ojyd?z&Li74&|n)OU@)Gjkd3{J4=^vkcQp zRvOiA(PV2EwvC&5GNj}N^4vCZSDGjt)-0*2%ILv0- zjDpiKzMx(z=QEk2R-$0{T*teRMOl+(7V)!)VA8K>_4c%y&rmoanK^8Ju924G1%AIx zqkQ70rl(g@g=bpf7xYr}zxzrrlI}zMmwo~_{(oT@Sm#)swY#my)!V0GM9%nXi^oboAbD~{(tYJ1mN!?#L({;s7|ydIjR$zXHKjgdjG`<_Gb1uedZS@1Z+EqZ6D1?eP^6A zC>dH|zNDed7mH8~cA6;jT-x+WQouMD(dG;xa zyF`Kh1KHgt$9a*>fBtG-27WOw!|qP;gRe8F8e4^95}&Rn&wRJ*jR9@21(@ZJAVeP+ils4G_w< zfo4fLW?Xn{4KVhE`hpIPp500d{XoHY%~~TdVis_=Nd?&T)#7TckwJSpUKe->9Xw`) z{I(@LuF^WL9ER31o0~k+OL5sWHqnyLO}xbeEz|f=#%;K?O8I0JQAI8+)2#lJSu*M)jiia@oJDRNIqE-_GIz=8K-u-CT-FoI z!e1^!vsx|_QK{F&C>%8LbJ zQY))yQ^{$?qVO*jv=m?)E*P?_PyJYOtezzlf;zUp2)RSJvsXN_{P_M(yVc%CwcUVqg z#xRF&{(Oa0p^#q}0WFuyt`@UJA?H_xs$plLlz*n_!cS{O$(8jSis_5_G%h_4=w)}j z=w4-nf3x0vQ>k0{%i6|{WzwZe_>4W9{s5nQ>9gFsl1bMalkOrXn~yGrxX-WKzDi(0mHrEB%!^O} literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/__pycache__/tokenize.cpython-37.pyc b/backend/venv/lib/python3.7/__pycache__/tokenize.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f4447970abb1e35f1f0aab36f97dced672d4398f GIT binary patch literal 17778 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 gtA^fL)F^6XD5g&HDn_MZ9;;a9T2d_0MLtcStR{ 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 PZW$-E2`WtHw&DC2Y+)v( literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/__pycache__/weakref.cpython-37.pyc b/backend/venv/lib/python3.7/__pycache__/weakref.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e3a5327bc9092a295073a6422c05d4837cc79192 GIT binary patch literal 19158 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 NJs_R^cJ}9d_FriuSa1LU literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/distutils/distutils.cfg b/backend/venv/lib/python3.7/distutils/distutils.cfg new file mode 100644 index 000000000..1af230ec9 --- /dev/null +++ b/backend/venv/lib/python3.7/distutils/distutils.cfg @@ -0,0 +1,6 @@ +# This is a config file local to this virtualenv installation +# You may include options that will be used by all distutils commands, +# and by easy_install. For instance: +# +# [easy_install] +# find_links = http://mylocalsite diff --git a/backend/venv/lib/python3.7/encodings b/backend/venv/lib/python3.7/encodings new file mode 120000 index 000000000..8ab7b15ba --- /dev/null +++ b/backend/venv/lib/python3.7/encodings @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/encodings \ No newline at end of file diff --git a/backend/venv/lib/python3.7/enum.py b/backend/venv/lib/python3.7/enum.py new file mode 120000 index 000000000..ec266985e --- /dev/null +++ b/backend/venv/lib/python3.7/enum.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/enum.py \ No newline at end of file diff --git a/backend/venv/lib/python3.7/fnmatch.py b/backend/venv/lib/python3.7/fnmatch.py new file mode 120000 index 000000000..7d0781ed3 --- /dev/null +++ b/backend/venv/lib/python3.7/fnmatch.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/fnmatch.py \ No newline at end of file diff --git a/backend/venv/lib/python3.7/functools.py b/backend/venv/lib/python3.7/functools.py new file mode 120000 index 000000000..2b4de2efd --- /dev/null +++ b/backend/venv/lib/python3.7/functools.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/functools.py \ No newline at end of file diff --git a/backend/venv/lib/python3.7/genericpath.py b/backend/venv/lib/python3.7/genericpath.py new file mode 120000 index 000000000..2ac8a8631 --- /dev/null +++ b/backend/venv/lib/python3.7/genericpath.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/genericpath.py \ No newline at end of file diff --git a/backend/venv/lib/python3.7/hashlib.py b/backend/venv/lib/python3.7/hashlib.py new file mode 120000 index 000000000..0cec56fb5 --- /dev/null +++ b/backend/venv/lib/python3.7/hashlib.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/hashlib.py \ No newline at end of file diff --git a/backend/venv/lib/python3.7/heapq.py b/backend/venv/lib/python3.7/heapq.py new file mode 120000 index 000000000..667ad7915 --- /dev/null +++ b/backend/venv/lib/python3.7/heapq.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/heapq.py \ No newline at end of file diff --git a/backend/venv/lib/python3.7/hmac.py b/backend/venv/lib/python3.7/hmac.py new file mode 120000 index 000000000..1f49c56c6 --- /dev/null +++ b/backend/venv/lib/python3.7/hmac.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/hmac.py \ No newline at end of file diff --git a/backend/venv/lib/python3.7/imp.py b/backend/venv/lib/python3.7/imp.py new file mode 120000 index 000000000..b46873917 --- /dev/null +++ b/backend/venv/lib/python3.7/imp.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/imp.py \ No newline at end of file diff --git a/backend/venv/lib/python3.7/importlib b/backend/venv/lib/python3.7/importlib new file mode 120000 index 000000000..0c6a88fe1 --- /dev/null +++ b/backend/venv/lib/python3.7/importlib @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/importlib \ No newline at end of file diff --git a/backend/venv/lib/python3.7/io.py b/backend/venv/lib/python3.7/io.py new file mode 120000 index 000000000..43f630b6a --- /dev/null +++ b/backend/venv/lib/python3.7/io.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/io.py \ No newline at end of file diff --git a/backend/venv/lib/python3.7/keyword.py b/backend/venv/lib/python3.7/keyword.py new file mode 120000 index 000000000..5adf06b36 --- /dev/null +++ b/backend/venv/lib/python3.7/keyword.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/keyword.py \ No newline at end of file diff --git a/backend/venv/lib/python3.7/lib-dynload b/backend/venv/lib/python3.7/lib-dynload new file mode 120000 index 000000000..2f180d91a --- /dev/null +++ b/backend/venv/lib/python3.7/lib-dynload @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/lib-dynload \ No newline at end of file diff --git a/backend/venv/lib/python3.7/linecache.py b/backend/venv/lib/python3.7/linecache.py new file mode 120000 index 000000000..538b638cd --- /dev/null +++ b/backend/venv/lib/python3.7/linecache.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/linecache.py \ No newline at end of file diff --git a/backend/venv/lib/python3.7/locale.py b/backend/venv/lib/python3.7/locale.py new file mode 120000 index 000000000..2fed2c130 --- /dev/null +++ b/backend/venv/lib/python3.7/locale.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/locale.py \ No newline at end of file diff --git a/myenv/lib/python3.7/site-packages/pip/_internal/operations/__init__.py b/backend/venv/lib/python3.7/no-global-site-packages.txt similarity index 100% rename from myenv/lib/python3.7/site-packages/pip/_internal/operations/__init__.py rename to backend/venv/lib/python3.7/no-global-site-packages.txt diff --git a/backend/venv/lib/python3.7/ntpath.py b/backend/venv/lib/python3.7/ntpath.py new file mode 120000 index 000000000..4e91922bd --- /dev/null +++ b/backend/venv/lib/python3.7/ntpath.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/ntpath.py \ No newline at end of file diff --git a/backend/venv/lib/python3.7/operator.py b/backend/venv/lib/python3.7/operator.py new file mode 120000 index 000000000..bd7fe6622 --- /dev/null +++ b/backend/venv/lib/python3.7/operator.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/operator.py \ No newline at end of file diff --git a/backend/venv/lib/python3.7/orig-prefix.txt b/backend/venv/lib/python3.7/orig-prefix.txt new file mode 100644 index 000000000..84e29de28 --- /dev/null +++ b/backend/venv/lib/python3.7/orig-prefix.txt @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7 \ No newline at end of file diff --git a/backend/venv/lib/python3.7/os.py b/backend/venv/lib/python3.7/os.py new file mode 120000 index 000000000..f6a3ca40d --- /dev/null +++ b/backend/venv/lib/python3.7/os.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/os.py \ No newline at end of file diff --git a/backend/venv/lib/python3.7/posixpath.py b/backend/venv/lib/python3.7/posixpath.py new file mode 120000 index 000000000..58c6b8352 --- /dev/null +++ b/backend/venv/lib/python3.7/posixpath.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/posixpath.py \ No newline at end of file diff --git a/backend/venv/lib/python3.7/random.py b/backend/venv/lib/python3.7/random.py new file mode 120000 index 000000000..c21ab7682 --- /dev/null +++ b/backend/venv/lib/python3.7/random.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/random.py \ No newline at end of file diff --git a/backend/venv/lib/python3.7/re.py b/backend/venv/lib/python3.7/re.py new file mode 120000 index 000000000..7d2707d5b --- /dev/null +++ b/backend/venv/lib/python3.7/re.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/re.py \ No newline at end of file diff --git a/backend/venv/lib/python3.7/readline.so b/backend/venv/lib/python3.7/readline.so new file mode 120000 index 000000000..726f8d145 --- /dev/null +++ b/backend/venv/lib/python3.7/readline.so @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/lib-dynload/readline.cpython-37m-darwin.so \ No newline at end of file diff --git a/backend/venv/lib/python3.7/reprlib.py b/backend/venv/lib/python3.7/reprlib.py new file mode 120000 index 000000000..f98535ae5 --- /dev/null +++ b/backend/venv/lib/python3.7/reprlib.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/reprlib.py \ No newline at end of file diff --git a/backend/venv/lib/python3.7/rlcompleter.py b/backend/venv/lib/python3.7/rlcompleter.py new file mode 120000 index 000000000..c4edf48b6 --- /dev/null +++ b/backend/venv/lib/python3.7/rlcompleter.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/rlcompleter.py \ No newline at end of file diff --git a/backend/venv/lib/python3.7/shutil.py b/backend/venv/lib/python3.7/shutil.py new file mode 120000 index 000000000..11c42058d --- /dev/null +++ b/backend/venv/lib/python3.7/shutil.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/shutil.py \ No newline at end of file diff --git a/myenv/lib/python3.7/site-packages/pip-10.0.1.dist-info/INSTALLER b/backend/venv/lib/python3.7/site-packages/Flask-1.0.3.dist-info/INSTALLER similarity index 100% rename from myenv/lib/python3.7/site-packages/pip-10.0.1.dist-info/INSTALLER rename to backend/venv/lib/python3.7/site-packages/Flask-1.0.3.dist-info/INSTALLER diff --git a/backend/venv/lib/python3.7/site-packages/Flask-1.0.3.dist-info/LICENSE b/backend/venv/lib/python3.7/site-packages/Flask-1.0.3.dist-info/LICENSE new file mode 100644 index 000000000..8f9252f45 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/Flask-1.0.3.dist-info/LICENSE @@ -0,0 +1,31 @@ +Copyright © 2010 by the Pallets team. + +Some rights reserved. + +Redistribution and use in source and binary forms of the software as +well as documentation, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE AND DOCUMENTATION 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 AND DOCUMENTATION, EVEN IF ADVISED OF THE POSSIBILITY OF +SUCH DAMAGE. diff --git a/backend/venv/lib/python3.7/site-packages/Flask-1.0.3.dist-info/METADATA b/backend/venv/lib/python3.7/site-packages/Flask-1.0.3.dist-info/METADATA new file mode 100644 index 000000000..0a7e5b676 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/Flask-1.0.3.dist-info/METADATA @@ -0,0 +1,124 @@ +Metadata-Version: 2.1 +Name: Flask +Version: 1.0.3 +Summary: A simple framework for building complex web applications. +Home-page: https://www.palletsprojects.com/p/flask/ +Author: Armin Ronacher +Author-email: armin.ronacher@active-4.com +Maintainer: Pallets team +Maintainer-email: contact@palletsprojects.com +License: BSD +Project-URL: Documentation, http://flask.pocoo.org/docs/ +Project-URL: Code, https://github.com/pallets/flask +Project-URL: Issue tracker, https://github.com/pallets/flask/issues +Platform: any +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: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content +Classifier: Topic :: Internet :: WWW/HTTP :: WSGI :: Application +Classifier: Topic :: Software Development :: Libraries :: Application Frameworks +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Requires-Dist: Werkzeug (>=0.14) +Requires-Dist: Jinja2 (>=2.10) +Requires-Dist: itsdangerous (>=0.24) +Requires-Dist: click (>=5.1) +Provides-Extra: dev +Requires-Dist: pytest (>=3) ; extra == 'dev' +Requires-Dist: coverage ; extra == 'dev' +Requires-Dist: tox ; extra == 'dev' +Requires-Dist: sphinx ; extra == 'dev' +Requires-Dist: pallets-sphinx-themes ; extra == 'dev' +Requires-Dist: sphinxcontrib-log-cabinet ; extra == 'dev' +Provides-Extra: docs +Requires-Dist: sphinx ; extra == 'docs' +Requires-Dist: pallets-sphinx-themes ; extra == 'docs' +Requires-Dist: sphinxcontrib-log-cabinet ; extra == 'docs' +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. + + +Installing +---------- + +Install and update using `pip`_: + +.. code-block:: text + + pip install -U Flask + + +A Simple Example +---------------- + +.. code-block:: python + + from flask import Flask + + app = Flask(__name__) + + @app.route('/') + def hello(): + return 'Hello, World!' + +.. code-block:: text + + $ FLASK_APP=hello.py flask run + * Serving Flask app "hello" + * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit) + + +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://psfmember.org/civicrm/contribute/transact?reset=1&id=20 + + +Links +----- + +* Website: https://www.palletsprojects.com/p/flask/ +* Documentation: http://flask.pocoo.org/docs/ +* License: `BSD `_ +* Releases: https://pypi.org/project/Flask/ +* Code: https://github.com/pallets/flask +* Issue tracker: https://github.com/pallets/flask/issues +* Test status: https://dev.azure.com/pallets/pallets/_build?definitionId=2 +* Test coverage: https://codecov.io/gh/pallets/flask +* Official chat: https://discord.gg/t6rrQZH + +.. _WSGI: https://wsgi.readthedocs.io +.. _Werkzeug: https://www.palletsprojects.com/p/werkzeug/ +.. _Jinja: https://www.palletsprojects.com/p/jinja/ +.. _pip: https://pip.pypa.io/en/stable/quickstart/ + + diff --git a/backend/venv/lib/python3.7/site-packages/Flask-1.0.3.dist-info/RECORD b/backend/venv/lib/python3.7/site-packages/Flask-1.0.3.dist-info/RECORD new file mode 100644 index 000000000..10710bdef --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/Flask-1.0.3.dist-info/RECORD @@ -0,0 +1,48 @@ +../../../bin/flask,sha256=HA9fhakrmO5Tf2BM6ActCyFGu0V6zPs1HSowswUDK-s,277 +Flask-1.0.3.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +Flask-1.0.3.dist-info/LICENSE,sha256=ziEXA3AIuaiUn1qe4cd1XxCESWTYrk4TjN7Qb06J3l8,1575 +Flask-1.0.3.dist-info/METADATA,sha256=2fD2dkRksjxOHmBgcoz_QfqN5ghyP-njBUMItWo2Exo,4119 +Flask-1.0.3.dist-info/RECORD,, +Flask-1.0.3.dist-info/WHEEL,sha256=HX-v9-noUkyUoxyZ1PMSuS7auUxDAR4VBdoYLqD0xws,110 +Flask-1.0.3.dist-info/entry_points.txt,sha256=gBLA1aKg0OYR8AhbAfg8lnburHtKcgJLDU52BBctN0k,42 +Flask-1.0.3.dist-info/top_level.txt,sha256=dvi65F6AeGWVU0TBpYiC04yM60-FX1gJFkK31IKQr5c,6 +flask/__init__.py,sha256=SEPu7STunDgeHTDwji6JeSoKNcSBtULkKzY4spj3z6E,1673 +flask/__main__.py,sha256=pgIXrHhxM5MAMvgzAqWpw_t6AXZ1zG38us4JRgJKtxk,291 +flask/__pycache__/__init__.cpython-37.pyc,, +flask/__pycache__/__main__.cpython-37.pyc,, +flask/__pycache__/_compat.cpython-37.pyc,, +flask/__pycache__/app.cpython-37.pyc,, +flask/__pycache__/blueprints.cpython-37.pyc,, +flask/__pycache__/cli.cpython-37.pyc,, +flask/__pycache__/config.cpython-37.pyc,, +flask/__pycache__/ctx.cpython-37.pyc,, +flask/__pycache__/debughelpers.cpython-37.pyc,, +flask/__pycache__/globals.cpython-37.pyc,, +flask/__pycache__/helpers.cpython-37.pyc,, +flask/__pycache__/logging.cpython-37.pyc,, +flask/__pycache__/sessions.cpython-37.pyc,, +flask/__pycache__/signals.cpython-37.pyc,, +flask/__pycache__/templating.cpython-37.pyc,, +flask/__pycache__/testing.cpython-37.pyc,, +flask/__pycache__/views.cpython-37.pyc,, +flask/__pycache__/wrappers.cpython-37.pyc,, +flask/_compat.py,sha256=x1LK5kpv_6roOeybIFBmme15cGnXWpLtQAGsNfNwRvQ,2980 +flask/app.py,sha256=NC2JgfXOHpqRFxSdfWsSqWUhCfMSB84fHspOaTvUL88,94803 +flask/blueprints.py,sha256=SnIW5hCOhKMa8_N42sw-3LUTg_hPnvxqBJOYNBHkT5c,18296 +flask/cli.py,sha256=XtgWfUHyOABgdGkc34YyP-1b765xxeHLLgl1zPSqUvI,29913 +flask/config.py,sha256=Etv43UCp6I1rg5fDb7DPjp5sNUlQOqP6ZqyhTrTrqgc,10145 +flask/ctx.py,sha256=tLrqKokGoD6ZDqjak9r2ffeEprN06h-CoaelVihKBJ4,16224 +flask/debughelpers.py,sha256=1ceC-UyqZTd4KsJkf0OObHPsVt5R3T6vnmYhiWBjV-w,6479 +flask/globals.py,sha256=pGg72QW_-4xUfsI33I5L_y76c21AeqfSqXDcbd8wvXU,1649 +flask/helpers.py,sha256=M_C0zBY2WtnHG0Y7n0-1lNz0imzj6HmffGEGjMEcXLs,40424 +flask/json/__init__.py,sha256=0x3zrRd8mjYHVxbb7ZXr7OZ2Q1aSvVoturl4Tsp_F0Y,11859 +flask/json/__pycache__/__init__.cpython-37.pyc,, +flask/json/__pycache__/tag.cpython-37.pyc,, +flask/json/tag.py,sha256=9ehzrmt5k7hxf7ZEK0NOs3swvQyU9fWNe-pnYe69N60,8223 +flask/logging.py,sha256=qV9h0vt7NIRkKM9OHDWndzO61E5CeBMlqPJyTt-W2Wc,2231 +flask/sessions.py,sha256=Zgfk3cevqWM3yFlYT-nvhBFtgsCFnGrhneI0u5rT5SM,14471 +flask/signals.py,sha256=BGQbVyCYXnzKK2DVCzppKFyWN1qmrtW1QMAYUs-1Nr8,2211 +flask/templating.py,sha256=FDfWMbpgpC3qObW8GGXRAVrkHFF8K4CHOJymB1wvULI,4914 +flask/testing.py,sha256=I6h58A42ZTKizPjwmVtl-37d8R4A8Mkz5rflY1RsCYg,9329 +flask/views.py,sha256=Wy-_WkUVtCfE2zCXYeJehNgHuEtviE4v3HYfJ--MpbY,5733 +flask/wrappers.py,sha256=1Z9hF5-hXQajn_58XITQFRY8efv3Vy3uZ0avBfZu6XI,7511 diff --git a/myenv/lib/python3.7/site-packages/setuptools-39.0.1.dist-info/WHEEL b/backend/venv/lib/python3.7/site-packages/Flask-1.0.3.dist-info/WHEEL similarity index 70% rename from myenv/lib/python3.7/site-packages/setuptools-39.0.1.dist-info/WHEEL rename to backend/venv/lib/python3.7/site-packages/Flask-1.0.3.dist-info/WHEEL index 7332a419c..c8240f03e 100644 --- a/myenv/lib/python3.7/site-packages/setuptools-39.0.1.dist-info/WHEEL +++ b/backend/venv/lib/python3.7/site-packages/Flask-1.0.3.dist-info/WHEEL @@ -1,5 +1,5 @@ Wheel-Version: 1.0 -Generator: bdist_wheel (0.30.0) +Generator: bdist_wheel (0.33.1) Root-Is-Purelib: true Tag: py2-none-any Tag: py3-none-any diff --git a/backend/venv/lib/python3.7/site-packages/Flask-1.0.3.dist-info/entry_points.txt b/backend/venv/lib/python3.7/site-packages/Flask-1.0.3.dist-info/entry_points.txt new file mode 100644 index 000000000..1eb025200 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/Flask-1.0.3.dist-info/entry_points.txt @@ -0,0 +1,3 @@ +[console_scripts] +flask = flask.cli:main + diff --git a/backend/venv/lib/python3.7/site-packages/Flask-1.0.3.dist-info/top_level.txt b/backend/venv/lib/python3.7/site-packages/Flask-1.0.3.dist-info/top_level.txt new file mode 100644 index 000000000..7e1060246 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/Flask-1.0.3.dist-info/top_level.txt @@ -0,0 +1 @@ +flask diff --git a/backend/venv/lib/python3.7/site-packages/Flask_Cors-3.0.3.dist-info/DESCRIPTION.rst b/backend/venv/lib/python3.7/site-packages/Flask_Cors-3.0.3.dist-info/DESCRIPTION.rst new file mode 100644 index 000000000..aeab36c4a --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/Flask_Cors-3.0.3.dist-info/DESCRIPTION.rst @@ -0,0 +1,134 @@ +Flask-CORS +========== + +|Build Status| |Latest Version| |Supported Python versions| +|License| + +A Flask extension for handling Cross Origin Resource Sharing (CORS), +making cross-origin AJAX possible. + +This package has a simple philosophy, when you want to enable CORS, you +wish to enable it for all use cases on a domain. This means no mucking +around with different allowed headers, methods, etc. By default, +submission of cookies across domains is disabled due to the security +implications, please see the documentation for how to enable +credential'ed requests, and please make sure you add some sort of +`CSRF `__ +protection before doing so! + +Installation +------------ + +Install the extension with using pip, or easy\_install. + +.. code:: bash + + $ pip install -U flask-cors + +Usage +----- + +This package exposes a Flask extension which by default enables CORS support on all routes, for all origins and methods. It allows parameterization of all CORS headers on a per-resource level. The package also contains a decorator, for those who prefer this approach. + +Simple Usage +~~~~~~~~~~~~ + +In the simplest case, initialize the Flask-Cors extension with default +arguments in order to allow CORS for all domains on all routes. See the +full list of options in the `documentation `__. + +.. code:: python + + + from flask import Flask + from flask_cors import CORS, cross_origin + + app = Flask(__name__) + CORS(app) + + @app.route("/") + def helloWorld(): + return "Hello, cross-origin-world!" + +Resource specific CORS +^^^^^^^^^^^^^^^^^^^^^^ + +Alternatively, you can specify CORS options on a resource and origin +level of granularity by passing a dictionary as the `resources` option, +mapping paths to a set of options. See the +full list of options in the `documentation `__. + +.. code:: python + + app = Flask(__name__) + cors = CORS(app, resources={r"/api/*": {"origins": "*"}}) + + @app.route("/api/v1/users") + def list_users(): + return "user example" + +Route specific CORS via decorator +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +This extension also exposes a simple decorator to decorate flask routes +with. Simply add ``@cross_origin()`` below a call to Flask's +``@app.route(..)`` to allow CORS on a given route. See the +full list of options in the `decorator documentation `__. + +.. code:: python + + @app.route("/") + @cross_origin() + def helloWorld(): + return "Hello, cross-origin-world!" + +Documentation +------------- + +For a full list of options, please see the full +`documentation `__ + +Troubleshooting +--------------- + +If things aren't working as you expect, enable logging to help understand +what is going on under the hood, and why. + +.. code:: python + + logging.getLogger('flask_cors').level = logging.DEBUG + + +Tests +----- + +A simple set of tests is included in ``test/``. To run, install nose, +and simply invoke ``nosetests`` or ``python setup.py test`` to exercise +the tests. + +Contributing +------------ + +Questions, comments or improvements? Please create an issue on +`Github `__, tweet at +`@corydolphin `__ or send me an email. +I do my best to include every contribution proposed in any way that I +can. + +Credits +------- + +This Flask extension is based upon the `Decorator for the HTTP Access +Control `__ written by Armin +Ronacher. + +.. |Build Status| image:: https://api.travis-ci.org/corydolphin/flask-cors.svg?branch=master + :target: https://travis-ci.org/corydolphin/flask-cors +.. |Latest Version| image:: https://img.shields.io/pypi/v/Flask-Cors.svg + :target: https://pypi.python.org/pypi/Flask-Cors/ +.. |Supported Python versions| image:: https://img.shields.io/pypi/pyversions/Flask-Cors.svg + :target: https://img.shields.io/pypi/pyversions/Flask-Cors.svg +.. |License| image:: http://img.shields.io/:license-mit-blue.svg + :target: https://pypi.python.org/pypi/Flask-Cors/ + + diff --git a/myenv/lib/python3.7/site-packages/setuptools-39.0.1.dist-info/INSTALLER b/backend/venv/lib/python3.7/site-packages/Flask_Cors-3.0.3.dist-info/INSTALLER similarity index 100% rename from myenv/lib/python3.7/site-packages/setuptools-39.0.1.dist-info/INSTALLER rename to backend/venv/lib/python3.7/site-packages/Flask_Cors-3.0.3.dist-info/INSTALLER diff --git a/backend/venv/lib/python3.7/site-packages/Flask_Cors-3.0.3.dist-info/METADATA b/backend/venv/lib/python3.7/site-packages/Flask_Cors-3.0.3.dist-info/METADATA new file mode 100644 index 000000000..95e42d854 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/Flask_Cors-3.0.3.dist-info/METADATA @@ -0,0 +1,158 @@ +Metadata-Version: 2.0 +Name: Flask-Cors +Version: 3.0.3 +Summary: A Flask extension adding a decorator for CORS support +Home-page: https://github.com/corydolphin/flask-cors +Author: Cory Dolphin +Author-email: corydolphin@gmail.com +License: MIT +Platform: any +Classifier: Environment :: Web Environment +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 2.6 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: Implementation :: CPython +Classifier: Programming Language :: Python :: Implementation :: PyPy +Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Requires-Dist: Flask (>=0.9) +Requires-Dist: Six + +Flask-CORS +========== + +|Build Status| |Latest Version| |Supported Python versions| +|License| + +A Flask extension for handling Cross Origin Resource Sharing (CORS), +making cross-origin AJAX possible. + +This package has a simple philosophy, when you want to enable CORS, you +wish to enable it for all use cases on a domain. This means no mucking +around with different allowed headers, methods, etc. By default, +submission of cookies across domains is disabled due to the security +implications, please see the documentation for how to enable +credential'ed requests, and please make sure you add some sort of +`CSRF `__ +protection before doing so! + +Installation +------------ + +Install the extension with using pip, or easy\_install. + +.. code:: bash + + $ pip install -U flask-cors + +Usage +----- + +This package exposes a Flask extension which by default enables CORS support on all routes, for all origins and methods. It allows parameterization of all CORS headers on a per-resource level. The package also contains a decorator, for those who prefer this approach. + +Simple Usage +~~~~~~~~~~~~ + +In the simplest case, initialize the Flask-Cors extension with default +arguments in order to allow CORS for all domains on all routes. See the +full list of options in the `documentation `__. + +.. code:: python + + + from flask import Flask + from flask_cors import CORS, cross_origin + + app = Flask(__name__) + CORS(app) + + @app.route("/") + def helloWorld(): + return "Hello, cross-origin-world!" + +Resource specific CORS +^^^^^^^^^^^^^^^^^^^^^^ + +Alternatively, you can specify CORS options on a resource and origin +level of granularity by passing a dictionary as the `resources` option, +mapping paths to a set of options. See the +full list of options in the `documentation `__. + +.. code:: python + + app = Flask(__name__) + cors = CORS(app, resources={r"/api/*": {"origins": "*"}}) + + @app.route("/api/v1/users") + def list_users(): + return "user example" + +Route specific CORS via decorator +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +This extension also exposes a simple decorator to decorate flask routes +with. Simply add ``@cross_origin()`` below a call to Flask's +``@app.route(..)`` to allow CORS on a given route. See the +full list of options in the `decorator documentation `__. + +.. code:: python + + @app.route("/") + @cross_origin() + def helloWorld(): + return "Hello, cross-origin-world!" + +Documentation +------------- + +For a full list of options, please see the full +`documentation `__ + +Troubleshooting +--------------- + +If things aren't working as you expect, enable logging to help understand +what is going on under the hood, and why. + +.. code:: python + + logging.getLogger('flask_cors').level = logging.DEBUG + + +Tests +----- + +A simple set of tests is included in ``test/``. To run, install nose, +and simply invoke ``nosetests`` or ``python setup.py test`` to exercise +the tests. + +Contributing +------------ + +Questions, comments or improvements? Please create an issue on +`Github `__, tweet at +`@corydolphin `__ or send me an email. +I do my best to include every contribution proposed in any way that I +can. + +Credits +------- + +This Flask extension is based upon the `Decorator for the HTTP Access +Control `__ written by Armin +Ronacher. + +.. |Build Status| image:: https://api.travis-ci.org/corydolphin/flask-cors.svg?branch=master + :target: https://travis-ci.org/corydolphin/flask-cors +.. |Latest Version| image:: https://img.shields.io/pypi/v/Flask-Cors.svg + :target: https://pypi.python.org/pypi/Flask-Cors/ +.. |Supported Python versions| image:: https://img.shields.io/pypi/pyversions/Flask-Cors.svg + :target: https://img.shields.io/pypi/pyversions/Flask-Cors.svg +.. |License| image:: http://img.shields.io/:license-mit-blue.svg + :target: https://pypi.python.org/pypi/Flask-Cors/ + + diff --git a/backend/venv/lib/python3.7/site-packages/Flask_Cors-3.0.3.dist-info/RECORD b/backend/venv/lib/python3.7/site-packages/Flask_Cors-3.0.3.dist-info/RECORD new file mode 100644 index 000000000..67016778b --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/Flask_Cors-3.0.3.dist-info/RECORD @@ -0,0 +1,17 @@ +Flask_Cors-3.0.3.dist-info/DESCRIPTION.rst,sha256=OZ8TtlMi3rOa7YMnqQX8p1XlTU31TyH0-ECIvDimpwE,4218 +Flask_Cors-3.0.3.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +Flask_Cors-3.0.3.dist-info/METADATA,sha256=qmkvVl7SQ2ieuWB1_TREz6Jd48QNyN_ou9DHLxMNXcw,5172 +Flask_Cors-3.0.3.dist-info/RECORD,, +Flask_Cors-3.0.3.dist-info/WHEEL,sha256=AvR0WeTpDaxT645bl5FQxUK6NPsTls2ttpcGJg3j1Xg,110 +Flask_Cors-3.0.3.dist-info/metadata.json,sha256=V-JDQzpdjO6ZSSvQOCKyW5woqOE44bWgDiMDolfbvVM,1139 +Flask_Cors-3.0.3.dist-info/top_level.txt,sha256=aWye_0QNZPp_QtPF4ZluLHqnyVLT9CPJsfiGhwqkWuo,11 +flask_cors/__init__.py,sha256=ymYAYrah_35eGzD51UdEHdBRSkLTteY4O3412xdOWMA,924 +flask_cors/__pycache__/__init__.cpython-37.pyc,, +flask_cors/__pycache__/core.cpython-37.pyc,, +flask_cors/__pycache__/decorator.cpython-37.pyc,, +flask_cors/__pycache__/extension.cpython-37.pyc,, +flask_cors/__pycache__/version.cpython-37.pyc,, +flask_cors/core.py,sha256=trJCpbOOxkJyOcIda_0nI_lD393B4l0L4tiHgilElrM,13771 +flask_cors/decorator.py,sha256=iiwjUi0lVeCm4OJJHY5Cvuzj2nENbUns3Iq6zqKXuss,4937 +flask_cors/extension.py,sha256=KnI-ogRBB7PKhz2yK2m0EzRS9CjJMxTfZCEBhaeixl8,7405 +flask_cors/version.py,sha256=f3vNGrLTgOxbJH5qxemKyIWl-KEbqvz66qZKwIM1iw8,22 diff --git a/myenv/lib/python3.7/site-packages/pip-10.0.1.dist-info/WHEEL b/backend/venv/lib/python3.7/site-packages/Flask_Cors-3.0.3.dist-info/WHEEL similarity index 67% rename from myenv/lib/python3.7/site-packages/pip-10.0.1.dist-info/WHEEL rename to backend/venv/lib/python3.7/site-packages/Flask_Cors-3.0.3.dist-info/WHEEL index 0f91e7875..9dff69d86 100644 --- a/myenv/lib/python3.7/site-packages/pip-10.0.1.dist-info/WHEEL +++ b/backend/venv/lib/python3.7/site-packages/Flask_Cors-3.0.3.dist-info/WHEEL @@ -1,6 +1,6 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.31.0) -Root-Is-Purelib: true -Tag: py2-none-any -Tag: py3-none-any - +Wheel-Version: 1.0 +Generator: bdist_wheel (0.24.0) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/backend/venv/lib/python3.7/site-packages/Flask_Cors-3.0.3.dist-info/metadata.json b/backend/venv/lib/python3.7/site-packages/Flask_Cors-3.0.3.dist-info/metadata.json new file mode 100644 index 000000000..20554528c --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/Flask_Cors-3.0.3.dist-info/metadata.json @@ -0,0 +1 @@ +{"license": "MIT", "name": "Flask-Cors", "metadata_version": "2.0", "generator": "bdist_wheel (0.24.0)", "test_requires": [{"requires": ["nose"]}], "summary": "A Flask extension adding a decorator for CORS support", "platform": "any", "run_requires": [{"requires": ["Flask (>=0.9)", "Six"]}], "version": "3.0.3", "extensions": {"python.details": {"project_urls": {"Home": "https://github.com/corydolphin/flask-cors"}, "document_names": {"description": "DESCRIPTION.rst"}, "contacts": [{"role": "author", "email": "corydolphin@gmail.com", "name": "Cory Dolphin"}]}}, "classifiers": ["Environment :: Web Environment", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: Implementation :: CPython", "Programming Language :: Python :: Implementation :: PyPy", "Topic :: Internet :: WWW/HTTP :: Dynamic Content", "Topic :: Software Development :: Libraries :: Python Modules"], "extras": []} \ No newline at end of file diff --git a/backend/venv/lib/python3.7/site-packages/Flask_Cors-3.0.3.dist-info/top_level.txt b/backend/venv/lib/python3.7/site-packages/Flask_Cors-3.0.3.dist-info/top_level.txt new file mode 100644 index 000000000..27af98818 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/Flask_Cors-3.0.3.dist-info/top_level.txt @@ -0,0 +1 @@ +flask_cors diff --git a/myenv/lib/python3.7/site-packages/pip-10.0.1.dist-info/top_level.txt b/backend/venv/lib/python3.7/site-packages/Jinja2-2.10.1.dist-info/INSTALLER similarity index 100% rename from myenv/lib/python3.7/site-packages/pip-10.0.1.dist-info/top_level.txt rename to backend/venv/lib/python3.7/site-packages/Jinja2-2.10.1.dist-info/INSTALLER diff --git a/backend/venv/lib/python3.7/site-packages/Jinja2-2.10.1.dist-info/LICENSE b/backend/venv/lib/python3.7/site-packages/Jinja2-2.10.1.dist-info/LICENSE new file mode 100644 index 000000000..10145a264 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/Jinja2-2.10.1.dist-info/LICENSE @@ -0,0 +1,31 @@ +Copyright (c) 2009 by the Jinja Team, see AUTHORS for more details. + +Some rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + + * The names of the contributors may not 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 +OWNER 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/backend/venv/lib/python3.7/site-packages/Jinja2-2.10.1.dist-info/METADATA b/backend/venv/lib/python3.7/site-packages/Jinja2-2.10.1.dist-info/METADATA new file mode 100644 index 000000000..fb4a867d0 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/Jinja2-2.10.1.dist-info/METADATA @@ -0,0 +1,67 @@ +Metadata-Version: 2.1 +Name: Jinja2 +Version: 2.10.1 +Summary: A small but fast and easy to use stand-alone template engine written in pure python. +Home-page: http://jinja.pocoo.org/ +Author: Armin Ronacher +Author-email: armin.ronacher@active-4.com +License: BSD +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: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.6 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Classifier: Topic :: Text Processing :: Markup :: HTML +Requires-Dist: MarkupSafe (>=0.23) +Provides-Extra: i18n +Requires-Dist: Babel (>=0.8) ; extra == 'i18n' + + +Jinja2 +~~~~~~ + +Jinja2 is a template engine written in pure Python. It provides a +`Django`_ inspired non-XML syntax but supports inline expressions and +an optional `sandboxed`_ environment. + +Nutshell +-------- + +Here a small example of a Jinja template:: + + {% extends 'base.html' %} + {% block title %}Memberlist{% endblock %} + {% block content %} + + {% endblock %} + +Philosophy +---------- + +Application logic is for the controller but don't try to make the life +for the template designer too hard by giving him too few functionality. + +For more informations visit the new `Jinja2 webpage`_ and `documentation`_. + +.. _sandboxed: https://en.wikipedia.org/wiki/Sandbox_(computer_security) +.. _Django: https://www.djangoproject.com/ +.. _Jinja2 webpage: http://jinja.pocoo.org/ +.. _documentation: http://jinja.pocoo.org/2/documentation/ + + diff --git a/backend/venv/lib/python3.7/site-packages/Jinja2-2.10.1.dist-info/RECORD b/backend/venv/lib/python3.7/site-packages/Jinja2-2.10.1.dist-info/RECORD new file mode 100644 index 000000000..914594a8f --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/Jinja2-2.10.1.dist-info/RECORD @@ -0,0 +1,61 @@ +Jinja2-2.10.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +Jinja2-2.10.1.dist-info/LICENSE,sha256=JvzUNv3Io51EiWrAPm8d_SXjhJnEjyDYvB3Tvwqqils,1554 +Jinja2-2.10.1.dist-info/METADATA,sha256=rx0eN8lX8iq8-YVppmCzV1Qx4y3Pj9IWi08mXUCrewI,2227 +Jinja2-2.10.1.dist-info/RECORD,, +Jinja2-2.10.1.dist-info/WHEEL,sha256=HX-v9-noUkyUoxyZ1PMSuS7auUxDAR4VBdoYLqD0xws,110 +Jinja2-2.10.1.dist-info/entry_points.txt,sha256=NdzVcOrqyNyKDxD09aERj__3bFx2paZhizFDsKmVhiA,72 +Jinja2-2.10.1.dist-info/top_level.txt,sha256=PkeVWtLb3-CqjWi1fO29OCbj55EhX_chhKrCdrVe_zs,7 +jinja2/__init__.py,sha256=V1D-JHQKklZseXOMA-uAW7-BeKe_TfPpOFi9-dV04ZA,2616 +jinja2/__pycache__/__init__.cpython-37.pyc,, +jinja2/__pycache__/_compat.cpython-37.pyc,, +jinja2/__pycache__/_identifier.cpython-37.pyc,, +jinja2/__pycache__/asyncfilters.cpython-37.pyc,, +jinja2/__pycache__/asyncsupport.cpython-37.pyc,, +jinja2/__pycache__/bccache.cpython-37.pyc,, +jinja2/__pycache__/compiler.cpython-37.pyc,, +jinja2/__pycache__/constants.cpython-37.pyc,, +jinja2/__pycache__/debug.cpython-37.pyc,, +jinja2/__pycache__/defaults.cpython-37.pyc,, +jinja2/__pycache__/environment.cpython-37.pyc,, +jinja2/__pycache__/exceptions.cpython-37.pyc,, +jinja2/__pycache__/ext.cpython-37.pyc,, +jinja2/__pycache__/filters.cpython-37.pyc,, +jinja2/__pycache__/idtracking.cpython-37.pyc,, +jinja2/__pycache__/lexer.cpython-37.pyc,, +jinja2/__pycache__/loaders.cpython-37.pyc,, +jinja2/__pycache__/meta.cpython-37.pyc,, +jinja2/__pycache__/nativetypes.cpython-37.pyc,, +jinja2/__pycache__/nodes.cpython-37.pyc,, +jinja2/__pycache__/optimizer.cpython-37.pyc,, +jinja2/__pycache__/parser.cpython-37.pyc,, +jinja2/__pycache__/runtime.cpython-37.pyc,, +jinja2/__pycache__/sandbox.cpython-37.pyc,, +jinja2/__pycache__/tests.cpython-37.pyc,, +jinja2/__pycache__/utils.cpython-37.pyc,, +jinja2/__pycache__/visitor.cpython-37.pyc,, +jinja2/_compat.py,sha256=xP60CE5Qr8FTYcDE1f54tbZLKGvMwYml4-8T7Q4KG9k,2596 +jinja2/_identifier.py,sha256=W1QBSY-iJsyt6oR_nKSuNNCzV95vLIOYgUNPUI1d5gU,1726 +jinja2/asyncfilters.py,sha256=cTDPvrS8Hp_IkwsZ1m9af_lr5nHysw7uTa5gV0NmZVE,4144 +jinja2/asyncsupport.py,sha256=UErQ3YlTLaSjFb94P4MVn08-aVD9jJxty2JVfMRb-1M,7878 +jinja2/bccache.py,sha256=nQldx0ZRYANMyfvOihRoYFKSlUdd5vJkS7BjxNwlOZM,12794 +jinja2/compiler.py,sha256=BqC5U6JxObSRhblyT_a6Tp5GtEU5z3US1a4jLQaxxgo,65386 +jinja2/constants.py,sha256=uwwV8ZUhHhacAuz5PTwckfsbqBaqM7aKfyJL7kGX5YQ,1626 +jinja2/debug.py,sha256=WTVeUFGUa4v6ReCsYv-iVPa3pkNB75OinJt3PfxNdXs,12045 +jinja2/defaults.py,sha256=Em-95hmsJxIenDCZFB1YSvf9CNhe9rBmytN3yUrBcWA,1400 +jinja2/environment.py,sha256=VnkAkqw8JbjZct4tAyHlpBrka2vqB-Z58RAP-32P1ZY,50849 +jinja2/exceptions.py,sha256=_Rj-NVi98Q6AiEjYQOsP8dEIdu5AlmRHzcSNOPdWix4,4428 +jinja2/ext.py,sha256=atMQydEC86tN1zUsdQiHw5L5cF62nDbqGue25Yiu3N4,24500 +jinja2/filters.py,sha256=yOAJk0MsH-_gEC0i0U6NweVQhbtYaC-uE8xswHFLF4w,36528 +jinja2/idtracking.py,sha256=2GbDSzIvGArEBGLkovLkqEfmYxmWsEf8c3QZwM4uNsw,9197 +jinja2/lexer.py,sha256=ySEPoXd1g7wRjsuw23uimS6nkGN5aqrYwcOKxCaVMBQ,28559 +jinja2/loaders.py,sha256=xiTuURKAEObyym0nU8PCIXu_Qp8fn0AJ5oIADUUm-5Q,17382 +jinja2/meta.py,sha256=fmKHxkmZYAOm9QyWWy8EMd6eefAIh234rkBMW2X4ZR8,4340 +jinja2/nativetypes.py,sha256=_sJhS8f-8Q0QMIC0dm1YEdLyxEyoO-kch8qOL5xUDfE,7308 +jinja2/nodes.py,sha256=L10L_nQDfubLhO3XjpF9qz46FSh2clL-3e49ogVlMmA,30853 +jinja2/optimizer.py,sha256=MsdlFACJ0FRdPtjmCAdt7JQ9SGrXFaDNUaslsWQaG3M,1722 +jinja2/parser.py,sha256=lPzTEbcpTRBLw8ii6OYyExHeAhaZLMA05Hpv4ll3ULk,35875 +jinja2/runtime.py,sha256=DHdD38Pq8gj7uWQC5usJyWFoNWL317A9AvXOW_CLB34,27755 +jinja2/sandbox.py,sha256=UmX8hVjdaERCbA3RXBwrV1f-beA23KmijG5kzPJyU4A,17106 +jinja2/tests.py,sha256=iJQLwbapZr-EKquTG_fVOVdwHUUKf3SX9eNkjQDF8oU,4237 +jinja2/utils.py,sha256=q24VupGZotQ-uOyrJxCaXtDWhZC1RgsQG7kcdmjck2Q,20629 +jinja2/visitor.py,sha256=JD1H1cANA29JcntFfN5fPyqQxB4bI4wC00BzZa-XHks,3316 diff --git a/backend/venv/lib/python3.7/site-packages/Jinja2-2.10.1.dist-info/WHEEL b/backend/venv/lib/python3.7/site-packages/Jinja2-2.10.1.dist-info/WHEEL new file mode 100644 index 000000000..c8240f03e --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/Jinja2-2.10.1.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.33.1) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/backend/venv/lib/python3.7/site-packages/Jinja2-2.10.1.dist-info/entry_points.txt b/backend/venv/lib/python3.7/site-packages/Jinja2-2.10.1.dist-info/entry_points.txt new file mode 100644 index 000000000..32e6b7530 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/Jinja2-2.10.1.dist-info/entry_points.txt @@ -0,0 +1,4 @@ + + [babel.extractors] + jinja2 = jinja2.ext:babel_extract[i18n] + \ No newline at end of file diff --git a/backend/venv/lib/python3.7/site-packages/Jinja2-2.10.1.dist-info/top_level.txt b/backend/venv/lib/python3.7/site-packages/Jinja2-2.10.1.dist-info/top_level.txt new file mode 100644 index 000000000..7f7afbf3b --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/Jinja2-2.10.1.dist-info/top_level.txt @@ -0,0 +1 @@ +jinja2 diff --git a/backend/venv/lib/python3.7/site-packages/MarkupSafe-1.0.dist-info/INSTALLER b/backend/venv/lib/python3.7/site-packages/MarkupSafe-1.0.dist-info/INSTALLER new file mode 100644 index 000000000..a1b589e38 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/MarkupSafe-1.0.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/backend/venv/lib/python3.7/site-packages/MarkupSafe-1.0.dist-info/LICENSE b/backend/venv/lib/python3.7/site-packages/MarkupSafe-1.0.dist-info/LICENSE new file mode 100644 index 000000000..5d2693890 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/MarkupSafe-1.0.dist-info/LICENSE @@ -0,0 +1,33 @@ +Copyright (c) 2010 by Armin Ronacher and contributors. See AUTHORS +for more details. + +Some rights reserved. + +Redistribution and use in source and binary forms of the software as well +as documentation, with or without modification, are permitted provided +that the following conditions are met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + +* The names of the contributors may not be used to endorse or + promote products derived from this software without specific + prior written permission. + +THIS SOFTWARE AND DOCUMENTATION 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 OWNER +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 AND DOCUMENTATION, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. diff --git a/backend/venv/lib/python3.7/site-packages/MarkupSafe-1.0.dist-info/METADATA b/backend/venv/lib/python3.7/site-packages/MarkupSafe-1.0.dist-info/METADATA new file mode 100644 index 000000000..25a3ad162 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/MarkupSafe-1.0.dist-info/METADATA @@ -0,0 +1,135 @@ +Metadata-Version: 2.1 +Name: MarkupSafe +Version: 1.0 +Summary: Implements a XML/HTML/XHTML Markup safe string for Python +Home-page: http://github.com/pallets/markupsafe +Author: Armin Ronacher +Author-email: armin.ronacher@active-4.com +License: BSD +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: Programming Language :: Python :: 3 +Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Classifier: Topic :: Text Processing :: Markup :: HTML + +MarkupSafe +========== + +Implements a unicode subclass that supports HTML strings: + +.. code-block:: python + + >>> from markupsafe import Markup, escape + >>> escape("") + Markup(u'<script>alert(document.cookie);</script>') + >>> tmpl = Markup("%s") + >>> tmpl % "Peter > Lustig" + Markup(u'Peter > Lustig') + +If you want to make an object unicode that is not yet unicode +but don't want to lose the taint information, you can use the +``soft_unicode`` function. (On Python 3 you can also use ``soft_str`` which +is a different name for the same function). + +.. code-block:: python + + >>> from markupsafe import soft_unicode + >>> soft_unicode(42) + u'42' + >>> soft_unicode(Markup('foo')) + Markup(u'foo') + +HTML Representations +-------------------- + +Objects can customize their HTML markup equivalent by overriding +the ``__html__`` function: + +.. code-block:: python + + >>> class Foo(object): + ... def __html__(self): + ... return 'Nice' + ... + >>> escape(Foo()) + Markup(u'Nice') + >>> Markup(Foo()) + Markup(u'Nice') + +Silent Escapes +-------------- + +Since MarkupSafe 0.10 there is now also a separate escape function +called ``escape_silent`` that returns an empty string for ``None`` for +consistency with other systems that return empty strings for ``None`` +when escaping (for instance Pylons' webhelpers). + +If you also want to use this for the escape method of the Markup +object, you can create your own subclass that does that: + +.. code-block:: python + + from markupsafe import Markup, escape_silent as escape + + class SilentMarkup(Markup): + __slots__ = () + + @classmethod + def escape(cls, s): + return cls(escape(s)) + +New-Style String Formatting +--------------------------- + +Starting with MarkupSafe 0.21 new style string formats from Python 2.6 and +3.x are now fully supported. Previously the escape behavior of those +functions was spotty at best. The new implementations operates under the +following algorithm: + +1. if an object has an ``__html_format__`` method it is called as + replacement for ``__format__`` with the format specifier. It either + has to return a string or markup object. +2. if an object has an ``__html__`` method it is called. +3. otherwise the default format system of Python kicks in and the result + is HTML escaped. + +Here is how you can implement your own formatting: + +.. code-block:: python + + class User(object): + + def __init__(self, id, username): + self.id = id + self.username = username + + def __html_format__(self, format_spec): + if format_spec == 'link': + return Markup('{1}').format( + self.id, + self.__html__(), + ) + elif format_spec: + raise ValueError('Invalid format spec') + return self.__html__() + + def __html__(self): + return Markup('{0}').format(self.username) + +And to format that user: + +.. code-block:: python + + >>> user = User(1, 'foo') + >>> Markup('

    User: {0:link}').format(user) + Markup(u'

    User: foo') + +Markupsafe supports Python 2.6, 2.7 and Python 3.3 and higher. + + diff --git a/backend/venv/lib/python3.7/site-packages/MarkupSafe-1.0.dist-info/RECORD b/backend/venv/lib/python3.7/site-packages/MarkupSafe-1.0.dist-info/RECORD new file mode 100644 index 000000000..cc5f54c3c --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/MarkupSafe-1.0.dist-info/RECORD @@ -0,0 +1,16 @@ +MarkupSafe-1.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +MarkupSafe-1.0.dist-info/LICENSE,sha256=C76IIo_WPSDsCX9k5Y1aCkZRI64TkUChjUBsYLSIJLU,1582 +MarkupSafe-1.0.dist-info/METADATA,sha256=RTBfxOEfHqiY9goR2QvR2sG0-pRm52r0QWcGi_pUYCQ,4182 +MarkupSafe-1.0.dist-info/RECORD,, +MarkupSafe-1.0.dist-info/WHEEL,sha256=KUcuKd4NS6mCD7Qx4sT343lTcoCvKQec801MGpvmkDM,110 +MarkupSafe-1.0.dist-info/top_level.txt,sha256=qy0Plje5IJuvsCBjejJyhDCjEAdcDLK_2agVcex8Z6U,11 +markupsafe/__init__.py,sha256=xtkRdxhzJzgp65wUo1D4DjnazxHU88pPldaAuDekBeY,10697 +markupsafe/__pycache__/__init__.cpython-37.pyc,, +markupsafe/__pycache__/_compat.cpython-37.pyc,, +markupsafe/__pycache__/_constants.cpython-37.pyc,, +markupsafe/__pycache__/_native.cpython-37.pyc,, +markupsafe/_compat.py,sha256=r1HE0CpcAZeb-AiTV9wITR91PeLHn0CzZ_XHkYoozpI,565 +markupsafe/_constants.py,sha256=U_xybFQsyXKCgHSfranJnFzo-z9nn9fuBeSk243sE5Q,4795 +markupsafe/_native.py,sha256=E2Un1ysOf-w45d18YCj8UelT5UP7Vt__IuFPYJ7YRIs,1187 +markupsafe/_speedups.c,sha256=B6Mf6Fn33WqkagfwY7q5ZBSm_vJoHDYxDB0Jp_DP7Jw,5936 +markupsafe/_speedups.cpython-37m-darwin.so,sha256=aCkvKwOgS-osg2ytJNhI926sjgLMFp8E-dxnjnXiMQ4,10584 diff --git a/backend/venv/lib/python3.7/site-packages/MarkupSafe-1.0.dist-info/WHEEL b/backend/venv/lib/python3.7/site-packages/MarkupSafe-1.0.dist-info/WHEEL new file mode 100644 index 000000000..9c9830887 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/MarkupSafe-1.0.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.33.4) +Root-Is-Purelib: false +Tag: cp37-cp37m-macosx_10_9_x86_64 + diff --git a/backend/venv/lib/python3.7/site-packages/MarkupSafe-1.0.dist-info/top_level.txt b/backend/venv/lib/python3.7/site-packages/MarkupSafe-1.0.dist-info/top_level.txt new file mode 100644 index 000000000..75bf72925 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/MarkupSafe-1.0.dist-info/top_level.txt @@ -0,0 +1 @@ +markupsafe diff --git a/backend/venv/lib/python3.7/site-packages/Werkzeug-0.12.2.dist-info/DESCRIPTION.rst b/backend/venv/lib/python3.7/site-packages/Werkzeug-0.12.2.dist-info/DESCRIPTION.rst new file mode 100644 index 000000000..3e3abb7f2 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/Werkzeug-0.12.2.dist-info/DESCRIPTION.rst @@ -0,0 +1,54 @@ +Werkzeug +======== + +Werkzeug started as simple collection of various utilities for WSGI +applications and has become one of the most advanced WSGI utility +modules. It includes a powerful debugger, full featured request and +response objects, HTTP utilities to handle entity tags, cache control +headers, HTTP dates, cookie handling, file uploads, a powerful URL +routing system and a bunch of community contributed addon modules. + +Werkzeug is unicode aware and doesn't enforce a specific template +engine, database adapter or anything else. It doesn't even enforce +a specific way of handling requests and leaves all that up to the +developer. It's most useful for end user applications which should work +on as many server environments as possible (such as blogs, wikis, +bulletin boards, etc.). + +Details and example applications are available on the +`Werkzeug website `_. + + +Features +-------- + +- unicode awareness + +- request and response objects + +- various utility functions for dealing with HTTP headers such as + `Accept` and `Cache-Control` headers. + +- thread local objects with proper cleanup at request end + +- an interactive debugger + +- A simple WSGI server with support for threading and forking + with an automatic reloader. + +- a flexible URL routing system with REST support. + +- fully WSGI compatible + + +Development Version +------------------- + +The Werkzeug development version can be installed by cloning the git +repository from `github`_:: + + git clone git@github.com:pallets/werkzeug.git + +.. _github: http://github.com/pallets/werkzeug + + diff --git a/backend/venv/lib/python3.7/site-packages/Werkzeug-0.12.2.dist-info/INSTALLER b/backend/venv/lib/python3.7/site-packages/Werkzeug-0.12.2.dist-info/INSTALLER new file mode 100644 index 000000000..a1b589e38 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/Werkzeug-0.12.2.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/backend/venv/lib/python3.7/site-packages/Werkzeug-0.12.2.dist-info/LICENSE.txt b/backend/venv/lib/python3.7/site-packages/Werkzeug-0.12.2.dist-info/LICENSE.txt new file mode 100644 index 000000000..1c2e0b7dc --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/Werkzeug-0.12.2.dist-info/LICENSE.txt @@ -0,0 +1,29 @@ +Copyright (c) 2014 by the Werkzeug Team, see AUTHORS for more details. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + + * The names of the contributors may not 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 +OWNER 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/backend/venv/lib/python3.7/site-packages/Werkzeug-0.12.2.dist-info/METADATA b/backend/venv/lib/python3.7/site-packages/Werkzeug-0.12.2.dist-info/METADATA new file mode 100644 index 000000000..52e12a4f0 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/Werkzeug-0.12.2.dist-info/METADATA @@ -0,0 +1,83 @@ +Metadata-Version: 2.0 +Name: Werkzeug +Version: 0.12.2 +Summary: The Swiss Army knife of Python web development +Home-page: http://werkzeug.pocoo.org/ +Author: Armin Ronacher +Author-email: armin.ronacher@active-4.com +License: BSD +Platform: any +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: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.6 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Provides-Extra: termcolor +Requires-Dist: termcolor; extra == 'termcolor' +Provides-Extra: watchdog +Requires-Dist: watchdog; extra == 'watchdog' + +Werkzeug +======== + +Werkzeug started as simple collection of various utilities for WSGI +applications and has become one of the most advanced WSGI utility +modules. It includes a powerful debugger, full featured request and +response objects, HTTP utilities to handle entity tags, cache control +headers, HTTP dates, cookie handling, file uploads, a powerful URL +routing system and a bunch of community contributed addon modules. + +Werkzeug is unicode aware and doesn't enforce a specific template +engine, database adapter or anything else. It doesn't even enforce +a specific way of handling requests and leaves all that up to the +developer. It's most useful for end user applications which should work +on as many server environments as possible (such as blogs, wikis, +bulletin boards, etc.). + +Details and example applications are available on the +`Werkzeug website `_. + + +Features +-------- + +- unicode awareness + +- request and response objects + +- various utility functions for dealing with HTTP headers such as + `Accept` and `Cache-Control` headers. + +- thread local objects with proper cleanup at request end + +- an interactive debugger + +- A simple WSGI server with support for threading and forking + with an automatic reloader. + +- a flexible URL routing system with REST support. + +- fully WSGI compatible + + +Development Version +------------------- + +The Werkzeug development version can be installed by cloning the git +repository from `github`_:: + + git clone git@github.com:pallets/werkzeug.git + +.. _github: http://github.com/pallets/werkzeug + + diff --git a/backend/venv/lib/python3.7/site-packages/Werkzeug-0.12.2.dist-info/RECORD b/backend/venv/lib/python3.7/site-packages/Werkzeug-0.12.2.dist-info/RECORD new file mode 100644 index 000000000..fa5d024cd --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/Werkzeug-0.12.2.dist-info/RECORD @@ -0,0 +1,95 @@ +Werkzeug-0.12.2.dist-info/DESCRIPTION.rst,sha256=z9r9xqJ0fYSAn1Tz7KRBdFGDerL2y4pHWSW_72pUgTc,1591 +Werkzeug-0.12.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +Werkzeug-0.12.2.dist-info/LICENSE.txt,sha256=F84h8-PZAuC-Hq-_252D3yhH6mqIc-WUbXUPbfOtjXM,1532 +Werkzeug-0.12.2.dist-info/METADATA,sha256=SphYykCCskmOJK7mV1-M2T1PTOrx5K3DJ8n3E5jA298,2738 +Werkzeug-0.12.2.dist-info/RECORD,, +Werkzeug-0.12.2.dist-info/WHEEL,sha256=AvR0WeTpDaxT645bl5FQxUK6NPsTls2ttpcGJg3j1Xg,110 +Werkzeug-0.12.2.dist-info/metadata.json,sha256=6taKobd3cQ5zOY5MVKlvuCJGaX7VPLaHYuRwzwwkORI,1276 +Werkzeug-0.12.2.dist-info/top_level.txt,sha256=QRyj2VjwJoQkrwjwFIOlB8Xg3r9un0NtqVHQF-15xaw,9 +werkzeug/__init__.py,sha256=NDY8HsYsT3dguTLu4MhuH-GpQE5XS9aKhrdfwHnzOEk,6864 +werkzeug/__pycache__/__init__.cpython-37.pyc,, +werkzeug/__pycache__/_compat.cpython-37.pyc,, +werkzeug/__pycache__/_internal.cpython-37.pyc,, +werkzeug/__pycache__/_reloader.cpython-37.pyc,, +werkzeug/__pycache__/datastructures.cpython-37.pyc,, +werkzeug/__pycache__/exceptions.cpython-37.pyc,, +werkzeug/__pycache__/filesystem.cpython-37.pyc,, +werkzeug/__pycache__/formparser.cpython-37.pyc,, +werkzeug/__pycache__/http.cpython-37.pyc,, +werkzeug/__pycache__/local.cpython-37.pyc,, +werkzeug/__pycache__/posixemulation.cpython-37.pyc,, +werkzeug/__pycache__/routing.cpython-37.pyc,, +werkzeug/__pycache__/script.cpython-37.pyc,, +werkzeug/__pycache__/security.cpython-37.pyc,, +werkzeug/__pycache__/serving.cpython-37.pyc,, +werkzeug/__pycache__/test.cpython-37.pyc,, +werkzeug/__pycache__/testapp.cpython-37.pyc,, +werkzeug/__pycache__/urls.cpython-37.pyc,, +werkzeug/__pycache__/useragents.cpython-37.pyc,, +werkzeug/__pycache__/utils.cpython-37.pyc,, +werkzeug/__pycache__/wrappers.cpython-37.pyc,, +werkzeug/__pycache__/wsgi.cpython-37.pyc,, +werkzeug/_compat.py,sha256=8c4U9o6A_TR9nKCcTbpZNxpqCXcXDVIbFawwKM2s92c,6311 +werkzeug/_internal.py,sha256=sE2JbLnMzN9mRI1iipTYWrFAGEWaZVECqtHAiNEhqUE,13841 +werkzeug/_reloader.py,sha256=NkIXQCTa6b22wWLpXob_jIVUxux8LtAsfWehLkKt0iM,8816 +werkzeug/contrib/__init__.py,sha256=f7PfttZhbrImqpr5Ezre8CXgwvcGUJK7zWNpO34WWrw,623 +werkzeug/contrib/__pycache__/__init__.cpython-37.pyc,, +werkzeug/contrib/__pycache__/atom.cpython-37.pyc,, +werkzeug/contrib/__pycache__/cache.cpython-37.pyc,, +werkzeug/contrib/__pycache__/fixers.cpython-37.pyc,, +werkzeug/contrib/__pycache__/iterio.cpython-37.pyc,, +werkzeug/contrib/__pycache__/jsrouting.cpython-37.pyc,, +werkzeug/contrib/__pycache__/limiter.cpython-37.pyc,, +werkzeug/contrib/__pycache__/lint.cpython-37.pyc,, +werkzeug/contrib/__pycache__/profiler.cpython-37.pyc,, +werkzeug/contrib/__pycache__/securecookie.cpython-37.pyc,, +werkzeug/contrib/__pycache__/sessions.cpython-37.pyc,, +werkzeug/contrib/__pycache__/testtools.cpython-37.pyc,, +werkzeug/contrib/__pycache__/wrappers.cpython-37.pyc,, +werkzeug/contrib/atom.py,sha256=qqfJcfIn2RYY-3hO3Oz0aLq9YuNubcPQ_KZcNsDwVJo,15575 +werkzeug/contrib/cache.py,sha256=nyUUxsS0MTHiFmu-481y9PHd8NvWH5pzCoEX1yA0mHY,30341 +werkzeug/contrib/fixers.py,sha256=gR06T-w71ur-tHQ_31kP_4jpOncPJ4Wc1dOqTvYusr8,10179 +werkzeug/contrib/iterio.py,sha256=RlqDvGhz0RneTpzE8dVc-yWCUv4nkPl1jEc_EDp2fH0,10814 +werkzeug/contrib/jsrouting.py,sha256=QTmgeDoKXvNK02KzXgx9lr3cAH6fAzpwF5bBdPNvJPs,8564 +werkzeug/contrib/limiter.py,sha256=iS8-ahPZ-JLRnmfIBzxpm7O_s3lPsiDMVWv7llAIDCI,1334 +werkzeug/contrib/lint.py,sha256=qZlmqiWJ5tQJOEzLnPmHWA8eUEpcBIWkAb_V2RKJg4o,12558 +werkzeug/contrib/profiler.py,sha256=ISwCWvwVyGpDLRBRpLjo_qUWma6GXYBrTAco4PEQSHY,5151 +werkzeug/contrib/securecookie.py,sha256=bDsAJmslkwmXjycnPjEjWtfLBvhz0ud4z3k7tdezUVs,12174 +werkzeug/contrib/sessions.py,sha256=39LVNvLbm5JWpbxM79WC2l87MJFbqeISARjwYbkJatw,12577 +werkzeug/contrib/testtools.py,sha256=G9xN-qeihJlhExrIZMCahvQOIDxdL9NiX874jiiHFMs,2453 +werkzeug/contrib/wrappers.py,sha256=v7OYlz7wQtDlS9fey75UiRZ1IkUWqCpzbhsLy4k14Hw,10398 +werkzeug/datastructures.py,sha256=rq0zICISMUetS3xvUVvrhIvyue9oUzrs_NU3b83zwuQ,89066 +werkzeug/debug/__init__.py,sha256=GTsOsjE3PqUAlsUVm2Mgc_KWA2kjjSsUz0JsM7Qu41w,17266 +werkzeug/debug/__pycache__/__init__.cpython-37.pyc,, +werkzeug/debug/__pycache__/console.cpython-37.pyc,, +werkzeug/debug/__pycache__/repr.cpython-37.pyc,, +werkzeug/debug/__pycache__/tbtools.cpython-37.pyc,, +werkzeug/debug/console.py,sha256=n3-dsKk1TsjnN-u4ZgmuWCU_HO0qw5IA7ttjhyyMM6I,5607 +werkzeug/debug/repr.py,sha256=bKqstDYGfECpeLerd48s_hxuqK4b6UWnjMu3d_DHO8I,9340 +werkzeug/debug/shared/FONT_LICENSE,sha256=LwAVEI1oYnvXiNMT9SnCH_TaLCxCpeHziDrMg0gPkAI,4673 +werkzeug/debug/shared/console.png,sha256=bxax6RXXlvOij_KeqvSNX0ojJf83YbnZ7my-3Gx9w2A,507 +werkzeug/debug/shared/debugger.js,sha256=PKPVYuyO4SX1hkqLOwCLvmIEO5154WatFYaXE-zIfKI,6264 +werkzeug/debug/shared/jquery.js,sha256=7LkWEzqTdpEfELxcZZlS6wAx5Ff13zZ83lYO2_ujj7g,95957 +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=IEO0PC2pWmh2aEyGCaN--txuWsRCliuhlbEhPDFwh0A,6270 +werkzeug/debug/shared/ubuntu.ttf,sha256=1eaHFyepmy4FyDvjLVzpITrGEBu_CZYY94jE0nED1c0,70220 +werkzeug/debug/tbtools.py,sha256=rBudXCmkVdAKIcdhxANxgf09g6kQjJWW9_5bjSpr4OY,18451 +werkzeug/exceptions.py,sha256=3wp95Hqj9FqV8MdikV99JRcHse_fSMn27V8tgP5Hw2c,20505 +werkzeug/filesystem.py,sha256=hHWeWo_gqLMzTRfYt8-7n2wWcWUNTnDyudQDLOBEICE,2175 +werkzeug/formparser.py,sha256=DxN53eOCb6i7PxqtldrF2Kv9Mx00BqW297N4t-RxkWE,21241 +werkzeug/http.py,sha256=nrk-ASJzcKOuoBEz274TWA8jKt0CQSOBZuP_A0UASTA,36658 +werkzeug/local.py,sha256=QdQhWV5L8p1Y1CJ1CDStwxaUs24SuN5aebHwjVD08C8,14553 +werkzeug/posixemulation.py,sha256=xEF2Bxc-vUCPkiu4IbfWVd3LW7DROYAT-ExW6THqyzw,3519 +werkzeug/routing.py,sha256=g25wg0GNfff8WcfRlc1ZxTGvz1KbVj09w2S7wxopseQ,66746 +werkzeug/script.py,sha256=Jh9OAktqjLNc_IBBUatVM7uP5LDcbxaYA8n2ObnS4bo,11666 +werkzeug/security.py,sha256=Z0v0ojdo7T4FNyfIjx86BFQKwasy3ZR9euikIJDQYP8,9191 +werkzeug/serving.py,sha256=aAS3EgiD-VjemsYfSf1yqdjaGEfpB4I3M4PKlLotJLo,29069 +werkzeug/test.py,sha256=xnabNSpty66ftZiXHcoZaYFP1E4WUNxydw5Oe8Mjhoo,34795 +werkzeug/testapp.py,sha256=3HQRW1sHZKXuAjCvFMet4KXtQG3loYTFnvn6LWt-4zI,9396 +werkzeug/urls.py,sha256=fSbI4Gb29_p02Zk21VAZQRN1QdOVY9CNTgpb2rbajNQ,36710 +werkzeug/useragents.py,sha256=Ck3G977Y0Rzdk9wFcLpL0PyOrONtdK1_d2Zexb78cX4,5640 +werkzeug/utils.py,sha256=lkybtv_mq35zV1qhelvEcILTzrMUwZ9yon6E8XwapJE,22972 +werkzeug/wrappers.py,sha256=wceh1RhvhIZVzKuok3XMQ5jqjYYCEYv5JqKY3Nc_oRY,82986 +werkzeug/wsgi.py,sha256=TjPo5ups3NI1RVVGdMvd3XaceqFtqlMX5X169gWWFrQ,42838 diff --git a/backend/venv/lib/python3.7/site-packages/Werkzeug-0.12.2.dist-info/WHEEL b/backend/venv/lib/python3.7/site-packages/Werkzeug-0.12.2.dist-info/WHEEL new file mode 100644 index 000000000..9dff69d86 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/Werkzeug-0.12.2.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.24.0) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/backend/venv/lib/python3.7/site-packages/Werkzeug-0.12.2.dist-info/metadata.json b/backend/venv/lib/python3.7/site-packages/Werkzeug-0.12.2.dist-info/metadata.json new file mode 100644 index 000000000..d77fbb8dd --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/Werkzeug-0.12.2.dist-info/metadata.json @@ -0,0 +1 @@ +{"license": "BSD", "name": "Werkzeug", "metadata_version": "2.0", "generator": "bdist_wheel (0.24.0)", "summary": "The Swiss Army knife of Python web development", "platform": "any", "run_requires": [{"requires": ["watchdog"], "extra": "watchdog"}, {"requires": ["termcolor"], "extra": "termcolor"}], "version": "0.12.2", "extensions": {"python.details": {"project_urls": {"Home": "http://werkzeug.pocoo.org/"}, "document_names": {"description": "DESCRIPTION.rst", "license": "LICENSE.txt"}, "contacts": [{"role": "author", "email": "armin.ronacher@active-4.com", "name": "Armin Ronacher"}]}}, "classifiers": ["Development Status :: 5 - Production/Stable", "Environment :: Web Environment", "Intended Audience :: Developers", "License :: OSI Approved :: BSD License", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Topic :: Internet :: WWW/HTTP :: Dynamic Content", "Topic :: Software Development :: Libraries :: Python Modules"], "extras": ["termcolor", "watchdog"]} \ No newline at end of file diff --git a/backend/venv/lib/python3.7/site-packages/Werkzeug-0.12.2.dist-info/top_level.txt b/backend/venv/lib/python3.7/site-packages/Werkzeug-0.12.2.dist-info/top_level.txt new file mode 100644 index 000000000..6fe8da849 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/Werkzeug-0.12.2.dist-info/top_level.txt @@ -0,0 +1 @@ +werkzeug diff --git a/myenv/lib/python3.7/site-packages/__pycache__/easy_install.cpython-37.pyc b/backend/venv/lib/python3.7/site-packages/__pycache__/easy_install.cpython-37.pyc similarity index 58% rename from myenv/lib/python3.7/site-packages/__pycache__/easy_install.cpython-37.pyc rename to backend/venv/lib/python3.7/site-packages/__pycache__/easy_install.cpython-37.pyc index 76ac9ce11d45bcb54629519010abe702b2bd2404..60747c6f7c6ebbb44458cd759ffa24f8d8567239 100644 GIT binary patch delta 33 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/__pycache__/six.cpython-37.pyc b/backend/venv/lib/python3.7/site-packages/__pycache__/six.cpython-37.pyc similarity index 98% rename from myenv/lib/python3.7/site-packages/pip/_vendor/__pycache__/six.cpython-37.pyc rename to backend/venv/lib/python3.7/site-packages/__pycache__/six.cpython-37.pyc index 228c3cc86474c9659ca70018e5e7f720cf16cd51..2d4706c8e5225440103353ed4ebc169a05ba2488 100644 GIT binary patch delta 49 zcmZ2|m~sALMm{HAUM>b8*!D;=c16WTzHj`D5tCU3TzN`!GYk_AGY#~MGb=VH33vtq E0Dcn>a{vGU delta 61 zcmbP#m~r)CMm{HAUM>b82wW)^t6Z~@?;Ag3%4AjnR|zw-WXqz=6l48@%mOfuFH6l! M$uHU*Cg2$e03UA>x&QzG diff --git a/backend/venv/lib/python3.7/site-packages/click-6.7.dist-info/DESCRIPTION.rst b/backend/venv/lib/python3.7/site-packages/click-6.7.dist-info/DESCRIPTION.rst new file mode 100644 index 000000000..e1187231a --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/click-6.7.dist-info/DESCRIPTION.rst @@ -0,0 +1,3 @@ +UNKNOWN + + diff --git a/backend/venv/lib/python3.7/site-packages/click-6.7.dist-info/INSTALLER b/backend/venv/lib/python3.7/site-packages/click-6.7.dist-info/INSTALLER new file mode 100644 index 000000000..a1b589e38 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/click-6.7.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/backend/venv/lib/python3.7/site-packages/click-6.7.dist-info/METADATA b/backend/venv/lib/python3.7/site-packages/click-6.7.dist-info/METADATA new file mode 100644 index 000000000..1f108853b --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/click-6.7.dist-info/METADATA @@ -0,0 +1,16 @@ +Metadata-Version: 2.0 +Name: click +Version: 6.7 +Summary: A simple wrapper around optparse for powerful command line utilities. +Home-page: http://github.com/mitsuhiko/click +Author: Armin Ronacher +Author-email: armin.ronacher@active-4.com +License: UNKNOWN +Platform: UNKNOWN +Classifier: License :: OSI Approved :: BSD License +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 3 + +UNKNOWN + + diff --git a/backend/venv/lib/python3.7/site-packages/click-6.7.dist-info/RECORD b/backend/venv/lib/python3.7/site-packages/click-6.7.dist-info/RECORD new file mode 100644 index 000000000..9ac11c86f --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/click-6.7.dist-info/RECORD @@ -0,0 +1,41 @@ +click-6.7.dist-info/DESCRIPTION.rst,sha256=OCTuuN6LcWulhHS3d5rfjdsQtW22n7HENFRh6jC6ego,10 +click-6.7.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +click-6.7.dist-info/METADATA,sha256=l6lAyogIUXiHKUK_rWguef-EMcvO5C6bXzFCNCcblbQ,424 +click-6.7.dist-info/RECORD,, +click-6.7.dist-info/WHEEL,sha256=5wvfB7GvgZAbKBSE9uX9Zbi6LCL-_KgezgHblXhCRnM,113 +click-6.7.dist-info/metadata.json,sha256=qg0uO6amNHkIkOxnmWX7Xa_DNQMQ62Q6drivuP9Gh1c,571 +click-6.7.dist-info/top_level.txt,sha256=J1ZQogalYS4pphY_lPECoNMfw0HzTSrZglC4Yfwo4xA,6 +click/__init__.py,sha256=k8R00cFKWI8dhDVKQeLBlAdNh1CxerMEDRiGnr32gdw,2858 +click/__pycache__/__init__.cpython-37.pyc,, +click/__pycache__/_bashcomplete.cpython-37.pyc,, +click/__pycache__/_compat.cpython-37.pyc,, +click/__pycache__/_termui_impl.cpython-37.pyc,, +click/__pycache__/_textwrap.cpython-37.pyc,, +click/__pycache__/_unicodefun.cpython-37.pyc,, +click/__pycache__/_winconsole.cpython-37.pyc,, +click/__pycache__/core.cpython-37.pyc,, +click/__pycache__/decorators.cpython-37.pyc,, +click/__pycache__/exceptions.cpython-37.pyc,, +click/__pycache__/formatting.cpython-37.pyc,, +click/__pycache__/globals.cpython-37.pyc,, +click/__pycache__/parser.cpython-37.pyc,, +click/__pycache__/termui.cpython-37.pyc,, +click/__pycache__/testing.cpython-37.pyc,, +click/__pycache__/types.cpython-37.pyc,, +click/__pycache__/utils.cpython-37.pyc,, +click/_bashcomplete.py,sha256=82rMiibtEurdwBq60NHXVCBuGXJHDpblFO9o2YxJDF0,2423 +click/_compat.py,sha256=j59MpzxYGE-fTGj0A5sg8UI8GhHod1XMojiCA0jvbL0,21011 +click/_termui_impl.py,sha256=Ol1JJhvBRw3l8j1WIU0tOWjQtxxmwGE44lFDbzDqzoA,16395 +click/_textwrap.py,sha256=gwS4m7bdQiJnzaDG8osFcRb-5vn4t4l2qSCy-5csCEc,1198 +click/_unicodefun.py,sha256=A3UOzJw6lEZyol2SBg3fNXgweTutaOzkJ61OB7vik3Y,4204 +click/_winconsole.py,sha256=MzG46DEYPoRyx4SO7EIhFuFZHESgooAfJLIukbB6p5c,7790 +click/core.py,sha256=M0nJ6Kkye7XZXYG7HCbkJWSfy14WHV6bQmGLACrOhKw,70254 +click/decorators.py,sha256=y7CX2needh8iRWafj-QS_hGQFsN24eyXAhx5Y2ATwas,10941 +click/exceptions.py,sha256=rOa0pP3PbSy0_AAPOW9irBEM8AJ3BySN-4z2VUwFVo4,6788 +click/formatting.py,sha256=eh-cypTUAhpI3HD-K4ZpR3vCiURIO62xXvKkR3tNUTM,8889 +click/globals.py,sha256=PAgnKvGxq4YuEIldw3lgYOGBLYwsyxnm1IByBX3BFXo,1515 +click/parser.py,sha256=i01xgYuIA6AwQWEXjshwHSwnTR3gUep4FxJIfyW4ta4,15510 +click/termui.py,sha256=Bp99MSWQtyoWe1_7HggDmA77n--3KLxu7NsZMFMaCUo,21008 +click/testing.py,sha256=kJ9mjtJgwNAlkgKcFf9-ISxufmaPDbbuOHVC9WIvKdY,11002 +click/types.py,sha256=ZGb2lmFs5Vwd9loTRIMbGcqhPVOql8mGoBhWBRT6V4E,18864 +click/utils.py,sha256=1jalPlkUU28JReTEQeeSFtbJd-SirYWBNfjtELBKzT4,14916 diff --git a/backend/venv/lib/python3.7/site-packages/click-6.7.dist-info/WHEEL b/backend/venv/lib/python3.7/site-packages/click-6.7.dist-info/WHEEL new file mode 100644 index 000000000..7bf9daa1a --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/click-6.7.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.30.0.a0) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/backend/venv/lib/python3.7/site-packages/click-6.7.dist-info/metadata.json b/backend/venv/lib/python3.7/site-packages/click-6.7.dist-info/metadata.json new file mode 100644 index 000000000..0a4cfb189 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/click-6.7.dist-info/metadata.json @@ -0,0 +1 @@ +{"classifiers": ["License :: OSI Approved :: BSD License", "Programming Language :: Python", "Programming Language :: Python :: 3"], "extensions": {"python.details": {"contacts": [{"email": "armin.ronacher@active-4.com", "name": "Armin Ronacher", "role": "author"}], "document_names": {"description": "DESCRIPTION.rst"}, "project_urls": {"Home": "http://github.com/mitsuhiko/click"}}}, "generator": "bdist_wheel (0.30.0.a0)", "metadata_version": "2.0", "name": "click", "summary": "A simple wrapper around optparse for powerful command line utilities.", "version": "6.7"} \ No newline at end of file diff --git a/backend/venv/lib/python3.7/site-packages/click-6.7.dist-info/top_level.txt b/backend/venv/lib/python3.7/site-packages/click-6.7.dist-info/top_level.txt new file mode 100644 index 000000000..dca9a9096 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/click-6.7.dist-info/top_level.txt @@ -0,0 +1 @@ +click diff --git a/backend/venv/lib/python3.7/site-packages/click/__init__.py b/backend/venv/lib/python3.7/site-packages/click/__init__.py new file mode 100644 index 000000000..971e55d0a --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/click/__init__.py @@ -0,0 +1,98 @@ +# -*- coding: utf-8 -*- +""" + click + ~~~~~ + + Click is a simple Python module that wraps the stdlib's 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. + + In case optparse ever gets removed from the stdlib, it will be shipped by + this module. + + :copyright: (c) 2014 by Armin Ronacher. + :license: BSD, see LICENSE for more details. +""" + +# Core classes +from .core import Context, BaseCommand, Command, MultiCommand, Group, \ + CommandCollection, Parameter, Option, Argument + +# Globals +from .globals import get_current_context + +# Decorators +from .decorators import pass_context, pass_obj, make_pass_decorator, \ + command, group, argument, option, confirmation_option, \ + password_option, version_option, help_option + +# Types +from .types import ParamType, File, Path, Choice, IntRange, Tuple, \ + STRING, INT, FLOAT, BOOL, UUID, UNPROCESSED + +# Utilities +from .utils import echo, get_binary_stream, get_text_stream, open_file, \ + format_filename, get_app_dir, get_os_args + +# Terminal functions +from .termui import prompt, confirm, get_terminal_size, echo_via_pager, \ + progressbar, clear, style, unstyle, secho, edit, launch, getchar, \ + pause + +# Exceptions +from .exceptions import ClickException, UsageError, BadParameter, \ + FileError, Abort, NoSuchOption, BadOptionUsage, BadArgumentUsage, \ + MissingParameter + +# Formatting +from .formatting import HelpFormatter, wrap_text + +# Parsing +from .parser import OptionParser + + +__all__ = [ + # Core classes + 'Context', 'BaseCommand', 'Command', 'MultiCommand', 'Group', + 'CommandCollection', 'Parameter', 'Option', 'Argument', + + # Globals + 'get_current_context', + + # Decorators + 'pass_context', 'pass_obj', 'make_pass_decorator', 'command', 'group', + 'argument', 'option', 'confirmation_option', 'password_option', + 'version_option', 'help_option', + + # Types + 'ParamType', 'File', 'Path', 'Choice', 'IntRange', 'Tuple', 'STRING', + 'INT', 'FLOAT', 'BOOL', 'UUID', 'UNPROCESSED', + + # Utilities + 'echo', 'get_binary_stream', 'get_text_stream', 'open_file', + 'format_filename', 'get_app_dir', 'get_os_args', + + # Terminal functions + 'prompt', 'confirm', 'get_terminal_size', 'echo_via_pager', + 'progressbar', 'clear', 'style', 'unstyle', 'secho', 'edit', 'launch', + 'getchar', 'pause', + + # Exceptions + 'ClickException', 'UsageError', 'BadParameter', 'FileError', + 'Abort', 'NoSuchOption', 'BadOptionUsage', 'BadArgumentUsage', + 'MissingParameter', + + # Formatting + 'HelpFormatter', 'wrap_text', + + # Parsing + 'OptionParser', +] + + +# Controls if click should emit the warning about the use of unicode +# literals. +disable_unicode_literals_warning = False + + +__version__ = '6.7' diff --git a/backend/venv/lib/python3.7/site-packages/click/__pycache__/__init__.cpython-37.pyc b/backend/venv/lib/python3.7/site-packages/click/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..836dbdffe29364e79d4b5c3f832f21b72360141a GIT binary patch literal 2741 zcmbuBOH&(362}F4A_)P;?`PY_24O&ec^hLS@h~0?gn>&%Omwt53#skS?vAP!40G7; zvtM8@`%UUNd)lwCr_F2$dyezy2>qz6uFA^#XI3?h;o)M6o`3!J;OFU5D)k>WZk{?d zw&|yT8%U)fB~mZ|gZ=;xia|_^G-gBwvm%Q*k;A;mV?h*fNDN_76bE>0+Am>Ql#_PG zAI6HP;D{K(Q89{RVhnGITR1Mp@wT{)cf=jMEAHYwaS!i{`^lWF{{SC~hxkZ5!pGt< zJ`qpwsd$Rd#51&nh0n!vd?8-oOYssX#00()uabE=|20mENt_Z>SQS;A7Ss4fyuleU zgR^2b8I$+tuqJ9aFXnMUEa0M8#JA!tE{P>v7R$IIR&Z6U;+j~)b+L{cVguiacgfs> zzlra~d)yLR_(6QYZLy7YQOAa8U{f@4N9^FP*iFU``Fpr8_VJ_mnAk=C06&RO)Gk38 zhM@u@FbZRE3&!C#+=07r5AMSQcnFW+F+72%@C+#zauU=!ZM7JPths6zvqumiiW2mA054&W2~)UJ!4;7}aG zXYm=1PE*xm=iij*qD7DEd+xWS^$&iENwdkFmZvSp(jG>>v`(($P8e7iLYJ(#uvi^*ln(Go02h1~!Wci%&*pB(f8flz8I2xDGBT324&q4g<%uG^s~ z+Ma9iva}m|ABEa!`Este&x62n$^VbIDjrrfHvIKQw&qpi9^FR;FZf#cGS=aShQq`3^V z+^`y_J2RG+(mFh7?jD`)S{EU!qND{fc06Ct75_`=OI3$Vz8MCw{3SM}2JNHSQ4T#)lifQ!uAiAq+ z8R>RHGsb$fyueY{wvLr_(2Q^wXX2(~D2!xaUvLN`lt0>4Vgw|!De+(@ifr&y&j__m zdg$t~$wgFfQOtTJYV;PP%uvNRzOB7qrKxZf_NC{L$Zg75iRQGG)Vk#;lXZQ`e{_6J zYv;Q`uaVVB=otxKY;wNS4cv~&Qy^}KM@LRqODd>Ja`bn9ab+(l#dA$d>?%bmEH@nZ zQ7A(!Z|_C6-U?N0%17ZTow}y7`GVX zjN6PmjJu3`jQflSjE9UzjK_>8jHire42$uc@q+P^F~NAnc+Hq(OfjmAX~rAI3}cot z$EY#p84HX>##_b`W0|qSSY@m+))^a&cZ^NOd&U;y17n*}XEX?Vzou8_R*$MjCU4si zy0&dHbYSJ55|^sT4_l6}6O~2r`HO-yBfQCWW4b8+fc_%KXRGV|?L3&G zyg4=cPvt}ud-nr>B!A?GE`na2bDlUoj_=#Hu)s?`V0Jg~+z_PgdlWy3Z(lhoAP=Tw z+c#IF{m+y-W-~jJ9Zi?B#eqV4FijlDq$>l(bYUPzzY19e>KjaF(z#qF{eOZ+0i6H< literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/site-packages/click/__pycache__/_bashcomplete.cpython-37.pyc b/backend/venv/lib/python3.7/site-packages/click/__pycache__/_bashcomplete.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..338386eb8e74e29b78d66b0d6e744360ce880d3d GIT binary patch literal 2391 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 literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/site-packages/click/__pycache__/_winconsole.cpython-37.pyc b/backend/venv/lib/python3.7/site-packages/click/__pycache__/_winconsole.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..50bafdf4f25d1754bc1b11dac5c836ca182f1f15 GIT binary patch literal 7456 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 literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/site-packages/click/__pycache__/decorators.cpython-37.pyc b/backend/venv/lib/python3.7/site-packages/click/__pycache__/decorators.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..43ae84a5cb6daa25517ab3cace3e07909afde6e4 GIT binary patch literal 11496 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 P*L83S{N07W5SRWNTb70% literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/site-packages/click/__pycache__/globals.cpython-37.pyc b/backend/venv/lib/python3.7/site-packages/click/__pycache__/globals.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2200e006600b2e366d093747e3e7e4c8b09266a6 GIT binary patch literal 1898 zcmZuyPmdcl6t`!RY&M%+M4=TuAejnOg4$%aV#PK>2&kyEmk6~vz)C1_#-5CKJ>!w> znf;@1VSD8}bdQKTA7+kls`v(6;MtRDcTp|HV?RH?_w(=l$+z3vJp|*AKkxqZcN?L< z+@={JEWU=H8N57q_s z+Hip?sgQIb>)>%9Kcdbt7R6F0mPAm#rTdsPC8RKW(OVz*b z6H2O6bMzb1TTnm$uo2`*Ni83hRF7gM88AFb^=NTCn;n?_?2D3p9?kOd(XNdTmd9G| z#ruyRkEWws`S3>aRbtKen0LRT0g7CY^+ zWqYEBIs{XbK}&bwTXknMCL%kVRXxaF(4?$v} zl^_)8TQEm%*$gN5@ONNQ!@q)_#4vykE1sC@AnQ}H^``5w-LuL1lD71Dx$6~6?aV;&CiB(QP`mKbTAhSi9sJ1U{*% zw#Ndy+aT2My2*3*hQQm<=aeitkO-(}>j&Kj%{oilUC7WL?qYq%*~L!>crw_iHf^Fg uWzZG1BexEf%VVDn+R^VXTyyuvXZOogu|o2%+#j2F(+@jg?@qVfZT|-p-VX!- literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/site-packages/click/__pycache__/parser.cpython-37.pyc b/backend/venv/lib/python3.7/site-packages/click/__pycache__/parser.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c1a6e5d3e6ad4faa5f0de76fa2ca29e3e77b4b92 GIT binary patch literal 11485 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 N-opIt`KRV<{{x`J^acO` literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/site-packages/click/__pycache__/termui.cpython-37.pyc b/backend/venv/lib/python3.7/site-packages/click/__pycache__/termui.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8c3df1159be88c98d2d7f6d669074ad00056a344 GIT binary patch literal 18863 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 E09G7UO8@`> literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/site-packages/click/__pycache__/testing.cpython-37.pyc b/backend/venv/lib/python3.7/site-packages/click/__pycache__/testing.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2e3ae1d05e8a175156978c922e86c6c41270606e GIT binary patch literal 10257 zcmd5?O_1EyamLU5U}k6kmlP#S4lG+LjUo;yQHtp;nvq3O79C|ti)&Gul7hj`!|Y-g zGZ;N!cDWOb52C6}9hBIos3%$=Ce=%*=AB zq{^3o!~+I+Ki&QM=j+D4wYXTpZ?_Qmo@D_=|_H)aq}k5=U+0?Nw0|_0P5T8lEqR2A((g`8s|tiY5GB z;@=xWzpFKuzXH|T)>k^(rjgeC*poQ>QEJ}#=(SXDHTBfG8%uw%d+Rpt*PWg}5YCQ2 zaOJThJy&?LOH<^BiJLcZMt9J78i@ex>%ss@rZ7bb*ODlU3a(|bE-X>|TyIyzhNz1L z+*L(GEaIIdmc%lyHL)UAajlCrkb5p|-0bd!pyqBY{6Uviql2yn&Ko$R6*P&SXpWW` zXh8u+>RVv1;`oE%C{C+RIEr!8G}BV#1--Pao>$c4ztQ9p=J;A%8cP4rjlD~UuDsL> z127w1>dQ+z`;K!pdSmeYL-Bgo86LiNIqqHE-Iu|uy*GaFgG<|&hW_xPKZs&C2riEL zd#}2$`j;awxTN}h=1n!r^kl(tvW|}PZ9Is034MIw6ahu2 zvuR+dYx~*>Xn3US*nx}=Nw$-gk4Ud_DhzpenvAmJVQ0TX1SlCa^zqs}3Dn`M|Hd&# z0U01mVGTElcEWNvF^Gys84ad9k9RDGv_wjq)1ePeks&Xj;|n-*DXh+sKx2QO#Vwj3 z@CUgdU@T7un<5mFxL6C=UiAJpWF3EXXL3gdzP8A1-8S@N1NCy3Q? zDbeEc10%Wvr&J-EnrN8iDAbzuw7Ta;?C42fWfe_Y+ddw8H>C_^TK6LkMT4%FmUoU3dD4nE z=!TfGLR}3%Osj9vb3}MkQY=ZU-91-EUM$bij8my{z*z0O2cC+gj-uoZ^opKEqZxI* zgnt(Pp*1W-vO50J6G>{{rB3-l;(iln)Iu}G3cv|9MhbenFv0sR;r={?~Jw^awIezEK#L)i!SwW0$=re*;?ul@sCBKV4@_W<}6aZXw zMA(IoBR7;P(fM7R5xE$cgIRAhDw3XdaTW(f;Wu$c+i2#DU=`Uw z8IZUnp!y7#*K)Y*Rrf7`XNJr$jT+!HVSBw@=Qqn@<#YI$_5z#AxwLj8@ZV>3b#Fn& zwCiLHN`r0ibLa~%vU{UJm-N*Q{P@_8!_0DQ*T(qnfsOFqcj1;OhSzNz%9_|QL3iQ| z)Y`+59EK4l^amL0M_~XAEo^Ua=*w`>_Xcsxwzv2E$PNd=G0$`q$^-5XU$q-}7vnv4 zdcuy5BT7f?BR}4Q#=xGBLC2swk`hkrnAFyfZMdt!E*69n;OTaQaK{a>J|f*vdT624 zAfi?0*PBCEx_uf&PHt2A4*YPt+|z^mg|8)#qWmo}otcSnV>hSXk9anc#O(32?RPF- zwRetf;q_c{Lo_@B^_gqmfumx2g{|0#1LEV%xrhd6W+*9Jpe<25L2|PTncX>tYzFpg zw3E=x;J7u*CB(joZ4kcNTZw^?TJuA*Lj76HsF9o^!8-fhu|^9X83FjExvAzoj0M}6!#VqSzPx5C&1Wo``0c1M9LNmBh`{6u<={2;L1 zQ5^Q&*auRDv^}stRS6}Tt#`WQZ0VqD5l3Fcj|6!qz(7Oj6J$h)9mqz97koHmM^|x$ zV~MdfE|22g#j6Ot)j=mIm$7_Y< zPh$m<*&XWHu?f5QJ0t87w6D{7UWQ@(e5XTN1}Id_1Wi+7Cu2h% zhhC^ilxU7TpEJ9Ge@ZmzIV7%5MxsL`GTi)gVwxpU9{<5qNN4sv8y^zh$&oVfpe`>Y zhDtk;{8D_?$5-EHAt`2O++S{DnZYqYA^mo9d_si@GFV9)o>oRfxE&7~LRnY4mKmrQ zoe9q@hG$sqGh&f~k3wbh+K_iD6nF#u2;O}cXJkV%vG$N6FVOE7dJOb1DWNS*%4o}z zN?h4T44PDhPIrz4j9W_#U|b`v%TB!T02UD&PKn#{1n>77@+4lwoEFVEcr#u)S$?Et zZ|+au#7p}tYGq-3No(VGLgP_H`qEIdV&?KgQ017S@e3X4E=9`Pq$U>m7sbokq|VV& zn=B;e7pQu1T1*kMHfez7)%~@}B45`hOMKm!EaQ4^|NLYnsnHW>EvfT$Jz3!EMnWUc zIp=+CvN{g#cjBiKApf_uPqsfcCTo-R_`?3vC(k5nkMv|US-Yks>%u&+eyIa3H0WKj z_CxKSHaHJ1zI9N?^PvtC)U}Vaf$^a>s3$xFjr^tl=_~iN#G*X&o+ixucd*tful2TC ztC;)WpD_2oeZ$;;jk&RtPARF7EEDW4ATG-TT(dl!^@QZH>TDz{itD6`EB5+B&;$Km zcK-uv@*@hzv3EbVfeqYUL|S&VFjfG{q4JoF001o5nHSnl=)5rQS!{uD5C(Z9$S2Ce z2!$?k9lPwERCuPCTuem4wi8CJ%-lLE+R>20Y*bvD&N2;+Q~$#71SN_PAp>a`5)6(k zj3@w*7^|pQjM#;U-VeK!W4sjj2Obev(4!*FJhp0PID{M-F9d%$A8kZ9An?JgZuY%+ zZ?mJ)n2t@qLNPN#t7Ri%M+Dr2@Wke({d((iu|6*WSKH}^K`7x>8T&9KIs$m&Av2R@ z(1-=AfYEHqNr4)5Q&2_``#5Uxu1uwtjfU*i*t2~emOV@4IVvMMH|?W6@X6X#q$nAN zB7Jiq8)gVCplb_aoQj;pIz8Os5a<KzPbZX zNab%%mf@b~t7jDOsUi_wLleV0!S`!JgnKG}qKald(kR!0N7S>ox-g$YzOSp^L?+2z+iTdB;Wrht_^d)_Tu))jIu%|FOBs48N%?+Q+(hAP0(l^VwFlP7z|15_R zO zU(IjiYj$M87W^1j2k+8UFQZXx(Pjd@Y4SzwaK5iMP&jE2OD}vQOZmtGrw~1KvVM|WGcdaJP-`H6 zPIPLK>M{+aNve#Kmf57B^NTrN;s-NYwW@58>OTI^aR-tAFGQ}AK2>{A!^(5b))`v$ z*l-Ief-{8r11zBHz)r$T90xu$oMq6tb6=+EX8H#1p zjgr2G`$kqLT!Ff8pv1LQT`F7El8%=8P5+_4ff3}r3>d}==D@wNHut-jpT~{Y&(O#1 zE)_}Xpfrj=H5b_~AR9uuMp#oriUw>1#A*KJe*stOK$GTVVf?Sh-$Rz9_b8cb2^0nu z;uqy#8%g!AjK6?)2fq6a@SS;3mw&5klZLL1f08uzOF)9A6iH)JkIN?&M!tADSwKB_ zAqFOnejS(h@eMd$NERM&6j8rLg<^)NP8NUz@nL7u_<7?)LX20jN&~C>He2PHq#XV8 zXBw>_EXC4S$d!OAfC3VEB{FP43c_Uh#8hR< z@*yrO*c}+HbUQW_52X)LAe^}c0B@oQvu2ZJ*y-oF-#~?($!_(5AUXvqL#4QwZia># zT*NR<<-ElGW;eh(n;lhz?AR(fp6UNMD7$hdD0AWSouX14{jd0JI&W4(0^B=eW|YNcm$-lRB8lb*4ZL;2eKY;Se?N(OU~)Ud2Ev>^GNGl>ZUE?^095 z`}WFd{b0t@GCMW?_>-E5{puUW6`EW3)E9>NQeRq82Jt&|i8j$_&ruY`S2sk*hJJyg zW67`(XY06c025POHK>RFZG4~G;3#U)*N>H%*vO8(0K^1nD2Nji5q&a=@f8VC0yP)P zY*6Jvc0=_ZM7MfkWK{}eIyp!_UZVJ;dLSZRK&-09R?k4Z`e3#$fm#CnX@W8S)e{N{ zU3>_@hXwdtd3nIDPNA_}N~TJ0YQ`T@kehuMKo_XrIlN9*I$EZ*O~ zt3JL~Z{6mbtag{0G>;xDM9mw^P-#6U2Y+6blXC?+9}#%h7zPpKsbl*Lq;L3&_T0?Y zWwCc=EWVI!y+gQ~ujQ?+t?hT3jZ@#XBx#TOv`(hLz&WjF)ttcJNtd$wtgyqjBm30# zJ~dOlEEtiL3=5nQ{h5fhR5I#St6B$^YxtU8|6_jNJjY^HhDNARhSVIR!KXHa|DhW* zqGl8iS@YinL`*$p!AR9(`4RQ5b?@@0%3HS;)_;ZO;qTuS6_EM!zDg^|K6&}G=uWL` gYL)BcXd)`@7O>M;sh&3hMgdYA=E`%{`pUEa17;^3g#Z8m literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/site-packages/click/__pycache__/types.cpython-37.pyc b/backend/venv/lib/python3.7/site-packages/click/__pycache__/types.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d2174f4520664229e57f70331ab6d4c3f8c587be GIT binary patch literal 17506 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 JlAZo5{2!<%G^qdp literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/site-packages/click/__pycache__/utils.cpython-37.pyc b/backend/venv/lib/python3.7/site-packages/click/__pycache__/utils.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..70e234378256fb467fb7b5af2336a28fadf77aac GIT binary patch literal 14119 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 TKGAZUhg(N*&dY9|XdU?<5dAVA literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/site-packages/click/_bashcomplete.py b/backend/venv/lib/python3.7/site-packages/click/_bashcomplete.py new file mode 100644 index 000000000..d9d26d28b --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/click/_bashcomplete.py @@ -0,0 +1,83 @@ +import os +import re +from .utils import echo +from .parser import split_arg_string +from .core import MultiCommand, Option + + +COMPLETION_SCRIPT = ''' +%(complete_func)s() { + COMPREPLY=( $( env COMP_WORDS="${COMP_WORDS[*]}" \\ + COMP_CWORD=$COMP_CWORD \\ + %(autocomplete_var)s=complete $1 ) ) + return 0 +} + +complete -F %(complete_func)s -o default %(script_names)s +''' + +_invalid_ident_char_re = re.compile(r'[^a-zA-Z0-9_]') + + +def get_completion_script(prog_name, complete_var): + cf_name = _invalid_ident_char_re.sub('', prog_name.replace('-', '_')) + return (COMPLETION_SCRIPT % { + 'complete_func': '_%s_completion' % cf_name, + 'script_names': prog_name, + 'autocomplete_var': complete_var, + }).strip() + ';' + + +def resolve_ctx(cli, prog_name, args): + ctx = cli.make_context(prog_name, args, resilient_parsing=True) + while ctx.protected_args + ctx.args and isinstance(ctx.command, MultiCommand): + a = ctx.protected_args + ctx.args + cmd = ctx.command.get_command(ctx, a[0]) + if cmd is None: + return None + ctx = cmd.make_context(a[0], a[1:], parent=ctx, resilient_parsing=True) + return ctx + + +def get_choices(cli, prog_name, args, incomplete): + ctx = resolve_ctx(cli, prog_name, args) + if ctx is None: + return + + choices = [] + if incomplete and not incomplete[:1].isalnum(): + for param in ctx.command.params: + if not isinstance(param, Option): + continue + choices.extend(param.opts) + choices.extend(param.secondary_opts) + elif isinstance(ctx.command, MultiCommand): + choices.extend(ctx.command.list_commands(ctx)) + + for item in choices: + if item.startswith(incomplete): + yield item + + +def do_complete(cli, prog_name): + 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 = '' + + for item in get_choices(cli, prog_name, args, incomplete): + echo(item) + + return True + + +def bashcomplete(cli, prog_name, complete_var, complete_instr): + if complete_instr == 'source': + echo(get_completion_script(prog_name, complete_var)) + return True + elif complete_instr == 'complete': + return do_complete(cli, prog_name) + return False diff --git a/backend/venv/lib/python3.7/site-packages/click/_compat.py b/backend/venv/lib/python3.7/site-packages/click/_compat.py new file mode 100644 index 000000000..2b43412c4 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/click/_compat.py @@ -0,0 +1,648 @@ +import re +import io +import os +import sys +import codecs +from weakref import WeakKeyDictionary + + +PY2 = sys.version_info[0] == 2 +WIN = sys.platform.startswith('win') +DEFAULT_COLUMNS = 80 + + +_ansi_re = re.compile('\033\[((?:\d|;)*)([a-zA-Z])') + + +def get_filesystem_encoding(): + return sys.getfilesystemencoding() or sys.getdefaultencoding() + + +def _make_text_stream(stream, encoding, errors): + if encoding is None: + encoding = get_best_encoding(stream) + if errors is None: + errors = 'replace' + return _NonClosingTextIOWrapper(stream, encoding, errors, + line_buffering=True) + + +def is_ascii_encoding(encoding): + """Checks if a given encoding is ascii.""" + try: + return codecs.lookup(encoding).name == 'ascii' + except LookupError: + return False + + +def get_best_encoding(stream): + """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, encoding, errors, **extra): + self._stream = stream = _FixupStream(stream) + io.TextIOWrapper.__init__(self, stream, encoding, errors, **extra) + + # The io module is a place where the Python 3 text behavior + # was forced upon Python 2, so we need to unbreak + # it to look like Python 2. + if PY2: + def write(self, x): + if isinstance(x, str) or is_bytes(x): + try: + self.flush() + except Exception: + pass + return self.buffer.write(str(x)) + return io.TextIOWrapper.write(self, x) + + def writelines(self, lines): + for line in lines: + self.write(line) + + def __del__(self): + try: + self.detach() + except Exception: + pass + + def isatty(self): + # https://bitbucket.org/pypy/pypy/issue/1803 + return self._stream.isatty() + + +class _FixupStream(object): + """The new io interface needs more from streams than streams + traditionally implement. As such, this fix-up code is necessary in + some circumstances. + """ + + def __init__(self, stream): + self._stream = stream + + def __getattr__(self, name): + return getattr(self._stream, name) + + def read1(self, size): + f = getattr(self._stream, 'read1', None) + if f is not None: + return f(size) + # We only dispatch to readline instead of read in Python 2 as we + # do not want cause problems with the different implementation + # of line buffering. + if PY2: + return self._stream.readline(size) + return self._stream.read(size) + + def readable(self): + x = getattr(self._stream, 'readable', None) + if x is not None: + return x() + try: + self._stream.read(0) + except Exception: + return False + return True + + def writable(self): + x = getattr(self._stream, 'writable', None) + if x is not None: + return x() + try: + self._stream.write('') + except Exception: + try: + self._stream.write(b'') + except Exception: + return False + return True + + def seekable(self): + x = getattr(self._stream, 'seekable', None) + if x is not None: + return x() + try: + self._stream.seek(self._stream.tell()) + except Exception: + return False + return True + + +if PY2: + text_type = unicode + bytes = str + raw_input = raw_input + string_types = (str, unicode) + iteritems = lambda x: x.iteritems() + range_type = xrange + + def is_bytes(x): + return isinstance(x, (buffer, bytearray)) + + _identifier_re = re.compile(r'^[a-zA-Z_][a-zA-Z0-9_]*$') + + # For Windows, we need to force stdout/stdin/stderr to binary if it's + # fetched for that. This obviously is not the most correct way to do + # it as it changes global state. Unfortunately, there does not seem to + # be a clear better way to do it as just reopening the file in binary + # mode does not change anything. + # + # An option would be to do what Python 3 does and to open the file as + # binary only, patch it back to the system, and then use a wrapper + # stream that converts newlines. It's not quite clear what's the + # correct option here. + # + # This code also lives in _winconsole for the fallback to the console + # emulation stream. + # + # There are also Windows environments where the `msvcrt` module is not + # available (which is why we use try-catch instead of the WIN variable + # here), such as the Google App Engine development server on Windows. In + # those cases there is just nothing we can do. + try: + import msvcrt + except ImportError: + set_binary_mode = lambda x: x + else: + def set_binary_mode(f): + try: + fileno = f.fileno() + except Exception: + pass + else: + msvcrt.setmode(fileno, os.O_BINARY) + return f + + def isidentifier(x): + return _identifier_re.search(x) is not None + + def get_binary_stdin(): + return set_binary_mode(sys.stdin) + + def get_binary_stdout(): + return set_binary_mode(sys.stdout) + + def get_binary_stderr(): + return set_binary_mode(sys.stderr) + + def get_text_stdin(encoding=None, errors=None): + rv = _get_windows_console_stream(sys.stdin, encoding, errors) + if rv is not None: + return rv + return _make_text_stream(sys.stdin, encoding, errors) + + def get_text_stdout(encoding=None, errors=None): + rv = _get_windows_console_stream(sys.stdout, encoding, errors) + if rv is not None: + return rv + return _make_text_stream(sys.stdout, encoding, errors) + + def get_text_stderr(encoding=None, errors=None): + rv = _get_windows_console_stream(sys.stderr, encoding, errors) + if rv is not None: + return rv + return _make_text_stream(sys.stderr, encoding, errors) + + def filename_to_ui(value): + if isinstance(value, bytes): + value = value.decode(get_filesystem_encoding(), 'replace') + return value +else: + import io + text_type = str + raw_input = input + string_types = (str,) + range_type = range + isidentifier = lambda x: x.isidentifier() + iteritems = lambda x: iter(x.items()) + + def is_bytes(x): + return isinstance(x, (bytes, memoryview, bytearray)) + + def _is_binary_reader(stream, default=False): + 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, default=False): + try: + stream.write(b'') + except Exception: + try: + stream.write('') + return False + except Exception: + pass + return default + return True + + def _find_binary_reader(stream): + # 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 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 buf + + def _find_binary_writer(stream): + # We need to figure out if the given stream is already binary. + # This can happen because the official docs recommend detatching + # 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 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 buf + + def _stream_is_misconfigured(stream): + """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_compatible_text_stream(stream, encoding, errors): + stream_encoding = getattr(stream, 'encoding', None) + stream_errors = getattr(stream, 'errors', None) + + # Perfect match. + if stream_encoding == encoding and stream_errors == errors: + return True + + # Otherwise, it's only a compatible stream if we did not ask for + # an encoding. + if encoding is None: + return stream_encoding is not None + + return False + + def _force_correct_text_reader(text_reader, encoding, errors): + if _is_binary_reader(text_reader, False): + binary_reader = text_reader + else: + # If there is no target encoding set, we need to verify that the + # reader is not actually misconfigured. + if encoding is None and not _stream_is_misconfigured(text_reader): + return text_reader + + if _is_compatible_text_stream(text_reader, encoding, errors): + return text_reader + + # If the reader has no encoding, we try to find the underlying + # binary reader for it. If that fails because the environment is + # misconfigured, we silently go with the same reader because this + # is too common to happen. In that case, mojibake is better than + # exceptions. + binary_reader = _find_binary_reader(text_reader) + if binary_reader is None: + return text_reader + + # At this point, we default the errors to replace instead of strict + # because nobody handles those errors anyways and at this point + # we're so fundamentally fucked that nothing can repair it. + if errors is None: + errors = 'replace' + return _make_text_stream(binary_reader, encoding, errors) + + def _force_correct_text_writer(text_writer, encoding, errors): + if _is_binary_writer(text_writer, False): + binary_writer = text_writer + else: + # If there is no target encoding set, we need to verify that the + # writer is not actually misconfigured. + if encoding is None and not _stream_is_misconfigured(text_writer): + return text_writer + + if _is_compatible_text_stream(text_writer, encoding, errors): + return text_writer + + # If the writer has no encoding, we try to find the underlying + # binary writer for it. If that fails because the environment is + # misconfigured, we silently go with the same writer because this + # is too common to happen. In that case, mojibake is better than + # exceptions. + binary_writer = _find_binary_writer(text_writer) + if binary_writer is None: + return text_writer + + # At this point, we default the errors to replace instead of strict + # because nobody handles those errors anyways and at this point + # we're so fundamentally fucked that nothing can repair it. + if errors is None: + errors = 'replace' + return _make_text_stream(binary_writer, encoding, errors) + + def get_binary_stdin(): + 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(): + 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(): + 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=None, errors=None): + 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) + + def get_text_stdout(encoding=None, errors=None): + 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) + + def get_text_stderr(encoding=None, errors=None): + 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) + + def filename_to_ui(value): + if isinstance(value, bytes): + value = value.decode(get_filesystem_encoding(), 'replace') + else: + value = value.encode('utf-8', 'surrogateescape') \ + .decode('utf-8', 'replace') + return value + + +def get_streerror(e, default=None): + if hasattr(e, 'strerror'): + msg = e.strerror + else: + if default is not None: + msg = default + else: + msg = str(e) + if isinstance(msg, bytes): + msg = msg.decode('utf-8', 'replace') + return msg + + +def open_stream(filename, mode='r', encoding=None, errors='strict', + atomic=False): + # Standard streams first. These are simple because they don't need + # special handling for the atomic flag. It's entirely ignored. + if filename == '-': + if 'w' in mode: + if 'b' in mode: + return get_binary_stdout(), False + return get_text_stdout(encoding=encoding, errors=errors), False + if 'b' in mode: + 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: + if encoding is None: + return open(filename, mode), True + return io.open(filename, mode, encoding=encoding, errors=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 tempfile + fd, tmp_filename = tempfile.mkstemp(dir=os.path.dirname(filename), + prefix='.__atomic-write') + + if encoding is not None: + f = io.open(fd, mode, encoding=encoding, errors=errors) + else: + f = os.fdopen(fd, mode) + + return _AtomicFile(f, tmp_filename, filename), True + + +# Used in a destructor call, needs extra protection from interpreter cleanup. +if hasattr(os, 'replace'): + _replace = os.replace + _can_replace = True +else: + _replace = os.rename + _can_replace = not WIN + + +class _AtomicFile(object): + + def __init__(self, f, tmp_filename, real_filename): + self._f = f + self._tmp_filename = tmp_filename + self._real_filename = real_filename + self.closed = False + + @property + def name(self): + return self._real_filename + + def close(self, delete=False): + if self.closed: + return + self._f.close() + if not _can_replace: + try: + os.remove(self._real_filename) + except OSError: + pass + _replace(self._tmp_filename, self._real_filename) + self.closed = True + + def __getattr__(self, name): + return getattr(self._f, name) + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_value, tb): + self.close(delete=exc_type is not None) + + def __repr__(self): + return repr(self._f) + + +auto_wrap_for_ansi = None +colorama = None +get_winterm_size = None + + +def strip_ansi(value): + return _ansi_re.sub('', value) + + +def should_strip_ansi(stream=None, color=None): + if color is None: + if stream is None: + stream = sys.stdin + return not isatty(stream) + return not color + + +# If we're on Windows, we provide transparent integration through +# colorama. This will make ANSI colors through the echo function +# work automatically. +if WIN: + # Windows has a smaller terminal + DEFAULT_COLUMNS = 79 + + from ._winconsole import _get_windows_console_stream + + def _get_argv_encoding(): + import locale + return locale.getpreferredencoding() + + if PY2: + def raw_input(prompt=''): + sys.stderr.flush() + if prompt: + stdout = _default_text_stdout() + stdout.write(prompt) + stdin = _default_text_stdin() + return stdin.readline().rstrip('\r\n') + + try: + import colorama + except ImportError: + pass + else: + _ansi_stream_wrappers = WeakKeyDictionary() + + def auto_wrap_for_ansi(stream, color=None): + """This function wraps a stream so that calls through colorama + are issued to the win32 console API to recolor on demand. It + also ensures to reset the colors if a write call is interrupted + to not destroy the console afterwards. + """ + try: + cached = _ansi_stream_wrappers.get(stream) + except Exception: + cached = None + if cached is not None: + return cached + strip = should_strip_ansi(stream, color) + ansi_wrapper = colorama.AnsiToWin32(stream, strip=strip) + rv = ansi_wrapper.stream + _write = rv.write + + def _safe_write(s): + try: + return _write(s) + except: + ansi_wrapper.reset_all() + raise + + rv.write = _safe_write + try: + _ansi_stream_wrappers[stream] = rv + except Exception: + pass + return rv + + def get_winterm_size(): + win = colorama.win32.GetConsoleScreenBufferInfo( + colorama.win32.STDOUT).srWindow + return win.Right - win.Left, win.Bottom - win.Top +else: + def _get_argv_encoding(): + return getattr(sys.stdin, 'encoding', None) or get_filesystem_encoding() + + _get_windows_console_stream = lambda *x: None + + +def term_len(x): + return len(strip_ansi(x)) + + +def isatty(stream): + try: + return stream.isatty() + except Exception: + return False + + +def _make_cached_stream_func(src_func, wrapper_func): + cache = WeakKeyDictionary() + def func(): + 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 = { + 'stdin': get_binary_stdin, + 'stdout': get_binary_stdout, + 'stderr': get_binary_stderr, +} + +text_streams = { + 'stdin': get_text_stdin, + 'stdout': get_text_stdout, + 'stderr': get_text_stderr, +} diff --git a/backend/venv/lib/python3.7/site-packages/click/_termui_impl.py b/backend/venv/lib/python3.7/site-packages/click/_termui_impl.py new file mode 100644 index 000000000..7cfd3d5c4 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/click/_termui_impl.py @@ -0,0 +1,547 @@ +""" + click._termui_impl + ~~~~~~~~~~~~~~~~~~ + + 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. + + :copyright: (c) 2014 by Armin Ronacher. + :license: BSD, see LICENSE for more details. +""" +import os +import sys +import time +import math +from ._compat import _default_text_stdout, range_type, PY2, isatty, \ + open_stream, strip_ansi, term_len, get_best_encoding, WIN +from .utils import echo +from .exceptions import ClickException + + +if os.name == 'nt': + BEFORE_BAR = '\r' + AFTER_BAR = '\n' +else: + BEFORE_BAR = '\r\033[?25l' + AFTER_BAR = '\033[?25h\n' + + +def _length_hint(obj): + """Returns the length hint of an object.""" + try: + return len(obj) + except (AttributeError, TypeError): + try: + get_hint = type(obj).__length_hint__ + except AttributeError: + return None + try: + hint = get_hint(obj) + except TypeError: + return None + if hint is NotImplemented or \ + not isinstance(hint, (int, long)) or \ + hint < 0: + return None + return hint + + +class ProgressBar(object): + + def __init__(self, iterable, length=None, fill_char='#', empty_char=' ', + bar_template='%(bar)s', info_sep=' ', show_eta=True, + show_percent=None, show_pos=False, item_show_func=None, + label=None, file=None, color=None, width=30): + 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.width = width + self.autowidth = width == 0 + + if length is None: + length = _length_hint(iterable) + if iterable is None: + if length is None: + raise TypeError('iterable or length is required') + iterable = range_type(length) + self.iter = iter(iterable) + self.length = length + self.length_known = length is not None + self.pos = 0 + self.avg = [] + self.start = self.last_eta = time.time() + self.eta_known = False + self.finished = False + self.max_width = None + self.entered = False + self.current_item = None + self.is_hidden = not isatty(self.file) + self._last_line = None + + def __enter__(self): + self.entered = True + self.render_progress() + return self + + def __exit__(self, exc_type, exc_value, tb): + self.render_finish() + + def __iter__(self): + if not self.entered: + raise RuntimeError('You need to use progress bars in a with block.') + self.render_progress() + return self + + def render_finish(self): + if self.is_hidden: + return + self.file.write(AFTER_BAR) + self.file.flush() + + @property + def pct(self): + if self.finished: + return 1.0 + return min(self.pos / (float(self.length) or 1), 1.0) + + @property + def time_per_iteration(self): + if not self.avg: + return 0.0 + return sum(self.avg) / float(len(self.avg)) + + @property + def eta(self): + if self.length_known and not self.finished: + return self.time_per_iteration * (self.length - self.pos) + return 0.0 + + def format_eta(self): + if self.eta_known: + t = self.eta + 1 + seconds = t % 60 + t /= 60 + minutes = t % 60 + t /= 60 + hours = t % 24 + t /= 24 + if t > 0: + days = t + return '%dd %02d:%02d:%02d' % (days, hours, minutes, seconds) + else: + return '%02d:%02d:%02d' % (hours, minutes, seconds) + return '' + + def format_pos(self): + pos = str(self.pos) + if self.length_known: + pos += '/%s' % self.length + return pos + + def format_pct(self): + return ('% 4d%%' % int(self.pct * 100))[1:] + + def format_progress_line(self): + show_percent = self.show_percent + + info_bits = [] + if self.length_known: + bar_length = int(self.pct * self.width) + bar = self.fill_char * bar_length + bar += self.empty_char * (self.width - bar_length) + if show_percent is None: + show_percent = not self.show_pos + else: + if self.finished: + bar = self.fill_char * self.width + else: + bar = list(self.empty_char * (self.width or 1)) + if self.time_per_iteration != 0: + bar[int((math.cos(self.pos * self.time_per_iteration) + / 2.0 + 0.5) * self.width)] = self.fill_char + bar = ''.join(bar) + + 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': bar, + 'info': self.info_sep.join(info_bits) + }).rstrip() + + def render_progress(self): + from .termui import get_terminal_size + nl = False + + if self.is_hidden: + buf = [self.label] + nl = True + else: + 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, get_terminal_size()[0] - clutter_length) + if new_width < old_width: + buf.append(BEFORE_BAR) + buf.append(' ' * self.max_width) + 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=nl) + self.file.flush() + + def make_step(self, n_steps): + self.pos += n_steps + if self.length_known and self.pos >= self.length: + self.finished = True + + if (time.time() - self.last_eta) < 1.0: + return + + self.last_eta = time.time() + self.avg = self.avg[-6:] + [-(self.start - time.time()) / (self.pos)] + + self.eta_known = self.length_known + + def update(self, n_steps): + self.make_step(n_steps) + self.render_progress() + + def finish(self): + self.eta_known = 0 + self.current_item = None + self.finished = True + + def next(self): + if self.is_hidden: + return next(self.iter) + try: + rv = next(self.iter) + self.current_item = rv + except StopIteration: + self.finish() + self.render_progress() + raise StopIteration() + else: + self.update(1) + return rv + + if not PY2: + __next__ = next + del next + + +def pager(text, color=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, text, color) + pager_cmd = (os.environ.get('PAGER', None) or '').strip() + if pager_cmd: + if WIN: + return _tempfilepager(text, pager_cmd, color) + return _pipepager(text, pager_cmd, color) + if os.environ.get('TERM') in ('dumb', 'emacs'): + return _nullpager(stdout, text, color) + if WIN or sys.platform.startswith('os2'): + return _tempfilepager(text, 'more <', color) + if hasattr(os, 'system') and os.system('(less) 2>/dev/null') == 0: + return _pipepager(text, 'less', color) + + import tempfile + fd, filename = tempfile.mkstemp() + os.close(fd) + try: + if hasattr(os, 'system') and os.system('more "%s"' % filename) == 0: + return _pipepager(text, 'more', color) + return _nullpager(stdout, text, color) + finally: + os.unlink(filename) + + +def _pipepager(text, cmd, color): + """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 = 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 + + if not color: + text = strip_ansi(text) + + c = subprocess.Popen(cmd, shell=True, stdin=subprocess.PIPE, + env=env) + encoding = get_best_encoding(c.stdin) + try: + c.stdin.write(text.encode(encoding, 'replace')) + c.stdin.close() + except (IOError, KeyboardInterrupt): + pass + + # 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(text, cmd, color): + """Page through text by invoking a program on a temporary file.""" + import tempfile + filename = tempfile.mktemp() + 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(cmd + ' "' + filename + '"') + finally: + os.unlink(filename) + + +def _nullpager(stream, text, color): + """Simply print unformatted text. This is the ultimate fallback.""" + if not color: + text = strip_ansi(text) + stream.write(text) + + +class Editor(object): + + def __init__(self, editor=None, env=None, require_save=True, + extension='.txt'): + self.editor = editor + self.env = env + self.require_save = require_save + self.extension = extension + + def get_editor(self): + 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 'vim', 'nano': + if os.system('which %s >/dev/null 2>&1' % editor) == 0: + return editor + return 'vi' + + def edit_file(self, filename): + import subprocess + editor = self.get_editor() + if self.env: + environ = os.environ.copy() + environ.update(self.env) + else: + environ = None + try: + c = subprocess.Popen('%s "%s"' % (editor, filename), + env=environ, shell=True) + exit_code = c.wait() + if exit_code != 0: + raise ClickException('%s: Editing failed!' % editor) + except OSError as e: + raise ClickException('%s: Editing failed: %s' % (editor, e)) + + def edit(self, text): + import tempfile + + text = text or '' + if text and not text.endswith('\n'): + text += '\n' + + fd, name = tempfile.mkstemp(prefix='editor-', suffix=self.extension) + try: + if WIN: + encoding = 'utf-8-sig' + text = text.replace('\n', '\r\n') + else: + encoding = 'utf-8' + text = text.encode(encoding) + + f = os.fdopen(fd, 'wb') + f.write(text) + f.close() + timestamp = os.path.getmtime(name) + + self.edit_file(name) + + if self.require_save \ + and os.path.getmtime(name) == timestamp: + return None + + f = open(name, 'rb') + try: + rv = f.read() + finally: + f.close() + return rv.decode('utf-8-sig').replace('\r\n', '\n') + finally: + os.unlink(name) + + +def open_url(url, wait=False, locate=False): + import subprocess + + def _unquote_file(url): + try: + import urllib + except ImportError: + import urllib + if url.startswith('file://'): + url = urllib.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) + args = 'explorer /select,"%s"' % _unquote_file( + url.replace('"', '')) + else: + args = 'start %s "" "%s"' % ( + wait and '/WAIT' or '', url.replace('"', '')) + 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): + if ch == '\x03': + raise KeyboardInterrupt() + if ch == '\x04': + raise EOFError() + + +if WIN: + import msvcrt + + def getchar(echo): + rv = msvcrt.getch() + if echo: + msvcrt.putchar(rv) + _translate_ch_to_exc(rv) + if PY2: + enc = getattr(sys.stdin, 'encoding', None) + if enc is not None: + rv = rv.decode(enc, 'replace') + else: + rv = rv.decode('cp1252', 'replace') + return rv +else: + import tty + import termios + + def getchar(echo): + 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) + ch = os.read(fd, 32) + if echo and isatty(sys.stdout): + sys.stdout.write(ch) + finally: + termios.tcsetattr(fd, termios.TCSADRAIN, old_settings) + sys.stdout.flush() + if f is not None: + f.close() + except termios.error: + pass + _translate_ch_to_exc(ch) + return ch.decode(get_best_encoding(sys.stdin), 'replace') diff --git a/backend/venv/lib/python3.7/site-packages/click/_textwrap.py b/backend/venv/lib/python3.7/site-packages/click/_textwrap.py new file mode 100644 index 000000000..7e776031e --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/click/_textwrap.py @@ -0,0 +1,38 @@ +import textwrap +from contextlib import contextmanager + + +class TextWrapper(textwrap.TextWrapper): + + def _handle_long_word(self, reversed_chunks, cur_line, cur_len, width): + 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): + 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): + rv = [] + for idx, line in enumerate(text.splitlines()): + indent = self.initial_indent + if idx > 0: + indent = self.subsequent_indent + rv.append(indent + line) + return '\n'.join(rv) diff --git a/backend/venv/lib/python3.7/site-packages/click/_unicodefun.py b/backend/venv/lib/python3.7/site-packages/click/_unicodefun.py new file mode 100644 index 000000000..9e17a384e --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/click/_unicodefun.py @@ -0,0 +1,118 @@ +import os +import sys +import codecs + +from ._compat import PY2 + + +# If someone wants to vendor click, we want to ensure the +# correct package is discovered. Ideally we could use a +# relative import here but unfortunately Python does not +# support that. +click = sys.modules[__name__.rsplit('.', 1)[0]] + + +def _find_unicode_literals_frame(): + import __future__ + frm = sys._getframe(1) + idx = 1 + while frm is not None: + if frm.f_globals.get('__name__', '').startswith('click.'): + frm = frm.f_back + idx += 1 + elif frm.f_code.co_flags & __future__.unicode_literals.compiler_flag: + return idx + else: + break + return 0 + + +def _check_for_unicode_literals(): + if not __debug__: + return + if not PY2 or click.disable_unicode_literals_warning: + return + bad_frame = _find_unicode_literals_frame() + if bad_frame <= 0: + return + from warnings import warn + warn(Warning('Click detected the use of the unicode_literals ' + '__future__ import. This is heavily discouraged ' + 'because it can introduce subtle bugs in your ' + 'code. You should instead use explicit u"" literals ' + 'for your unicode strings. For more information see ' + 'http://click.pocoo.org/python3/'), + stacklevel=bad_frame) + + +def _verify_python3_env(): + """Ensures that the environment is good for unicode on Python 3.""" + if PY2: + return + try: + import locale + fs_enc = codecs.lookup(locale.getpreferredencoding()).name + except Exception: + fs_enc = 'ascii' + if fs_enc != 'ascii': + return + + extra = '' + if os.name == 'posix': + import subprocess + rv = subprocess.Popen(['locale', '-a'], stdout=subprocess.PIPE, + stderr=subprocess.PIPE).communicate()[0] + good_locales = set() + has_c_utf8 = False + + # Make sure we're operating on text here. + if isinstance(rv, bytes): + rv = rv.decode('ascii', 'replace') + + 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 + + extra += '\n\n' + if not good_locales: + extra += ( + 'Additional information: on this system no suitable UTF-8\n' + 'locales were discovered. This most likely requires resolving\n' + 'by reconfiguring the locale system.' + ) + elif has_c_utf8: + extra += ( + 'This system supports the C.UTF-8 locale which is recommended.\n' + 'You might be able to resolve your issue by exporting the\n' + 'following environment variables:\n\n' + ' export LC_ALL=C.UTF-8\n' + ' export LANG=C.UTF-8' + ) + else: + extra += ( + 'This system lists a couple of UTF-8 supporting locales that\n' + 'you can pick from. The following suitable locales where\n' + 'discovered: %s' + ) % ', '.join(sorted(good_locales)) + + bad_locale = None + for locale in os.environ.get('LC_ALL'), os.environ.get('LANG'): + if locale and locale.lower().endswith(('.utf-8', '.utf8')): + bad_locale = locale + if locale is not None: + break + if bad_locale is not None: + extra += ( + '\n\nClick discovered that you exported a UTF-8 locale\n' + 'but the locale system could not pick up from it because\n' + 'it does not exist. The exported locale is "%s" but it\n' + 'is not supported' + ) % bad_locale + + raise RuntimeError('Click will abort further execution because Python 3 ' + 'was configured to use ASCII as encoding for the ' + 'environment. Consult http://click.pocoo.org/python3/' + 'for mitigation steps.' + extra) diff --git a/backend/venv/lib/python3.7/site-packages/click/_winconsole.py b/backend/venv/lib/python3.7/site-packages/click/_winconsole.py new file mode 100644 index 000000000..9aed94216 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/click/_winconsole.py @@ -0,0 +1,273 @@ +# -*- coding: utf-8 -*- +# 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 prmopt. + +import io +import os +import sys +import zlib +import time +import ctypes +import msvcrt +from click._compat import _NonClosingTextIOWrapper, text_type, PY2 +from ctypes import byref, POINTER, c_int, c_char, c_char_p, \ + c_void_p, py_object, c_ssize_t, c_ulong, windll, WINFUNCTYPE +try: + from ctypes import pythonapi + PyObject_GetBuffer = pythonapi.PyObject_GetBuffer + PyBuffer_Release = pythonapi.PyBuffer_Release +except ImportError: + pythonapi = None +from ctypes.wintypes import LPWSTR, LPCWSTR + + +c_ssize_p = POINTER(c_ssize_t) + +kernel32 = windll.kernel32 +GetStdHandle = kernel32.GetStdHandle +ReadConsoleW = kernel32.ReadConsoleW +WriteConsoleW = kernel32.WriteConsoleW +GetLastError = kernel32.GetLastError +GetCommandLineW = WINFUNCTYPE(LPWSTR)( + ('GetCommandLineW', windll.kernel32)) +CommandLineToArgvW = WINFUNCTYPE( + POINTER(LPWSTR), LPCWSTR, POINTER(c_int))( + ('CommandLineToArgvW', windll.shell32)) + + +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 + + +class Py_buffer(ctypes.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) + ] + + if PY2: + _fields_.insert(-1, ('smalltable', c_ssize_t * 2)) + + +# On PyPy we cannot get buffers so our ability to operate here is +# serverly limited. +if pythonapi is None: + get_buffer = None +else: + 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): + io.RawIOBase.isatty(self) + 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(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('Windows error: %s' % 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 'Windows error %s' % 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(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(object): + + def __init__(self, text_stream, byte_stream): + self._text_stream = text_stream + self.buffer = byte_stream + + @property + def name(self): + return self.buffer.name + + def write(self, x): + if isinstance(x, text_type): + return self._text_stream.write(x) + try: + self.flush() + except Exception: + pass + return self.buffer.write(x) + + def writelines(self, lines): + for line in lines: + self.write(line) + + def __getattr__(self, name): + return getattr(self._text_stream, name) + + def isatty(self): + return self.buffer.isatty() + + def __repr__(self): + return '' % ( + self.name, + self.encoding, + ) + + +def _get_text_stdin(buffer_stream): + text_stream = _NonClosingTextIOWrapper( + io.BufferedReader(_WindowsConsoleReader(STDIN_HANDLE)), + 'utf-16-le', 'strict', line_buffering=True) + return ConsoleStream(text_stream, buffer_stream) + + +def _get_text_stdout(buffer_stream): + text_stream = _NonClosingTextIOWrapper( + _WindowsConsoleWriter(STDOUT_HANDLE), + 'utf-16-le', 'strict', line_buffering=True) + return ConsoleStream(text_stream, buffer_stream) + + +def _get_text_stderr(buffer_stream): + text_stream = _NonClosingTextIOWrapper( + _WindowsConsoleWriter(STDERR_HANDLE), + 'utf-16-le', 'strict', line_buffering=True) + return ConsoleStream(text_stream, buffer_stream) + + +if PY2: + def _hash_py_argv(): + return zlib.crc32('\x00'.join(sys.argv[1:])) + + _initial_argv_hash = _hash_py_argv() + + def _get_windows_argv(): + argc = c_int(0) + argv_unicode = CommandLineToArgvW(GetCommandLineW(), byref(argc)) + argv = [argv_unicode[i] for i in range(0, argc.value)] + + if not hasattr(sys, 'frozen'): + argv = argv[1:] + while len(argv) > 0: + arg = argv[0] + if not arg.startswith('-') or arg == '-': + break + argv = argv[1:] + if arg.startswith(('-c', '-m')): + break + + return argv[1:] + + +_stream_factories = { + 0: _get_text_stdin, + 1: _get_text_stdout, + 2: _get_text_stderr, +} + + +def _get_windows_console_stream(f, encoding, errors): + if get_buffer is not None and \ + encoding in ('utf-16-le', None) \ + and errors in ('strict', None) and \ + hasattr(f, 'isatty') and f.isatty(): + func = _stream_factories.get(f.fileno()) + if func is not None: + if not PY2: + f = getattr(f, 'buffer') + if f is None: + return None + else: + # If we are on Python 2 we need to set the stream that we + # deal with to binary mode as otherwise the exercise if a + # bit moot. The same problems apply as for + # get_binary_stdin and friends from _compat. + msvcrt.setmode(f.fileno(), os.O_BINARY) + return func(f) diff --git a/backend/venv/lib/python3.7/site-packages/click/core.py b/backend/venv/lib/python3.7/site-packages/click/core.py new file mode 100644 index 000000000..745645147 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/click/core.py @@ -0,0 +1,1744 @@ +import errno +import os +import sys +from contextlib import contextmanager +from itertools import repeat +from functools import update_wrapper + +from .types import convert_type, IntRange, BOOL +from .utils import make_str, make_default_short_help, echo, get_os_args +from .exceptions import ClickException, UsageError, BadParameter, Abort, \ + MissingParameter +from .termui import prompt, confirm +from .formatting import HelpFormatter, join_options +from .parser import OptionParser, split_opt +from .globals import push_context, pop_context + +from ._compat import PY2, isidentifier, iteritems +from ._unicodefun import _check_for_unicode_literals, _verify_python3_env + + +_missing = object() + + +SUBCOMMAND_METAVAR = 'COMMAND [ARGS]...' +SUBCOMMANDS_METAVAR = 'COMMAND1 [ARGS]... [COMMAND2 [ARGS]...]...' + + +def _bashcomplete(cmd, prog_name, complete_var=None): + """Internal handler for the bash completion support.""" + if complete_var is None: + complete_var = '_%s_COMPLETE' % (prog_name.replace('-', '_')).upper() + complete_instr = os.environ.get(complete_var) + if not complete_instr: + return + + from ._bashcomplete import bashcomplete + if bashcomplete(cmd, prog_name, complete_var, complete_instr): + sys.exit(1) + + +def _check_multicommand(base_command, cmd_name, cmd, register=False): + 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('%s. Command "%s" is set to chain and "%s" was ' + 'added as subcommand but it in itself is a ' + 'multi command. ("%s" is a %s within a chained ' + '%s named "%s"). This restriction was supposed to ' + 'be lifted in 6.0 but the fix was flawed. This ' + 'will be fixed in Click 7.0' % ( + hint, base_command.name, cmd_name, + cmd_name, cmd.__class__.__name__, + base_command.__class__.__name__, + base_command.name)) + + +def batch(iterable, batch_size): + return list(zip(*repeat(iter(iterable), batch_size))) + + +def invoke_param_callback(callback, ctx, param, value): + code = getattr(callback, '__code__', None) + args = getattr(code, 'co_argcount', 3) + + if args < 3: + # This will become a warning in Click 3.0: + from warnings import warn + warn(Warning('Invoked legacy parameter callback "%s". The new ' + 'signature for such callbacks starting with ' + 'click 2.0 is (ctx, param, value).' + % callback), stacklevel=3) + return callback(ctx, value) + return callback(ctx, param, value) + + +@contextmanager +def augment_usage_errors(ctx, param=None): + """Context manager that attaches extra information to exceptions that + fly. + """ + 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, declaration_order): + """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): + try: + idx = invocation_order.index(item) + except ValueError: + idx = float('inf') + return (not item.is_eager, idx) + + return sorted(declaration_order, key=sort_key) + + +class Context(object): + """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. + + .. versionadded:: 2.0 + Added the `resilient_parsing`, `help_option_names`, + `token_normalize_func` parameters. + + .. versionadded:: 3.0 + Added the `allow_extra_args` and `allow_interspersed_args` + parameters. + + .. versionadded:: 4.0 + Added the `color`, `ignore_unknown_options`, and + `max_content_width` parameters. + + :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. 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. + """ + + def __init__(self, command, parent=None, info_name=None, obj=None, + auto_envvar_prefix=None, default_map=None, + terminal_width=None, max_content_width=None, + resilient_parsing=False, allow_extra_args=None, + allow_interspersed_args=None, + ignore_unknown_options=None, help_option_names=None, + token_normalize_func=None, color=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 + #: the parsed parameters except if the value is hidden in which + #: case it's not remembered. + self.params = {} + #: the leftover arguments. + self.args = [] + #: 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 = [] + if obj is None and parent is not None: + obj = parent.obj + #: the user object stored. + self.obj = obj + self._meta = getattr(parent, 'meta', {}) + + #: A dictionary (-like object) with defaults for parameters. + if default_map is None \ + and parent is not None \ + and parent.default_map is not None: + default_map = parent.default_map.get(info_name) + self.default_map = 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:`resultcallback`. + self.invoked_subcommand = 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 = 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 = 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 = 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 = 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 = 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 = token_normalize_func + + #: Indicates if resilient parsing is enabled. In that case Click + #: will do its best to not cause any failures. + self.resilient_parsing = 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 = '%s_%s' % (parent.auto_envvar_prefix, + self.info_name.upper()) + else: + self.auto_envvar_prefix = auto_envvar_prefix.upper() + self.auto_envvar_prefix = 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 = color + + self._close_callbacks = [] + self._depth = 0 + + def __enter__(self): + self._depth += 1 + push_context(self) + return self + + def __exit__(self, exc_type, exc_value, tb): + self._depth -= 1 + if self._depth == 0: + self.close() + pop_context() + + @contextmanager + def scope(self, cleanup=True): + """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): + """This is a dictionary which is shared with all the contexts + that are nested. It exists so that click utiltiies 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 = __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): + """Creates the formatter for the help and usage output.""" + return HelpFormatter(width=self.terminal_width, + max_width=self.max_content_width) + + def call_on_close(self, f): + """This decorator remembers a function as callback that should be + executed when the context tears down. This is most useful to bind + resource handling to the script execution. For instance, file objects + opened by the :class:`File` type will register their close callbacks + here. + + :param f: the function to execute on teardown. + """ + self._close_callbacks.append(f) + return f + + def close(self): + """Invokes all close callbacks.""" + for cb in self._close_callbacks: + cb() + self._close_callbacks = [] + + @property + def command_path(self): + """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: + rv = self.parent.command_path + ' ' + rv + return rv.lstrip() + + def find_root(self): + """Finds the outermost context.""" + node = self + while node.parent is not None: + node = node.parent + return node + + def find_object(self, object_type): + """Finds the closest object of a given type.""" + node = self + while node is not None: + if isinstance(node.obj, object_type): + return node.obj + node = node.parent + + def ensure_object(self, object_type): + """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 + + def lookup_default(self, name): + """Looks up the default for a parameter name. This by default + looks into the :attr:`default_map` if available. + """ + if self.default_map is not None: + rv = self.default_map.get(name) + if callable(rv): + rv = rv() + return rv + + def fail(self, message): + """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): + """Aborts the script.""" + raise Abort() + + def exit(self, code=0): + """Exits the application with a given exit code.""" + sys.exit(code) + + def get_usage(self): + """Helper method to get formatted usage string for the current + context and command. + """ + return self.command.get_usage(self) + + def get_help(self): + """Helper method to get formatted help page for the current + context and command. + """ + return self.command.get_help(self) + + def invoke(*args, **kwargs): + """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`. + """ + self, callback = args[:2] + ctx = self + + # It's also possible to invoke another command which might or + # might not have a callback. In that case we also fill + # in defaults and make a new context for this command. + if isinstance(callback, Command): + other_cmd = callback + callback = other_cmd.callback + ctx = Context(other_cmd, info_name=other_cmd.name, parent=self) + if callback is None: + raise TypeError('The given command does not have a ' + 'callback that can be invoked.') + + for param in other_cmd.params: + if param.name not in kwargs and param.expose_value: + kwargs[param.name] = param.get_default(ctx) + + args = args[2:] + with augment_usage_errors(self): + with ctx: + return callback(*args, **kwargs) + + def forward(*args, **kwargs): + """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. + """ + self, cmd = args[:2] + + # It's also possible to invoke another command which might or + # might not have a callback. + 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, **kwargs) + + +class BaseCommand(object): + """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 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, context_settings=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 = context_settings + + def get_usage(self, ctx): + raise NotImplementedError('Base commands cannot get usage') + + def get_help(self, ctx): + raise NotImplementedError('Base commands cannot get help') + + def make_context(self, info_name, args, parent=None, **extra): + """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. + + :param info_name: the info name for this invokation. 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 script. + :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. + """ + for key, value in iteritems(self.context_settings): + if key not in extra: + extra[key] = value + ctx = Context(self, info_name=info_name, parent=parent, **extra) + with ctx.scope(cleanup=False): + self.parse_args(ctx, args) + return ctx + + def parse_args(self, ctx, args): + """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): + """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 main(self, args=None, prog_name=None, complete_var=None, + standalone_mode=True, **extra): + """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`. + + .. versionadded:: 3.0 + Added the `standalone_mode` flag to control the standalone mode. + + :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 extra: extra keyword arguments are forwarded to the context + constructor. See :class:`Context` for more information. + """ + # If we are in Python 3, we will verify that the environment is + # sane at this point of reject further execution to avoid a + # broken script. + if not PY2: + _verify_python3_env() + else: + _check_for_unicode_literals() + + if args is None: + args = get_os_args() + else: + args = list(args) + + if prog_name is None: + prog_name = make_str(os.path.basename( + sys.argv and sys.argv[0] or __file__)) + + # Hook for the Bash completion. This only activates if the Bash + # completion is actually enabled, otherwise this is quite a fast + # noop. + _bashcomplete(self, 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 + 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 IOError as e: + if e.errno == errno.EPIPE: + sys.exit(1) + else: + raise + except Abort: + if not standalone_mode: + raise + echo('Aborted!', file=sys.stderr) + sys.exit(1) + + def __call__(self, *args, **kwargs): + """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. + + :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. + """ + + def __init__(self, name, context_settings=None, callback=None, + params=None, help=None, epilog=None, short_help=None, + options_metavar='[OPTIONS]', add_help_option=True): + BaseCommand.__init__(self, 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 = params or [] + self.help = help + self.epilog = epilog + self.options_metavar = options_metavar + if short_help is None and help: + short_help = make_default_short_help(help) + self.short_help = short_help + self.add_help_option = add_help_option + + def get_usage(self, ctx): + formatter = ctx.make_formatter() + self.format_usage(ctx, formatter) + return formatter.getvalue().rstrip('\n') + + def get_params(self, ctx): + 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, formatter): + """Writes the usage line into the formatter.""" + pieces = self.collect_usage_pieces(ctx) + formatter.write_usage(ctx.command_path, ' '.join(pieces)) + + def collect_usage_pieces(self, ctx): + """Returns all the pieces that go into the usage line and returns + it as a list of strings. + """ + rv = [self.options_metavar] + for param in self.get_params(ctx): + rv.extend(param.get_usage_pieces(ctx)) + return rv + + def get_help_option_names(self, ctx): + """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 all_names + + def get_help_option(self, ctx): + """Returns the help option object.""" + help_options = self.get_help_option_names(ctx) + if not help_options or not self.add_help_option: + return + + def show_help(ctx, param, value): + 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): + """Creates the underlying option parser for this command.""" + parser = OptionParser(ctx) + parser.allow_interspersed_args = ctx.allow_interspersed_args + parser.ignore_unknown_options = ctx.ignore_unknown_options + for param in self.get_params(ctx): + param.add_to_parser(parser, ctx) + return parser + + def get_help(self, ctx): + """Formats the help into a string and returns it. This creates a + formatter and will call into the following formatting methods: + """ + formatter = ctx.make_formatter() + self.format_help(ctx, formatter) + return formatter.getvalue().rstrip('\n') + + def format_help(self, ctx, formatter): + """Writes the help into the formatter if it exists. + + This calls into 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, formatter): + """Writes the help text to the formatter if it exists.""" + if self.help: + formatter.write_paragraph() + with formatter.indentation(): + formatter.write_text(self.help) + + def format_options(self, ctx, formatter): + """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, formatter): + """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, args): + 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('Got unexpected extra argument%s (%s)' + % (len(args) != 1 and 's' or '', + ' '.join(map(make_str, args)))) + + ctx.args = args + return args + + def invoke(self, ctx): + """Given a context, this invokes the attached callback (if it exists) + in the right way. + """ + if self.callback is not None: + return ctx.invoke(self.callback, **ctx.params) + + +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. + """ + allow_extra_args = True + allow_interspersed_args = False + + def __init__(self, name=None, invoke_without_command=False, + no_args_is_help=None, subcommand_metavar=None, + chain=False, result_callback=None, **attrs): + Command.__init__(self, 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 = SUBCOMMANDS_METAVAR + else: + subcommand_metavar = SUBCOMMAND_METAVAR + self.subcommand_metavar = subcommand_metavar + self.chain = chain + #: The result callback that is stored. This can be set or + #: overridden with the :func:`resultcallback` 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 collect_usage_pieces(self, ctx): + rv = Command.collect_usage_pieces(self, ctx) + rv.append(self.subcommand_metavar) + return rv + + def format_options(self, ctx, formatter): + Command.format_options(self, ctx, formatter) + self.format_commands(ctx, formatter) + + def resultcallback(self, replace=False): + """Adds a result callback to the chain 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.resultcallback() + def process_result(result, input): + return result + input + + .. versionadded:: 3.0 + + :param replace: if set to `True` an already existing result + callback will be removed. + """ + def decorator(f): + old_callback = self.result_callback + if old_callback is None or replace: + self.result_callback = f + return f + def function(__value, *args, **kwargs): + return f(old_callback(__value, *args, **kwargs), + *args, **kwargs) + self.result_callback = rv = update_wrapper(function, f) + return rv + return decorator + + def format_commands(self, ctx, formatter): + """Extra format methods for multi methods that adds all the commands + after the options. + """ + rows = [] + 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 + + help = cmd.short_help or '' + rows.append((subcommand, help)) + + if rows: + with formatter.section('Commands'): + formatter.write_dl(rows) + + def parse_args(self, ctx, args): + if not args and self.no_args_is_help and not ctx.resilient_parsing: + echo(ctx.get_help(), color=ctx.color) + ctx.exit() + + rest = Command.parse_args(self, 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): + def _process_result(value): + if self.result_callback is not None: + value = ctx.invoke(self.result_callback, value, + **ctx.params) + return value + + if not ctx.protected_args: + # If we are invoked without command the chain flag controls + # how this happens. If we are not in chain mode, the return + # value here is the return value of the command. + # If however we are in chain mode, the return value is the + # return value of the result processor invoked with an empty + # list (which means that no subcommand actually was executed). + if self.invoke_without_command: + if not self.chain: + return Command.invoke(self, ctx) + with ctx: + Command.invoke(self, ctx) + return _process_result([]) + 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) + ctx.invoked_subcommand = cmd_name + Command.invoke(self, 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 = args and '*' or None + Command.invoke(self, 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) + 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, args): + 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: + if split_opt(cmd_name)[0]: + self.parse_args(ctx, ctx.args) + ctx.fail('No such command "%s".' % original_cmd_name) + + return cmd_name, cmd, args[1:] + + def get_command(self, ctx, cmd_name): + """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): + """Returns a list of subcommand names in the order they should + appear. + """ + return [] + + +class Group(MultiCommand): + """A group allows a command to have subcommands attached. This is the + most common way to implement nesting in Click. + + :param commands: a dictionary of commands. + """ + + def __init__(self, name=None, commands=None, **attrs): + MultiCommand.__init__(self, name, **attrs) + #: the registered subcommands by their exported names. + self.commands = commands or {} + + def add_command(self, cmd, name=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, **kwargs): + """A shortcut decorator for declaring and attaching a command to + the group. This takes the same arguments as :func:`command` but + immediately registers the created command with this instance by + calling into :meth:`add_command`. + """ + def decorator(f): + cmd = command(*args, **kwargs)(f) + self.add_command(cmd) + return cmd + return decorator + + def group(self, *args, **kwargs): + """A shortcut decorator for declaring and attaching a group to + the group. This takes the same arguments as :func:`group` but + immediately registers the created command with this instance by + calling into :meth:`add_command`. + """ + def decorator(f): + cmd = group(*args, **kwargs)(f) + self.add_command(cmd) + return cmd + return decorator + + def get_command(self, ctx, cmd_name): + return self.commands.get(cmd_name) + + def list_commands(self, ctx): + 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=None, sources=None, **attrs): + MultiCommand.__init__(self, name, **attrs) + #: The list of registered multi commands. + self.sources = sources or [] + + def add_source(self, multi_cmd): + """Adds a new multi command to the chain dispatcher.""" + self.sources.append(multi_cmd) + + def get_command(self, ctx, cmd_name): + 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 + + def list_commands(self, ctx): + rv = set() + for source in self.sources: + rv.update(source.list_commands(ctx)) + return sorted(rv) + + +class Parameter(object): + """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. + + .. versionchanged:: 2.0 + Changed signature for parameter callback to also be passed the + parameter. In Click 2.0, the old callback format will still work, + but it will raise a warning to give you change to migrate the + code easier. + + :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 callback that should be executed after the parameter + was matched. This is called as ``fn(ctx, param, + value)`` and needs to return the value. Before Click + 2.0, the signature was ``(ctx, value)``. + :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). + :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_type_name = 'parameter' + + def __init__(self, param_decls=None, type=None, required=False, + default=None, callback=None, nargs=None, metavar=None, + expose_value=True, is_eager=False, envvar=None): + self.name, self.opts, self.secondary_opts = \ + self._parse_decls(param_decls or (), expose_value) + + self.type = 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 = False + self.expose_value = expose_value + self.default = default + self.is_eager = is_eager + self.metavar = metavar + self.envvar = envvar + + @property + def human_readable_name(self): + """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 + + def make_metavar(self): + 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 + + def get_default(self, ctx): + """Given a context variable this calculates the default value.""" + # Otherwise go with the regular default. + if callable(self.default): + rv = self.default() + else: + rv = self.default + return self.type_cast_value(ctx, rv) + + def add_to_parser(self, parser, ctx): + pass + + def consume_value(self, ctx, opts): + value = opts.get(self.name) + if value is None: + value = ctx.lookup_default(self.name) + if value is None: + value = self.value_from_envvar(ctx) + return value + + def type_cast_value(self, ctx, value): + """Given a value this runs it properly through the type system. + This automatically handles things like `nargs` and `multiple` as + well as composite types. + """ + if self.type.is_composite: + if self.nargs <= 1: + raise TypeError('Attempted to invoke composite type ' + 'but nargs has been set to %s. This is ' + 'not supported; nargs needs to be set to ' + 'a fixed value > 1.' % self.nargs) + if self.multiple: + return tuple(self.type(x or (), self, ctx) for x in value or ()) + return self.type(value or (), self, ctx) + + def _convert(value, level): + if level == 0: + return self.type(value, self, ctx) + return tuple(_convert(x, level - 1) for x in value or ()) + return _convert(value, (self.nargs != 1) + bool(self.multiple)) + + def process_value(self, ctx, value): + """Given a value and context this runs the logic to convert the + value as necessary. + """ + # If the value we were given is None we do nothing. This way + # code that calls this can easily figure out if something was + # not provided. Otherwise it would be converted into an empty + # tuple for multiple invocations which is inconvenient. + if value is not None: + return self.type_cast_value(ctx, value) + + def value_is_missing(self, value): + if value is None: + return True + if (self.nargs != 1 or self.multiple) and value == (): + return True + return False + + def full_process_value(self, ctx, value): + value = self.process_value(ctx, value) + + if value is None: + value = self.get_default(ctx) + + if self.required and self.value_is_missing(value): + raise MissingParameter(ctx=ctx, param=self) + + return value + + def resolve_envvar_value(self, ctx): + if self.envvar is None: + return + if isinstance(self.envvar, (tuple, list)): + for envvar in self.envvar: + rv = os.environ.get(envvar) + if rv is not None: + return rv + else: + return os.environ.get(self.envvar) + + def value_from_envvar(self, ctx): + rv = 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, opts, args): + with augment_usage_errors(ctx, param=self): + value = self.consume_value(ctx, opts) + try: + value = self.full_process_value(ctx, value) + except Exception: + if not ctx.resilient_parsing: + raise + value = None + if self.callback is not None: + try: + value = invoke_param_callback( + self.callback, ctx, self, value) + except Exception: + if not ctx.resilient_parsing: + raise + + if self.expose_value: + ctx.params[self.name] = value + return value, args + + def get_help_record(self, ctx): + pass + + def get_usage_pieces(self, ctx): + return [] + + +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. + :param prompt: if set to `True` or a non empty string then the user will + be prompted for input if not set. If set to `True` the + prompt will be the option name capitalized. + :param confirmation_prompt: if set then the value will need to be confirmed + if it was prompted for. + :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_type_name = 'option' + + def __init__(self, param_decls=None, show_default=False, + prompt=False, confirmation_prompt=False, + hide_input=False, is_flag=None, flag_value=None, + multiple=False, count=False, allow_from_autoenv=True, + type=None, help=None, **attrs): + default_is_missing = attrs.get('default', _missing) is _missing + Parameter.__init__(self, param_decls, type=type, **attrs) + + if prompt is True: + prompt_text = self.name.replace('_', ' ').capitalize() + elif prompt is False: + prompt_text = None + else: + prompt_text = prompt + self.prompt = prompt_text + self.confirmation_prompt = confirmation_prompt + self.hide_input = hide_input + + # Flags + if is_flag is None: + if flag_value is not None: + is_flag = True + else: + is_flag = bool(self.secondary_opts) + if is_flag and default_is_missing: + self.default = False + if flag_value is None: + flag_value = not self.default + self.is_flag = is_flag + self.flag_value = flag_value + if self.is_flag and isinstance(self.flag_value, bool) \ + and type is None: + self.type = BOOL + self.is_bool_flag = True + else: + self.is_bool_flag = False + + # Counting + self.count = count + if count: + if type is None: + self.type = IntRange(min=0) + if default_is_missing: + self.default = 0 + + self.multiple = multiple + self.allow_from_autoenv = allow_from_autoenv + self.help = help + self.show_default = show_default + + # Sanity check for stuff we don't support + if __debug__: + if self.nargs < 0: + raise TypeError('Options cannot have nargs < 0') + if self.prompt and self.is_flag and not self.is_bool_flag: + raise TypeError('Cannot prompt for flags that are not bools.') + if not self.is_bool_flag and self.secondary_opts: + raise TypeError('Got secondary option for non boolean flag.') + if self.is_bool_flag and self.hide_input \ + and self.prompt is not None: + raise TypeError('Hidden input does not work with boolean ' + 'flag prompts.') + if self.count: + if self.multiple: + raise TypeError('Options cannot be multiple and count ' + 'at the same time.') + elif self.is_flag: + raise TypeError('Options cannot be count and flags at ' + 'the same time.') + + def _parse_decls(self, decls, expose_value): + opts = [] + secondary_opts = [] + name = None + possible_names = [] + + for decl in decls: + if isidentifier(decl): + if name is not None: + raise TypeError('Name defined twice') + name = decl + else: + split_char = decl[:1] == '/' and ';' or '/' + 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()) + 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])) + name = possible_names[-1][1].replace('-', '_').lower() + if not isidentifier(name): + 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('No options defined but a name was passed (%s). ' + 'Did you mean to declare an argument instead ' + 'of an option?' % name) + + return name, opts, secondary_opts + + def add_to_parser(self, parser, ctx): + kwargs = { + 'dest': self.name, + 'nargs': self.nargs, + 'obj': self, + } + + if self.multiple: + action = 'append' + elif self.count: + action = 'count' + else: + action = 'store' + + if self.is_flag: + kwargs.pop('nargs', None) + if self.is_bool_flag and self.secondary_opts: + parser.add_option(self.opts, action=action + '_const', + const=True, **kwargs) + parser.add_option(self.secondary_opts, action=action + + '_const', const=False, **kwargs) + else: + parser.add_option(self.opts, action=action + '_const', + const=self.flag_value, + **kwargs) + else: + kwargs['action'] = action + parser.add_option(self.opts, **kwargs) + + def get_help_record(self, ctx): + any_prefix_is_slash = [] + + def _write_opts(opts): + rv, any_slashes = join_options(opts) + if any_slashes: + any_prefix_is_slash[:] = [True] + if not self.is_flag and not self.count: + rv += ' ' + 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.default is not None and self.show_default: + extra.append('default: %s' % ( + ', '.join('%s' % d for d in self.default) + if isinstance(self.default, (list, tuple)) + else self.default, )) + if self.required: + extra.append('required') + if extra: + help = '%s[%s]' % (help and help + ' ' or '', '; '.join(extra)) + + return ((any_prefix_is_slash and '; ' or ' / ').join(rv), help) + + def get_default(self, ctx): + # If we're a non boolean flag out 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 + return None + return Parameter.get_default(self, ctx) + + def prompt_for_value(self, ctx): + """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. + """ + # 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, + hide_input=self.hide_input, + confirmation_prompt=self.confirmation_prompt, + value_proc=lambda x: self.process_value(ctx, x)) + + def resolve_envvar_value(self, ctx): + rv = Parameter.resolve_envvar_value(self, ctx) + if rv is not None: + return rv + if self.allow_from_autoenv and \ + ctx.auto_envvar_prefix is not None: + envvar = '%s_%s' % (ctx.auto_envvar_prefix, self.name.upper()) + return os.environ.get(envvar) + + def value_from_envvar(self, ctx): + rv = self.resolve_envvar_value(ctx) + if rv is None: + return None + value_depth = (self.nargs != 1) + bool(self.multiple) + if value_depth > 0 and rv is not None: + rv = self.type.split_envvar_value(rv) + if self.multiple and self.nargs != 1: + rv = batch(rv, self.nargs) + return rv + + def full_process_value(self, ctx, value): + if value is None and self.prompt is not None \ + and not ctx.resilient_parsing: + return self.prompt_for_value(ctx) + return Parameter.full_process_value(self, ctx, value) + + +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, required=None, **attrs): + if required is None: + if attrs.get('default') is not None: + required = False + else: + required = attrs.get('nargs', 1) > 0 + Parameter.__init__(self, param_decls, required=required, **attrs) + if self.default is not None and self.nargs < 0: + raise TypeError('nargs=-1 in combination with a default value ' + 'is not supported.') + + @property + def human_readable_name(self): + if self.metavar is not None: + return self.metavar + return self.name.upper() + + def make_metavar(self): + if self.metavar is not None: + return self.metavar + var = self.name.upper() + if not self.required: + var = '[%s]' % var + if self.nargs != 1: + var += '...' + return var + + def _parse_decls(self, decls, expose_value): + 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() + elif len(decls) == 2: + name, arg = decls + else: + raise TypeError('Arguments take exactly one or two ' + 'parameter declarations, got %d' % len(decls)) + return name, [arg], [] + + def get_usage_pieces(self, ctx): + return [self.make_metavar()] + + def add_to_parser(self, parser, ctx): + parser.add_argument(dest=self.name, nargs=self.nargs, + obj=self) + + +# Circular dependency between decorators and core +from .decorators import command, group diff --git a/backend/venv/lib/python3.7/site-packages/click/decorators.py b/backend/venv/lib/python3.7/site-packages/click/decorators.py new file mode 100644 index 000000000..989345265 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/click/decorators.py @@ -0,0 +1,304 @@ +import sys +import inspect + +from functools import update_wrapper + +from ._compat import iteritems +from ._unicodefun import _check_for_unicode_literals +from .utils import echo +from .globals import get_current_context + + +def pass_context(f): + """Marks a callback as wanting to receive the current context + object as first argument. + """ + def new_func(*args, **kwargs): + return f(get_current_context(), *args, **kwargs) + return update_wrapper(new_func, f) + + +def pass_obj(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): + return f(get_current_context().obj, *args, **kwargs) + return update_wrapper(new_func, f) + + +def make_pass_decorator(object_type, ensure=False): + """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): + def new_func(*args, **kwargs): + 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 object of type %r existing' + % object_type.__name__) + return ctx.invoke(f, obj, *args[1:], **kwargs) + return update_wrapper(new_func, f) + return decorator + + +def _make_command(f, name, attrs, cls): + if isinstance(f, Command): + raise TypeError('Attempted to convert a callback into a ' + 'command twice.') + try: + params = f.__click_params__ + params.reverse() + del f.__click_params__ + except AttributeError: + params = [] + help = attrs.get('help') + if help is None: + help = inspect.getdoc(f) + if isinstance(help, bytes): + help = help.decode('utf-8') + else: + help = inspect.cleandoc(help) + attrs['help'] = help + _check_for_unicode_literals() + return cls(name=name or f.__name__.lower(), + callback=f, params=params, **attrs) + + +def command(name=None, cls=None, **attrs): + """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. 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. + :param cls: the command class to instantiate. This defaults to + :class:`Command`. + """ + if cls is None: + cls = Command + def decorator(f): + cmd = _make_command(f, name, attrs, cls) + cmd.__doc__ = f.__doc__ + return cmd + return decorator + + +def group(name=None, **attrs): + """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 command(name, **attrs) + + +def _param_memo(f, param): + if isinstance(f, Command): + f.params.append(param) + else: + if not hasattr(f, '__click_params__'): + f.__click_params__ = [] + f.__click_params__.append(param) + + +def argument(*param_decls, **attrs): + """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): + ArgumentClass = attrs.pop('cls', Argument) + _param_memo(f, ArgumentClass(param_decls, **attrs)) + return f + return decorator + + +def option(*param_decls, **attrs): + """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): + if 'help' in attrs: + attrs['help'] = inspect.cleandoc(attrs['help']) + OptionClass = attrs.pop('cls', Option) + _param_memo(f, OptionClass(param_decls, **attrs)) + return f + return decorator + + +def confirmation_option(*param_decls, **attrs): + """Shortcut for confirmation prompts that can be ignored by passing + ``--yes`` as parameter. + + This is equivalent to decorating a function with :func:`option` with + the following parameters:: + + def callback(ctx, param, value): + if not value: + ctx.abort() + + @click.command() + @click.option('--yes', is_flag=True, callback=callback, + expose_value=False, prompt='Do you want to continue?') + def dropdb(): + pass + """ + def decorator(f): + def callback(ctx, param, value): + if not value: + ctx.abort() + attrs.setdefault('is_flag', True) + attrs.setdefault('callback', callback) + attrs.setdefault('expose_value', False) + attrs.setdefault('prompt', 'Do you want to continue?') + attrs.setdefault('help', 'Confirm the action without prompting.') + return option(*(param_decls or ('--yes',)), **attrs)(f) + return decorator + + +def password_option(*param_decls, **attrs): + """Shortcut for password prompts. + + This is equivalent to decorating a function with :func:`option` with + the following parameters:: + + @click.command() + @click.option('--password', prompt=True, confirmation_prompt=True, + hide_input=True) + def changeadmin(password): + pass + """ + def decorator(f): + attrs.setdefault('prompt', True) + attrs.setdefault('confirmation_prompt', True) + attrs.setdefault('hide_input', True) + return option(*(param_decls or ('--password',)), **attrs)(f) + return decorator + + +def version_option(version=None, *param_decls, **attrs): + """Adds a ``--version`` option which immediately ends the program + printing out the version number. This is implemented as an eager + option that prints the version and exits the program in the callback. + + :param version: the version number to show. If not provided Click + attempts an auto discovery via setuptools. + :param prog_name: the name of the program (defaults to autodetection) + :param message: custom message to show instead of the default + (``'%(prog)s, version %(version)s'``) + :param others: everything else is forwarded to :func:`option`. + """ + if version is None: + module = sys._getframe(1).f_globals.get('__name__') + def decorator(f): + prog_name = attrs.pop('prog_name', None) + message = attrs.pop('message', '%(prog)s, version %(version)s') + + def callback(ctx, param, value): + if not value or ctx.resilient_parsing: + return + prog = prog_name + if prog is None: + prog = ctx.find_root().info_name + ver = version + if ver is None: + try: + import pkg_resources + except ImportError: + pass + else: + for dist in pkg_resources.working_set: + scripts = dist.get_entry_map().get('console_scripts') or {} + for script_name, entry_point in iteritems(scripts): + if entry_point.module_name == module: + ver = dist.version + break + if ver is None: + raise RuntimeError('Could not determine version') + echo(message % { + 'prog': prog, + 'version': ver, + }, color=ctx.color) + ctx.exit() + + attrs.setdefault('is_flag', True) + attrs.setdefault('expose_value', False) + attrs.setdefault('is_eager', True) + attrs.setdefault('help', 'Show the version and exit.') + attrs['callback'] = callback + return option(*(param_decls or ('--version',)), **attrs)(f) + return decorator + + +def help_option(*param_decls, **attrs): + """Adds a ``--help`` option which immediately ends the program + printing out the help page. This is usually unnecessary to add as + this is added by default to all commands unless suppressed. + + Like :func:`version_option`, this is implemented as eager option that + prints in the callback and exits. + + All arguments are forwarded to :func:`option`. + """ + def decorator(f): + def callback(ctx, param, value): + if value and not ctx.resilient_parsing: + echo(ctx.get_help(), color=ctx.color) + ctx.exit() + attrs.setdefault('is_flag', True) + attrs.setdefault('expose_value', False) + attrs.setdefault('help', 'Show this message and exit.') + attrs.setdefault('is_eager', True) + attrs['callback'] = callback + return option(*(param_decls or ('--help',)), **attrs)(f) + return decorator + + +# Circular dependencies between core and decorators +from .core import Command, Group, Argument, Option diff --git a/backend/venv/lib/python3.7/site-packages/click/exceptions.py b/backend/venv/lib/python3.7/site-packages/click/exceptions.py new file mode 100644 index 000000000..74a4542bb --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/click/exceptions.py @@ -0,0 +1,201 @@ +from ._compat import PY2, filename_to_ui, get_text_stderr +from .utils import echo + + +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): + if PY2: + if message is not None: + message = message.encode('utf-8') + Exception.__init__(self, message) + self.message = message + + def format_message(self): + return self.message + + def show(self, file=None): + if file is None: + file = get_text_stderr() + echo('Error: %s' % 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, ctx=None): + ClickException.__init__(self, message) + self.ctx = ctx + + def show(self, file=None): + if file is None: + file = get_text_stderr() + color = None + if self.ctx is not None: + color = self.ctx.color + echo(self.ctx.get_usage() + '\n', file=file, color=color) + echo('Error: %s' % 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, ctx=None, param=None, + param_hint=None): + UsageError.__init__(self, message, ctx) + self.param = param + self.param_hint = param_hint + + def format_message(self): + if self.param_hint is not None: + param_hint = self.param_hint + elif self.param is not None: + param_hint = self.param.opts or [self.param.human_readable_name] + else: + return 'Invalid value: %s' % self.message + if isinstance(param_hint, (tuple, list)): + param_hint = ' / '.join('"%s"' % x for x in param_hint) + return 'Invalid value for %s: %s' % (param_hint, 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=None, ctx=None, param=None, + param_hint=None, param_type=None): + BadParameter.__init__(self, message, ctx, param, param_hint) + self.param_type = param_type + + def format_message(self): + if self.param_hint is not None: + param_hint = self.param_hint + elif self.param is not None: + param_hint = self.param.opts or [self.param.human_readable_name] + else: + param_hint = None + if isinstance(param_hint, (tuple, list)): + param_hint = ' / '.join('"%s"' % x for x in param_hint) + + 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 += '. ' + msg_extra + else: + msg = msg_extra + + return 'Missing %s%s%s%s' % ( + param_type, + param_hint and ' %s' % param_hint or '', + msg and '. ' or '.', + msg or '', + ) + + +class NoSuchOption(UsageError): + """Raised if click attempted to handle an option that does not + exist. + + .. versionadded:: 4.0 + """ + + def __init__(self, option_name, message=None, possibilities=None, + ctx=None): + if message is None: + message = 'no such option: %s' % option_name + UsageError.__init__(self, message, ctx) + self.option_name = option_name + self.possibilities = possibilities + + def format_message(self): + bits = [self.message] + if self.possibilities: + if len(self.possibilities) == 1: + bits.append('Did you mean %s?' % self.possibilities[0]) + else: + possibilities = sorted(self.possibilities) + bits.append('(Possible options: %s)' % ', '.join(possibilities)) + return ' '.join(bits) + + +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 + """ + + def __init__(self, message, ctx=None): + UsageError.__init__(self, message, ctx) + + +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 + """ + + def __init__(self, message, ctx=None): + UsageError.__init__(self, message, ctx) + + +class FileError(ClickException): + """Raised if a file cannot be opened.""" + + def __init__(self, filename, hint=None): + ui_filename = filename_to_ui(filename) + if hint is None: + hint = 'unknown error' + ClickException.__init__(self, hint) + self.ui_filename = ui_filename + self.filename = filename + + def format_message(self): + return 'Could not open file %s: %s' % (self.ui_filename, self.message) + + +class Abort(RuntimeError): + """An internal signalling exception that signals Click to abort.""" diff --git a/backend/venv/lib/python3.7/site-packages/click/formatting.py b/backend/venv/lib/python3.7/site-packages/click/formatting.py new file mode 100644 index 000000000..a3d6a4d38 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/click/formatting.py @@ -0,0 +1,256 @@ +from contextlib import contextmanager +from .termui import get_terminal_size +from .parser import split_opt +from ._compat import term_len + + +# Can force a width. This is used by the test system +FORCED_WIDTH = None + + +def measure_table(rows): + widths = {} + 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, col_count): + for row in rows: + row = tuple(row) + yield row + ('',) * (col_count - len(row)) + + +def wrap_text(text, width=78, initial_indent='', subsequent_indent='', + preserve_paragraphs=False): + """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 = [] + buf = [] + indent = None + + def _flush_par(): + 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(object): + """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=2, width=None, max_width=None): + 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(get_terminal_size()[0], max_width) - 2, 50) + self.width = width + self.current_indent = 0 + self.buffer = [] + + def write(self, string): + """Writes a unicode string into the internal buffer.""" + self.buffer.append(string) + + def indent(self): + """Increases the indentation.""" + self.current_indent += self.indent_increment + + def dedent(self): + """Decreases the indentation.""" + self.current_indent -= self.indent_increment + + def write_usage(self, prog, args='', prefix='Usage: '): + """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. + """ + usage_prefix = '%*s%s ' % (self.current_indent, prefix, 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): + """Writes a heading into the buffer.""" + self.write('%*s%s:\n' % (self.current_indent, '', heading)) + + def write_paragraph(self): + """Writes a paragraph into the buffer.""" + if self.buffer: + self.write('\n') + + def write_text(self, text): + """Writes re-indented text into the buffer. This rewraps and + preserves paragraphs. + """ + text_width = max(self.width - self.current_indent, 11) + indent = ' ' * self.current_indent + self.write(wrap_text(text, text_width, + initial_indent=indent, + subsequent_indent=indent, + preserve_paragraphs=True)) + self.write('\n') + + def write_dl(self, rows, col_max=30, col_spacing=2): + """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('%*s%s' % (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) + lines = iter(wrap_text(second, text_width).splitlines()) + if lines: + self.write(next(lines) + '\n') + for line in lines: + self.write('%*s%s\n' % ( + first_col + self.current_indent, '', line)) + else: + self.write('\n') + + @contextmanager + def section(self, name): + """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): + """A context manager that increases the indentation.""" + self.indent() + try: + yield + finally: + self.dedent() + + def getvalue(self): + """Returns the buffer contents.""" + return ''.join(self.buffer) + + +def join_options(options): + """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]) + + rv = ', '.join(x[1] for x in rv) + return rv, any_prefix_is_slash diff --git a/backend/venv/lib/python3.7/site-packages/click/globals.py b/backend/venv/lib/python3.7/site-packages/click/globals.py new file mode 100644 index 000000000..14338e6bb --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/click/globals.py @@ -0,0 +1,48 @@ +from threading import local + + +_local = local() + + +def get_current_context(silent=False): + """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 it's behavior based on the current context. + + To push the current context, :meth:`Context.scope` can be used. + + .. versionadded:: 5.0 + + :param silent: is set to `True` the return value is `None` if no context + is available. The default behavior is to raise a + :exc:`RuntimeError`. + """ + try: + return getattr(_local, 'stack')[-1] + except (AttributeError, IndexError): + if not silent: + raise RuntimeError('There is no active click context.') + + +def push_context(ctx): + """Pushes a new context to the current stack.""" + _local.__dict__.setdefault('stack', []).append(ctx) + + +def pop_context(): + """Removes the top level from the stack.""" + _local.stack.pop() + + +def resolve_color_default(color=None): + """"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 diff --git a/backend/venv/lib/python3.7/site-packages/click/parser.py b/backend/venv/lib/python3.7/site-packages/click/parser.py new file mode 100644 index 000000000..9775c9ff9 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/click/parser.py @@ -0,0 +1,426 @@ +# -*- coding: utf-8 -*- +""" + click.parser + ~~~~~~~~~~~~ + + 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. +""" +import re +from collections import deque +from .exceptions import UsageError, NoSuchOption, BadOptionUsage, \ + BadArgumentUsage + + +def _unpack_args(args, nargs_spec): + """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 = [] + spos = None + + def _fetch(c): + 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 == 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 _error_opt_args(nargs, opt): + if nargs == 1: + raise BadOptionUsage('%s option requires an argument' % opt) + raise BadOptionUsage('%s option requires %d arguments' % (opt, nargs)) + + +def split_opt(opt): + 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, ctx): + if ctx is None or ctx.token_normalize_func is None: + return opt + prefix, opt = split_opt(opt) + return prefix + ctx.token_normalize_func(opt) + + +def split_arg_string(string): + """Given an argument string this attempts to split it into small parts.""" + rv = [] + for match in re.finditer(r"('([^'\\]*(?:\\.[^'\\]*)*)'" + r'|"([^"\\]*(?:\\.[^"\\]*)*)"' + r'|\S+)\s*', string, re.S): + arg = match.group().strip() + if arg[:1] == arg[-1:] and arg[:1] in '"\'': + arg = arg[1:-1].encode('ascii', 'backslashreplace') \ + .decode('unicode-escape') + try: + arg = type(string)(arg) + except UnicodeError: + pass + rv.append(arg) + return rv + + +class Option(object): + + def __init__(self, opts, dest, action=None, nargs=1, const=None, obj=None): + self._short_opts = [] + self._long_opts = [] + self.prefixes = set() + + for opt in opts: + prefix, value = split_opt(opt) + if not prefix: + raise ValueError('Invalid start character for option (%s)' + % 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): + return self.action in ('store', 'append') + + def process(self, value, state): + if self.action == 'store': + state.opts[self.dest] = value + elif self.action == 'store_const': + state.opts[self.dest] = self.const + elif self.action == 'append': + state.opts.setdefault(self.dest, []).append(value) + elif self.action == 'append_const': + state.opts.setdefault(self.dest, []).append(self.const) + elif self.action == 'count': + state.opts[self.dest] = state.opts.get(self.dest, 0) + 1 + else: + raise ValueError('unknown action %r' % self.action) + state.order.append(self.obj) + + +class Argument(object): + + def __init__(self, dest, nargs=1, obj=None): + self.dest = dest + self.nargs = nargs + self.obj = obj + + def process(self, value, state): + if self.nargs > 1: + holes = sum(1 for x in value if x is None) + if holes == len(value): + value = None + elif holes != 0: + raise BadArgumentUsage('argument %s takes %d values' + % (self.dest, self.nargs)) + state.opts[self.dest] = value + state.order.append(self.obj) + + +class ParsingState(object): + + def __init__(self, rargs): + self.opts = {} + self.largs = [] + self.rargs = rargs + self.order = [] + + +class OptionParser(object): + """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=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 = {} + self._long_opt = {} + self._opt_prefixes = set(['-', '--']) + self._args = [] + + def add_option(self, opts, dest, action=None, nargs=1, const=None, + obj=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. + """ + if obj is None: + obj = dest + opts = [normalize_opt(opt, self.ctx) for opt in opts] + option = Option(opts, dest, action=action, nargs=nargs, + const=const, obj=obj) + 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, dest, nargs=1, obj=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. + """ + if obj is None: + obj = dest + self._args.append(Argument(dest=dest, nargs=nargs, obj=obj)) + + def parse_args(self, args): + """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): + 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): + 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, explicit_value, state): + if opt not in self._long_opt: + possibilities = [word for word in self._long_opt + if word.startswith(opt)] + raise NoSuchOption(opt, possibilities=possibilities) + + 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) + + nargs = option.nargs + if len(state.rargs) < nargs: + _error_opt_args(nargs, opt) + elif nargs == 1: + value = state.rargs.pop(0) + else: + value = tuple(state.rargs[:nargs]) + del state.rargs[:nargs] + + elif explicit_value is not None: + raise BadOptionUsage('%s option does not take a value' % opt) + + else: + value = None + + option.process(value, state) + + def _match_short_opt(self, arg, state): + stop = False + i = 1 + prefix = arg[0] + unknown_options = [] + + for ch in arg[1:]: + opt = normalize_opt(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) + 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 + + nargs = option.nargs + if len(state.rargs) < nargs: + _error_opt_args(nargs, opt) + elif nargs == 1: + value = state.rargs.pop(0) + else: + value = tuple(state.rargs[:nargs]) + del state.rargs[:nargs] + + 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(prefix + ''.join(unknown_options)) + + def _process_opts(self, arg, state): + 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: + return self._match_short_opt(arg, state) + if not self.ignore_unknown_options: + raise + state.largs.append(arg) diff --git a/backend/venv/lib/python3.7/site-packages/click/termui.py b/backend/venv/lib/python3.7/site-packages/click/termui.py new file mode 100644 index 000000000..d9fba5232 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/click/termui.py @@ -0,0 +1,539 @@ +import os +import sys +import struct + +from ._compat import raw_input, text_type, string_types, \ + isatty, strip_ansi, get_winterm_size, DEFAULT_COLUMNS, WIN +from .utils import echo +from .exceptions import Abort, UsageError +from .types import convert_type +from .globals import resolve_color_default + + +# The prompt functions to use. The doc tools currently override these +# functions to customize how they work. +visible_prompt_func = raw_input + +_ansi_colors = ('black', 'red', 'green', 'yellow', 'blue', 'magenta', + 'cyan', 'white', 'reset') +_ansi_reset_all = '\033[0m' + + +def hidden_prompt_func(prompt): + import getpass + return getpass.getpass(prompt) + + +def _build_prompt(text, suffix, show_default=False, default=None): + prompt = text + if default is not None and show_default: + prompt = '%s [%s]' % (prompt, default) + return prompt + suffix + + +def prompt(text, default=None, hide_input=False, + confirmation_prompt=False, type=None, + value_proc=None, prompt_suffix=': ', + show_default=True, err=False): + """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. + + .. versionadded:: 6.0 + Added unicode support for cmd.exe on Windows. + + .. versionadded:: 4.0 + Added the `err` parameter. + + :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: asks for confirmation for the value. + :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. + """ + result = None + + def prompt_func(text): + f = hide_input and hidden_prompt_func or visible_prompt_func + try: + # Write the prompt separately so that we get nice + # coloring through colorama on Windows + echo(text, nl=False, err=err) + 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) + + while 1: + while 1: + value = prompt_func(prompt) + if value: + break + # If a default is set and used, then the confirmation + # prompt is always skipped because that's the only thing + # that really makes sense. + elif default is not None: + return default + try: + result = value_proc(value) + except UsageError as e: + echo('Error: %s' % e.message, err=err) + continue + if not confirmation_prompt: + return result + while 1: + value2 = prompt_func('Repeat for confirmation: ') + if value2: + break + if value == value2: + return result + echo('Error: the two entered values do not match', err=err) + + +def confirm(text, default=False, abort=False, prompt_suffix=': ', + show_default=True, err=False): + """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. + + .. versionadded:: 4.0 + Added the `err` parameter. + + :param text: the question to ask. + :param default: the default for the prompt. + :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. + """ + prompt = _build_prompt(text, prompt_suffix, show_default, + default and 'Y/n' or 'y/N') + while 1: + 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 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(): + """Returns the current size of the terminal as tuple in the form + ``(width, height)`` in columns and rows. + """ + # If shutil has get_terminal_size() (Python 3.3 and later) use that + if sys.version_info >= (3, 3): + import shutil + shutil_get_terminal_size = getattr(shutil, 'get_terminal_size', None) + if shutil_get_terminal_size: + sz = shutil_get_terminal_size() + return sz.columns, sz.lines + + if get_winterm_size is not None: + return get_winterm_size() + + def ioctl_gwinsz(fd): + try: + import fcntl + import termios + cr = struct.unpack( + 'hh', fcntl.ioctl(fd, termios.TIOCGWINSZ, '1234')) + except Exception: + return + return cr + + cr = ioctl_gwinsz(0) or ioctl_gwinsz(1) or ioctl_gwinsz(2) + if not cr: + try: + fd = os.open(os.ctermid(), os.O_RDONLY) + try: + cr = ioctl_gwinsz(fd) + finally: + os.close(fd) + except Exception: + pass + if not cr or not cr[0] or not cr[1]: + cr = (os.environ.get('LINES', 25), + os.environ.get('COLUMNS', DEFAULT_COLUMNS)) + return int(cr[1]), int(cr[0]) + + +def echo_via_pager(text, color=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: 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 not isinstance(text, string_types): + text = text_type(text) + from ._termui_impl import pager + return pager(text + '\n', color) + + +def progressbar(iterable=None, length=None, label=None, show_eta=True, + show_percent=None, show_pos=False, + item_show_func=None, fill_char='#', empty_char='-', + bar_template='%(label)s [%(bar)s] %(info)s', + info_sep=' ', width=36, file=None, color=None): + """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 displayed. 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. + + 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) + + .. versionadded:: 2.0 + + .. versionadded:: 4.0 + Added the `color` parameter. Added a `update` method to the + progressbar object. + + :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 the current item + next to the progress bar. Note that the current + item can be `None`! + :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. + """ + 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) + + +def clear(): + """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 we're on Windows and we don't have colorama available, then we + # clear the screen by shelling out. Otherwise we can use an escape + # sequence. + if WIN: + os.system('cls') + else: + sys.stdout.write('\033[2J\033[1;1H') + + +def style(text, fg=None, bg=None, bold=None, dim=None, underline=None, + blink=None, reverse=None, reset=True): + """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')) + + Supported color names: + + * ``black`` (might be a gray) + * ``red`` + * ``green`` + * ``yellow`` (might be an orange) + * ``blue`` + * ``magenta`` + * ``cyan`` + * ``white`` (might be light gray) + * ``reset`` (reset the color code only) + + .. versionadded:: 2.0 + + :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 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 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. + """ + bits = [] + if fg: + try: + bits.append('\033[%dm' % (_ansi_colors.index(fg) + 30)) + except ValueError: + raise TypeError('Unknown color %r' % fg) + if bg: + try: + bits.append('\033[%dm' % (_ansi_colors.index(bg) + 40)) + except ValueError: + raise TypeError('Unknown color %r' % bg) + if bold is not None: + bits.append('\033[%dm' % (1 if bold else 22)) + if dim is not None: + bits.append('\033[%dm' % (2 if dim else 22)) + if underline is not None: + bits.append('\033[%dm' % (4 if underline else 24)) + if blink is not None: + bits.append('\033[%dm' % (5 if blink else 25)) + if reverse is not None: + bits.append('\033[%dm' % (7 if reverse else 27)) + bits.append(text) + if reset: + bits.append(_ansi_reset_all) + return ''.join(bits) + + +def unstyle(text): + """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(text, file=None, nl=True, err=False, color=None, **styles): + """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. + + .. versionadded:: 2.0 + """ + return echo(style(text, **styles), file=file, nl=nl, err=err, color=color) + + +def edit(text=None, editor=None, env=None, require_save=True, + extension='.txt', filename=None): + 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 + editor = Editor(editor=editor, env=env, require_save=require_save, + extension=extension) + if filename is None: + return editor.edit(text) + editor.edit_file(filename) + + +def launch(url, wait=False, locate=False): + """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('http://click.pocoo.org/') + click.launch('/my/downloaded/file', locate=True) + + .. versionadded:: 2.0 + + :param url: URL or filename of the thing to launch. + :param wait: waits for the program to stop. + :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 = None + + +def getchar(echo=False): + """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. + + .. 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. + """ + f = _getchar + if f is None: + from ._termui_impl import getchar as f + return f(echo) + + +def pause(info='Press any key to continue ...', err=False): + """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 info string to print before pausing. + :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 + try: + if info: + echo(info, nl=False, err=err) + try: + getchar() + except (KeyboardInterrupt, EOFError): + pass + finally: + if info: + echo(err=err) diff --git a/backend/venv/lib/python3.7/site-packages/click/testing.py b/backend/venv/lib/python3.7/site-packages/click/testing.py new file mode 100644 index 000000000..4416c7741 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/click/testing.py @@ -0,0 +1,322 @@ +import os +import sys +import shutil +import tempfile +import contextlib + +from ._compat import iteritems, PY2 + + +# If someone wants to vendor click, we want to ensure the +# correct package is discovered. Ideally we could use a +# relative import here but unfortunately Python does not +# support that. +clickpkg = sys.modules[__name__.rsplit('.', 1)[0]] + + +if PY2: + from cStringIO import StringIO +else: + import io + from ._compat import _find_binary_reader + + +class EchoingStdin(object): + + def __init__(self, input, output): + self._input = input + self._output = output + + def __getattr__(self, x): + return getattr(self._input, x) + + def _echo(self, rv): + self._output.write(rv) + return rv + + def read(self, n=-1): + return self._echo(self._input.read(n)) + + def readline(self, n=-1): + return self._echo(self._input.readline(n)) + + def readlines(self): + return [self._echo(x) for x in self._input.readlines()] + + def __iter__(self): + return iter(self._echo(x) for x in self._input) + + def __repr__(self): + return repr(self._input) + + +def make_input_stream(input, charset): + # Is already an input stream. + if hasattr(input, 'read'): + if PY2: + return input + rv = _find_binary_reader(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 not isinstance(input, bytes): + input = input.encode(charset) + if PY2: + return StringIO(input) + return io.BytesIO(input) + + +class Result(object): + """Holds the captured result of an invoked CLI script.""" + + def __init__(self, runner, output_bytes, exit_code, exception, + exc_info=None): + #: The runner that created the result + self.runner = runner + #: The output as bytes. + self.output_bytes = output_bytes + #: The exit code as integer. + self.exit_code = exit_code + #: The exception that happend if one did. + self.exception = exception + #: The traceback + self.exc_info = exc_info + + @property + def output(self): + """The output as unicode string.""" + return self.output_bytes.decode(self.runner.charset, 'replace') \ + .replace('\r\n', '\n') + + def __repr__(self): + return '' % ( + self.exception and repr(self.exception) or 'okay', + ) + + +class CliRunner(object): + """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. This is + UTF-8 by default and should not be changed currently as + the reporting to Click only works in Python 2 properly. + :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. + """ + + def __init__(self, charset=None, env=None, echo_stdin=False): + if charset is None: + charset = 'utf-8' + self.charset = charset + self.env = env or {} + self.echo_stdin = echo_stdin + + def get_default_prog_name(self, cli): + """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=None): + """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=None, env=None, color=False): + """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. + + .. versionadded:: 4.0 + The ``color`` parameter was added. + + :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. + """ + input = make_input_stream(input, self.charset) + + old_stdin = sys.stdin + old_stdout = sys.stdout + old_stderr = sys.stderr + old_forced_width = clickpkg.formatting.FORCED_WIDTH + clickpkg.formatting.FORCED_WIDTH = 80 + + env = self.make_env(env) + + if PY2: + sys.stdout = sys.stderr = bytes_output = StringIO() + if self.echo_stdin: + input = EchoingStdin(input, bytes_output) + else: + bytes_output = io.BytesIO() + if self.echo_stdin: + input = EchoingStdin(input, bytes_output) + input = io.TextIOWrapper(input, encoding=self.charset) + sys.stdout = sys.stderr = io.TextIOWrapper( + bytes_output, encoding=self.charset) + + sys.stdin = input + + def visible_input(prompt=None): + sys.stdout.write(prompt or '') + val = input.readline().rstrip('\r\n') + sys.stdout.write(val + '\n') + sys.stdout.flush() + return val + + def hidden_input(prompt=None): + sys.stdout.write((prompt or '') + '\n') + sys.stdout.flush() + return input.readline().rstrip('\r\n') + + def _getchar(echo): + char = sys.stdin.read(1) + if echo: + sys.stdout.write(char) + sys.stdout.flush() + return char + + default_color = color + def should_strip_ansi(stream=None, color=None): + if color is None: + return not default_color + return not color + + old_visible_prompt_func = clickpkg.termui.visible_prompt_func + old_hidden_prompt_func = clickpkg.termui.hidden_prompt_func + old__getchar_func = clickpkg.termui._getchar + old_should_strip_ansi = clickpkg.utils.should_strip_ansi + clickpkg.termui.visible_prompt_func = visible_input + clickpkg.termui.hidden_prompt_func = hidden_input + clickpkg.termui._getchar = _getchar + clickpkg.utils.should_strip_ansi = should_strip_ansi + + old_env = {} + try: + for key, value in iteritems(env): + 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 + finally: + for key, value in iteritems(old_env): + 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 + clickpkg.termui.visible_prompt_func = old_visible_prompt_func + clickpkg.termui.hidden_prompt_func = old_hidden_prompt_func + clickpkg.termui._getchar = old__getchar_func + clickpkg.utils.should_strip_ansi = old_should_strip_ansi + clickpkg.formatting.FORCED_WIDTH = old_forced_width + + def invoke(self, cli, args=None, input=None, env=None, + catch_exceptions=True, color=False, **extra): + """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. + + .. versionadded:: 3.0 + The ``catch_exceptions`` parameter was added. + + .. versionchanged:: 3.0 + The result object now has an `exc_info` attribute with the + traceback if available. + + .. versionadded:: 4.0 + The ``color`` parameter was added. + + :param cli: the command to invoke + :param args: the arguments to invoke + :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. + """ + exc_info = None + with self.isolation(input=input, env=env, color=color) as out: + exception = None + exit_code = 0 + + try: + cli.main(args=args or (), + prog_name=self.get_default_prog_name(cli), **extra) + except SystemExit as e: + if e.code != 0: + exception = e + + exc_info = sys.exc_info() + + exit_code = e.code + if not isinstance(exit_code, int): + sys.stdout.write(str(exit_code)) + sys.stdout.write('\n') + exit_code = 1 + except Exception as e: + if not catch_exceptions: + raise + exception = e + exit_code = -1 + exc_info = sys.exc_info() + finally: + sys.stdout.flush() + output = out.getvalue() + + return Result(runner=self, + output_bytes=output, + exit_code=exit_code, + exception=exception, + exc_info=exc_info) + + @contextlib.contextmanager + def isolated_filesystem(self): + """A context manager that creates a temporary folder and changes + the current working directory to it for isolated filesystem tests. + """ + cwd = os.getcwd() + t = tempfile.mkdtemp() + os.chdir(t) + try: + yield t + finally: + os.chdir(cwd) + try: + shutil.rmtree(t) + except (OSError, IOError): + pass diff --git a/backend/venv/lib/python3.7/site-packages/click/types.py b/backend/venv/lib/python3.7/site-packages/click/types.py new file mode 100644 index 000000000..36390026d --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/click/types.py @@ -0,0 +1,550 @@ +import os +import stat + +from ._compat import open_stream, text_type, filename_to_ui, \ + get_filesystem_encoding, get_streerror, _get_argv_encoding, PY2 +from .exceptions import BadParameter +from .utils import safecall, LazyFile + + +class ParamType(object): + """Helper for converting values through types. The following is + necessary for a valid type: + + * it needs a name + * it needs to pass through None unchanged + * it needs to convert from a string + * it needs to convert its result type through unchanged + (eg: needs to be idempotent) + * it needs to be able to deal with param and context being `None`. + This can be the case when the object is used with prompt + inputs. + """ + is_composite = False + + #: the descriptive name of this type + name = None + + #: 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 = None + + def __call__(self, value, param=None, ctx=None): + if value is not None: + return self.convert(value, param, ctx) + + def get_metavar(self, param): + """Returns the metavar default for this param if it provides one.""" + + def get_missing_message(self, param): + """Optionally might return extra information about a missing + parameter. + + .. versionadded:: 2.0 + """ + + def convert(self, value, param, ctx): + """Converts the value. This is not invoked for values that are + `None` (the missing value). + """ + return value + + def split_envvar_value(self, rv): + """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, param=None, ctx=None): + """Helper method to fail with an invalid value message.""" + raise BadParameter(message, ctx=ctx, param=param) + + +class CompositeParamType(ParamType): + is_composite = True + + @property + def arity(self): + raise NotImplementedError() + + +class FuncParamType(ParamType): + + def __init__(self, func): + self.name = func.__name__ + self.func = func + + def convert(self, value, param, ctx): + try: + return self.func(value) + except ValueError: + try: + value = text_type(value) + except UnicodeError: + value = str(value).decode('utf-8', 'replace') + self.fail(value, param, ctx) + + +class UnprocessedParamType(ParamType): + name = 'text' + + def convert(self, value, param, ctx): + return value + + def __repr__(self): + return 'UNPROCESSED' + + +class StringParamType(ParamType): + name = 'text' + + def convert(self, value, param, ctx): + 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') + return value + return value + + def __repr__(self): + 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. + + See :ref:`choice-opts` for an example. + """ + name = 'choice' + + def __init__(self, choices): + self.choices = choices + + def get_metavar(self, param): + return '[%s]' % '|'.join(self.choices) + + def get_missing_message(self, param): + return 'Choose from %s.' % ', '.join(self.choices) + + def convert(self, value, param, ctx): + # Exact match + if value in self.choices: + return value + + # Match through normalization + if ctx is not None and \ + ctx.token_normalize_func is not None: + value = ctx.token_normalize_func(value) + for choice in self.choices: + if ctx.token_normalize_func(choice) == value: + return choice + + self.fail('invalid choice: %s. (choose from %s)' % + (value, ', '.join(self.choices)), param, ctx) + + def __repr__(self): + return 'Choice(%r)' % list(self.choices) + + +class IntParamType(ParamType): + name = 'integer' + + def convert(self, value, param, ctx): + try: + return int(value) + except (ValueError, UnicodeError): + self.fail('%s is not a valid integer' % value, param, ctx) + + def __repr__(self): + return 'INT' + + +class IntRange(IntParamType): + """A parameter that works similar to :data:`click.INT` but restricts + the value to fit into a range. The default behavior is to fail if the + value falls outside the range, but it can also be silently clamped + between the two edges. + + See :ref:`ranges` for an example. + """ + name = 'integer range' + + def __init__(self, min=None, max=None, clamp=False): + self.min = min + self.max = max + self.clamp = clamp + + def convert(self, value, param, ctx): + rv = IntParamType.convert(self, value, param, ctx) + if self.clamp: + if self.min is not None and rv < self.min: + return self.min + if self.max is not None and rv > self.max: + return self.max + if self.min is not None and rv < self.min or \ + self.max is not None and rv > self.max: + if self.min is None: + self.fail('%s is bigger than the maximum valid value ' + '%s.' % (rv, self.max), param, ctx) + elif self.max is None: + self.fail('%s is smaller than the minimum valid value ' + '%s.' % (rv, self.min), param, ctx) + else: + self.fail('%s is not in the valid range of %s to %s.' + % (rv, self.min, self.max), param, ctx) + return rv + + def __repr__(self): + return 'IntRange(%r, %r)' % (self.min, self.max) + + +class BoolParamType(ParamType): + name = 'boolean' + + def convert(self, value, param, ctx): + if isinstance(value, bool): + return bool(value) + value = value.lower() + if value in ('true', '1', 'yes', 'y'): + return True + elif value in ('false', '0', 'no', 'n'): + return False + self.fail('%s is not a valid boolean' % value, param, ctx) + + def __repr__(self): + return 'BOOL' + + +class FloatParamType(ParamType): + name = 'float' + + def convert(self, value, param, ctx): + try: + return float(value) + except (UnicodeError, ValueError): + self.fail('%s is not a valid floating point value' % + value, param, ctx) + + def __repr__(self): + return 'FLOAT' + + +class UUIDParameterType(ParamType): + name = 'uuid' + + def convert(self, value, param, ctx): + import uuid + try: + if PY2 and isinstance(value, text_type): + value = value.encode('ascii') + return uuid.UUID(value) + except (UnicodeError, ValueError): + self.fail('%s is not a valid UUID value' % value, param, ctx) + + def __repr__(self): + 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. + + 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='r', encoding=None, errors='strict', lazy=None, + atomic=False): + self.mode = mode + self.encoding = encoding + self.errors = errors + self.lazy = lazy + self.atomic = atomic + + def resolve_lazy_flag(self, value): + 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, param, ctx): + try: + if hasattr(value, 'read') or hasattr(value, 'write'): + return value + + lazy = self.resolve_lazy_flag(value) + + if lazy: + f = LazyFile(value, self.mode, self.encoding, self.errors, + atomic=self.atomic) + if ctx is not None: + ctx.call_on_close(f.close_intelligently) + 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 (IOError, OSError) as e: + self.fail('Could not open file: %s: %s' % ( + filename_to_ui(value), + get_streerror(e), + ), param, ctx) + + +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. + + .. versionchanged:: 6.0 + `allow_dash` was added. + + :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. + :param allow_dash: If this is set to `True`, a single dash to indicate + standard streams is permitted. + :param type: optionally a string type that should be used to + represent the path. The default is `None` which + means the return value will be either bytes or + unicode depending on what makes most sense given the + input data Click deals with. + """ + envvar_list_splitter = os.path.pathsep + + def __init__(self, exists=False, file_okay=True, dir_okay=True, + writable=False, readable=True, resolve_path=False, + allow_dash=False, path_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' + self.path_type = 'File' + if self.dir_okay and not self.file_okay: + self.name = 'directory' + self.path_type = 'Directory' + else: + self.name = 'path' + self.path_type = 'Path' + + def coerce_path_result(self, rv): + if self.type is not None and not isinstance(rv, self.type): + if self.type is text_type: + rv = rv.decode(get_filesystem_encoding()) + else: + rv = rv.encode(get_filesystem_encoding()) + return rv + + def convert(self, value, param, ctx): + rv = value + + is_dash = self.file_okay and self.allow_dash and rv in (b'-', '-') + + if not is_dash: + if self.resolve_path: + rv = os.path.realpath(rv) + + try: + st = os.stat(rv) + except OSError: + if not self.exists: + return self.coerce_path_result(rv) + self.fail('%s "%s" does not exist.' % ( + self.path_type, + filename_to_ui(value) + ), param, ctx) + + if not self.file_okay and stat.S_ISREG(st.st_mode): + self.fail('%s "%s" is a file.' % ( + self.path_type, + filename_to_ui(value) + ), param, ctx) + if not self.dir_okay and stat.S_ISDIR(st.st_mode): + self.fail('%s "%s" is a directory.' % ( + self.path_type, + filename_to_ui(value) + ), param, ctx) + if self.writable and not os.access(value, os.W_OK): + self.fail('%s "%s" is not writable.' % ( + self.path_type, + filename_to_ui(value) + ), param, ctx) + if self.readable and not os.access(value, os.R_OK): + self.fail('%s "%s" is not readable.' % ( + self.path_type, + filename_to_ui(value) + ), param, ctx) + + return self.coerce_path_result(rv) + + +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): + self.types = [convert_type(ty) for ty in types] + + @property + def name(self): + return "<" + " ".join(ty.name for ty in self.types) + ">" + + @property + def arity(self): + return len(self.types) + + def convert(self, value, param, ctx): + if len(value) != len(self.types): + raise TypeError('It would appear that nargs is set to conflict ' + 'with the composite type arity.') + return tuple(ty(x, param, ctx) for ty, x in zip(self.types, value)) + + +def convert_type(ty, default=None): + """Converts a callable or python ty into the most appropriate param + ty. + """ + guessed_type = False + if ty is None and default is not None: + if isinstance(default, tuple): + ty = tuple(map(type, default)) + else: + ty = type(default) + guessed_type = True + + if isinstance(ty, tuple): + return Tuple(ty) + if isinstance(ty, ParamType): + return ty + if ty is text_type or ty is str or ty is None: + return STRING + if ty is int: + return INT + # Booleans are only okay if not guessed. This is done because for + # flags the default value is actually a bit of a lie in that it + # indicates which of the flags is the one we want. See get_default() + # for more information. + if ty is bool and not guessed_type: + return BOOL + if ty is float: + return FLOAT + if guessed_type: + return STRING + + # Catch a common mistake + if __debug__: + try: + if issubclass(ty, ParamType): + raise AssertionError('Attempted to use an uninstantiated ' + 'parameter type (%s).' % ty) + except TypeError: + 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. This is necessary to achieve the +#: same bytes/unicode behavior on Python 2/3 in situations where you want +#: to not convert argument types. 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/backend/venv/lib/python3.7/site-packages/click/utils.py b/backend/venv/lib/python3.7/site-packages/click/utils.py new file mode 100644 index 000000000..eee626d3f --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/click/utils.py @@ -0,0 +1,415 @@ +import os +import sys + +from .globals import resolve_color_default + +from ._compat import text_type, open_stream, get_filesystem_encoding, \ + get_streerror, string_types, PY2, binary_streams, text_streams, \ + filename_to_ui, auto_wrap_for_ansi, strip_ansi, should_strip_ansi, \ + _default_text_stdout, _default_text_stderr, is_bytes, WIN + +if not PY2: + from ._compat import _find_binary_writer +elif WIN: + from ._winconsole import _get_windows_argv, \ + _hash_py_argv, _initial_argv_hash + + +echo_native_types = string_types + (bytes, bytearray) + + +def _posixify(name): + return '-'.join(name.split()).lower() + + +def safecall(func): + """Wraps a function so that it swallows exceptions.""" + def wrapper(*args, **kwargs): + try: + return func(*args, **kwargs) + except Exception: + pass + return wrapper + + +def make_str(value): + """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 text_type(value) + + +def make_default_short_help(help, max_length=45): + words = help.split() + total_length = 0 + result = [] + done = False + + for word in words: + if word[-1:] == '.': + done = True + new_length = result and 1 + len(word) or len(word) + if total_length + new_length > max_length: + result.append('...') + done = True + else: + if result: + result.append(' ') + result.append(word) + if done: + break + total_length += new_length + + return ''.join(result) + + +class LazyFile(object): + """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, mode='r', encoding=None, errors='strict', + atomic=False): + self.name = filename + self.mode = mode + self.encoding = encoding + self.errors = errors + self.atomic = atomic + + 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): + return getattr(self.open(), name) + + def __repr__(self): + if self._f is not None: + return repr(self._f) + return '' % (self.name, self.mode) + + def open(self): + """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 (IOError, OSError) as e: + from .exceptions import FileError + raise FileError(self.name, hint=get_streerror(e)) + self._f = rv + return rv + + def close(self): + """Closes the underlying file, no matter what.""" + if self._f is not None: + self._f.close() + + def close_intelligently(self): + """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): + return self + + def __exit__(self, exc_type, exc_value, tb): + self.close_intelligently() + + def __iter__(self): + self.open() + return iter(self._f) + + +class KeepOpenFile(object): + + def __init__(self, file): + self._file = file + + def __getattr__(self, name): + return getattr(self._file, name) + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_value, tb): + pass + + def __repr__(self): + return repr(self._file) + + def __iter__(self): + return iter(self._file) + + +def echo(message=None, file=None, nl=True, err=False, color=None): + """Prints a message plus a newline to the given file or stdout. On + first sight, this looks like the print function, but it has improved + support for handling Unicode and binary data that does not fail no + matter how badly configured the system is. + + Primarily it means that you can print binary data as well as Unicode + data on both 2.x and 3.x to the given file in the most appropriate way + possible. This is a very carefree function as in that it will try its + best to not fail. As of Click 6.0 this includes support for unicode + output on the Windows console. + + In addition to that, if `colorama`_ is installed, the echo function will + also support clever handling of ANSI codes. Essentially it will then + do the following: + + - add transparent handling of ANSI color codes on Windows. + - hide ANSI codes automatically if the destination file is not a + terminal. + + .. _colorama: http://pypi.python.org/pypi/colorama + + .. versionchanged:: 6.0 + As of Click 6.0 the echo function will properly support unicode + output on the windows console. Not that click does not modify + the interpreter in any way which means that `sys.stdout` or the + print statement or function will still not provide unicode support. + + .. versionchanged:: 2.0 + Starting with version 2.0 of Click, the echo function will work + with colorama if it's installed. + + .. versionadded:: 3.0 + The `err` parameter was added. + + .. versionchanged:: 4.0 + Added the `color` flag. + + :param message: the message to print + :param file: the file to write to (defaults to ``stdout``) + :param err: if set to true the file defaults to ``stderr`` instead of + ``stdout``. This is faster and easier than calling + :func:`get_text_stderr` yourself. + :param nl: if set to `True` (the default) a newline is printed afterwards. + :param color: controls if the terminal supports ANSI colors or not. The + default is autodetection. + """ + 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, echo_native_types): + message = text_type(message) + + if nl: + message = message or u'' + if isinstance(message, text_type): + message += u'\n' + else: + message += b'\n' + + # If there is a message, and we're in Python 3, 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 message and not PY2 and is_bytes(message): + binary_file = _find_binary_writer(file) + if binary_file is not None: + file.flush() + binary_file.write(message) + binary_file.flush() + return + + # ANSI-style support. If there is no message or we are dealing with + # bytes nothing is happening. If we are connected to a file we want + # to strip colors. If we are on windows we either wrap the stream + # to strip the color or we use the colorama support to translate the + # ansi codes to API calls. + if message and not is_bytes(message): + color = resolve_color_default(color) + if should_strip_ansi(file, color): + message = strip_ansi(message) + elif WIN: + if auto_wrap_for_ansi is not None: + file = auto_wrap_for_ansi(file) + elif not color: + message = strip_ansi(message) + + if message: + file.write(message) + file.flush() + + +def get_binary_stream(name): + """Returns a system stream for byte processing. This essentially + returns the stream from the sys module with the given name but it + solves some compatibility issues between different Python versions. + Primarily this function is necessary for getting binary streams on + Python 3. + + :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('Unknown standard stream %r' % name) + return opener() + + +def get_text_stream(name, encoding=None, errors='strict'): + """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 on Python 3 + 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('Unknown standard stream %r' % name) + return opener(encoding, errors) + + +def open_file(filename, mode='r', encoding=None, errors='strict', + lazy=False, atomic=False): + """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 LazyFile(filename, mode, encoding, errors, atomic=atomic) + f, should_close = open_stream(filename, mode, encoding, errors, + atomic=atomic) + if not should_close: + f = KeepOpenFile(f) + return f + + +def get_os_args(): + """This returns the argument part of sys.argv in the most appropriate + form for processing. What this means is that this return value is in + a format that works for Click to process but does not necessarily + correspond well to what's actually standard for the interpreter. + + On most environments the return value is ``sys.argv[:1]`` unchanged. + However if you are on Windows and running Python 2 the return value + will actually be a list of unicode strings instead because the + default behavior on that platform otherwise will not be able to + carry all possible values that sys.argv can have. + + .. versionadded:: 6.0 + """ + # We can only extract the unicode argv if sys.argv has not been + # changed since the startup of the application. + if PY2 and WIN and _initial_argv_hash == _hash_py_argv(): + return _get_windows_argv() + return sys.argv[1:] + + +def format_filename(filename, shorten=False): + """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 filename_to_ui(filename) + + +def get_app_dir(app_name, roaming=True, force_posix=False): + 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`` + Win XP (roaming): + ``C:\Documents and Settings\\Local Settings\Application Data\Foo Bar`` + Win XP (not roaming): + ``C:\Documents and Settings\\Application Data\Foo Bar`` + Win 7 (roaming): + ``C:\Users\\AppData\Roaming\Foo Bar`` + Win 7 (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 = roaming and 'APPDATA' or '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('~/.' + _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)) diff --git a/myenv/lib/python3.7/site-packages/easy_install.py b/backend/venv/lib/python3.7/site-packages/easy_install.py similarity index 100% rename from myenv/lib/python3.7/site-packages/easy_install.py rename to backend/venv/lib/python3.7/site-packages/easy_install.py diff --git a/backend/venv/lib/python3.7/site-packages/flask/__init__.py b/backend/venv/lib/python3.7/site-packages/flask/__init__.py new file mode 100644 index 000000000..59f0fff54 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/flask/__init__.py @@ -0,0 +1,49 @@ +# -*- coding: utf-8 -*- +""" + flask + ~~~~~ + + A microframework based on Werkzeug. It's extensively documented + and follows best practice patterns. + + :copyright: © 2010 by the Pallets team. + :license: BSD, see LICENSE for more details. +""" + +__version__ = '1.0.3' + +# utilities we import from Werkzeug and Jinja2 that are unused +# in the module but are exported as public interface. +from werkzeug.exceptions import abort +from werkzeug.utils import redirect +from jinja2 import Markup, escape + +from .app import Flask, Request, Response +from .config import Config +from .helpers import url_for, flash, send_file, send_from_directory, \ + get_flashed_messages, get_template_attribute, make_response, safe_join, \ + stream_with_context +from .globals import current_app, g, request, session, _request_ctx_stack, \ + _app_ctx_stack +from .ctx import has_request_context, has_app_context, \ + after_this_request, copy_current_request_context +from .blueprints import Blueprint +from .templating import render_template, render_template_string + +# the signals +from .signals import signals_available, template_rendered, request_started, \ + request_finished, got_request_exception, request_tearing_down, \ + appcontext_tearing_down, appcontext_pushed, \ + appcontext_popped, message_flashed, before_render_template + +# We're not exposing the actual json module but a convenient wrapper around +# it. +from . import json + +# This was the only thing that Flask used to export at one point and it had +# a more generic name. +jsonify = json.jsonify + +# backwards compat, goes away in 1.0 +from .sessions import SecureCookieSession as Session +json_available = True diff --git a/backend/venv/lib/python3.7/site-packages/flask/__main__.py b/backend/venv/lib/python3.7/site-packages/flask/__main__.py new file mode 100644 index 000000000..4aee65437 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/flask/__main__.py @@ -0,0 +1,14 @@ +# -*- coding: utf-8 -*- +""" + flask.__main__ + ~~~~~~~~~~~~~~ + + Alias for flask.run for the command line. + + :copyright: © 2010 by the Pallets team. + :license: BSD, see LICENSE for more details. +""" + +if __name__ == '__main__': + from .cli import main + main(as_module=True) diff --git a/backend/venv/lib/python3.7/site-packages/flask/__pycache__/__init__.cpython-37.pyc b/backend/venv/lib/python3.7/site-packages/flask/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..13de640bb033f1cbbca1296bf010be8346f5bf27 GIT binary patch literal 1850 zcmZ8h+inv_7+xROu^lIla{>Yx&KMFOLPA1HD+;9&Qj02rRB5DYwB8-tYtQU%XU0y# zMeqA4yg(nIk1?0@idX1W|9@i#=t%zjpY}h`yjWZ;J8=H`c;&Z0i;nXTGV_xK;yL{E z!;Iqu4t0VI%>>yXC$cg}a~TKdyvWM}Eu?fo6s1dDS)wK2i-9W^WSN#_g;r#hR#RC? zEXo?KrSyVWlFM{i)@fa?&=uLB4Y^8JvUai&<(jsH&ffPxFWC8tMVGXCb#I8 zyiTvn8}x?UrrW8$B8a?6Z^~Qrmb^`G%RBT=DzA#W@*cgH(u?B0d_W(_CT*sCO+1v3 z=p(s9cjPYJl`YzmZQ7O{+L2w_m3wqgKBkZ5KHZlG^dS9aNj#B<^f2S_!_g5vf-0BA zQ+Z6k0d1W=3sz2?W@GXZx>hD|`oh!Wl==ftIVHa*GW1p4SDxgju^N+}r+Gl)i2Tac z_&uKtT7zA+IoV%0^GkZbX%R)<4;hm)6Cd{*Nc?_qNI2bD(;(R))s&E)OeEE zBGus1Q>E=q6AnVJO# z=U$()Q5;6#+$d-XI}Oc{`7!kT%ruL(;!l)<2{127Y-V6xHOt=B5G#x$y8`agf|zg4 zm^Pk2wly^W%s2D4G4%9j!wdIz35BWUOt9khVT{ZS!%Jhkg|lSyG%jP!GR)Y87h=K_ z6-LYveD0kLfNb(Cs{R>4hNgaPBijxG> znN4^;al78*uq-&zuj+=C%8zs$!GGg~L-Y8{I39=mhpU;k!%S zAr}e6Qx()#5f%|@2uldd2z7)Nga&|h2O{plxYR0&))3YaHV`%ut^n8^ETOuJ>@|cf zgzEsb+?%h7RyR_?Y}hawwT)&3rS5Di)J+uKLb#1^2jMQlJ%sxR4-lFN4-p;#SV!%^ zA9b<$VgKBgX4gckT~xcX0ni#6d|tf|j(UPV5dP(DSm!BR-1gK{ZFult6?I#xc5lSk zkv@nHr@_9@lIdQ@^p6H3CA$5Cr%&7O+DVw~h7qi)5W5pO?0Vg>(@vkAHa-#KHe;~0 uhOt%xsXdc%FcJJaoP#C+`D{L4%~UhX*;T-u9La8Gfy?c?)qF8m&HM+@8abZA+Z4D{_eWhAN2AobZmeKNV!zjudXT^t>4ZGRL84gCVg1Pqit@Pj>TL-zg}FG z85429ST+!G4KDKnB~9knD>7xb<>3ctV&sCSKo{K5FjfMLrP|Q(l(CLIj!qWhC}7E= z-Au#I)6}R|czk+FhcuB%Lq;}rFKW#7q{UmZNpCYlX>KdsNcEHDs&cm0cAkBuExAxE IRPYY|1t?O9EdT%j literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/site-packages/flask/__pycache__/_compat.cpython-37.pyc b/backend/venv/lib/python3.7/site-packages/flask/__pycache__/_compat.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ea62020b292a2dda3352a39350751c99435004f9 GIT binary patch literal 3330 zcmbVO-EteZ6$X~eU;SCOELpbGz)6#atxZa9J+U>8C$*}0JZTu!QX6}x9n5k8QY$TY zw*VxI8nqXeXOg@25v-Zq7`oo3ga{H4L4}vlfJ(aU3A#u`X~zpn!WZS|B=BWPKa=I4 zBFjA*RAmilT~yp!LsZ>3A!=@%1f+U0HJA=&D55r!bA#Dn*706)esCd}1OAGb5R=bo za8dffeEMg(fY@@O=OMbh1Y=!Hjqs;O_%mbtbAUfH#$P;ze>s?wSH$cQg)`2J3!wYF zm=hOayej5{x8%N&bGiHJoT88%UN9Z?^N{uUYZexEm+288W?_=b19B8)_+7ma>p( zqvAY=naG}|ZvUQCI)=5Z$8@~UbjF@aSWSOn*jBhFnaP-txlB(0av8ba zrd8;(5@q>N#r-X_!v6gYyScQy#JWRfwj^5*lSCTLj0^`Yw{azjBbjQs!tQVU?mE*_ zvfn>kUF&SDv0kRwAXA`=G+~_RR^wX?&Ca(T&#sWzbfjorc4a=08XwLd}Mw4I0ABM-Imp{?Cb!a-Mr_hwNc=tNb3oY5C`a{5jJ zV?g5<^q3q`r+3q{er%+&{*D}Kyn}do2UR}7TLi|T{{&!Fg-y1y7bd$BkQFBQ>##5X z-`Hi)eDGt?S5BbeV$*$Tdb>#ys=kJp0!eKHf-~(u{5(PnVZ(83t*bCOq}$}s+o`L$ zL;8XqddKt`J%la_uY>ibI5#ScWH*dR3lcln`(qPV*?9AHh%{cGO2;L=} z;!E=!Ip~lTrOufx7!Vt%(X`uwmVW_Tjxm9}&Ov$C^lsdSNSNS!H;toANQi@qOp$}I z$0G5H*IkO zYc7>u!i)_v7DZ@VY&c@atkGEIzJe_MiX4`X5Q=u3jheo~dSLxD97x+RTe0T&QfZeo zVBNBtSs(EWt782_qo?vI=c@>g8AIqn^NqT-M!Pyq-`0SKGa)P*oDVXwn;<{Q`CoU# zq*zf{017od^)~YCMBu8ht&eYg9~PV*HLBhN-p)W3gm*VoL+%Vdg0a3C=F$N-O9h+* z#y#IZ$z8RmUgMKK!jqhh%kw4m0n9$Jv-vO|^3h|=R$bCZHNh3lL{+DJ%=KjEPx?@S{wIAF9iJ_469 z{vP0eu>criAd`7ey-Z8xFuCRL@TbKJ0SW|`yN_cfE)S)rTmh@07ETv6P{R#%_ zV`+L-DR8&kj}7OK@f>GA+VBphPPB4son~3R1MBKtBtJ)T9mz5hRPq$TtEyiD`6F}( zSfe%1Nj4$6o9|+biY$V{fThz;o_3Edtv|VG>pT`<4){ugOTbO)M(!Jq0b(bMg5xII zmg3adDIl^BX2m~fHHYV4M1n@MRrol87t|=sG_`;tFV55yGBZ&I-&~P_FFf4}yOAvc z2~JBn2;B4Lijb|2YNqv*EbZHRv@v>=?Zhc4>&tx^xeyE%?mznc)3pv?f3p6BuWmm6 z?7<_x_W0qZ!pF!~vhFtOhUT)pEk*XsX>UlJg#3Os@m+ zy_z>oYbBrhv_dN$*c~iCN#W-;$`z2~{G}9luU4te`|yu*RgZeGJ_kEt2HZLN9Z5s! AE&u=k literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/site-packages/flask/__pycache__/app.cpython-37.pyc b/backend/venv/lib/python3.7/site-packages/flask/__pycache__/app.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..837bb258c4a56cf9fe0fce63e24b1e2ab9f95de5 GIT binary patch literal 71414 zcmeFa36NZ8ejnD?^qd$B1|SH4$3B7wFkGMka>?a#L~uD63<&H31MJL@Ae+nW?&xphD2h%;vJ%OTZOM`1RFbl*l5*@+y+pC>q)ORJ zC2~>~r@XdY`ThRi@xIsH1AwblNv;^=biaPb_rBwQU*Fk1dqz_D_Z$D@@cWBlI`zNs zhxwPo!5jE%|6)3o@>9i>pY}8LbTKX8nPNu1v&AgFv-MnKpg54`J-K?mF<2awZ|(Z-?Tp~m6j;l`2Tk;Y@i$8c@LAFV&$c%t}3haiVylak6-_ zQ79G~r;4ZK{6zh970{A}Zu;wz2M6+hQ_wfL&s zyRSao_`c%z$?;_UwZ@s^89Clxf4%Yf;^!N06yIpf6lWS|i)S0N#aX#_pnk3~SDb5{ zFP?9_S$tE@JyO5WxLCZ{_(Jgu=~VE=JE`I&|DgZq*HgvI{vrP`zUSXe`A7W6zMk?Q z3tqUBEne|6i>ax{H~tn@ZN$UBm3pOpqfl92mtP;6e3Xg0HCp~gJ@9Ic^?J|< znw_@SxgK~`9EFv-cWv>_iyj`Y*Q%9Ht=05e%WFZkQ&0^|S6k~_VQuw#XWILnU+`W$ z{laN)c}p6&TB+9qHWpMG1$o;v+6bEMVA?yoc<(xmvX|m5)ZwR{VwFgN>lwi6-OYF9ut4Vb}_zJr|aiuFl=6 z2J0MXwEtqW6NJr5eK81c2BErV;&RZr-ty;Lotb*QwHf%)q#vwQHtL;HV4iGG4d7iH zwYsmK$zHCkM|<^~7XrT)VgjRyh1N!=)?AHWm|MU)d>fdS!Z5PcdM(PWwOh@pT(qZ# zuB--Osk5~nw4=c=2rIRA5RJ7vA)3&qhdaTojvV9p{A{baQd^Dos_&T&?p)sJ1XI~) zWM+LGXL)xtuDfM_mw2&r>&<#=xl(WA-IJwI%~`41xm9X+D%BfNdX;@pGdb7}+HK6& z)Nr)FbQM=CtHIgUM$^9{fD#=l1x6rq{v2al^_$oTz3JLxTdR>MVg7$g~ z=vE~}@gKjl_?yLF`w%`lshw0OeJ9gC&`IxrZhxF!#2L_!3=t0ti?RD{G&)ji*P0kX zvl@gMJcz3UH!Jmx;1^Qi_u=<<%BR-D+D-K5)XhqGYNb^t2A*n!rD=)wL>Zzqu>$UZh(ssRma-(tmg~|)H)2GgpXq^($bqY&R zSl^2FmKv2CLCF$>(;P$|AF1>R{tM6G$c~hKXcn07ng81c+5{c(o?T6Tp%b6ZCS0WKPl8TG;M* zdSSiI3LdEg()=y&dZp>t17FcU+db2@PqBN?;A1DXmI@ExGaVl2fT`X|e+^ySL8o`p zKa<(Xd=m?UMX5Bfgfk$VosD&mC?o`#@2is7`d(!P6icY@N>7(eS3FOs{ziKP&un2( zJ}G;^VRCF3B*{N!-BSF`>j5Y;rbsagzOUKB6gAdc1ZfXr#KcrvVWraw+a5@H3r&Q! zhn0G*vnA7_yV+^AJOXcFWU1w?)NbL85eZm6| zs4Q37fviLwT}KZB(C95R)Lg|%uyu5-!?n|l4Cqn~yyXCEiZ^r(QLwX(nGJ8M286b? z3qZ^PS#yv}X<$I?TC+fT{bDp)MM1`-Dv{CdHCVk#XHe5NwtIedk4{2&VAyqu7Cj5^JH z78lzT1#)^A_ zaX)h>UEGWBEWRi3ox}G&d=CVZe*WW3aX*d+_3;5558?VF!NIjhi-+)exOgOZ%pdkg zRx|$S$LZqZ_%(+A_Q>a0@Pt3^@BKI}zbE{Ca&}UFP5QjL-#>t>ynm1Xh(C${_CO#S z^B?sO{qz%f)04rcik?4Kdc|ZKj*)S?^pe4|NHPg?Z4)q!T0xJ4qrzvU-Lijzk%Op{2Bi&zF$XcXM)$!+UMUp z^WN+JU-M`Eb9n0;{$Ka!{PQ@P@!#|>;LfxDMgI%`|@i6zy6jV_$%^j5x;)RU-hrcuOu>uv{JQ*l8^0QUQ`*0Vj^D%a zrhiM0zl`H8e_M{<$MIMF9Xb9Aj&J)P%5lm6e*XtB2W9^U{jcG>;@|PVj_+mvhx{ML zch&!f{}H}@|Ihh9g73ip^Zt+Gd&U3Q|0cdy{U7tch41VBfA0Ud{}Wi3n*WpjU%;6) z|1bJ~3EwyTpYs1LeAoSd+y8g)-SGci|EKZY^#8K|Gx%=#|DJyr-|PN8|KG>=2mXKH z|17@4pbe(>ANoIsHbK8}{2%#0kK+yh7yMtu^_%`L`M-?sP5)Q?zk=^u{(tQMD!#Y; zU-SPezPJ5f_x}@of7KrYcln)YK)7z@2luB^OCXQJeYLdjDhHKbm4M{8QiZG!&Opkl zNv`lltuA=pMR1I^w_X9s^yRK*r4e{7;i87MfOTkbP+yQH99~rLyekkw$ez)d66bvW z+N^<7pbzXqO!LEFwFVJ+i~5B$#oh@kG29c(gy-H`xa5V9zWGy2Rvv^O2+$kgYE*kT z#>PhVI=UKyaY<{OCU+F3@95fwjIsq*)Na*p2J*cTLQ3-}1cS@AYmg!EYH7$ki1D*G zN`8_Jz?kZgs6G7CPgbfv&&F~>;!of*)cGsA5L?frpu7+o8Y=_NCMTMtQ&hv zOE8cRG$i1y(^ZI$?dh_>a+y69sg-jkazq1DXnLw)LQ6cmjus#)kDAG<*KTm-YVGN1 z1qPyKb5#|}D7na!9>`SkI$+p4qs|>Kl?XJY(v*61)y$1`^OmNb(p2Fh5m_jwTcC|EhS)s zlm#HsanX+Rxd;)lbF8i9#7YwsfMPpgf$eJK0;YoS$ohE|hFCP03Rnd?O4colSSz)bOmEAXb z?dz?Lx^EClC~N0BsEj4moz0eqL92x%{A{{-z`nV#eyr=A$ENJtx^Fd;UuZ-1=o~** zI5zd(>Gw5~@aAjRp{{U2DxJ?$i|Nu*$N@H6;SFj6O)vy>J6=$d`AYLf46mI1)@BUI z0v~l40saFpdT|YN5%t7EtH7fj$~vgZ%0?Ye%|ag_iE)6PXdn-RFl{u%w$%2h zz4#>FSXkSPrW_g&dKMMUyUR|P5$ry>_@zrTb?B&#E!&iRzv7G>m>AjkkU*Rvhz>l+ z%zCgB(K-_Nwk`A@Z}6ZJfs^97SP53Bz&72kV~waEDw7OUOeiC^t&MeAiB637Xffsm zc(mSXchK%}cc@$g0n1ji9*=Ro2BjRDu<2Y4+!fs`cYz#@pJn0S=#}kA&s`J?+68cD z7{;1@IVR2;*egDe7UcPK;T6-!5(ZudgXz?&C7PXJzqwup8PTT{8^;OC4rL=(z&J(g zh{ZZfwcFmN=-GUaW^rH*J#YV9;_ZgPsduY4*>j=?g9((BC{qT%*J6QsmuX3ccArn?H6Bt%%9pHs(3=Bd~{j_vUqmpoT5}vS)-xX3hfEJF z`t})3xqM8$=2+QcZEs^nf(8ZR6c9<&)atQ1E7xy;gm*PO9#J@e3IU-8tPC(uv4ySb z;f9cyp@f)DxYIumR$cID1csZzR}Cncq?|;!GfUw{;0#EnlVW>f#({!H4>D#<4QdJO zohFgTvz*38WxbHNNYpm&hyI;D4>Ok@j{#(ZjuvqN%McwQ*eM;!Vm4SftbG)9J1sjS z{ZLTm(qgqtVY`q3-QI3=5$y#03AAagOo@r+ZY85=QOfqotd{%jh{s%B7e*3Tb>Bt+ zpZ3iF(FXwHeVcMSAU7JCr1dBv`%qB;lyz~A$;2CmlOQFD!QAJiXSXP+(t{=tu8|vK zGOcn*O~^CE2~5&`nlc)iXqn2XNt*^Y%??|w5(gAi zVj<6Yw)e1?gb961%#f7|rnSxqmCr1!vd(ODz=|O&iQfUA)eV~IWu)Xmy9`XNx}vAO z{h$QeguzKk-R&Bz8&sorn{aV7Kp-b4#uUMKScA6Ud&fETW{tH$1@k1%%w75gQMKY- zRd$rm2#<#U4yGyn)RdAqW7%PsW~?NExuUwJ<}?~ynp<4DIR9oevN$)pFt=3t;@rE@ z{>8b)#fw+wOS4z5eDUI(h!)Y2t8)vNXXfYTmrCaHrHkk1mM&hNn@Sh=&NI9GZHZOotJ_3cO2=!JZ-0L&{? zuyjGYT3HXaC!Et{8725PMy$5codK7Rn=RK*;$jvFbx@&*57tcNsW#{JKjt0)noqg-g@B$u;4qRQha&_j-nWeeX+&i;#SC=pg zi_sHT7v@CD!i3B(&Aqc!!ra*F;YBZf5pEX<_b5Zvh61lUyhnA6EF%-29tM7s5*%&!bBVGgnJzXU>^hOLGeg zR~8nd19E}gi6>*RcxdjOtCujC($d^z9AG9dU70yY5X0oooyW6t=Sr}HmKJ9(%w3)< z?)kzZrew+@%P2^@0RfJ($c$E7cQcE3v+M2b!ldyIAJbc z1{C7rT=a-}E82T&=?d=T+lzbE-~^f%FBa#byplc;^`XtM?dm87%YXc)t85m3?U&#Q z?Z98U1845e;LZq~*SU0RC*!AX42RxMW+zq3>}2IvVJC}U*_|Q$8VcXoN!`ueOWhu7 z9_S3LKt56*VxXZa`lj$KP<;bw?V--I^uD3bskP_um+=Q4P5Jqq9FC9qgPf1f z@w-#_^}LMaxKG#q&^-M4d(G@>Wi%SL)O-6H>}AmSEin}J0K`t4)x_G~poy3Ca~alc zilW|3%x>fXI*Dn2R1JaA6wYs-yx4>Rt>$YfwnQQER6#8#A`r!l zSY(_i(*l*^`=fzc8{>>d-e$mqjucAXJ1U_Gid#o{{XK4bB@8K=3>aioQf~OLL`^I@ z#BMD!QmB-;+Kvt=N40S^i?g^L9nohKZfJdNzc~N99yrJ-6Gp6boj+{Pg9M|)5;;U$ zdpmlReG)?_;z|Onx(Y36N00D==IHWH8CUo+C;TxBP^K~G!9$3Isn^McY7A`3>EiX zue2G)M5B!oHly5ft5px*;4@=Tw#1f0Z%}cf4N$W;LzoK>;HKix%=-G9P$1T$907A` zG@RkHqsj;-ntQm4GvRgKJ*r>Eu7^Ls(?7_M3O}0oC?2xVWJESCT!zcMhu-}-ejr@I z&t*`*_B%L8?a8Gx^50N)D4ox!zmfD9&gBR517rF8Sbi8s{BJBjgk$_3iE_PAIU3kHv>c%l5u;FFUpM3}(@ATNj1FpqZ}~Wh;-laUF;Zh4HXJn!{8tZ!x~IpadQxd5%Jhu zRdTa(NW_kz`x*>A(nT?bm3Tzuq*R(m%rB_wQ24|6k{~?l>QNR>oM=!vM%v*Tu7x*v z!;l!~A@4;)G+_()XB7BnR+`p_@rsqp{iH@{lZrxX&#ql4 z^(@RcRSZnIZLkg}R4~&f!Yw^Gj_ARH1<-0X0LM_?Z*8^&oqo$;t;Sw>4P%?1%7*Ls zjt1eor}Z#=9lsFPGsBaa@MhOsMh8GQ*DI^gn4Cz{E1cXRJdqk4k*VE2q9(TA&HX3( zaXh^HL<2Rm+rM+)DZY;g?wFSnbFSCvlg+hVsPAgdNi8Az$eg=V9exWJy65@{a6Yjf zTBg-%#&<;h`Hi&+`wo(H&gVG0j z-W_i+30Bf*QZCz-Ldb)9inGRt=&lm$kiWs$VLNOQaOoPhv&o*&N6#bv86Wxl}z3(bXTjFE;jC~A&jVFL4_#$QO#?-um z;Oj(5B30^cZ|=2OTeUkD^C@ltXSMy#I1W<7d5D>L$qX1tZ|_s^=4j~_)3UfZk3S1(WX5XrfFZ=1nr)B6f2zpxup zX-H}eR}u#Wmc%ZE12aaTbx~Soi`H))`v_^g+p=z(;!2BE2EDS8ej45^ID^R;FAD=G z;Nm6(Lq|ZEUsp?F7Jq0;F&_peH1f(j7%ZsJf;<%nG5O4k;}V-55eit=C!1%@84n zkQ8J5*4{qTLT~tixk5!4uvDdO$ax_(?^>*@l4K_S!Ca$EE+Vq9Gf0tuJrJVqbs!A| zuz+s=1ku%6MVXP3gFpht(`kXfuPq<4@5PuUk+O;Q zOiIVdJhWzlXFykCJ;Z^&SXwu7V7II;y`*XjZo5rGTd}AuGV8LI z@GS}vCQXJ`a0?OQ#_h%n;a9La53MO4Dbc}Zte@?YkQuOEtk-W6HYD+86g)^V`@-(G zTj7V$K}sYLLT&~RhZxyjLkc$7OlDrX2+51~18p$~DJ69S?U53epnvE74m-y;rQ)vb zdb0&yc8kPSy0(G?!!2)vPwu2|42F-RtHL$WS$yM60cWz{qav4qj7n15H_2NwYjD7H z20L)MtPOWYI-{L2Kl^bWZi_u@3^!2uEfCyU$=+0ko<7n#?NJg^sp+Z` zt6M7IG7j9K7NZdZ$y$i&EvXx0A15H$Tda|kBGwOZ1$rV>6tEWimB~|eCstLitiT!= zCj6{;Kr-bM^ZjuowHB{kRX*Fuw%D!hn_r6$iy700E?HGq* zjrVjR4&Wn%m&;C0srYso)c}Zv2tZ{5_zB7m8@#X+BED^2p6-wSU1l{f9Qp@hB3vAa zXE+*l@B~7@^8lsrI6nx|;ZyuL$`218#eAnFdC(K#PvK{@C$X^6qr0qP^hjTZ< z;u*ja2e2K#K}XSaDJ;-plsHN4S)MroIZqk&RY=tXW-%sz^GoRQK;e3)QQyw-3!k@e zoG;wsIaqG!JZ_Vw8B_ZZbsQ=~UEDMLdCbbc6GtTa0*RpH5+qs>b{!Qn7>P9|1+ZkXG!&+(wUa~tGYNB`Z2wNDq zb!aDZF7^Jz?L5v5?&R;J?xoYI53XM0stxW8@E84UQ<=(sbp9==mm%_16mw_Px6WWF&y zATZ283E7vPwVa2u@2h~xkbzoJw$oY{h8qoAsudD;qny-s`DGl!oHN5SgSwB=fP@MZ z^MC}@pNKNc>%}2XGpkWVIbQ5SCPWpe!YyWzjbkOB1%lD34mJqpH-!Ht(-Zg{Nl)Yq zy6y6;<$Y))MmNe5C~E;E_-UAMZXE#A-4HlgEQTuB^(G;c zSQxN)P1_`vK~uO|3`~y752zG$fnS+|V_l$3Wuh{z2ISItg98*LGbV}@^FVAvS`Y5A_7P>Y@6?1m`SmUB_cFF#WkS_L8syvR%82+V?ayXDkeX> z4hb1#1kW3?$9bMtmO-tx^ta}Zh(DJvQnO-5&IZZ&SV6gSU^|OWz*$M`73; zxjniw9RA$S@ZE8L>|XlIS)3Wex%B$4?u_7X5JghoJXLz+9hrxz1C=8P_FEwS2vv7H8Av-}J}9DxVMBnIt+md=IN(Gq(d1yx zxt3(xfS*C#0VW=wDl;1x4+9f?nDwEXP}va!n9fZn@dxvQfRL1V8v&Fe6vKfJ4^{_? zd%84?Hn&Nt1-pUdZW4^-D^$k}an=H@&TbZGCj4^s))t>v{!FR3r3M66tMf%gfpn!w zh);c?VUvMwRA9+?(pfT741hhHm&&r%=uThaoRybijBQ9`cU#Au{#WCU{h zBs2mP(Uv@dOBaQ>ByQO@hOWVaEIgaSJ>zS-mk~`#v)Xb;`wawe3LU)Fwj^B&Zei+W zy>!kI*T|4#)43D!N}8?cez6T8Bc+Xa32@}#))`6f02qM7+7vKDtcCkif03@5RvnE6 z%(NOTBO=^uL%e2Ij>x(vP&6m*d$PX{IKoN~*_HriS5#>}1ki-iBOv60c0&KQi->k8 z{!{$MaHIviV7cPc;k>b~D)TrB6c2_`)=cvRWfg{2h7JXWIv#HF>Z`hvUX~vLi z>rA&6T*4IUS2!aCt4d_Cf01*EWxfoxDAs|1213gfNU{~^iG((~$%!eR#6c?2wBoG- zvcg(bpG5Ra3>s)@qX`)m_H~)t1VmxrGq5GITmt}5*&VIMY9|0q^aCY%IZG07USvh> zTq`I;yZ{z0)`_K^o5&nCYA7I{F%wKcE(<8>Tr0sU1(K@CAT&T3i`r;yQPCwlP3Sei zh-t@QtQN-h*~{gCK#&-|JHpMDgcMMe+dI> zB0rPO^Pe6$(Mye-N5(jSTu9A_5?N*C^2?`BpSJz6ZLvLh9DWOvsQ(asq(-t^zXVhy zB}uE%8uT#}hP=uxLUy@634BU2lb%77-soC-)7~ZgkQr?vz?h~UU1FdBE0W6OH7CH6 z+BbMMF>or~qBYUr=vbcYQXn<&n$&cm|4MNsc^^Gu0Qf{>s-j|x%97GN;}g_a;K(G3 zaBfws178k03vWTsAhp>}Ew28-R)H7bk@Qw6y3NKMZ^N}9ys;f@B)esRLE@IE6it_r z;Vt(ScnzH@fK-$u=qQMTnG$1jvf~{Lj1_~}%-iiO0UH*76)VG?&=p@!s#=JO{0ak5 z!{OSx%aG`T)ghIK(=6=nD=p4BS6CsaqdQn@rIJtMS+t5WEth5%zgR-HkA|7#c@On(fk#Yr`93vbPr&M#cKT$;UfG0GuYB?$LJ<$#sz z(cl)01W0?Ytu|4w$S*-kD*@K#i^F!xi=*mLW_f$qlFr&kXe4}>4Q1x%zmuLWj*$%+ zj-`GXrW6fz^sFtNSCPa>2aADv>Y(^sqd~oHQ5Np9XiT1l8VotQ9sV}n6n>f?v;#z= z4xN!GktmCYB~(P>Hp4r-RYGTnA;xv2Y)+H~Cyzz|V0yNTlayYex>2YoEhFO(f(0WA ziWA*982%0$lwhWD6=UYJA33g9+kQF!rhO&$)Wl2j$^p9k6Fgv0&AigKy4w%S{ zBc@?2b1*ZO$)pbqY!55d7_C{Im7s25_%jW8*nwd zlJODWfIOwlPpMjy1C^hI0z0c6ZWWmFK;lu6mbw;o1ra!tHjnc-?GP&q!WAiJv;j|; zv_eXJT}=9v_CQ%xM5hjdc3sl3X%8Ha@+*Da`abCd1bz5{rJxYr?Fcqt_6%W(yWl90 z6zG%~CrM0XKPnc|w0y?XS-faP@=)}EV^-n?S+*J2hq6gT25=fXPNNNHGM0=7WHuJ`hAV+nlQ*>o^*DwYD^?(w_?S zRDMABB#C~}GXs>8tJC%^oG$(gZ+d6EY5~Oe__0%;zuEF{RL;EgVplOH-l%X2%Pc1T z0t=YFcTDa-_P%%KjCTxA#frcTDpL>vDW7YkLJkZyaP9tunFf|`$ZRO%6|N!=UzHb! zxn95?BaSB+%VVkoDiC*2AdXPyqU!Zl5rZPc_l9cT2fT#qidbr)Oy~LtF`X4)iU-MQ zk!U+_R($j7`f=ypson_(FnK0<>NtzSp75UMWa8_2T^F|ZA-;+C78pi?sbQ|X7(UK; z>Y2iNYyJ4qUeC)o6qP3bz`)1l;$yFg1#HlWCDG6841qGhtb zXO5j^s3KzX3#jlFzf+`SUA^za#Of5Bsg9*&m)Sf}EPKiAskmQ_2}4jUiMPO3SQ-r3 z*W{+}EBZNdG51TLA)>lhrLcJ04G?CQf$D(PXNj@I{K|5Tb&}nVf+$&`mbd5`#%V*! zAen-L(TK@5+-DsU+=VVN5soK+7h%@ceIi5w*&(u)4g88VLfe4^aoGusOcR8Dc%Lwt z$bjM?Ym(4i`y7kDI$bRtjXFRPjZ#3>lZ}$~`+A5(v?l>k;eQLUC>l4+Ou@DeJr4gn zTnlG;18VSh#~DYXPTRjp0ZtqxpP}mt(Hc6^*tw@lrwISyUilNT>^b}pu?!9=i7<}E zGMd+E97jBrl>N?CPNE4Vih*xI)Tc!i;;hRY|r6!rXMBd*<$X3G@#RCWaY@bZFSk$V5>QR#tEga8_scG z6m+#;3nVIw6$D$oAGzZQ3R3(dF{beEV?DzE0UtVkN7g_52Rz#)xFdBw(ZC;C7#Lyt z?O0~}5gDHqO!SMacutoU#q(MGwHW}~N!>-}tdE#;`tB)?BhnnsNy%QwRQ|4AeK1vs zY_PV2f*@9V6R0o#cgPv%Oz5lG#6$57gpvWq>4dZkrJs=!>a>bgkn^<4$Y6y&MrNS^ zfC5q^P0F`!8_-A!e+V4jC2)5smI*3^M{T&yiXmKzGC=}THO*}+n-nFrZv#j4Xlo*7 zOStNuA}=2%KyJw30xk#^{3d9Eh2DFUy2Nw@BB^tiIM5dgFGz$eB)^`P3lg-ePdiDA zBzwKVL)r+aWu$3})?#R3#9)j(`m#ovn1XGu9ChDzl!k_QC}@nawklw@U+<6Jzw>BL z2Rk9?c?k9@n!ZrUfJf2fIXz_%*{-Qe(Y~JcqA|CB#x?pBAhin@!v7iP2+Jx$W)Em! zc6(AmzuQC=C?fy(ZR6`1`?eeC?_?yQB2#%0*s=)Yuws$AtF(YZn^Y;)DmDPtLQyEl zRI~-af*Mo$WMdn_2?VQ1dYv0aZx;T(5Nz91kPKV&pD74#W0qj<5Q6Zq5Ug)k#!fT2 zO1fZkD2o&;fxd-Nsar@K}(w7^alX-BC;p%>i zNqb#PavQV41ceIAM2_G`e@v1PzD(s6hlME4;nFK?>`?>QKzh?4up1iK`4#KWpG`E7 zXqM&%%8fiMF2tg5KWTn@{b)~<-vfB+*XI3!YG2PI{X<2=e++0iZb4~OKuITD_B3II z62cNGvk0ek9Qa7B+({$+P(`4;&Tsxc48i2aP`e0$1@Tnw*)_y-989quQSE zfPDdJWoRpW+6F1Jke&6lg4ny-u27`OroA{VnyCFrBbVt*ERX1iq(G7+*;+*!hV=MCP){Io(RO<-I$KKx4kW+1_y<1z_dyNH^OhMZ?Z?h|yI`ksk()LxqU;dFST4(! zHc2MhQHDUwFV=o{Xd<}4>IE2NJc{dQyFV>Ezx}NlRiLKYs>4k$mf z?^y;v`uHk%XJIKu{D@fK0h1EaDh~gn&$f@^vH=*aFYrF72b9eX#;(AFPl*kN(;94x z(vNmwX&%`hbjyUd`SAunKEy|q2iU`~N{-1bJg{4vN(>Hvowv{zQ=Bwauw;)95$?L! zYBXt{j%!Q3O42xq=TirAaHveCGub1#G3f5Oj0tn>eJH_qsld(RugwTYlK=%OmfpU8 zk%37>7*ZFB{dA@iS~Kw(i-&7CLINA(F3j5=SU@Hb_!;GDc$dsoe?AcHOUpzPC~OgP^e@CV2rI(a|u4}KkykLSQI&|bcim#2pO;X7=9P{QGd z!mrC&)b>L$DHS3=6#l$Fx|2s*+0Xi8I5&8A&>yAR+|2oV@H@XVcqN6tq}GOZ(ko2R z&cmxUK(7{x2*Jn2+J0*z2$WaKwuIrMvfd$_9lbjSy(5iy$sq>g`^_)wP;ju;v;~Y8yNPYdg?2fvb?CmKe-2(W zC3^}3)^14=aBRX`B{rz`G-SGCU!^;3r&;ydwnc0J%}_b#I&2B>ugzN;v29~LuZ!u{ zZZFnYD5=x36eTN;iAkXaQ5zNYfWgW;TaMQ;@mj5rI@xIAu&^PsBzzRTKuZ}XYziaj zcOXbA(OS~80;8dwpTe#k22Sf3<7886&q)9r@r{&-#U*zaLV3qShn^+gvnAk5O7V$t&wut;z0mCJ?FZ&XiS~h9sKY-;`brZ(Nd~! zR@{hlqC=GF-m2Fc5Koe8;tmg;I$kcnIk!~ijw|J>R~B*P1)XYv6*SIT4+TLLE$=!w z$zxS9t15h7HwxPqWM3%%-7(dGuESZKqwwF>|&l z309c$$7NAO4X)}HCq%<@!~%G3PncHDymypyfAsw+DCIR{%J;f_3eEpg zM1l)%Xqh#C{G3saKeR2RGKh5c0kdgO-`hPUM*S%1W{P9?RsiLz#o9H9LmuW9b9DmNsU8 zcR3QqCBnlf{v_A$8>w%kzmZvi@a<=?BQvsLAx38_KZah+K$C}l%L*_c3vqQj*LDGv zPO>|~X>6%hWv3m^DkNVv;2~ud-4&(_tQHu!mbBb{#{xN1JBY3j%p@m>?}@u7Q3Bl( zpMxczOnBDWqsJ~F#2xgu71n(x(B^w2ZvFp7maziFzhR~ShLr-hVRj-n|KzMR!P7vV zQV5MswU6TCqtsof|9%RlkMu{Gwe&~eZ%k?YD8-b<9bKr0j2Ir&e~K?5v^YM;V>zD< zg+~8BJTb!$2{m{PN71k)Gyj;RSt<~K*iPDdAfi{r4A0&!Z5Ugbv@GxVXQp|$qq<%y z?;DWz{%gLAqf8w_^0kVvQI-Hp%Sp%0pP11|%Mm`TC^-y6q~zQGdxDI|R%Z{@=fHv_ zrVYfGoYPt%JQzIZUjvqUzkKi%+C`BI#?Sl|^gn{FWKmb@E7<4Ut$ff$f?LvUZZa<|& z9rNa0S6wH3OQZ3EyKmuI%S->jzF>4bYl^*_7uXRQL2ee0wa?>&*3M2Ew!8x@z{$eg zO@yi-TNqv)+W6Yfbp~MH;kT(&u**}Q41FrE z;3W&OH_W08bRI>*R6-;&_~1ogRJO?JdgLlr)iGcsaB+8$%DzR(PnD*HaM+pg0=@{E z)qT;EH>w_n$6q@AQtZ$ta?`}e6wVT&*|GBivZszq%Y7_~Mi>&wjnBmUCyJ;I8y}jF zvG!fqu&hpR%qx1XP>f6D!*IEV9A4yzVNn%~BsOqn4@G#BKAAzB!%mLNs4FHCdhc*# zJH<*pE)8zB_jusQOvA>~NMFnfk{$yeV?)q=Jhs@fC5$Y&11WpWvVTU7HDgb1CqfgV zuA>B{yM?;YERko|mu={%E*ZQTgzQmLM&=+qlrUc_eGod3Ei1f<(kBWO6K(0qdw9nb z-hTyI##}+{r|ATdGV7E1e`Z*^I$FGhUI*$^!rCB8gRipxVZuc~3@V_Y9Y@)%Sog8FrA)IN%>Sy7d9G* zGgi1H{r}N&)eFjY1eSJ_8_|a&+=%|JkJ1oWz>RiLtX2ysqJTe&%q~TIlR#s+RJ5;W zK>c{uGkBXWj)AJHT0M7>=|Oz!U!jx2{ge!o3FU+cMk1q(xsB!R+nxji(?MtM4gG`8 zI1w!T&1!`VGD84@DgyI2XPo^Er5zTAX3=#^7eRfwTv}sv-xX_&Rt{5~4a%b!$zf5c z)K;%|u;ff3r7}y`H6fr0#J5k`Wfa}gq2c!@0u(I%2qQDGMlx~dIGtU=s|R;kYECAZ zeQL;5G3|e26^u##vA`7rpG7iQ#{nb*l(quTKg3X0RLq4ZjlRCENlZ5iC*Mn>?nv(T zz_nEKXfD+mxG@r5O2ZU{iXreM#`nLQYG&TS63Nb7=^Dgq7PaCxyn68F?Vu#2Pjf+T z`vW^$)1(5F52jHMsu}EHy1TCRKroV|o1LAd*UngU?s{T{d*{|A3Ef`V{sxOX%kr7| z@hS#?6_;^KW7r_8ubzG?yj}1vK!{Mg9{`EP383(VqTLZFG0qP=Mc6Qp-?7%)QVaZqQV9~qC9#C z3w`)6`C|xSH*;k8VaOZ)8+@2LQCTd7!d?Nwf5GeDk!K8R=mJcE-p>#UX%u7GA=E(3 z3}rLWc*c309?u@M)z@|*Sf5bH`hHNzhZ2pH9}U@Lh$Dq_pUKUzmd55*BYebrD~rCs z)g--8x4YZO$XTrhS=f?ij9(YT0VNaridrJ0n7-)hlSq7vnFYnHkY&}{!SQyFY^5cu z_IuOQCtr9!mNGQ!VlNc8QYIASZ@J1(-?2FFj(ZW4&EA382NKMRq{U%Y3_be@)cIrP zLnv(;RPKjx6O6|DX|L;=1k0~fJc;lPt56GHd6xht6bwMMtrEBjU9CKbNwEV7CM73g zCgtp`Ctz~PzH<-wluZp#prn^C!K$)&flyUyI1)$4$h*w?1T?9PjyT9{|E~+Ndaw(8 z?iPGtXJ0e2t_gs=XAH0o|M^n^4{nhpCAxkEQ^6gp2uh`r;c`M-Wcrg_E*t=6e}(g| zS=!;)RnRrqPe?Kr(cpJQGMF>+&;)}w{|S)`Hr+!kYHe)vhn;1PH+!fBA`6<#`h2lp zuA(L-%$Bw=r3e5?Ukwb_3t9a2_=}9l=o|;{&0}qXN_zN?3MjzrN=)BGPo~62HB?v z6TuxzkVpidQ>bClf^Gb9N#LGDYuD}j4uAme@AJOzg8cof`;b2w!Y3wve5ya``!fhI zhA>70>~=dG1i^bCRUE=iKWM4qh}ndv2ZTN$P5f;%`%p9yRa7N?Iu@jK0cL|D4^1Gu zp8KBBN^JnL;H%z~pqHLlvHaEseC2)Ur6or%de3{!n5cYjVCeqi{!^eoNij@y@4*!4 zr!7V3Cx)q3{K^liKt`iCl+<`AvCV zBbnJuj+x zg_(q`;{v-5jg?T}sj1PN!+b}y>T7$kW7fr-LJ?G($l3X!3Md=YNvJ;>fjKa2HAG=F zSy(aoSfUzf{AOmtX`R5k8EV8bfUMdVCpa*E7;(Z%0>W_Zi(zg$NgIhulu$Kk^v0*g z(*j>9jFj>`ixse|T9Q&XvZJ;=US%+b+8uCZBgBc&OrSE2Fwz1OhFoMs`ZyKW2qPUV znwSp4e}W^EYbug`QmBu{lY2S;ibd$r1L^GpN~}oUVi_61B#S=*lL;IsFmb>mz5P!O z8h676O*AohaJY&6^0=~u2Rk9w=%Y-_o?|a};A!cTuBiC05d*51!oJR~oi6m{yrUn} zarW=agd3QO2hO|Mh}udzU7P?{S|4FhHEvCT-7 z5emOpdocpe=!}5vN@ajDj?mscBXM^E#POap@epV_mg2D(zN&@`#8+wgbf9;8F-&A2 z6fje-ccZB+Z!8OM{Ddu?`V-4t#K@Zj3L5hs2pM}48_xe%79@y}TFy`0@m;~fkE2No722=t7SMqvOSHDYY#m$BFjrR4f(+K3Wy&-Ft+fZW2$(^{y@s-Q=N?C&E?eGC( zq=_i zs{HzPmH`l-F-qHFUkg%8>|l(&BRKm^bl}oS(c`!!7751V@EM>gIK6XHH_UbGy~!%X zj2_1oHKrISyqLboRu;%0Q9ef$=IOASG;&35wrX)4v#F@Oyq(C3RzgI#0v2wFz9 zVkvhGZzvu6a(6@UpLfblw(HV>@oOTS0x>)w2AoCJhUE82!vJGxjwxv2)+t2;Y&)1t z=sZ%Ii&0XLOFTszB%+ljes?wmAS%66A&8_`)l?Sd0=cNAQ-9$A@Lgk_!r%JOX}3q;>mkxBH2$iDs7)(K~Pz`~lWXTZn~6v!qI@1gV?7|;IEaT z#2^I}v+Zg7VA9NiikL=2=|VGeUZesQ_9qxC#((RPrZiGUY{Hbas$Xf;VS=w+SE%#&Z}N8nQ9x%7DpN>KWm#YqBm7^C)oI9;?ow z6)Rv;TjD>8LR&=EhfvcP`dCaU16LfE|^J!{ch?w~UcpJk6J0RtEU`0mk8tSEE3&{+&GG?{( zG(Y)^QSE+aC5Ij6E~p4Muz?&Z9OWc-Ezb=ZSsSCh@WJU@&tOyILEL!+6)y63QL7@Z zHW3zgh89yF6tAT|IF0?VXtT~%j*B5oR3C~hhB0eRNyk$4i#x-#0$8QeNbEParAU$y zYo3Z*LPcKUA?#uh+Y(K8-C&Vom-bwJPXc87H0j)9o749KF3V+FsA*_m5sdam4Kdir z4K|&^$f%Wd?cV{eInR(aiA~EfAW&^1{Obf98=)q-lhI(Q)CgOMB+>bk=^*?Uyp1tx z5}`o<5j4fExZ8 zW=$fK(g+xRp0p5|#l!p)h@8d&>u*Vom2vJ|NZ9OT5OIlWTiCKSg&0aeDr>XIJuk{x z_(1L`{|B4B06b)lFUY70DKxe~=&4S|v;dD77gXg5BB@=b-N2Bof|Y>KU>7P?P+bvG z8WG$EVgn@XUB(*f5bjuTh)Y7CxNG4vwhN@Y>-5V?>Wubu>ujXd!}m z2XMq4kYYiXt$1xjaMRzTV%$-P6MMX&zs!chHzZ&MYleBiIzuBxq9+C}T^q?RV@Nz_ zJC2zHU#+85G+FPuP3m|a6Z$-VU0%3?{o)eElQDiB#JL`Dct94D1cUX}z9|K+x>y(7 z@8s?$u|SD#XqXl%LgvV9hq!f>C{cEcjKyP%MeulS=8=0QXe3!W`vA4!W1wQ7;4?fv zgyZlCKf2sIkEni>u6H`?ap3${h(#1kQ~O8KxdHqk+eS9xeN0&m`aabkgU+KBBcg}n zvdu9C_AEE$1xmr3qbFQ>7_ocVy7MDtM3kz2k7L_3vIp?%dnq9?cu!<&na~B_ParISsZU`-V?SRnErnpkP2z7cpaMNW{cy@rV+(bcsnp zC`e*o-w(%Q*J1c&pwd$K9zN&KPYtLIRbR(1m6}IMDr9nii}b|_A_6wz@r{A6n*!{Y z8~{)j4%NcIF;UC% zNGGFn7FngN3>q-dCM7^Uv%@LKW!P4m8*hXA4*40>zZ^jIv9h1V9;Z0-O>pJXNHfp< zb4o*!`8bMJJ_J7=BR_8Q2>YF~5-X0txs^PKy;_IDpXM&B=tb^M7D3L~&|7$QzVbS# zi-3=+SwSwOfs)=Psyk%i7Dkk{UX|XnOBk2IQIL;#@);$`!Q~`wLA2VF>|`G=*w)+K zSx=kSYv81K8W7EF7HUUdTL+dY>Hs&N<3B}5qTp(FhdZtS4|BoKs@C%)hakJ zDTJvUWI`dh5dkC^LQc{BYP%C-Wj_c{NE!AS3I|AVFgT=Xl4#1t1;AJjl&OJdxm?Cn zG{}RwW2!6cuo;qQlH>%kC3M<&qsxBeoNd6D#XTt=fTFM1?hA6teq7t*7{(l>mTB+U zS8pE^w40xr2!90l5Dj6OQD7b2e*-@q{1tRw=Pi4&X$O?ofQLx>xYlxoK6Z6*00`2;asKOiYgpsI?JKQXYMB$Fh(X84DOLIJdV~=d$Ao> z9-D=uD9JcJ^O*x64ivFr7D@^U$rdb;Kud8^a+(j5L_$J!j?NS#~BN+1#voq+T!e4fMr1O!Co4htyeK89$4GPul1Ij2kc zTLe@BrV^v!^uK|v*SwCTu1A>HU~nEWjeWgjwNA@SR`6&q-o^QoEZP5%dY4B-EY)%tX01 z97hW1S>`7Eaeff|qdoAa#(*15Kv#tCZ<`zHiP(k$s587-MB}H};8A`&&5wQvF`>z- z?d0DjE{Li*JPsTf%j8kKXB?^N6A+d2*1^{Om_-0En>dQj!w-Na>1!l*8C@gsz5gTeu{HSFoY%2rPwgPf5)vq!H-bTw>X1W=Lu=*#Mga zY}pmfqG|rk;!idhhv{9rLIJEn6o`;~o+<$GoSkMEU2bZ)GbhJ;~ zA7Zi*QV9-EU?sx8!y~SV5wD*zC%Pr-M}>HodK&v@gr+e(l^V)}O^!${FXKbm<(Vp8 zDE|mo)`zl$A05z&H59=C9KjlTV;J@*X8c0V1tg`{25x6MdFa=GuRGcB4V)Q-uARXV z*yBCJ2s3LVhf^!Oe^fR-8mRmxUU;qrV+L7@6}dppX~n?e0e&uvyF%STTQ(Vx(Ft9Y z)?%bG;xl*zElL3~z>r#QO;rp5lUiYfL>*jX0R=p&r^)K*XgPt{eOrE)Cfa}|@8 zcridJ4#R~92?omUrm!~&?Pt>zil@s`t>3(?KP8G~*VBbq_=CJC+5>oLy@doU2CwLe zjOm{Y8S`iyHjFkx1ezTx8lltP$o7b9+BCEr+AJ*WdMOMWLkIDQ{F|2obms-|r^doh z0Z78X$`66mQ&`yWG(L($G{j5kIw^`r=#HL{QEM`83W4GsdfN=Ce^*6Y(J)uAgox+1 z#sh4r8hj8+$)h9%jV8MLnulVj%t|9_tJQp#XfTv9!6@AiB%q&yu29w$8~}<@)G(de zdajd3#5n{*Ks{`+&=`RcVu?LLeBf{7zMs&!@5MB%PU+P4IIaOZAWq^ciYUQ;`yuk* zO%}YWQw=Jd+5X$-^n`bz1c9C`4ABMx+K>=+5FzaqNy89)PJ$%s*b!a(FiB;>3c0a5 zzmv8YfTKb-K4q8JK^fvYU(r(N|ys%U#6bc)@K!`a; zn3#-xWd_>9mk34woVPr~qbYnCdiX7#6=|vq4j$6Q2!XKo$9aRv_95fbM+Aln~21F{RUT>?V- z=`W=gQtxQz>-O)>f)`_=wDREwmJ1P81}mqG86Z%Twj{b~jbc}F*DgzYQV;|Y)Us1R zi+jm|j@w0c9Pa=howjgX!KcCky)e+F5ma8^a?=a?KnOJ3tn7InevPZbR1l+t{576P zlFsmDtlymFnuB>%?vi$TX@WV)xw4`F+2k~wS_slfE zvI?HL#X1Nur1;s7K_Nj!FMx{XK}FvIN6mtxj_hRD25)DuoH^`1k^L|$+>|wEhH%#{ zeOIpQy40MxI}9$3eJ0jM?qYWb;pCzLZAbl$u^^UelM~WLt9mAN4<)z6vXQi;35u59 z@H9m9RqU_gROM&e5YZ4FU|$djaowi@h}Zb%~=)1U=#h`~FVZ>8JZ>?YkA>I`>A zR_F}=RbFA$Fop4ZNHZ;Ewrrnp<|P_yN|Q|} z5%}J}!_8_gfkYm-`v}EOs^Cx`Mk)bx{#hmL2`DC1)BXY^M8QvzBIf{=uAvd$RHcM^ z-$i5)4cvgZin>djvM@+clq?(FPQ?nS1#dy(^eD2Fb9mW?uvG!}y<&hBe!vlQ zbqk$ndM~<#n|QzH&DhbI%t8_(y_c31IngQy9W>db=;&`Poj)0yBUM|TAw0`1f6G}P zUM-iGw~#od`ldShJ?NLTdEd8U7c}fX5u1NaPv^w-hi)BbXA$p$q@)cP{I3TU?3dM^ zQrkQvF3P#?XdD@uzRi6W-V#Xs7&Thw8qjpTrNbLN5wCk|NlM@JqN5`rqT{%r?3iu> z-IRp@5D2nJWk+}^9Cg_Yuw2&NF^@9Z6#g`pB<169C8}L9Fa>ZIo>0mi#+U#%wkA^u zT?@KJVmzjZr_m`)?y8X&<9x`tPj)o0^~jC})=-3f@Bm@TXhucQ?LREFJ-tE_4X`cY zY2j=7=hOB)y#$O^_B1Yy!c71+3}GS#A#FVIh+427_jO@YVjQ3_E|@f1RYx!JFuRp} zU$uqp6BHix?{C-ZwS|uI0rkY*C1Uf2wh5cZooHV)(rb%vUhIhkC)QI>b=W_<$$xZ? z(Gaa=&6xc4=E}v~+_enG2@+`SDr&>kS{rSaR#lKBiF;zihMk2w_GxLwRuhoW6_9Lq z5)F*mK1f&bG5_r>*!j1~{l)0L{S%yv1Z9V{-PeYG9os50V@&u2z!e#mLq-0TF_sex zOM;i61TmR7k-RV^?4XMr6t=fMai26((2@3@3RH;UR7xrUivQppI3Ws+f8 zz(yx|g>#Uh6=~c4#jggpN50D*=@-zYu4YM0)QT#>v`b=p0$fsCtSu!V#Su6(Abi4; z%`TACBry8b@MfW;i)EK^q$;o7M)zYeed?gZ3!n%Q-x6i9&szv7BNhG>KB64SS@?hP zH^u+(Fi#E$e~5kQ6CqiXJ?6nA)*XYz{f zm?#6$A9$-=E#}dwQg~B3T^xoDTM4LLLTvasJaCgj>l=7y>iAF=R=_N*fCwWv$Z!G_ zqRi)M9n9wuWRSzoD7g%FKEdXZ>0EX!^BnGn4wA`d;ZMn!&~WexZ_4`Pe!2;v50Q!d4PAH*b=Il(BL0ZFFKmM5xALthk8rIf3LMDnMG!(RvNYn^` zl|RVaxOY);pYiJ0Hi~3BOM~mT-u@Lj%~SNK92j*>N1vvTrtd?R~JC#asA~M2vs4_-nt751^5h6@pnF z8YeatrQ;l%8{7pd`nh`y2BpCtTIxN7<|Ad~;7%6y#&JXoLF?PWIoKTE zpoRynEWiB^FE-a?(@+8nVM$Ms#MTJ}DO3boQOIR#v16T_1Smc&f*PYItWc>?$oMpY zQzA$RqgT=Ku9TYCCC?Z>prNo+%Nw;i)u_Ip8>3)sRGOD%iqZv<03-|z*5GZ-q{_d@ zhlt8SHGZ01O!!L`$5CF5BK!^B`kVadV~mXU*JRdY(anUV;ek;;?ZI)Z@&u?e43paU z(C2u*ggFCj!Ql1#0`^1uP7# z@x9Wm_T(4NazW;3fszf;b%+ho4ur>b#KO?_Bb-HvD{1qHTUV&Cyb-a%g`Xx?aq>f2 zUc#sNag-lV^FsoVgs1j%s2x;RCs_yq62)EjaxDY{fpufxkz;~+6PY6jOhQvZn8|M2$1U6NMS>N5mFr5B*8 zQg3N8I~JJ;a#;14=qMNrTrQMX)zpflt!@;97SB@eNUGzXtVEd*GDQ1z#V|-x*%n|@ z=$X(lg+nhAX*#%|P27rz2{{u=*3Z2CSv>PJQAW($qa%pnn*;%aNNJDAx(ws$b%tBn zl1$6Wmd2aH?3Ok7o&m6kgst%sd+mwsRlo(Z2GmU|6D{(m=7+wr> z#)RoI?|S0k3sPvR>b5wTXza0C4V?BW2J6lA8dH%Hbz|voTA?SOU;vQ0-I!{$n9FE; zsNlrJ7MInjafLZh|BUKMliO}K7ISaH@f4?V77vvY>*EBA+$1iNTSP;8QvC4u@UyrV z)vcS1SJG7#!=t?OAK}9Y9>0&{D2w`54zBizyA59jn!ZjnJ%k5Rdx(;GAS&ey{*58W z6Wg=tYBt?oa*LuwPm7`yH{df!K^Qo|@FDmBfMT+pmf~=bFCj-l4eaFC2G@qxhRJo{ z0U3s0gXl|c_jYFlTW`oOi@q5kC^_C3Jtp*=K29C8#0Sc>z^u+8MuBSC1lJTB`I9ekkLn2DXIHIf30|m+KELLc) zV*FnwE&w^8WP|$Z+4=^O>>=@@L|U@CP|VrL5@Ysd`HM3NsBgfKZEk>svvCiUW@Z>B z-vAl8#FA%71c5sYaqbu?iIanhGEST(@xhpux8n8~7du^EP)aj=H7rY1z(gIN@?JwU zN&7~DMc8_;zg~_FyE-7CvPCrX0||XMNv$jsN0TmaluBO*f2NX@qe}qAQ9luNJ)BN! z`hnoVX>XhqK(P@o2}*nJj1`VpvGM-;)ilNKTa2}2VZ4@72Q4R$CH z88=_xA7Ct$a@z)X z`0XE;RAIdOtz|8U_aQ6sO|rn>3(7LHzP>9}NnU&19d3* zB_&*pCShaJ)6|Y7sA6uUtUR!$inxkPX0JVmgnfL@%MLDs>4wPp=jjmvJOQ=tHUt2$jig@-MQ_A@N^!vq9P zF(DCOGx+K@RE|3R`B6eL;0{#{w)d%+CFiQ8#Jq#lSiqKmPp}1@rP!9PJmUavKe$cG z3A7qOaa8OH#M7>W=u6uA$`YU&#=-d%fI~Fe4X|w+y8yW6^kwZAFhFetfOuY=iO0o0 z6Tf5&FS4+n4!WWMAS#@Ik_ZvFiUOjWuxv1$-J3Bi!uHg_76hXIdD$O!< zJ6v~4m5JXGFqJV~*_g?CF}0jsWJACk4(mAL{B1)zr%emZq~dgI5&jyGt~Xgz803qk z;oZFixVg$j zpydRWb`2>`SPWskWI`-A=gL$DufT>Bv%$?$l^JXRwkJ5}pOJ*Zlf{V4tC2reRW2#wiss06jB&bz?Kf0r zDy%1MX)znH418l?02(JgIpD5I8q)i&Pm9-yM_6CV5gI@lTf}+hKYcr^718}L?VV-a zB6_P7qH+`%8u44TAvQr+CxltqX4q7@%vV9n!@Z~%4q!md(oRd_tH@-8YA`+m8~P>Z zPdcK^04S+^9(8r*&Xv%I(&FreIe2O%T+BFG%Z{4vJm`9Mwedo=ICJ&trHivOOBb)q zmlm#ES#tb3dhphdI_)i*x2T$igl|+GqC+5AHmZ+1xo1ve_bu8LH!hJ2R1Mf7&S3yR zVghxeeW#$Obr~FJZ%klRyq}J!5$W0qsuPE1_X|Oi8nPX{a7|6mZI|@ythHOsX~xLu z^%F4xOAJ7$Aw->9rQ&5@SiCYXt>}P*WCkQ)gZ)MQD{qET0>;~j^FmXa9f@24>~zg@ zx$NN8DRzZ5w7Bg2r+Wx=X;16eLu6DT;11D%FiD528>$++?o(IW4~P9dZ@Yn7E%Eyh zVYrE$)$jSsl(RP-9hT@9;Q*RZl*B_AgiMD2`;{Zh5_G%Wd;lD&Y`d`9{IHAv{7;_!* z-dPqBVr~(wwz91;6H({@UV;NS4+rq%P9D}*rb6dgEks9k=ReF#R5vWl{I7##KUjSc z)^j`eHModn^J5(;AO(X4cXIdA;Sck@c;^s*iNHkd6<$VknW&_9k`N)#0lZkoAsw?d z5dis42AURI5$y&0OsNFhrLIZefMcc}0BXRRbjFIbjmODYAjnvN#)=u6jHJ<5NkD~N z;|UWYh|(j5e1M_wexhWz>+qWObDMuc-NS6;xwm}DpC>}IKgfRj$`8r^? zCQ*G_Ef{gWPxJPg^B&A=Q{+8WbKgcEwqU@bJvgC+>ky#|JoF&CkU{L!aOOxWYRwIq z6j51}Ko8##%$lxsIJUL89;G<2g2ZD<+xui!5nZ^I+|Edv6o5F1TIj)CS)Y;Z6x%VI zlAwQ%L08gRRQ;HOcLnVtrV&Y}cn`%bf{~L~!e%%gK!hKV-EdJcCNTm~zj0bKR%j#p z#`KA;h_D+5E7N7R#{!b=lNiWJX`$_!qcrW*)B^VC9@Qsq+3?9uCFBMvDhQH~@FkMq z$(i#s+nEE)LDs5u1unV}N#(@)A2xQlgZK@A!RO?wb-lWRT+9 zq?I0SOC3g~HN`QzHv1X$DsTtre9^P^(e|^n@|Db5>E{zsc#WtV?tMe zwp_uinYc4fYgpzq{(o(q&u<$=6vu7XKgOG}W8=7X($Xd^p_mr&8+r)60Oo{MdO`TW z()=iLNM$h_q=JyR09Pag5}Y^y;@5#Q0?r(fI3U;q5)$GsK;nex_w&X!2oh&MJG(Qx zv%B`b`SISo`H$V1CL<=-G+oi))7Y1z=52g3^QaviXMe1DI*)3xo_SNQ%dk@#yb{iJ zB+E;qS87|E+4^R1gs=%Q5|Nr6ORlAftk?-8;?n?)nh&lIZ`l1?C z(Kr~dx@srravstd$BmghiZ>D-*1l*6`~acP!70*p^);kwIi+!KzigHsTZr&JI04=w zX_D=!5qg-a?lSJo^ttM@n7%OCGt0y92&vXIY*r0D$*j4~H$9kKlb6)%d*fAgfbBBt z_MS{0Z=~|5Hun@gZmNQt-avt~OMK|+T=^2!!^drqO&EKsajK@!xfEj5W14128?z`> zmD&o_AHpY~1l|KEWWpcd2k;ZP3!tSAZ-T2}8(aee@P?2(X_IwRhc8F3Qg0Js!>r#W zLG!32B=J^~+u&%it2OYkZ93VaQ|1K)sefq9_$p3slrXYdO^Umku1L+~5;9lQ?y z1Uo|RG0&dt#Ny3dF^9j2R86N4{vxEBQNbqY4lUtiHpOgq{Ld0LD0`>W`X? zr`god;zD=^P+JYp0;ELP2D{)N@nE4XZuJR)CF7j#YMH-Exm8{&d*@u$)is8iC2^H% zr79D1FQf8*e=s;d>T}foq^5Jbaw%>F$S+5rTwmaope%YV(iC@)Kx3$!@ z^tCK$>9F=q<<#`&{D!akx^k|&p4(6^=iRN!spXElcGB0nr(E|H({wBDgj@5ceOI}) z+(o6V+A|zn4$t$9_j#yR5atTyPAxNgtL-hz>t-@AogQQXS)11|gQ;k;NelHIj4|NfyO>W{ypRL~S7?z?{8N+Jy#(v=)cV zY&E07(@0Q8oprj zG*|~4;EXWV7?T5ujx3yI*KJ@E+z!rxJAlcWI|-c^@*18ecv2VGax+nznZO#?qHRMK zHF|e*&^_Q@aGx+vX0x1dhWpuTBL6{!ayK8KWrc*53VAhFp5qIL2#-RBSLdkrDtBA4 u0J_8%kddQ)zN(*4U$KuI->sKUY6g_P*#Y;97b@&ODG%&&5P3|mUi&7Im#t+0 literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/site-packages/flask/__pycache__/blueprints.cpython-37.pyc b/backend/venv/lib/python3.7/site-packages/flask/__pycache__/blueprints.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..34f7888ff981a272e61ec1893bca936979c52285 GIT binary patch literal 20472 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 literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/site-packages/flask/__pycache__/cli.cpython-37.pyc b/backend/venv/lib/python3.7/site-packages/flask/__pycache__/cli.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..29cf9e74593d286b6cec1680e3c00c024e3f5b2a GIT binary patch literal 25067 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 literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/site-packages/flask/__pycache__/config.cpython-37.pyc b/backend/venv/lib/python3.7/site-packages/flask/__pycache__/config.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6ec9a53f942a636bd4b55541cdb92f13273df3c1 GIT binary patch literal 10210 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 bcCc5iWjNb%u~b;TYrklJ(RS?0@>l-{J!+~Z literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/site-packages/flask/__pycache__/debughelpers.cpython-37.pyc b/backend/venv/lib/python3.7/site-packages/flask/__pycache__/debughelpers.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6fa1a4190cc07c2fe80d049fe93548b25ca4583b GIT binary patch literal 6625 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 W!x-`BuJ|y@bIZ>MXM)qg<^Ka#sub1$ literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/site-packages/flask/__pycache__/globals.cpython-37.pyc b/backend/venv/lib/python3.7/site-packages/flask/__pycache__/globals.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9062852bbf9f8c7160cb44255686298a77e9d988 GIT binary patch literal 1777 zcmb_dQE%He5SC;)ww1(5yJEnGJ#c%PfmL>j7HflH7@B6-fFcN%00RUJ0xh0x#+0a% zloJ=(9-94`{(=2~{S2W`+tdESo_3^_#KHQu(dLPFIv>CL?npo1-i|yRzy0yiPp>vS z?@y~-j}RB%;M8wWFfZ|#&jR7+K@#|O-4d-lOv1dKv{4U}4c1ONY=d=v^^z{@vK~Hr zEMlAZj3B)7l1(SKpbgQLpKRkZfG*p*3Q+4e+P2enoYrG~r|q(x6K}9vy+a@o!7&k3 z&*Q0(V=A<>{IWhGXLUVtW42x4YHR_;WO&mc1zP1F#ofRsvJaP%|Mxn-47P#712 zW`-|-WU?@DVd7QX{Y;ii#iui~Pkw((9*y=!WW030J;uGj#s-?lF2cUx85A1!$@7yJ zUl0vIUVeXYcyw||CQ^}HA^--4a-rksFU-#y_;shG%5W+MK^?u685JjnX7gr!jBuB) z-~A}noEK9fE2B9BA}2(_s|vJPgL^vT2xeJwj3JgJ2U;|VFJ(ojF_4!Am`%OXKqggz z3Cn^CZfrtGPyxVzMYJFd7vG(p9$)Vi6LKI6T?yl|XELjDq>kDc1iuE+Sd5ry#0!-9 z>J=R$YBH1Oc4NAb91&QgSc$QKJf@%ep7)*vX;~tjs~ER6`QMU6FdPf5CNu+b&dtna z)${{d-+a|W=uNcD(U&e`aw<^~3y5qgw$g@FC9%Z)8}%wWzKC(AO)8%ckk1or5Ny`y zE|)j0vc_VZAxUloC|fuWaB70WcxV34{-w{nc~^aC0@J$k-}olH^e?@u0FRP?G-%iN z)23n4%v_|}wOGr@vflckDh$uzP${YE2Y1{+sWjKqx--S5HAZ2Jh6T+*;qBqQ_0%Rl z{$|5c@dY(7Tu?QfNWnnqVXlVbvow9GpA=s%*yAiM7mr3}@^pHp#NOn|vuDH8Vadyf zyg)2MJgoBB9^K=k;kWj*58as`HfKIAmxy0TIj>5KFI`pSGu&NwQF#7_-^GvG#`S+C zs-L$m#Id5b>@RLW+mI{J1GL`-y^EF%ryI7) zw!*HupWwn(*So|kdA+)q-dWgGR`t>A7Ny!jHEH371OL64dMRF%%%(Cz&%03Wp{4FL zjZ$|sXpM)v_NPaKdvzyGu}{;q?zx*oN}-j7n)J^>&0j+`jfK6wl zqim+i?xEUNSm4QKbK)!@b>Eslu;PIgw`{tVqqO@~E?FhuYirUUqX>g7f43KQ!&bM0 NpYDe1hQ8nT{{e-%^N;`l literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/site-packages/flask/__pycache__/helpers.cpython-37.pyc b/backend/venv/lib/python3.7/site-packages/flask/__pycache__/helpers.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a2269b9b01e7dcc6900d0bfbc7b9ad4340184c94 GIT binary patch literal 33264 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%0AEUXK)Yd@qdXW3YCf) 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�#oqLzzZpJL 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 AS^xk5 literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/site-packages/flask/__pycache__/templating.cpython-37.pyc b/backend/venv/lib/python3.7/site-packages/flask/__pycache__/templating.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e618ff904408e44e9e7355decac102423f66bd0c GIT binary patch literal 4987 zcmd5=O>+~;8J;gmWBC)-5Fk``Af!NB#s+F(Sr@g%_lCrAs6YjFimmZj-I7Nh&B)y& zV_c&g!k$t|j;S2+ac?>02jrYzFvsMye<7zlZ}(^{yI_+;4jEUs`n&sm-{<}E{n^>3 zf$y*XIQ#XDj|}6V)ER#c8h24-j*1z+!AxewX5aFyzU@2xnqM;wW-}+Q_Zxnr@A|Il z*W#&u({J{t{b}^;tnrQE&wObxmrZ?Ruqp1mwS61?CYwfonp^14vKcmub#rWv&Et2T zEwB^#U0^4l8Lf|of58))9==W-%I)Qh_Xly9MM+l;{^r=%RHIL@hWB}rNiW;t-lm9H zmwQ?2{VYm);f-azYPFpX-iWBXm92Vz`_{X0?fNxu^Nrf^G>l_TyLs4OR!6SJQJW`{ zuX^{NJzVl6=ib_r2andDJ@PuK@cOCX9^+XU#d5j%9o}rT?4o%;lzc4>85hO$qhvP{ zX+qB`7M^P|_PKOEm&ZHeyaWW8mXUJt1w6ncHW?_4~m~CEUuSeHb9upK-6d+eh$^ppb!JFda zfN73Y5>SGxxB*Qw7KEwNDUqR2C-xZ#`3@GWNgHiI;v zA`Wv%3W8+2|MwTE*p^-#ZF4X51n&;xP?Ui8_#yVZ&0*$kh0>F0A1fJ)GRPo|l}NUe z^mWWhS<;TTmA>{ArI)3*84o#Fm}K5-b&X7+Ct>DAnb!^zNShCUMA98~P7>m59HF$Y z+6n~}yaTu3maY~sE*4Q;L6I&h15%wa=gj@ZiDQ??r>?hZ z1+E}A;fiJu^iwvBsXY?}JHs$8XBt7k(smH2vnTE&Pz!Y_G3O$RB%AFzj-}AhMyL8J z7~RFt`(eatfK#os*mZ5M{f4&FzFS)8DK-b5&KIX2Msg5l?JZzl8B}fI_FvueG&?mk z;xq*w$v93(I#G}SOJPo7#nVLTK9ozr<|tfBH9dw1qK3)?6iGHf$s1k@Z!_0hrjk+1 z5~nex+7oQ6#Plg`rc(@a|KsfkFSwqnA(D?mbx#o^I$>B~YvzD#ME2by(x^TyAK1OiSJUsL>yjqeSH2}^TbN|8zXg}OhQ9p%E zR221pMx$$tpk*Ux?-l5UCLWj%jjz{VS)i`Xhi z%mw)o7&U)}@y%g(i^l^v4e?`|Cp*xZ(irn--~y_`9iQsknbQ+Gm|@Gi9G|%m4t3-3B8{A%GjBCiSptor=f4QAWb;r8r+f6JdZ|+E8;R$ ziU-Fi{}>ZbQ6%|q!_-vI5iBqN7j%*yRBnRgWuvrFa1v2WD~{3R5f`_ zDHYdV(rXDAAqSG-{4v7-Q;-L(AV{i5WU45QWT=u0s8r7)Pe{kl0 z9^YUTiOo;A~>UH0HntBi9C^Iij zxX1VKNO&k57RPuGB4(Z8sgqVUWhJ?q7GyLLT~9bbL@u||Va#Y}xQlF5JuFgT*L&Ym z9yJcu$IQ?{SF52@tyzdv8^9lE<*w8^DEBKo6jRzfA}aAuQwRZ`BWyu?rxrnrrf{}C1+{|788$W_Qf4n?7wCo`l* z`X3TU!8uNcm%Zm>SR9ILEa7mNrChed0cS@6tWVccE^lh5tV*oLeEcwQ|F5tkZbD27 zC*l@b{xm5#{>4G8LxNS;6e=7Dic^o{;Pf#Zlv{s?r5X-XB^*{UvfetO47*=fkh~!% z*jK5MpcGsOcnzHjO7))wg>=86?Wj~XQrS+GmMe>{-%el?bj8H`Dz8wucXTHAMH4Gj WqK|M6Hgmyt=ND!d?z>a&!oL9)YU+Lf literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/site-packages/flask/__pycache__/testing.cpython-37.pyc b/backend/venv/lib/python3.7/site-packages/flask/__pycache__/testing.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dc63f692bce97c93a876c88ae4b9d39f25cf1ee7 GIT binary patch literal 7860 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 literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/site-packages/flask/__pycache__/wrappers.cpython-37.pyc b/backend/venv/lib/python3.7/site-packages/flask/__pycache__/wrappers.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3abb0e74edeab22d51408d34b286bf9da5f10e04 GIT binary patch literal 6794 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 CM@~`z literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/site-packages/flask/_compat.py b/backend/venv/lib/python3.7/site-packages/flask/_compat.py new file mode 100644 index 000000000..dfbaae94c --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/flask/_compat.py @@ -0,0 +1,101 @@ +# -*- coding: utf-8 -*- +""" + flask._compat + ~~~~~~~~~~~~~ + + Some py2/py3 compatibility support based on a stripped down + version of six so we don't have to depend on a specific version + of it. + + :copyright: © 2010 by the Pallets team. + :license: BSD, see LICENSE for more details. +""" + +import sys + +PY2 = sys.version_info[0] == 2 +_identity = lambda x: x + + +if not PY2: + text_type = str + string_types = (str,) + integer_types = (int,) + + iterkeys = lambda d: iter(d.keys()) + itervalues = lambda d: iter(d.values()) + iteritems = lambda d: iter(d.items()) + + from inspect import getfullargspec as getargspec + from io import StringIO + import collections.abc as collections_abc + + def reraise(tp, value, tb=None): + if value.__traceback__ is not tb: + raise value.with_traceback(tb) + raise value + + implements_to_string = _identity + +else: + text_type = unicode + string_types = (str, unicode) + integer_types = (int, long) + + iterkeys = lambda d: d.iterkeys() + itervalues = lambda d: d.itervalues() + iteritems = lambda d: d.iteritems() + + from inspect import getargspec + from cStringIO import StringIO + import collections as collections_abc + + exec('def reraise(tp, value, tb=None):\n raise tp, value, tb') + + def implements_to_string(cls): + cls.__unicode__ = cls.__str__ + cls.__str__ = lambda x: x.__unicode__().encode('utf-8') + return cls + + +def with_metaclass(meta, *bases): + """Create a base class with a metaclass.""" + # This requires a bit of explanation: the basic idea is to make a + # dummy metaclass for one level of class instantiation that replaces + # itself with the actual metaclass. + class metaclass(type): + def __new__(cls, name, this_bases, d): + return meta(name, bases, d) + return type.__new__(metaclass, 'temporary_class', (), {}) + + +# Certain versions of pypy have a bug where clearing the exception stack +# breaks the __exit__ function in a very peculiar way. The second level of +# exception blocks is necessary because pypy seems to forget to check if an +# exception happened until the next bytecode instruction? +# +# Relevant PyPy bugfix commit: +# https://bitbucket.org/pypy/pypy/commits/77ecf91c635a287e88e60d8ddb0f4e9df4003301 +# According to ronan on #pypy IRC, it is released in PyPy2 2.3 and later +# versions. +# +# Ubuntu 14.04 has PyPy 2.2.1, which does exhibit this bug. +BROKEN_PYPY_CTXMGR_EXIT = False +if hasattr(sys, 'pypy_version_info'): + class _Mgr(object): + def __enter__(self): + return self + def __exit__(self, *args): + if hasattr(sys, 'exc_clear'): + # Python 3 (PyPy3) doesn't have exc_clear + sys.exc_clear() + try: + try: + with _Mgr(): + raise AssertionError() + except: + raise + except TypeError: + BROKEN_PYPY_CTXMGR_EXIT = True + except AssertionError: + pass diff --git a/backend/venv/lib/python3.7/site-packages/flask/app.py b/backend/venv/lib/python3.7/site-packages/flask/app.py new file mode 100644 index 000000000..c570a95be --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/flask/app.py @@ -0,0 +1,2334 @@ +# -*- coding: utf-8 -*- +""" + flask.app + ~~~~~~~~~ + + This module implements the central WSGI application object. + + :copyright: © 2010 by the Pallets team. + :license: BSD, see LICENSE for more details. +""" + +import os +import sys +import warnings +from datetime import timedelta +from functools import update_wrapper +from itertools import chain +from threading import Lock + +from werkzeug.datastructures import Headers, ImmutableDict +from werkzeug.exceptions import BadRequest, BadRequestKeyError, HTTPException, \ + InternalServerError, MethodNotAllowed, default_exceptions +from werkzeug.routing import BuildError, Map, RequestRedirect, \ + RoutingException, Rule + +from . import cli, json +from ._compat import integer_types, reraise, string_types, text_type +from .config import Config, ConfigAttribute +from .ctx import AppContext, RequestContext, _AppCtxGlobals +from .globals import _request_ctx_stack, g, request, session +from .helpers import ( + _PackageBoundObject, + _endpoint_from_view_func, find_package, get_env, get_debug_flag, + get_flashed_messages, locked_cached_property, url_for, get_load_dotenv +) +from .logging import create_logger +from .sessions import SecureCookieSessionInterface +from .signals import appcontext_tearing_down, got_request_exception, \ + request_finished, request_started, request_tearing_down +from .templating import DispatchingJinjaLoader, Environment, \ + _default_template_ctx_processor +from .wrappers import Request, Response + +# a singleton sentinel value for parameter defaults +_sentinel = object() + + +def _make_timedelta(value): + if not isinstance(value, timedelta): + return timedelta(seconds=value) + return value + + +def setupmethod(f): + """Wraps a method so that it performs a check in debug mode if the + first request was already handled. + """ + def wrapper_func(self, *args, **kwargs): + if self.debug and self._got_first_request: + raise AssertionError('A setup function was called after the ' + 'first request was handled. This usually indicates a bug ' + 'in the application where a module was not imported ' + 'and decorators or other functionality was called too late.\n' + 'To fix this make sure to import all your view modules, ' + 'database models and everything related at a central place ' + 'before the application starts serving requests.') + return f(self, *args, **kwargs) + return update_wrapper(wrapper_func, f) + + +class Flask(_PackageBoundObject): + """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 should be served + at `static_url_path`. Defaults to the ``'static'`` + folder in the root path of the application. + :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: Flask by default will automatically calculate the path + to the root of the application. In certain situations + this cannot be achieved (for instance if the package + is a Python 3 namespace package) and needs to be + manually defined. + """ + + #: 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` which is used as default cache_timeout + #: for the :func:`send_file` functions. The default is 12 hours. + #: + #: This attribute can also be configured from the config with the + #: ``SEND_FILE_MAX_AGE_DEFAULT`` configuration key. This configuration + #: variable can also be set with an integer value used as seconds. + #: Defaults to ``timedelta(hours=12)`` + 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 directly to the Jinja2 environment. + jinja_options = ImmutableDict( + extensions=['jinja2.ext.autoescape', 'jinja2.ext.with_'] + ) + + #: 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': timedelta(hours=12), + '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 test client that is used with when `test_client` is used. + #: + #: .. versionadded:: 0.7 + test_client_class = 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 = None + + #: the session interface to use. By default an instance of + #: :class:`~flask.sessions.SecureCookieSessionInterface` is used here. + #: + #: .. versionadded:: 0.8 + session_interface = SecureCookieSessionInterface() + + # TODO remove the next three attrs when Sphinx :inherited-members: works + # https://github.com/sphinx-doc/sphinx/issues/741 + + #: The name of the package or module that this app belongs to. Do not + #: change this once it is set by the constructor. + import_name = None + + #: Location of the template files to be added to the template lookup. + #: ``None`` if templates should not be added. + template_folder = None + + #: Absolute path to the package on the filesystem. Used to look up + #: resources contained in the package. + root_path = None + + def __init__( + self, + import_name, + static_url_path=None, + static_folder='static', + static_host=None, + host_matching=False, + subdomain_matching=False, + template_folder='templates', + instance_path=None, + instance_relative_config=False, + root_path=None + ): + _PackageBoundObject.__init__( + self, + import_name, + template_folder=template_folder, + root_path=root_path + ) + + if static_url_path is not None: + self.static_url_path = static_url_path + + if static_folder is not None: + self.static_folder = static_folder + + 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 dictionary of all view functions registered. The keys will + #: be function names which are also used to generate URLs and + #: the values are the function objects themselves. + #: To register a view function, use the :meth:`route` decorator. + self.view_functions = {} + + #: A dictionary of all registered error handlers. The key is ``None`` + #: for error handlers active on the application, otherwise the key is + #: the name of the blueprint. Each key points to another dictionary + #: where the key is the status code of the http exception. The + #: special key ``None`` points to a list of tuples where the first item + #: is the class for the instance check and the second the error handler + #: function. + #: + #: To register an error handler, use the :meth:`errorhandler` + #: decorator. + self.error_handler_spec = {} + + #: 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 = [] + + #: A dictionary with lists of functions that will be called at the + #: beginning of each request. The key of the dictionary is the name of + #: the blueprint this function is active for, or ``None`` for all + #: requests. To register a function, use the :meth:`before_request` + #: decorator. + self.before_request_funcs = {} + + #: 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 = [] + + #: A dictionary with lists of functions that should be called after + #: each request. The key of the dictionary is the name of the blueprint + #: this function is active for, ``None`` for all requests. This can for + #: example be used to close database connections. To register a function + #: here, use the :meth:`after_request` decorator. + self.after_request_funcs = {} + + #: A dictionary with lists of functions that are called after + #: each request, even if an exception has occurred. The key of the + #: dictionary is the name of the blueprint this function is active for, + #: ``None`` for all requests. These functions are not allowed to modify + #: the request, and their return values are ignored. If an exception + #: occurred while processing the request, it gets passed to each + #: teardown_request function. To register a function here, use the + #: :meth:`teardown_request` decorator. + #: + #: .. versionadded:: 0.7 + self.teardown_request_funcs = {} + + #: 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 = [] + + #: A dictionary with lists of functions that are called before the + #: :attr:`before_request_funcs` functions. The key of the dictionary is + #: the name of the blueprint this function is active for, or ``None`` + #: for all requests. To register a function, use + #: :meth:`url_value_preprocessor`. + #: + #: .. versionadded:: 0.7 + self.url_value_preprocessors = {} + + #: A dictionary with lists of functions that can be used as URL value + #: preprocessors. The key ``None`` here is used for application wide + #: callbacks, otherwise the key is the name of the blueprint. + #: Each of these functions has the chance to modify the dictionary + #: of URL values before they are used as the keyword arguments of the + #: view function. For each function registered this one should also + #: provide a :meth:`url_defaults` function that adds the parameters + #: automatically again that were removed that way. + #: + #: .. versionadded:: 0.7 + self.url_default_functions = {} + + #: A dictionary with list of functions that are called without argument + #: to populate the template context. The key of the dictionary is the + #: name of the blueprint this function is active for, ``None`` for all + #: requests. Each returns a dictionary that the template context is + #: updated with. To register a function here, use the + #: :meth:`context_processor` decorator. + self.template_context_processors = { + None: [_default_template_ctx_processor] + } + + #: A list of shell context processor functions that should be run + #: when a shell context is created. + #: + #: .. versionadded:: 0.11 + self.shell_context_processors = [] + + #: all the attached blueprints in a dictionary by name. Blueprints + #: can be attached multiple times so this dictionary does not tell + #: you how often they got attached. + #: + #: .. versionadded:: 0.7 + self.blueprints = {} + self._blueprint_order = [] + + #: a place where extensions can store application specific state. For + #: example this is where an extension could store database engines and + #: similar things. For backwards compatibility extensions should register + #: themselves like this:: + #: + #: if not hasattr(app, 'extensions'): + #: app.extensions = {} + #: app.extensions['extensionname'] = SomeObject() + #: + #: 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 = {} + + #: 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 = Map() + + 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' + self.add_url_rule( + self.static_url_path + '/', + endpoint='static', + host=static_host, + view_func=self.send_static_file + ) + + #: The click command line context for this application. Commands + #: registered here show up in the :command:`flask` command once the + #: application has been discovered. The default commands are + #: provided by Flask itself and can be overridden. + #: + #: This is an instance of a :class:`click.Group` object. + self.cli = cli.AppGroup(self.name) + + @locked_cached_property + def name(self): + """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): + """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): + """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): + """The ``'flask.app'`` logger, a standard Python + :class:`~logging.Logger`. + + 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 :ref:`logging` for more information. + + .. versionchanged:: 1.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): + """The Jinja2 environment used to load templates.""" + return self.create_jinja_environment() + + @property + def got_first_request(self): + """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=False): + """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): + """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', self.name + '-instance') + + def open_instance_resource(self, resource, mode='rb'): + """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) + + def _get_templates_auto_reload(self): + """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 + + def _set_templates_auto_reload(self, value): + self.config['TEMPLATES_AUTO_RELOAD'] = value + + templates_auto_reload = property( + _get_templates_auto_reload, _set_templates_auto_reload + ) + del _get_templates_auto_reload, _set_templates_auto_reload + + def create_jinja_environment(self): + """Creates the Jinja2 environment based on :attr:`jinja_options` + and :meth:`select_jinja_autoescape`. Since 0.7 this also adds + the Jinja2 globals and filters after initialization. Override + this function to customize the behavior. + + .. versionadded:: 0.5 + .. versionchanged:: 0.11 + ``Environment.auto_reload`` set in accordance with + ``TEMPLATES_AUTO_RELOAD`` configuration option. + """ + 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.filters['tojson'] = json.tojson_filter + return rv + + def create_global_jinja_loader(self): + """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): + """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): + """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 = self.template_context_processors[None] + reqctx = _request_ctx_stack.top + if reqctx is not None: + bp = reqctx.request.blueprint + if bp is not None and 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): + """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') + + def _get_debug(self): + return self.config['DEBUG'] + + def _set_debug(self, value): + self.config['DEBUG'] = value + self.jinja_env.auto_reload = self.templates_auto_reload + + #: 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. + debug = property(_get_debug, _set_debug) + del _get_debug, _set_debug + + def run(self, host=None, port=None, debug=None, + load_dotenv=True, **options): + """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 :ref:`deployment` 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) + + _host = '127.0.0.1' + _port = 5000 + server_name = self.config.get('SERVER_NAME') + sn_host, sn_port = None, None + + if server_name: + sn_host, _, sn_port = server_name.partition(':') + + host = host or sn_host or _host + port = int(port or sn_port or _port) + + 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(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=True, **kwargs): + """Creates a test client for this application. For information + about unit testing head over to :ref:`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 flask.testing import FlaskClient as cls + return cls(self, self.response_class, use_cookies=use_cookies, **kwargs) + + def test_cli_runner(self, **kwargs): + """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 flask.testing import FlaskCliRunner as cls + + return cls(self, **kwargs) + + def open_session(self, request): + """Creates or opens a new session. Default implementation stores all + session data in a signed cookie. This requires that the + :attr:`secret_key` is set. Instead of overriding this method + we recommend replacing the :class:`session_interface`. + + .. deprecated: 1.0 + Will be removed in 1.1. Use ``session_interface.open_session`` + instead. + + :param request: an instance of :attr:`request_class`. + """ + + warnings.warn(DeprecationWarning( + '"open_session" is deprecated and will be removed in 1.1. Use' + ' "session_interface.open_session" instead.' + )) + return self.session_interface.open_session(self, request) + + def save_session(self, session, response): + """Saves the session if it needs updates. For the default + implementation, check :meth:`open_session`. Instead of overriding this + method we recommend replacing the :class:`session_interface`. + + .. deprecated: 1.0 + Will be removed in 1.1. Use ``session_interface.save_session`` + instead. + + :param session: the session to be saved (a + :class:`~werkzeug.contrib.securecookie.SecureCookie` + object) + :param response: an instance of :attr:`response_class` + """ + + warnings.warn(DeprecationWarning( + '"save_session" is deprecated and will be removed in 1.1. Use' + ' "session_interface.save_session" instead.' + )) + return self.session_interface.save_session(self, session, response) + + def make_null_session(self): + """Creates a new instance of a missing session. Instead of overriding + this method we recommend replacing the :class:`session_interface`. + + .. deprecated: 1.0 + Will be removed in 1.1. Use ``session_interface.make_null_session`` + instead. + + .. versionadded:: 0.7 + """ + + warnings.warn(DeprecationWarning( + '"make_null_session" is deprecated and will be removed in 1.1. Use' + ' "session_interface.make_null_session" instead.' + )) + return self.session_interface.make_null_session(self) + + @setupmethod + def register_blueprint(self, blueprint, **options): + """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. + + .. versionadded:: 0.7 + """ + first_registration = False + + if blueprint.name in self.blueprints: + assert self.blueprints[blueprint.name] is blueprint, ( + 'A name collision occurred between blueprints %r and %r. Both' + ' share the same name "%s". Blueprints that are created on the' + ' fly need unique names.' % ( + blueprint, self.blueprints[blueprint.name], blueprint.name + ) + ) + else: + self.blueprints[blueprint.name] = blueprint + self._blueprint_order.append(blueprint) + first_registration = True + + blueprint.register(self, options, first_registration) + + def iter_blueprints(self): + """Iterates over all blueprints by the order they were registered. + + .. versionadded:: 0.11 + """ + return iter(self._blueprint_order) + + @setupmethod + def add_url_rule(self, rule, endpoint=None, view_func=None, + provide_automatic_options=None, **options): + """Connects a URL rule. Works exactly like the :meth:`route` + decorator. If a view_func is provided it will be registered with the + endpoint. + + Basically this example:: + + @app.route('/') + def index(): + pass + + Is equivalent to the following:: + + def index(): + pass + app.add_url_rule('/', 'index', index) + + If the view_func is not provided you will need to connect the endpoint + to a view function like so:: + + app.view_functions['index'] = index + + Internally :meth:`route` invokes :meth:`add_url_rule` so if you want + to customize the behavior via subclassing you only need to change + this method. + + For more information refer to :ref:`url-route-registrations`. + + .. versionchanged:: 0.2 + `view_func` parameter added. + + .. versionchanged:: 0.6 + ``OPTIONS`` is added automatically as method. + + :param rule: the URL rule as string + :param endpoint: the endpoint for the registered URL rule. Flask + itself assumes the name of the view function as + endpoint + :param view_func: the function to call when serving a request to the + provided endpoint + :param provide_automatic_options: controls whether the ``OPTIONS`` + method should be added automatically. This can also be controlled + by setting the ``view_func.provide_automatic_options = False`` + before adding the rule. + :param options: the options to be forwarded to the underlying + :class:`~werkzeug.routing.Rule` object. A change + to Werkzeug is handling of method options. methods + is a list of methods this rule should be limited + to (``GET``, ``POST`` etc.). By default a rule + just listens for ``GET`` (and implicitly ``HEAD``). + Starting with Flask 0.6, ``OPTIONS`` is implicitly + added and handled by the standard request handling. + """ + if endpoint is None: + endpoint = _endpoint_from_view_func(view_func) + 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, string_types): + raise TypeError('Allowed methods have to be iterables of strings, ' + 'for example: @app.route(..., methods=["POST"])') + methods = set(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 + + 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 endpoint function: %s' % endpoint) + self.view_functions[endpoint] = view_func + + def route(self, rule, **options): + """A decorator that is used to register a view function for a + given URL rule. This does the same thing as :meth:`add_url_rule` + but is intended for decorator usage:: + + @app.route('/') + def index(): + return 'Hello World' + + For more information refer to :ref:`url-route-registrations`. + + :param rule: the URL rule as string + :param endpoint: the endpoint for the registered URL rule. Flask + itself assumes the name of the view function as + endpoint + :param options: the options to be forwarded to the underlying + :class:`~werkzeug.routing.Rule` object. A change + to Werkzeug is handling of method options. methods + is a list of methods this rule should be limited + to (``GET``, ``POST`` etc.). By default a rule + just listens for ``GET`` (and implicitly ``HEAD``). + Starting with Flask 0.6, ``OPTIONS`` is implicitly + added and handled by the standard request handling. + """ + def decorator(f): + endpoint = options.pop('endpoint', None) + self.add_url_rule(rule, endpoint, f, **options) + return f + return decorator + + @setupmethod + def endpoint(self, endpoint): + """A decorator to register a function as an endpoint. + Example:: + + @app.endpoint('example.endpoint') + def example(): + return "example" + + :param endpoint: the name of the endpoint + """ + def decorator(f): + self.view_functions[endpoint] = f + return f + return decorator + + @staticmethod + def _get_exc_class_and_code(exc_class_or_code): + """Ensure that we register only exceptions as handler keys""" + if isinstance(exc_class_or_code, integer_types): + exc_class = default_exceptions[exc_class_or_code] + else: + exc_class = exc_class_or_code + + assert issubclass(exc_class, Exception) + + if issubclass(exc_class, HTTPException): + return exc_class, exc_class.code + else: + return exc_class, None + + @setupmethod + def errorhandler(self, code_or_exception): + """Register a function to handle errors by code or exception class. + + A decorator that is used to register a function given an + error code. Example:: + + @app.errorhandler(404) + def page_not_found(error): + return 'This page does not exist', 404 + + You can also register handlers for arbitrary exceptions:: + + @app.errorhandler(DatabaseError) + def special_exception_handler(error): + return 'Database connection failed', 500 + + .. versionadded:: 0.7 + Use :meth:`register_error_handler` instead of modifying + :attr:`error_handler_spec` directly, for application wide error + handlers. + + .. versionadded:: 0.7 + One can now additionally also register custom exception types + that do not necessarily have to be a subclass of the + :class:`~werkzeug.exceptions.HTTPException` class. + + :param code_or_exception: the code as integer for the handler, or + an arbitrary exception + """ + def decorator(f): + self._register_error_handler(None, code_or_exception, f) + return f + return decorator + + @setupmethod + def register_error_handler(self, code_or_exception, f): + """Alternative error attach function to the :meth:`errorhandler` + decorator that is more straightforward to use for non decorator + usage. + + .. versionadded:: 0.7 + """ + self._register_error_handler(None, code_or_exception, f) + + @setupmethod + def _register_error_handler(self, key, code_or_exception, f): + """ + :type key: None|str + :type code_or_exception: int|T<=Exception + :type f: callable + """ + if isinstance(code_or_exception, HTTPException): # old broken behavior + raise ValueError( + 'Tried to register a handler for an exception instance {0!r}.' + ' Handlers can only be registered for exception classes or' + ' HTTP error codes.'.format(code_or_exception) + ) + + try: + exc_class, code = self._get_exc_class_and_code(code_or_exception) + except KeyError: + raise KeyError( + "'{0}' is not a recognized HTTP error code. Use a subclass of" + " HTTPException with that code instead.".format(code_or_exception) + ) + + handlers = self.error_handler_spec.setdefault(key, {}).setdefault(code, {}) + handlers[exc_class] = f + + @setupmethod + def template_filter(self, name=None): + """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): + self.add_template_filter(f, name=name) + return f + return decorator + + @setupmethod + def add_template_filter(self, f, name=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=None): + """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): + self.add_template_test(f, name=name) + return f + return decorator + + @setupmethod + def add_template_test(self, f, name=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=None): + """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): + self.add_template_global(f, name=name) + return f + return decorator + + @setupmethod + def add_template_global(self, f, name=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_request(self, f): + """Registers a function to run before each request. + + For example, this can be used to open a database connection, or to load + the logged in user from the session. + + The function will be called without any arguments. If it 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. + """ + self.before_request_funcs.setdefault(None, []).append(f) + return f + + @setupmethod + def before_first_request(self, f): + """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 after_request(self, f): + """Register a function to be run after each request. + + Your function must take one parameter, an instance of + :attr:`response_class` and return a new response object or the + same (see :meth:`process_response`). + + As of Flask 0.7 this function might not be executed at the end of the + request in case an unhandled exception occurred. + """ + self.after_request_funcs.setdefault(None, []).append(f) + return f + + @setupmethod + def teardown_request(self, f): + """Register a function to be run at the end of each request, + regardless of whether there was an exception or not. These functions + are executed when the request context is popped, even if not an + actual request was performed. + + Example:: + + ctx = app.test_request_context() + ctx.push() + ... + ctx.pop() + + When ``ctx.pop()`` is executed in the above example, the teardown + functions are called just before the request context moves from the + stack of active contexts. This becomes relevant if you are using + such constructs in tests. + + Generally teardown functions must take every necessary step to avoid + that they will fail. If they do execute code that might fail they + will have to surround the execution of these code by try/except + statements and log occurring errors. + + When a teardown function was called because of an exception it will + be passed an error object. + + The return values of teardown functions are ignored. + + .. admonition:: Debug Note + + In debug mode Flask will not tear down a request on an exception + immediately. Instead it will keep it alive so that the interactive + debugger can still access it. This behavior can be controlled + by the ``PRESERVE_CONTEXT_ON_EXCEPTION`` configuration variable. + """ + self.teardown_request_funcs.setdefault(None, []).append(f) + return f + + @setupmethod + def teardown_appcontext(self, f): + """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 context_processor(self, f): + """Registers a template context processor function.""" + self.template_context_processors[None].append(f) + return f + + @setupmethod + def shell_context_processor(self, f): + """Registers a shell context processor function. + + .. versionadded:: 0.11 + """ + self.shell_context_processors.append(f) + return f + + @setupmethod + def url_value_preprocessor(self, f): + """Register a URL value preprocessor function for all view + functions in the application. These functions will be called before the + :meth:`before_request` functions. + + The function can modify the values captured from the matched url before + they are passed to the view. For example, this can be used to pop a + common language code value and place it in ``g`` rather than pass it to + every view. + + The function is passed the endpoint name and values dict. The return + value is ignored. + """ + self.url_value_preprocessors.setdefault(None, []).append(f) + return f + + @setupmethod + def url_defaults(self, f): + """Callback function for URL defaults for all view functions of the + application. It's called with the endpoint and values and should + update the values passed in place. + """ + self.url_default_functions.setdefault(None, []).append(f) + return f + + def _find_error_handler(self, e): + """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 name, c in ( + (request.blueprint, code), (None, code), + (request.blueprint, None), (None, None) + ): + handler_map = self.error_handler_spec.setdefault(name, {}).get(c) + + if not handler_map: + continue + + for cls in exc_class.__mro__: + handler = handler_map.get(cls) + + if handler is not None: + return handler + + def handle_http_exception(self, e): + """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 handler(e) + + def trap_http_exception(self, e): + """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): + """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 + """ + exc_type, exc_value, tb = sys.exc_info() + assert exc_value is e + # ensure not to trash sys.exc_info() at that point in case someone + # wants the traceback preserved in handle_http_exception. Of course + # we cannot prevent users from trashing it themselves in a custom + # trap_http_exception method so that's their fault then. + + if isinstance(e, BadRequestKeyError): + if self.debug or self.config["TRAP_BAD_REQUEST_ERRORS"]: + # Werkzeug < 0.15 doesn't add the KeyError to the 400 + # message, add it in manually. + description = e.get_description() + + if e.args[0] not in description: + e.description = "KeyError: '{}'".format(*e.args) + else: + # Werkzeug >= 0.15 does add it, remove it in production + e.args = () + + 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: + reraise(exc_type, exc_value, tb) + return handler(e) + + def handle_exception(self, e): + """Default exception handling that kicks in when an exception + occurs that is not caught. In debug mode the exception will + be re-raised immediately, otherwise it is logged and the handler + for a 500 internal server error is used. If no such handler + exists, a default 500 internal server error message is displayed. + + .. versionadded:: 0.3 + """ + exc_type, exc_value, tb = sys.exc_info() + + got_request_exception.send(self, exception=e) + handler = self._find_error_handler(InternalServerError()) + + if self.propagate_exceptions: + # if we want to repropagate the exception, we can attempt to + # raise it with the whole traceback in case we can do that + # (the function was actually called from the except part) + # otherwise, we just raise the error again + if exc_value is e: + reraise(exc_type, exc_value, tb) + else: + raise e + + self.log_exception((exc_type, exc_value, tb)) + if handler is None: + return InternalServerError() + return self.finalize_request(handler(e), from_error_handler=True) + + def log_exception(self, exc_info): + """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('Exception on %s [%s]' % ( + request.path, + request.method + ), exc_info=exc_info) + + def raise_routing_exception(self, request): + """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 + + from .debughelpers import FormDataRoutingRedirect + raise FormDataRoutingRedirect(request) + + def dispatch_request(self): + """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.view_functions[rule.endpoint](**req.view_args) + + def full_dispatch_request(self): + """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, from_error_handler=False): + """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): + """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: + func() + self._got_first_request = True + + def make_default_options_response(self): + """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 + if hasattr(adapter, 'allowed_methods'): + methods = adapter.allowed_methods() + else: + # fallback for Werkzeug < 0.7 + methods = [] + try: + adapter.match(method='--') + except MethodNotAllowed as e: + methods = e.valid_methods + except HTTPException as e: + pass + rv = self.response_class() + rv.allow.update(methods) + return rv + + def should_ignore_error(self, error): + """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 make_response(self, rv): + """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`` (``unicode`` in Python 2) + A response object is created with the string encoded to UTF-8 + as the body. + + ``bytes`` (``str`` in Python 2) + A response object is created with the bytes as the body. + + ``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( + 'The view function 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, (text_type, 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 + else: + # evaluate a WSGI callable, or coerce a different response + # class to the correct type + try: + rv = self.response_class.force_type(rv, request.environ) + except TypeError as e: + new_error = TypeError( + '{e}\nThe view function did not return a valid' + ' response. The return type must be a string, tuple,' + ' Response instance, or WSGI callable, but it was a' + ' {rv.__class__.__name__}.'.format(e=e, rv=rv) + ) + reraise(TypeError, new_error, sys.exc_info()[2]) + + # prefer the status if it was provided + if status is not None: + if isinstance(status, (text_type, bytes, bytearray)): + rv.status = status + else: + rv.status_code = status + + # extend existing headers with provided headers + if headers: + rv.headers.extend(headers) + + return rv + + def create_url_adapter(self, request): + """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. + subdomain = ((self.url_map.default_subdomain or None) + if not self.subdomain_matching else 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']) + + def inject_url_defaults(self, endpoint, values): + """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 = self.url_default_functions.get(None, ()) + if '.' in endpoint: + bp = endpoint.rsplit('.', 1)[0] + funcs = chain(funcs, self.url_default_functions.get(bp, ())) + for func in funcs: + func(endpoint, values) + + def handle_url_build_error(self, error, endpoint, values): + """Handle :class:`~werkzeug.routing.BuildError` on :meth:`url_for`. + """ + exc_type, exc_value, tb = sys.exc_info() + for handler in self.url_build_error_handlers: + try: + rv = handler(error, endpoint, values) + if rv is not None: + return rv + except BuildError as e: + # make error available outside except block (py3) + error = e + + # At this point we want to reraise the exception. If the error is + # still the same one we can reraise it with the original traceback, + # otherwise we raise it from here. + if error is exc_value: + reraise(exc_type, exc_value, tb) + raise error + + def preprocess_request(self): + """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. + """ + + bp = _request_ctx_stack.top.request.blueprint + + funcs = self.url_value_preprocessors.get(None, ()) + if bp is not None and 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 = self.before_request_funcs.get(None, ()) + if bp is not None and bp in self.before_request_funcs: + funcs = chain(funcs, self.before_request_funcs[bp]) + for func in funcs: + rv = func() + if rv is not None: + return rv + + def process_response(self, 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 + bp = ctx.request.blueprint + funcs = ctx._after_request_functions + if bp is not None and 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 = 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=_sentinel): + """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 = reversed(self.teardown_request_funcs.get(None, ())) + bp = _request_ctx_stack.top.request.blueprint + if bp is not None and bp in self.teardown_request_funcs: + funcs = chain(funcs, reversed(self.teardown_request_funcs[bp])) + for func in funcs: + func(exc) + request_tearing_down.send(self, exc=exc) + + def do_teardown_appcontext(self, exc=_sentinel): + """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): + func(exc) + appcontext_tearing_down.send(self, exc=exc) + + def app_context(self): + """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): + """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, **kwargs): + """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 flask.testing import make_test_environ_builder + + builder = make_test_environ_builder(self, *args, **kwargs) + + try: + return self.request_context(builder.get_environ()) + finally: + builder.close() + + def wsgi_app(self, environ, start_response): + """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 = None + try: + try: + ctx.push() + response = self.full_dispatch_request() + except Exception as e: + error = e + response = self.handle_exception(e) + except: + 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, start_response): + """The WSGI server calls the Flask application object as the + WSGI application. This calls :meth:`wsgi_app` which can be + wrapped to applying middleware.""" + return self.wsgi_app(environ, start_response) + + def __repr__(self): + return '<%s %r>' % ( + self.__class__.__name__, + self.name, + ) diff --git a/backend/venv/lib/python3.7/site-packages/flask/blueprints.py b/backend/venv/lib/python3.7/site-packages/flask/blueprints.py new file mode 100644 index 000000000..c2158fe3a --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/flask/blueprints.py @@ -0,0 +1,447 @@ +# -*- coding: utf-8 -*- +""" + flask.blueprints + ~~~~~~~~~~~~~~~~ + + Blueprints are the recommended way to implement larger or more + pluggable applications in Flask 0.7 and later. + + :copyright: © 2010 by the Pallets team. + :license: BSD, see LICENSE for more details. +""" +from functools import update_wrapper + +from .helpers import _PackageBoundObject, _endpoint_from_view_func + + +class BlueprintSetupState(object): + """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, app, options, first_registration): + #: 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 + + #: 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, endpoint=None, view_func=None, **options): + """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) + defaults = self.url_defaults + if 'defaults' in options: + defaults = dict(defaults, **options.pop('defaults')) + self.app.add_url_rule(rule, '%s.%s' % (self.blueprint.name, endpoint), + view_func, defaults=defaults, **options) + + +class Blueprint(_PackageBoundObject): + """Represents a blueprint. A blueprint is an object that records + functions that will be called with the + :class:`~flask.blueprints.BlueprintSetupState` later to register functions + or other things on the main application. See :ref:`blueprints` for more + information. + + .. versionadded:: 0.7 + """ + + warn_on_modifications = False + _got_registered_once = False + + #: Blueprint local JSON decoder class to use. + #: Set to ``None`` to use the app's :class:`~flask.app.Flask.json_encoder`. + json_encoder = None + #: Blueprint local JSON decoder class to use. + #: Set to ``None`` to use the app's :class:`~flask.app.Flask.json_decoder`. + json_decoder = None + + # TODO remove the next three attrs when Sphinx :inherited-members: works + # https://github.com/sphinx-doc/sphinx/issues/741 + + #: The name of the package or module that this app belongs to. Do not + #: change this once it is set by the constructor. + import_name = None + + #: Location of the template files to be added to the template lookup. + #: ``None`` if templates should not be added. + template_folder = None + + #: Absolute path to the package on the filesystem. Used to look up + #: resources contained in the package. + root_path = None + + def __init__(self, name, import_name, static_folder=None, + static_url_path=None, template_folder=None, + url_prefix=None, subdomain=None, url_defaults=None, + root_path=None): + _PackageBoundObject.__init__(self, import_name, template_folder, + root_path=root_path) + self.name = name + self.url_prefix = url_prefix + self.subdomain = subdomain + self.static_folder = static_folder + self.static_url_path = static_url_path + self.deferred_functions = [] + if url_defaults is None: + url_defaults = {} + self.url_values_defaults = url_defaults + + def record(self, func): + """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): + """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): + if state.first_registration: + func(state) + return self.record(update_wrapper(wrapper, func)) + + def make_setup_state(self, app, options, first_registration=False): + """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(self, app, options, first_registration=False): + """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`. + :param first_registration: Whether this is the first time this + blueprint has been registered on the application. + """ + self._got_registered_once = True + state = self.make_setup_state(app, options, first_registration) + + if self.has_static_folder: + state.add_url_rule( + self.static_url_path + '/', + view_func=self.send_static_file, endpoint='static' + ) + + for deferred in self.deferred_functions: + deferred(state) + + def route(self, rule, **options): + """Like :meth:`Flask.route` but for a blueprint. The endpoint for the + :func:`url_for` function is prefixed with the name of the blueprint. + """ + def decorator(f): + endpoint = options.pop("endpoint", f.__name__) + self.add_url_rule(rule, endpoint, f, **options) + return f + return decorator + + def add_url_rule(self, rule, endpoint=None, view_func=None, **options): + """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: + assert '.' not in endpoint, "Blueprint endpoints should not contain dots" + if view_func and hasattr(view_func, '__name__'): + assert '.' not in view_func.__name__, "Blueprint view function name should not contain dots" + self.record(lambda s: + s.add_url_rule(rule, endpoint, view_func, **options)) + + def endpoint(self, endpoint): + """Like :meth:`Flask.endpoint` but for a blueprint. This does not + prefix the endpoint with the blueprint name, this has to be done + explicitly by the user of this method. If the endpoint is prefixed + with a `.` it will be registered to the current blueprint, otherwise + it's an application independent endpoint. + """ + def decorator(f): + def register_endpoint(state): + state.app.view_functions[endpoint] = f + self.record_once(register_endpoint) + return f + return decorator + + def app_template_filter(self, name=None): + """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): + self.add_app_template_filter(f, name=name) + return f + return decorator + + def add_app_template_filter(self, f, name=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): + state.app.jinja_env.filters[name or f.__name__] = f + self.record_once(register_template) + + def app_template_test(self, name=None): + """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): + self.add_app_template_test(f, name=name) + return f + return decorator + + def add_app_template_test(self, f, name=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): + state.app.jinja_env.tests[name or f.__name__] = f + self.record_once(register_template) + + def app_template_global(self, name=None): + """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): + self.add_app_template_global(f, name=name) + return f + return decorator + + def add_app_template_global(self, f, name=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): + state.app.jinja_env.globals[name or f.__name__] = f + self.record_once(register_template) + + def before_request(self, f): + """Like :meth:`Flask.before_request` but for a blueprint. This function + is only executed before each request that is handled by a function of + that blueprint. + """ + self.record_once(lambda s: s.app.before_request_funcs + .setdefault(self.name, []).append(f)) + return f + + def before_app_request(self, f): + """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): + """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_request(self, f): + """Like :meth:`Flask.after_request` but for a blueprint. This function + is only executed after each request that is handled by a function of + that blueprint. + """ + self.record_once(lambda s: s.app.after_request_funcs + .setdefault(self.name, []).append(f)) + return f + + def after_app_request(self, f): + """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_request(self, f): + """Like :meth:`Flask.teardown_request` but for a blueprint. This + function is only executed when tearing down requests handled by a + function of that blueprint. Teardown request functions are executed + when the request context is popped, even when no actual request was + performed. + """ + self.record_once(lambda s: s.app.teardown_request_funcs + .setdefault(self.name, []).append(f)) + return f + + def teardown_app_request(self, f): + """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 context_processor(self, f): + """Like :meth:`Flask.context_processor` but for a blueprint. This + function is only executed for requests handled by a blueprint. + """ + self.record_once(lambda s: s.app.template_context_processors + .setdefault(self.name, []).append(f)) + return f + + def app_context_processor(self, f): + """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): + """Like :meth:`Flask.errorhandler` but for a blueprint. This + handler is used for all requests, even if outside of the blueprint. + """ + def decorator(f): + self.record_once(lambda s: s.app.errorhandler(code)(f)) + return f + return decorator + + def url_value_preprocessor(self, f): + """Registers a function as URL value preprocessor for this + blueprint. It's called before the view functions are called and + can modify the url values provided. + """ + self.record_once(lambda s: s.app.url_value_preprocessors + .setdefault(self.name, []).append(f)) + return f + + def url_defaults(self, f): + """Callback function for URL defaults for this blueprint. It's called + with the endpoint and values and should update the values passed + in place. + """ + self.record_once(lambda s: s.app.url_default_functions + .setdefault(self.name, []).append(f)) + return f + + def app_url_value_preprocessor(self, f): + """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): + """Same as :meth:`url_defaults` but application wide. + """ + self.record_once(lambda s: s.app.url_default_functions + .setdefault(None, []).append(f)) + return f + + def errorhandler(self, code_or_exception): + """Registers an error handler that becomes active for this blueprint + only. Please be aware that routing does not happen local to a + blueprint so an error handler for 404 usually is not handled by + a blueprint unless it is caused inside a view function. Another + special case is the 500 internal server error which is always looked + up from the application. + + Otherwise works as the :meth:`~flask.Flask.errorhandler` decorator + of the :class:`~flask.Flask` object. + """ + def decorator(f): + self.record_once(lambda s: s.app._register_error_handler( + self.name, code_or_exception, f)) + return f + return decorator + + def register_error_handler(self, code_or_exception, f): + """Non-decorator version of the :meth:`errorhandler` error attach + function, akin to the :meth:`~flask.Flask.register_error_handler` + application-wide function of the :class:`~flask.Flask` object but + for error handlers limited to this blueprint. + + .. versionadded:: 0.11 + """ + self.record_once(lambda s: s.app._register_error_handler( + self.name, code_or_exception, f)) diff --git a/backend/venv/lib/python3.7/site-packages/flask/cli.py b/backend/venv/lib/python3.7/site-packages/flask/cli.py new file mode 100644 index 000000000..3eb93b3f6 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/flask/cli.py @@ -0,0 +1,910 @@ +# -*- coding: utf-8 -*- +""" + flask.cli + ~~~~~~~~~ + + A simple command line application to run flask apps. + + :copyright: © 2010 by the Pallets team. + :license: BSD, see LICENSE for more details. +""" + +from __future__ import print_function + +import ast +import inspect +import os +import platform +import re +import ssl +import sys +import traceback +from functools import update_wrapper +from operator import attrgetter +from threading import Lock, Thread + +import click +from werkzeug.utils import import_string + +from . import __version__ +from ._compat import getargspec, iteritems, reraise, text_type +from .globals import current_app +from .helpers import get_debug_flag, get_env, get_load_dotenv + +try: + import dotenv +except ImportError: + dotenv = None + + +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 k, v in iteritems(module.__dict__) if isinstance(v, Flask) + ] + + if len(matches) == 1: + return matches[0] + elif len(matches) > 1: + raise NoAppException( + 'Detected multiple Flask applications in module "{module}". Use ' + '"FLASK_APP={module}:name" to specify the correct ' + 'one.'.format(module=module.__name__) + ) + + # 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( + 'Detected factory "{factory}" in module "{module}", but ' + 'could not call it without arguments. Use ' + '"FLASK_APP=\'{module}:{factory}(args)\'" to specify ' + 'arguments.'.format( + factory=attr_name, module=module.__name__ + ) + ) + + raise NoAppException( + 'Failed to find Flask application or factory in module "{module}". ' + 'Use "FLASK_APP={module}:name to specify one.'.format( + module=module.__name__ + ) + ) + + +def call_factory(script_info, app_factory, arguments=()): + """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. + """ + args_spec = getargspec(app_factory) + arg_names = args_spec.args + arg_defaults = args_spec.defaults + + if 'script_info' in arg_names: + return app_factory(*arguments, script_info=script_info) + elif arguments: + return app_factory(*arguments) + elif not arguments and len(arg_names) == 1 and arg_defaults is None: + return app_factory(script_info) + + return app_factory() + + +def _called_with_wrong_args(factory): + """Check whether calling a function raised a ``TypeError`` because + the call failed or because something in the factory raised the + error. + + :param factory: the factory 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 factory.__code__: + # in the factory, it was called successfully + return False + + tb = tb.tb_next + + # didn't reach the factory + return True + finally: + del tb + + +def find_app_by_string(script_info, module, app_name): + """Checks if the given string is a variable name or a function. If it is a + function, it checks for specified arguments and whether it takes a + ``script_info`` argument and calls the function with the appropriate + arguments. + """ + from flask import Flask + match = re.match(r'^ *([^ ()]+) *(?:\((.*?) *,? *\))? *$', app_name) + + if not match: + raise NoAppException( + '"{name}" is not a valid variable name or function ' + 'expression.'.format(name=app_name) + ) + + name, args = match.groups() + + try: + attr = getattr(module, name) + except AttributeError as e: + raise NoAppException(e.args[0]) + + if inspect.isfunction(attr): + if args: + try: + args = ast.literal_eval('({args},)'.format(args=args)) + except (ValueError, SyntaxError)as e: + raise NoAppException( + 'Could not parse the arguments in ' + '"{app_name}".'.format(e=e, app_name=app_name) + ) + else: + args = () + + try: + app = call_factory(script_info, attr, args) + except TypeError as e: + if not _called_with_wrong_args(attr): + raise + + raise NoAppException( + '{e}\nThe factory "{app_name}" in module "{module}" could not ' + 'be called with the specified arguments.'.format( + e=e, app_name=app_name, module=module.__name__ + ) + ) + else: + app = attr + + if isinstance(app, Flask): + return app + + raise NoAppException( + 'A valid Flask application was not obtained from ' + '"{module}:{app_name}".'.format( + module=module.__name__, app_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) + + if os.path.splitext(path)[1] == '.py': + path = os.path.splitext(path)[0] + + 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 + + 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()[-1].tb_next: + raise NoAppException( + 'While importing "{name}", an ImportError was raised:' + '\n\n{tb}'.format(name=module_name, tb=traceback.format_exc()) + ) + elif raise_if_not_found: + raise NoAppException( + 'Could not import "{name}".'.format(name=module_name) + ) + 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 + message = ( + 'Python %(python)s\n' + 'Flask %(flask)s\n' + 'Werkzeug %(werkzeug)s' + ) + click.echo(message % { + 'python': platform.python_version(), + 'flask': __version__, + '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(object): + """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=False): + self.loader = loader + self._app = None + self._lock = Lock() + self._bg_loading_exc_info = None + if use_eager_loading: + self._load_unlocked() + else: + self._load_in_background() + + def _load_in_background(self): + def _load_app(): + __traceback_hide__ = True + 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 + exc_info = self._bg_loading_exc_info + if exc_info is not None: + self._bg_loading_exc_info = None + reraise(*exc_info) + + def _load_unlocked(self): + __traceback_hide__ = True + self._app = rv = self.loader() + self._bg_loading_exc_info = None + return rv + + def __call__(self, environ, start_response): + __traceback_hide__ = True + 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(object): + """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 + + if self._loaded_app is not None: + return self._loaded_app + + app = None + + 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. + + For information as of why this is useful see :ref:`custom-scripts`. + + :param add_default_commands: if this is True then the default run and + shell commands wil 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() + + # We load built-in commands first as these should always be the + # same no matter what the app does. If the app does want to + # override this it needs to make a custom instance of this group + # and not attach the default commands. + # + # This also means that the script stays functional in case the + # application completely fails. + rv = AppGroup.get_command(self, ctx, name) + if rv is not None: + return rv + + info = ctx.ensure_object(ScriptInfo) + try: + rv = info.load_app().cli.get_command(ctx, name) + if rv is not None: + return rv + except NoAppException: + pass + + def list_commands(self, ctx): + self._load_plugin_commands() + + # The commands available is the list of both the application (if + # available) plus the builtin commands. + rv = set(click.Group.list_commands(self, ctx)) + info = ctx.ensure_object(ScriptInfo) + try: + rv.update(info.load_app().cli.list_commands(ctx)) + except Exception: + # Here we intentionally swallow all exceptions as we don't + # want the help page to break if the app does not exist. + # If someone attempts to use the command we try to create + # the app again and this will give us the error. + # However, we will not do so silently because that would confuse + # users. + traceback.print_exc() + 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(FlaskGroup, self).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. + + Changes the current working directory to the location of the first file + found, with the assumption that it is in the top level project directory + and will be where the Python path should import local packages from. + + 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. + + .. versionadded:: 1.0 + """ + if dotenv is None: + if path or os.path.exists('.env') or os.path.exists('.flaskenv'): + click.secho( + ' * Tip: There are .env files present.' + ' Do "pip install python-dotenv" to use them.', + fg='yellow') + return + + if path is not None: + return dotenv.load_dotenv(path) + + 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) + + if new_dir and os.getcwd() != new_dir: + os.chdir(new_dir) + + 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 = ' * Serving Flask app "{0}"'.format(app_import_path) + + if not eager_loading: + message += ' (lazy loading)' + + click.echo(message) + + click.echo(' * Environment: {0}'.format(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(' * Debug mode: {0}'.format('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): + try: + return self.path_type(value, param, ctx) + except click.BadParameter: + value = click.STRING(value, param, ctx).lower() + + if value == 'adhoc': + try: + import OpenSSL + except ImportError: + raise click.BadParameter( + 'Using ad-hoc certificates requires pyOpenSSL.', + ctx, param) + + return value + + obj = import_string(value, silent=True) + + if sys.version_info < (2, 7, 9): + if obj: + return obj + else: + 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' + + if sys.version_info < (2, 7, 9): + is_context = cert and not isinstance(cert, (text_type, bytes)) + else: + is_context = 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 + + +@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-loader', 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.') +@pass_script_info +def run_command(info, host, port, reload, debugger, eager_loading, + with_threads, cert): + """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 + + if eager_loading is None: + eager_loading = not reload + + 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) + + +@click.command('shell', short_help='Run a shell in the app context.') +@with_appcontext +def shell_command(): + """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 it's configuration. + + This is useful for executing small snippets of management code + without having to manually configure the application. + """ + import code + from flask.globals import _app_ctx_stack + app = _app_ctx_stack.top.app + banner = 'Python %s on %s\nApp: %s [%s]\nInstance: %s' % ( + sys.version, + sys.platform, + app.import_name, + app.env, + app.instance_path, + ) + ctx = {} + + # 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, 'r') as f: + eval(compile(f.read(), startup, 'exec'), ctx) + + ctx.update(app.make_shell_context()) + + 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, all_methods): + """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)) + + rule_methods = [ + ', '.join(sorted(rule.methods - ignored_methods)) 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(as_module=False): + args = sys.argv[1:] + + if as_module: + this_module = 'flask' + + if sys.version_info < (2, 7): + this_module += '.cli' + + name = 'python -m ' + this_module + + # Python rewrites "python -m flask" to the path to the file in argv. + # Restore the original command so that the reloader works. + sys.argv = ['-m', this_module] + args + else: + name = None + + cli.main(args=args, prog_name=name) + + +if __name__ == '__main__': + main(as_module=True) diff --git a/backend/venv/lib/python3.7/site-packages/flask/config.py b/backend/venv/lib/python3.7/site-packages/flask/config.py new file mode 100644 index 000000000..a5475ed10 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/flask/config.py @@ -0,0 +1,269 @@ +# -*- coding: utf-8 -*- +""" + flask.config + ~~~~~~~~~~~~ + + Implements the configuration related objects. + + :copyright: © 2010 by the Pallets team. + :license: BSD, see LICENSE for more details. +""" + +import os +import types +import errno + +from werkzeug.utils import import_string +from ._compat import string_types, iteritems +from . import json + + +class ConfigAttribute(object): + """Makes an attribute forward to the config""" + + def __init__(self, name, get_converter=None): + self.__name__ = name + self.get_converter = get_converter + + def __get__(self, obj, type=None): + 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, value): + 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, defaults=None): + dict.__init__(self, defaults or {}) + self.root_path = root_path + + def from_envvar(self, variable_name, silent=False): + """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('The environment variable %r is not set ' + 'and as such configuration could not be ' + 'loaded. Set this variable and make it ' + 'point to a configuration file' % + variable_name) + return self.from_pyfile(rv, silent=silent) + + def from_pyfile(self, filename, silent=False): + """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 IOError as e: + if silent and e.errno in ( + errno.ENOENT, errno.EISDIR, errno.ENOTDIR + ): + return False + e.strerror = 'Unable to load configuration file (%s)' % e.strerror + raise + self.from_object(d) + return True + + def from_object(self, obj): + """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, string_types): + obj = import_string(obj) + for key in dir(obj): + if key.isupper(): + self[key] = getattr(obj, key) + + def from_json(self, filename, silent=False): + """Updates the values in the config from a JSON file. This function + behaves as if the JSON object was a dictionary and passed to the + :meth:`from_mapping` function. + + :param filename: the filename of the JSON file. 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.11 + """ + filename = os.path.join(self.root_path, filename) + + try: + with open(filename) as json_file: + obj = json.loads(json_file.read()) + except IOError as e: + if silent and e.errno in (errno.ENOENT, errno.EISDIR): + return False + e.strerror = 'Unable to load configuration file (%s)' % e.strerror + raise + return self.from_mapping(obj) + + def from_mapping(self, *mapping, **kwargs): + """Updates the config like :meth:`update` ignoring items with non-upper + keys. + + .. versionadded:: 0.11 + """ + mappings = [] + if len(mapping) == 1: + if hasattr(mapping[0], 'items'): + mappings.append(mapping[0].items()) + else: + mappings.append(mapping[0]) + elif len(mapping) > 1: + raise TypeError( + 'expected at most 1 positional argument, got %d' % len(mapping) + ) + mappings.append(kwargs.items()) + for mapping in mappings: + for (key, value) in mapping: + if key.isupper(): + self[key] = value + return True + + def get_namespace(self, namespace, lowercase=True, trim_namespace=True): + """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 iteritems(self): + 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): + return '<%s %s>' % (self.__class__.__name__, dict.__repr__(self)) diff --git a/backend/venv/lib/python3.7/site-packages/flask/ctx.py b/backend/venv/lib/python3.7/site-packages/flask/ctx.py new file mode 100644 index 000000000..ec8e787eb --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/flask/ctx.py @@ -0,0 +1,457 @@ +# -*- coding: utf-8 -*- +""" + flask.ctx + ~~~~~~~~~ + + Implements the objects required to keep the context. + + :copyright: © 2010 by the Pallets team. + :license: BSD, see LICENSE for more details. +""" + +import sys +from functools import update_wrapper + +from werkzeug.exceptions import HTTPException + +from .globals import _request_ctx_stack, _app_ctx_stack +from .signals import appcontext_pushed, appcontext_popped +from ._compat import BROKEN_PYPY_CTXMGR_EXIT, reraise + + +# a singleton sentinel value for parameter defaults +_sentinel = object() + + +class _AppCtxGlobals(object): + """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 + """ + + def get(self, name, default=None): + """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, default=_sentinel): + """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 raise 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, default=None): + """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): + return item in self.__dict__ + + def __iter__(self): + return iter(self.__dict__) + + def __repr__(self): + top = _app_ctx_stack.top + if top is not None: + return '' % top.app.name + return object.__repr__(self) + + +def after_this_request(f): + """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): + """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. + + 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 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(): + """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(): + """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(object): + """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): + 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): + """Binds the app context to the current context.""" + self._refcnt += 1 + if hasattr(sys, 'exc_clear'): + sys.exc_clear() + _app_ctx_stack.push(self) + appcontext_pushed.send(self.app) + + def pop(self, exc=_sentinel): + """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, 'Popped wrong app context. (%r instead of %r)' \ + % (rv, self) + appcontext_popped.send(self.app) + + def __enter__(self): + self.push() + return self + + def __exit__(self, exc_type, exc_value, tb): + self.pop(exc_value) + + if BROKEN_PYPY_CTXMGR_EXIT and exc_type is not None: + reraise(exc_type, exc_value, tb) + + +class RequestContext(object): + """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, environ, request=None): + self.app = app + if request is None: + request = app.request_class(environ) + self.request = request + self.url_adapter = app.create_url_adapter(self.request) + self.flashes = None + self.session = None + + # 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 = [] + + # 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 = [] + + self.match_request() + + def _get_g(self): + return _app_ctx_stack.top.g + def _set_g(self, value): + _app_ctx_stack.top.g = value + g = property(_get_g, _set_g) + del _get_g, _set_g + + def copy(self): + """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 + """ + return self.__class__(self.app, + environ=self.request.environ, + request=self.request + ) + + def match_request(self): + """Can be overridden by a subclass to hook into the matching + of the request. + """ + try: + url_rule, self.request.view_args = \ + self.url_adapter.match(return_rule=True) + self.request.url_rule = url_rule + except HTTPException as e: + self.request.routing_exception = e + + def push(self): + """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) + + if hasattr(sys, 'exc_clear'): + sys.exc_clear() + + _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) + + def pop(self, exc=_sentinel): + """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() + + try: + clear_request = False + 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) + + # If this interpreter supports clearing the exception information + # we do that now. This will only go into effect on Python 2.x, + # on 3.x it disappears automatically at the end of the exception + # stack. + if hasattr(sys, 'exc_clear'): + sys.exc_clear() + + 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, 'Popped wrong request context. ' \ + '(%r instead of %r)' % (rv, self) + + def auto_pop(self, exc): + 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 + else: + self.pop(exc) + + def __enter__(self): + self.push() + return self + + def __exit__(self, exc_type, exc_value, tb): + # 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) + + if BROKEN_PYPY_CTXMGR_EXIT and exc_type is not None: + reraise(exc_type, exc_value, tb) + + def __repr__(self): + return '<%s \'%s\' [%s] of %s>' % ( + self.__class__.__name__, + self.request.url, + self.request.method, + self.app.name, + ) diff --git a/backend/venv/lib/python3.7/site-packages/flask/debughelpers.py b/backend/venv/lib/python3.7/site-packages/flask/debughelpers.py new file mode 100644 index 000000000..e9765f20d --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/flask/debughelpers.py @@ -0,0 +1,168 @@ +# -*- coding: utf-8 -*- +""" + flask.debughelpers + ~~~~~~~~~~~~~~~~~~ + + Various helpers to make the development experience better. + + :copyright: © 2010 by the Pallets team. + :license: BSD, see LICENSE for more details. +""" + +import os +from warnings import warn + +from ._compat import implements_to_string, text_type +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. + """ + + +@implements_to_string +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 = ['You tried to access the file "%s" in the request.files ' + 'dictionary but it does not exist. The mimetype for the request ' + 'is "%s" 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.' % + (key, request.mimetype)] + if form_matches: + buf.append('\n\nThe browser instead transmitted some file names. ' + 'This was submitted: %s' % ', '.join('"%s"' % x + for x in form_matches)) + 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 = ['A request was sent to this URL (%s) but a redirect was ' + 'issued automatically by the routing system to "%s".' + % (request.url, exc.new_url)] + + # In case just a slash was appended we can be extra helpful + if 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 %s-request to this URL ' + 'since we can\'t make browsers or HTTP clients redirect ' + 'with form data reliably or without user interaction.' % + request.method) + 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): + yield 'class: %s.%s' % (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, text_type)) for x in value): + continue + yield '%s:' % key + for item in value: + yield ' - %s' % item + continue + elif not isinstance(value, (str, text_type, int, float, bool)): + continue + yield '%s: %r' % (key, value) + + +def explain_template_loading_attempts(app, template, attempts): + """This should help developers understand what failed""" + info = ['Locating template "%s":' % template] + 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 = 'application "%s"' % srcobj.import_name + elif isinstance(srcobj, Blueprint): + src_info = 'blueprint "%s" (%s)' % (srcobj.name, + srcobj.import_name) + else: + src_info = repr(srcobj) + + info.append('% 5d: trying loader of %s' % ( + idx + 1, src_info)) + + for line in _dump_loader_info(loader): + info.append(' %s' % line) + + if triple is None: + detail = 'no match' + else: + detail = 'found (%r)' % (triple[1] or '') + total_found += 1 + info.append(' -> %s' % 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 to the blueprint "%s".' % blueprint) + info.append(' Maybe you did not place a template in the right folder?') + info.append(' See http://flask.pocoo.org/docs/blueprints/#templates') + + app.logger.info('\n'.join(info)) + + +def explain_ignored_app_run(): + 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/backend/venv/lib/python3.7/site-packages/flask/globals.py b/backend/venv/lib/python3.7/site-packages/flask/globals.py new file mode 100644 index 000000000..7d50a6f6d --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/flask/globals.py @@ -0,0 +1,61 @@ +# -*- coding: utf-8 -*- +""" + flask.globals + ~~~~~~~~~~~~~ + + Defines all the global objects that are proxies to the current + active context. + + :copyright: © 2010 by the Pallets team. + :license: BSD, see LICENSE for more details. +""" + +from functools import partial +from werkzeug.local import LocalStack, LocalProxy + + +_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 = LocalProxy(_find_app) +request = LocalProxy(partial(_lookup_req_object, 'request')) +session = LocalProxy(partial(_lookup_req_object, 'session')) +g = LocalProxy(partial(_lookup_app_object, 'g')) diff --git a/backend/venv/lib/python3.7/site-packages/flask/helpers.py b/backend/venv/lib/python3.7/site-packages/flask/helpers.py new file mode 100644 index 000000000..158edc5c7 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/flask/helpers.py @@ -0,0 +1,1051 @@ +# -*- coding: utf-8 -*- +""" + flask.helpers + ~~~~~~~~~~~~~ + + Implements various helpers. + + :copyright: © 2010 by the Pallets team. + :license: BSD, see LICENSE for more details. +""" + +import os +import socket +import sys +import pkgutil +import posixpath +import mimetypes +from time import time +from zlib import adler32 +from threading import RLock +import unicodedata +from werkzeug.routing import BuildError +from functools import update_wrapper + +from werkzeug.urls import url_quote +from werkzeug.datastructures import Headers, Range +from werkzeug.exceptions import BadRequest, NotFound, \ + RequestedRangeNotSatisfiable + +from werkzeug.wsgi import wrap_file +from jinja2 import FileSystemLoader + +from .signals import message_flashed +from .globals import session, _request_ctx_stack, _app_ctx_stack, \ + current_app, request +from ._compat import string_types, text_type, PY2 + +# sentinel +_missing = object() + + +# what separators does this operating system provide that are not a slash? +# this is used by the send_from_directory function to ensure that nobody is +# able to access files from outside the filesystem. +_os_alt_seps = list(sep for sep in [os.path.sep, os.path.altsep] + if sep not in (None, '/')) + + +def get_env(): + """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(): + """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=True): + """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 _endpoint_from_view_func(view_func): + """Internal helper that returns the default endpoint for a given + function. This always is the function name. + """ + assert view_func is not None, 'expected view func if endpoint ' \ + 'is not provided.' + return view_func.__name__ + + +def stream_with_context(generator_or_function): + """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) + except TypeError: + def decorator(*args, **kwargs): + gen = generator_or_function(*args, **kwargs) + return stream_with_context(gen) + return update_wrapper(decorator, generator_or_function) + + def 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: + for item in gen: + yield item + finally: + if hasattr(gen, 'close'): + gen.close() + + # 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): + """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, **values): + """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') + + For more information, head over to the :ref:`Quickstart `. + + 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, 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 + ``PREFERRED_URL_SCHEME`` from the :ref:`app configuration ` if no + request context is available. As of Werkzeug 0.10, 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 = 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 += '#' + url_quote(anchor) + return rv + + +def get_template_attribute(template_name, attribute): + """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, category='message'): + """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(), + message=message, category=category) + + +def get_flashed_messages(with_categories=False, category_filter=[]): + """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 :ref:`message-flashing-pattern` 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: whitelist of categories to limit return values + """ + 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 send_file(filename_or_fp, mimetype=None, as_attachment=False, + attachment_filename=None, add_etags=True, + cache_timeout=None, conditional=False, last_modified=None): + """Sends the contents of a file to the client. This will use the + most efficient method available and configured. By default it will + try to use the WSGI server's file_wrapper support. Alternatively + you can set the application's :attr:`~Flask.use_x_sendfile` attribute + to ``True`` to directly emit an ``X-Sendfile`` header. This however + requires support of the underlying webserver for ``X-Sendfile``. + + By default it will try to guess the mimetype for you, but you can + also explicitly provide one. For extra security you probably want + to send certain files as attachment (HTML for instance). The mimetype + guessing requires a `filename` or an `attachment_filename` to be + provided. + + ETags will also be attached automatically if a `filename` is provided. You + can turn this off by setting `add_etags=False`. + + If `conditional=True` and `filename` is provided, this method will try to + upgrade the response stream to support range requests. This will allow + the request to be answered with partial content response. + + Please never pass filenames to this function from user sources; + you should use :func:`send_from_directory` instead. + + .. versionadded:: 0.2 + + .. versionadded:: 0.5 + The `add_etags`, `cache_timeout` and `conditional` parameters were + added. The default behavior is now to attach etags. + + .. versionchanged:: 0.7 + mimetype guessing and etag support for file objects was + deprecated because it was unreliable. Pass a filename if you are + able to, otherwise attach an etag yourself. This functionality + will be removed in Flask 1.0 + + .. versionchanged:: 0.9 + cache_timeout pulls its default from application config, when None. + + .. versionchanged:: 0.12 + The filename is no longer automatically inferred from file objects. If + you want to use automatic mimetype and etag support, pass a filepath via + `filename_or_fp` or `attachment_filename`. + + .. versionchanged:: 0.12 + The `attachment_filename` is preferred over `filename` for MIME-type + detection. + + .. versionchanged:: 1.0 + UTF-8 filenames, as specified in `RFC 2231`_, are supported. + + .. _RFC 2231: https://tools.ietf.org/html/rfc2231#section-4 + + .. versionchanged:: 1.0.3 + Filenames are encoded with ASCII instead of Latin-1 for broader + compatibility with WSGI servers. + + :param filename_or_fp: the filename of the file to send. + This is relative to the :attr:`~Flask.root_path` + if a relative path is specified. + Alternatively a file object might be provided in + which case ``X-Sendfile`` might not work and fall + back to the traditional method. Make sure that the + file pointer is positioned at the start of data to + send before calling :func:`send_file`. + :param mimetype: the mimetype of the file if provided. If a file path is + given, auto detection happens as fallback, otherwise an + error will be raised. + :param as_attachment: set to ``True`` if you want to send this file with + a ``Content-Disposition: attachment`` header. + :param attachment_filename: the filename for the attachment if it + differs from the file's filename. + :param add_etags: set to ``False`` to disable attaching of etags. + :param conditional: set to ``True`` to enable conditional responses. + + :param cache_timeout: the timeout in seconds for the headers. When ``None`` + (default), this value is set by + :meth:`~Flask.get_send_file_max_age` of + :data:`~flask.current_app`. + :param last_modified: set the ``Last-Modified`` header to this value, + a :class:`~datetime.datetime` or timestamp. + If a file was passed, this overrides its mtime. + """ + mtime = None + fsize = None + if isinstance(filename_or_fp, string_types): + filename = filename_or_fp + if not os.path.isabs(filename): + filename = os.path.join(current_app.root_path, filename) + file = None + if attachment_filename is None: + attachment_filename = os.path.basename(filename) + else: + file = filename_or_fp + filename = None + + if mimetype is None: + if attachment_filename is not None: + mimetype = mimetypes.guess_type(attachment_filename)[0] \ + or 'application/octet-stream' + + if mimetype is None: + raise ValueError( + 'Unable to infer MIME-type because no filename is available. ' + 'Please set either `attachment_filename`, pass a filepath to ' + '`filename_or_fp` or set your own MIME-type via `mimetype`.' + ) + + headers = Headers() + if as_attachment: + if attachment_filename is None: + raise TypeError('filename unavailable, required for ' + 'sending as attachment') + + if not isinstance(attachment_filename, text_type): + attachment_filename = attachment_filename.decode('utf-8') + + try: + attachment_filename = attachment_filename.encode('ascii') + except UnicodeEncodeError: + filenames = { + 'filename': unicodedata.normalize( + 'NFKD', attachment_filename).encode('ascii', 'ignore'), + 'filename*': "UTF-8''%s" % url_quote(attachment_filename), + } + else: + filenames = {'filename': attachment_filename} + + headers.add('Content-Disposition', 'attachment', **filenames) + + if current_app.use_x_sendfile and filename: + if file is not None: + file.close() + headers['X-Sendfile'] = filename + fsize = os.path.getsize(filename) + headers['Content-Length'] = fsize + data = None + else: + if file is None: + file = open(filename, 'rb') + mtime = os.path.getmtime(filename) + fsize = os.path.getsize(filename) + headers['Content-Length'] = fsize + data = wrap_file(request.environ, file) + + rv = current_app.response_class(data, mimetype=mimetype, headers=headers, + direct_passthrough=True) + + if last_modified is not None: + rv.last_modified = last_modified + elif mtime is not None: + rv.last_modified = mtime + + rv.cache_control.public = True + if cache_timeout is None: + cache_timeout = current_app.get_send_file_max_age(filename) + if cache_timeout is not None: + rv.cache_control.max_age = cache_timeout + rv.expires = int(time() + cache_timeout) + + if add_etags and filename is not None: + from warnings import warn + + try: + rv.set_etag('%s-%s-%s' % ( + os.path.getmtime(filename), + os.path.getsize(filename), + adler32( + filename.encode('utf-8') if isinstance(filename, text_type) + else filename + ) & 0xffffffff + )) + except OSError: + warn('Access %s failed, maybe it does not exist, so ignore etags in ' + 'headers' % filename, stacklevel=2) + + if conditional: + try: + rv = rv.make_conditional(request, accept_ranges=True, + complete_length=fsize) + except RequestedRangeNotSatisfiable: + if file is not None: + file.close() + raise + # make sure we don't send x-sendfile for servers that + # ignore the 304 status code for x-sendfile. + if rv.status_code == 304: + rv.headers.pop('x-sendfile', None) + return rv + + +def safe_join(directory, *pathnames): + """Safely join `directory` and zero or more untrusted `pathnames` + components. + + Example usage:: + + @app.route('/wiki/') + def wiki_page(filename): + filename = safe_join(app.config['WIKI_FOLDER'], filename) + with open(filename, 'rb') as fd: + content = fd.read() # Read and process the file content... + + :param directory: the trusted base directory. + :param pathnames: the untrusted pathnames relative to that directory. + :raises: :class:`~werkzeug.exceptions.NotFound` if one or more passed + paths fall out of its boundaries. + """ + + 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('../') + ): + raise NotFound() + + parts.append(filename) + + return posixpath.join(*parts) + + +def send_from_directory(directory, filename, **options): + """Send a file from a given directory with :func:`send_file`. This + is a secure way to quickly expose static files from an upload folder + or something similar. + + Example usage:: + + @app.route('/uploads/') + def download_file(filename): + return send_from_directory(app.config['UPLOAD_FOLDER'], + filename, as_attachment=True) + + .. admonition:: Sending files and Performance + + It is strongly recommended to activate either ``X-Sendfile`` support in + your webserver or (if no authentication happens) to tell the webserver + to serve files for the given path on its own without calling into the + web application for improved performance. + + .. versionadded:: 0.5 + + :param directory: the directory where all the files are stored. + :param filename: the filename relative to that directory to + download. + :param options: optional keyword arguments that are directly + forwarded to :func:`send_file`. + """ + filename = safe_join(directory, filename) + if not os.path.isabs(filename): + filename = os.path.join(current_app.root_path, filename) + try: + if not os.path.isfile(filename): + raise NotFound() + except (TypeError, ValueError): + raise BadRequest() + options.setdefault('conditional', True) + return send_file(filename, **options) + + +def get_root_path(import_name): + """Returns the path to a package or cwd if that cannot be found. This + returns the path of a package or the folder that contains a module. + + Not to be confused with the package path returned by :func:`find_package`. + """ + # 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() + + # For .egg, zipimporter does not have get_filename until Python 2.7. + # Some other loaders might exhibit the same behavior. + if hasattr(loader, 'get_filename'): + filepath = loader.get_filename(import_name) + else: + # Fall back to imports. + __import__(import_name) + mod = sys.modules[import_name] + filepath = getattr(mod, '__file__', None) + + # If we don't have a filepath it might be because we are a + # namespace package. In this case we pick the root path from the + # first module that is contained in our package. + if filepath is None: + raise RuntimeError('No root path can be found for the provided ' + 'module "%s". 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.' % import_name) + + # filepath is import_name.py for a module, or __init__.py for a package. + return os.path.dirname(os.path.abspath(filepath)) + + +def _matching_loader_thinks_module_is_package(loader, mod_name): + """Given the loader that loaded a module and the module this function + attempts to figure out if the given module is actually a package. + """ + # If the loader can tell us if something is a package, we can + # directly ask the loader. + if hasattr(loader, 'is_package'): + return loader.is_package(mod_name) + # importlib's namespace loaders do not have this functionality but + # all the modules it loads are packages, so we can take advantage of + # this information. + elif (loader.__class__.__module__ == '_frozen_importlib' and + loader.__class__.__name__ == 'NamespaceLoader'): + return True + # Otherwise we need to fail with an error that explains what went + # wrong. + raise AttributeError( + ('%s.is_package() method is missing but is required by Flask of ' + 'PEP 302 import hooks. If you do not use import hooks and ' + 'you encounter this error please file a bug against Flask.') % + loader.__class__.__name__) + + +def find_package(import_name): + """Finds a package and returns the prefix (or None if the package is + not installed) as well as the folder that contains the package or + module as a tuple. The package path returned is the module that would + have to be added to the pythonpath in order to make it possible to + import the module. The prefix is the path below which a UNIX like + folder structure exists (lib, share etc.). + """ + root_mod_name = import_name.split('.')[0] + loader = pkgutil.get_loader(root_mod_name) + if loader is None or import_name == '__main__': + # import name is not found, or interactive/main module + package_path = os.getcwd() + else: + # For .egg, zipimporter does not have get_filename until Python 2.7. + if hasattr(loader, 'get_filename'): + filename = loader.get_filename(root_mod_name) + elif hasattr(loader, 'archive'): + # zipimporter's loader.archive points to the .egg or .zip + # archive filename is dropped in call to dirname below. + filename = loader.archive + else: + # At least one loader is missing both get_filename and archive: + # Google App Engine's HardenedModulesHook + # + # Fall back to imports. + __import__(import_name) + filename = sys.modules[import_name].__file__ + package_path = os.path.abspath(os.path.dirname(filename)) + + # In case the root module is a package we need to chop of the + # rightmost part. This needs to go through a helper function + # because of python 3.3 namespace packages. + if _matching_loader_thinks_module_is_package( + loader, root_mod_name): + package_path = os.path.dirname(package_path) + + site_parent, site_folder = os.path.split(package_path) + py_prefix = os.path.abspath(sys.prefix) + if package_path.startswith(py_prefix): + return py_prefix, package_path + elif site_folder.lower() == 'site-packages': + parent, folder = os.path.split(site_parent) + # Windows like installations + if folder.lower() == 'lib': + base_dir = parent + # UNIX like installations + elif os.path.basename(parent).lower() == 'lib': + base_dir = os.path.dirname(parent) + else: + base_dir = site_parent + return base_dir, package_path + return None, package_path + + +class locked_cached_property(object): + """A decorator that converts a function into a lazy property. The + function wrapped is called the first time to retrieve the result + and then that calculated result is used the next time you access + the value. Works like the one in Werkzeug but has a lock for + thread safety. + """ + + def __init__(self, func, name=None, doc=None): + self.__name__ = name or func.__name__ + self.__module__ = func.__module__ + self.__doc__ = doc or func.__doc__ + self.func = func + self.lock = RLock() + + def __get__(self, obj, type=None): + if obj is None: + return self + with self.lock: + value = obj.__dict__.get(self.__name__, _missing) + if value is _missing: + value = self.func(obj) + obj.__dict__[self.__name__] = value + return value + + +class _PackageBoundObject(object): + #: The name of the package or module that this app belongs to. Do not + #: change this once it is set by the constructor. + import_name = None + + #: Location of the template files to be added to the template lookup. + #: ``None`` if templates should not be added. + template_folder = None + + #: Absolute path to the package on the filesystem. Used to look up + #: resources contained in the package. + root_path = None + + def __init__(self, import_name, template_folder=None, root_path=None): + self.import_name = import_name + self.template_folder = template_folder + + if root_path is None: + root_path = get_root_path(self.import_name) + + self.root_path = root_path + self._static_folder = None + self._static_url_path = None + + def _get_static_folder(self): + if self._static_folder is not None: + return os.path.join(self.root_path, self._static_folder) + + def _set_static_folder(self, value): + self._static_folder = value + + static_folder = property( + _get_static_folder, _set_static_folder, + doc='The absolute path to the configured static folder.' + ) + del _get_static_folder, _set_static_folder + + def _get_static_url_path(self): + if self._static_url_path is not None: + return self._static_url_path + + if self.static_folder is not None: + return '/' + os.path.basename(self.static_folder) + + def _set_static_url_path(self, value): + self._static_url_path = value + + static_url_path = property( + _get_static_url_path, _set_static_url_path, + doc='The URL prefix that the static route will be registered for.' + ) + del _get_static_url_path, _set_static_url_path + + @property + def has_static_folder(self): + """This is ``True`` if the package bound object's container has a + folder for static files. + + .. versionadded:: 0.5 + """ + return self.static_folder is not None + + @locked_cached_property + def jinja_loader(self): + """The Jinja loader for this package bound object. + + .. versionadded:: 0.5 + """ + if self.template_folder is not None: + return FileSystemLoader(os.path.join(self.root_path, + self.template_folder)) + + def get_send_file_max_age(self, filename): + """Provides default cache_timeout for the :func:`send_file` functions. + + By default, this function returns ``SEND_FILE_MAX_AGE_DEFAULT`` from + the configuration of :data:`~flask.current_app`. + + Static file functions such as :func:`send_from_directory` use this + function, and :func:`send_file` calls this function on + :data:`~flask.current_app` when the given cache_timeout is ``None``. If a + cache_timeout is given in :func:`send_file`, that timeout is used; + otherwise, this method is called. + + This allows subclasses to change the behavior when sending files based + on the filename. For example, to set the cache timeout for .js files + to 60 seconds:: + + class MyFlask(flask.Flask): + def get_send_file_max_age(self, name): + if name.lower().endswith('.js'): + return 60 + return flask.Flask.get_send_file_max_age(self, name) + + .. versionadded:: 0.9 + """ + return total_seconds(current_app.send_file_max_age_default) + + def send_static_file(self, filename): + """Function used internally to send static files from the static + folder to the browser. + + .. versionadded:: 0.5 + """ + if not self.has_static_folder: + raise RuntimeError('No static folder for this object') + # Ensure get_send_file_max_age is called in all cases. + # Here, we ensure get_send_file_max_age is called for Blueprints. + cache_timeout = self.get_send_file_max_age(filename) + return send_from_directory(self.static_folder, filename, + cache_timeout=cache_timeout) + + def open_resource(self, resource, mode='rb'): + """Opens a resource from the application's resource folder. To see + how this works, consider the following folder structure:: + + /myapplication.py + /schema.sql + /static + /style.css + /templates + /layout.html + /index.html + + If you want to open the :file:`schema.sql` file you would do the + following:: + + with app.open_resource('schema.sql') as f: + contents = f.read() + do_something_with(contents) + + :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'. + """ + if mode not in ('r', 'rb'): + raise ValueError('Resources can only be opened for reading') + return open(os.path.join(self.root_path, resource), mode) + + +def total_seconds(td): + """Returns the total seconds from a timedelta object. + + :param timedelta td: the timedelta to be converted in seconds + + :returns: number of seconds + :rtype: int + """ + return td.days * 60 * 60 * 24 + td.seconds + + +def is_ip(value): + """Determine if the given string is an IP address. + + Python 2 on Windows doesn't provide ``inet_pton``, so this only + checks IPv4 addresses in that environment. + + :param value: value to check + :type value: str + + :return: True if string is an IP address + :rtype: bool + """ + if PY2 and os.name == 'nt': + try: + socket.inet_aton(value) + return True + except socket.error: + return False + + for family in (socket.AF_INET, socket.AF_INET6): + try: + socket.inet_pton(family, value) + except socket.error: + pass + else: + return True + + return False diff --git a/backend/venv/lib/python3.7/site-packages/flask/json/__init__.py b/backend/venv/lib/python3.7/site-packages/flask/json/__init__.py new file mode 100644 index 000000000..c24286c95 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/flask/json/__init__.py @@ -0,0 +1,357 @@ +# -*- coding: utf-8 -*- +""" +flask.json +~~~~~~~~~~ + +:copyright: © 2010 by the Pallets team. +:license: BSD, see LICENSE for more details. +""" +import codecs +import io +import uuid +from datetime import date, datetime +from flask.globals import current_app, request +from flask._compat import text_type, PY2 + +from werkzeug.http import http_date +from jinja2 import Markup + +# Use the same json implementation as itsdangerous on which we +# depend anyways. +from itsdangerous import json as _json + + +# Figure out if simplejson escapes slashes. This behavior was changed +# from one version to another without reason. +_slash_escape = '\\/' not in _json.dumps('/') + + +__all__ = ['dump', 'dumps', 'load', 'loads', 'htmlsafe_dump', + 'htmlsafe_dumps', 'JSONDecoder', 'JSONEncoder', + 'jsonify'] + + +def _wrap_reader_for_text(fp, encoding): + if isinstance(fp.read(0), bytes): + fp = io.TextIOWrapper(io.BufferedReader(fp), encoding) + return fp + + +def _wrap_writer_for_text(fp, encoding): + try: + fp.write('') + except TypeError: + fp = io.TextIOWrapper(fp, encoding) + return fp + + +class JSONEncoder(_json.JSONEncoder): + """The default Flask JSON encoder. This one extends the default simplejson + encoder by also supporting ``datetime`` objects, ``UUID`` as well as + ``Markup`` objects which are serialized as RFC 822 datetime strings (same + as the HTTP date format). In order to support more data types override the + :meth:`default` method. + """ + + def default(self, o): + """Implement this method in a subclass such that it returns a + serializable object for ``o``, or calls the base implementation (to + raise a :exc:`TypeError`). + + For example, to support arbitrary iterators, you could implement + default like this:: + + def default(self, o): + try: + iterable = iter(o) + except TypeError: + pass + else: + return list(iterable) + return JSONEncoder.default(self, o) + """ + if isinstance(o, datetime): + return http_date(o.utctimetuple()) + if isinstance(o, date): + return http_date(o.timetuple()) + if isinstance(o, uuid.UUID): + return str(o) + if hasattr(o, '__html__'): + return text_type(o.__html__()) + return _json.JSONEncoder.default(self, o) + + +class JSONDecoder(_json.JSONDecoder): + """The default JSON decoder. This one does not change the behavior from + the default simplejson decoder. Consult the :mod:`json` documentation + for more information. This decoder is not only used for the load + functions of this module but also :attr:`~flask.Request`. + """ + + +def _dump_arg_defaults(kwargs, app=None): + """Inject default arguments for dump functions.""" + if app is None: + app = current_app + + if app: + bp = app.blueprints.get(request.blueprint) if request else None + kwargs.setdefault( + 'cls', bp.json_encoder if bp and bp.json_encoder else app.json_encoder + ) + + if not app.config['JSON_AS_ASCII']: + kwargs.setdefault('ensure_ascii', False) + + kwargs.setdefault('sort_keys', app.config['JSON_SORT_KEYS']) + else: + kwargs.setdefault('sort_keys', True) + kwargs.setdefault('cls', JSONEncoder) + + +def _load_arg_defaults(kwargs, app=None): + """Inject default arguments for load functions.""" + if app is None: + app = current_app + + if app: + bp = app.blueprints.get(request.blueprint) if request else None + kwargs.setdefault( + 'cls', + bp.json_decoder if bp and bp.json_decoder + else app.json_decoder + ) + else: + kwargs.setdefault('cls', JSONDecoder) + + +def detect_encoding(data): + """Detect which UTF codec 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. + + :param data: Bytes in unknown UTF encoding. + :return: UTF encoding name + """ + 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 dumps(obj, app=None, **kwargs): + """Serialize ``obj`` to a JSON-formatted string. If there is an + app context pushed, use the current app's configured encoder + (:attr:`~flask.Flask.json_encoder`), or fall back to the default + :class:`JSONEncoder`. + + Takes the same arguments as the built-in :func:`json.dumps`, and + does some extra configuration based on the application. If the + simplejson package is installed, it is preferred. + + :param obj: Object to serialize to JSON. + :param app: App instance to use to configure the JSON encoder. + Uses ``current_app`` if not given, and falls back to the default + encoder when not in an app context. + :param kwargs: Extra arguments passed to :func:`json.dumps`. + + .. 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 and isinstance(rv, text_type): + rv = rv.encode(encoding) + return rv + + +def dump(obj, fp, app=None, **kwargs): + """Like :func:`dumps` but writes into a file object.""" + _dump_arg_defaults(kwargs, app=app) + encoding = kwargs.pop('encoding', None) + if encoding is not None: + fp = _wrap_writer_for_text(fp, encoding) + _json.dump(obj, fp, **kwargs) + + +def loads(s, app=None, **kwargs): + """Deserialize an object from a JSON-formatted string ``s``. If + there is an app context pushed, use the current app's configured + decoder (:attr:`~flask.Flask.json_decoder`), or fall back to the + default :class:`JSONDecoder`. + + Takes the same arguments as the built-in :func:`json.loads`, and + does some extra configuration based on the application. If the + simplejson package is installed, it is preferred. + + :param s: JSON string to deserialize. + :param app: App instance to use to configure the JSON decoder. + Uses ``current_app`` if not given, and falls back to the default + encoder when not in an app context. + :param kwargs: Extra arguments passed to :func:`json.dumps`. + + .. versionchanged:: 1.0.3 + + ``app`` can be passed directly, rather than requiring an app + context for configuration. + """ + _load_arg_defaults(kwargs, app=app) + if isinstance(s, bytes): + encoding = kwargs.pop('encoding', None) + if encoding is None: + encoding = detect_encoding(s) + s = s.decode(encoding) + return _json.loads(s, **kwargs) + + +def load(fp, app=None, **kwargs): + """Like :func:`loads` but reads from a file object.""" + _load_arg_defaults(kwargs, app=app) + if not PY2: + fp = _wrap_reader_for_text(fp, kwargs.pop('encoding', None) or 'utf-8') + return _json.load(fp, **kwargs) + + +def htmlsafe_dumps(obj, **kwargs): + """Works exactly like :func:`dumps` but is safe for use in ``') - # => <script> do_nasty_stuff() </script> - # sanitize_html('Click here for $100') - # => Click here for $100 - def sanitize_token(self, token): - - # accommodate filters which use token_type differently - token_type = token["type"] - if token_type in ("StartTag", "EndTag", "EmptyTag"): - name = token["name"] - namespace = token["namespace"] - if ((namespace, name) in self.allowed_elements or - (namespace is None and - (namespaces["html"], name) in self.allowed_elements)): - return self.allowed_token(token) - else: - return self.disallowed_token(token) - elif token_type == "Comment": - pass - else: - return token - - def allowed_token(self, token): - if "data" in token: - attrs = token["data"] - attr_names = set(attrs.keys()) - - # Remove forbidden attributes - for to_remove in (attr_names - self.allowed_attributes): - del token["data"][to_remove] - attr_names.remove(to_remove) - - # Remove attributes with disallowed URL values - for attr in (attr_names & self.attr_val_is_uri): - assert attr in attrs - # I don't have a clue where this regexp comes from or why it matches those - # characters, nor why we call unescape. I just know it's always been here. - # Should you be worried by this comment in a sanitizer? Yes. On the other hand, all - # this will do is remove *more* than it otherwise would. - val_unescaped = re.sub("[`\x00-\x20\x7f-\xa0\\s]+", '', - unescape(attrs[attr])).lower() - # remove replacement characters from unescaped characters - val_unescaped = val_unescaped.replace("\ufffd", "") - try: - uri = urlparse.urlparse(val_unescaped) - except ValueError: - uri = None - del attrs[attr] - if uri and uri.scheme: - if uri.scheme not in self.allowed_protocols: - del attrs[attr] - if uri.scheme == 'data': - m = data_content_type.match(uri.path) - if not m: - del attrs[attr] - elif m.group('content_type') not in self.allowed_content_types: - del attrs[attr] - - for attr in self.svg_attr_val_allows_ref: - if attr in attrs: - attrs[attr] = re.sub(r'url\s*\(\s*[^#\s][^)]+?\)', - ' ', - unescape(attrs[attr])) - if (token["name"] in self.svg_allow_local_href and - (namespaces['xlink'], 'href') in attrs and re.search(r'^\s*[^#\s].*', - attrs[(namespaces['xlink'], 'href')])): - del attrs[(namespaces['xlink'], 'href')] - if (None, 'style') in attrs: - attrs[(None, 'style')] = self.sanitize_css(attrs[(None, 'style')]) - token["data"] = attrs - return token - - def disallowed_token(self, token): - token_type = token["type"] - if token_type == "EndTag": - token["data"] = "" % token["name"] - elif token["data"]: - assert token_type in ("StartTag", "EmptyTag") - attrs = [] - for (ns, name), v in token["data"].items(): - attrs.append(' %s="%s"' % (name if ns is None else "%s:%s" % (prefixes[ns], name), escape(v))) - token["data"] = "<%s%s>" % (token["name"], ''.join(attrs)) - else: - token["data"] = "<%s>" % token["name"] - if token.get("selfClosing"): - token["data"] = token["data"][:-1] + "/>" - - token["type"] = "Characters" - - del token["name"] - return token - - def sanitize_css(self, style): - # disallow urls - style = re.compile(r'url\s*\(\s*[^\s)]+?\s*\)\s*').sub(' ', style) - - # gauntlet - if not re.match(r"""^([:,;#%.\sa-zA-Z0-9!]|\w-\w|'[\s\w]+'|"[\s\w]+"|\([\d,\s]+\))*$""", style): - return '' - if not re.match(r"^\s*([-\w]+\s*:[^:;]*(;\s*|$))*$", style): - return '' - - clean = [] - for prop, value in re.findall(r"([-\w]+)\s*:\s*([^:;]*)", style): - if not value: - continue - if prop.lower() in self.allowed_css_properties: - clean.append(prop + ': ' + value + ';') - elif prop.split('-')[0].lower() in ['background', 'border', 'margin', - 'padding']: - for keyword in value.split(): - if keyword not in self.allowed_css_keywords and \ - not re.match(r"^(#[0-9a-fA-F]+|rgb\(\d+%?,\d*%?,?\d*%?\)?|\d{0,2}\.?\d{0,2}(cm|em|ex|in|mm|pc|pt|px|%|,|\))?)$", keyword): # noqa - break - else: - clean.append(prop + ': ' + value + ';') - elif prop.lower() in self.allowed_svg_properties: - clean.append(prop + ': ' + value + ';') - - return ' '.join(clean) +from __future__ import absolute_import, division, unicode_literals + +import re +from xml.sax.saxutils import escape, unescape + +from pip._vendor.six.moves import urllib_parse as urlparse + +from . import base +from ..constants import namespaces, prefixes + +__all__ = ["Filter"] + + +allowed_elements = frozenset(( + (namespaces['html'], 'a'), + (namespaces['html'], 'abbr'), + (namespaces['html'], 'acronym'), + (namespaces['html'], 'address'), + (namespaces['html'], 'area'), + (namespaces['html'], 'article'), + (namespaces['html'], 'aside'), + (namespaces['html'], 'audio'), + (namespaces['html'], 'b'), + (namespaces['html'], 'big'), + (namespaces['html'], 'blockquote'), + (namespaces['html'], 'br'), + (namespaces['html'], 'button'), + (namespaces['html'], 'canvas'), + (namespaces['html'], 'caption'), + (namespaces['html'], 'center'), + (namespaces['html'], 'cite'), + (namespaces['html'], 'code'), + (namespaces['html'], 'col'), + (namespaces['html'], 'colgroup'), + (namespaces['html'], 'command'), + (namespaces['html'], 'datagrid'), + (namespaces['html'], 'datalist'), + (namespaces['html'], 'dd'), + (namespaces['html'], 'del'), + (namespaces['html'], 'details'), + (namespaces['html'], 'dfn'), + (namespaces['html'], 'dialog'), + (namespaces['html'], 'dir'), + (namespaces['html'], 'div'), + (namespaces['html'], 'dl'), + (namespaces['html'], 'dt'), + (namespaces['html'], 'em'), + (namespaces['html'], 'event-source'), + (namespaces['html'], 'fieldset'), + (namespaces['html'], 'figcaption'), + (namespaces['html'], 'figure'), + (namespaces['html'], 'footer'), + (namespaces['html'], 'font'), + (namespaces['html'], 'form'), + (namespaces['html'], 'header'), + (namespaces['html'], 'h1'), + (namespaces['html'], 'h2'), + (namespaces['html'], 'h3'), + (namespaces['html'], 'h4'), + (namespaces['html'], 'h5'), + (namespaces['html'], 'h6'), + (namespaces['html'], 'hr'), + (namespaces['html'], 'i'), + (namespaces['html'], 'img'), + (namespaces['html'], 'input'), + (namespaces['html'], 'ins'), + (namespaces['html'], 'keygen'), + (namespaces['html'], 'kbd'), + (namespaces['html'], 'label'), + (namespaces['html'], 'legend'), + (namespaces['html'], 'li'), + (namespaces['html'], 'm'), + (namespaces['html'], 'map'), + (namespaces['html'], 'menu'), + (namespaces['html'], 'meter'), + (namespaces['html'], 'multicol'), + (namespaces['html'], 'nav'), + (namespaces['html'], 'nextid'), + (namespaces['html'], 'ol'), + (namespaces['html'], 'output'), + (namespaces['html'], 'optgroup'), + (namespaces['html'], 'option'), + (namespaces['html'], 'p'), + (namespaces['html'], 'pre'), + (namespaces['html'], 'progress'), + (namespaces['html'], 'q'), + (namespaces['html'], 's'), + (namespaces['html'], 'samp'), + (namespaces['html'], 'section'), + (namespaces['html'], 'select'), + (namespaces['html'], 'small'), + (namespaces['html'], 'sound'), + (namespaces['html'], 'source'), + (namespaces['html'], 'spacer'), + (namespaces['html'], 'span'), + (namespaces['html'], 'strike'), + (namespaces['html'], 'strong'), + (namespaces['html'], 'sub'), + (namespaces['html'], 'sup'), + (namespaces['html'], 'table'), + (namespaces['html'], 'tbody'), + (namespaces['html'], 'td'), + (namespaces['html'], 'textarea'), + (namespaces['html'], 'time'), + (namespaces['html'], 'tfoot'), + (namespaces['html'], 'th'), + (namespaces['html'], 'thead'), + (namespaces['html'], 'tr'), + (namespaces['html'], 'tt'), + (namespaces['html'], 'u'), + (namespaces['html'], 'ul'), + (namespaces['html'], 'var'), + (namespaces['html'], 'video'), + (namespaces['mathml'], 'maction'), + (namespaces['mathml'], 'math'), + (namespaces['mathml'], 'merror'), + (namespaces['mathml'], 'mfrac'), + (namespaces['mathml'], 'mi'), + (namespaces['mathml'], 'mmultiscripts'), + (namespaces['mathml'], 'mn'), + (namespaces['mathml'], 'mo'), + (namespaces['mathml'], 'mover'), + (namespaces['mathml'], 'mpadded'), + (namespaces['mathml'], 'mphantom'), + (namespaces['mathml'], 'mprescripts'), + (namespaces['mathml'], 'mroot'), + (namespaces['mathml'], 'mrow'), + (namespaces['mathml'], 'mspace'), + (namespaces['mathml'], 'msqrt'), + (namespaces['mathml'], 'mstyle'), + (namespaces['mathml'], 'msub'), + (namespaces['mathml'], 'msubsup'), + (namespaces['mathml'], 'msup'), + (namespaces['mathml'], 'mtable'), + (namespaces['mathml'], 'mtd'), + (namespaces['mathml'], 'mtext'), + (namespaces['mathml'], 'mtr'), + (namespaces['mathml'], 'munder'), + (namespaces['mathml'], 'munderover'), + (namespaces['mathml'], 'none'), + (namespaces['svg'], 'a'), + (namespaces['svg'], 'animate'), + (namespaces['svg'], 'animateColor'), + (namespaces['svg'], 'animateMotion'), + (namespaces['svg'], 'animateTransform'), + (namespaces['svg'], 'clipPath'), + (namespaces['svg'], 'circle'), + (namespaces['svg'], 'defs'), + (namespaces['svg'], 'desc'), + (namespaces['svg'], 'ellipse'), + (namespaces['svg'], 'font-face'), + (namespaces['svg'], 'font-face-name'), + (namespaces['svg'], 'font-face-src'), + (namespaces['svg'], 'g'), + (namespaces['svg'], 'glyph'), + (namespaces['svg'], 'hkern'), + (namespaces['svg'], 'linearGradient'), + (namespaces['svg'], 'line'), + (namespaces['svg'], 'marker'), + (namespaces['svg'], 'metadata'), + (namespaces['svg'], 'missing-glyph'), + (namespaces['svg'], 'mpath'), + (namespaces['svg'], 'path'), + (namespaces['svg'], 'polygon'), + (namespaces['svg'], 'polyline'), + (namespaces['svg'], 'radialGradient'), + (namespaces['svg'], 'rect'), + (namespaces['svg'], 'set'), + (namespaces['svg'], 'stop'), + (namespaces['svg'], 'svg'), + (namespaces['svg'], 'switch'), + (namespaces['svg'], 'text'), + (namespaces['svg'], 'title'), + (namespaces['svg'], 'tspan'), + (namespaces['svg'], 'use'), +)) + +allowed_attributes = frozenset(( + # HTML attributes + (None, 'abbr'), + (None, 'accept'), + (None, 'accept-charset'), + (None, 'accesskey'), + (None, 'action'), + (None, 'align'), + (None, 'alt'), + (None, 'autocomplete'), + (None, 'autofocus'), + (None, 'axis'), + (None, 'background'), + (None, 'balance'), + (None, 'bgcolor'), + (None, 'bgproperties'), + (None, 'border'), + (None, 'bordercolor'), + (None, 'bordercolordark'), + (None, 'bordercolorlight'), + (None, 'bottompadding'), + (None, 'cellpadding'), + (None, 'cellspacing'), + (None, 'ch'), + (None, 'challenge'), + (None, 'char'), + (None, 'charoff'), + (None, 'choff'), + (None, 'charset'), + (None, 'checked'), + (None, 'cite'), + (None, 'class'), + (None, 'clear'), + (None, 'color'), + (None, 'cols'), + (None, 'colspan'), + (None, 'compact'), + (None, 'contenteditable'), + (None, 'controls'), + (None, 'coords'), + (None, 'data'), + (None, 'datafld'), + (None, 'datapagesize'), + (None, 'datasrc'), + (None, 'datetime'), + (None, 'default'), + (None, 'delay'), + (None, 'dir'), + (None, 'disabled'), + (None, 'draggable'), + (None, 'dynsrc'), + (None, 'enctype'), + (None, 'end'), + (None, 'face'), + (None, 'for'), + (None, 'form'), + (None, 'frame'), + (None, 'galleryimg'), + (None, 'gutter'), + (None, 'headers'), + (None, 'height'), + (None, 'hidefocus'), + (None, 'hidden'), + (None, 'high'), + (None, 'href'), + (None, 'hreflang'), + (None, 'hspace'), + (None, 'icon'), + (None, 'id'), + (None, 'inputmode'), + (None, 'ismap'), + (None, 'keytype'), + (None, 'label'), + (None, 'leftspacing'), + (None, 'lang'), + (None, 'list'), + (None, 'longdesc'), + (None, 'loop'), + (None, 'loopcount'), + (None, 'loopend'), + (None, 'loopstart'), + (None, 'low'), + (None, 'lowsrc'), + (None, 'max'), + (None, 'maxlength'), + (None, 'media'), + (None, 'method'), + (None, 'min'), + (None, 'multiple'), + (None, 'name'), + (None, 'nohref'), + (None, 'noshade'), + (None, 'nowrap'), + (None, 'open'), + (None, 'optimum'), + (None, 'pattern'), + (None, 'ping'), + (None, 'point-size'), + (None, 'poster'), + (None, 'pqg'), + (None, 'preload'), + (None, 'prompt'), + (None, 'radiogroup'), + (None, 'readonly'), + (None, 'rel'), + (None, 'repeat-max'), + (None, 'repeat-min'), + (None, 'replace'), + (None, 'required'), + (None, 'rev'), + (None, 'rightspacing'), + (None, 'rows'), + (None, 'rowspan'), + (None, 'rules'), + (None, 'scope'), + (None, 'selected'), + (None, 'shape'), + (None, 'size'), + (None, 'span'), + (None, 'src'), + (None, 'start'), + (None, 'step'), + (None, 'style'), + (None, 'summary'), + (None, 'suppress'), + (None, 'tabindex'), + (None, 'target'), + (None, 'template'), + (None, 'title'), + (None, 'toppadding'), + (None, 'type'), + (None, 'unselectable'), + (None, 'usemap'), + (None, 'urn'), + (None, 'valign'), + (None, 'value'), + (None, 'variable'), + (None, 'volume'), + (None, 'vspace'), + (None, 'vrml'), + (None, 'width'), + (None, 'wrap'), + (namespaces['xml'], 'lang'), + # MathML attributes + (None, 'actiontype'), + (None, 'align'), + (None, 'columnalign'), + (None, 'columnalign'), + (None, 'columnalign'), + (None, 'columnlines'), + (None, 'columnspacing'), + (None, 'columnspan'), + (None, 'depth'), + (None, 'display'), + (None, 'displaystyle'), + (None, 'equalcolumns'), + (None, 'equalrows'), + (None, 'fence'), + (None, 'fontstyle'), + (None, 'fontweight'), + (None, 'frame'), + (None, 'height'), + (None, 'linethickness'), + (None, 'lspace'), + (None, 'mathbackground'), + (None, 'mathcolor'), + (None, 'mathvariant'), + (None, 'mathvariant'), + (None, 'maxsize'), + (None, 'minsize'), + (None, 'other'), + (None, 'rowalign'), + (None, 'rowalign'), + (None, 'rowalign'), + (None, 'rowlines'), + (None, 'rowspacing'), + (None, 'rowspan'), + (None, 'rspace'), + (None, 'scriptlevel'), + (None, 'selection'), + (None, 'separator'), + (None, 'stretchy'), + (None, 'width'), + (None, 'width'), + (namespaces['xlink'], 'href'), + (namespaces['xlink'], 'show'), + (namespaces['xlink'], 'type'), + # SVG attributes + (None, 'accent-height'), + (None, 'accumulate'), + (None, 'additive'), + (None, 'alphabetic'), + (None, 'arabic-form'), + (None, 'ascent'), + (None, 'attributeName'), + (None, 'attributeType'), + (None, 'baseProfile'), + (None, 'bbox'), + (None, 'begin'), + (None, 'by'), + (None, 'calcMode'), + (None, 'cap-height'), + (None, 'class'), + (None, 'clip-path'), + (None, 'color'), + (None, 'color-rendering'), + (None, 'content'), + (None, 'cx'), + (None, 'cy'), + (None, 'd'), + (None, 'dx'), + (None, 'dy'), + (None, 'descent'), + (None, 'display'), + (None, 'dur'), + (None, 'end'), + (None, 'fill'), + (None, 'fill-opacity'), + (None, 'fill-rule'), + (None, 'font-family'), + (None, 'font-size'), + (None, 'font-stretch'), + (None, 'font-style'), + (None, 'font-variant'), + (None, 'font-weight'), + (None, 'from'), + (None, 'fx'), + (None, 'fy'), + (None, 'g1'), + (None, 'g2'), + (None, 'glyph-name'), + (None, 'gradientUnits'), + (None, 'hanging'), + (None, 'height'), + (None, 'horiz-adv-x'), + (None, 'horiz-origin-x'), + (None, 'id'), + (None, 'ideographic'), + (None, 'k'), + (None, 'keyPoints'), + (None, 'keySplines'), + (None, 'keyTimes'), + (None, 'lang'), + (None, 'marker-end'), + (None, 'marker-mid'), + (None, 'marker-start'), + (None, 'markerHeight'), + (None, 'markerUnits'), + (None, 'markerWidth'), + (None, 'mathematical'), + (None, 'max'), + (None, 'min'), + (None, 'name'), + (None, 'offset'), + (None, 'opacity'), + (None, 'orient'), + (None, 'origin'), + (None, 'overline-position'), + (None, 'overline-thickness'), + (None, 'panose-1'), + (None, 'path'), + (None, 'pathLength'), + (None, 'points'), + (None, 'preserveAspectRatio'), + (None, 'r'), + (None, 'refX'), + (None, 'refY'), + (None, 'repeatCount'), + (None, 'repeatDur'), + (None, 'requiredExtensions'), + (None, 'requiredFeatures'), + (None, 'restart'), + (None, 'rotate'), + (None, 'rx'), + (None, 'ry'), + (None, 'slope'), + (None, 'stemh'), + (None, 'stemv'), + (None, 'stop-color'), + (None, 'stop-opacity'), + (None, 'strikethrough-position'), + (None, 'strikethrough-thickness'), + (None, 'stroke'), + (None, 'stroke-dasharray'), + (None, 'stroke-dashoffset'), + (None, 'stroke-linecap'), + (None, 'stroke-linejoin'), + (None, 'stroke-miterlimit'), + (None, 'stroke-opacity'), + (None, 'stroke-width'), + (None, 'systemLanguage'), + (None, 'target'), + (None, 'text-anchor'), + (None, 'to'), + (None, 'transform'), + (None, 'type'), + (None, 'u1'), + (None, 'u2'), + (None, 'underline-position'), + (None, 'underline-thickness'), + (None, 'unicode'), + (None, 'unicode-range'), + (None, 'units-per-em'), + (None, 'values'), + (None, 'version'), + (None, 'viewBox'), + (None, 'visibility'), + (None, 'width'), + (None, 'widths'), + (None, 'x'), + (None, 'x-height'), + (None, 'x1'), + (None, 'x2'), + (namespaces['xlink'], 'actuate'), + (namespaces['xlink'], 'arcrole'), + (namespaces['xlink'], 'href'), + (namespaces['xlink'], 'role'), + (namespaces['xlink'], 'show'), + (namespaces['xlink'], 'title'), + (namespaces['xlink'], 'type'), + (namespaces['xml'], 'base'), + (namespaces['xml'], 'lang'), + (namespaces['xml'], 'space'), + (None, 'y'), + (None, 'y1'), + (None, 'y2'), + (None, 'zoomAndPan'), +)) + +attr_val_is_uri = frozenset(( + (None, 'href'), + (None, 'src'), + (None, 'cite'), + (None, 'action'), + (None, 'longdesc'), + (None, 'poster'), + (None, 'background'), + (None, 'datasrc'), + (None, 'dynsrc'), + (None, 'lowsrc'), + (None, 'ping'), + (namespaces['xlink'], 'href'), + (namespaces['xml'], 'base'), +)) + +svg_attr_val_allows_ref = frozenset(( + (None, 'clip-path'), + (None, 'color-profile'), + (None, 'cursor'), + (None, 'fill'), + (None, 'filter'), + (None, 'marker'), + (None, 'marker-start'), + (None, 'marker-mid'), + (None, 'marker-end'), + (None, 'mask'), + (None, 'stroke'), +)) + +svg_allow_local_href = frozenset(( + (None, 'altGlyph'), + (None, 'animate'), + (None, 'animateColor'), + (None, 'animateMotion'), + (None, 'animateTransform'), + (None, 'cursor'), + (None, 'feImage'), + (None, 'filter'), + (None, 'linearGradient'), + (None, 'pattern'), + (None, 'radialGradient'), + (None, 'textpath'), + (None, 'tref'), + (None, 'set'), + (None, 'use') +)) + +allowed_css_properties = frozenset(( + 'azimuth', + 'background-color', + 'border-bottom-color', + 'border-collapse', + 'border-color', + 'border-left-color', + 'border-right-color', + 'border-top-color', + 'clear', + 'color', + 'cursor', + 'direction', + 'display', + 'elevation', + 'float', + 'font', + 'font-family', + 'font-size', + 'font-style', + 'font-variant', + 'font-weight', + 'height', + 'letter-spacing', + 'line-height', + 'overflow', + 'pause', + 'pause-after', + 'pause-before', + 'pitch', + 'pitch-range', + 'richness', + 'speak', + 'speak-header', + 'speak-numeral', + 'speak-punctuation', + 'speech-rate', + 'stress', + 'text-align', + 'text-decoration', + 'text-indent', + 'unicode-bidi', + 'vertical-align', + 'voice-family', + 'volume', + 'white-space', + 'width', +)) + +allowed_css_keywords = frozenset(( + 'auto', + 'aqua', + 'black', + 'block', + 'blue', + 'bold', + 'both', + 'bottom', + 'brown', + 'center', + 'collapse', + 'dashed', + 'dotted', + 'fuchsia', + 'gray', + 'green', + '!important', + 'italic', + 'left', + 'lime', + 'maroon', + 'medium', + 'none', + 'navy', + 'normal', + 'nowrap', + 'olive', + 'pointer', + 'purple', + 'red', + 'right', + 'solid', + 'silver', + 'teal', + 'top', + 'transparent', + 'underline', + 'white', + 'yellow', +)) + +allowed_svg_properties = frozenset(( + 'fill', + 'fill-opacity', + 'fill-rule', + 'stroke', + 'stroke-width', + 'stroke-linecap', + 'stroke-linejoin', + 'stroke-opacity', +)) + +allowed_protocols = frozenset(( + 'ed2k', + 'ftp', + 'http', + 'https', + 'irc', + 'mailto', + 'news', + 'gopher', + 'nntp', + 'telnet', + 'webcal', + 'xmpp', + 'callto', + 'feed', + 'urn', + 'aim', + 'rsync', + 'tag', + 'ssh', + 'sftp', + 'rtsp', + 'afs', + 'data', +)) + +allowed_content_types = frozenset(( + 'image/png', + 'image/jpeg', + 'image/gif', + 'image/webp', + 'image/bmp', + 'text/plain', +)) + + +data_content_type = re.compile(r''' + ^ + # Match a content type / + (?P[-a-zA-Z0-9.]+/[-a-zA-Z0-9.]+) + # Match any character set and encoding + (?:(?:;charset=(?:[-a-zA-Z0-9]+)(?:;(?:base64))?) + |(?:;(?:base64))?(?:;charset=(?:[-a-zA-Z0-9]+))?) + # Assume the rest is data + ,.* + $ + ''', + re.VERBOSE) + + +class Filter(base.Filter): + """Sanitizes token stream of XHTML+MathML+SVG and of inline style attributes""" + def __init__(self, + source, + allowed_elements=allowed_elements, + allowed_attributes=allowed_attributes, + allowed_css_properties=allowed_css_properties, + allowed_css_keywords=allowed_css_keywords, + allowed_svg_properties=allowed_svg_properties, + allowed_protocols=allowed_protocols, + allowed_content_types=allowed_content_types, + attr_val_is_uri=attr_val_is_uri, + svg_attr_val_allows_ref=svg_attr_val_allows_ref, + svg_allow_local_href=svg_allow_local_href): + """Creates a Filter + + :arg allowed_elements: set of elements to allow--everything else will + be escaped + + :arg allowed_attributes: set of attributes to allow in + elements--everything else will be stripped + + :arg allowed_css_properties: set of CSS properties to allow--everything + else will be stripped + + :arg allowed_css_keywords: set of CSS keywords to allow--everything + else will be stripped + + :arg allowed_svg_properties: set of SVG properties to allow--everything + else will be removed + + :arg allowed_protocols: set of allowed protocols for URIs + + :arg allowed_content_types: set of allowed content types for ``data`` URIs. + + :arg attr_val_is_uri: set of attributes that have URI values--values + that have a scheme not listed in ``allowed_protocols`` are removed + + :arg svg_attr_val_allows_ref: set of SVG attributes that can have + references + + :arg svg_allow_local_href: set of SVG elements that can have local + hrefs--these are removed + + """ + super(Filter, self).__init__(source) + self.allowed_elements = allowed_elements + self.allowed_attributes = allowed_attributes + self.allowed_css_properties = allowed_css_properties + self.allowed_css_keywords = allowed_css_keywords + self.allowed_svg_properties = allowed_svg_properties + self.allowed_protocols = allowed_protocols + self.allowed_content_types = allowed_content_types + self.attr_val_is_uri = attr_val_is_uri + self.svg_attr_val_allows_ref = svg_attr_val_allows_ref + self.svg_allow_local_href = svg_allow_local_href + + def __iter__(self): + for token in base.Filter.__iter__(self): + token = self.sanitize_token(token) + if token: + yield token + + # Sanitize the +html+, escaping all elements not in ALLOWED_ELEMENTS, and + # stripping out all attributes not in ALLOWED_ATTRIBUTES. Style attributes + # are parsed, and a restricted set, specified by ALLOWED_CSS_PROPERTIES and + # ALLOWED_CSS_KEYWORDS, are allowed through. attributes in ATTR_VAL_IS_URI + # are scanned, and only URI schemes specified in ALLOWED_PROTOCOLS are + # allowed. + # + # sanitize_html('') + # => <script> do_nasty_stuff() </script> + # sanitize_html('Click here for $100') + # => Click here for $100 + def sanitize_token(self, token): + + # accommodate filters which use token_type differently + token_type = token["type"] + if token_type in ("StartTag", "EndTag", "EmptyTag"): + name = token["name"] + namespace = token["namespace"] + if ((namespace, name) in self.allowed_elements or + (namespace is None and + (namespaces["html"], name) in self.allowed_elements)): + return self.allowed_token(token) + else: + return self.disallowed_token(token) + elif token_type == "Comment": + pass + else: + return token + + def allowed_token(self, token): + if "data" in token: + attrs = token["data"] + attr_names = set(attrs.keys()) + + # Remove forbidden attributes + for to_remove in (attr_names - self.allowed_attributes): + del token["data"][to_remove] + attr_names.remove(to_remove) + + # Remove attributes with disallowed URL values + for attr in (attr_names & self.attr_val_is_uri): + assert attr in attrs + # I don't have a clue where this regexp comes from or why it matches those + # characters, nor why we call unescape. I just know it's always been here. + # Should you be worried by this comment in a sanitizer? Yes. On the other hand, all + # this will do is remove *more* than it otherwise would. + val_unescaped = re.sub("[`\x00-\x20\x7f-\xa0\\s]+", '', + unescape(attrs[attr])).lower() + # remove replacement characters from unescaped characters + val_unescaped = val_unescaped.replace("\ufffd", "") + try: + uri = urlparse.urlparse(val_unescaped) + except ValueError: + uri = None + del attrs[attr] + if uri and uri.scheme: + if uri.scheme not in self.allowed_protocols: + del attrs[attr] + if uri.scheme == 'data': + m = data_content_type.match(uri.path) + if not m: + del attrs[attr] + elif m.group('content_type') not in self.allowed_content_types: + del attrs[attr] + + for attr in self.svg_attr_val_allows_ref: + if attr in attrs: + attrs[attr] = re.sub(r'url\s*\(\s*[^#\s][^)]+?\)', + ' ', + unescape(attrs[attr])) + if (token["name"] in self.svg_allow_local_href and + (namespaces['xlink'], 'href') in attrs and re.search(r'^\s*[^#\s].*', + attrs[(namespaces['xlink'], 'href')])): + del attrs[(namespaces['xlink'], 'href')] + if (None, 'style') in attrs: + attrs[(None, 'style')] = self.sanitize_css(attrs[(None, 'style')]) + token["data"] = attrs + return token + + def disallowed_token(self, token): + token_type = token["type"] + if token_type == "EndTag": + token["data"] = "" % token["name"] + elif token["data"]: + assert token_type in ("StartTag", "EmptyTag") + attrs = [] + for (ns, name), v in token["data"].items(): + attrs.append(' %s="%s"' % (name if ns is None else "%s:%s" % (prefixes[ns], name), escape(v))) + token["data"] = "<%s%s>" % (token["name"], ''.join(attrs)) + else: + token["data"] = "<%s>" % token["name"] + if token.get("selfClosing"): + token["data"] = token["data"][:-1] + "/>" + + token["type"] = "Characters" + + del token["name"] + return token + + def sanitize_css(self, style): + # disallow urls + style = re.compile(r'url\s*\(\s*[^\s)]+?\s*\)\s*').sub(' ', style) + + # gauntlet + if not re.match(r"""^([:,;#%.\sa-zA-Z0-9!]|\w-\w|'[\s\w]+'|"[\s\w]+"|\([\d,\s]+\))*$""", style): + return '' + if not re.match(r"^\s*([-\w]+\s*:[^:;]*(;\s*|$))*$", style): + return '' + + clean = [] + for prop, value in re.findall(r"([-\w]+)\s*:\s*([^:;]*)", style): + if not value: + continue + if prop.lower() in self.allowed_css_properties: + clean.append(prop + ': ' + value + ';') + elif prop.split('-')[0].lower() in ['background', 'border', 'margin', + 'padding']: + for keyword in value.split(): + if keyword not in self.allowed_css_keywords and \ + not re.match(r"^(#[0-9a-fA-F]+|rgb\(\d+%?,\d*%?,?\d*%?\)?|\d{0,2}\.?\d{0,2}(cm|em|ex|in|mm|pc|pt|px|%|,|\))?)$", keyword): # noqa + break + else: + clean.append(prop + ': ' + value + ';') + elif prop.lower() in self.allowed_svg_properties: + clean.append(prop + ': ' + value + ';') + + return ' '.join(clean) diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/whitespace.py b/backend/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/whitespace.py similarity index 96% rename from myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/whitespace.py rename to backend/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/whitespace.py index 24bb0de05..0d12584b4 100644 --- a/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/whitespace.py +++ b/backend/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/whitespace.py @@ -1,38 +1,38 @@ -from __future__ import absolute_import, division, unicode_literals - -import re - -from . import base -from ..constants import rcdataElements, spaceCharacters -spaceCharacters = "".join(spaceCharacters) - -SPACES_REGEX = re.compile("[%s]+" % spaceCharacters) - - -class Filter(base.Filter): - """Collapses whitespace except in pre, textarea, and script elements""" - spacePreserveElements = frozenset(["pre", "textarea"] + list(rcdataElements)) - - def __iter__(self): - preserve = 0 - for token in base.Filter.__iter__(self): - type = token["type"] - if type == "StartTag" \ - and (preserve or token["name"] in self.spacePreserveElements): - preserve += 1 - - elif type == "EndTag" and preserve: - preserve -= 1 - - elif not preserve and type == "SpaceCharacters" and token["data"]: - # Test on token["data"] above to not introduce spaces where there were not - token["data"] = " " - - elif not preserve and type == "Characters": - token["data"] = collapse_spaces(token["data"]) - - yield token - - -def collapse_spaces(text): - return SPACES_REGEX.sub(' ', text) +from __future__ import absolute_import, division, unicode_literals + +import re + +from . import base +from ..constants import rcdataElements, spaceCharacters +spaceCharacters = "".join(spaceCharacters) + +SPACES_REGEX = re.compile("[%s]+" % spaceCharacters) + + +class Filter(base.Filter): + """Collapses whitespace except in pre, textarea, and script elements""" + spacePreserveElements = frozenset(["pre", "textarea"] + list(rcdataElements)) + + def __iter__(self): + preserve = 0 + for token in base.Filter.__iter__(self): + type = token["type"] + if type == "StartTag" \ + and (preserve or token["name"] in self.spacePreserveElements): + preserve += 1 + + elif type == "EndTag" and preserve: + preserve -= 1 + + elif not preserve and type == "SpaceCharacters" and token["data"]: + # Test on token["data"] above to not introduce spaces where there were not + token["data"] = " " + + elif not preserve and type == "Characters": + token["data"] = collapse_spaces(token["data"]) + + yield token + + +def collapse_spaces(text): + return SPACES_REGEX.sub(' ', text) diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/html5parser.py b/backend/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/html5parser.py similarity index 97% rename from myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/html5parser.py rename to backend/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/html5parser.py index b185971b2..ae41a1337 100644 --- a/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/html5parser.py +++ b/backend/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/html5parser.py @@ -1,2791 +1,2791 @@ -from __future__ import absolute_import, division, unicode_literals -from pip._vendor.six import with_metaclass, viewkeys - -import types -from collections import OrderedDict - -from . import _inputstream -from . import _tokenizer - -from . import treebuilders -from .treebuilders.base import Marker - -from . import _utils -from .constants import ( - spaceCharacters, asciiUpper2Lower, - specialElements, headingElements, cdataElements, rcdataElements, - tokenTypes, tagTokenTypes, - namespaces, - htmlIntegrationPointElements, mathmlTextIntegrationPointElements, - adjustForeignAttributes as adjustForeignAttributesMap, - adjustMathMLAttributes, adjustSVGAttributes, - E, - _ReparseException -) - - -def parse(doc, treebuilder="etree", namespaceHTMLElements=True, **kwargs): - """Parse an HTML document as a string or file-like object into a tree - - :arg doc: the document to parse as a string or file-like object - - :arg treebuilder: the treebuilder to use when parsing - - :arg namespaceHTMLElements: whether or not to namespace HTML elements - - :returns: parsed tree - - Example: - - >>> from html5lib.html5parser import parse - >>> parse('

    This is a doc

    ') - - - """ - tb = treebuilders.getTreeBuilder(treebuilder) - p = HTMLParser(tb, namespaceHTMLElements=namespaceHTMLElements) - return p.parse(doc, **kwargs) - - -def parseFragment(doc, container="div", treebuilder="etree", namespaceHTMLElements=True, **kwargs): - """Parse an HTML fragment as a string or file-like object into a tree - - :arg doc: the fragment to parse as a string or file-like object - - :arg container: the container context to parse the fragment in - - :arg treebuilder: the treebuilder to use when parsing - - :arg namespaceHTMLElements: whether or not to namespace HTML elements - - :returns: parsed tree - - Example: - - >>> from html5lib.html5libparser import parseFragment - >>> parseFragment('this is a fragment') - - - """ - tb = treebuilders.getTreeBuilder(treebuilder) - p = HTMLParser(tb, namespaceHTMLElements=namespaceHTMLElements) - return p.parseFragment(doc, container=container, **kwargs) - - -def method_decorator_metaclass(function): - class Decorated(type): - def __new__(meta, classname, bases, classDict): - for attributeName, attribute in classDict.items(): - if isinstance(attribute, types.FunctionType): - attribute = function(attribute) - - classDict[attributeName] = attribute - return type.__new__(meta, classname, bases, classDict) - return Decorated - - -class HTMLParser(object): - """HTML parser - - Generates a tree structure from a stream of (possibly malformed) HTML. - - """ - - def __init__(self, tree=None, strict=False, namespaceHTMLElements=True, debug=False): - """ - :arg tree: a treebuilder class controlling the type of tree that will be - returned. Built in treebuilders can be accessed through - html5lib.treebuilders.getTreeBuilder(treeType) - - :arg strict: raise an exception when a parse error is encountered - - :arg namespaceHTMLElements: whether or not to namespace HTML elements - - :arg debug: whether or not to enable debug mode which logs things - - Example: - - >>> from html5lib.html5parser import HTMLParser - >>> parser = HTMLParser() # generates parser with etree builder - >>> parser = HTMLParser('lxml', strict=True) # generates parser with lxml builder which is strict - - """ - - # Raise an exception on the first error encountered - self.strict = strict - - if tree is None: - tree = treebuilders.getTreeBuilder("etree") - self.tree = tree(namespaceHTMLElements) - self.errors = [] - - self.phases = dict([(name, cls(self, self.tree)) for name, cls in - getPhases(debug).items()]) - - def _parse(self, stream, innerHTML=False, container="div", scripting=False, **kwargs): - - self.innerHTMLMode = innerHTML - self.container = container - self.scripting = scripting - self.tokenizer = _tokenizer.HTMLTokenizer(stream, parser=self, **kwargs) - self.reset() - - try: - self.mainLoop() - except _ReparseException: - self.reset() - self.mainLoop() - - def reset(self): - self.tree.reset() - self.firstStartTag = False - self.errors = [] - self.log = [] # only used with debug mode - # "quirks" / "limited quirks" / "no quirks" - self.compatMode = "no quirks" - - if self.innerHTMLMode: - self.innerHTML = self.container.lower() - - if self.innerHTML in cdataElements: - self.tokenizer.state = self.tokenizer.rcdataState - elif self.innerHTML in rcdataElements: - self.tokenizer.state = self.tokenizer.rawtextState - elif self.innerHTML == 'plaintext': - self.tokenizer.state = self.tokenizer.plaintextState - else: - # state already is data state - # self.tokenizer.state = self.tokenizer.dataState - pass - self.phase = self.phases["beforeHtml"] - self.phase.insertHtmlElement() - self.resetInsertionMode() - else: - self.innerHTML = False # pylint:disable=redefined-variable-type - self.phase = self.phases["initial"] - - self.lastPhase = None - - self.beforeRCDataPhase = None - - self.framesetOK = True - - @property - def documentEncoding(self): - """Name of the character encoding that was used to decode the input stream, or - :obj:`None` if that is not determined yet - - """ - if not hasattr(self, 'tokenizer'): - return None - return self.tokenizer.stream.charEncoding[0].name - - def isHTMLIntegrationPoint(self, element): - if (element.name == "annotation-xml" and - element.namespace == namespaces["mathml"]): - return ("encoding" in element.attributes and - element.attributes["encoding"].translate( - asciiUpper2Lower) in - ("text/html", "application/xhtml+xml")) - else: - return (element.namespace, element.name) in htmlIntegrationPointElements - - def isMathMLTextIntegrationPoint(self, element): - return (element.namespace, element.name) in mathmlTextIntegrationPointElements - - def mainLoop(self): - CharactersToken = tokenTypes["Characters"] - SpaceCharactersToken = tokenTypes["SpaceCharacters"] - StartTagToken = tokenTypes["StartTag"] - EndTagToken = tokenTypes["EndTag"] - CommentToken = tokenTypes["Comment"] - DoctypeToken = tokenTypes["Doctype"] - ParseErrorToken = tokenTypes["ParseError"] - - for token in self.normalizedTokens(): - prev_token = None - new_token = token - while new_token is not None: - prev_token = new_token - currentNode = self.tree.openElements[-1] if self.tree.openElements else None - currentNodeNamespace = currentNode.namespace if currentNode else None - currentNodeName = currentNode.name if currentNode else None - - type = new_token["type"] - - if type == ParseErrorToken: - self.parseError(new_token["data"], new_token.get("datavars", {})) - new_token = None - else: - if (len(self.tree.openElements) == 0 or - currentNodeNamespace == self.tree.defaultNamespace or - (self.isMathMLTextIntegrationPoint(currentNode) and - ((type == StartTagToken and - token["name"] not in frozenset(["mglyph", "malignmark"])) or - type in (CharactersToken, SpaceCharactersToken))) or - (currentNodeNamespace == namespaces["mathml"] and - currentNodeName == "annotation-xml" and - type == StartTagToken and - token["name"] == "svg") or - (self.isHTMLIntegrationPoint(currentNode) and - type in (StartTagToken, CharactersToken, SpaceCharactersToken))): - phase = self.phase - else: - phase = self.phases["inForeignContent"] - - if type == CharactersToken: - new_token = phase.processCharacters(new_token) - elif type == SpaceCharactersToken: - new_token = phase.processSpaceCharacters(new_token) - elif type == StartTagToken: - new_token = phase.processStartTag(new_token) - elif type == EndTagToken: - new_token = phase.processEndTag(new_token) - elif type == CommentToken: - new_token = phase.processComment(new_token) - elif type == DoctypeToken: - new_token = phase.processDoctype(new_token) - - if (type == StartTagToken and prev_token["selfClosing"] and - not prev_token["selfClosingAcknowledged"]): - self.parseError("non-void-element-with-trailing-solidus", - {"name": prev_token["name"]}) - - # When the loop finishes it's EOF - reprocess = True - phases = [] - while reprocess: - phases.append(self.phase) - reprocess = self.phase.processEOF() - if reprocess: - assert self.phase not in phases - - def normalizedTokens(self): - for token in self.tokenizer: - yield self.normalizeToken(token) - - def parse(self, stream, *args, **kwargs): - """Parse a HTML document into a well-formed tree - - :arg stream: a file-like object or string containing the HTML to be parsed - - The optional encoding parameter must be a string that indicates - the encoding. If specified, that encoding will be used, - regardless of any BOM or later declaration (such as in a meta - element). - - :arg scripting: treat noscript elements as if JavaScript was turned on - - :returns: parsed tree - - Example: - - >>> from html5lib.html5parser import HTMLParser - >>> parser = HTMLParser() - >>> parser.parse('

    This is a doc

    ') - - - """ - self._parse(stream, False, None, *args, **kwargs) - return self.tree.getDocument() - - def parseFragment(self, stream, *args, **kwargs): - """Parse a HTML fragment into a well-formed tree fragment - - :arg container: name of the element we're setting the innerHTML - property if set to None, default to 'div' - - :arg stream: a file-like object or string containing the HTML to be parsed - - The optional encoding parameter must be a string that indicates - the encoding. If specified, that encoding will be used, - regardless of any BOM or later declaration (such as in a meta - element) - - :arg scripting: treat noscript elements as if JavaScript was turned on - - :returns: parsed tree - - Example: - - >>> from html5lib.html5libparser import HTMLParser - >>> parser = HTMLParser() - >>> parser.parseFragment('this is a fragment') - - - """ - self._parse(stream, True, *args, **kwargs) - return self.tree.getFragment() - - def parseError(self, errorcode="XXX-undefined-error", datavars=None): - # XXX The idea is to make errorcode mandatory. - if datavars is None: - datavars = {} - self.errors.append((self.tokenizer.stream.position(), errorcode, datavars)) - if self.strict: - raise ParseError(E[errorcode] % datavars) - - def normalizeToken(self, token): - # HTML5 specific normalizations to the token stream - if token["type"] == tokenTypes["StartTag"]: - raw = token["data"] - token["data"] = OrderedDict(raw) - if len(raw) > len(token["data"]): - # we had some duplicated attribute, fix so first wins - token["data"].update(raw[::-1]) - - return token - - def adjustMathMLAttributes(self, token): - adjust_attributes(token, adjustMathMLAttributes) - - def adjustSVGAttributes(self, token): - adjust_attributes(token, adjustSVGAttributes) - - def adjustForeignAttributes(self, token): - adjust_attributes(token, adjustForeignAttributesMap) - - def reparseTokenNormal(self, token): - # pylint:disable=unused-argument - self.parser.phase() - - def resetInsertionMode(self): - # The name of this method is mostly historical. (It's also used in the - # specification.) - last = False - newModes = { - "select": "inSelect", - "td": "inCell", - "th": "inCell", - "tr": "inRow", - "tbody": "inTableBody", - "thead": "inTableBody", - "tfoot": "inTableBody", - "caption": "inCaption", - "colgroup": "inColumnGroup", - "table": "inTable", - "head": "inBody", - "body": "inBody", - "frameset": "inFrameset", - "html": "beforeHead" - } - for node in self.tree.openElements[::-1]: - nodeName = node.name - new_phase = None - if node == self.tree.openElements[0]: - assert self.innerHTML - last = True - nodeName = self.innerHTML - # Check for conditions that should only happen in the innerHTML - # case - if nodeName in ("select", "colgroup", "head", "html"): - assert self.innerHTML - - if not last and node.namespace != self.tree.defaultNamespace: - continue - - if nodeName in newModes: - new_phase = self.phases[newModes[nodeName]] - break - elif last: - new_phase = self.phases["inBody"] - break - - self.phase = new_phase - - def parseRCDataRawtext(self, token, contentType): - # Generic RCDATA/RAWTEXT Parsing algorithm - assert contentType in ("RAWTEXT", "RCDATA") - - self.tree.insertElement(token) - - if contentType == "RAWTEXT": - self.tokenizer.state = self.tokenizer.rawtextState - else: - self.tokenizer.state = self.tokenizer.rcdataState - - self.originalPhase = self.phase - - self.phase = self.phases["text"] - - -@_utils.memoize -def getPhases(debug): - def log(function): - """Logger that records which phase processes each token""" - type_names = dict((value, key) for key, value in - tokenTypes.items()) - - def wrapped(self, *args, **kwargs): - if function.__name__.startswith("process") and len(args) > 0: - token = args[0] - try: - info = {"type": type_names[token['type']]} - except: - raise - if token['type'] in tagTokenTypes: - info["name"] = token['name'] - - self.parser.log.append((self.parser.tokenizer.state.__name__, - self.parser.phase.__class__.__name__, - self.__class__.__name__, - function.__name__, - info)) - return function(self, *args, **kwargs) - else: - return function(self, *args, **kwargs) - return wrapped - - def getMetaclass(use_metaclass, metaclass_func): - if use_metaclass: - return method_decorator_metaclass(metaclass_func) - else: - return type - - # pylint:disable=unused-argument - class Phase(with_metaclass(getMetaclass(debug, log))): - """Base class for helper object that implements each phase of processing - """ - - def __init__(self, parser, tree): - self.parser = parser - self.tree = tree - - def processEOF(self): - raise NotImplementedError - - def processComment(self, token): - # For most phases the following is correct. Where it's not it will be - # overridden. - self.tree.insertComment(token, self.tree.openElements[-1]) - - def processDoctype(self, token): - self.parser.parseError("unexpected-doctype") - - def processCharacters(self, token): - self.tree.insertText(token["data"]) - - def processSpaceCharacters(self, token): - self.tree.insertText(token["data"]) - - def processStartTag(self, token): - return self.startTagHandler[token["name"]](token) - - def startTagHtml(self, token): - if not self.parser.firstStartTag and token["name"] == "html": - self.parser.parseError("non-html-root") - # XXX Need a check here to see if the first start tag token emitted is - # this token... If it's not, invoke self.parser.parseError(). - for attr, value in token["data"].items(): - if attr not in self.tree.openElements[0].attributes: - self.tree.openElements[0].attributes[attr] = value - self.parser.firstStartTag = False - - def processEndTag(self, token): - return self.endTagHandler[token["name"]](token) - - class InitialPhase(Phase): - def processSpaceCharacters(self, token): - pass - - def processComment(self, token): - self.tree.insertComment(token, self.tree.document) - - def processDoctype(self, token): - name = token["name"] - publicId = token["publicId"] - systemId = token["systemId"] - correct = token["correct"] - - if (name != "html" or publicId is not None or - systemId is not None and systemId != "about:legacy-compat"): - self.parser.parseError("unknown-doctype") - - if publicId is None: - publicId = "" - - self.tree.insertDoctype(token) - - if publicId != "": - publicId = publicId.translate(asciiUpper2Lower) - - if (not correct or token["name"] != "html" or - publicId.startswith( - ("+//silmaril//dtd html pro v0r11 19970101//", - "-//advasoft ltd//dtd html 3.0 aswedit + extensions//", - "-//as//dtd html 3.0 aswedit + extensions//", - "-//ietf//dtd html 2.0 level 1//", - "-//ietf//dtd html 2.0 level 2//", - "-//ietf//dtd html 2.0 strict level 1//", - "-//ietf//dtd html 2.0 strict level 2//", - "-//ietf//dtd html 2.0 strict//", - "-//ietf//dtd html 2.0//", - "-//ietf//dtd html 2.1e//", - "-//ietf//dtd html 3.0//", - "-//ietf//dtd html 3.2 final//", - "-//ietf//dtd html 3.2//", - "-//ietf//dtd html 3//", - "-//ietf//dtd html level 0//", - "-//ietf//dtd html level 1//", - "-//ietf//dtd html level 2//", - "-//ietf//dtd html level 3//", - "-//ietf//dtd html strict level 0//", - "-//ietf//dtd html strict level 1//", - "-//ietf//dtd html strict level 2//", - "-//ietf//dtd html strict level 3//", - "-//ietf//dtd html strict//", - "-//ietf//dtd html//", - "-//metrius//dtd metrius presentational//", - "-//microsoft//dtd internet explorer 2.0 html strict//", - "-//microsoft//dtd internet explorer 2.0 html//", - "-//microsoft//dtd internet explorer 2.0 tables//", - "-//microsoft//dtd internet explorer 3.0 html strict//", - "-//microsoft//dtd internet explorer 3.0 html//", - "-//microsoft//dtd internet explorer 3.0 tables//", - "-//netscape comm. corp.//dtd html//", - "-//netscape comm. corp.//dtd strict html//", - "-//o'reilly and associates//dtd html 2.0//", - "-//o'reilly and associates//dtd html extended 1.0//", - "-//o'reilly and associates//dtd html extended relaxed 1.0//", - "-//softquad software//dtd hotmetal pro 6.0::19990601::extensions to html 4.0//", - "-//softquad//dtd hotmetal pro 4.0::19971010::extensions to html 4.0//", - "-//spyglass//dtd html 2.0 extended//", - "-//sq//dtd html 2.0 hotmetal + extensions//", - "-//sun microsystems corp.//dtd hotjava html//", - "-//sun microsystems corp.//dtd hotjava strict html//", - "-//w3c//dtd html 3 1995-03-24//", - "-//w3c//dtd html 3.2 draft//", - "-//w3c//dtd html 3.2 final//", - "-//w3c//dtd html 3.2//", - "-//w3c//dtd html 3.2s draft//", - "-//w3c//dtd html 4.0 frameset//", - "-//w3c//dtd html 4.0 transitional//", - "-//w3c//dtd html experimental 19960712//", - "-//w3c//dtd html experimental 970421//", - "-//w3c//dtd w3 html//", - "-//w3o//dtd w3 html 3.0//", - "-//webtechs//dtd mozilla html 2.0//", - "-//webtechs//dtd mozilla html//")) or - publicId in ("-//w3o//dtd w3 html strict 3.0//en//", - "-/w3c/dtd html 4.0 transitional/en", - "html") or - publicId.startswith( - ("-//w3c//dtd html 4.01 frameset//", - "-//w3c//dtd html 4.01 transitional//")) and - systemId is None or - systemId and systemId.lower() == "http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd"): - self.parser.compatMode = "quirks" - elif (publicId.startswith( - ("-//w3c//dtd xhtml 1.0 frameset//", - "-//w3c//dtd xhtml 1.0 transitional//")) or - publicId.startswith( - ("-//w3c//dtd html 4.01 frameset//", - "-//w3c//dtd html 4.01 transitional//")) and - systemId is not None): - self.parser.compatMode = "limited quirks" - - self.parser.phase = self.parser.phases["beforeHtml"] - - def anythingElse(self): - self.parser.compatMode = "quirks" - self.parser.phase = self.parser.phases["beforeHtml"] - - def processCharacters(self, token): - self.parser.parseError("expected-doctype-but-got-chars") - self.anythingElse() - return token - - def processStartTag(self, token): - self.parser.parseError("expected-doctype-but-got-start-tag", - {"name": token["name"]}) - self.anythingElse() - return token - - def processEndTag(self, token): - self.parser.parseError("expected-doctype-but-got-end-tag", - {"name": token["name"]}) - self.anythingElse() - return token - - def processEOF(self): - self.parser.parseError("expected-doctype-but-got-eof") - self.anythingElse() - return True - - class BeforeHtmlPhase(Phase): - # helper methods - def insertHtmlElement(self): - self.tree.insertRoot(impliedTagToken("html", "StartTag")) - self.parser.phase = self.parser.phases["beforeHead"] - - # other - def processEOF(self): - self.insertHtmlElement() - return True - - def processComment(self, token): - self.tree.insertComment(token, self.tree.document) - - def processSpaceCharacters(self, token): - pass - - def processCharacters(self, token): - self.insertHtmlElement() - return token - - def processStartTag(self, token): - if token["name"] == "html": - self.parser.firstStartTag = True - self.insertHtmlElement() - return token - - def processEndTag(self, token): - if token["name"] not in ("head", "body", "html", "br"): - self.parser.parseError("unexpected-end-tag-before-html", - {"name": token["name"]}) - else: - self.insertHtmlElement() - return token - - class BeforeHeadPhase(Phase): - def __init__(self, parser, tree): - Phase.__init__(self, parser, tree) - - self.startTagHandler = _utils.MethodDispatcher([ - ("html", self.startTagHtml), - ("head", self.startTagHead) - ]) - self.startTagHandler.default = self.startTagOther - - self.endTagHandler = _utils.MethodDispatcher([ - (("head", "body", "html", "br"), self.endTagImplyHead) - ]) - self.endTagHandler.default = self.endTagOther - - def processEOF(self): - self.startTagHead(impliedTagToken("head", "StartTag")) - return True - - def processSpaceCharacters(self, token): - pass - - def processCharacters(self, token): - self.startTagHead(impliedTagToken("head", "StartTag")) - return token - - def startTagHtml(self, token): - return self.parser.phases["inBody"].processStartTag(token) - - def startTagHead(self, token): - self.tree.insertElement(token) - self.tree.headPointer = self.tree.openElements[-1] - self.parser.phase = self.parser.phases["inHead"] - - def startTagOther(self, token): - self.startTagHead(impliedTagToken("head", "StartTag")) - return token - - def endTagImplyHead(self, token): - self.startTagHead(impliedTagToken("head", "StartTag")) - return token - - def endTagOther(self, token): - self.parser.parseError("end-tag-after-implied-root", - {"name": token["name"]}) - - class InHeadPhase(Phase): - def __init__(self, parser, tree): - Phase.__init__(self, parser, tree) - - self.startTagHandler = _utils.MethodDispatcher([ - ("html", self.startTagHtml), - ("title", self.startTagTitle), - (("noframes", "style"), self.startTagNoFramesStyle), - ("noscript", self.startTagNoscript), - ("script", self.startTagScript), - (("base", "basefont", "bgsound", "command", "link"), - self.startTagBaseLinkCommand), - ("meta", self.startTagMeta), - ("head", self.startTagHead) - ]) - self.startTagHandler.default = self.startTagOther - - self.endTagHandler = _utils.MethodDispatcher([ - ("head", self.endTagHead), - (("br", "html", "body"), self.endTagHtmlBodyBr) - ]) - self.endTagHandler.default = self.endTagOther - - # the real thing - def processEOF(self): - self.anythingElse() - return True - - def processCharacters(self, token): - self.anythingElse() - return token - - def startTagHtml(self, token): - return self.parser.phases["inBody"].processStartTag(token) - - def startTagHead(self, token): - self.parser.parseError("two-heads-are-not-better-than-one") - - def startTagBaseLinkCommand(self, token): - self.tree.insertElement(token) - self.tree.openElements.pop() - token["selfClosingAcknowledged"] = True - - def startTagMeta(self, token): - self.tree.insertElement(token) - self.tree.openElements.pop() - token["selfClosingAcknowledged"] = True - - attributes = token["data"] - if self.parser.tokenizer.stream.charEncoding[1] == "tentative": - if "charset" in attributes: - self.parser.tokenizer.stream.changeEncoding(attributes["charset"]) - elif ("content" in attributes and - "http-equiv" in attributes and - attributes["http-equiv"].lower() == "content-type"): - # Encoding it as UTF-8 here is a hack, as really we should pass - # the abstract Unicode string, and just use the - # ContentAttrParser on that, but using UTF-8 allows all chars - # to be encoded and as a ASCII-superset works. - data = _inputstream.EncodingBytes(attributes["content"].encode("utf-8")) - parser = _inputstream.ContentAttrParser(data) - codec = parser.parse() - self.parser.tokenizer.stream.changeEncoding(codec) - - def startTagTitle(self, token): - self.parser.parseRCDataRawtext(token, "RCDATA") - - def startTagNoFramesStyle(self, token): - # Need to decide whether to implement the scripting-disabled case - self.parser.parseRCDataRawtext(token, "RAWTEXT") - - def startTagNoscript(self, token): - if self.parser.scripting: - self.parser.parseRCDataRawtext(token, "RAWTEXT") - else: - self.tree.insertElement(token) - self.parser.phase = self.parser.phases["inHeadNoscript"] - - def startTagScript(self, token): - self.tree.insertElement(token) - self.parser.tokenizer.state = self.parser.tokenizer.scriptDataState - self.parser.originalPhase = self.parser.phase - self.parser.phase = self.parser.phases["text"] - - def startTagOther(self, token): - self.anythingElse() - return token - - def endTagHead(self, token): - node = self.parser.tree.openElements.pop() - assert node.name == "head", "Expected head got %s" % node.name - self.parser.phase = self.parser.phases["afterHead"] - - def endTagHtmlBodyBr(self, token): - self.anythingElse() - return token - - def endTagOther(self, token): - self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) - - def anythingElse(self): - self.endTagHead(impliedTagToken("head")) - - class InHeadNoscriptPhase(Phase): - def __init__(self, parser, tree): - Phase.__init__(self, parser, tree) - - self.startTagHandler = _utils.MethodDispatcher([ - ("html", self.startTagHtml), - (("basefont", "bgsound", "link", "meta", "noframes", "style"), self.startTagBaseLinkCommand), - (("head", "noscript"), self.startTagHeadNoscript), - ]) - self.startTagHandler.default = self.startTagOther - - self.endTagHandler = _utils.MethodDispatcher([ - ("noscript", self.endTagNoscript), - ("br", self.endTagBr), - ]) - self.endTagHandler.default = self.endTagOther - - def processEOF(self): - self.parser.parseError("eof-in-head-noscript") - self.anythingElse() - return True - - def processComment(self, token): - return self.parser.phases["inHead"].processComment(token) - - def processCharacters(self, token): - self.parser.parseError("char-in-head-noscript") - self.anythingElse() - return token - - def processSpaceCharacters(self, token): - return self.parser.phases["inHead"].processSpaceCharacters(token) - - def startTagHtml(self, token): - return self.parser.phases["inBody"].processStartTag(token) - - def startTagBaseLinkCommand(self, token): - return self.parser.phases["inHead"].processStartTag(token) - - def startTagHeadNoscript(self, token): - self.parser.parseError("unexpected-start-tag", {"name": token["name"]}) - - def startTagOther(self, token): - self.parser.parseError("unexpected-inhead-noscript-tag", {"name": token["name"]}) - self.anythingElse() - return token - - def endTagNoscript(self, token): - node = self.parser.tree.openElements.pop() - assert node.name == "noscript", "Expected noscript got %s" % node.name - self.parser.phase = self.parser.phases["inHead"] - - def endTagBr(self, token): - self.parser.parseError("unexpected-inhead-noscript-tag", {"name": token["name"]}) - self.anythingElse() - return token - - def endTagOther(self, token): - self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) - - def anythingElse(self): - # Caller must raise parse error first! - self.endTagNoscript(impliedTagToken("noscript")) - - class AfterHeadPhase(Phase): - def __init__(self, parser, tree): - Phase.__init__(self, parser, tree) - - self.startTagHandler = _utils.MethodDispatcher([ - ("html", self.startTagHtml), - ("body", self.startTagBody), - ("frameset", self.startTagFrameset), - (("base", "basefont", "bgsound", "link", "meta", "noframes", "script", - "style", "title"), - self.startTagFromHead), - ("head", self.startTagHead) - ]) - self.startTagHandler.default = self.startTagOther - self.endTagHandler = _utils.MethodDispatcher([(("body", "html", "br"), - self.endTagHtmlBodyBr)]) - self.endTagHandler.default = self.endTagOther - - def processEOF(self): - self.anythingElse() - return True - - def processCharacters(self, token): - self.anythingElse() - return token - - def startTagHtml(self, token): - return self.parser.phases["inBody"].processStartTag(token) - - def startTagBody(self, token): - self.parser.framesetOK = False - self.tree.insertElement(token) - self.parser.phase = self.parser.phases["inBody"] - - def startTagFrameset(self, token): - self.tree.insertElement(token) - self.parser.phase = self.parser.phases["inFrameset"] - - def startTagFromHead(self, token): - self.parser.parseError("unexpected-start-tag-out-of-my-head", - {"name": token["name"]}) - self.tree.openElements.append(self.tree.headPointer) - self.parser.phases["inHead"].processStartTag(token) - for node in self.tree.openElements[::-1]: - if node.name == "head": - self.tree.openElements.remove(node) - break - - def startTagHead(self, token): - self.parser.parseError("unexpected-start-tag", {"name": token["name"]}) - - def startTagOther(self, token): - self.anythingElse() - return token - - def endTagHtmlBodyBr(self, token): - self.anythingElse() - return token - - def endTagOther(self, token): - self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) - - def anythingElse(self): - self.tree.insertElement(impliedTagToken("body", "StartTag")) - self.parser.phase = self.parser.phases["inBody"] - self.parser.framesetOK = True - - class InBodyPhase(Phase): - # http://www.whatwg.org/specs/web-apps/current-work/#parsing-main-inbody - # the really-really-really-very crazy mode - def __init__(self, parser, tree): - Phase.__init__(self, parser, tree) - - # Set this to the default handler - self.processSpaceCharacters = self.processSpaceCharactersNonPre - - self.startTagHandler = _utils.MethodDispatcher([ - ("html", self.startTagHtml), - (("base", "basefont", "bgsound", "command", "link", "meta", - "script", "style", "title"), - self.startTagProcessInHead), - ("body", self.startTagBody), - ("frameset", self.startTagFrameset), - (("address", "article", "aside", "blockquote", "center", "details", - "dir", "div", "dl", "fieldset", "figcaption", "figure", - "footer", "header", "hgroup", "main", "menu", "nav", "ol", "p", - "section", "summary", "ul"), - self.startTagCloseP), - (headingElements, self.startTagHeading), - (("pre", "listing"), self.startTagPreListing), - ("form", self.startTagForm), - (("li", "dd", "dt"), self.startTagListItem), - ("plaintext", self.startTagPlaintext), - ("a", self.startTagA), - (("b", "big", "code", "em", "font", "i", "s", "small", "strike", - "strong", "tt", "u"), self.startTagFormatting), - ("nobr", self.startTagNobr), - ("button", self.startTagButton), - (("applet", "marquee", "object"), self.startTagAppletMarqueeObject), - ("xmp", self.startTagXmp), - ("table", self.startTagTable), - (("area", "br", "embed", "img", "keygen", "wbr"), - self.startTagVoidFormatting), - (("param", "source", "track"), self.startTagParamSource), - ("input", self.startTagInput), - ("hr", self.startTagHr), - ("image", self.startTagImage), - ("isindex", self.startTagIsIndex), - ("textarea", self.startTagTextarea), - ("iframe", self.startTagIFrame), - ("noscript", self.startTagNoscript), - (("noembed", "noframes"), self.startTagRawtext), - ("select", self.startTagSelect), - (("rp", "rt"), self.startTagRpRt), - (("option", "optgroup"), self.startTagOpt), - (("math"), self.startTagMath), - (("svg"), self.startTagSvg), - (("caption", "col", "colgroup", "frame", "head", - "tbody", "td", "tfoot", "th", "thead", - "tr"), self.startTagMisplaced) - ]) - self.startTagHandler.default = self.startTagOther - - self.endTagHandler = _utils.MethodDispatcher([ - ("body", self.endTagBody), - ("html", self.endTagHtml), - (("address", "article", "aside", "blockquote", "button", "center", - "details", "dialog", "dir", "div", "dl", "fieldset", "figcaption", "figure", - "footer", "header", "hgroup", "listing", "main", "menu", "nav", "ol", "pre", - "section", "summary", "ul"), self.endTagBlock), - ("form", self.endTagForm), - ("p", self.endTagP), - (("dd", "dt", "li"), self.endTagListItem), - (headingElements, self.endTagHeading), - (("a", "b", "big", "code", "em", "font", "i", "nobr", "s", "small", - "strike", "strong", "tt", "u"), self.endTagFormatting), - (("applet", "marquee", "object"), self.endTagAppletMarqueeObject), - ("br", self.endTagBr), - ]) - self.endTagHandler.default = self.endTagOther - - def isMatchingFormattingElement(self, node1, node2): - return (node1.name == node2.name and - node1.namespace == node2.namespace and - node1.attributes == node2.attributes) - - # helper - def addFormattingElement(self, token): - self.tree.insertElement(token) - element = self.tree.openElements[-1] - - matchingElements = [] - for node in self.tree.activeFormattingElements[::-1]: - if node is Marker: - break - elif self.isMatchingFormattingElement(node, element): - matchingElements.append(node) - - assert len(matchingElements) <= 3 - if len(matchingElements) == 3: - self.tree.activeFormattingElements.remove(matchingElements[-1]) - self.tree.activeFormattingElements.append(element) - - # the real deal - def processEOF(self): - allowed_elements = frozenset(("dd", "dt", "li", "p", "tbody", "td", - "tfoot", "th", "thead", "tr", "body", - "html")) - for node in self.tree.openElements[::-1]: - if node.name not in allowed_elements: - self.parser.parseError("expected-closing-tag-but-got-eof") - break - # Stop parsing - - def processSpaceCharactersDropNewline(self, token): - # Sometimes (start of
    , , and ",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue,c.appendChild(b),b.innerHTML="",k.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,k.noCloneEvent=!0,b.attachEvent&&(b.attachEvent("onclick",function(){k.noCloneEvent=!1}),b.cloneNode(!0).click()),null==k.deleteExpando){k.deleteExpando=!0;try{delete b.test}catch(d){k.deleteExpando=!1}}}(),function(){var b,c,d=y.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(k[b+"Bubbles"]=c in a)||(d.setAttribute(c,"t"),k[b+"Bubbles"]=d.attributes[c].expando===!1);d=null}();var X=/^(?:input|select|textarea)$/i,Y=/^key/,Z=/^(?:mouse|pointer|contextmenu)|click/,$=/^(?:focusinfocus|focusoutblur)$/,_=/^([^.]*)(?:\.(.+)|)$/;function aa(){return!0}function ba(){return!1}function ca(){try{return y.activeElement}catch(a){}}m.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=m.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return typeof m===K||a&&m.event.triggered===a.type?void 0:m.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(E)||[""],h=b.length;while(h--)f=_.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=m.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=m.event.special[o]||{},l=m.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&m.expr.match.needsContext.test(e),namespace:p.join(".")},i),(n=g[o])||(n=g[o]=[],n.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?n.splice(n.delegateCount++,0,l):n.push(l),m.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m.hasData(a)&&m._data(a);if(r&&(k=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=_.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=m.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,n=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=n.length;while(f--)g=n[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(n.splice(f,1),g.selector&&n.delegateCount--,l.remove&&l.remove.call(a,g));i&&!n.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||m.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)m.event.remove(a,o+b[j],c,d,!0);m.isEmptyObject(k)&&(delete r.handle,m._removeData(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,l,n,o=[d||y],p=j.call(b,"type")?b.type:b,q=j.call(b,"namespace")?b.namespace.split("."):[];if(h=l=d=d||y,3!==d.nodeType&&8!==d.nodeType&&!$.test(p+m.event.triggered)&&(p.indexOf(".")>=0&&(q=p.split("."),p=q.shift(),q.sort()),g=p.indexOf(":")<0&&"on"+p,b=b[m.expando]?b:new m.Event(p,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=q.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:m.makeArray(c,[b]),k=m.event.special[p]||{},e||!k.trigger||k.trigger.apply(d,c)!==!1)){if(!e&&!k.noBubble&&!m.isWindow(d)){for(i=k.delegateType||p,$.test(i+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),l=h;l===(d.ownerDocument||y)&&o.push(l.defaultView||l.parentWindow||a)}n=0;while((h=o[n++])&&!b.isPropagationStopped())b.type=n>1?i:k.bindType||p,f=(m._data(h,"events")||{})[b.type]&&m._data(h,"handle"),f&&f.apply(h,c),f=g&&h[g],f&&f.apply&&m.acceptData(h)&&(b.result=f.apply(h,c),b.result===!1&&b.preventDefault());if(b.type=p,!e&&!b.isDefaultPrevented()&&(!k._default||k._default.apply(o.pop(),c)===!1)&&m.acceptData(d)&&g&&d[p]&&!m.isWindow(d)){l=d[g],l&&(d[g]=null),m.event.triggered=p;try{d[p]()}catch(r){}m.event.triggered=void 0,l&&(d[g]=l)}return b.result}},dispatch:function(a){a=m.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(m._data(this,"events")||{})[a.type]||[],k=m.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=m.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,g=0;while((e=f.handlers[g++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(e.namespace))&&(a.handleObj=e,a.data=e.data,c=((m.event.special[e.origType]||{}).handle||e.handler).apply(f.elem,i),void 0!==c&&(a.result=c)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(e=[],f=0;h>f;f++)d=b[f],c=d.selector+" ",void 0===e[c]&&(e[c]=d.needsContext?m(c,this).index(i)>=0:m.find(c,this,null,[i]).length),e[c]&&e.push(d);e.length&&g.push({elem:i,handlers:e})}return h]","i"),ha=/^\s+/,ia=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,ja=/<([\w:]+)/,ka=/\s*$/g,ra={option:[1,""],legend:[1,"
    ","
    "],area:[1,"",""],param:[1,"",""],thead:[1,"","
    "],tr:[2,"","
    "],col:[2,"","
    "],td:[3,"","
    "],_default:k.htmlSerialize?[0,"",""]:[1,"X
    ","
    "]},sa=da(y),ta=sa.appendChild(y.createElement("div"));ra.optgroup=ra.option,ra.tbody=ra.tfoot=ra.colgroup=ra.caption=ra.thead,ra.th=ra.td;function ua(a,b){var c,d,e=0,f=typeof a.getElementsByTagName!==K?a.getElementsByTagName(b||"*"):typeof a.querySelectorAll!==K?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||m.nodeName(d,b)?f.push(d):m.merge(f,ua(d,b));return void 0===b||b&&m.nodeName(a,b)?m.merge([a],f):f}function va(a){W.test(a.type)&&(a.defaultChecked=a.checked)}function wa(a,b){return m.nodeName(a,"table")&&m.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function xa(a){return a.type=(null!==m.find.attr(a,"type"))+"/"+a.type,a}function ya(a){var b=pa.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function za(a,b){for(var c,d=0;null!=(c=a[d]);d++)m._data(c,"globalEval",!b||m._data(b[d],"globalEval"))}function Aa(a,b){if(1===b.nodeType&&m.hasData(a)){var c,d,e,f=m._data(a),g=m._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)m.event.add(b,c,h[c][d])}g.data&&(g.data=m.extend({},g.data))}}function Ba(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!k.noCloneEvent&&b[m.expando]){e=m._data(b);for(d in e.events)m.removeEvent(b,d,e.handle);b.removeAttribute(m.expando)}"script"===c&&b.text!==a.text?(xa(b).text=a.text,ya(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),k.html5Clone&&a.innerHTML&&!m.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&W.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}}m.extend({clone:function(a,b,c){var d,e,f,g,h,i=m.contains(a.ownerDocument,a);if(k.html5Clone||m.isXMLDoc(a)||!ga.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(ta.innerHTML=a.outerHTML,ta.removeChild(f=ta.firstChild)),!(k.noCloneEvent&&k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||m.isXMLDoc(a)))for(d=ua(f),h=ua(a),g=0;null!=(e=h[g]);++g)d[g]&&Ba(e,d[g]);if(b)if(c)for(h=h||ua(a),d=d||ua(f),g=0;null!=(e=h[g]);g++)Aa(e,d[g]);else Aa(a,f);return d=ua(f,"script"),d.length>0&&za(d,!i&&ua(a,"script")),d=h=e=null,f},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,l,n=a.length,o=da(b),p=[],q=0;n>q;q++)if(f=a[q],f||0===f)if("object"===m.type(f))m.merge(p,f.nodeType?[f]:f);else if(la.test(f)){h=h||o.appendChild(b.createElement("div")),i=(ja.exec(f)||["",""])[1].toLowerCase(),l=ra[i]||ra._default,h.innerHTML=l[1]+f.replace(ia,"<$1>")+l[2],e=l[0];while(e--)h=h.lastChild;if(!k.leadingWhitespace&&ha.test(f)&&p.push(b.createTextNode(ha.exec(f)[0])),!k.tbody){f="table"!==i||ka.test(f)?""!==l[1]||ka.test(f)?0:h:h.firstChild,e=f&&f.childNodes.length;while(e--)m.nodeName(j=f.childNodes[e],"tbody")&&!j.childNodes.length&&f.removeChild(j)}m.merge(p,h.childNodes),h.textContent="";while(h.firstChild)h.removeChild(h.firstChild);h=o.lastChild}else p.push(b.createTextNode(f));h&&o.removeChild(h),k.appendChecked||m.grep(ua(p,"input"),va),q=0;while(f=p[q++])if((!d||-1===m.inArray(f,d))&&(g=m.contains(f.ownerDocument,f),h=ua(o.appendChild(f),"script"),g&&za(h),c)){e=0;while(f=h[e++])oa.test(f.type||"")&&c.push(f)}return h=null,o},cleanData:function(a,b){for(var d,e,f,g,h=0,i=m.expando,j=m.cache,l=k.deleteExpando,n=m.event.special;null!=(d=a[h]);h++)if((b||m.acceptData(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)n[e]?m.event.remove(d,e):m.removeEvent(d,e,g.handle);j[f]&&(delete j[f],l?delete d[i]:typeof d.removeAttribute!==K?d.removeAttribute(i):d[i]=null,c.push(f))}}}),m.fn.extend({text:function(a){return V(this,function(a){return void 0===a?m.text(this):this.empty().append((this[0]&&this[0].ownerDocument||y).createTextNode(a))},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wa(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wa(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?m.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||m.cleanData(ua(c)),c.parentNode&&(b&&m.contains(c.ownerDocument,c)&&za(ua(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&m.cleanData(ua(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&m.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return m.clone(this,a,b)})},html:function(a){return V(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(fa,""):void 0;if(!("string"!=typeof a||ma.test(a)||!k.htmlSerialize&&ga.test(a)||!k.leadingWhitespace&&ha.test(a)||ra[(ja.exec(a)||["",""])[1].toLowerCase()])){a=a.replace(ia,"<$1>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(m.cleanData(ua(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,m.cleanData(ua(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,n=this,o=l-1,p=a[0],q=m.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&na.test(p))return this.each(function(c){var d=n.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(i=m.buildFragment(a,this[0].ownerDocument,!1,this),c=i.firstChild,1===i.childNodes.length&&(i=c),c)){for(g=m.map(ua(i,"script"),xa),f=g.length;l>j;j++)d=i,j!==o&&(d=m.clone(d,!0,!0),f&&m.merge(g,ua(d,"script"))),b.call(this[j],d,j);if(f)for(h=g[g.length-1].ownerDocument,m.map(g,ya),j=0;f>j;j++)d=g[j],oa.test(d.type||"")&&!m._data(d,"globalEval")&&m.contains(h,d)&&(d.src?m._evalUrl&&m._evalUrl(d.src):m.globalEval((d.text||d.textContent||d.innerHTML||"").replace(qa,"")));i=c=null}return this}}),m.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){m.fn[a]=function(a){for(var c,d=0,e=[],g=m(a),h=g.length-1;h>=d;d++)c=d===h?this:this.clone(!0),m(g[d])[b](c),f.apply(e,c.get());return this.pushStack(e)}});var Ca,Da={};function Ea(b,c){var d,e=m(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:m.css(e[0],"display");return e.detach(),f}function Fa(a){var b=y,c=Da[a];return c||(c=Ea(a,b),"none"!==c&&c||(Ca=(Ca||m("