From 9f364858174ce9a9e717aeb22e91c9cb3c17e833 Mon Sep 17 00:00:00 2001 From: shubham kumar Date: Sun, 9 Feb 2020 10:21:35 +0530 Subject: [PATCH 1/9] Updated Readme --- .DS_Store | Bin 0 -> 6148 bytes README.md | 5 ++++- 2 files changed, 4 insertions(+), 1 deletion(-) create mode 100644 .DS_Store diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..f1f7bb76f871698f99b6da19f5c6963160f487a6 GIT binary patch literal 6148 zcmeHKTWb?R6h6~NJDYe}L5PA63nKbZByA;q5Mi4pLZE8t7W?2O-R&-BVLKZ(n+A=M zAo%LDmscc|H5rxgPQ20h>W-~{Q&QT+qGjb<##yzJV zx1H2YTg{T2)XZ~E=m(ygY=wSW-waqK3ibkaD_L{XAi2YhH{&=$1F5^-?J#K9%+sqe zOWlwKiHIj-+}#S9AGb?!i}_7quYwDG-A(Hlhn}}xOH9b1M$OE3I*Uv5)?%^Powqv6 z%Y}LC%2Ki0H7GrM@%qO7*3;*&UcY(!?)}G4!U+iOfkI9x?89eNrgF6BBrJ;A1GMFF z=3ot~$bSWHf&-PY417R~;S3yubx0t9CKiVKZ+{PFqkbg+r+z~j`_j+Y*M7!mmS&G< zNAopIq)f=)Cx_B0iO64AxK`cXefX&JxclS<&JAUdg_H7mP`^ZNU!KO;H(&#qUx6~* zK)ejQ;Eyr+45JNaU@*)fQq=#I<_^(2>sQqbXa)|30lq(2SUB1WdlJRgft9!dAZD;x z2i(E24BI>WV?6JGNWO&Q{oyDBXdGkui=MnW!5I5u;?+6sFTu?0nc2nZT Date: Sun, 9 Feb 2020 14:31:56 +0530 Subject: [PATCH 2/9] Done Admin Backend --- .DS_Store | Bin 6148 -> 6148 bytes Application Code/.DS_Store | Bin 0 -> 6148 bytes Application Code/Hackathon/.DS_Store | Bin 0 -> 6148 bytes .../Hackathon/.vscode/settings.json | 4 + .../Hackathon/hackathon/.DS_Store | Bin 0 -> 6148 bytes .../hackathon/__pycache__/app.cpython-37.pyc | Bin 0 -> 3491 bytes Application Code/Hackathon/hackathon/app.py | 125 + .../Hackathon/hackathon/data.sqlite | Bin 0 -> 20480 bytes .../Hackathon/hackathon/migrations/README | 1 + .../migrations/__pycache__/env.cpython-37.pyc | Bin 0 -> 2268 bytes .../hackathon/migrations/alembic.ini | 45 + .../Hackathon/hackathon/migrations/env.py | 96 + .../hackathon/migrations/script.py.mako | 24 + .../migrations/versions/15c0fa797121_.py | 33 + .../migrations/versions/57535f8d20f9_.py | 34 + .../__pycache__/15c0fa797121_.cpython-37.pyc | Bin 0 -> 887 bytes .../__pycache__/57535f8d20f9_.cpython-37.pyc | Bin 0 -> 957 bytes .../__pycache__/ca277f51404c_.cpython-37.pyc | Bin 0 -> 828 bytes .../migrations/versions/ca277f51404c_.py | 28 + .../Hackathon/hackathon/static/main.css | 3 + .../Hackathon/hackathon/static/signin.png | Bin 0 -> 54598 bytes .../Hackathon/hackathon/templates/.DS_Store | Bin 0 -> 6148 bytes .../Hackathon/hackathon/templates/add.html | 143 + .../Hackathon/hackathon/templates/admin.html | 54 + .../Hackathon/hackathon/templates/login.html | 48 + .../hackathon/templates/register.html | 48 + Application Code/Hackathon/myenv/.Python | 1 + Application Code/Hackathon/myenv/bin/activate | 84 + .../Hackathon/myenv/bin/activate.csh | 55 + .../Hackathon/myenv/bin/activate.fish | 102 + .../Hackathon/myenv/bin/activate.ps1 | 60 + .../Hackathon/myenv/bin/activate_this.py | 46 + .../Hackathon/myenv/bin/easy_install | 10 + .../Hackathon/myenv/bin/easy_install-2.7 | 10 + Application Code/Hackathon/myenv/bin/pip | 10 + Application Code/Hackathon/myenv/bin/pip2 | 10 + Application Code/Hackathon/myenv/bin/pip2.7 | 10 + Application Code/Hackathon/myenv/bin/python | Bin 0 -> 36336 bytes .../Hackathon/myenv/bin/python-config | 78 + Application Code/Hackathon/myenv/bin/python2 | 1 + .../Hackathon/myenv/bin/python2.7 | 1 + Application Code/Hackathon/myenv/bin/wheel | 10 + .../Hackathon/myenv/include/python2.7 | 1 + .../Hackathon/myenv/lib/python2.7/LICENSE.txt | 1 + .../Hackathon/myenv/lib/python2.7/UserDict.py | 1 + .../myenv/lib/python2.7/UserDict.pyc | Bin 0 -> 11196 bytes .../Hackathon/myenv/lib/python2.7/_abcoll.py | 1 + .../Hackathon/myenv/lib/python2.7/_abcoll.pyc | Bin 0 -> 29114 bytes .../myenv/lib/python2.7/_weakrefset.py | 1 + .../myenv/lib/python2.7/_weakrefset.pyc | Bin 0 -> 11262 bytes .../Hackathon/myenv/lib/python2.7/abc.py | 1 + .../Hackathon/myenv/lib/python2.7/abc.pyc | Bin 0 -> 6506 bytes .../Hackathon/myenv/lib/python2.7/codecs.py | 1 + .../Hackathon/myenv/lib/python2.7/codecs.pyc | Bin 0 -> 39926 bytes .../Hackathon/myenv/lib/python2.7/config | 1 + .../Hackathon/myenv/lib/python2.7/copy_reg.py | 1 + .../myenv/lib/python2.7/copy_reg.pyc | Bin 0 -> 5530 bytes .../myenv/lib/python2.7/distutils/__init__.py | 134 + .../lib/python2.7/distutils/__init__.pyc | Bin 0 -> 4275 bytes .../lib/python2.7/distutils/distutils.cfg | 6 + .../Hackathon/myenv/lib/python2.7/encodings | 1 + .../Hackathon/myenv/lib/python2.7/fnmatch.py | 1 + .../Hackathon/myenv/lib/python2.7/fnmatch.pyc | Bin 0 -> 3812 bytes .../myenv/lib/python2.7/genericpath.py | 1 + .../myenv/lib/python2.7/genericpath.pyc | Bin 0 -> 3880 bytes .../Hackathon/myenv/lib/python2.7/lib-dynload | 1 + .../myenv/lib/python2.7/linecache.py | 1 + .../myenv/lib/python2.7/linecache.pyc | Bin 0 -> 3470 bytes .../Hackathon/myenv/lib/python2.7/locale.py | 1 + .../Hackathon/myenv/lib/python2.7/locale.pyc | Bin 0 -> 57666 bytes .../lib/python2.7/no-global-site-packages.txt | 0 .../Hackathon/myenv/lib/python2.7/ntpath.py | 1 + .../Hackathon/myenv/lib/python2.7/ntpath.pyc | Bin 0 -> 13855 bytes .../myenv/lib/python2.7/orig-prefix.txt | 1 + .../Hackathon/myenv/lib/python2.7/os.py | 1 + .../Hackathon/myenv/lib/python2.7/os.pyc | Bin 0 -> 27438 bytes .../myenv/lib/python2.7/posixpath.py | 1 + .../myenv/lib/python2.7/posixpath.pyc | Bin 0 -> 12221 bytes .../Hackathon/myenv/lib/python2.7/re.py | 1 + .../Hackathon/myenv/lib/python2.7/re.pyc | Bin 0 -> 14106 bytes .../python2.7/site-packages/easy_install.py | 5 + .../python2.7/site-packages/easy_install.pyc | Bin 0 -> 369 bytes .../pip-20.0.2.dist-info/INSTALLER | 1 + .../pip-20.0.2.dist-info/INSTALLER 2 | 1 + .../pip-20.0.2.dist-info/LICENSE 2.txt | 20 + .../pip-20.0.2.dist-info/LICENSE.txt | 20 + .../pip-20.0.2.dist-info/METADATA | 84 + .../pip-20.0.2.dist-info/METADATA 2 | 84 + .../site-packages/pip-20.0.2.dist-info/RECORD | 704 ++ .../pip-20.0.2.dist-info/RECORD 2 | 704 ++ .../site-packages/pip-20.0.2.dist-info/WHEEL | 6 + .../pip-20.0.2.dist-info/WHEEL 2 | 6 + .../pip-20.0.2.dist-info/entry_points 2.txt | 5 + .../pip-20.0.2.dist-info/entry_points.txt | 5 + .../pip-20.0.2.dist-info/top_level 2.txt | 1 + .../pip-20.0.2.dist-info/top_level.txt | 1 + .../python2.7/site-packages/pip/__init__.py | 18 + .../python2.7/site-packages/pip/__init__.pyc | Bin 0 -> 842 bytes .../python2.7/site-packages/pip/__main__.py | 19 + .../python2.7/site-packages/pip/__main__.pyc | Bin 0 -> 571 bytes .../site-packages/pip/_internal/__init__ 2.py | 18 + .../pip/_internal/__init__ 2.pyc | Bin 0 -> 903 bytes .../site-packages/pip/_internal/__init__.py | 18 + .../site-packages/pip/_internal/__init__.pyc | Bin 0 -> 903 bytes .../pip/_internal/build_env 2.py | 221 + .../pip/_internal/build_env 2.pyc | Bin 0 -> 10025 bytes .../site-packages/pip/_internal/build_env.py | 221 + .../site-packages/pip/_internal/build_env.pyc | Bin 0 -> 10025 bytes .../site-packages/pip/_internal/cache 2.py | 329 + .../site-packages/pip/_internal/cache 2.pyc | Bin 0 -> 11650 bytes .../site-packages/pip/_internal/cache.py | 329 + .../site-packages/pip/_internal/cache.pyc | Bin 0 -> 11650 bytes .../pip/_internal/cli/__init__ 2.py | 4 + .../pip/_internal/cli/__init__ 2.pyc | Bin 0 -> 290 bytes .../pip/_internal/cli/__init__.py | 4 + .../pip/_internal/cli/__init__.pyc | Bin 0 -> 290 bytes .../pip/_internal/cli/autocompletion 2.py | 164 + .../pip/_internal/cli/autocompletion 2.pyc | Bin 0 -> 5709 bytes .../pip/_internal/cli/autocompletion.py | 164 + .../pip/_internal/cli/autocompletion.pyc | Bin 0 -> 5709 bytes .../pip/_internal/cli/base_command 2.py | 226 + .../pip/_internal/cli/base_command 2.pyc | Bin 0 -> 7346 bytes .../pip/_internal/cli/base_command.py | 226 + .../pip/_internal/cli/base_command.pyc | Bin 0 -> 7346 bytes .../pip/_internal/cli/cmdoptions 2.py | 957 ++ .../pip/_internal/cli/cmdoptions 2.pyc | Bin 0 -> 26026 bytes .../pip/_internal/cli/cmdoptions.py | 957 ++ .../pip/_internal/cli/cmdoptions.pyc | Bin 0 -> 26026 bytes .../pip/_internal/cli/command_context 2.py | 36 + .../pip/_internal/cli/command_context 2.pyc | Bin 0 -> 1851 bytes .../pip/_internal/cli/command_context.py | 36 + .../pip/_internal/cli/command_context.pyc | Bin 0 -> 1851 bytes .../site-packages/pip/_internal/cli/main 2.py | 75 + .../pip/_internal/cli/main 2.pyc | Bin 0 -> 1814 bytes .../site-packages/pip/_internal/cli/main.py | 75 + .../site-packages/pip/_internal/cli/main.pyc | Bin 0 -> 1814 bytes .../pip/_internal/cli/main_parser 2.py | 99 + .../pip/_internal/cli/main_parser 2.pyc | Bin 0 -> 2750 bytes .../pip/_internal/cli/main_parser.py | 99 + .../pip/_internal/cli/main_parser.pyc | Bin 0 -> 2750 bytes .../pip/_internal/cli/parser 2.py | 265 + .../pip/_internal/cli/parser 2.pyc | Bin 0 -> 11512 bytes .../site-packages/pip/_internal/cli/parser.py | 265 + .../pip/_internal/cli/parser.pyc | Bin 0 -> 11512 bytes .../pip/_internal/cli/req_command 2.py | 333 + .../pip/_internal/cli/req_command 2.pyc | Bin 0 -> 10660 bytes .../pip/_internal/cli/req_command.py | 333 + .../pip/_internal/cli/req_command.pyc | Bin 0 -> 10660 bytes .../pip/_internal/cli/status_codes 2.py | 8 + .../pip/_internal/cli/status_codes 2.pyc | Bin 0 -> 454 bytes .../pip/_internal/cli/status_codes.py | 8 + .../pip/_internal/cli/status_codes.pyc | Bin 0 -> 454 bytes .../pip/_internal/commands/__init__ 2.py | 114 + .../pip/_internal/commands/__init__ 2.pyc | Bin 0 -> 3539 bytes .../pip/_internal/commands/__init__.py | 114 + .../pip/_internal/commands/__init__.pyc | Bin 0 -> 3539 bytes .../pip/_internal/commands/check 2.py | 45 + .../pip/_internal/commands/check 2.pyc | Bin 0 -> 1734 bytes .../pip/_internal/commands/check.py | 45 + .../pip/_internal/commands/check.pyc | Bin 0 -> 1734 bytes .../pip/_internal/commands/completion 2.py | 96 + .../pip/_internal/commands/completion 2.pyc | Bin 0 -> 3498 bytes .../pip/_internal/commands/completion.py | 96 + .../pip/_internal/commands/completion.pyc | Bin 0 -> 3498 bytes .../pip/_internal/commands/configuration 2.py | 233 + .../_internal/commands/configuration 2.pyc | Bin 0 -> 8359 bytes .../pip/_internal/commands/configuration.py | 233 + .../pip/_internal/commands/configuration.pyc | Bin 0 -> 8359 bytes .../pip/_internal/commands/debug 2.py | 142 + .../pip/_internal/commands/debug 2.pyc | Bin 0 -> 5384 bytes .../pip/_internal/commands/debug.py | 142 + .../pip/_internal/commands/debug.pyc | Bin 0 -> 5384 bytes .../pip/_internal/commands/download 2.py | 147 + .../pip/_internal/commands/download 2.pyc | Bin 0 -> 4720 bytes .../pip/_internal/commands/download.py | 147 + .../pip/_internal/commands/download.pyc | Bin 0 -> 4720 bytes .../pip/_internal/commands/freeze 2.py | 103 + .../pip/_internal/commands/freeze 2.pyc | Bin 0 -> 3766 bytes .../pip/_internal/commands/freeze.py | 103 + .../pip/_internal/commands/freeze.pyc | Bin 0 -> 3766 bytes .../pip/_internal/commands/hash 2.py | 58 + .../pip/_internal/commands/hash 2.pyc | Bin 0 -> 2716 bytes .../pip/_internal/commands/hash.py | 58 + .../pip/_internal/commands/hash.pyc | Bin 0 -> 2716 bytes .../pip/_internal/commands/help 2.py | 41 + .../pip/_internal/commands/help 2.pyc | Bin 0 -> 1611 bytes .../pip/_internal/commands/help.py | 41 + .../pip/_internal/commands/help.pyc | Bin 0 -> 1611 bytes .../pip/_internal/commands/install 2.py | 701 ++ .../pip/_internal/commands/install 2.pyc | Bin 0 -> 19513 bytes .../pip/_internal/commands/install.py | 701 ++ .../pip/_internal/commands/install.pyc | Bin 0 -> 19513 bytes .../pip/_internal/commands/list 2.py | 313 + .../pip/_internal/commands/list 2.pyc | Bin 0 -> 11265 bytes .../pip/_internal/commands/list.py | 313 + .../pip/_internal/commands/list.pyc | Bin 0 -> 11265 bytes .../pip/_internal/commands/search 2.py | 145 + .../pip/_internal/commands/search 2.pyc | Bin 0 -> 5716 bytes .../pip/_internal/commands/search.py | 145 + .../pip/_internal/commands/search.pyc | Bin 0 -> 5716 bytes .../pip/_internal/commands/show 2.py | 180 + .../pip/_internal/commands/show 2.pyc | Bin 0 -> 6804 bytes .../pip/_internal/commands/show.py | 180 + .../pip/_internal/commands/show.pyc | Bin 0 -> 6804 bytes .../pip/_internal/commands/uninstall 2.py | 82 + .../pip/_internal/commands/uninstall 2.pyc | Bin 0 -> 3367 bytes .../pip/_internal/commands/uninstall.py | 82 + .../pip/_internal/commands/uninstall.pyc | Bin 0 -> 3367 bytes .../pip/_internal/commands/wheel 2.py | 197 + .../pip/_internal/commands/wheel 2.pyc | Bin 0 -> 6191 bytes .../pip/_internal/commands/wheel.py | 197 + .../pip/_internal/commands/wheel.pyc | Bin 0 -> 6191 bytes .../pip/_internal/configuration 2.py | 422 + .../pip/_internal/configuration 2.pyc | Bin 0 -> 14013 bytes .../pip/_internal/configuration.py | 422 + .../pip/_internal/configuration.pyc | Bin 0 -> 14013 bytes .../pip/_internal/distributions/__init__ 2.py | 24 + .../_internal/distributions/__init__ 2.pyc | Bin 0 -> 1071 bytes .../pip/_internal/distributions/__init__.py | 24 + .../pip/_internal/distributions/__init__.pyc | Bin 0 -> 1071 bytes .../pip/_internal/distributions/base 2.py | 45 + .../pip/_internal/distributions/base 2.pyc | Bin 0 -> 2413 bytes .../pip/_internal/distributions/base.py | 45 + .../pip/_internal/distributions/base.pyc | Bin 0 -> 2413 bytes .../_internal/distributions/installed 2.py | 24 + .../_internal/distributions/installed 2.pyc | Bin 0 -> 1596 bytes .../pip/_internal/distributions/installed.py | 24 + .../pip/_internal/distributions/installed.pyc | Bin 0 -> 1596 bytes .../pip/_internal/distributions/sdist 2.py | 104 + .../pip/_internal/distributions/sdist 2.pyc | Bin 0 -> 4391 bytes .../pip/_internal/distributions/sdist.py | 104 + .../pip/_internal/distributions/sdist.pyc | Bin 0 -> 4391 bytes .../pip/_internal/distributions/wheel 2.py | 36 + .../pip/_internal/distributions/wheel 2.pyc | Bin 0 -> 1989 bytes .../pip/_internal/distributions/wheel.py | 36 + .../pip/_internal/distributions/wheel.pyc | Bin 0 -> 1989 bytes .../pip/_internal/exceptions 2.py | 308 + .../pip/_internal/exceptions 2.pyc | Bin 0 -> 17569 bytes .../site-packages/pip/_internal/exceptions.py | 308 + .../pip/_internal/exceptions.pyc | Bin 0 -> 17569 bytes .../pip/_internal/index/__init__ 2.py | 2 + .../pip/_internal/index/__init__ 2.pyc | Bin 0 -> 244 bytes .../pip/_internal/index/__init__.py | 2 + .../pip/_internal/index/__init__.pyc | Bin 0 -> 244 bytes .../pip/_internal/index/collector 2.py | 544 ++ .../pip/_internal/index/collector 2.pyc | Bin 0 -> 18625 bytes .../pip/_internal/index/collector.py | 544 ++ .../pip/_internal/index/collector.pyc | Bin 0 -> 18625 bytes .../pip/_internal/index/package_finder 2.py | 1013 ++ .../pip/_internal/index/package_finder 2.pyc | Bin 0 -> 31997 bytes .../pip/_internal/index/package_finder.py | 1013 ++ .../pip/_internal/index/package_finder.pyc | Bin 0 -> 31997 bytes .../pip/_internal/legacy_resolve 2.py | 430 + .../pip/_internal/legacy_resolve 2.pyc | Bin 0 -> 12197 bytes .../pip/_internal/legacy_resolve.py | 430 + .../pip/_internal/legacy_resolve.pyc | Bin 0 -> 12197 bytes .../pip/_internal/locations 2.py | 194 + .../pip/_internal/locations 2.pyc | Bin 0 -> 5698 bytes .../site-packages/pip/_internal/locations.py | 194 + .../site-packages/pip/_internal/locations.pyc | Bin 0 -> 5698 bytes .../site-packages/pip/_internal/main 2.py | 16 + .../site-packages/pip/_internal/main 2.pyc | Bin 0 -> 826 bytes .../site-packages/pip/_internal/main.py | 16 + .../site-packages/pip/_internal/main.pyc | Bin 0 -> 826 bytes .../pip/_internal/models/__init__ 2.py | 2 + .../pip/_internal/models/__init__ 2.pyc | Bin 0 -> 278 bytes .../pip/_internal/models/__init__.py | 2 + .../pip/_internal/models/__init__.pyc | Bin 0 -> 278 bytes .../pip/_internal/models/candidate 2.py | 36 + .../pip/_internal/models/candidate 2.pyc | Bin 0 -> 1953 bytes .../pip/_internal/models/candidate.py | 36 + .../pip/_internal/models/candidate.pyc | Bin 0 -> 1953 bytes .../pip/_internal/models/format_control 2.py | 84 + .../pip/_internal/models/format_control 2.pyc | Bin 0 -> 3576 bytes .../pip/_internal/models/format_control.py | 84 + .../pip/_internal/models/format_control.pyc | Bin 0 -> 3576 bytes .../pip/_internal/models/index 2.py | 31 + .../pip/_internal/models/index 2.pyc | Bin 0 -> 1555 bytes .../pip/_internal/models/index.py | 31 + .../pip/_internal/models/index.pyc | Bin 0 -> 1555 bytes .../pip/_internal/models/link 2.py | 227 + .../pip/_internal/models/link 2.pyc | Bin 0 -> 9824 bytes .../pip/_internal/models/link.py | 227 + .../pip/_internal/models/link.pyc | Bin 0 -> 9824 bytes .../pip/_internal/models/scheme 2.py | 25 + .../pip/_internal/models/scheme 2.pyc | Bin 0 -> 1154 bytes .../pip/_internal/models/scheme.py | 25 + .../pip/_internal/models/scheme.pyc | Bin 0 -> 1154 bytes .../pip/_internal/models/search_scope 2.py | 114 + .../pip/_internal/models/search_scope 2.pyc | Bin 0 -> 4290 bytes .../pip/_internal/models/search_scope.py | 114 + .../pip/_internal/models/search_scope.pyc | Bin 0 -> 4290 bytes .../pip/_internal/models/selection_prefs 2.py | 47 + .../_internal/models/selection_prefs 2.pyc | Bin 0 -> 1970 bytes .../pip/_internal/models/selection_prefs.py | 47 + .../pip/_internal/models/selection_prefs.pyc | Bin 0 -> 1970 bytes .../pip/_internal/models/target_python 2.py | 107 + .../pip/_internal/models/target_python 2.pyc | Bin 0 -> 4201 bytes .../pip/_internal/models/target_python.py | 107 + .../pip/_internal/models/target_python.pyc | Bin 0 -> 4201 bytes .../pip/_internal/models/wheel 2.py | 78 + .../pip/_internal/models/wheel 2.pyc | Bin 0 -> 4245 bytes .../pip/_internal/models/wheel.py | 78 + .../pip/_internal/models/wheel.pyc | Bin 0 -> 4245 bytes .../pip/_internal/network/__init__ 2.py | 2 + .../pip/_internal/network/__init__ 2.pyc | Bin 0 -> 266 bytes .../pip/_internal/network/__init__.py | 2 + .../pip/_internal/network/__init__.pyc | Bin 0 -> 266 bytes .../pip/_internal/network/auth 2.py | 298 + .../pip/_internal/network/auth 2.pyc | Bin 0 -> 8985 bytes .../pip/_internal/network/auth.py | 298 + .../pip/_internal/network/auth.pyc | Bin 0 -> 8985 bytes .../pip/_internal/network/cache 2.py | 81 + .../pip/_internal/network/cache 2.pyc | Bin 0 -> 3751 bytes .../pip/_internal/network/cache.py | 81 + .../pip/_internal/network/cache.pyc | Bin 0 -> 3751 bytes .../pip/_internal/network/download 2.py | 200 + .../pip/_internal/network/download 2.pyc | Bin 0 -> 6255 bytes .../pip/_internal/network/download.py | 200 + .../pip/_internal/network/download.pyc | Bin 0 -> 6255 bytes .../pip/_internal/network/session 2.py | 405 + .../pip/_internal/network/session 2.pyc | Bin 0 -> 11888 bytes .../pip/_internal/network/session.py | 405 + .../pip/_internal/network/session.pyc | Bin 0 -> 11888 bytes .../pip/_internal/network/utils 2.py | 48 + .../pip/_internal/network/utils 2.pyc | Bin 0 -> 983 bytes .../pip/_internal/network/utils.py | 48 + .../pip/_internal/network/utils.pyc | Bin 0 -> 983 bytes .../pip/_internal/network/xmlrpc 2.py | 44 + .../pip/_internal/network/xmlrpc 2.pyc | Bin 0 -> 2135 bytes .../pip/_internal/network/xmlrpc.py | 44 + .../pip/_internal/network/xmlrpc.pyc | Bin 0 -> 2135 bytes .../pip/_internal/operations/__init__ 2.py | 0 .../pip/_internal/operations/__init__ 2.pyc | Bin 0 -> 203 bytes .../pip/_internal/operations/__init__.py | 0 .../pip/_internal/operations/__init__.pyc | Bin 0 -> 203 bytes .../_internal/operations/build/__init__ 2.py | 0 .../_internal/operations/build/__init__ 2.pyc | Bin 0 -> 209 bytes .../_internal/operations/build/__init__.py | 0 .../_internal/operations/build/__init__.pyc | Bin 0 -> 209 bytes .../_internal/operations/build/metadata 2.py | 40 + .../_internal/operations/build/metadata 2.pyc | Bin 0 -> 1551 bytes .../_internal/operations/build/metadata.py | 40 + .../_internal/operations/build/metadata.pyc | Bin 0 -> 1551 bytes .../operations/build/metadata_legacy 2.py | 122 + .../operations/build/metadata_legacy 2.pyc | Bin 0 -> 4278 bytes .../operations/build/metadata_legacy.py | 122 + .../operations/build/metadata_legacy.pyc | Bin 0 -> 4278 bytes .../pip/_internal/operations/build/wheel 2.py | 46 + .../_internal/operations/build/wheel 2.pyc | Bin 0 -> 1661 bytes .../pip/_internal/operations/build/wheel.py | 46 + .../pip/_internal/operations/build/wheel.pyc | Bin 0 -> 1661 bytes .../operations/build/wheel_legacy 2.py | 115 + .../operations/build/wheel_legacy 2.pyc | Bin 0 -> 3376 bytes .../operations/build/wheel_legacy.py | 115 + .../operations/build/wheel_legacy.pyc | Bin 0 -> 3376 bytes .../pip/_internal/operations/check 2.py | 163 + .../pip/_internal/operations/check 2.pyc | Bin 0 -> 5044 bytes .../pip/_internal/operations/check.py | 163 + .../pip/_internal/operations/check.pyc | Bin 0 -> 5044 bytes .../pip/_internal/operations/freeze 2.py | 265 + .../pip/_internal/operations/freeze 2.pyc | Bin 0 -> 7689 bytes .../pip/_internal/operations/freeze.py | 265 + .../pip/_internal/operations/freeze.pyc | Bin 0 -> 7689 bytes .../operations/install/__init__ 2.py | 2 + .../operations/install/__init__ 2.pyc | Bin 0 -> 278 bytes .../_internal/operations/install/__init__.py | 2 + .../_internal/operations/install/__init__.pyc | Bin 0 -> 278 bytes .../operations/install/editable_legacy 2.py | 52 + .../operations/install/editable_legacy 2.pyc | Bin 0 -> 1670 bytes .../operations/install/editable_legacy.py | 52 + .../operations/install/editable_legacy.pyc | Bin 0 -> 1670 bytes .../_internal/operations/install/legacy 2.py | 129 + .../_internal/operations/install/legacy 2.pyc | Bin 0 -> 3904 bytes .../_internal/operations/install/legacy.py | 129 + .../_internal/operations/install/legacy.pyc | Bin 0 -> 3904 bytes .../_internal/operations/install/wheel 2.py | 615 ++ .../_internal/operations/install/wheel 2.pyc | Bin 0 -> 18924 bytes .../pip/_internal/operations/install/wheel.py | 615 ++ .../_internal/operations/install/wheel.pyc | Bin 0 -> 18924 bytes .../pip/_internal/operations/prepare 2.py | 591 ++ .../pip/_internal/operations/prepare 2.pyc | Bin 0 -> 14484 bytes .../pip/_internal/operations/prepare.py | 591 ++ .../pip/_internal/operations/prepare.pyc | Bin 0 -> 14484 bytes .../pip/_internal/pep425tags 2.py | 167 + .../pip/_internal/pep425tags 2.pyc | Bin 0 -> 4771 bytes .../site-packages/pip/_internal/pep425tags.py | 167 + .../pip/_internal/pep425tags.pyc | Bin 0 -> 4771 bytes .../pip/_internal/pyproject 2.py | 196 + .../pip/_internal/pyproject 2.pyc | Bin 0 -> 4692 bytes .../site-packages/pip/_internal/pyproject.py | 196 + .../site-packages/pip/_internal/pyproject.pyc | Bin 0 -> 4692 bytes .../pip/_internal/req/__init__ 2.py | 92 + .../pip/_internal/req/__init__ 2.pyc | Bin 0 -> 2768 bytes .../pip/_internal/req/__init__.py | 92 + .../pip/_internal/req/__init__.pyc | Bin 0 -> 2768 bytes .../pip/_internal/req/constructors 2.py | 436 + .../pip/_internal/req/constructors 2.pyc | Bin 0 -> 13459 bytes .../pip/_internal/req/constructors.py | 436 + .../pip/_internal/req/constructors.pyc | Bin 0 -> 13459 bytes .../pip/_internal/req/req_file 2.py | 546 ++ .../pip/_internal/req/req_file 2.pyc | Bin 0 -> 16636 bytes .../pip/_internal/req/req_file.py | 546 ++ .../pip/_internal/req/req_file.pyc | Bin 0 -> 16636 bytes .../pip/_internal/req/req_install 2.pyc | Bin 0 -> 27612 bytes .../pip/_internal/req/req_install.py | 830 ++ .../pip/_internal/req/req_install.pyc | Bin 0 -> 27612 bytes .../pip/_internal/req/req_set 2.py | 209 + .../pip/_internal/req/req_set 2.pyc | Bin 0 -> 7973 bytes .../pip/_internal/req/req_set.py | 209 + .../pip/_internal/req/req_set.pyc | Bin 0 -> 7973 bytes .../pip/_internal/req/req_tracker 2.py | 150 + .../pip/_internal/req/req_tracker 2.pyc | Bin 0 -> 5697 bytes .../pip/_internal/req/req_tracker.py | 150 + .../pip/_internal/req/req_tracker.pyc | Bin 0 -> 5697 bytes .../pip/_internal/req/req_uninstall 2.py | 644 ++ .../pip/_internal/req/req_uninstall.py | 644 ++ .../pip/_internal/req/req_uninstall.pyc | Bin 0 -> 23716 bytes .../pip/_internal/self_outdated_check 2.py | 242 + .../pip/_internal/self_outdated_check 2.pyc | Bin 0 -> 7358 bytes .../pip/_internal/self_outdated_check.py | 242 + .../pip/_internal/self_outdated_check.pyc | Bin 0 -> 7358 bytes .../pip/_internal/utils/__init__ 2.py | 0 .../pip/_internal/utils/__init__ 2.pyc | Bin 0 -> 198 bytes .../pip/_internal/utils/__init__.py | 0 .../pip/_internal/utils/__init__.pyc | Bin 0 -> 198 bytes .../pip/_internal/utils/appdirs 2.py | 41 + .../pip/_internal/utils/appdirs 2.pyc | Bin 0 -> 2033 bytes .../pip/_internal/utils/appdirs.py | 41 + .../pip/_internal/utils/appdirs.pyc | Bin 0 -> 2033 bytes .../pip/_internal/utils/compat 2.py | 269 + .../pip/_internal/utils/compat 2.pyc | Bin 0 -> 8539 bytes .../pip/_internal/utils/compat.py | 269 + .../pip/_internal/utils/compat.pyc | Bin 0 -> 8539 bytes .../pip/_internal/utils/deprecation 2.py | 104 + .../pip/_internal/utils/deprecation 2.pyc | Bin 0 -> 3728 bytes .../pip/_internal/utils/deprecation.py | 104 + .../pip/_internal/utils/deprecation.pyc | Bin 0 -> 3728 bytes .../pip/_internal/utils/distutils_args 2.py | 48 + .../pip/_internal/utils/distutils_args 2.pyc | Bin 0 -> 1711 bytes .../pip/_internal/utils/distutils_args.py | 48 + .../pip/_internal/utils/distutils_args.pyc | Bin 0 -> 1711 bytes .../pip/_internal/utils/encoding 2.py | 42 + .../pip/_internal/utils/encoding 2.pyc | Bin 0 -> 1649 bytes .../pip/_internal/utils/encoding.py | 42 + .../pip/_internal/utils/encoding.pyc | Bin 0 -> 1649 bytes .../pip/_internal/utils/entrypoints 2.py | 31 + .../pip/_internal/utils/entrypoints 2.pyc | Bin 0 -> 1535 bytes .../pip/_internal/utils/entrypoints.py | 31 + .../pip/_internal/utils/entrypoints.pyc | Bin 0 -> 1535 bytes .../pip/_internal/utils/filesystem 2.py | 171 + .../pip/_internal/utils/filesystem 2.pyc | Bin 0 -> 5760 bytes .../pip/_internal/utils/filesystem.py | 171 + .../pip/_internal/utils/filesystem.pyc | Bin 0 -> 5760 bytes .../pip/_internal/utils/filetypes 2.py | 16 + .../pip/_internal/utils/filetypes 2.pyc | Bin 0 -> 826 bytes .../pip/_internal/utils/filetypes.py | 16 + .../pip/_internal/utils/filetypes.pyc | Bin 0 -> 826 bytes .../pip/_internal/utils/glibc 2.py | 98 + .../pip/_internal/utils/glibc 2.pyc | Bin 0 -> 2413 bytes .../pip/_internal/utils/glibc.py | 98 + .../pip/_internal/utils/glibc.pyc | Bin 0 -> 2413 bytes .../pip/_internal/utils/hashes 2.py | 131 + .../pip/_internal/utils/hashes 2.pyc | Bin 0 -> 5873 bytes .../pip/_internal/utils/hashes.py | 131 + .../pip/_internal/utils/hashes.pyc | Bin 0 -> 5873 bytes .../utils/inject_securetransport 2.py | 36 + .../utils/inject_securetransport 2.pyc | Bin 0 -> 1162 bytes .../_internal/utils/inject_securetransport.py | 36 + .../utils/inject_securetransport.pyc | Bin 0 -> 1162 bytes .../pip/_internal/utils/logging 2.py | 398 + .../pip/_internal/utils/logging 2.pyc | Bin 0 -> 12804 bytes .../pip/_internal/utils/logging.py | 398 + .../pip/_internal/utils/logging.pyc | Bin 0 -> 12804 bytes .../pip/_internal/utils/marker_files 2.py | 25 + .../pip/_internal/utils/marker_files 2.pyc | Bin 0 -> 1281 bytes .../pip/_internal/utils/marker_files.py | 25 + .../pip/_internal/utils/marker_files.pyc | Bin 0 -> 1281 bytes .../pip/_internal/utils/misc 2.py | 886 ++ .../pip/_internal/utils/misc 2.pyc | Bin 0 -> 33223 bytes .../site-packages/pip/_internal/utils/misc.py | 886 ++ .../pip/_internal/utils/misc.pyc | Bin 0 -> 33223 bytes .../pip/_internal/utils/models 2.py | 42 + .../pip/_internal/utils/models 2.pyc | Bin 0 -> 2949 bytes .../pip/_internal/utils/models.py | 42 + .../pip/_internal/utils/models.pyc | Bin 0 -> 2949 bytes .../pip/_internal/utils/packaging 2.py | 94 + .../pip/_internal/utils/packaging 2.pyc | Bin 0 -> 3518 bytes .../pip/_internal/utils/packaging.py | 94 + .../pip/_internal/utils/packaging.pyc | Bin 0 -> 3518 bytes .../pip/_internal/utils/pkg_resources 2.py | 44 + .../pip/_internal/utils/pkg_resources 2.pyc | Bin 0 -> 2758 bytes .../pip/_internal/utils/pkg_resources.py | 44 + .../pip/_internal/utils/pkg_resources.pyc | Bin 0 -> 2758 bytes .../pip/_internal/utils/setuptools_build 2.py | 181 + .../_internal/utils/setuptools_build 2.pyc | Bin 0 -> 4191 bytes .../pip/_internal/utils/setuptools_build.py | 181 + .../pip/_internal/utils/setuptools_build.pyc | Bin 0 -> 4191 bytes .../pip/_internal/utils/subprocess 2.py | 278 + .../pip/_internal/utils/subprocess 2.pyc | Bin 0 -> 7173 bytes .../pip/_internal/utils/subprocess.py | 278 + .../pip/_internal/utils/subprocess.pyc | Bin 0 -> 7173 bytes .../pip/_internal/utils/temp_dir 2.py | 250 + .../pip/_internal/utils/temp_dir 2.pyc | Bin 0 -> 9096 bytes .../pip/_internal/utils/temp_dir.py | 250 + .../pip/_internal/utils/temp_dir.pyc | Bin 0 -> 9096 bytes .../pip/_internal/utils/typing 2.py | 38 + .../pip/_internal/utils/typing 2.pyc | Bin 0 -> 1627 bytes .../pip/_internal/utils/typing.py | 38 + .../pip/_internal/utils/typing.pyc | Bin 0 -> 1627 bytes .../site-packages/pip/_internal/utils/ui 2.py | 428 + .../pip/_internal/utils/ui 2.pyc | Bin 0 -> 17186 bytes .../site-packages/pip/_internal/utils/ui.py | 428 + .../site-packages/pip/_internal/utils/ui.pyc | Bin 0 -> 17186 bytes .../pip/_internal/utils/unpacking 2.py | 272 + .../pip/_internal/utils/unpacking 2.pyc | Bin 0 -> 7639 bytes .../pip/_internal/utils/unpacking.py | 272 + .../pip/_internal/utils/unpacking.pyc | Bin 0 -> 7639 bytes .../pip/_internal/utils/urls 2.py | 54 + .../pip/_internal/utils/urls 2.pyc | Bin 0 -> 2077 bytes .../site-packages/pip/_internal/utils/urls.py | 54 + .../pip/_internal/utils/urls.pyc | Bin 0 -> 2077 bytes .../pip/_internal/utils/virtualenv 2.py | 115 + .../pip/_internal/utils/virtualenv 2.pyc | Bin 0 -> 4425 bytes .../pip/_internal/utils/virtualenv.py | 115 + .../pip/_internal/utils/virtualenv.pyc | Bin 0 -> 4425 bytes .../pip/_internal/utils/wheel 2.py | 225 + .../pip/_internal/utils/wheel 2.pyc | Bin 0 -> 7853 bytes .../pip/_internal/utils/wheel.py | 225 + .../pip/_internal/utils/wheel.pyc | Bin 0 -> 7853 bytes .../pip/_internal/vcs/__init__ 2.py | 15 + .../pip/_internal/vcs/__init__ 2.pyc | Bin 0 -> 553 bytes .../pip/_internal/vcs/__init__.py | 15 + .../pip/_internal/vcs/__init__.pyc | Bin 0 -> 553 bytes .../pip/_internal/vcs/bazaar 2.py | 120 + .../pip/_internal/vcs/bazaar 2.pyc | Bin 0 -> 5464 bytes .../site-packages/pip/_internal/vcs/bazaar.py | 120 + .../pip/_internal/vcs/bazaar.pyc | Bin 0 -> 5464 bytes .../site-packages/pip/_internal/vcs/git 2.py | 389 + .../site-packages/pip/_internal/vcs/git 2.pyc | Bin 0 -> 12814 bytes .../site-packages/pip/_internal/vcs/git.py | 389 + .../site-packages/pip/_internal/vcs/git.pyc | Bin 0 -> 12814 bytes .../pip/_internal/vcs/mercurial 2.py | 155 + .../pip/_internal/vcs/mercurial 2.pyc | Bin 0 -> 6747 bytes .../pip/_internal/vcs/mercurial.py | 155 + .../pip/_internal/vcs/mercurial.pyc | Bin 0 -> 6747 bytes .../pip/_internal/vcs/subversion 2.py | 333 + .../pip/_internal/vcs/subversion 2.pyc | Bin 0 -> 10957 bytes .../pip/_internal/vcs/subversion.py | 333 + .../pip/_internal/vcs/subversion.pyc | Bin 0 -> 10957 bytes .../pip/_internal/vcs/versioncontrol 2.py | 700 ++ .../pip/_internal/vcs/versioncontrol.py | 700 ++ .../pip/_internal/vcs/versioncontrol.pyc | Bin 0 -> 25564 bytes .../pip/_internal/wheel_builder 2.py | 305 + .../pip/_internal/wheel_builder 2.pyc | Bin 0 -> 8730 bytes .../pip/_internal/wheel_builder.py | 305 + .../pip/_internal/wheel_builder.pyc | Bin 0 -> 8730 bytes .../site-packages/pip/_vendor/__init__.py | 109 + .../site-packages/pip/_vendor/__init__.pyc | Bin 0 -> 3392 bytes .../site-packages/pip/_vendor/appdirs.py | 639 ++ .../site-packages/pip/_vendor/appdirs.pyc | Bin 0 -> 24985 bytes .../pip/_vendor/cachecontrol/__init__ 2.py | 11 + .../pip/_vendor/cachecontrol/__init__ 2.pyc | Bin 0 -> 630 bytes .../pip/_vendor/cachecontrol/__init__.py | 11 + .../pip/_vendor/cachecontrol/__init__.pyc | Bin 0 -> 630 bytes .../pip/_vendor/cachecontrol/_cmd 2.py | 57 + .../pip/_vendor/cachecontrol/_cmd 2.pyc | Bin 0 -> 2288 bytes .../pip/_vendor/cachecontrol/_cmd.py | 57 + .../pip/_vendor/cachecontrol/_cmd.pyc | Bin 0 -> 2288 bytes .../pip/_vendor/cachecontrol/adapter 2.py | 133 + .../pip/_vendor/cachecontrol/adapter 2.pyc | Bin 0 -> 4059 bytes .../pip/_vendor/cachecontrol/adapter.py | 133 + .../pip/_vendor/cachecontrol/adapter.pyc | Bin 0 -> 4059 bytes .../pip/_vendor/cachecontrol/cache 2.py | 39 + .../pip/_vendor/cachecontrol/cache 2.pyc | Bin 0 -> 2923 bytes .../pip/_vendor/cachecontrol/cache.py | 39 + .../pip/_vendor/cachecontrol/cache.pyc | Bin 0 -> 2923 bytes .../_vendor/cachecontrol/caches/__init__ 2.py | 2 + .../cachecontrol/caches/__init__ 2.pyc | Bin 0 -> 329 bytes .../_vendor/cachecontrol/caches/__init__.py | 2 + .../_vendor/cachecontrol/caches/__init__.pyc | Bin 0 -> 329 bytes .../cachecontrol/caches/file_cache 2.py | 146 + .../cachecontrol/caches/file_cache 2.pyc | Bin 0 -> 4731 bytes .../_vendor/cachecontrol/caches/file_cache.py | 146 + .../cachecontrol/caches/file_cache.pyc | Bin 0 -> 4731 bytes .../cachecontrol/caches/redis_cache 2.py | 33 + .../cachecontrol/caches/redis_cache 2.pyc | Bin 0 -> 2500 bytes .../cachecontrol/caches/redis_cache.py | 33 + .../cachecontrol/caches/redis_cache.pyc | Bin 0 -> 2500 bytes .../pip/_vendor/cachecontrol/compat 2.py | 29 + .../pip/_vendor/cachecontrol/compat 2.pyc | Bin 0 -> 849 bytes .../pip/_vendor/cachecontrol/compat.py | 29 + .../pip/_vendor/cachecontrol/compat.pyc | Bin 0 -> 849 bytes .../pip/_vendor/cachecontrol/controller 2.py | 376 + .../pip/_vendor/cachecontrol/controller 2.pyc | Bin 0 -> 10239 bytes .../pip/_vendor/cachecontrol/controller.py | 376 + .../pip/_vendor/cachecontrol/controller.pyc | Bin 0 -> 10239 bytes .../pip/_vendor/cachecontrol/filewrapper 2.py | 80 + .../_vendor/cachecontrol/filewrapper 2.pyc | Bin 0 -> 3043 bytes .../pip/_vendor/cachecontrol/filewrapper.py | 80 + .../pip/_vendor/cachecontrol/filewrapper.pyc | Bin 0 -> 3043 bytes .../pip/_vendor/cachecontrol/heuristics 2.py | 135 + .../pip/_vendor/cachecontrol/heuristics 2.pyc | Bin 0 -> 6673 bytes .../pip/_vendor/cachecontrol/heuristics.py | 135 + .../pip/_vendor/cachecontrol/heuristics.pyc | Bin 0 -> 6673 bytes .../pip/_vendor/cachecontrol/serialize 2.py | 188 + .../pip/_vendor/cachecontrol/serialize 2.pyc | Bin 0 -> 6401 bytes .../pip/_vendor/cachecontrol/serialize.py | 188 + .../pip/_vendor/cachecontrol/serialize.pyc | Bin 0 -> 6401 bytes .../pip/_vendor/cachecontrol/wrapper 2.py | 29 + .../pip/_vendor/cachecontrol/wrapper 2.pyc | Bin 0 -> 923 bytes .../pip/_vendor/cachecontrol/wrapper.py | 29 + .../pip/_vendor/cachecontrol/wrapper.pyc | Bin 0 -> 923 bytes .../pip/_vendor/certifi/__init__ 2.py | 3 + .../pip/_vendor/certifi/__init__ 2.pyc | Bin 0 -> 287 bytes .../pip/_vendor/certifi/__init__.py | 3 + .../pip/_vendor/certifi/__init__.pyc | Bin 0 -> 287 bytes .../pip/_vendor/certifi/__main__ 2.py | 2 + .../pip/_vendor/certifi/__main__ 2.pyc | Bin 0 -> 273 bytes .../pip/_vendor/certifi/__main__.py | 2 + .../pip/_vendor/certifi/__main__.pyc | Bin 0 -> 273 bytes .../pip/_vendor/certifi/cacert 2.pem | 4602 +++++++++ .../pip/_vendor/certifi/cacert.pem | 4602 +++++++++ .../pip/_vendor/certifi/core 2.py | 15 + .../pip/_vendor/certifi/core 2.pyc | Bin 0 -> 633 bytes .../site-packages/pip/_vendor/certifi/core.py | 15 + .../pip/_vendor/certifi/core.pyc | Bin 0 -> 633 bytes .../pip/_vendor/chardet/__init__ 2.py | 39 + .../pip/_vendor/chardet/__init__ 2.pyc | Bin 0 -> 1088 bytes .../pip/_vendor/chardet/__init__.py | 39 + .../pip/_vendor/chardet/__init__.pyc | Bin 0 -> 1088 bytes .../pip/_vendor/chardet/big5freq 2.py | 386 + .../pip/_vendor/chardet/big5freq.py | 386 + .../pip/_vendor/chardet/big5freq.pyc | Bin 0 -> 54748 bytes .../pip/_vendor/chardet/big5prober 2.py | 47 + .../pip/_vendor/chardet/big5prober 2.pyc | Bin 0 -> 1592 bytes .../pip/_vendor/chardet/big5prober.py | 47 + .../pip/_vendor/chardet/big5prober.pyc | Bin 0 -> 1592 bytes .../pip/_vendor/chardet/chardistribution 2.py | 233 + .../_vendor/chardet/chardistribution 2.pyc | Bin 0 -> 9073 bytes .../pip/_vendor/chardet/chardistribution.py | 233 + .../pip/_vendor/chardet/chardistribution.pyc | Bin 0 -> 9073 bytes .../_vendor/chardet/charsetgroupprober 2.py | 106 + .../_vendor/chardet/charsetgroupprober 2.pyc | Bin 0 -> 3249 bytes .../pip/_vendor/chardet/charsetgroupprober.py | 106 + .../_vendor/chardet/charsetgroupprober.pyc | Bin 0 -> 3249 bytes .../pip/_vendor/chardet/charsetprober 2.py | 145 + .../pip/_vendor/chardet/charsetprober 2.pyc | Bin 0 -> 4666 bytes .../pip/_vendor/chardet/charsetprober.py | 145 + .../pip/_vendor/chardet/charsetprober.pyc | Bin 0 -> 4666 bytes .../pip/_vendor/chardet/cli/__init__ 2.py | 1 + .../pip/_vendor/chardet/cli/__init__ 2.pyc | Bin 0 -> 202 bytes .../pip/_vendor/chardet/cli/__init__.py | 1 + .../pip/_vendor/chardet/cli/__init__.pyc | Bin 0 -> 202 bytes .../pip/_vendor/chardet/cli/chardetect 2.py | 85 + .../pip/_vendor/chardet/cli/chardetect 2.pyc | Bin 0 -> 3331 bytes .../pip/_vendor/chardet/cli/chardetect.py | 85 + .../pip/_vendor/chardet/cli/chardetect.pyc | Bin 0 -> 3331 bytes .../_vendor/chardet/codingstatemachine 2.py | 88 + .../_vendor/chardet/codingstatemachine 2.pyc | Bin 0 -> 3736 bytes .../pip/_vendor/chardet/codingstatemachine.py | 88 + .../_vendor/chardet/codingstatemachine.pyc | Bin 0 -> 3736 bytes .../pip/_vendor/chardet/compat 2.py | 34 + .../pip/_vendor/chardet/compat 2.pyc | Bin 0 -> 451 bytes .../pip/_vendor/chardet/compat.py | 34 + .../pip/_vendor/chardet/compat.pyc | Bin 0 -> 451 bytes .../pip/_vendor/chardet/cp949prober 2.py | 49 + .../pip/_vendor/chardet/cp949prober 2.pyc | Bin 0 -> 1600 bytes .../pip/_vendor/chardet/cp949prober.py | 49 + .../pip/_vendor/chardet/cp949prober.pyc | Bin 0 -> 1600 bytes .../pip/_vendor/chardet/enums 2.py | 76 + .../pip/_vendor/chardet/enums 2.pyc | Bin 0 -> 3505 bytes .../pip/_vendor/chardet/enums.py | 76 + .../pip/_vendor/chardet/enums.pyc | Bin 0 -> 3505 bytes .../pip/_vendor/chardet/escprober 2.py | 101 + .../pip/_vendor/chardet/escprober 2.pyc | Bin 0 -> 3607 bytes .../pip/_vendor/chardet/escprober.py | 101 + .../pip/_vendor/chardet/escprober.pyc | Bin 0 -> 3607 bytes .../pip/_vendor/chardet/escsm 2.py | 246 + .../pip/_vendor/chardet/escsm 2.pyc | Bin 0 -> 8062 bytes .../pip/_vendor/chardet/escsm.py | 246 + .../pip/_vendor/chardet/escsm.pyc | Bin 0 -> 8062 bytes .../pip/_vendor/chardet/eucjpprober 2.py | 92 + .../pip/_vendor/chardet/eucjpprober 2.pyc | Bin 0 -> 3422 bytes .../pip/_vendor/chardet/eucjpprober.py | 92 + .../pip/_vendor/chardet/eucjpprober.pyc | Bin 0 -> 3422 bytes .../pip/_vendor/chardet/euckrfreq 2.py | 195 + .../pip/_vendor/chardet/euckrfreq 2.pyc | Bin 0 -> 24134 bytes .../pip/_vendor/chardet/euckrfreq.py | 195 + .../pip/_vendor/chardet/euckrfreq.pyc | Bin 0 -> 24134 bytes .../pip/_vendor/chardet/euckrprober 2.py | 47 + .../pip/_vendor/chardet/euckrprober 2.pyc | Bin 0 -> 1601 bytes .../pip/_vendor/chardet/euckrprober.py | 47 + .../pip/_vendor/chardet/euckrprober.pyc | Bin 0 -> 1601 bytes .../pip/_vendor/chardet/euctwfreq 2.py | 387 + .../pip/_vendor/chardet/euctwfreq 2.pyc | Bin 0 -> 54757 bytes .../pip/_vendor/chardet/euctwfreq.py | 387 + .../pip/_vendor/chardet/euctwfreq.pyc | Bin 0 -> 54757 bytes .../pip/_vendor/chardet/euctwprober 2.py | 46 + .../pip/_vendor/chardet/euctwprober 2.pyc | Bin 0 -> 1601 bytes .../pip/_vendor/chardet/euctwprober.py | 46 + .../pip/_vendor/chardet/euctwprober.pyc | Bin 0 -> 1601 bytes .../pip/_vendor/chardet/gb2312freq 2.py | 283 + .../pip/_vendor/chardet/gb2312freq.py | 283 + .../pip/_vendor/chardet/gb2312freq.pyc | Bin 0 -> 38399 bytes .../pip/_vendor/chardet/gb2312prober 2.py | 46 + .../pip/_vendor/chardet/gb2312prober 2.pyc | Bin 0 -> 1610 bytes .../pip/_vendor/chardet/gb2312prober.py | 46 + .../pip/_vendor/chardet/gb2312prober.pyc | Bin 0 -> 1610 bytes .../pip/_vendor/chardet/hebrewprober 2.py | 292 + .../pip/_vendor/chardet/hebrewprober 2.pyc | Bin 0 -> 4331 bytes .../pip/_vendor/chardet/hebrewprober.py | 292 + .../pip/_vendor/chardet/hebrewprober.pyc | Bin 0 -> 4331 bytes .../pip/_vendor/chardet/jisfreq 2.py | 325 + .../pip/_vendor/chardet/jisfreq 2.pyc | Bin 0 -> 44543 bytes .../pip/_vendor/chardet/jisfreq.py | 325 + .../pip/_vendor/chardet/jisfreq.pyc | Bin 0 -> 44543 bytes .../pip/_vendor/chardet/jpcntx 2.py | 233 + .../pip/_vendor/chardet/jpcntx.py | 233 + .../pip/_vendor/chardet/jpcntx.pyc | Bin 0 -> 25988 bytes .../_vendor/chardet/langbulgarianmodel 2.py | 228 + .../_vendor/chardet/langbulgarianmodel 2.pyc | Bin 0 -> 25011 bytes .../pip/_vendor/chardet/langbulgarianmodel.py | 228 + .../_vendor/chardet/langbulgarianmodel.pyc | Bin 0 -> 25011 bytes .../_vendor/chardet/langcyrillicmodel 2.py | 333 + .../_vendor/chardet/langcyrillicmodel 2.pyc | Bin 0 -> 30731 bytes .../pip/_vendor/chardet/langcyrillicmodel.py | 333 + .../pip/_vendor/chardet/langcyrillicmodel.pyc | Bin 0 -> 30731 bytes .../pip/_vendor/chardet/langgreekmodel 2.py | 225 + .../pip/_vendor/chardet/langgreekmodel 2.pyc | Bin 0 -> 24686 bytes .../pip/_vendor/chardet/langgreekmodel.py | 225 + .../pip/_vendor/chardet/langgreekmodel.pyc | Bin 0 -> 24686 bytes .../pip/_vendor/chardet/langhebrewmodel 2.py | 200 + .../pip/_vendor/chardet/langhebrewmodel 2.pyc | Bin 0 -> 23497 bytes .../pip/_vendor/chardet/langhebrewmodel.py | 200 + .../pip/_vendor/chardet/langhebrewmodel.pyc | Bin 0 -> 23497 bytes .../_vendor/chardet/langhungarianmodel 2.py | 225 + .../_vendor/chardet/langhungarianmodel 2.pyc | Bin 0 -> 24981 bytes .../pip/_vendor/chardet/langhungarianmodel.py | 225 + .../_vendor/chardet/langhungarianmodel.pyc | Bin 0 -> 24981 bytes .../pip/_vendor/chardet/langthaimodel 2.py | 199 + .../pip/_vendor/chardet/langthaimodel 2.pyc | Bin 0 -> 23476 bytes .../pip/_vendor/chardet/langthaimodel.py | 199 + .../pip/_vendor/chardet/langthaimodel.pyc | Bin 0 -> 23476 bytes .../pip/_vendor/chardet/langturkishmodel 2.py | 193 + .../_vendor/chardet/langturkishmodel 2.pyc | Bin 0 -> 23493 bytes .../pip/_vendor/chardet/langturkishmodel.py | 193 + .../pip/_vendor/chardet/langturkishmodel.pyc | Bin 0 -> 23493 bytes .../pip/_vendor/chardet/latin1prober 2.py | 145 + .../pip/_vendor/chardet/latin1prober 2.pyc | Bin 0 -> 4117 bytes .../pip/_vendor/chardet/latin1prober.py | 145 + .../pip/_vendor/chardet/latin1prober.pyc | Bin 0 -> 4117 bytes .../pip/_vendor/chardet/mbcharsetprober 2.py | 91 + .../pip/_vendor/chardet/mbcharsetprober 2.pyc | Bin 0 -> 3171 bytes .../pip/_vendor/chardet/mbcharsetprober.py | 91 + .../pip/_vendor/chardet/mbcharsetprober.pyc | Bin 0 -> 3171 bytes .../pip/_vendor/chardet/mbcsgroupprober 2.py | 54 + .../pip/_vendor/chardet/mbcsgroupprober 2.pyc | Bin 0 -> 1477 bytes .../pip/_vendor/chardet/mbcsgroupprober.py | 54 + .../pip/_vendor/chardet/mbcsgroupprober.pyc | Bin 0 -> 1477 bytes .../pip/_vendor/chardet/mbcssm 2.py | 572 ++ .../pip/_vendor/chardet/mbcssm 2.pyc | Bin 0 -> 19168 bytes .../pip/_vendor/chardet/mbcssm.py | 572 ++ .../pip/_vendor/chardet/mbcssm.pyc | Bin 0 -> 19168 bytes .../pip/_vendor/chardet/sbcharsetprober 2.py | 132 + .../pip/_vendor/chardet/sbcharsetprober 2.pyc | Bin 0 -> 4050 bytes .../pip/_vendor/chardet/sbcharsetprober.py | 132 + .../pip/_vendor/chardet/sbcharsetprober.pyc | Bin 0 -> 4050 bytes .../pip/_vendor/chardet/sbcsgroupprober 2.py | 73 + .../pip/_vendor/chardet/sbcsgroupprober 2.pyc | Bin 0 -> 2070 bytes .../pip/_vendor/chardet/sbcsgroupprober.py | 73 + .../pip/_vendor/chardet/sbcsgroupprober.pyc | Bin 0 -> 2070 bytes .../pip/_vendor/chardet/sjisprober 2.py | 92 + .../pip/_vendor/chardet/sjisprober 2.pyc | Bin 0 -> 3443 bytes .../pip/_vendor/chardet/sjisprober.py | 92 + .../pip/_vendor/chardet/sjisprober.pyc | Bin 0 -> 3443 bytes .../_vendor/chardet/universaldetector 2.py | 286 + .../_vendor/chardet/universaldetector 2.pyc | Bin 0 -> 7403 bytes .../pip/_vendor/chardet/universaldetector.py | 286 + .../pip/_vendor/chardet/universaldetector.pyc | Bin 0 -> 7403 bytes .../pip/_vendor/chardet/utf8prober 2.py | 82 + .../pip/_vendor/chardet/utf8prober 2.pyc | Bin 0 -> 2892 bytes .../pip/_vendor/chardet/utf8prober.py | 82 + .../pip/_vendor/chardet/utf8prober.pyc | Bin 0 -> 2892 bytes .../pip/_vendor/chardet/version 2.py | 9 + .../pip/_vendor/chardet/version 2.pyc | Bin 0 -> 478 bytes .../pip/_vendor/chardet/version.py | 9 + .../pip/_vendor/chardet/version.pyc | Bin 0 -> 478 bytes .../pip/_vendor/colorama/__init__ 2.py | 6 + .../pip/_vendor/colorama/__init__ 2.pyc | Bin 0 -> 530 bytes .../pip/_vendor/colorama/__init__.py | 6 + .../pip/_vendor/colorama/__init__.pyc | Bin 0 -> 530 bytes .../pip/_vendor/colorama/ansi 2.py | 102 + .../pip/_vendor/colorama/ansi 2.pyc | Bin 0 -> 5184 bytes .../pip/_vendor/colorama/ansi.py | 102 + .../pip/_vendor/colorama/ansi.pyc | Bin 0 -> 5184 bytes .../pip/_vendor/colorama/ansitowin32 2.py | 257 + .../pip/_vendor/colorama/ansitowin32 2.pyc | Bin 0 -> 11113 bytes .../pip/_vendor/colorama/ansitowin32.py | 257 + .../pip/_vendor/colorama/ansitowin32.pyc | Bin 0 -> 11113 bytes .../pip/_vendor/colorama/initialise 2.py | 80 + .../pip/_vendor/colorama/initialise 2.pyc | Bin 0 -> 2683 bytes .../pip/_vendor/colorama/initialise.py | 80 + .../pip/_vendor/colorama/initialise.pyc | Bin 0 -> 2683 bytes .../pip/_vendor/colorama/win32 2.py | 152 + .../pip/_vendor/colorama/win32 2.pyc | Bin 0 -> 5862 bytes .../pip/_vendor/colorama/win32.py | 152 + .../pip/_vendor/colorama/win32.pyc | Bin 0 -> 5862 bytes .../pip/_vendor/colorama/winterm 2.py | 169 + .../pip/_vendor/colorama/winterm 2.pyc | Bin 0 -> 6935 bytes .../pip/_vendor/colorama/winterm.py | 169 + .../pip/_vendor/colorama/winterm.pyc | Bin 0 -> 6935 bytes .../site-packages/pip/_vendor/contextlib2.py | 518 ++ .../site-packages/pip/_vendor/contextlib2.pyc | Bin 0 -> 21825 bytes .../pip/_vendor/distlib/__init__ 2.py | 23 + .../pip/_vendor/distlib/__init__ 2.pyc | Bin 0 -> 1623 bytes .../pip/_vendor/distlib/__init__.py | 23 + .../pip/_vendor/distlib/__init__.pyc | Bin 0 -> 1623 bytes .../_vendor/distlib/_backport/__init__ 2.py | 6 + .../_vendor/distlib/_backport/__init__ 2.pyc | Bin 0 -> 498 bytes .../pip/_vendor/distlib/_backport/__init__.py | 6 + .../_vendor/distlib/_backport/__init__.pyc | Bin 0 -> 498 bytes .../pip/_vendor/distlib/_backport/misc 2.py | 41 + .../pip/_vendor/distlib/_backport/misc 2.pyc | Bin 0 -> 1616 bytes .../pip/_vendor/distlib/_backport/misc.py | 41 + .../pip/_vendor/distlib/_backport/misc.pyc | Bin 0 -> 1616 bytes .../_vendor/distlib/_backport/shutil 2.pyc | Bin 0 -> 28381 bytes .../pip/_vendor/distlib/_backport/shutil.py | 761 ++ .../pip/_vendor/distlib/_backport/shutil.pyc | Bin 0 -> 28381 bytes .../_vendor/distlib/_backport/sysconfig 2.cfg | 84 + .../_vendor/distlib/_backport/sysconfig 2.py | 786 ++ .../_vendor/distlib/_backport/sysconfig 2.pyc | Bin 0 -> 22282 bytes .../_vendor/distlib/_backport/sysconfig.cfg | 84 + .../_vendor/distlib/_backport/sysconfig.py | 786 ++ .../_vendor/distlib/_backport/sysconfig.pyc | Bin 0 -> 22282 bytes .../_vendor/distlib/_backport/tarfile 2.py | 2607 ++++++ .../_vendor/distlib/_backport/tarfile 2.pyc | Bin 0 -> 86781 bytes .../pip/_vendor/distlib/_backport/tarfile.py | 2607 ++++++ .../pip/_vendor/distlib/_backport/tarfile.pyc | Bin 0 -> 86781 bytes .../pip/_vendor/distlib/compat.py | 1120 +++ .../pip/_vendor/distlib/compat.pyc | Bin 0 -> 44256 bytes .../pip/_vendor/distlib/database 2.pyc | Bin 0 -> 53920 bytes .../pip/_vendor/distlib/database.py | 1339 +++ .../pip/_vendor/distlib/database.pyc | Bin 0 -> 53920 bytes .../pip/_vendor/distlib/index 2.py | 516 ++ .../pip/_vendor/distlib/index 2.pyc | Bin 0 -> 20980 bytes .../pip/_vendor/distlib/index.py | 516 ++ .../pip/_vendor/distlib/index.pyc | Bin 0 -> 20980 bytes .../pip/_vendor/distlib/locators 2.py | 1302 +++ .../pip/_vendor/distlib/locators 2.pyc | Bin 0 -> 49881 bytes .../pip/_vendor/distlib/locators.py | 1302 +++ .../pip/_vendor/distlib/locators.pyc | Bin 0 -> 49881 bytes .../pip/_vendor/distlib/manifest 2.py | 393 + .../pip/_vendor/distlib/manifest 2.pyc | Bin 0 -> 12906 bytes .../pip/_vendor/distlib/manifest.py | 393 + .../pip/_vendor/distlib/manifest.pyc | Bin 0 -> 12906 bytes .../pip/_vendor/distlib/markers 2.py | 131 + .../pip/_vendor/distlib/markers 2.pyc | Bin 0 -> 7112 bytes .../pip/_vendor/distlib/markers.py | 131 + .../pip/_vendor/distlib/markers.pyc | Bin 0 -> 7112 bytes .../pip/_vendor/distlib/metadata 2.py | 1096 +++ .../pip/_vendor/distlib/metadata.py | 1096 +++ .../pip/_vendor/distlib/metadata.pyc | Bin 0 -> 38841 bytes .../pip/_vendor/distlib/resources 2.py | 355 + .../pip/_vendor/distlib/resources 2.pyc | Bin 0 -> 15896 bytes .../pip/_vendor/distlib/resources.py | 355 + .../pip/_vendor/distlib/resources.pyc | Bin 0 -> 15896 bytes .../pip/_vendor/distlib/scripts 2.py | 416 + .../pip/_vendor/distlib/scripts 2.pyc | Bin 0 -> 14218 bytes .../pip/_vendor/distlib/scripts.py | 416 + .../pip/_vendor/distlib/scripts.pyc | Bin 0 -> 14218 bytes .../pip/_vendor/distlib/t32 2.exe | Bin 0 -> 96768 bytes .../site-packages/pip/_vendor/distlib/t32.exe | Bin 0 -> 96768 bytes .../pip/_vendor/distlib/t64 2.exe | Bin 0 -> 105984 bytes .../site-packages/pip/_vendor/distlib/t64.exe | Bin 0 -> 105984 bytes .../pip/_vendor/distlib/util 2.py | 1761 ++++ .../site-packages/pip/_vendor/distlib/util.py | 1761 ++++ .../pip/_vendor/distlib/util.pyc | Bin 0 -> 67899 bytes .../pip/_vendor/distlib/version 2.pyc | Bin 0 -> 29783 bytes .../pip/_vendor/distlib/version.py | 736 ++ .../pip/_vendor/distlib/version.pyc | Bin 0 -> 29783 bytes .../pip/_vendor/distlib/w32 2.exe | Bin 0 -> 90112 bytes .../site-packages/pip/_vendor/distlib/w32.exe | Bin 0 -> 90112 bytes .../pip/_vendor/distlib/w64 2.exe | Bin 0 -> 99840 bytes .../site-packages/pip/_vendor/distlib/w64.exe | Bin 0 -> 99840 bytes .../pip/_vendor/distlib/wheel 2.py | 1004 ++ .../pip/_vendor/distlib/wheel 2.pyc | Bin 0 -> 33855 bytes .../pip/_vendor/distlib/wheel.py | 1004 ++ .../pip/_vendor/distlib/wheel.pyc | Bin 0 -> 33855 bytes .../site-packages/pip/_vendor/distro.py | 1216 +++ .../site-packages/pip/_vendor/distro.pyc | Bin 0 -> 42875 bytes .../pip/_vendor/html5lib/__init__ 2.py | 35 + .../pip/_vendor/html5lib/__init__ 2.pyc | Bin 0 -> 1495 bytes .../pip/_vendor/html5lib/__init__.py | 35 + .../pip/_vendor/html5lib/__init__.pyc | Bin 0 -> 1495 bytes .../pip/_vendor/html5lib/_ihatexml 2.py | 288 + .../pip/_vendor/html5lib/_ihatexml 2.pyc | Bin 0 -> 16440 bytes .../pip/_vendor/html5lib/_ihatexml.py | 288 + .../pip/_vendor/html5lib/_ihatexml.pyc | Bin 0 -> 16440 bytes .../pip/_vendor/html5lib/_inputstream.py | 923 ++ .../pip/_vendor/html5lib/_inputstream.pyc | Bin 0 -> 30522 bytes .../pip/_vendor/html5lib/_tokenizer 2.py | 1721 ++++ .../pip/_vendor/html5lib/_tokenizer 2.pyc | Bin 0 -> 57395 bytes .../pip/_vendor/html5lib/_tokenizer.py | 1721 ++++ .../pip/_vendor/html5lib/_tokenizer.pyc | Bin 0 -> 57395 bytes .../pip/_vendor/html5lib/_trie/__init__ 2.py | 14 + .../pip/_vendor/html5lib/_trie/__init__ 2.pyc | Bin 0 -> 489 bytes .../pip/_vendor/html5lib/_trie/__init__.py | 14 + .../pip/_vendor/html5lib/_trie/__init__.pyc | Bin 0 -> 489 bytes .../pip/_vendor/html5lib/_trie/_base 2.py | 40 + .../pip/_vendor/html5lib/_trie/_base 2.pyc | Bin 0 -> 2348 bytes .../pip/_vendor/html5lib/_trie/_base.py | 40 + .../pip/_vendor/html5lib/_trie/_base.pyc | Bin 0 -> 2348 bytes .../pip/_vendor/html5lib/_trie/datrie 2.py | 44 + .../pip/_vendor/html5lib/_trie/datrie 2.pyc | Bin 0 -> 3296 bytes .../pip/_vendor/html5lib/_trie/datrie.py | 44 + .../pip/_vendor/html5lib/_trie/datrie.pyc | Bin 0 -> 3296 bytes .../pip/_vendor/html5lib/_trie/py 2.py | 67 + .../pip/_vendor/html5lib/_trie/py 2.pyc | Bin 0 -> 3489 bytes .../pip/_vendor/html5lib/_trie/py.py | 67 + .../pip/_vendor/html5lib/_trie/py.pyc | Bin 0 -> 3489 bytes .../pip/_vendor/html5lib/_utils 2.py | 124 + .../pip/_vendor/html5lib/_utils 2.pyc | Bin 0 -> 4808 bytes .../pip/_vendor/html5lib/_utils.py | 124 + .../pip/_vendor/html5lib/_utils.pyc | Bin 0 -> 4808 bytes .../pip/_vendor/html5lib/constants 2.py | 2947 ++++++ .../pip/_vendor/html5lib/constants 2.pyc | Bin 0 -> 83207 bytes .../pip/_vendor/html5lib/constants.py | 2947 ++++++ .../pip/_vendor/html5lib/constants.pyc | Bin 0 -> 83207 bytes .../_vendor/html5lib/filters/__init__ 2.py | 0 .../_vendor/html5lib/filters/__init__ 2.pyc | Bin 0 -> 207 bytes .../pip/_vendor/html5lib/filters/__init__.py | 0 .../pip/_vendor/html5lib/filters/__init__.pyc | Bin 0 -> 207 bytes .../filters/alphabeticalattributes 2.py | 29 + .../filters/alphabeticalattributes 2.pyc | Bin 0 -> 1876 bytes .../filters/alphabeticalattributes.py | 29 + .../filters/alphabeticalattributes.pyc | Bin 0 -> 1876 bytes .../pip/_vendor/html5lib/filters/base 2.py | 12 + .../pip/_vendor/html5lib/filters/base 2.pyc | Bin 0 -> 1341 bytes .../pip/_vendor/html5lib/filters/base.py | 12 + .../pip/_vendor/html5lib/filters/base.pyc | Bin 0 -> 1341 bytes .../html5lib/filters/inject_meta_charset 2.py | 73 + .../filters/inject_meta_charset 2.pyc | Bin 0 -> 2648 bytes .../html5lib/filters/inject_meta_charset.py | 73 + .../html5lib/filters/inject_meta_charset.pyc | Bin 0 -> 2648 bytes .../pip/_vendor/html5lib/filters/lint 2.py | 93 + .../pip/_vendor/html5lib/filters/lint 2.pyc | Bin 0 -> 3500 bytes .../pip/_vendor/html5lib/filters/lint.py | 93 + .../pip/_vendor/html5lib/filters/lint.pyc | Bin 0 -> 3500 bytes .../html5lib/filters/optionaltags 2.py | 207 + .../html5lib/filters/optionaltags 2.pyc | Bin 0 -> 4754 bytes .../_vendor/html5lib/filters/optionaltags.py | 207 + .../_vendor/html5lib/filters/optionaltags.pyc | Bin 0 -> 4754 bytes .../pip/_vendor/html5lib/filters/sanitizer.py | 896 ++ .../_vendor/html5lib/filters/sanitizer.pyc | Bin 0 -> 27270 bytes .../_vendor/html5lib/filters/whitespace 2.py | 38 + .../_vendor/html5lib/filters/whitespace 2.pyc | Bin 0 -> 1941 bytes .../_vendor/html5lib/filters/whitespace.py | 38 + .../_vendor/html5lib/filters/whitespace.pyc | Bin 0 -> 1941 bytes .../pip/_vendor/html5lib/html5parser 2.py | 2791 ++++++ .../pip/_vendor/html5lib/html5parser 2.pyc | Bin 0 -> 141299 bytes .../pip/_vendor/html5lib/html5parser.py | 2791 ++++++ .../pip/_vendor/html5lib/html5parser.pyc | Bin 0 -> 141299 bytes .../pip/_vendor/html5lib/serializer 2.py | 409 + .../pip/_vendor/html5lib/serializer 2.pyc | Bin 0 -> 13932 bytes .../pip/_vendor/html5lib/serializer.py | 409 + .../pip/_vendor/html5lib/serializer.pyc | Bin 0 -> 13932 bytes .../html5lib/treeadapters/__init__ 2.py | 30 + .../html5lib/treeadapters/__init__ 2.pyc | Bin 0 -> 1022 bytes .../_vendor/html5lib/treeadapters/__init__.py | 30 + .../html5lib/treeadapters/__init__.pyc | Bin 0 -> 1022 bytes .../_vendor/html5lib/treeadapters/genshi 2.py | 54 + .../html5lib/treeadapters/genshi 2.pyc | Bin 0 -> 1973 bytes .../_vendor/html5lib/treeadapters/genshi.py | 54 + .../_vendor/html5lib/treeadapters/genshi.pyc | Bin 0 -> 1973 bytes .../_vendor/html5lib/treeadapters/sax 2.py | 50 + .../_vendor/html5lib/treeadapters/sax 2.pyc | Bin 0 -> 1970 bytes .../pip/_vendor/html5lib/treeadapters/sax.py | 50 + .../pip/_vendor/html5lib/treeadapters/sax.pyc | Bin 0 -> 1970 bytes .../html5lib/treebuilders/__init__ 2.py | 88 + .../html5lib/treebuilders/__init__ 2.pyc | Bin 0 -> 3662 bytes .../_vendor/html5lib/treebuilders/__init__.py | 88 + .../html5lib/treebuilders/__init__.pyc | Bin 0 -> 3662 bytes .../_vendor/html5lib/treebuilders/base 2.py | 417 + .../_vendor/html5lib/treebuilders/base 2.pyc | Bin 0 -> 16123 bytes .../pip/_vendor/html5lib/treebuilders/base.py | 417 + .../_vendor/html5lib/treebuilders/base.pyc | Bin 0 -> 16123 bytes .../_vendor/html5lib/treebuilders/dom 2.py | 239 + .../_vendor/html5lib/treebuilders/dom 2.pyc | Bin 0 -> 13482 bytes .../pip/_vendor/html5lib/treebuilders/dom.py | 239 + .../pip/_vendor/html5lib/treebuilders/dom.pyc | Bin 0 -> 13482 bytes .../_vendor/html5lib/treebuilders/etree 2.py | 340 + .../_vendor/html5lib/treebuilders/etree 2.pyc | Bin 0 -> 16763 bytes .../_vendor/html5lib/treebuilders/etree.py | 340 + .../_vendor/html5lib/treebuilders/etree.pyc | Bin 0 -> 16763 bytes .../html5lib/treebuilders/etree_lxml 2.py | 366 + .../html5lib/treebuilders/etree_lxml 2.pyc | Bin 0 -> 16913 bytes .../html5lib/treebuilders/etree_lxml.py | 366 + .../html5lib/treebuilders/etree_lxml.pyc | Bin 0 -> 16913 bytes .../html5lib/treewalkers/__init__ 2.py | 154 + .../html5lib/treewalkers/__init__ 2.pyc | Bin 0 -> 5071 bytes .../_vendor/html5lib/treewalkers/__init__.py | 154 + .../_vendor/html5lib/treewalkers/__init__.pyc | Bin 0 -> 5071 bytes .../_vendor/html5lib/treewalkers/base 2.py | 252 + .../_vendor/html5lib/treewalkers/base 2.pyc | Bin 0 -> 9693 bytes .../pip/_vendor/html5lib/treewalkers/base.py | 252 + .../pip/_vendor/html5lib/treewalkers/base.pyc | Bin 0 -> 9693 bytes .../pip/_vendor/html5lib/treewalkers/dom 2.py | 43 + .../_vendor/html5lib/treewalkers/dom 2.pyc | Bin 0 -> 2517 bytes .../pip/_vendor/html5lib/treewalkers/dom.py | 43 + .../pip/_vendor/html5lib/treewalkers/dom.pyc | Bin 0 -> 2517 bytes .../_vendor/html5lib/treewalkers/etree 2.py | 130 + .../_vendor/html5lib/treewalkers/etree 2.pyc | Bin 0 -> 4770 bytes .../pip/_vendor/html5lib/treewalkers/etree.py | 130 + .../_vendor/html5lib/treewalkers/etree.pyc | Bin 0 -> 4770 bytes .../html5lib/treewalkers/etree_lxml 2.py | 213 + .../html5lib/treewalkers/etree_lxml 2.pyc | Bin 0 -> 10584 bytes .../html5lib/treewalkers/etree_lxml.py | 213 + .../html5lib/treewalkers/etree_lxml.pyc | Bin 0 -> 10584 bytes .../_vendor/html5lib/treewalkers/genshi 2.py | 69 + .../_vendor/html5lib/treewalkers/genshi 2.pyc | Bin 0 -> 2626 bytes .../_vendor/html5lib/treewalkers/genshi.py | 69 + .../_vendor/html5lib/treewalkers/genshi.pyc | Bin 0 -> 2626 bytes .../pip/_vendor/idna/__init__ 2.py | 2 + .../pip/_vendor/idna/__init__ 2.pyc | Bin 0 -> 291 bytes .../pip/_vendor/idna/__init__.py | 2 + .../pip/_vendor/idna/__init__.pyc | Bin 0 -> 291 bytes .../site-packages/pip/_vendor/idna/codec 2.py | 118 + .../pip/_vendor/idna/codec 2.pyc | Bin 0 -> 4486 bytes .../site-packages/pip/_vendor/idna/codec.py | 118 + .../site-packages/pip/_vendor/idna/codec.pyc | Bin 0 -> 4486 bytes .../pip/_vendor/idna/compat 2.py | 12 + .../pip/_vendor/idna/compat 2.pyc | Bin 0 -> 999 bytes .../site-packages/pip/_vendor/idna/compat.py | 12 + .../site-packages/pip/_vendor/idna/compat.pyc | Bin 0 -> 999 bytes .../site-packages/pip/_vendor/idna/core 2.py | 396 + .../site-packages/pip/_vendor/idna/core 2.pyc | Bin 0 -> 13098 bytes .../site-packages/pip/_vendor/idna/core.py | 396 + .../site-packages/pip/_vendor/idna/core.pyc | Bin 0 -> 13098 bytes .../pip/_vendor/idna/idnadata 2.py | 1979 ++++ .../pip/_vendor/idna/idnadata 2.pyc | Bin 0 -> 35078 bytes .../pip/_vendor/idna/idnadata.py | 1979 ++++ .../pip/_vendor/idna/idnadata.pyc | Bin 0 -> 35078 bytes .../pip/_vendor/idna/intranges 2.py | 53 + .../pip/_vendor/idna/intranges 2.pyc | Bin 0 -> 2452 bytes .../pip/_vendor/idna/intranges.py | 53 + .../pip/_vendor/idna/intranges.pyc | Bin 0 -> 2452 bytes .../pip/_vendor/idna/package_data 2.py | 2 + .../pip/_vendor/idna/package_data 2.pyc | Bin 0 -> 229 bytes .../pip/_vendor/idna/package_data.py | 2 + .../pip/_vendor/idna/package_data.pyc | Bin 0 -> 229 bytes .../pip/_vendor/idna/uts46data 2.py | 8205 +++++++++++++++++ .../pip/_vendor/idna/uts46data.py | 8205 +++++++++++++++++ .../pip/_vendor/idna/uts46data.pyc | Bin 0 -> 296556 bytes .../site-packages/pip/_vendor/ipaddress.py | 2420 +++++ .../site-packages/pip/_vendor/ipaddress.pyc | Bin 0 -> 85788 bytes .../pip/_vendor/msgpack/__init__ 2.py | 65 + .../pip/_vendor/msgpack/__init__ 2.pyc | Bin 0 -> 2727 bytes .../pip/_vendor/msgpack/__init__.py | 65 + .../pip/_vendor/msgpack/__init__.pyc | Bin 0 -> 2727 bytes .../pip/_vendor/msgpack/_version 2.py | 1 + .../pip/_vendor/msgpack/_version 2.pyc | Bin 0 -> 251 bytes .../pip/_vendor/msgpack/_version.py | 1 + .../pip/_vendor/msgpack/_version.pyc | Bin 0 -> 251 bytes .../pip/_vendor/msgpack/exceptions 2.py | 48 + .../pip/_vendor/msgpack/exceptions 2.pyc | Bin 0 -> 2801 bytes .../pip/_vendor/msgpack/exceptions.py | 48 + .../pip/_vendor/msgpack/exceptions.pyc | Bin 0 -> 2801 bytes .../pip/_vendor/msgpack/fallback 2.py | 1027 +++ .../pip/_vendor/msgpack/fallback 2.pyc | Bin 0 -> 34964 bytes .../pip/_vendor/msgpack/fallback.py | 1027 +++ .../pip/_vendor/msgpack/fallback.pyc | Bin 0 -> 34964 bytes .../pip/_vendor/packaging/__about__ 2.py | 27 + .../pip/_vendor/packaging/__about__ 2.pyc | Bin 0 -> 841 bytes .../pip/_vendor/packaging/__about__.py | 27 + .../pip/_vendor/packaging/__about__.pyc | Bin 0 -> 841 bytes .../pip/_vendor/packaging/__init__ 2.py | 26 + .../pip/_vendor/packaging/__init__ 2.pyc | Bin 0 -> 663 bytes .../pip/_vendor/packaging/__init__.py | 26 + .../pip/_vendor/packaging/__init__.pyc | Bin 0 -> 663 bytes .../pip/_vendor/packaging/_compat.py | 38 + .../pip/_vendor/packaging/_compat.pyc | Bin 0 -> 1591 bytes .../pip/_vendor/packaging/_structures 2.py | 86 + .../pip/_vendor/packaging/_structures 2.pyc | Bin 0 -> 5055 bytes .../pip/_vendor/packaging/_structures.py | 86 + .../pip/_vendor/packaging/_structures.pyc | Bin 0 -> 5055 bytes .../pip/_vendor/packaging/_typing 2.py | 39 + .../pip/_vendor/packaging/_typing 2.pyc | Bin 0 -> 1645 bytes .../pip/_vendor/packaging/_typing.py | 39 + .../pip/_vendor/packaging/_typing.pyc | Bin 0 -> 1645 bytes .../pip/_vendor/packaging/markers 2.py | 328 + .../pip/_vendor/packaging/markers 2.pyc | Bin 0 -> 13958 bytes .../pip/_vendor/packaging/markers.py | 328 + .../pip/_vendor/packaging/markers.pyc | Bin 0 -> 13958 bytes .../pip/_vendor/packaging/requirements 2.py | 145 + .../pip/_vendor/packaging/requirements 2.pyc | Bin 0 -> 5817 bytes .../pip/_vendor/packaging/requirements.py | 145 + .../pip/_vendor/packaging/requirements.pyc | Bin 0 -> 5817 bytes .../pip/_vendor/packaging/specifiers 2.pyc | Bin 0 -> 28782 bytes .../pip/_vendor/packaging/specifiers.py | 849 ++ .../pip/_vendor/packaging/specifiers.pyc | Bin 0 -> 28782 bytes .../pip/_vendor/packaging/tags.py | 730 ++ .../pip/_vendor/packaging/tags.pyc | Bin 0 -> 23753 bytes .../pip/_vendor/packaging/utils 2.py | 62 + .../pip/_vendor/packaging/utils.py | 62 + .../pip/_vendor/packaging/utils.pyc | Bin 0 -> 2278 bytes .../pip/_vendor/packaging/version 2.py | 535 ++ .../pip/_vendor/packaging/version 2.pyc | Bin 0 -> 20747 bytes .../pip/_vendor/packaging/version.py | 535 ++ .../pip/_vendor/packaging/version.pyc | Bin 0 -> 20747 bytes .../pip/_vendor/pep517/__init__ 2.py | 4 + .../pip/_vendor/pep517/__init__ 2.pyc | Bin 0 -> 308 bytes .../pip/_vendor/pep517/__init__.py | 4 + .../pip/_vendor/pep517/__init__.pyc | Bin 0 -> 308 bytes .../pip/_vendor/pep517/_in_process 2.py | 257 + .../pip/_vendor/pep517/_in_process 2.pyc | Bin 0 -> 10561 bytes .../pip/_vendor/pep517/_in_process.py | 257 + .../pip/_vendor/pep517/_in_process.pyc | Bin 0 -> 10561 bytes .../pip/_vendor/pep517/build 2.py | 124 + .../pip/_vendor/pep517/build 2.pyc | Bin 0 -> 4620 bytes .../site-packages/pip/_vendor/pep517/build.py | 124 + .../pip/_vendor/pep517/build.pyc | Bin 0 -> 4620 bytes .../pip/_vendor/pep517/check 2.py | 203 + .../pip/_vendor/pep517/check 2.pyc | Bin 0 -> 6237 bytes .../site-packages/pip/_vendor/pep517/check.py | 203 + .../pip/_vendor/pep517/check.pyc | Bin 0 -> 6237 bytes .../pip/_vendor/pep517/colorlog 2.py | 115 + .../pip/_vendor/pep517/colorlog 2.pyc | Bin 0 -> 3906 bytes .../pip/_vendor/pep517/colorlog.py | 115 + .../pip/_vendor/pep517/colorlog.pyc | Bin 0 -> 3906 bytes .../pip/_vendor/pep517/compat 2.py | 34 + .../pip/_vendor/pep517/compat 2.pyc | Bin 0 -> 1643 bytes .../pip/_vendor/pep517/compat.py | 34 + .../pip/_vendor/pep517/compat.pyc | Bin 0 -> 1643 bytes .../pip/_vendor/pep517/dirtools 2.py | 44 + .../pip/_vendor/pep517/dirtools 2.pyc | Bin 0 -> 1895 bytes .../pip/_vendor/pep517/dirtools.py | 44 + .../pip/_vendor/pep517/dirtools.pyc | Bin 0 -> 1895 bytes .../pip/_vendor/pep517/envbuild 2.py | 167 + .../pip/_vendor/pep517/envbuild 2.pyc | Bin 0 -> 5801 bytes .../pip/_vendor/pep517/envbuild.py | 167 + .../pip/_vendor/pep517/envbuild.pyc | Bin 0 -> 5801 bytes .../pip/_vendor/pep517/meta 2.py | 92 + .../pip/_vendor/pep517/meta 2.pyc | Bin 0 -> 3827 bytes .../site-packages/pip/_vendor/pep517/meta.py | 92 + .../site-packages/pip/_vendor/pep517/meta.pyc | Bin 0 -> 3827 bytes .../pip/_vendor/pep517/wrappers 2.py | 298 + .../pip/_vendor/pep517/wrappers 2.pyc | Bin 0 -> 13428 bytes .../pip/_vendor/pep517/wrappers.py | 298 + .../pip/_vendor/pep517/wrappers.pyc | Bin 0 -> 13428 bytes .../pip/_vendor/pkg_resources/__init__ 2.py | 3296 +++++++ .../pip/_vendor/pkg_resources/__init__ 2.pyc | Bin 0 -> 137867 bytes .../pip/_vendor/pkg_resources/__init__.py | 3296 +++++++ .../pip/_vendor/pkg_resources/__init__.pyc | Bin 0 -> 137867 bytes .../pip/_vendor/pkg_resources/py31compat 2.py | 23 + .../_vendor/pkg_resources/py31compat 2.pyc | Bin 0 -> 881 bytes .../pip/_vendor/pkg_resources/py31compat.py | 23 + .../pip/_vendor/pkg_resources/py31compat.pyc | Bin 0 -> 881 bytes .../pip/_vendor/progress/__init__ 2.py | 177 + .../pip/_vendor/progress/__init__ 2.pyc | Bin 0 -> 8933 bytes .../pip/_vendor/progress/__init__.py | 177 + .../pip/_vendor/progress/__init__.pyc | Bin 0 -> 8933 bytes .../pip/_vendor/progress/bar 2.py | 91 + .../pip/_vendor/progress/bar 2.pyc | Bin 0 -> 4043 bytes .../site-packages/pip/_vendor/progress/bar.py | 91 + .../pip/_vendor/progress/bar.pyc | Bin 0 -> 4043 bytes .../pip/_vendor/progress/counter 2.py | 41 + .../pip/_vendor/progress/counter 2.pyc | Bin 0 -> 2422 bytes .../pip/_vendor/progress/counter.py | 41 + .../pip/_vendor/progress/counter.pyc | Bin 0 -> 2422 bytes .../pip/_vendor/progress/spinner 2.py | 43 + .../pip/_vendor/progress/spinner 2.pyc | Bin 0 -> 2211 bytes .../pip/_vendor/progress/spinner.py | 43 + .../pip/_vendor/progress/spinner.pyc | Bin 0 -> 2211 bytes .../site-packages/pip/_vendor/pyparsing.py | 7090 ++++++++++++++ .../site-packages/pip/_vendor/pyparsing.pyc | Bin 0 -> 302301 bytes .../pip/_vendor/pytoml/__init__ 2.pyc | Bin 0 -> 448 bytes .../pip/_vendor/pytoml/__init__.py | 4 + .../pip/_vendor/pytoml/__init__.pyc | Bin 0 -> 448 bytes .../pip/_vendor/pytoml/core 2.py | 13 + .../pip/_vendor/pytoml/core 2.pyc | Bin 0 -> 1400 bytes .../site-packages/pip/_vendor/pytoml/core.py | 13 + .../site-packages/pip/_vendor/pytoml/core.pyc | Bin 0 -> 1400 bytes .../pip/_vendor/pytoml/parser 2.py | 342 + .../pip/_vendor/pytoml/parser 2.pyc | Bin 0 -> 14656 bytes .../pip/_vendor/pytoml/parser.py | 342 + .../pip/_vendor/pytoml/parser.pyc | Bin 0 -> 14656 bytes .../pip/_vendor/pytoml/test 2.py | 30 + .../pip/_vendor/pytoml/test 2.pyc | Bin 0 -> 1551 bytes .../site-packages/pip/_vendor/pytoml/test.py | 30 + .../site-packages/pip/_vendor/pytoml/test.pyc | Bin 0 -> 1551 bytes .../pip/_vendor/pytoml/utils 2.py | 67 + .../pip/_vendor/pytoml/utils 2.pyc | Bin 0 -> 3298 bytes .../site-packages/pip/_vendor/pytoml/utils.py | 67 + .../pip/_vendor/pytoml/utils.pyc | Bin 0 -> 3298 bytes .../pip/_vendor/pytoml/writer 2.py | 114 + .../pip/_vendor/pytoml/writer.py | 114 + .../pip/_vendor/pytoml/writer.pyc | Bin 0 -> 5777 bytes .../pip/_vendor/requests/__init__ 2.py | 133 + .../pip/_vendor/requests/__init__ 2.pyc | Bin 0 -> 4332 bytes .../pip/_vendor/requests/__init__.py | 133 + .../pip/_vendor/requests/__init__.pyc | Bin 0 -> 4332 bytes .../pip/_vendor/requests/__version__ 2.py | 14 + .../pip/_vendor/requests/__version__ 2.pyc | Bin 0 -> 634 bytes .../pip/_vendor/requests/__version__.py | 14 + .../pip/_vendor/requests/__version__.pyc | Bin 0 -> 634 bytes .../pip/_vendor/requests/_internal_utils 2.py | 42 + .../_vendor/requests/_internal_utils 2.pyc | Bin 0 -> 1676 bytes .../pip/_vendor/requests/_internal_utils.py | 42 + .../pip/_vendor/requests/_internal_utils.pyc | Bin 0 -> 1676 bytes .../pip/_vendor/requests/adapters 2.py | 533 ++ .../pip/_vendor/requests/adapters 2.pyc | Bin 0 -> 20399 bytes .../pip/_vendor/requests/adapters.py | 533 ++ .../pip/_vendor/requests/adapters.pyc | Bin 0 -> 20399 bytes .../pip/_vendor/requests/api 2.py | 158 + .../pip/_vendor/requests/api 2.pyc | Bin 0 -> 7517 bytes .../site-packages/pip/_vendor/requests/api.py | 158 + .../pip/_vendor/requests/api.pyc | Bin 0 -> 7517 bytes .../pip/_vendor/requests/auth 2.py | 305 + .../pip/_vendor/requests/auth 2.pyc | Bin 0 -> 11699 bytes .../pip/_vendor/requests/auth.py | 305 + .../pip/_vendor/requests/auth.pyc | Bin 0 -> 11699 bytes .../pip/_vendor/requests/certs 2.py | 18 + .../pip/_vendor/requests/certs 2.pyc | Bin 0 -> 665 bytes .../pip/_vendor/requests/certs.py | 18 + .../pip/_vendor/requests/certs.pyc | Bin 0 -> 665 bytes .../pip/_vendor/requests/compat 2.py | 74 + .../pip/_vendor/requests/compat 2.pyc | Bin 0 -> 2003 bytes .../pip/_vendor/requests/compat.py | 74 + .../pip/_vendor/requests/compat.pyc | Bin 0 -> 2003 bytes .../pip/_vendor/requests/cookies 2.py | 549 ++ .../pip/_vendor/requests/cookies 2.pyc | Bin 0 -> 25235 bytes .../pip/_vendor/requests/cookies.py | 549 ++ .../pip/_vendor/requests/cookies.pyc | Bin 0 -> 25235 bytes .../pip/_vendor/requests/exceptions 2.py | 126 + .../pip/_vendor/requests/exceptions 2.pyc | Bin 0 -> 8345 bytes .../pip/_vendor/requests/exceptions.py | 126 + .../pip/_vendor/requests/exceptions.pyc | Bin 0 -> 8345 bytes .../pip/_vendor/requests/help 2.py | 119 + .../pip/_vendor/requests/help 2.pyc | Bin 0 -> 3572 bytes .../pip/_vendor/requests/help.py | 119 + .../pip/_vendor/requests/help.pyc | Bin 0 -> 3572 bytes .../pip/_vendor/requests/hooks 2.py | 34 + .../pip/_vendor/requests/hooks 2.pyc | Bin 0 -> 1398 bytes .../pip/_vendor/requests/hooks.py | 34 + .../pip/_vendor/requests/hooks.pyc | Bin 0 -> 1398 bytes .../pip/_vendor/requests/models 2.py | 953 ++ .../pip/_vendor/requests/models 2.pyc | Bin 0 -> 31856 bytes .../pip/_vendor/requests/models.py | 953 ++ .../pip/_vendor/requests/models.pyc | Bin 0 -> 31856 bytes .../pip/_vendor/requests/packages 2.py | 16 + .../pip/_vendor/requests/packages 2.pyc | Bin 0 -> 625 bytes .../pip/_vendor/requests/packages.py | 16 + .../pip/_vendor/requests/packages.pyc | Bin 0 -> 625 bytes .../pip/_vendor/requests/sessions 2.py | 770 ++ .../pip/_vendor/requests/sessions 2.pyc | Bin 0 -> 24341 bytes .../pip/_vendor/requests/sessions.py | 770 ++ .../pip/_vendor/requests/sessions.pyc | Bin 0 -> 24341 bytes .../pip/_vendor/requests/status_codes 2.py | 120 + .../pip/_vendor/requests/status_codes 2.pyc | Bin 0 -> 6277 bytes .../pip/_vendor/requests/status_codes.py | 120 + .../pip/_vendor/requests/status_codes.pyc | Bin 0 -> 6277 bytes .../pip/_vendor/requests/structures 2.py | 103 + .../pip/_vendor/requests/structures 2.pyc | Bin 0 -> 6281 bytes .../pip/_vendor/requests/structures.py | 103 + .../pip/_vendor/requests/structures.pyc | Bin 0 -> 6281 bytes .../pip/_vendor/requests/utils 2.py | 977 ++ .../pip/_vendor/requests/utils 2.pyc | Bin 0 -> 29347 bytes .../pip/_vendor/requests/utils.py | 977 ++ .../pip/_vendor/requests/utils.pyc | Bin 0 -> 29347 bytes .../site-packages/pip/_vendor/retrying 2.py | 267 + .../site-packages/pip/_vendor/retrying.py | 267 + .../site-packages/pip/_vendor/retrying.pyc | Bin 0 -> 11662 bytes .../site-packages/pip/_vendor/six.py | 980 ++ .../site-packages/pip/_vendor/six.pyc | Bin 0 -> 38021 bytes .../pip/_vendor/urllib3/__init__ 2.py | 86 + .../pip/_vendor/urllib3/__init__ 2.pyc | Bin 0 -> 2815 bytes .../pip/_vendor/urllib3/__init__.py | 86 + .../pip/_vendor/urllib3/__init__.pyc | Bin 0 -> 2815 bytes .../pip/_vendor/urllib3/_collections 2.py | 336 + .../pip/_vendor/urllib3/_collections 2.pyc | Bin 0 -> 15108 bytes .../pip/_vendor/urllib3/_collections.py | 336 + .../pip/_vendor/urllib3/_collections.pyc | Bin 0 -> 15108 bytes .../pip/_vendor/urllib3/connection 2.py | 448 + .../pip/_vendor/urllib3/connection 2.pyc | Bin 0 -> 13612 bytes .../pip/_vendor/urllib3/connection.py | 448 + .../pip/_vendor/urllib3/connection.pyc | Bin 0 -> 13612 bytes .../pip/_vendor/urllib3/connectionpool 2.py | 1051 +++ .../pip/_vendor/urllib3/connectionpool 2.pyc | Bin 0 -> 29020 bytes .../pip/_vendor/urllib3/connectionpool.py | 1051 +++ .../pip/_vendor/urllib3/connectionpool.pyc | Bin 0 -> 29020 bytes .../_vendor/urllib3/contrib/__init__ 2.pyc | Bin 0 -> 206 bytes .../pip/_vendor/urllib3/contrib/__init__.py | 0 .../pip/_vendor/urllib3/contrib/__init__.pyc | Bin 0 -> 206 bytes .../urllib3/contrib/_appengine_environ 2.py | 36 + .../urllib3/contrib/_appengine_environ 2.pyc | Bin 0 -> 2141 bytes .../urllib3/contrib/_appengine_environ.py | 36 + .../urllib3/contrib/_appengine_environ.pyc | Bin 0 -> 2141 bytes .../contrib/_securetransport/__init__ 2.pyc | Bin 0 -> 223 bytes .../contrib/_securetransport/__init__.py | 0 .../contrib/_securetransport/__init__.pyc | Bin 0 -> 223 bytes .../contrib/_securetransport/bindings 2.py | 493 + .../contrib/_securetransport/bindings 2.pyc | Bin 0 -> 12206 bytes .../contrib/_securetransport/bindings.py | 493 + .../contrib/_securetransport/bindings.pyc | Bin 0 -> 12206 bytes .../contrib/_securetransport/low_level 2.py | 328 + .../contrib/_securetransport/low_level 2.pyc | Bin 0 -> 10100 bytes .../contrib/_securetransport/low_level.py | 328 + .../contrib/_securetransport/low_level.pyc | Bin 0 -> 10100 bytes .../_vendor/urllib3/contrib/appengine 2.py | 314 + .../_vendor/urllib3/contrib/appengine 2.pyc | Bin 0 -> 9982 bytes .../pip/_vendor/urllib3/contrib/appengine.py | 314 + .../pip/_vendor/urllib3/contrib/appengine.pyc | Bin 0 -> 9982 bytes .../pip/_vendor/urllib3/contrib/ntlmpool 2.py | 121 + .../_vendor/urllib3/contrib/ntlmpool 2.pyc | Bin 0 -> 4177 bytes .../pip/_vendor/urllib3/contrib/ntlmpool.py | 121 + .../pip/_vendor/urllib3/contrib/ntlmpool.pyc | Bin 0 -> 4177 bytes .../_vendor/urllib3/contrib/pyopenssl 2.py | 498 + .../_vendor/urllib3/contrib/pyopenssl 2.pyc | Bin 0 -> 20408 bytes .../pip/_vendor/urllib3/contrib/pyopenssl.py | 498 + .../pip/_vendor/urllib3/contrib/pyopenssl.pyc | Bin 0 -> 20408 bytes .../urllib3/contrib/securetransport 2.py | 859 ++ .../urllib3/contrib/securetransport 2.pyc | Bin 0 -> 26469 bytes .../urllib3/contrib/securetransport.py | 859 ++ .../urllib3/contrib/securetransport.pyc | Bin 0 -> 26469 bytes .../pip/_vendor/urllib3/contrib/socks 2.py | 210 + .../pip/_vendor/urllib3/contrib/socks 2.pyc | Bin 0 -> 6922 bytes .../pip/_vendor/urllib3/contrib/socks.py | 210 + .../pip/_vendor/urllib3/contrib/socks.pyc | Bin 0 -> 6922 bytes .../pip/_vendor/urllib3/exceptions 2.py | 255 + .../pip/_vendor/urllib3/exceptions 2.pyc | Bin 0 -> 15502 bytes .../pip/_vendor/urllib3/exceptions.py | 255 + .../pip/_vendor/urllib3/exceptions.pyc | Bin 0 -> 15502 bytes .../pip/_vendor/urllib3/fields 2.py | 273 + .../pip/_vendor/urllib3/fields 2.pyc | Bin 0 -> 10076 bytes .../pip/_vendor/urllib3/fields.py | 273 + .../pip/_vendor/urllib3/fields.pyc | Bin 0 -> 10076 bytes .../pip/_vendor/urllib3/filepost 2.py | 98 + .../pip/_vendor/urllib3/filepost 2.pyc | Bin 0 -> 3780 bytes .../pip/_vendor/urllib3/filepost.py | 98 + .../pip/_vendor/urllib3/filepost.pyc | Bin 0 -> 3780 bytes .../_vendor/urllib3/packages/__init__ 2.py | 5 + .../_vendor/urllib3/packages/__init__ 2.pyc | Bin 0 -> 369 bytes .../pip/_vendor/urllib3/packages/__init__.py | 5 + .../pip/_vendor/urllib3/packages/__init__.pyc | Bin 0 -> 369 bytes .../urllib3/packages/backports/__init__ 2.pyc | Bin 0 -> 217 bytes .../urllib3/packages/backports/__init__.py | 0 .../urllib3/packages/backports/__init__.pyc | Bin 0 -> 217 bytes .../urllib3/packages/backports/makefile 2.py | 52 + .../urllib3/packages/backports/makefile 2.pyc | Bin 0 -> 1709 bytes .../urllib3/packages/backports/makefile.py | 52 + .../urllib3/packages/backports/makefile.pyc | Bin 0 -> 1709 bytes .../pip/_vendor/urllib3/packages/six 2.py | 1021 ++ .../pip/_vendor/urllib3/packages/six 2.pyc | Bin 0 -> 38744 bytes .../pip/_vendor/urllib3/packages/six.py | 1021 ++ .../pip/_vendor/urllib3/packages/six.pyc | Bin 0 -> 38744 bytes .../packages/ssl_match_hostname/__init__ 2.py | 19 + .../ssl_match_hostname/__init__ 2.pyc | Bin 0 -> 667 bytes .../packages/ssl_match_hostname/__init__.py | 19 + .../packages/ssl_match_hostname/__init__.pyc | Bin 0 -> 667 bytes .../ssl_match_hostname/_implementation 2.py | 160 + .../ssl_match_hostname/_implementation 2.pyc | Bin 0 -> 4602 bytes .../ssl_match_hostname/_implementation.py | 160 + .../ssl_match_hostname/_implementation.pyc | Bin 0 -> 4602 bytes .../pip/_vendor/urllib3/poolmanager 2.py | 470 + .../pip/_vendor/urllib3/poolmanager 2.pyc | Bin 0 -> 16264 bytes .../pip/_vendor/urllib3/poolmanager.py | 470 + .../pip/_vendor/urllib3/poolmanager.pyc | Bin 0 -> 16264 bytes .../pip/_vendor/urllib3/request 2.py | 171 + .../pip/_vendor/urllib3/request 2.pyc | Bin 0 -> 6455 bytes .../pip/_vendor/urllib3/request.py | 171 + .../pip/_vendor/urllib3/request.pyc | Bin 0 -> 6455 bytes .../pip/_vendor/urllib3/response 2.py | 809 ++ .../pip/_vendor/urllib3/response 2.pyc | Bin 0 -> 26748 bytes .../pip/_vendor/urllib3/response.py | 809 ++ .../pip/_vendor/urllib3/response.pyc | Bin 0 -> 26748 bytes .../pip/_vendor/urllib3/util/__init__ 2.py | 46 + .../pip/_vendor/urllib3/util/__init__ 2.pyc | Bin 0 -> 1364 bytes .../pip/_vendor/urllib3/util/__init__.py | 46 + .../pip/_vendor/urllib3/util/__init__.pyc | Bin 0 -> 1364 bytes .../pip/_vendor/urllib3/util/connection 2.py | 138 + .../pip/_vendor/urllib3/util/connection 2.pyc | Bin 0 -> 4194 bytes .../pip/_vendor/urllib3/util/connection.py | 138 + .../pip/_vendor/urllib3/util/connection.pyc | Bin 0 -> 4194 bytes .../pip/_vendor/urllib3/util/queue 2.py | 21 + .../pip/_vendor/urllib3/util/queue 2.pyc | Bin 0 -> 1665 bytes .../pip/_vendor/urllib3/util/queue.py | 21 + .../pip/_vendor/urllib3/util/queue.pyc | Bin 0 -> 1665 bytes .../pip/_vendor/urllib3/util/request 2.py | 135 + .../pip/_vendor/urllib3/util/request 2.pyc | Bin 0 -> 4074 bytes .../pip/_vendor/urllib3/util/request.py | 135 + .../pip/_vendor/urllib3/util/request.pyc | Bin 0 -> 4074 bytes .../pip/_vendor/urllib3/util/response 2.py | 86 + .../pip/_vendor/urllib3/util/response 2.pyc | Bin 0 -> 2581 bytes .../pip/_vendor/urllib3/util/response.py | 86 + .../pip/_vendor/urllib3/util/response.pyc | Bin 0 -> 2581 bytes .../pip/_vendor/urllib3/util/retry 2.py | 450 + .../pip/_vendor/urllib3/util/retry 2.pyc | Bin 0 -> 15753 bytes .../pip/_vendor/urllib3/util/retry.py | 450 + .../pip/_vendor/urllib3/util/retry.pyc | Bin 0 -> 15753 bytes .../pip/_vendor/urllib3/util/ssl_ 2.py | 407 + .../pip/_vendor/urllib3/util/ssl_ 2.pyc | Bin 0 -> 12407 bytes .../pip/_vendor/urllib3/util/ssl_.py | 407 + .../pip/_vendor/urllib3/util/ssl_.pyc | Bin 0 -> 12407 bytes .../pip/_vendor/urllib3/util/timeout 2.py | 258 + .../pip/_vendor/urllib3/util/timeout 2.pyc | Bin 0 -> 10290 bytes .../pip/_vendor/urllib3/util/timeout.py | 258 + .../pip/_vendor/urllib3/util/timeout.pyc | Bin 0 -> 10290 bytes .../pip/_vendor/urllib3/util/url 2.py | 436 + .../pip/_vendor/urllib3/util/url 2.pyc | Bin 0 -> 13565 bytes .../pip/_vendor/urllib3/util/url.py | 436 + .../pip/_vendor/urllib3/util/url.pyc | Bin 0 -> 13565 bytes .../pip/_vendor/urllib3/util/wait 2.py | 153 + .../pip/_vendor/urllib3/util/wait 2.pyc | Bin 0 -> 4842 bytes .../pip/_vendor/urllib3/util/wait.py | 153 + .../pip/_vendor/urllib3/util/wait.pyc | Bin 0 -> 4842 bytes .../pip/_vendor/webencodings/__init__ 2.py | 342 + .../pip/_vendor/webencodings/__init__ 2.pyc | Bin 0 -> 12364 bytes .../pip/_vendor/webencodings/__init__.py | 342 + .../pip/_vendor/webencodings/__init__.pyc | Bin 0 -> 12364 bytes .../pip/_vendor/webencodings/labels 2.py | 231 + .../pip/_vendor/webencodings/labels 2.pyc | Bin 0 -> 5361 bytes .../pip/_vendor/webencodings/labels.py | 231 + .../pip/_vendor/webencodings/labels.pyc | Bin 0 -> 5361 bytes .../pip/_vendor/webencodings/mklabels 2.py | 59 + .../pip/_vendor/webencodings/mklabels 2.pyc | Bin 0 -> 2486 bytes .../pip/_vendor/webencodings/mklabels.py | 59 + .../pip/_vendor/webencodings/mklabels.pyc | Bin 0 -> 2486 bytes .../pip/_vendor/webencodings/tests 2.py | 153 + .../pip/_vendor/webencodings/tests 2.pyc | Bin 0 -> 7345 bytes .../pip/_vendor/webencodings/tests.py | 153 + .../pip/_vendor/webencodings/tests.pyc | Bin 0 -> 7345 bytes .../_vendor/webencodings/x_user_defined 2.py | 325 + .../_vendor/webencodings/x_user_defined 2.pyc | Bin 0 -> 3842 bytes .../_vendor/webencodings/x_user_defined.py | 325 + .../_vendor/webencodings/x_user_defined.pyc | Bin 0 -> 3842 bytes .../site-packages/pkg_resources/__init__.py | 3296 +++++++ .../site-packages/pkg_resources/__init__.pyc | Bin 0 -> 136441 bytes .../pkg_resources/_vendor/__init__ 2.py | 0 .../pkg_resources/_vendor/__init__ 2.pyc | Bin 0 -> 207 bytes .../pkg_resources/_vendor/__init__.py | 0 .../pkg_resources/_vendor/__init__.pyc | Bin 0 -> 207 bytes .../pkg_resources/_vendor/appdirs 2.pyc | Bin 0 -> 24286 bytes .../pkg_resources/_vendor/appdirs.py | 608 ++ .../pkg_resources/_vendor/appdirs.pyc | Bin 0 -> 24286 bytes .../_vendor/packaging/__about__ 2.py | 21 + .../_vendor/packaging/__about__ 2.pyc | Bin 0 -> 846 bytes .../_vendor/packaging/__about__.py | 21 + .../_vendor/packaging/__about__.pyc | Bin 0 -> 846 bytes .../_vendor/packaging/__init__ 2.py | 14 + .../_vendor/packaging/__init__ 2.pyc | Bin 0 -> 668 bytes .../_vendor/packaging/__init__.py | 14 + .../_vendor/packaging/__init__.pyc | Bin 0 -> 668 bytes .../_vendor/packaging/_compat 2.py | 30 + .../_vendor/packaging/_compat 2.pyc | Bin 0 -> 1472 bytes .../_vendor/packaging/_compat.py | 30 + .../_vendor/packaging/_compat.pyc | Bin 0 -> 1472 bytes .../_vendor/packaging/_structures 2.py | 68 + .../_vendor/packaging/_structures 2.pyc | Bin 0 -> 5370 bytes .../_vendor/packaging/_structures.py | 68 + .../_vendor/packaging/_structures.pyc | Bin 0 -> 5370 bytes .../_vendor/packaging/markers 2.py | 301 + .../_vendor/packaging/markers 2.pyc | Bin 0 -> 13957 bytes .../_vendor/packaging/markers.py | 301 + .../_vendor/packaging/markers.pyc | Bin 0 -> 13957 bytes .../_vendor/packaging/requirements 2.py | 127 + .../_vendor/packaging/requirements 2.pyc | Bin 0 -> 5683 bytes .../_vendor/packaging/requirements.py | 127 + .../_vendor/packaging/requirements.pyc | Bin 0 -> 5683 bytes .../_vendor/packaging/specifiers 2.py | 774 ++ .../_vendor/packaging/specifiers 2.pyc | Bin 0 -> 29374 bytes .../_vendor/packaging/specifiers.py | 774 ++ .../_vendor/packaging/specifiers.pyc | Bin 0 -> 29374 bytes .../_vendor/packaging/utils 2.py | 14 + .../_vendor/packaging/utils 2.pyc | Bin 0 -> 708 bytes .../pkg_resources/_vendor/packaging/utils.py | 14 + .../pkg_resources/_vendor/packaging/utils.pyc | Bin 0 -> 708 bytes .../_vendor/packaging/version 2.py | 393 + .../_vendor/packaging/version 2.pyc | Bin 0 -> 17235 bytes .../_vendor/packaging/version.py | 393 + .../_vendor/packaging/version.pyc | Bin 0 -> 17235 bytes .../pkg_resources/_vendor/pyparsing 2.py | 5742 ++++++++++++ .../pkg_resources/_vendor/pyparsing 2.pyc | Bin 0 -> 260224 bytes .../pkg_resources/_vendor/pyparsing.py | 5742 ++++++++++++ .../pkg_resources/_vendor/pyparsing.pyc | Bin 0 -> 260224 bytes .../pkg_resources/_vendor/six 2.py | 868 ++ .../pkg_resources/_vendor/six 2.pyc | Bin 0 -> 36102 bytes .../pkg_resources/_vendor/six.py | 868 ++ .../pkg_resources/_vendor/six.pyc | Bin 0 -> 36102 bytes .../pkg_resources/extern/__init__ 2.py | 73 + .../pkg_resources/extern/__init__ 2.pyc | Bin 0 -> 3325 bytes .../pkg_resources/extern/__init__.py | 73 + .../pkg_resources/extern/__init__.pyc | Bin 0 -> 3325 bytes .../pkg_resources/py31compat 2.py | 23 + .../site-packages/pkg_resources/py31compat.py | 23 + .../pkg_resources/py31compat.pyc | Bin 0 -> 866 bytes .../setuptools-44.0.0.dist-info/INSTALLER | 1 + .../setuptools-44.0.0.dist-info/LICENSE | 19 + .../setuptools-44.0.0.dist-info/METADATA | 86 + .../setuptools-44.0.0.dist-info/RECORD | 194 + .../setuptools-44.0.0.dist-info/WHEEL | 6 + .../dependency_links.txt | 2 + .../entry_points.txt | 69 + .../setuptools-44.0.0.dist-info/top_level.txt | 3 + .../setuptools-44.0.0.dist-info/zip-safe | 1 + .../setuptools-44.0.0.dist-info/zip-safe 2 | 1 + .../site-packages/setuptools/__init__.py | 228 + .../site-packages/setuptools/__init__.pyc | Bin 0 -> 10541 bytes .../setuptools/_deprecation_warning.py | 7 + .../setuptools/_deprecation_warning.pyc | Bin 0 -> 690 bytes .../site-packages/setuptools/_imp.py | 73 + .../site-packages/setuptools/_imp.pyc | Bin 0 -> 2674 bytes .../setuptools/_vendor/__init__.py | 0 .../setuptools/_vendor/__init__.pyc | Bin 0 -> 204 bytes .../setuptools/_vendor/ordered_set.py | 488 + .../setuptools/_vendor/ordered_set.pyc | Bin 0 -> 20077 bytes .../_vendor/packaging/__about__ 2.py | 27 + .../_vendor/packaging/__about__ 2.pyc | Bin 0 -> 855 bytes .../setuptools/_vendor/packaging/__about__.py | 27 + .../_vendor/packaging/__about__.pyc | Bin 0 -> 855 bytes .../_vendor/packaging/__init__ 2.py | 26 + .../_vendor/packaging/__init__ 2.pyc | Bin 0 -> 677 bytes .../setuptools/_vendor/packaging/__init__.py | 26 + .../setuptools/_vendor/packaging/__init__.pyc | Bin 0 -> 677 bytes .../setuptools/_vendor/packaging/_compat 2.py | 31 + .../_vendor/packaging/_compat 2.pyc | Bin 0 -> 1460 bytes .../setuptools/_vendor/packaging/_compat.py | 31 + .../setuptools/_vendor/packaging/_compat.pyc | Bin 0 -> 1460 bytes .../_vendor/packaging/_structures 2.py | 68 + .../_vendor/packaging/_structures 2.pyc | Bin 0 -> 5307 bytes .../_vendor/packaging/_structures.py | 68 + .../_vendor/packaging/_structures.pyc | Bin 0 -> 5307 bytes .../setuptools/_vendor/packaging/markers 2.py | 296 + .../_vendor/packaging/markers 2.pyc | Bin 0 -> 13898 bytes .../setuptools/_vendor/packaging/markers.py | 296 + .../setuptools/_vendor/packaging/markers.pyc | Bin 0 -> 13898 bytes .../_vendor/packaging/requirements 2.py | 138 + .../_vendor/packaging/requirements 2.pyc | Bin 0 -> 5833 bytes .../_vendor/packaging/requirements.py | 138 + .../_vendor/packaging/requirements.pyc | Bin 0 -> 5833 bytes .../_vendor/packaging/specifiers 2.py | 749 ++ .../_vendor/packaging/specifiers 2.pyc | Bin 0 -> 29133 bytes .../_vendor/packaging/specifiers.py | 749 ++ .../_vendor/packaging/specifiers.pyc | Bin 0 -> 29133 bytes .../setuptools/_vendor/packaging/tags 2.py | 404 + .../setuptools/_vendor/packaging/tags 2.pyc | Bin 0 -> 16903 bytes .../setuptools/_vendor/packaging/tags.py | 404 + .../setuptools/_vendor/packaging/tags.pyc | Bin 0 -> 16903 bytes .../setuptools/_vendor/packaging/utils 2.py | 57 + .../setuptools/_vendor/packaging/utils 2.pyc | Bin 0 -> 2213 bytes .../setuptools/_vendor/packaging/utils.py | 57 + .../setuptools/_vendor/packaging/utils.pyc | Bin 0 -> 2213 bytes .../setuptools/_vendor/packaging/version 2.py | 420 + .../_vendor/packaging/version 2.pyc | Bin 0 -> 19866 bytes .../setuptools/_vendor/packaging/version.py | 420 + .../setuptools/_vendor/packaging/version.pyc | Bin 0 -> 19866 bytes .../setuptools/_vendor/pyparsing.py | 5742 ++++++++++++ .../setuptools/_vendor/pyparsing.pyc | Bin 0 -> 258913 bytes .../setuptools/_vendor/six 2.pyc | Bin 0 -> 35865 bytes .../site-packages/setuptools/_vendor/six.py | 868 ++ .../site-packages/setuptools/_vendor/six.pyc | Bin 0 -> 35865 bytes .../site-packages/setuptools/archive_util.py | 173 + .../site-packages/setuptools/archive_util.pyc | Bin 0 -> 6574 bytes .../site-packages/setuptools/build_meta.py | 257 + .../site-packages/setuptools/build_meta.pyc | Bin 0 -> 10955 bytes .../site-packages/setuptools/cli-32.exe | Bin 0 -> 65536 bytes .../site-packages/setuptools/cli-64.exe | Bin 0 -> 74752 bytes .../site-packages/setuptools/cli.exe | Bin 0 -> 65536 bytes .../setuptools/command/__init__ 2.py | 17 + .../setuptools/command/__init__ 2.pyc | Bin 0 -> 904 bytes .../setuptools/command/__init__.py | 17 + .../setuptools/command/__init__.pyc | Bin 0 -> 904 bytes .../setuptools/command/alias 2.pyc | Bin 0 -> 3476 bytes .../site-packages/setuptools/command/alias.py | 80 + .../setuptools/command/alias.pyc | Bin 0 -> 3476 bytes .../setuptools/command/bdist_egg.py | 502 + .../setuptools/command/bdist_egg.pyc | Bin 0 -> 19798 bytes .../setuptools/command/bdist_rpm 2.py | 43 + .../setuptools/command/bdist_rpm 2.pyc | Bin 0 -> 2130 bytes .../setuptools/command/bdist_rpm.py | 43 + .../setuptools/command/bdist_rpm.pyc | Bin 0 -> 2130 bytes .../setuptools/command/bdist_wininst 2.pyc | Bin 0 -> 1407 bytes .../setuptools/command/bdist_wininst.py | 21 + .../setuptools/command/bdist_wininst.pyc | Bin 0 -> 1407 bytes .../setuptools/command/build_clib 2.py | 98 + .../setuptools/command/build_clib 2.pyc | Bin 0 -> 3006 bytes .../setuptools/command/build_clib.py | 98 + .../setuptools/command/build_clib.pyc | Bin 0 -> 3006 bytes .../setuptools/command/build_ext 2.pyc | Bin 0 -> 13337 bytes .../setuptools/command/build_ext.py | 327 + .../setuptools/command/build_ext.pyc | Bin 0 -> 13337 bytes .../setuptools/command/build_py 2.py | 270 + .../setuptools/command/build_py 2.pyc | Bin 0 -> 11963 bytes .../setuptools/command/build_py.py | 270 + .../setuptools/command/build_py.pyc | Bin 0 -> 11963 bytes .../setuptools/command/develop 2.py | 221 + .../setuptools/command/develop 2.pyc | Bin 0 -> 8724 bytes .../setuptools/command/develop.py | 221 + .../setuptools/command/develop.pyc | Bin 0 -> 8724 bytes .../setuptools/command/dist_info 2.pyc | Bin 0 -> 2069 bytes .../setuptools/command/dist_info.py | 36 + .../setuptools/command/dist_info.pyc | Bin 0 -> 2069 bytes .../setuptools/command/easy_install 2.pyc | Bin 0 -> 88122 bytes .../setuptools/command/easy_install.py | 2347 +++++ .../setuptools/command/easy_install.pyc | Bin 0 -> 88122 bytes .../setuptools/command/egg_info 2.py | 717 ++ .../setuptools/command/egg_info 2.pyc | Bin 0 -> 29768 bytes .../setuptools/command/egg_info.py | 717 ++ .../setuptools/command/egg_info.pyc | Bin 0 -> 29768 bytes .../setuptools/command/install 2.py | 125 + .../setuptools/command/install.py | 125 + .../setuptools/command/install.pyc | Bin 0 -> 5530 bytes .../setuptools/command/install_egg_info 2.py | 62 + .../setuptools/command/install_egg_info 2.pyc | Bin 0 -> 3617 bytes .../setuptools/command/install_egg_info.py | 62 + .../setuptools/command/install_egg_info.pyc | Bin 0 -> 3617 bytes .../setuptools/command/install_lib 2.pyc | Bin 0 -> 5539 bytes .../setuptools/command/install_lib.py | 121 + .../setuptools/command/install_lib.pyc | Bin 0 -> 5539 bytes .../setuptools/command/install_scripts.py | 65 + .../setuptools/command/install_scripts.pyc | Bin 0 -> 3161 bytes .../setuptools/command/launcher manifest.xml | 15 + .../setuptools/command/py36compat 2.pyc | Bin 0 -> 6198 bytes .../setuptools/command/py36compat.py | 136 + .../setuptools/command/py36compat.pyc | Bin 0 -> 6198 bytes .../setuptools/command/register 2.pyc | Bin 0 -> 1160 bytes .../setuptools/command/register.py | 18 + .../setuptools/command/register.pyc | Bin 0 -> 1160 bytes .../setuptools/command/rotate 2.py | 66 + .../setuptools/command/rotate 2.pyc | Bin 0 -> 3306 bytes .../setuptools/command/rotate.py | 66 + .../setuptools/command/rotate.pyc | Bin 0 -> 3306 bytes .../setuptools/command/saveopts 2.py | 22 + .../setuptools/command/saveopts 2.pyc | Bin 0 -> 1291 bytes .../setuptools/command/saveopts.py | 22 + .../setuptools/command/saveopts.pyc | Bin 0 -> 1291 bytes .../setuptools/command/sdist 2.py | 252 + .../setuptools/command/sdist 2.pyc | Bin 0 -> 11115 bytes .../site-packages/setuptools/command/sdist.py | 252 + .../setuptools/command/sdist.pyc | Bin 0 -> 11115 bytes .../setuptools/command/setopt 2.py | 149 + .../setuptools/command/setopt 2.pyc | Bin 0 -> 6590 bytes .../setuptools/command/setopt.py | 149 + .../setuptools/command/setopt.pyc | Bin 0 -> 6590 bytes .../setuptools/command/test 2.py | 279 + .../setuptools/command/test 2.pyc | Bin 0 -> 12002 bytes .../site-packages/setuptools/command/test.py | 279 + .../site-packages/setuptools/command/test.pyc | Bin 0 -> 12002 bytes .../setuptools/command/upload 2.pyc | Bin 0 -> 1135 bytes .../setuptools/command/upload.py | 17 + .../setuptools/command/upload.pyc | Bin 0 -> 1135 bytes .../setuptools/command/upload_docs 2.py | 206 + .../setuptools/command/upload_docs 2.pyc | Bin 0 -> 8436 bytes .../setuptools/command/upload_docs.py | 206 + .../setuptools/command/upload_docs.pyc | Bin 0 -> 8436 bytes .../site-packages/setuptools/config.py | 659 ++ .../site-packages/setuptools/config.pyc | Bin 0 -> 22976 bytes .../site-packages/setuptools/dep_util.py | 23 + .../site-packages/setuptools/dep_util.pyc | Bin 0 -> 1073 bytes .../site-packages/setuptools/depends.py | 176 + .../site-packages/setuptools/depends.pyc | Bin 0 -> 7057 bytes .../site-packages/setuptools/dist.py | 1274 +++ .../site-packages/setuptools/dist.pyc | Bin 0 -> 51828 bytes .../site-packages/setuptools/errors.py | 16 + .../site-packages/setuptools/errors.pyc | Bin 0 -> 992 bytes .../site-packages/setuptools/extension.py | 57 + .../site-packages/setuptools/extension.pyc | Bin 0 -> 2742 bytes .../setuptools/extern/__init__ 2.py | 73 + .../setuptools/extern/__init__ 2.pyc | Bin 0 -> 3323 bytes .../setuptools/extern/__init__.py | 73 + .../setuptools/extern/__init__.pyc | Bin 0 -> 3323 bytes .../site-packages/setuptools/glob.py | 174 + .../site-packages/setuptools/glob.pyc | Bin 0 -> 5311 bytes .../site-packages/setuptools/gui-32.exe | Bin 0 -> 65536 bytes .../site-packages/setuptools/gui-64.exe | Bin 0 -> 75264 bytes .../site-packages/setuptools/gui.exe | Bin 0 -> 65536 bytes .../site-packages/setuptools/installer.py | 150 + .../site-packages/setuptools/installer.pyc | Bin 0 -> 5412 bytes .../site-packages/setuptools/launch.py | 35 + .../site-packages/setuptools/launch.pyc | Bin 0 -> 1108 bytes .../site-packages/setuptools/lib2to3_ex.py | 62 + .../site-packages/setuptools/lib2to3_ex.pyc | Bin 0 -> 3490 bytes .../site-packages/setuptools/monkey.py | 179 + .../site-packages/setuptools/monkey.pyc | Bin 0 -> 6451 bytes .../site-packages/setuptools/msvc.py | 1679 ++++ .../site-packages/setuptools/msvc.pyc | Bin 0 -> 50256 bytes .../site-packages/setuptools/namespaces.py | 107 + .../site-packages/setuptools/namespaces.pyc | Bin 0 -> 5681 bytes .../site-packages/setuptools/package_index.py | 1136 +++ .../setuptools/package_index.pyc | Bin 0 -> 44755 bytes .../site-packages/setuptools/py27compat.py | 60 + .../site-packages/setuptools/py27compat.pyc | Bin 0 -> 2737 bytes .../site-packages/setuptools/py31compat.py | 32 + .../site-packages/setuptools/py31compat.pyc | Bin 0 -> 1712 bytes .../site-packages/setuptools/py33compat.py | 59 + .../site-packages/setuptools/py33compat.pyc | Bin 0 -> 1987 bytes .../site-packages/setuptools/py34compat.py | 13 + .../site-packages/setuptools/py34compat.pyc | Bin 0 -> 654 bytes .../site-packages/setuptools/sandbox.py | 491 + .../site-packages/setuptools/sandbox.pyc | Bin 0 -> 21816 bytes .../setuptools/script (dev).tmpl | 6 + .../site-packages/setuptools/script.tmpl | 3 + .../site-packages/setuptools/site-patch.py | 74 + .../site-packages/setuptools/site-patch.pyc | Bin 0 -> 1847 bytes .../site-packages/setuptools/ssl_support 2.py | 260 + .../site-packages/setuptools/ssl_support.py | 260 + .../site-packages/setuptools/ssl_support.pyc | Bin 0 -> 9597 bytes .../site-packages/setuptools/unicode_utils.py | 44 + .../setuptools/unicode_utils.pyc | Bin 0 -> 1688 bytes .../site-packages/setuptools/version.py | 6 + .../site-packages/setuptools/version.pyc | Bin 0 -> 376 bytes .../site-packages/setuptools/wheel.py | 220 + .../site-packages/setuptools/wheel.pyc | Bin 0 -> 10347 bytes .../setuptools/windows_support.py | 29 + .../setuptools/windows_support.pyc | Bin 0 -> 1490 bytes .../wheel-0.34.2.dist-info/INSTALLER | 1 + .../wheel-0.34.2.dist-info/INSTALLER 2 | 1 + .../wheel-0.34.2.dist-info/LICENSE 2.txt | 22 + .../wheel-0.34.2.dist-info/LICENSE.txt | 22 + .../wheel-0.34.2.dist-info/METADATA | 66 + .../wheel-0.34.2.dist-info/METADATA 2 | 66 + .../wheel-0.34.2.dist-info/RECORD | 38 + .../wheel-0.34.2.dist-info/RECORD 2 | 38 + .../wheel-0.34.2.dist-info/WHEEL | 6 + .../wheel-0.34.2.dist-info/WHEEL 2 | 6 + .../wheel-0.34.2.dist-info/entry_points 2.txt | 6 + .../wheel-0.34.2.dist-info/entry_points.txt | 6 + .../wheel-0.34.2.dist-info/top_level 2.txt | 1 + .../wheel-0.34.2.dist-info/top_level.txt | 1 + .../site-packages/wheel/__init__ 2.py | 1 + .../site-packages/wheel/__init__ 2.pyc | Bin 0 -> 219 bytes .../python2.7/site-packages/wheel/__init__.py | 1 + .../site-packages/wheel/__init__.pyc | Bin 0 -> 219 bytes .../site-packages/wheel/__main__ 2.py | 19 + .../site-packages/wheel/__main__ 2.pyc | Bin 0 -> 811 bytes .../python2.7/site-packages/wheel/__main__.py | 19 + .../site-packages/wheel/__main__.pyc | Bin 0 -> 811 bytes .../site-packages/wheel/_version 2.py | 4 + .../site-packages/wheel/_version 2.pyc | Bin 0 -> 231 bytes .../python2.7/site-packages/wheel/_version.py | 4 + .../site-packages/wheel/_version.pyc | Bin 0 -> 231 bytes .../site-packages/wheel/bdist_wheel 2.py | 403 + .../site-packages/wheel/bdist_wheel 2.pyc | Bin 0 -> 15271 bytes .../site-packages/wheel/bdist_wheel.py | 403 + .../site-packages/wheel/bdist_wheel.pyc | Bin 0 -> 15271 bytes .../site-packages/wheel/cli/__init__ 2.py | 88 + .../site-packages/wheel/cli/__init__ 2.pyc | Bin 0 -> 4405 bytes .../site-packages/wheel/cli/__init__.py | 88 + .../site-packages/wheel/cli/__init__.pyc | Bin 0 -> 4405 bytes .../site-packages/wheel/cli/convert 2.py | 269 + .../site-packages/wheel/cli/convert 2.pyc | Bin 0 -> 7963 bytes .../site-packages/wheel/cli/convert.py | 269 + .../site-packages/wheel/cli/convert.pyc | Bin 0 -> 7963 bytes .../site-packages/wheel/cli/install 2.pyc | Bin 0 -> 189 bytes .../site-packages/wheel/cli/install.py | 0 .../site-packages/wheel/cli/install.pyc | Bin 0 -> 189 bytes .../site-packages/wheel/cli/pack 2.py | 79 + .../site-packages/wheel/cli/pack 2.pyc | Bin 0 -> 3646 bytes .../python2.7/site-packages/wheel/cli/pack.py | 79 + .../site-packages/wheel/cli/pack.pyc | Bin 0 -> 3646 bytes .../site-packages/wheel/cli/unpack 2.py | 25 + .../site-packages/wheel/cli/unpack 2.pyc | Bin 0 -> 1182 bytes .../site-packages/wheel/cli/unpack.py | 25 + .../site-packages/wheel/cli/unpack.pyc | Bin 0 -> 1182 bytes .../site-packages/wheel/macosx_libfile 2.py | 341 + .../site-packages/wheel/macosx_libfile 2.pyc | Bin 0 -> 8801 bytes .../site-packages/wheel/macosx_libfile.py | 341 + .../site-packages/wheel/macosx_libfile.pyc | Bin 0 -> 8801 bytes .../site-packages/wheel/metadata 2.py | 138 + .../site-packages/wheel/metadata 2.pyc | Bin 0 -> 5068 bytes .../python2.7/site-packages/wheel/metadata.py | 138 + .../site-packages/wheel/metadata.pyc | Bin 0 -> 5068 bytes .../site-packages/wheel/pep425tags 2.py | 261 + .../site-packages/wheel/pep425tags 2.pyc | Bin 0 -> 9808 bytes .../site-packages/wheel/pep425tags.py | 261 + .../site-packages/wheel/pep425tags.pyc | Bin 0 -> 9808 bytes .../site-packages/wheel/pkginfo 2.py | 43 + .../site-packages/wheel/pkginfo 2.pyc | Bin 0 -> 2403 bytes .../python2.7/site-packages/wheel/pkginfo.py | 43 + .../python2.7/site-packages/wheel/pkginfo.pyc | Bin 0 -> 2403 bytes .../python2.7/site-packages/wheel/util 2.py | 46 + .../python2.7/site-packages/wheel/util 2.pyc | Bin 0 -> 2061 bytes .../lib/python2.7/site-packages/wheel/util.py | 46 + .../python2.7/site-packages/wheel/util.pyc | Bin 0 -> 2061 bytes .../site-packages/wheel/wheelfile 2.py | 169 + .../site-packages/wheel/wheelfile 2.pyc | Bin 0 -> 7595 bytes .../site-packages/wheel/wheelfile.py | 169 + .../site-packages/wheel/wheelfile.pyc | Bin 0 -> 7595 bytes .../Hackathon/myenv/lib/python2.7/site.py | 829 ++ .../Hackathon/myenv/lib/python2.7/site.pyc | Bin 0 -> 26604 bytes .../Hackathon/myenv/lib/python2.7/sre.py | 1 + .../myenv/lib/python2.7/sre_compile.py | 1 + .../myenv/lib/python2.7/sre_compile.pyc | Bin 0 -> 13055 bytes .../myenv/lib/python2.7/sre_constants.py | 1 + .../myenv/lib/python2.7/sre_constants.pyc | Bin 0 -> 6360 bytes .../myenv/lib/python2.7/sre_parse.py | 1 + .../myenv/lib/python2.7/sre_parse.pyc | Bin 0 -> 22344 bytes .../Hackathon/myenv/lib/python2.7/stat.py | 1 + .../Hackathon/myenv/lib/python2.7/stat.pyc | Bin 0 -> 3081 bytes .../Hackathon/myenv/lib/python2.7/types.py | 1 + .../Hackathon/myenv/lib/python2.7/types.pyc | Bin 0 -> 2956 bytes .../Hackathon/myenv/lib/python2.7/warnings.py | 1 + .../myenv/lib/python2.7/warnings.pyc | Bin 0 -> 14269 bytes 1803 files changed, 263001 insertions(+) create mode 100644 Application Code/.DS_Store create mode 100644 Application Code/Hackathon/.DS_Store create mode 100644 Application Code/Hackathon/.vscode/settings.json create mode 100644 Application Code/Hackathon/hackathon/.DS_Store create mode 100644 Application Code/Hackathon/hackathon/__pycache__/app.cpython-37.pyc create mode 100644 Application Code/Hackathon/hackathon/app.py create mode 100644 Application Code/Hackathon/hackathon/data.sqlite create mode 100644 Application Code/Hackathon/hackathon/migrations/README create mode 100644 Application Code/Hackathon/hackathon/migrations/__pycache__/env.cpython-37.pyc create mode 100644 Application Code/Hackathon/hackathon/migrations/alembic.ini create mode 100644 Application Code/Hackathon/hackathon/migrations/env.py create mode 100644 Application Code/Hackathon/hackathon/migrations/script.py.mako create mode 100644 Application Code/Hackathon/hackathon/migrations/versions/15c0fa797121_.py create mode 100644 Application Code/Hackathon/hackathon/migrations/versions/57535f8d20f9_.py create mode 100644 Application Code/Hackathon/hackathon/migrations/versions/__pycache__/15c0fa797121_.cpython-37.pyc create mode 100644 Application Code/Hackathon/hackathon/migrations/versions/__pycache__/57535f8d20f9_.cpython-37.pyc create mode 100644 Application Code/Hackathon/hackathon/migrations/versions/__pycache__/ca277f51404c_.cpython-37.pyc create mode 100644 Application Code/Hackathon/hackathon/migrations/versions/ca277f51404c_.py create mode 100644 Application Code/Hackathon/hackathon/static/main.css create mode 100644 Application Code/Hackathon/hackathon/static/signin.png create mode 100644 Application Code/Hackathon/hackathon/templates/.DS_Store create mode 100644 Application Code/Hackathon/hackathon/templates/add.html create mode 100644 Application Code/Hackathon/hackathon/templates/admin.html create mode 100644 Application Code/Hackathon/hackathon/templates/login.html create mode 100644 Application Code/Hackathon/hackathon/templates/register.html create mode 120000 Application Code/Hackathon/myenv/.Python create mode 100644 Application Code/Hackathon/myenv/bin/activate create mode 100644 Application Code/Hackathon/myenv/bin/activate.csh create mode 100644 Application Code/Hackathon/myenv/bin/activate.fish create mode 100644 Application Code/Hackathon/myenv/bin/activate.ps1 create mode 100644 Application Code/Hackathon/myenv/bin/activate_this.py create mode 100755 Application Code/Hackathon/myenv/bin/easy_install create mode 100755 Application Code/Hackathon/myenv/bin/easy_install-2.7 create mode 100755 Application Code/Hackathon/myenv/bin/pip create mode 100755 Application Code/Hackathon/myenv/bin/pip2 create mode 100755 Application Code/Hackathon/myenv/bin/pip2.7 create mode 100755 Application Code/Hackathon/myenv/bin/python create mode 100755 Application Code/Hackathon/myenv/bin/python-config create mode 120000 Application Code/Hackathon/myenv/bin/python2 create mode 120000 Application Code/Hackathon/myenv/bin/python2.7 create mode 100755 Application Code/Hackathon/myenv/bin/wheel create mode 120000 Application Code/Hackathon/myenv/include/python2.7 create mode 120000 Application Code/Hackathon/myenv/lib/python2.7/LICENSE.txt create mode 120000 Application Code/Hackathon/myenv/lib/python2.7/UserDict.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/UserDict.pyc create mode 120000 Application Code/Hackathon/myenv/lib/python2.7/_abcoll.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/_abcoll.pyc create mode 120000 Application Code/Hackathon/myenv/lib/python2.7/_weakrefset.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/_weakrefset.pyc create mode 120000 Application Code/Hackathon/myenv/lib/python2.7/abc.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/abc.pyc create mode 120000 Application Code/Hackathon/myenv/lib/python2.7/codecs.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/codecs.pyc create mode 120000 Application Code/Hackathon/myenv/lib/python2.7/config create mode 120000 Application Code/Hackathon/myenv/lib/python2.7/copy_reg.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/copy_reg.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/distutils/__init__.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/distutils/__init__.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/distutils/distutils.cfg create mode 120000 Application Code/Hackathon/myenv/lib/python2.7/encodings create mode 120000 Application Code/Hackathon/myenv/lib/python2.7/fnmatch.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/fnmatch.pyc create mode 120000 Application Code/Hackathon/myenv/lib/python2.7/genericpath.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/genericpath.pyc create mode 120000 Application Code/Hackathon/myenv/lib/python2.7/lib-dynload create mode 120000 Application Code/Hackathon/myenv/lib/python2.7/linecache.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/linecache.pyc create mode 120000 Application Code/Hackathon/myenv/lib/python2.7/locale.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/locale.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/no-global-site-packages.txt create mode 120000 Application Code/Hackathon/myenv/lib/python2.7/ntpath.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/ntpath.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/orig-prefix.txt create mode 120000 Application Code/Hackathon/myenv/lib/python2.7/os.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/os.pyc create mode 120000 Application Code/Hackathon/myenv/lib/python2.7/posixpath.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/posixpath.pyc create mode 120000 Application Code/Hackathon/myenv/lib/python2.7/re.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/re.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/easy_install.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/easy_install.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip-20.0.2.dist-info/INSTALLER create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip-20.0.2.dist-info/INSTALLER 2 create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip-20.0.2.dist-info/LICENSE 2.txt create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip-20.0.2.dist-info/LICENSE.txt create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip-20.0.2.dist-info/METADATA create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip-20.0.2.dist-info/METADATA 2 create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip-20.0.2.dist-info/RECORD create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip-20.0.2.dist-info/RECORD 2 create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip-20.0.2.dist-info/WHEEL create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip-20.0.2.dist-info/WHEEL 2 create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip-20.0.2.dist-info/entry_points 2.txt create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip-20.0.2.dist-info/entry_points.txt create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip-20.0.2.dist-info/top_level 2.txt create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip-20.0.2.dist-info/top_level.txt create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/__init__.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/__init__.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/__main__.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/__main__.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/__init__ 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/__init__ 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/__init__.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/__init__.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/build_env 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/build_env 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/build_env.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/build_env.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cache 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cache 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cache.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cache.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cli/__init__ 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cli/__init__ 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cli/__init__.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cli/__init__.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cli/autocompletion 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cli/autocompletion 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cli/autocompletion.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cli/autocompletion.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cli/base_command 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cli/base_command 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cli/base_command.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cli/base_command.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cli/cmdoptions 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cli/cmdoptions 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cli/cmdoptions.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cli/cmdoptions.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cli/command_context 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cli/command_context 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cli/command_context.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cli/command_context.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cli/main 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cli/main 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cli/main.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cli/main.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cli/main_parser 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cli/main_parser 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cli/main_parser.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cli/main_parser.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cli/parser 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cli/parser 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cli/parser.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cli/parser.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cli/req_command 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cli/req_command 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cli/req_command.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cli/req_command.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cli/status_codes 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cli/status_codes 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cli/status_codes.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cli/status_codes.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/__init__ 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/__init__ 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/__init__.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/__init__.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/check 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/check 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/check.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/check.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/completion 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/completion 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/completion.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/completion.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/configuration 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/configuration 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/configuration.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/configuration.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/debug 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/debug 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/debug.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/debug.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/download 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/download 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/download.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/download.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/freeze 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/freeze 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/freeze.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/freeze.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/hash 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/hash 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/hash.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/hash.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/help 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/help 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/help.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/help.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/install 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/install 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/install.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/install.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/list 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/list 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/list.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/list.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/search 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/search 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/search.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/search.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/show 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/show 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/show.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/show.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/uninstall 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/uninstall 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/uninstall.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/uninstall.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/wheel 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/wheel 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/wheel.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/wheel.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/configuration 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/configuration 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/configuration.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/configuration.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/distributions/__init__ 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/distributions/__init__ 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/distributions/__init__.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/distributions/__init__.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/distributions/base 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/distributions/base 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/distributions/base.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/distributions/base.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/distributions/installed 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/distributions/installed 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/distributions/installed.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/distributions/installed.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/distributions/sdist 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/distributions/sdist 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/distributions/sdist.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/distributions/sdist.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/distributions/wheel 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/distributions/wheel 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/distributions/wheel.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/distributions/wheel.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/exceptions 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/exceptions 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/exceptions.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/exceptions.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/index/__init__ 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/index/__init__ 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/index/__init__.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/index/__init__.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/index/collector 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/index/collector 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/index/collector.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/index/collector.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/index/package_finder 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/index/package_finder 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/index/package_finder.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/index/package_finder.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/legacy_resolve 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/legacy_resolve 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/legacy_resolve.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/legacy_resolve.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/locations 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/locations 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/locations.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/locations.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/main 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/main 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/main.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/main.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/__init__ 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/__init__ 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/__init__.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/__init__.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/candidate 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/candidate 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/candidate.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/candidate.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/format_control 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/format_control 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/format_control.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/format_control.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/index 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/index 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/index.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/index.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/link 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/link 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/link.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/link.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/scheme 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/scheme 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/scheme.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/scheme.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/search_scope 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/search_scope 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/search_scope.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/search_scope.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/selection_prefs 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/selection_prefs 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/selection_prefs.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/selection_prefs.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/target_python 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/target_python 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/target_python.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/target_python.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/wheel 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/wheel 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/wheel.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/wheel.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/network/__init__ 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/network/__init__ 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/network/__init__.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/network/__init__.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/network/auth 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/network/auth 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/network/auth.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/network/auth.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/network/cache 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/network/cache 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/network/cache.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/network/cache.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/network/download 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/network/download 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/network/download.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/network/download.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/network/session 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/network/session 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/network/session.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/network/session.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/network/utils 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/network/utils 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/network/utils.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/network/utils.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/network/xmlrpc 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/network/xmlrpc 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/network/xmlrpc.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/network/xmlrpc.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/__init__ 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/__init__ 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/__init__.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/__init__.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/build/__init__ 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/build/__init__ 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/build/__init__.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/build/__init__.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/build/metadata 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/build/metadata 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/build/metadata.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/build/metadata.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/build/metadata_legacy 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/build/metadata_legacy 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/build/metadata_legacy.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/build/metadata_legacy.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/build/wheel 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/build/wheel 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/build/wheel.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/build/wheel.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/build/wheel_legacy 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/build/wheel_legacy 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/build/wheel_legacy.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/build/wheel_legacy.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/check 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/check 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/check.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/check.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/freeze 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/freeze 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/freeze.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/freeze.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/install/__init__ 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/install/__init__ 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/install/__init__.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/install/__init__.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/install/editable_legacy 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/install/editable_legacy 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/install/editable_legacy.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/install/editable_legacy.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/install/legacy 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/install/legacy 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/install/legacy.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/install/legacy.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/install/wheel 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/install/wheel 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/install/wheel.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/install/wheel.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/prepare 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/prepare 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/prepare.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/prepare.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/pep425tags 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/pep425tags 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/pep425tags.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/pep425tags.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/pyproject 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/pyproject 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/pyproject.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/pyproject.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/req/__init__ 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/req/__init__ 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/req/__init__.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/req/__init__.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/req/constructors 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/req/constructors 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/req/constructors.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/req/constructors.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/req/req_file 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/req/req_file 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/req/req_file.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/req/req_file.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/req/req_install 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/req/req_install.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/req/req_install.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/req/req_set 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/req/req_set 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/req/req_set.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/req/req_set.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/req/req_tracker 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/req/req_tracker 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/req/req_tracker.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/req/req_tracker.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/req/req_uninstall 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/req/req_uninstall.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/req/req_uninstall.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/self_outdated_check 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/self_outdated_check 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/self_outdated_check.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/self_outdated_check.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/__init__ 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/__init__ 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/__init__.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/__init__.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/appdirs 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/appdirs 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/appdirs.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/appdirs.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/compat 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/compat 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/compat.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/compat.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/deprecation 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/deprecation 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/deprecation.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/deprecation.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/distutils_args 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/distutils_args 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/distutils_args.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/distutils_args.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/encoding 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/encoding 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/encoding.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/encoding.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/entrypoints 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/entrypoints 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/entrypoints.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/entrypoints.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/filesystem 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/filesystem 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/filesystem.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/filesystem.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/filetypes 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/filetypes 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/filetypes.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/filetypes.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/glibc 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/glibc 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/glibc.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/glibc.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/hashes 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/hashes 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/hashes.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/hashes.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/inject_securetransport 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/inject_securetransport 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/inject_securetransport.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/inject_securetransport.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/logging 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/logging 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/logging.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/logging.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/marker_files 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/marker_files 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/marker_files.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/marker_files.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/misc 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/misc 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/misc.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/misc.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/models 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/models 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/models.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/models.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/packaging 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/packaging 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/packaging.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/packaging.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/pkg_resources 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/pkg_resources 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/pkg_resources.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/pkg_resources.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/setuptools_build 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/setuptools_build 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/setuptools_build.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/setuptools_build.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/subprocess 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/subprocess 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/subprocess.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/subprocess.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/temp_dir 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/temp_dir 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/temp_dir.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/temp_dir.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/typing 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/typing 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/typing.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/typing.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/ui 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/ui 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/ui.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/ui.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/unpacking 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/unpacking 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/unpacking.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/unpacking.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/urls 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/urls 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/urls.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/urls.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/virtualenv 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/virtualenv 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/virtualenv.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/virtualenv.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/wheel 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/wheel 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/wheel.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/wheel.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/vcs/__init__ 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/vcs/__init__ 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/vcs/__init__.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/vcs/__init__.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/vcs/bazaar 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/vcs/bazaar 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/vcs/bazaar.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/vcs/bazaar.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/vcs/git 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/vcs/git 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/vcs/git.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/vcs/git.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/vcs/mercurial 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/vcs/mercurial 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/vcs/mercurial.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/vcs/mercurial.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/vcs/subversion 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/vcs/subversion 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/vcs/subversion.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/vcs/subversion.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/vcs/versioncontrol 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/vcs/versioncontrol.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/vcs/versioncontrol.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/wheel_builder 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/wheel_builder 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/wheel_builder.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/wheel_builder.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/__init__.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/__init__.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/appdirs.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/appdirs.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/__init__ 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/__init__ 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/__init__.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/__init__.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/_cmd 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/_cmd 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/_cmd.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/_cmd.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/adapter 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/adapter 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/adapter.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/adapter.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/cache 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/cache 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/cache.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/cache.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/caches/__init__ 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/caches/__init__ 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/caches/__init__.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/caches/__init__.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/caches/file_cache 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/caches/file_cache 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/caches/file_cache.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/caches/redis_cache 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/caches/redis_cache 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/compat 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/compat 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/compat.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/compat.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/controller 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/controller 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/controller.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/controller.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/filewrapper 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/filewrapper 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/filewrapper.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/filewrapper.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/heuristics 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/heuristics 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/heuristics.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/heuristics.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/serialize 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/serialize 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/serialize.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/serialize.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/wrapper 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/wrapper 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/wrapper.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/wrapper.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/certifi/__init__ 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/certifi/__init__ 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/certifi/__init__.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/certifi/__init__.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/certifi/__main__ 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/certifi/__main__ 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/certifi/__main__.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/certifi/__main__.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/certifi/cacert 2.pem create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/certifi/cacert.pem create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/certifi/core 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/certifi/core 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/certifi/core.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/certifi/core.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/__init__ 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/__init__ 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/__init__.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/__init__.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/big5freq 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/big5freq.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/big5freq.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/big5prober 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/big5prober 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/big5prober.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/big5prober.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/chardistribution 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/chardistribution 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/chardistribution.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/chardistribution.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/charsetgroupprober 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/charsetgroupprober 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/charsetgroupprober.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/charsetgroupprober.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/charsetprober 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/charsetprober 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/charsetprober.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/charsetprober.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/cli/__init__ 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/cli/__init__ 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/cli/__init__.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/cli/__init__.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/cli/chardetect 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/cli/chardetect 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/cli/chardetect.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/cli/chardetect.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/codingstatemachine 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/codingstatemachine 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/codingstatemachine.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/codingstatemachine.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/compat 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/compat 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/compat.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/compat.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/cp949prober 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/cp949prober 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/cp949prober.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/cp949prober.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/enums 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/enums 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/enums.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/enums.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/escprober 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/escprober 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/escprober.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/escprober.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/escsm 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/escsm 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/escsm.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/escsm.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/eucjpprober 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/eucjpprober 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/eucjpprober.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/eucjpprober.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/euckrfreq 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/euckrfreq 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/euckrfreq.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/euckrfreq.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/euckrprober 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/euckrprober 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/euckrprober.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/euckrprober.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/euctwfreq 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/euctwfreq 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/euctwfreq.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/euctwfreq.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/euctwprober 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/euctwprober 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/euctwprober.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/euctwprober.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/gb2312freq 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/gb2312freq.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/gb2312freq.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/gb2312prober 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/gb2312prober 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/gb2312prober.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/gb2312prober.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/hebrewprober 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/hebrewprober 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/hebrewprober.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/hebrewprober.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/jisfreq 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/jisfreq 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/jisfreq.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/jisfreq.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/jpcntx 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/jpcntx.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/jpcntx.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/langbulgarianmodel 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/langbulgarianmodel 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/langbulgarianmodel.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/langbulgarianmodel.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/langcyrillicmodel 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/langcyrillicmodel 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/langcyrillicmodel.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/langcyrillicmodel.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/langgreekmodel 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/langgreekmodel 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/langgreekmodel.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/langgreekmodel.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/langhebrewmodel 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/langhebrewmodel 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/langhebrewmodel.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/langhebrewmodel.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/langhungarianmodel 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/langhungarianmodel 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/langhungarianmodel.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/langhungarianmodel.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/langthaimodel 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/langthaimodel 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/langthaimodel.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/langthaimodel.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/langturkishmodel 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/langturkishmodel 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/langturkishmodel.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/langturkishmodel.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/latin1prober 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/latin1prober 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/latin1prober.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/latin1prober.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/mbcharsetprober 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/mbcharsetprober 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/mbcharsetprober.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/mbcharsetprober.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/mbcsgroupprober 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/mbcsgroupprober 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/mbcsgroupprober.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/mbcsgroupprober.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/mbcssm 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/mbcssm 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/mbcssm.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/mbcssm.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/sbcharsetprober 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/sbcharsetprober 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/sbcharsetprober.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/sbcharsetprober.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/sbcsgroupprober 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/sbcsgroupprober 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/sbcsgroupprober.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/sbcsgroupprober.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/sjisprober 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/sjisprober 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/sjisprober.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/sjisprober.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/universaldetector 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/universaldetector 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/universaldetector.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/universaldetector.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/utf8prober 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/utf8prober 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/utf8prober.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/utf8prober.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/version 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/version 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/version.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/version.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/colorama/__init__ 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/colorama/__init__ 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/colorama/__init__.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/colorama/__init__.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/colorama/ansi 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/colorama/ansi 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/colorama/ansi.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/colorama/ansi.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/colorama/ansitowin32 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/colorama/ansitowin32 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/colorama/ansitowin32.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/colorama/ansitowin32.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/colorama/initialise 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/colorama/initialise 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/colorama/initialise.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/colorama/initialise.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/colorama/win32 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/colorama/win32 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/colorama/win32.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/colorama/win32.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/colorama/winterm 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/colorama/winterm 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/colorama/winterm.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/colorama/winterm.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/contextlib2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/contextlib2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/__init__ 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/__init__ 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/__init__.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/__init__.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/__init__ 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/__init__ 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/__init__.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/__init__.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/misc 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/misc 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/misc.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/misc.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/shutil 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/shutil.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/shutil.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/sysconfig 2.cfg create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/sysconfig 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/sysconfig 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/sysconfig.cfg create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/sysconfig.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/sysconfig.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/tarfile 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/tarfile 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/tarfile.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/tarfile.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/compat.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/compat.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/database 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/database.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/database.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/index 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/index 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/index.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/index.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/locators 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/locators 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/locators.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/locators.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/manifest 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/manifest 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/manifest.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/manifest.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/markers 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/markers 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/markers.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/markers.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/metadata 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/metadata.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/metadata.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/resources 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/resources 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/resources.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/resources.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/scripts 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/scripts 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/scripts.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/scripts.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/t32 2.exe create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/t32.exe create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/t64 2.exe create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/t64.exe create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/util 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/util.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/util.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/version 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/version.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/version.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/w32 2.exe create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/w32.exe create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/w64 2.exe create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/w64.exe create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/wheel 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/wheel 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/wheel.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/wheel.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distro.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distro.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/__init__ 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/__init__ 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/__init__.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/__init__.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/_ihatexml 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/_ihatexml 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/_ihatexml.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/_ihatexml.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/_inputstream.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/_inputstream.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/_tokenizer 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/_tokenizer 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/_tokenizer.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/_tokenizer.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/_trie/__init__ 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/_trie/__init__ 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/_trie/__init__.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/_trie/__init__.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/_trie/_base 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/_trie/_base 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/_trie/_base.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/_trie/_base.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/_trie/datrie 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/_trie/datrie 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/_trie/datrie.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/_trie/datrie.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/_trie/py 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/_trie/py 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/_trie/py.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/_trie/py.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/_utils 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/_utils 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/_utils.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/_utils.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/constants 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/constants 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/constants.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/constants.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/__init__ 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/__init__ 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/__init__.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/__init__.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/alphabeticalattributes 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/alphabeticalattributes 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/alphabeticalattributes.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/alphabeticalattributes.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/base 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/base 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/base.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/base.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/inject_meta_charset 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/inject_meta_charset 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/inject_meta_charset.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/inject_meta_charset.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/lint 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/lint 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/lint.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/lint.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/optionaltags 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/optionaltags 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/optionaltags.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/optionaltags.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/sanitizer.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/sanitizer.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/whitespace 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/whitespace 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/whitespace.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/whitespace.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/html5parser 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/html5parser 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/html5parser.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/html5parser.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/serializer 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/serializer 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/serializer.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/serializer.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/treeadapters/__init__ 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/treeadapters/__init__ 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/treeadapters/__init__.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/treeadapters/__init__.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/treeadapters/genshi 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/treeadapters/genshi 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/treeadapters/genshi.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/treeadapters/genshi.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/treeadapters/sax 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/treeadapters/sax 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/treeadapters/sax.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/treeadapters/sax.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/treebuilders/__init__ 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/treebuilders/__init__ 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/treebuilders/__init__.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/treebuilders/__init__.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/treebuilders/base 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/treebuilders/base 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/treebuilders/base.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/treebuilders/base.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/treebuilders/dom 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/treebuilders/dom 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/treebuilders/dom.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/treebuilders/dom.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/treebuilders/etree 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/treebuilders/etree 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/treebuilders/etree.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/treebuilders/etree.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/treebuilders/etree_lxml 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/treebuilders/etree_lxml 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/treebuilders/etree_lxml.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/treebuilders/etree_lxml.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/__init__ 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/__init__ 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/__init__.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/__init__.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/base 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/base 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/base.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/base.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/dom 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/dom 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/dom.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/dom.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/etree 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/etree 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/etree.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/etree.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/etree_lxml 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/etree_lxml 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/etree_lxml.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/etree_lxml.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/genshi 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/genshi 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/genshi.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/genshi.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/idna/__init__ 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/idna/__init__ 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/idna/__init__.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/idna/__init__.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/idna/codec 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/idna/codec 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/idna/codec.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/idna/codec.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/idna/compat 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/idna/compat 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/idna/compat.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/idna/compat.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/idna/core 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/idna/core 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/idna/core.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/idna/core.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/idna/idnadata 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/idna/idnadata 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/idna/idnadata.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/idna/idnadata.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/idna/intranges 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/idna/intranges 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/idna/intranges.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/idna/intranges.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/idna/package_data 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/idna/package_data 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/idna/package_data.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/idna/package_data.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/idna/uts46data 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/idna/uts46data.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/idna/uts46data.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/ipaddress.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/ipaddress.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/msgpack/__init__ 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/msgpack/__init__ 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/msgpack/__init__.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/msgpack/__init__.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/msgpack/_version 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/msgpack/_version 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/msgpack/_version.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/msgpack/_version.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/msgpack/exceptions 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/msgpack/exceptions 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/msgpack/exceptions.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/msgpack/exceptions.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/msgpack/fallback 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/msgpack/fallback 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/msgpack/fallback.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/msgpack/fallback.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/packaging/__about__ 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/packaging/__about__ 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/packaging/__about__.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/packaging/__about__.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/packaging/__init__ 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/packaging/__init__ 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/packaging/__init__.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/packaging/__init__.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/packaging/_compat.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/packaging/_compat.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/packaging/_structures 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/packaging/_structures 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/packaging/_structures.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/packaging/_structures.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/packaging/_typing 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/packaging/_typing 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/packaging/_typing.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/packaging/_typing.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/packaging/markers 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/packaging/markers 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/packaging/markers.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/packaging/markers.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/packaging/requirements 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/packaging/requirements 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/packaging/requirements.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/packaging/requirements.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/packaging/specifiers 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/packaging/specifiers.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/packaging/specifiers.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/packaging/tags.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/packaging/tags.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/packaging/utils 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/packaging/utils.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/packaging/utils.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/packaging/version 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/packaging/version 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/packaging/version.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/packaging/version.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/pep517/__init__ 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/pep517/__init__ 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/pep517/__init__.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/pep517/__init__.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/pep517/_in_process 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/pep517/_in_process 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/pep517/_in_process.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/pep517/_in_process.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/pep517/build 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/pep517/build 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/pep517/build.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/pep517/build.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/pep517/check 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/pep517/check 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/pep517/check.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/pep517/check.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/pep517/colorlog 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/pep517/colorlog 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/pep517/colorlog.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/pep517/colorlog.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/pep517/compat 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/pep517/compat 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/pep517/compat.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/pep517/compat.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/pep517/dirtools 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/pep517/dirtools 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/pep517/dirtools.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/pep517/dirtools.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/pep517/envbuild 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/pep517/envbuild 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/pep517/envbuild.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/pep517/envbuild.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/pep517/meta 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/pep517/meta 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/pep517/meta.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/pep517/meta.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/pep517/wrappers 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/pep517/wrappers 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/pep517/wrappers.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/pep517/wrappers.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/pkg_resources/__init__ 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/pkg_resources/__init__ 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/pkg_resources/__init__.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/pkg_resources/__init__.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/pkg_resources/py31compat 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/pkg_resources/py31compat 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/pkg_resources/py31compat.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/pkg_resources/py31compat.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/progress/__init__ 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/progress/__init__ 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/progress/__init__.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/progress/__init__.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/progress/bar 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/progress/bar 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/progress/bar.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/progress/bar.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/progress/counter 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/progress/counter 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/progress/counter.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/progress/counter.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/progress/spinner 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/progress/spinner 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/progress/spinner.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/progress/spinner.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/pyparsing.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/pyparsing.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/pytoml/__init__ 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/pytoml/__init__.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/pytoml/__init__.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/pytoml/core 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/pytoml/core 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/pytoml/core.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/pytoml/core.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/pytoml/parser 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/pytoml/parser 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/pytoml/parser.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/pytoml/parser.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/pytoml/test 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/pytoml/test 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/pytoml/test.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/pytoml/test.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/pytoml/utils 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/pytoml/utils 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/pytoml/utils.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/pytoml/utils.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/pytoml/writer 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/pytoml/writer.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/pytoml/writer.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/requests/__init__ 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/requests/__init__ 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/requests/__init__.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/requests/__init__.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/requests/__version__ 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/requests/__version__ 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/requests/__version__.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/requests/__version__.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/requests/_internal_utils 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/requests/_internal_utils 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/requests/_internal_utils.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/requests/_internal_utils.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/requests/adapters 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/requests/adapters 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/requests/adapters.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/requests/adapters.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/requests/api 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/requests/api 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/requests/api.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/requests/api.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/requests/auth 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/requests/auth 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/requests/auth.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/requests/auth.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/requests/certs 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/requests/certs 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/requests/certs.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/requests/certs.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/requests/compat 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/requests/compat 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/requests/compat.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/requests/compat.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/requests/cookies 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/requests/cookies 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/requests/cookies.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/requests/cookies.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/requests/exceptions 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/requests/exceptions 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/requests/exceptions.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/requests/exceptions.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/requests/help 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/requests/help 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/requests/help.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/requests/help.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/requests/hooks 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/requests/hooks 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/requests/hooks.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/requests/hooks.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/requests/models 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/requests/models 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/requests/models.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/requests/models.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/requests/packages 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/requests/packages 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/requests/packages.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/requests/packages.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/requests/sessions 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/requests/sessions 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/requests/sessions.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/requests/sessions.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/requests/status_codes 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/requests/status_codes 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/requests/status_codes.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/requests/status_codes.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/requests/structures 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/requests/structures 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/requests/structures.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/requests/structures.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/requests/utils 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/requests/utils 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/requests/utils.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/requests/utils.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/retrying 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/retrying.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/retrying.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/six.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/six.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/__init__ 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/__init__ 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/__init__.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/__init__.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/_collections 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/_collections 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/_collections.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/_collections.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/connection 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/connection 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/connection.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/connection.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/connectionpool 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/connectionpool 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/connectionpool.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/connectionpool.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/__init__ 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/__init__.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/__init__.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/_appengine_environ 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/_appengine_environ 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/_appengine_environ.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/_appengine_environ.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__ 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/appengine 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/appengine 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/appengine.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/appengine.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/ntlmpool 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/ntlmpool 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/pyopenssl 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/pyopenssl 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/securetransport 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/securetransport 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/securetransport.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/securetransport.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/socks 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/socks 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/socks.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/socks.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/exceptions 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/exceptions 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/exceptions.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/exceptions.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/fields 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/fields 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/fields.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/fields.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/filepost 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/filepost 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/filepost.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/filepost.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/__init__ 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/__init__ 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/__init__.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/__init__.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/backports/__init__ 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/backports/__init__.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/backports/__init__.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/backports/makefile 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/backports/makefile 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/backports/makefile.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/six 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/six 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/six.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/six.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__init__ 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__init__ 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/poolmanager 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/poolmanager 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/poolmanager.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/poolmanager.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/request 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/request 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/request.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/request.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/response 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/response 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/response.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/response.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/__init__ 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/__init__ 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/__init__.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/__init__.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/connection 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/connection 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/connection.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/connection.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/queue 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/queue 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/queue.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/queue.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/request 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/request 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/request.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/request.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/response 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/response 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/response.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/response.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/retry 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/retry 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/retry.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/retry.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/ssl_ 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/ssl_ 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/ssl_.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/ssl_.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/timeout 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/timeout 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/timeout.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/timeout.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/url 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/url 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/url.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/url.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/wait 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/wait 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/wait.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/wait.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/webencodings/__init__ 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/webencodings/__init__ 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/webencodings/__init__.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/webencodings/__init__.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/webencodings/labels 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/webencodings/labels 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/webencodings/labels.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/webencodings/labels.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/webencodings/mklabels 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/webencodings/mklabels 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/webencodings/mklabels.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/webencodings/mklabels.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/webencodings/tests 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/webencodings/tests 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/webencodings/tests.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/webencodings/tests.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/webencodings/x_user_defined 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/webencodings/x_user_defined 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/webencodings/x_user_defined.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/webencodings/x_user_defined.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pkg_resources/__init__.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pkg_resources/__init__.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pkg_resources/_vendor/__init__ 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pkg_resources/_vendor/__init__ 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pkg_resources/_vendor/__init__.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pkg_resources/_vendor/__init__.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pkg_resources/_vendor/appdirs 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pkg_resources/_vendor/appdirs.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pkg_resources/_vendor/appdirs.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/__about__ 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/__about__ 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/__about__.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/__about__.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/__init__ 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/__init__ 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/__init__.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/__init__.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/_compat 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/_compat 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/_compat.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/_compat.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/_structures 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/_structures 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/_structures.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/_structures.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/markers 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/markers 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/markers.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/markers.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/requirements 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/requirements 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/requirements.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/requirements.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/specifiers 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/specifiers 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/specifiers.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/specifiers.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/utils 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/utils 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/utils.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/utils.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/version 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/version 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/version.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/version.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pkg_resources/_vendor/pyparsing 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pkg_resources/_vendor/pyparsing 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pkg_resources/_vendor/pyparsing.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pkg_resources/_vendor/pyparsing.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pkg_resources/_vendor/six 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pkg_resources/_vendor/six 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pkg_resources/_vendor/six.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pkg_resources/_vendor/six.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pkg_resources/extern/__init__ 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pkg_resources/extern/__init__ 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pkg_resources/extern/__init__.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pkg_resources/extern/__init__.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pkg_resources/py31compat 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pkg_resources/py31compat.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/pkg_resources/py31compat.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools-44.0.0.dist-info/INSTALLER create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools-44.0.0.dist-info/LICENSE create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools-44.0.0.dist-info/METADATA create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools-44.0.0.dist-info/RECORD create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools-44.0.0.dist-info/WHEEL create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools-44.0.0.dist-info/dependency_links.txt create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools-44.0.0.dist-info/entry_points.txt create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools-44.0.0.dist-info/top_level.txt create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools-44.0.0.dist-info/zip-safe create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools-44.0.0.dist-info/zip-safe 2 create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/__init__.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/__init__.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/_deprecation_warning.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/_deprecation_warning.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/_imp.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/_imp.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/_vendor/__init__.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/_vendor/__init__.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/_vendor/ordered_set.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/_vendor/ordered_set.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/_vendor/packaging/__about__ 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/_vendor/packaging/__about__ 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/_vendor/packaging/__about__.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/_vendor/packaging/__about__.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/_vendor/packaging/__init__ 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/_vendor/packaging/__init__ 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/_vendor/packaging/__init__.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/_vendor/packaging/__init__.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/_vendor/packaging/_compat 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/_vendor/packaging/_compat 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/_vendor/packaging/_compat.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/_vendor/packaging/_compat.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/_vendor/packaging/_structures 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/_vendor/packaging/_structures 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/_vendor/packaging/_structures.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/_vendor/packaging/_structures.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/_vendor/packaging/requirements 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/_vendor/packaging/requirements 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/_vendor/packaging/requirements.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/_vendor/packaging/requirements.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/_vendor/packaging/tags 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/_vendor/packaging/tags 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/_vendor/packaging/tags.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/_vendor/packaging/tags.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/_vendor/packaging/utils 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/_vendor/packaging/utils 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/_vendor/packaging/utils.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/_vendor/packaging/utils.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/_vendor/packaging/version 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/_vendor/packaging/version 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/_vendor/six 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/_vendor/six.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/_vendor/six.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/archive_util.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/archive_util.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/build_meta.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/build_meta.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/cli-32.exe create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/cli-64.exe create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/cli.exe create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/command/__init__ 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/command/__init__ 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/command/__init__.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/command/__init__.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/command/alias 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/command/alias.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/command/alias.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/command/bdist_egg.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/command/bdist_egg.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/command/bdist_rpm 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/command/bdist_rpm 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/command/bdist_rpm.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/command/bdist_rpm.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/command/bdist_wininst 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/command/bdist_wininst.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/command/bdist_wininst.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/command/build_clib 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/command/build_clib 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/command/build_clib.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/command/build_clib.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/command/build_ext 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/command/build_ext.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/command/build_ext.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/command/build_py 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/command/build_py 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/command/build_py.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/command/build_py.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/command/develop 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/command/develop 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/command/develop.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/command/develop.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/command/dist_info 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/command/dist_info.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/command/dist_info.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/command/easy_install 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/command/easy_install.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/command/easy_install.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/command/egg_info 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/command/egg_info 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/command/egg_info.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/command/egg_info.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/command/install 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/command/install.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/command/install.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/command/install_egg_info 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/command/install_egg_info 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/command/install_egg_info.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/command/install_egg_info.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/command/install_lib 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/command/install_lib.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/command/install_lib.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/command/install_scripts.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/command/install_scripts.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/command/launcher manifest.xml create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/command/py36compat 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/command/py36compat.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/command/py36compat.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/command/register 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/command/register.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/command/register.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/command/rotate 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/command/rotate 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/command/rotate.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/command/rotate.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/command/saveopts 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/command/saveopts 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/command/saveopts.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/command/saveopts.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/command/sdist 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/command/sdist 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/command/sdist.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/command/sdist.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/command/setopt 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/command/setopt 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/command/setopt.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/command/setopt.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/command/test 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/command/test 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/command/test.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/command/test.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/command/upload 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/command/upload.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/command/upload.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/command/upload_docs 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/command/upload_docs 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/command/upload_docs.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/command/upload_docs.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/config.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/config.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/dep_util.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/dep_util.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/depends.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/depends.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/dist.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/dist.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/errors.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/errors.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/extension.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/extension.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/extern/__init__ 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/extern/__init__ 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/extern/__init__.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/extern/__init__.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/glob.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/glob.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/gui-32.exe create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/gui-64.exe create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/gui.exe create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/installer.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/installer.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/launch.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/launch.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/lib2to3_ex.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/lib2to3_ex.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/monkey.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/monkey.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/msvc.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/msvc.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/namespaces.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/namespaces.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/package_index.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/package_index.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/py27compat.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/py27compat.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/py31compat.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/py31compat.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/py33compat.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/py33compat.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/py34compat.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/py34compat.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/sandbox.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/sandbox.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/script (dev).tmpl create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/script.tmpl create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/site-patch.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/site-patch.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/ssl_support 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/ssl_support.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/ssl_support.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/unicode_utils.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/unicode_utils.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/version.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/version.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/wheel.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/wheel.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/windows_support.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/setuptools/windows_support.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/wheel-0.34.2.dist-info/INSTALLER create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/wheel-0.34.2.dist-info/INSTALLER 2 create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/wheel-0.34.2.dist-info/LICENSE 2.txt create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/wheel-0.34.2.dist-info/LICENSE.txt create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/wheel-0.34.2.dist-info/METADATA create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/wheel-0.34.2.dist-info/METADATA 2 create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/wheel-0.34.2.dist-info/RECORD create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/wheel-0.34.2.dist-info/RECORD 2 create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/wheel-0.34.2.dist-info/WHEEL create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/wheel-0.34.2.dist-info/WHEEL 2 create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/wheel-0.34.2.dist-info/entry_points 2.txt create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/wheel-0.34.2.dist-info/entry_points.txt create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/wheel-0.34.2.dist-info/top_level 2.txt create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/wheel-0.34.2.dist-info/top_level.txt create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/wheel/__init__ 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/wheel/__init__ 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/wheel/__init__.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/wheel/__init__.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/wheel/__main__ 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/wheel/__main__ 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/wheel/__main__.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/wheel/__main__.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/wheel/_version 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/wheel/_version 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/wheel/_version.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/wheel/_version.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/wheel/bdist_wheel 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/wheel/bdist_wheel 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/wheel/bdist_wheel.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/wheel/bdist_wheel.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/wheel/cli/__init__ 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/wheel/cli/__init__ 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/wheel/cli/__init__.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/wheel/cli/__init__.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/wheel/cli/convert 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/wheel/cli/convert 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/wheel/cli/convert.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/wheel/cli/convert.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/wheel/cli/install 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/wheel/cli/install.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/wheel/cli/install.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/wheel/cli/pack 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/wheel/cli/pack 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/wheel/cli/pack.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/wheel/cli/pack.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/wheel/cli/unpack 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/wheel/cli/unpack 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/wheel/cli/unpack.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/wheel/cli/unpack.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/wheel/macosx_libfile 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/wheel/macosx_libfile 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/wheel/macosx_libfile.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/wheel/macosx_libfile.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/wheel/metadata 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/wheel/metadata 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/wheel/metadata.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/wheel/metadata.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/wheel/pep425tags 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/wheel/pep425tags 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/wheel/pep425tags.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/wheel/pep425tags.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/wheel/pkginfo 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/wheel/pkginfo 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/wheel/pkginfo.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/wheel/pkginfo.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/wheel/util 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/wheel/util 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/wheel/util.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/wheel/util.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/wheel/wheelfile 2.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/wheel/wheelfile 2.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/wheel/wheelfile.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site-packages/wheel/wheelfile.pyc create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/site.pyc create mode 120000 Application Code/Hackathon/myenv/lib/python2.7/sre.py create mode 120000 Application Code/Hackathon/myenv/lib/python2.7/sre_compile.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/sre_compile.pyc create mode 120000 Application Code/Hackathon/myenv/lib/python2.7/sre_constants.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/sre_constants.pyc create mode 120000 Application Code/Hackathon/myenv/lib/python2.7/sre_parse.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/sre_parse.pyc create mode 120000 Application Code/Hackathon/myenv/lib/python2.7/stat.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/stat.pyc create mode 120000 Application Code/Hackathon/myenv/lib/python2.7/types.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/types.pyc create mode 120000 Application Code/Hackathon/myenv/lib/python2.7/warnings.py create mode 100644 Application Code/Hackathon/myenv/lib/python2.7/warnings.pyc diff --git a/.DS_Store b/.DS_Store index f1f7bb76f871698f99b6da19f5c6963160f487a6..37e83b3ff78b945175873465584b921c34bcf12a 100644 GIT binary patch delta 50 zcmZoMXffDO&BAzcvL0Ilw?uWdk&&g2f|0Ssf|*no?_7;4FQQI89+rG$_|MN3?MMM zj!oW>LsH!>D6X`rZ`SN3OP4J_cnB=Tz{m)p83ds;j5<7-hec&`CTlU%W_FIh`~Yd? BE`9(2 diff --git a/Application Code/.DS_Store b/Application Code/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..fa76f8cb72031f9688e5125c60fcd1143718202a GIT binary patch literal 6148 zcmeHK&rcIU6n+C$cZ=ASf}jUo)1VxPp`P|8H*em1v-9oF%nksMWF;R5 zPyj%}!Y~xZs)ewAR`yAou*isn=g`1|B2ci?);{mR5HJuh@V_y@)~*b9K!Y5tVZFV6 zX->DOj=gMac!Oo&7Z=o8M(9VWA zt76QXIcjIjO=I3O9(hd3DqVm0%^3LyJEqx&WU<*)yr_&KZu2xS%myAZqe!)Ga$m~JWqzM??PSMb{V)b8xCc5sgy--A zUc)>12%q6Ae21TekT8jo9&(;sAQ#Cca+!#{ZOzwou9@CPg6CMP*JKsqnH(*ZcX_vX znI)P^iSJf=mV5htYwN>!>wG1eKcHv1c#x6TGmdRhyMUvynaMB%lQ7PinS?7)f_&QA zvkJ%1E52(LV)IZU_>?*hl_dxc7zh|RiVU#*LB+x_A+X^i-#W13R{+Einz^9Pei&Gc zDlj3i;Uo5-5I+>r4<+J?LHuyEtHLiKu;HU04n$l&h!~lO8w%m0V}6yp14;N8)Bytl z1A7^0_nQhk|0n-`|KA%Fv;qbK296X1B$Udek~k%Cw(gr8J8M-eD_EE?zlM)I1S@eI ibA=tneOS0)pUM=(gusT6Xh8{n1UL;r6)^Bm8Tbua+5i^- literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/.DS_Store b/Application Code/Hackathon/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..50fdc7e9c98ba049442c29b69a18a5b8a64b91cb GIT binary patch literal 6148 zcmeHK%}xR_5N-jri!pLAkz+63IPhac4<;MLgEx~kdQbzqLS!Ru2`myt%)W-ckx$_3 zIMWsq0$w~ALuQicH=Un0{kmzlj4@stwn~iU7-IqyG37wBL@t2hs;1^f~XK-Xeo5Ii9CBcN%Zh8Xx$2EGBN8dH=2 literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/.vscode/settings.json b/Application Code/Hackathon/.vscode/settings.json new file mode 100644 index 0000000..1d3d04a --- /dev/null +++ b/Application Code/Hackathon/.vscode/settings.json @@ -0,0 +1,4 @@ +{ + "python.pythonPath": "myenv/bin/python2.7", + "git.ignoreLimitWarning": true +} \ No newline at end of file diff --git a/Application Code/Hackathon/hackathon/.DS_Store b/Application Code/Hackathon/hackathon/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..7370d1dd8d568daf398685beda33cb6653bd8713 GIT binary patch literal 6148 zcmeHKO>Wab6n@i&;5b5Lfz&R&L1GbAX^JQaAz7g;x zmfzW)&-?v*U8lcychPm``}@7Fb9?X3V$rg;ZtgxfJUTghJ%6)!`(7>t2^_xCu50`O zACRdD^2(cJX`UUUo;fXE1c*Gwg0N)qio9EhI=|>^7?)MJHB()Z587O4(?1)leW7Pz zzPwSuDDXEF;Pb(OGrAfph4Sb?BA)=j2CAhY&uoZ?@AHmr;u2Lu|Nc43qGkg_q!=<6k;SA8#SSdse%={6MGML0D I@J|)^4$b@MNdN!< literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/hackathon/__pycache__/app.cpython-37.pyc b/Application Code/Hackathon/hackathon/__pycache__/app.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..86f88faf2f9ad2913eb29ede7a1866474dac5638 GIT binary patch literal 3491 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 literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/hackathon/migrations/alembic.ini b/Application Code/Hackathon/hackathon/migrations/alembic.ini new file mode 100644 index 0000000..f8ed480 --- /dev/null +++ b/Application Code/Hackathon/hackathon/migrations/alembic.ini @@ -0,0 +1,45 @@ +# A generic, single database configuration. + +[alembic] +# template used to generate migration files +# file_template = %%(rev)s_%%(slug)s + +# set to 'true' to run the environment during +# the 'revision' command, regardless of autogenerate +# revision_environment = false + + +# Logging configuration +[loggers] +keys = root,sqlalchemy,alembic + +[handlers] +keys = console + +[formatters] +keys = generic + +[logger_root] +level = WARN +handlers = console +qualname = + +[logger_sqlalchemy] +level = WARN +handlers = +qualname = sqlalchemy.engine + +[logger_alembic] +level = INFO +handlers = +qualname = alembic + +[handler_console] +class = StreamHandler +args = (sys.stderr,) +level = NOTSET +formatter = generic + +[formatter_generic] +format = %(levelname)-5.5s [%(name)s] %(message)s +datefmt = %H:%M:%S diff --git a/Application Code/Hackathon/hackathon/migrations/env.py b/Application Code/Hackathon/hackathon/migrations/env.py new file mode 100644 index 0000000..79b8174 --- /dev/null +++ b/Application Code/Hackathon/hackathon/migrations/env.py @@ -0,0 +1,96 @@ +from __future__ import with_statement + +import logging +from logging.config import fileConfig + +from sqlalchemy import engine_from_config +from sqlalchemy import pool + +from alembic import context + +# this is the Alembic Config object, which provides +# access to the values within the .ini file in use. +config = context.config + +# Interpret the config file for Python logging. +# This line sets up loggers basically. +fileConfig(config.config_file_name) +logger = logging.getLogger('alembic.env') + +# add your model's MetaData object here +# for 'autogenerate' support +# from myapp import mymodel +# target_metadata = mymodel.Base.metadata +from flask import current_app +config.set_main_option( + 'sqlalchemy.url', current_app.config.get( + 'SQLALCHEMY_DATABASE_URI').replace('%', '%%')) +target_metadata = current_app.extensions['migrate'].db.metadata + +# other values from the config, defined by the needs of env.py, +# can be acquired: +# my_important_option = config.get_main_option("my_important_option") +# ... etc. + + +def run_migrations_offline(): + """Run migrations in 'offline' mode. + + This configures the context with just a URL + and not an Engine, though an Engine is acceptable + here as well. By skipping the Engine creation + we don't even need a DBAPI to be available. + + Calls to context.execute() here emit the given string to the + script output. + + """ + url = config.get_main_option("sqlalchemy.url") + context.configure( + url=url, target_metadata=target_metadata, literal_binds=True + ) + + with context.begin_transaction(): + context.run_migrations() + + +def run_migrations_online(): + """Run migrations in 'online' mode. + + In this scenario we need to create an Engine + and associate a connection with the context. + + """ + + # this callback is used to prevent an auto-migration from being generated + # when there are no changes to the schema + # reference: http://alembic.zzzcomputing.com/en/latest/cookbook.html + def process_revision_directives(context, revision, directives): + if getattr(config.cmd_opts, 'autogenerate', False): + script = directives[0] + if script.upgrade_ops.is_empty(): + directives[:] = [] + logger.info('No changes in schema detected.') + + connectable = engine_from_config( + config.get_section(config.config_ini_section), + prefix='sqlalchemy.', + poolclass=pool.NullPool, + ) + + with connectable.connect() as connection: + context.configure( + connection=connection, + target_metadata=target_metadata, + process_revision_directives=process_revision_directives, + **current_app.extensions['migrate'].configure_args + ) + + with context.begin_transaction(): + context.run_migrations() + + +if context.is_offline_mode(): + run_migrations_offline() +else: + run_migrations_online() diff --git a/Application Code/Hackathon/hackathon/migrations/script.py.mako b/Application Code/Hackathon/hackathon/migrations/script.py.mako new file mode 100644 index 0000000..2c01563 --- /dev/null +++ b/Application Code/Hackathon/hackathon/migrations/script.py.mako @@ -0,0 +1,24 @@ +"""${message} + +Revision ID: ${up_revision} +Revises: ${down_revision | comma,n} +Create Date: ${create_date} + +""" +from alembic import op +import sqlalchemy as sa +${imports if imports else ""} + +# revision identifiers, used by Alembic. +revision = ${repr(up_revision)} +down_revision = ${repr(down_revision)} +branch_labels = ${repr(branch_labels)} +depends_on = ${repr(depends_on)} + + +def upgrade(): + ${upgrades if upgrades else "pass"} + + +def downgrade(): + ${downgrades if downgrades else "pass"} diff --git a/Application Code/Hackathon/hackathon/migrations/versions/15c0fa797121_.py b/Application Code/Hackathon/hackathon/migrations/versions/15c0fa797121_.py new file mode 100644 index 0000000..22c3361 --- /dev/null +++ b/Application Code/Hackathon/hackathon/migrations/versions/15c0fa797121_.py @@ -0,0 +1,33 @@ +"""empty message + +Revision ID: 15c0fa797121 +Revises: +Create Date: 2020-02-09 12:20:12.239611 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '15c0fa797121' +down_revision = None +branch_labels = None +depends_on = None + + +def upgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.create_table('users', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('email', sa.Text(), nullable=True), + sa.Column('password', sa.Text(), nullable=True), + sa.PrimaryKeyConstraint('id') + ) + # ### end Alembic commands ### + + +def downgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.drop_table('users') + # ### end Alembic commands ### diff --git a/Application Code/Hackathon/hackathon/migrations/versions/57535f8d20f9_.py b/Application Code/Hackathon/hackathon/migrations/versions/57535f8d20f9_.py new file mode 100644 index 0000000..383bb52 --- /dev/null +++ b/Application Code/Hackathon/hackathon/migrations/versions/57535f8d20f9_.py @@ -0,0 +1,34 @@ +"""empty message + +Revision ID: 57535f8d20f9 +Revises: 15c0fa797121 +Create Date: 2020-02-09 12:59:03.964434 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '57535f8d20f9' +down_revision = '15c0fa797121' +branch_labels = None +depends_on = None + + +def upgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.create_table('events', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('event_name', sa.Text(), nullable=True), + sa.Column('organiser_name', sa.Text(), nullable=True), + sa.Column('date', sa.Date(), nullable=True), + sa.PrimaryKeyConstraint('id') + ) + # ### end Alembic commands ### + + +def downgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.drop_table('events') + # ### end Alembic commands ### diff --git a/Application Code/Hackathon/hackathon/migrations/versions/__pycache__/15c0fa797121_.cpython-37.pyc b/Application Code/Hackathon/hackathon/migrations/versions/__pycache__/15c0fa797121_.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6af0385c0d4392ac8354337db6f9f5571a3de99c GIT binary patch literal 887 zcmZuvOK;RL5O$nolTBMdg)_=^4{aU@s;(+tyFyf;3ej?j5Rn_3-B2eEcD7|XaN^2; z=t^7=|HxNP`~|o$&h{x`YsQ}Or+Iwir)z5gg7y99qj!HXLcff0zQ9J0LDUW?iZVnk zin&$c3|r=Ib31dWleyH+dLSN%PhHykin2cSs1IjA?R_-pe}2oVrk#fsQ;JMj5WHr` zr7A@o?v96Ha=(b*ldbKoBu$ntObx?eBpGR0I0iKg(>RSc;&db44wH14#=|7tOz&+! zNRlA<4fUacrLk!Cvem263iEQlOs69d^%7KzPAzJ+_=8Pxi%*>eqBeED*`3D)j|-mO zg~z+@Iqgxruof=xfS^BrPrEb4q|&&g&!7^&o^ehNInyqyNXZYh-w>rvgroyc8e;Wo z(Y2Si9Skd?dn3VTRjs|}Xw z-jn8efR_{nRElOv&}FyF+f9J!J{2c*m-#N3%Fv3iTn9Z^(O#ZYQRKPy2xrw{S)9dG zA35R0lvQ)t2c-7p*;mwSCR~1L9!gRd(;Vi=xY7Y-4XdfjMcp;k<@s+}{!S(6jI)Ox T#8-v@$6B>~$FaI?`z!wdn1kgP literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/hackathon/migrations/versions/__pycache__/57535f8d20f9_.cpython-37.pyc b/Application Code/Hackathon/hackathon/migrations/versions/__pycache__/57535f8d20f9_.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f8ff9b54a7b7a12a1e712460420e832771d6bb54 GIT binary patch literal 957 zcmZuvJ#*7A7?x$ncHFdA3e0%T(Ar5GN^(8ElH=%cS2$W05A~^*nwZ*>k(`z=FtPF< znvtEI|DlzMzre(6C;i|+I=z1N=5SQe@0L z?=3q|RVui@KN|SG-QITZ^bzfbr~SnWQv<)#OTtsK+u!YUJKj(-QZj!8Vc>VeZnznC zH^aW)=?;4RLAbruf4H-=z2kYm;H;=^Xe^3@sCB!tZr!e!RJ^OU0?81DI)+f9OM@CE zes5A-;!A6es7bA_W{oreX#iqhBhEjF3y6KgxpXL=8*>{pL!d?TK-=t`@lt7=(id=4 zmrt{doMcRU^+L=^&W`k&kYmDA#bga=i^ApGuB>d)t)vztF6;lWBHA8`Y?^cJ?DLY1 znbg)1`&eqLl1$%wBh#G7*()|13a&~?QeJ*T@($Fh!|%_*JJ?AD7eby;faLoxOSL`59$FioV;2gF9t_p4& z6K@qW?Mw?`QFgbop#=e9+t^rkS)qS9W&%(kurXWw@4Q)ZKJj Fe*inU`bPi& literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/hackathon/migrations/versions/__pycache__/ca277f51404c_.cpython-37.pyc b/Application Code/Hackathon/hackathon/migrations/versions/__pycache__/ca277f51404c_.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..315991e8bbd10a32c2f3542f620ad7419866fffa GIT binary patch literal 828 zcmZuvyK>V&6kR=R%d$N%Lq(_7g(LYD6HkVhT|nc4m_|i3vhF%IS!u|hEiS}J}Z zDft5aWm_tKfr`6+BxZ)IxkvX(XYS+dzHT&Jf_C}y#pQRCkY74E80O?9x;#e!5)v@L zWJYR+rlDhtS)mPfSb|bm1}m(fJ5YwoR}xmifhxXTur5f`{k))QUTnOSN*P~K*L_FV zOS$Bk_jWw=lDIP%%=_(L&`WlIs2qCzLBHFdKZ8y%KXXTd#s&4p2t%(Ebb?mUX$5Cq zyE|+L!*=haJ2(vnr>^@OXC+NTnLM9__2bH_eq1rpyn{IyjL@ZrP>@>#jKch2fmxWh z_8kEW>~Gec-kRVxrHLxjHO&gCYCvUDEb{_anPOKbTQL^T7;Tn>mQT4cK$LK{N;753 zSd~Y+*q+i)#SbECNZP`mFaCQ;h4gQ@xCWllz#mh2UGUr=w?-VOxQO1w$#q;Tcot1j zPKH|eukxHNlUVonG|Ru|_=^MEPnTC>OOgH>TOe2Z$I3(}`9@V%IkJF0!HJ}votUD5 z_>WLFe%K227=xWqVBQO3O@tCW0O}6d)6w^cJN4i8! zRiX%Z5=E*KGn&qp$zE0Yk;N>*OSKXD?35$+_enK$x#%ICi8xCZ5grOKK~udIZrvP7=2#RQ|WbWqi#61ZEPRQDgOmV%+U$} literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/hackathon/migrations/versions/ca277f51404c_.py b/Application Code/Hackathon/hackathon/migrations/versions/ca277f51404c_.py new file mode 100644 index 0000000..115f397 --- /dev/null +++ b/Application Code/Hackathon/hackathon/migrations/versions/ca277f51404c_.py @@ -0,0 +1,28 @@ +"""empty message + +Revision ID: ca277f51404c +Revises: 57535f8d20f9 +Create Date: 2020-02-09 13:10:14.376076 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = 'ca277f51404c' +down_revision = '57535f8d20f9' +branch_labels = None +depends_on = None + + +def upgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.add_column('events', sa.Column('desctiption', sa.Text(), nullable=True)) + # ### end Alembic commands ### + + +def downgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.drop_column('events', 'desctiption') + # ### end Alembic commands ### diff --git a/Application Code/Hackathon/hackathon/static/main.css b/Application Code/Hackathon/hackathon/static/main.css new file mode 100644 index 0000000..bf51a85 --- /dev/null +++ b/Application Code/Hackathon/hackathon/static/main.css @@ -0,0 +1,3 @@ +body{ + background-color: #cd6684; +} \ No newline at end of file diff --git a/Application Code/Hackathon/hackathon/static/signin.png b/Application Code/Hackathon/hackathon/static/signin.png new file mode 100644 index 0000000000000000000000000000000000000000..2f98b7e542747aeedc5abf583a4bbe987b68995d GIT binary patch literal 54598 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

y?aHAUk zteFcF%Rq_~U;_`l89xJ>oWe&R3v)tVRpp#nc=A7IoV;ajBa42PLySL5n?oz}Fo!b{ zBfqOk=Kr zaR=*svxMY(SRT=^&ZSHH;totOrN>5VXWIJL2>Mxb8oGC@0n+lI(*DBQoK*IYB>~+E ztTK)?Yoeb5@$6c!DVAQ=8Vg+wnd%B@qCy#Q#&rM{bJZd$pn?;4e2dYim(3hvSz-Sy zlmv1Y>qjz7Bi8d?U)uPe$G9^CxL4$$>W$1z{az)G#xU@H5dWnNE$Dv{4aLU_f_rZW z0&qTcr06A9R5N6)z2{$-#1Q1*aTmllwK*4gz0VK>VNMgO2`6OPly>)$;B}rsLh9*| zBYUa~U3`DE%p7=7e>jG*v`A&3ZUlf7eVr&s@mnBA;YKJ>k*!^?Yjbiu3T+vsJ%7(beGjK?xt~TSWj~fe*BMg4K+FBKfoi z&~b#gExvE)iyzUZBzM$-kM@PRp+RJZ2s5fRERP3sYb`bxcEKY-!ik%I~23v*8uWM%*e^S%FB zj<0?gq$p$gp;yNDzvM9y?8vjozBApsko_8|b!T2f+^GkB$BjUno9*g6s>` zlY53eH;2+5Gdv=ukx zi0oe^^N#%nAgW$XIV{}Awzfk(cs#_=aeYMi59HvGk)&NM8-UXxSb``$2!UfiuvEm= z8DOEd&#{l#ye3G9hLc$d+YS8?a$_ivb4mHnG-*&>od8b2RdS3GfgFTn{QLo8!!1gh zB)Gv#!b;l!hHoT7iGpamvo#q`ZjcoB6w?LDo+*dDybl$Vvjnj4a|!3AsLXK^d#Dr0nb{XH!TOR3X|QXk z6F~=YV_3A|RGOL$J;z^Ev1UzDxF{61XyaZ#ME0}=zS(`D|~A6{L_z@MIIL>F@KM4X^)MWwY_g4f^6TsQW(>toTZg5?2r@HIPVqG>$WUIaw3pDOF#1=}mp!gqG{ z(!Z+9W`B&$mm!!k622yv{~CwlS&VaX0D$hneRWl1mOL+?@2#BA_WxFGUY1h2%cn)k z+yG>KT%UXT`%5$xGS+y_Ow+f}A&a1nkq4_r~#M1N4(8qn*j+jtki60qv z?_jkFlH$BDSv_F5n+Q?Gcw1bpmtrF?Yy=g_8*@7PavZ3%M2(yZbo*8W{eR6}`8(A8 z_nt8f2GPWjH9{E6$X50c*|+S;+m=1qvyWY}KiQLI2pLQY*~h-~AR22j7;8dAwy)>& zSA1W8!0Vjz!+q{^UFTf)jRZ8QfOdU_w5NaeO^()|=0qqAdwkjwiosBsS3pdy=0$h~ zA=*0PVD;wdF4g8)Q)c|OYn_{I(ee14H5_g7`$AsnQaT(stf7_k+nKp{YhluthcOqS z6cxX3wm^rbwlfg~nR>0ChtFHq%(8MY70`LclT?_8 zT+bCMF`iFJ{-yirq&XjL1*YLCy8qC&t{NhZzaq4ssH-te0}MJyW-g?)*)12Pz&8!s zU;gts5D9seo+`914y?Y*x4**< ze0_y5QuDvEW_i=BE*dlzVUc3PY6$d?3B`)WWo&@gzTIE{1wOR8+$b3(TnT! z@j$|m$PLt51?8VJ!oAEq3pq!j{?|NAmO&#%Ef@Q>ovea~26 zI|cL)`A1ntfN1?j{(n(*6+u>2Ygaox$R)qB%&ayOevFFB&O_$v9vU^pD^{PTfUUOVi>RC=#@(Htsm zBM9IfAICG}Z$h{`J zcRiCmN~NVacS&Iw{_IFWoueJ!uOoY36@es5!iFq(+5~~i(E>v_%cGRMGd_AmW-8b- zfu!kMrieuiXDWZ?sm=AZ8SYDW@R4gx8nAMke3}#O74BcQOtayR_7YF|?jx>z$8)eo zRsC--jN7o(f%xF{249nGpK)=9bVb`tOoG}eB{u>1jNbg?asT! zKYZk4)<6QeDFw^3Jd~}@%L`S5GxO@$UALQ?AMjXxnlox5?I7A#m2rPGth~JxGjlfC zOO=c=2CkU|u)w)O7Y*k=SJi1TPRpTR#f=C3?ROo#S zlWN0flQX|4=7iCZpwIv@&Cs!mASiPB_?$JDA;Ha1Lh=3vw%2aq zPeHI2Krgt(i=*N{VXI!c;0gQaq$m07c5Qc3v(wK`N6a*Du6`Q{jxsvEt8Fg7K~^o7 zI3CRczdd5aKX;pUNx*IY-`IWqYquJcaP{hvf*GM16=w0oYRVbcSCi%>? zcpqIgkDltW$@Qsoy?=S-ueza=;4?)wEjLwP=fuh0illL0BR~6k3FodX)cz;YF}WX6 zqG@Sv!gzf|Ok)%6*ni{`KH$lIH}2;NHkz@yw_>{eRiXf_C4B?C(e=V+xm7*!wznpJ zB3$J!6bcOrdFh%`M69Z+B1L-Kh!LNjx&Q3KRZ;r>{TaIRwPmF@lvwX}Wem1*vKj=b zW_^5DeXr096!jb90;{Qx-fm>nS{;oe+;H(7qmmd(NN>?9l7vek6*&5?(b1u(ruTbd zeUM-F%%3DWjDI>;4Q$3S&ZOqVxs0G}mii#8dgS64)pJQpyGDtWi{VH5L^Ch>k)GBv zQW5>Y*+*gEzyt(cUmgRivnA|AfLUHLc@MauDZUE>3&%}q{t9|KKj*$l?t4uk)Qd-I zl4&*NN0GlRpBX8N{3}jgM)3g`UV58vGCS>tpvHw`N>JM8PwYLNItWP}IMyQrWwXNk zRGzZC;pEsVZdZS2q2{pbl%B0x7RcBK%)d!-F6hebzfBb}gqs4ELVmLwcSAiA!*z@9abEfbrnJd99;IbMC zm<^Hnm%;u6@7n0a18spqBCutKWnG@bQzBJLAhIKOC|Wn3IAW zBYv{ds#BRxPRz^!~%_dOKV6`zE_UGk|JPag(MF8*t2hK5fxjTP%p0jo{2i73*rcrH5QW|4y z1NgzLR2rEjzddGa5lhZ9u|=EQHt$uES#g=7H&jWyqt;$Hs^w4H^>%Ziw>{ZUouhA} zF+ z$#eJ}>;^WsB$Vt;QS-Yr2r z!G4hle+$+loDAIE_uA86?MSkYs%|}dqpqfh8EnGOaYxhk8)&7|gtBklv;2?ORDL&u zw#}%v<;r@8z|uAxK&gfWSjJ<%f)dcrR0z-gdG@sVA-`_);jN_ zL{HegDo+}cS8)wDfx)7qHn+$KYv;XSY%k~j6tmQu)HN(5W@qO;j~$fl_P0R~#2bg( zzSiF)Wq!S&ytVG)O@%-h;O%{-N=gp6{$Vf=4xUZ3X$HAt=l+!WYmpiMQ@Xqli1J5i zq(+3&*(Nhd4$4aGJX>F0Y9dt#ftsygL&3W!V9B2OuSS(_Jj>EVWy4vU zn!|)N$j=?E{i_Z^x(DZ;3K4;M_$>eW_~S=MM^rf7Q}1r)%BxPY#aBfdUjHeOu=GMY zvSaDtx_c(X{Rgz0pAf|-gBDQ+yFZ(v+@4Np7#fYRsA-iTRUN7)IduZ9|$`i@nwd6?5XZFa3p?p1*B70h<7nmVdBIcPQs?iR7v>~U z@Vz{M1vxi#82fE@qQibMc+N|NXVz!80EX+Yz#>!TPJYgi6DBY9(WR9;zp022Qp&uR zBp1F7-W~k2t!k}r)bnKG>?6Oa<6n&V3r77qzT$(P{WC6_KkdzF+Z7|-y7TVdbD_su z?zOltPiBKo3ZI1G8pDp|U2R*6?zL?5oS0Z+=fK52#yD8h_*F$-8rx}BbU9Dy`-{*B# zjWB(dX7(H7MT=io99#>PyrdTN=-nNby_+hxp4r$0jKp+3ed0mgGLt*z6t#Ie^Lobp zXt|a8FkL$7of{{BEE}m=ufUGY1!fBH;H&Gd;XJcC!AIw>8=c6uTj>HEdx?!tgj@X9 zmX-O>Kjx}v40b=~W9ueHrKp6-w`yFefEm75^uWn7Wn$ZcMi)*L2Jd8va=aD4XMR5Z zI_BS=%F;Enf|!NI(9^#&75cO{q}gJNYyZ|Akqc%cf#gws*w=H6f>!pj3>N%BVPatamb|Iy1|*3ZEL>VhBl{X70jeQzcfTNh6vA~TS@ zNir|VKG-A!z@{&YQ(yvM%px>71E%i5p`9AMOEjP30VlY_Gw#t2O!ODKwD&z+W5GSI z@M-@SZFe(oyE(@t&Kb+`n;SiGT6DPmmh-yBIlv>9&UvCnOSaZ(ZLVgATTHE(mI|Z- zsX!`_3jB-$yt8HF{lKhKfm9$BSSz6Op|A*>ihZCT9jrVBAdcAWMqkfmaZ1IeVjsv6 zngx{@RI4e51)cq+#x)iDz@Wow@?mx5kL1OCb7IpYxX) zO!7S>t5hHr_^%4sXm&Z9^6To|`sF)y*A|v57MbFDIW+nkj{r7wjvV=5j2HQgYby4E UnnnFiC+0)I1<5KE_yq;t0lTR-`~Uy| literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/hackathon/templates/add.html b/Application Code/Hackathon/hackathon/templates/add.html new file mode 100644 index 0000000..93ba323 --- /dev/null +++ b/Application Code/Hackathon/hackathon/templates/add.html @@ -0,0 +1,143 @@ + + + + Contact us + + + + +

+
+
+
+
+

Add an Event

+ + + + + +
+
+ + \ No newline at end of file diff --git a/Application Code/Hackathon/hackathon/templates/admin.html b/Application Code/Hackathon/hackathon/templates/admin.html new file mode 100644 index 0000000..8d2f0af --- /dev/null +++ b/Application Code/Hackathon/hackathon/templates/admin.html @@ -0,0 +1,54 @@ + + + + + + + + + + + Admin + + + + +
+ + + {% for event in event_data %} +
+
+
{{event.event_name}}
+

{{event.description}}

+
+ +
+
+
+ {% endfor %} + + + + + + + + + + \ No newline at end of file diff --git a/Application Code/Hackathon/hackathon/templates/login.html b/Application Code/Hackathon/hackathon/templates/login.html new file mode 100644 index 0000000..2cd5f84 --- /dev/null +++ b/Application Code/Hackathon/hackathon/templates/login.html @@ -0,0 +1,48 @@ + + + + + + + + + + + Login + + + + +
+ + +
+
+ +
+ +
+
LOGIN
+
+
+
+ +
+
+ +
+ +
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/Application Code/Hackathon/hackathon/templates/register.html b/Application Code/Hackathon/hackathon/templates/register.html new file mode 100644 index 0000000..7914f49 --- /dev/null +++ b/Application Code/Hackathon/hackathon/templates/register.html @@ -0,0 +1,48 @@ + + + + + + + + + + + Register + + + + +
+ + +
+
+ +
+ +
+
Register
+
+
+
+ +
+
+ +
+ +
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/Application Code/Hackathon/myenv/.Python b/Application Code/Hackathon/myenv/.Python new file mode 120000 index 0000000..cc24a1e --- /dev/null +++ b/Application Code/Hackathon/myenv/.Python @@ -0,0 +1 @@ +/System/Library/Frameworks/Python.framework/Versions/2.7/Python \ No newline at end of file diff --git a/Application Code/Hackathon/myenv/bin/activate b/Application Code/Hackathon/myenv/bin/activate new file mode 100644 index 0000000..3cb4caf --- /dev/null +++ b/Application Code/Hackathon/myenv/bin/activate @@ -0,0 +1,84 @@ +# This file must be used with "source bin/activate" *from bash* +# you cannot run it directly + + +if [ "${BASH_SOURCE-}" = "$0" ]; then + echo "You must source this script: \$ source $0" >&2 + exit 33 +fi + +deactivate () { + unset -f pydoc >/dev/null 2>&1 + + # reset old environment variables + # ! [ -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 ! [ -z "${_OLD_VIRTUAL_PYTHONHOME+_}" ] ; then + PYTHONHOME="$_OLD_VIRTUAL_PYTHONHOME" + export PYTHONHOME + unset _OLD_VIRTUAL_PYTHONHOME + fi + + # This should detect bash and zsh, which have a hash command that must + # be called to get it to forget past commands. Without forgetting + # past commands the $PATH changes we made may not be respected + if [ -n "${BASH-}" ] || [ -n "${ZSH_VERSION-}" ] ; then + hash -r 2>/dev/null + fi + + if ! [ -z "${_OLD_VIRTUAL_PS1+_}" ] ; then + PS1="$_OLD_VIRTUAL_PS1" + export PS1 + unset _OLD_VIRTUAL_PS1 + fi + + unset VIRTUAL_ENV + if [ ! "${1-}" = "nondestructive" ] ; then + # Self destruct! + unset -f deactivate + fi +} + +# unset irrelevant variables +deactivate nondestructive + +VIRTUAL_ENV="/Users/workdone0/Desktop/Hakathon/myenv" +export VIRTUAL_ENV + +_OLD_VIRTUAL_PATH="$PATH" +PATH="$VIRTUAL_ENV/bin:$PATH" +export PATH + +# unset PYTHONHOME if set +if ! [ -z "${PYTHONHOME+_}" ] ; then + _OLD_VIRTUAL_PYTHONHOME="$PYTHONHOME" + unset PYTHONHOME +fi + +if [ -z "${VIRTUAL_ENV_DISABLE_PROMPT-}" ] ; then + _OLD_VIRTUAL_PS1="${PS1-}" + if [ "x" != x ] ; then + PS1="${PS1-}" + else + 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-}" ] || [ -n "${ZSH_VERSION-}" ] ; then + hash -r 2>/dev/null +fi diff --git a/Application Code/Hackathon/myenv/bin/activate.csh b/Application Code/Hackathon/myenv/bin/activate.csh new file mode 100644 index 0000000..d431b22 --- /dev/null +++ b/Application Code/Hackathon/myenv/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/workdone0/Desktop/Hakathon/myenv" + +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/Application Code/Hackathon/myenv/bin/activate.fish b/Application Code/Hackathon/myenv/bin/activate.fish new file mode 100644 index 0000000..2d946c2 --- /dev/null +++ b/Application Code/Hackathon/myenv/bin/activate.fish @@ -0,0 +1,102 @@ +# 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" + and functions -q _old_fish_prompt + # 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/workdone0/Desktop/Hakathon/myenv" + +# 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/Application Code/Hackathon/myenv/bin/activate.ps1 b/Application Code/Hackathon/myenv/bin/activate.ps1 new file mode 100644 index 0000000..95504d3 --- /dev/null +++ b/Application Code/Hackathon/myenv/bin/activate.ps1 @@ -0,0 +1,60 @@ +$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) { + 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 + +New-Variable -Scope global -Name _OLD_VIRTUAL_PATH -Value $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 + $previous_prompt_value = & $function:_old_virtual_prompt + ("" + $previous_prompt_value) + } + } + else { + function global:prompt { + # Add a prefix to the current prompt, but don't discard it. + $previous_prompt_value = & $function:_old_virtual_prompt + $new_prompt_value = "($( Split-Path $env:VIRTUAL_ENV -Leaf )) " + ($new_prompt_value + $previous_prompt_value) + } + } +} diff --git a/Application Code/Hackathon/myenv/bin/activate_this.py b/Application Code/Hackathon/myenv/bin/activate_this.py new file mode 100644 index 0000000..aa96457 --- /dev/null +++ b/Application Code/Hackathon/myenv/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_info), "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/Application Code/Hackathon/myenv/bin/easy_install b/Application Code/Hackathon/myenv/bin/easy_install new file mode 100755 index 0000000..c5cb484 --- /dev/null +++ b/Application Code/Hackathon/myenv/bin/easy_install @@ -0,0 +1,10 @@ +#!/Users/workdone0/Desktop/Hakathon/myenv/bin/python +# -*- coding: utf-8 -*- +import re +import sys + +from setuptools.command.easy_install import main + +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/Application Code/Hackathon/myenv/bin/easy_install-2.7 b/Application Code/Hackathon/myenv/bin/easy_install-2.7 new file mode 100755 index 0000000..c5cb484 --- /dev/null +++ b/Application Code/Hackathon/myenv/bin/easy_install-2.7 @@ -0,0 +1,10 @@ +#!/Users/workdone0/Desktop/Hakathon/myenv/bin/python +# -*- coding: utf-8 -*- +import re +import sys + +from setuptools.command.easy_install import main + +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/Application Code/Hackathon/myenv/bin/pip b/Application Code/Hackathon/myenv/bin/pip new file mode 100755 index 0000000..b971b25 --- /dev/null +++ b/Application Code/Hackathon/myenv/bin/pip @@ -0,0 +1,10 @@ +#!/Users/workdone0/Desktop/Hakathon/myenv/bin/python +# -*- coding: utf-8 -*- +import re +import sys + +from pip._internal.cli.main import main + +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/Application Code/Hackathon/myenv/bin/pip2 b/Application Code/Hackathon/myenv/bin/pip2 new file mode 100755 index 0000000..b971b25 --- /dev/null +++ b/Application Code/Hackathon/myenv/bin/pip2 @@ -0,0 +1,10 @@ +#!/Users/workdone0/Desktop/Hakathon/myenv/bin/python +# -*- coding: utf-8 -*- +import re +import sys + +from pip._internal.cli.main import main + +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/Application Code/Hackathon/myenv/bin/pip2.7 b/Application Code/Hackathon/myenv/bin/pip2.7 new file mode 100755 index 0000000..b971b25 --- /dev/null +++ b/Application Code/Hackathon/myenv/bin/pip2.7 @@ -0,0 +1,10 @@ +#!/Users/workdone0/Desktop/Hakathon/myenv/bin/python +# -*- coding: utf-8 -*- +import re +import sys + +from pip._internal.cli.main import main + +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/Application Code/Hackathon/myenv/bin/python b/Application Code/Hackathon/myenv/bin/python new file mode 100755 index 0000000000000000000000000000000000000000..4e2e024a1e6999b8c46b24d1e2fffff6d96cfe33 GIT binary patch literal 36336 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 bpb?-Epb?-Epb?-Epb?-Epb_}LLEwJ?V_nde literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/bin/python-config b/Application Code/Hackathon/myenv/bin/python-config new file mode 100755 index 0000000..9b9ec73 --- /dev/null +++ b/Application Code/Hackathon/myenv/bin/python-config @@ -0,0 +1,78 @@ +#!/Users/workdone0/Desktop/Hakathon/myenv/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/Application Code/Hackathon/myenv/bin/python2 b/Application Code/Hackathon/myenv/bin/python2 new file mode 120000 index 0000000..d8654aa --- /dev/null +++ b/Application Code/Hackathon/myenv/bin/python2 @@ -0,0 +1 @@ +python \ No newline at end of file diff --git a/Application Code/Hackathon/myenv/bin/python2.7 b/Application Code/Hackathon/myenv/bin/python2.7 new file mode 120000 index 0000000..d8654aa --- /dev/null +++ b/Application Code/Hackathon/myenv/bin/python2.7 @@ -0,0 +1 @@ +python \ No newline at end of file diff --git a/Application Code/Hackathon/myenv/bin/wheel b/Application Code/Hackathon/myenv/bin/wheel new file mode 100755 index 0000000..bff3e31 --- /dev/null +++ b/Application Code/Hackathon/myenv/bin/wheel @@ -0,0 +1,10 @@ +#!/Users/workdone0/Desktop/Hakathon/myenv/bin/python +# -*- coding: utf-8 -*- +import re +import sys + +from wheel.cli import main + +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/Application Code/Hackathon/myenv/include/python2.7 b/Application Code/Hackathon/myenv/include/python2.7 new file mode 120000 index 0000000..3fe034f --- /dev/null +++ b/Application Code/Hackathon/myenv/include/python2.7 @@ -0,0 +1 @@ +/System/Library/Frameworks/Python.framework/Versions/2.7/include/python2.7 \ No newline at end of file diff --git a/Application Code/Hackathon/myenv/lib/python2.7/LICENSE.txt b/Application Code/Hackathon/myenv/lib/python2.7/LICENSE.txt new file mode 120000 index 0000000..1a3e118 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/LICENSE.txt @@ -0,0 +1 @@ +/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/LICENSE.txt \ No newline at end of file diff --git a/Application Code/Hackathon/myenv/lib/python2.7/UserDict.py b/Application Code/Hackathon/myenv/lib/python2.7/UserDict.py new file mode 120000 index 0000000..b735f02 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/UserDict.py @@ -0,0 +1 @@ +/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/UserDict.py \ No newline at end of file diff --git a/Application Code/Hackathon/myenv/lib/python2.7/UserDict.pyc b/Application Code/Hackathon/myenv/lib/python2.7/UserDict.pyc new file mode 100644 index 0000000000000000000000000000000000000000..483771d93b6d7a4039886c104b1418c5a12be3ee GIT binary patch literal 11196 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 literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/_abcoll.py b/Application Code/Hackathon/myenv/lib/python2.7/_abcoll.py new file mode 120000 index 0000000..4a595bc --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/_abcoll.py @@ -0,0 +1 @@ +/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/_abcoll.py \ No newline at end of file diff --git a/Application Code/Hackathon/myenv/lib/python2.7/_abcoll.pyc b/Application Code/Hackathon/myenv/lib/python2.7/_abcoll.pyc new file mode 100644 index 0000000000000000000000000000000000000000..012b1169018470ed11f660ba191cb358e7ef2097 GIT binary patch literal 29114 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 jvux&$&s%?4<}Lp}18ZHyV-gAneY7v#mycD literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/codecs.py b/Application Code/Hackathon/myenv/lib/python2.7/codecs.py new file mode 120000 index 0000000..b18c8d6 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/codecs.py @@ -0,0 +1 @@ +/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/codecs.py \ No newline at end of file diff --git a/Application Code/Hackathon/myenv/lib/python2.7/codecs.pyc b/Application Code/Hackathon/myenv/lib/python2.7/codecs.pyc new file mode 100644 index 0000000000000000000000000000000000000000..736a6c42101211f9f8da386448d74caadd03ce7b GIT binary patch literal 39926 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 F`XA`f@s$7o literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/distutils/__init__.py b/Application Code/Hackathon/myenv/lib/python2.7/distutils/__init__.py new file mode 100644 index 0000000..b9b0f24 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/distutils/__init__.py @@ -0,0 +1,134 @@ +import os +import sys +import warnings + +# opcode is not a virtualenv module, so we can use it to find the stdlib +# Important! To work on pypy, this must be a module that resides in the +# lib-python/modified-x.y.z directory +import opcode + +dirname = os.path.dirname + +distutils_path = os.path.join(os.path.dirname(opcode.__file__), "distutils") +if os.path.normpath(distutils_path) == os.path.dirname(os.path.normpath(__file__)): + warnings.warn("The virtualenv distutils package at %s appears to be in the same location as the system distutils?") +else: + __path__.insert(0, distutils_path) # noqa: F821 + if sys.version_info < (3, 4): + import imp + + real_distutils = imp.load_module("_virtualenv_distutils", None, distutils_path, ("", "", imp.PKG_DIRECTORY)) + else: + import importlib.machinery + + distutils_path = os.path.join(distutils_path, "__init__.py") + loader = importlib.machinery.SourceFileLoader("_virtualenv_distutils", distutils_path) + if sys.version_info < (3, 5): + import types + + real_distutils = types.ModuleType(loader.name) + else: + import importlib.util + + spec = importlib.util.spec_from_loader(loader.name, loader) + real_distutils = importlib.util.module_from_spec(spec) + loader.exec_module(real_distutils) + + # Copy the relevant attributes + try: + __revision__ = real_distutils.__revision__ + except AttributeError: + pass + __version__ = real_distutils.__version__ + +from distutils import dist, sysconfig # isort:skip + +try: + basestring +except NameError: + basestring = str + +# patch build_ext (distutils doesn't know how to get the libs directory +# path on windows - it hardcodes the paths around the patched sys.prefix) + +if sys.platform == "win32": + from distutils.command.build_ext import build_ext as old_build_ext + + class build_ext(old_build_ext): + def finalize_options(self): + if self.library_dirs is None: + self.library_dirs = [] + elif isinstance(self.library_dirs, basestring): + self.library_dirs = self.library_dirs.split(os.pathsep) + + self.library_dirs.insert(0, os.path.join(sys.real_prefix, "Libs")) + old_build_ext.finalize_options(self) + + from distutils.command import build_ext as build_ext_module + + build_ext_module.build_ext = build_ext + +# distutils.dist patches: + +old_find_config_files = dist.Distribution.find_config_files + + +def find_config_files(self): + found = old_find_config_files(self) + if os.name == "posix": + user_filename = ".pydistutils.cfg" + else: + user_filename = "pydistutils.cfg" + user_filename = os.path.join(sys.prefix, user_filename) + if os.path.isfile(user_filename): + for item in list(found): + if item.endswith("pydistutils.cfg"): + found.remove(item) + found.append(user_filename) + return found + + +dist.Distribution.find_config_files = find_config_files + +# distutils.sysconfig patches: + +old_get_python_inc = sysconfig.get_python_inc + + +def sysconfig_get_python_inc(plat_specific=0, prefix=None): + if prefix is None: + prefix = sys.real_prefix + return old_get_python_inc(plat_specific, prefix) + + +sysconfig_get_python_inc.__doc__ = old_get_python_inc.__doc__ +sysconfig.get_python_inc = sysconfig_get_python_inc + +old_get_python_lib = sysconfig.get_python_lib + + +def sysconfig_get_python_lib(plat_specific=0, standard_lib=0, prefix=None): + if standard_lib and prefix is None: + prefix = sys.real_prefix + return old_get_python_lib(plat_specific, standard_lib, prefix) + + +sysconfig_get_python_lib.__doc__ = old_get_python_lib.__doc__ +sysconfig.get_python_lib = sysconfig_get_python_lib + +old_get_config_vars = sysconfig.get_config_vars + + +def sysconfig_get_config_vars(*args): + real_vars = old_get_config_vars(*args) + if sys.platform == "win32": + lib_dir = os.path.join(sys.real_prefix, "libs") + if isinstance(real_vars, dict) and "LIBDIR" not in real_vars: + real_vars["LIBDIR"] = lib_dir # asked for all + elif isinstance(real_vars, list) and "LIBDIR" in args: + real_vars = real_vars + [lib_dir] # asked for list + return real_vars + + +sysconfig_get_config_vars.__doc__ = old_get_config_vars.__doc__ +sysconfig.get_config_vars = sysconfig_get_config_vars diff --git a/Application Code/Hackathon/myenv/lib/python2.7/distutils/__init__.pyc b/Application Code/Hackathon/myenv/lib/python2.7/distutils/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b2c2b8245f7f66e5bc9b21974bf4d758ba2f1456 GIT binary patch literal 4275 zcmc&$OK%*<5w70lYsuw9d`PtEFzZ;9=vdm7CE2oMIS*ToZCGJ~kpkHhB!l5jFEzv6 zne|MQA`K}Q>0%)H134JE<~QWzzvLWp36OkW&FqqvPXR21*lAW*RabY{_MmFjOA|9^q6_*YFN!p}%w#2?c}d^6(L#IKF$y7+amBFTg#lj2W~=&2C_PF<2| zd5YyVd5X0&BT+-_4Ef{b6#>5LL$qI${BL4wlFUj}r?N@6jGdFDDba+kuZginl6i?% zWnU!!c677_@fXA{NU|u=G%tkRBK?thMtZO}A^x(Ye;+Mb5r1`b9NYlPjnR=;C0Uc? zEKTv$xW_rE_FdC`KQoov*2P~JyDrH~V$VtPGEdE2-X86;p}WA~E0X-E(t##zZi+4W zKNh=LEu@i_*k!%_@jR*IRqB@m zgA3wc5OWOgUlj8oJ%^>+y7b>%YF`)sqNo8l^QRIu)%QC!UTR+YZ^+=1_?N{*@abjg zA)1TwOysG^=l&(#3|ei~>L4PQ#C9aOB&mqqlH`gcZ;F3aq9rc!-xQ0V@&gbTB)KO3 zbw(6niq6P0xZ*9b*Clyd>{}A(2({pvD&G+Q9aS#%m*pAK@TS;zRR5;xV+#Ens((xT zcO_cUt#6BcSJiH-8m3UY#eMH>pG5)0|H0pmYk-X6!X3D{UlhBT-G69XhjH!>!oE!p zTVr8s7%VAv+4s5HRbwd|tX)A=3%;Un@!HJ=t z$Jj;UI)@1iZVf|lvSl#d(m^1_9K}JL#x4lj!{c}o^KDeGIIgC$-U8cnv$PlQIVwDg z(`#3^4Yhd1-GjIv1@_2!Q<#m>fb#e86=yJ@D$Ckup;qhq^;qe_Tz095`7r#q`ELjO?FI0lDbkO3^DsY#8}mZNJ6URB6YehJv~XeCEvLI- zVGEbXY3Z_J*pD4fFOn6GI5`a6!@>?7U514=cWRDoC6X*oaY?uY5oVNf8}@@?ZhP^O zo5wtZ&&Qs3OW^e4H0;M;+8`S;MT#;)jALQ@y>0v#9g0sub$*9Ei_W7g-;Z#GE1f&G z*mv2m^KrP3Gh}IJaEuh~;KH5ZF&S6eH#+0&>6}U$k2!V=UqKIvSu{N6bo2_nt4a4Y2$Vya1W%AGKrb|> zvU8kgvOK9tI>qJzf>Ly&QN}&ihIGQ87IKW_f0d(ag3CWPoZk7vmOQD;W2|h@5H&)| z(3HT$)O-;Neh9IW`q8`1M9i)*a?*WoePrz-}Vhk8NNrWFdMIA5oz1!afv*76j8M|m2wJEcX%v}M! zYL-lw`ND6UC|j5y9DoTz(|VOC$QXnP#fk)i6sS_7+fI3XLZtfBTLIle@Wzz)BR}y4G)3_=k^y^U+U?*GXF~T zkdjjZ8cI;zGja~wLKQ~^s{#;@eYPs#-9iiX?kDfx`NZ312XoBNQEFBwafoL~2?nfo z=4LO;2MQaf(1Hs+HNoVF;;!>HL6q=MR+#S<`c}{`Mx)vU;YxPW7ntBLVe{`M_^FG1 zNg*+>tp9bhVdn9z7_G*WN7Sh)9k~4-hSCKJll07^Fi+9zOP^-LZWfhjs@KF76Ga)-dQ2VwVNoZ9?Y12^XD>_kTQ-OCR0 zuKg9RbQk;LDMQrY5kP9j9S`vqVt)Ku`~H2*y$v3V_a9qs^PQ~OsRS((2ZLUo4T8!X zlZi}y@Kmn|l`E6)BzuG~SxTV!iSXI#s!XLOkuf4n@4i*n{nEHW&b++T(|rK8d|mYBKuY)6{#6wNIb>4qB|9 z6DRlBc)XWsg&zBE>+mj6$QsgQ3xX)?R#!cxNW^@dif>Sn8ARc!V({9OUdM1!j!OOD zy_gw(yNuA!`1mh+7}#Q(lg(PQcHUeuOSL6FBWo8iUo&e;uYqQJp0C$Yrt@Y34f|}Z mZe~EwPA+22+1aI9bD~*qEH)<^^~I?sG#d5g>VIRdY5og<)x8n` literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/distutils/distutils.cfg b/Application Code/Hackathon/myenv/lib/python2.7/distutils/distutils.cfg new file mode 100644 index 0000000..1af230e --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.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/Application Code/Hackathon/myenv/lib/python2.7/encodings b/Application Code/Hackathon/myenv/lib/python2.7/encodings new file mode 120000 index 0000000..8732f85 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/encodings @@ -0,0 +1 @@ +/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/encodings \ No newline at end of file diff --git a/Application Code/Hackathon/myenv/lib/python2.7/fnmatch.py b/Application Code/Hackathon/myenv/lib/python2.7/fnmatch.py new file mode 120000 index 0000000..49b6bc0 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/fnmatch.py @@ -0,0 +1 @@ +/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/fnmatch.py \ No newline at end of file diff --git a/Application Code/Hackathon/myenv/lib/python2.7/fnmatch.pyc b/Application Code/Hackathon/myenv/lib/python2.7/fnmatch.pyc new file mode 100644 index 0000000000000000000000000000000000000000..01e4af6eeee3cf8da6a2de220d70d3dd8ce1bd8d GIT binary patch literal 3812 zcmb_e&u<(>7Jk)Zk3AFHF-aEN0z_pc*h!R(R~+^S3Ir33h<0P4wxb}&-chH!#?zjj z?r~R5>_PSkBrZrC_ydsOggA2M%8d&WH*Wb8xbN=wUiY*I#7cXx?Jn1k_g+=K_r0%P z?U%*o58r>kA5!@gvjLijXcw)b$fHEjE;==eW+iWa2PV4K^mMc(QwMf7f*m^2s|JqTRbi_-&r9J`*jJ(DDQ z7&vG0)V7<=ZYlz;cklmmb8F+l<}LmH#?H>BzjdR~G*$;;nB@_haG7>JqmwKQ5*=pg zQ~xj7gmLEbbc!`xWQC(#BLQ?8qU+Y?{t*m-f8A0r_r%%-)P4F!Oxbf zBV^q;K|tIbcZ-0yOXq#|m}_7>@rQ|lB&slmaML|}c8O((4i$Ywq=2*SmdEoeERdKW z7ne-DC{EfE2{}YZCfqE9Ll$nKL+6cs3&Zt?*5r2mILrG{mYP4Wzhi9QWyAINf_~t7 zS-L(LoAl{=5_Fvb_JGC*xx9to^`GL8Hp5^0_7xKSa`N>V*z@W?%qBD<9 zJ-*c;Iz%5SI-{u>+!iy6T#Z*xG2~2ObM`y9X2)2kk9!7a$n^x~6}TsXYBn`~-Y*kF z2f5J?)A*!J80*G~dA*Ri$%6Qiyg^*eQgK|0nJiwUsU3-TaDphfVp zHAnkXc37~I-~_>XA$YxzoNPD|6hxJBBDj%4Ep{=I6FC%T5nHKl92XD--a|;VMdR%Z zoKQ&wX*9`xaX>fD;W|d&?KH~=K@xvxBGHSxf}|oYx|fTY3ZzC{gi0NTbj%a-_v9>KG)Mb=(Jpdu|>bJ{KGCc~N36>&$$B zg9!SZRTm6npHprXpXEc)@`Ad8Ux6{_DW{OYcnxyXFs`WotVRa__Kd(7*ambbFdi=v z?ttOi*(^Ouw`m3`*>6(*IVq)(K&51zz!#7N_~DBFEahV!9yTQTQ#hNN3d6>=xgwmFWf4SvZE&;JDn8(OJV?!pQUXq z2Chgd#%PHPCOnC+(Bm+(@d-o2=cxD`315)I!+)6ZW}auc&#(||;DHpi&V!8)?rq$A zZ`0?v3CuwDjGFTC5K5Hn6Z#5IKzMmpvY>pj}nh3e>WjD%2ihz$g?l zT?6|TC{%*NP*4aWF7R4oUqX^mI3p;$FHg{Hg~B==0!Xz2g<|p!ObQAC6~IiCks1BQ z>>D<6$5QjZ^l$n)&&2I(0 zIq2pGqX7_tB8g3IwK!Y?C!dQffsrrxyUas&p1;h^bKG!%;SZuMyplp+67B*e&$9%- z$rl}cCc#a7mJdR6zm9vzoW-bS5Z=RQzbV*><18`o@Q5NbC?r8oC!Z*U81HT$ko{5> zFY6jJmQ<}PkVO(lh`C4kLk=*i*cB)qy(kNHSx9AJZh8S+1&vSHI@kzIRPOOLp8~@* z6uT^eF$&)rRKZ!YQVRZ92{uI#<7vT@n^Q*rJuO?K9OFv%=qK<{u|3FhRq+)r6({|o zyf2ooqwYYB9W8QMaR&A+^>KZa<6!CXxO*yElBpWKyaKuOrAlB)jyYB^107k!vv8SR zgK^iR=S#OClM40}Rxh3Th|jf5E88tbmhGb1DeGbbgclWkS;laMUe(1@1!|QS26c@T z0(gv3UuXJgl%dwfYZ=_GijNZVF?QlyCW;w4j+>iOv9)i?;I6c7X&*~_UD|yS+IwtS zW3L$O$;!Vh^WrP^@hf)UG8XrCTXzTcMv)<$O~Sjm874t!B%g#njSYjLX|aZ+kQj@l zO(m108%ld9bZy>x7&;AV!)vtnGFRLbg7ldD#RqN_S^!a-ktc!VX4eQJ5 zIed%is<)zqNaUKGPLze6PH|1XTc;Bw2_~30e4!O~mlPX5IwVz&FwgnTq<1m3`8>9` gGsvP*V&3HE%rcABy#?=zS66kfG1K@%W3{pTU;XTJ9smFU literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/genericpath.py b/Application Code/Hackathon/myenv/lib/python2.7/genericpath.py new file mode 120000 index 0000000..7843bce --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/genericpath.py @@ -0,0 +1 @@ +/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/genericpath.py \ No newline at end of file diff --git a/Application Code/Hackathon/myenv/lib/python2.7/genericpath.pyc b/Application Code/Hackathon/myenv/lib/python2.7/genericpath.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b1649daa5c477e8a5cb72c81cc142d9f565d89ff GIT binary patch literal 3880 zcmcInTW=dh6h6DYq;`_#Mkxg$MiB@X6`S^fKD1n$wp2m|t&36uWwqHECmZkXY6Mo8+P+W=SqNVvgjp zBj!o2IN~hHmmIM`@|+_US?+%4Wme~BbnP!AyDfB~%E%@!86+`|$x*6|NU}ng77Ub#ilWp-nM78# z2ctZ$ZW@$2!*XIKM|f*yRJyB7x1Icr&s{qQ5i5y`QVo(l+r)(0ON=#^-Lj=D3- z?WM_PuNd>hmG0HvmdaI`#07SAi*dlBEHg)zpy|adBRAIS2AX*n-FS&C(T+#^fRRVu zdVY@TJmWjGbr@~7M*aJ?4jk}tC*VD0ta!Ao;Db^`g0B>no#Em@*-;5>+=^28exOUS zS?Zz6g&Aj?I)&5IBp;d%3u0L~ZNMFz;T&gkRhGa4FFO`)@m@Jn?tVAo3y%zUayDZH z&$B4(Bl2tBlDFtJD%-K7hqk+h!Fc5f+Z}j#s83k$og?dcv{R>j^bI!i#FB4;$+Ij8 zj7OqWTcb281%s}`I1XmHV~7Xy+?_>d8Ls{CPCvML+tJ1{u#`hxu*f@DY-3NuSbX;? zbDtV(kp5b%Sk zo~*-qu)<@ssyjKLu|vCP&$1og%wBVk)cNq(3&q2npyx8SObvpl$q`HF0g%IpxdeM~ zKvhy~j)gW|eq5c4-A;{99U^Ip89rRSE{+<^fNgpjit`J)isqsc`G-;IKPb%hIHqtK zAqD~LoJL$W5*)z)zX@1lel~pC*&yHua2mREkYgA>hwdNX*wea4ajXmw{~}tuba=X2 zvu8hfKCSuKF|CoSBN^F9#3(biP;I=3<}UZ2uIBvKZat+r(fDv4vd8Ha=#g0i;m#Ro|5XG=S8IoH_h?l`?p(Y^8 zlDztk_G}Adm5(y63{{odIgVvj{<&OzU4dFCsazkQ#tQ>?`W(%0*d)J6b#D%T7m%3d zyqN9IubpMTfo6V32b1rhch+T_`c%F@o%Gq{2My;9EFpKp^mWP)Pu1LpChg!wYZ`yXz-6Zj#{XCcQC0V8=3!Ud7Re-=Uar*PsCB zC1-W>8wBnbX;Kx+YR{_Npbi(VIIik24&2>#Ti|o^a2*we+Epb=MfT^Ul!m`Kgh~|Y z$eQebmCH*a*~)c^ZH~nh0@!4Zm3FJ0Qfqq&dDdQBy~bZ6i^gITEV9Cmy9xU_cnw{Z zOd0j%AjxI$I?u5a90&@BAEOFaVMnQ*lHkZBZ^ZYVTw;Q=R<)%X^CIM`23!(N^Ol?G zVB&W!Ny3Iu669@@^PL zX^P(iTt`iQP`IMqU2_+1yy@y-E*13V4t_ud&Z@jUa0MY-HDFK&9Ag89b$~_zSN2Ex vJL<$r7w41f)vuQiSpu_)uF3BV`Y+UKUfY|mz1nEaw&q%`R>S=@TTA}{C1Hg| literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/lib-dynload b/Application Code/Hackathon/myenv/lib/python2.7/lib-dynload new file mode 120000 index 0000000..24c555e --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/lib-dynload @@ -0,0 +1 @@ +/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload \ No newline at end of file diff --git a/Application Code/Hackathon/myenv/lib/python2.7/linecache.py b/Application Code/Hackathon/myenv/lib/python2.7/linecache.py new file mode 120000 index 0000000..1f79a61 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/linecache.py @@ -0,0 +1 @@ +/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/linecache.py \ No newline at end of file diff --git a/Application Code/Hackathon/myenv/lib/python2.7/linecache.pyc b/Application Code/Hackathon/myenv/lib/python2.7/linecache.pyc new file mode 100644 index 0000000000000000000000000000000000000000..960cfd64cb6523cda5f6a1729ce611865fec12f3 GIT binary patch literal 3470 zcmb_f&2Ae<60V-%k2oeRSxRiv8wBkDi!gvJ1<4@@B0I@OLE^(I$uNcl!(L*#ND4{81J@%ssyouiA1o}yP2dz31A3ZkMtdg@W^Q(U9CPGg^*g2qgPegs>c5~8R< zag%<8gr+QQ$kK+;EumXN2SNu-_j@<^ z;vr9f1AKS8eYPUJ*6*>%qeNBmhHfUriTCzCz$i0fjJaQ!ldQiQBMrPHI!Za&%Dsg3I+EB4*&U8E zcOjzXEE)gV%<`iAyeRS_WZQ_RLXNJG9em}5>xv%^<@;!s!<+NPEaz6rBJC zmJK><(9|dUZ^?8Fn>;KYtxslNe2@8JRW3Y%W`~I#MnznCUR;>~5e2NG!svYAbUxA? z3RPJ2E`gO15l}Up0yh`)9AN9Ip3AY2R7B>=5uFgK@;u!hV~!PFv68K%N5%v^sAu@?Ji zR-@w>+VnV%YFb+h^VG|Q%Q<%f{zuEs2XAaRf^wUr}#toAG2-y5&xVC zS|bLEk7bC$iNKQ~XE!(yNmt<_Yp4XrnNu}bgc0Ev0D@vhgcCL%C=_E59Igin1VRS2 znZpdBh~s?fBH-W%gcB-u+@cpgtuU<1h9>vr7A<9lw{76KJBZE}p=d!VKJ+&Z(DM(~ z$r5F}C28|J@r{w~n8G&9VhsAM&6#xge2Z2sTB6c7=+0j}Iu8^=dQ@AR<)Er{T|5-J z{qq9_D{(q>=;7u~H`Jxya%i98}E`le;lOuUm_3mQ6!W-TId?}p0 zNZdq(;Uy@8kW*1`K_KU=zSJIslpG;*I112Ig#65qBK24vi4|iLlaIfu3Kk=eT+YtZ zL>_Y$Eb$XiU@5WDY4wV-06#{-vmB;locgw$n@ZwMj6TJA$?3vXQ{gQZ%5j{ZH&SlbUo4JWvLAB@B#y#=zAL3>ZQhFuAXdS-|!9Q;stRCfZpOIL zTp%@k9dvjb-StB$zX`rXv(L~`y{!WEM^*DG2<@nbzl|qeptb?9J|J}mYi%D*J@B?` z+Zb*6zUrzSuZi_dRR_<8w*h(^P~5@z9`@{jmj4Z+;b0Kw!@(eAWh5HbvnXGfWv9y{ xQzA*;Bq3WWWP^l!-76yqbxjWwaoR!kj()^Wwe0AI6c&`1py9Wg?VIiH{{bwx_Y(jB literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/locale.py b/Application Code/Hackathon/myenv/lib/python2.7/locale.py new file mode 120000 index 0000000..cc8a5a7 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/locale.py @@ -0,0 +1 @@ +/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/locale.py \ No newline at end of file diff --git a/Application Code/Hackathon/myenv/lib/python2.7/locale.pyc b/Application Code/Hackathon/myenv/lib/python2.7/locale.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5664dc4f8e0360c102bfc5bb592f048dfcf5f67d GIT binary patch literal 57666 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 F^c`vp-&_Cy literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/no-global-site-packages.txt b/Application Code/Hackathon/myenv/lib/python2.7/no-global-site-packages.txt new file mode 100644 index 0000000..e69de29 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/ntpath.py b/Application Code/Hackathon/myenv/lib/python2.7/ntpath.py new file mode 120000 index 0000000..af0bbe7 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/ntpath.py @@ -0,0 +1 @@ +/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ntpath.py \ No newline at end of file diff --git a/Application Code/Hackathon/myenv/lib/python2.7/ntpath.pyc b/Application Code/Hackathon/myenv/lib/python2.7/ntpath.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9e45d2309722bbd7ab92f50bdf82e6a98e70b08a GIT binary patch literal 13855 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

FOR|^%<~wD#{vRNlBBL7d4ZxQQPhPt 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 literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/posixpath.py b/Application Code/Hackathon/myenv/lib/python2.7/posixpath.py new file mode 120000 index 0000000..cc89aa2 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/posixpath.py @@ -0,0 +1 @@ +/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/posixpath.py \ No newline at end of file diff --git a/Application Code/Hackathon/myenv/lib/python2.7/posixpath.pyc b/Application Code/Hackathon/myenv/lib/python2.7/posixpath.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a0ff577d812b9ff84ef50d5201fbc4fca1d341ba GIT binary patch literal 12221 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 literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/re.py b/Application Code/Hackathon/myenv/lib/python2.7/re.py new file mode 120000 index 0000000..b1a8e65 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/re.py @@ -0,0 +1 @@ +/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/re.py \ No newline at end of file diff --git a/Application Code/Hackathon/myenv/lib/python2.7/re.pyc b/Application Code/Hackathon/myenv/lib/python2.7/re.pyc new file mode 100644 index 0000000000000000000000000000000000000000..badbb6d9ade0857cda018f03d8a98194ff65a334 GIT binary patch literal 14106 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 literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip-20.0.2.dist-info/INSTALLER b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip-20.0.2.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip-20.0.2.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip-20.0.2.dist-info/INSTALLER 2 b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip-20.0.2.dist-info/INSTALLER 2 new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip-20.0.2.dist-info/INSTALLER 2 @@ -0,0 +1 @@ +pip diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip-20.0.2.dist-info/LICENSE 2.txt b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip-20.0.2.dist-info/LICENSE 2.txt new file mode 100644 index 0000000..737fec5 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip-20.0.2.dist-info/LICENSE 2.txt @@ -0,0 +1,20 @@ +Copyright (c) 2008-2019 The pip developers (see AUTHORS.txt file) + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip-20.0.2.dist-info/LICENSE.txt b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip-20.0.2.dist-info/LICENSE.txt new file mode 100644 index 0000000..737fec5 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip-20.0.2.dist-info/LICENSE.txt @@ -0,0 +1,20 @@ +Copyright (c) 2008-2019 The pip developers (see AUTHORS.txt file) + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip-20.0.2.dist-info/METADATA b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip-20.0.2.dist-info/METADATA new file mode 100644 index 0000000..5183c4e --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip-20.0.2.dist-info/METADATA @@ -0,0 +1,84 @@ +Metadata-Version: 2.1 +Name: pip +Version: 20.0.2 +Summary: The PyPA recommended tool for installing Python packages. +Home-page: https://pip.pypa.io/ +Author: The pip developers +Author-email: pypa-dev@groups.google.com +License: MIT +Project-URL: Documentation, https://pip.pypa.io +Project-URL: Source, https://github.com/pypa/pip +Keywords: distutils easy_install egg setuptools wheel virtualenv +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: Topic :: Software Development :: Build Tools +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.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: 3.7 +Classifier: Programming Language :: Python :: 3.8 +Classifier: Programming Language :: Python :: Implementation :: CPython +Classifier: Programming Language :: Python :: Implementation :: PyPy +Requires-Python: >=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.* + +pip - The Python Package Installer +================================== + +.. image:: https://img.shields.io/pypi/v/pip.svg + :target: https://pypi.org/project/pip/ + +.. image:: https://readthedocs.org/projects/pip/badge/?version=latest + :target: https://pip.pypa.io/en/latest + +pip is the `package installer`_ for Python. You can use pip to install packages from the `Python Package Index`_ and other indexes. + +Please take a look at our documentation for how to install and use pip: + +* `Installation`_ +* `Usage`_ + +Updates are released regularly, with a new version every 3 months. More details can be found in our documentation: + +* `Release notes`_ +* `Release process`_ + +If you find bugs, need help, or want to talk to the developers please use our mailing lists or chat rooms: + +* `Issue tracking`_ +* `Discourse channel`_ +* `User IRC`_ + +If you want to get involved head over to GitHub to get the source code, look at our development documentation and feel free to jump on the developer mailing lists and chat rooms: + +* `GitHub page`_ +* `Dev documentation`_ +* `Dev mailing list`_ +* `Dev IRC`_ + +Code of Conduct +--------------- + +Everyone interacting in the pip project's codebases, issue trackers, chat +rooms, and mailing lists is expected to follow the `PyPA Code of Conduct`_. + +.. _package installer: https://packaging.python.org/guides/tool-recommendations/ +.. _Python Package Index: https://pypi.org +.. _Installation: https://pip.pypa.io/en/stable/installing.html +.. _Usage: https://pip.pypa.io/en/stable/ +.. _Release notes: https://pip.pypa.io/en/stable/news.html +.. _Release process: https://pip.pypa.io/en/latest/development/release-process/ +.. _GitHub page: https://github.com/pypa/pip +.. _Dev documentation: https://pip.pypa.io/en/latest/development +.. _Issue tracking: https://github.com/pypa/pip/issues +.. _Discourse channel: https://discuss.python.org/c/packaging +.. _Dev mailing list: https://groups.google.com/forum/#!forum/pypa-dev +.. _User IRC: https://webchat.freenode.net/?channels=%23pypa +.. _Dev IRC: https://webchat.freenode.net/?channels=%23pypa-dev +.. _PyPA Code of Conduct: https://www.pypa.io/en/latest/code-of-conduct/ + + diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip-20.0.2.dist-info/METADATA 2 b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip-20.0.2.dist-info/METADATA 2 new file mode 100644 index 0000000..5183c4e --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip-20.0.2.dist-info/METADATA 2 @@ -0,0 +1,84 @@ +Metadata-Version: 2.1 +Name: pip +Version: 20.0.2 +Summary: The PyPA recommended tool for installing Python packages. +Home-page: https://pip.pypa.io/ +Author: The pip developers +Author-email: pypa-dev@groups.google.com +License: MIT +Project-URL: Documentation, https://pip.pypa.io +Project-URL: Source, https://github.com/pypa/pip +Keywords: distutils easy_install egg setuptools wheel virtualenv +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: Topic :: Software Development :: Build Tools +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.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: 3.7 +Classifier: Programming Language :: Python :: 3.8 +Classifier: Programming Language :: Python :: Implementation :: CPython +Classifier: Programming Language :: Python :: Implementation :: PyPy +Requires-Python: >=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.* + +pip - The Python Package Installer +================================== + +.. image:: https://img.shields.io/pypi/v/pip.svg + :target: https://pypi.org/project/pip/ + +.. image:: https://readthedocs.org/projects/pip/badge/?version=latest + :target: https://pip.pypa.io/en/latest + +pip is the `package installer`_ for Python. You can use pip to install packages from the `Python Package Index`_ and other indexes. + +Please take a look at our documentation for how to install and use pip: + +* `Installation`_ +* `Usage`_ + +Updates are released regularly, with a new version every 3 months. More details can be found in our documentation: + +* `Release notes`_ +* `Release process`_ + +If you find bugs, need help, or want to talk to the developers please use our mailing lists or chat rooms: + +* `Issue tracking`_ +* `Discourse channel`_ +* `User IRC`_ + +If you want to get involved head over to GitHub to get the source code, look at our development documentation and feel free to jump on the developer mailing lists and chat rooms: + +* `GitHub page`_ +* `Dev documentation`_ +* `Dev mailing list`_ +* `Dev IRC`_ + +Code of Conduct +--------------- + +Everyone interacting in the pip project's codebases, issue trackers, chat +rooms, and mailing lists is expected to follow the `PyPA Code of Conduct`_. + +.. _package installer: https://packaging.python.org/guides/tool-recommendations/ +.. _Python Package Index: https://pypi.org +.. _Installation: https://pip.pypa.io/en/stable/installing.html +.. _Usage: https://pip.pypa.io/en/stable/ +.. _Release notes: https://pip.pypa.io/en/stable/news.html +.. _Release process: https://pip.pypa.io/en/latest/development/release-process/ +.. _GitHub page: https://github.com/pypa/pip +.. _Dev documentation: https://pip.pypa.io/en/latest/development +.. _Issue tracking: https://github.com/pypa/pip/issues +.. _Discourse channel: https://discuss.python.org/c/packaging +.. _Dev mailing list: https://groups.google.com/forum/#!forum/pypa-dev +.. _User IRC: https://webchat.freenode.net/?channels=%23pypa +.. _Dev IRC: https://webchat.freenode.net/?channels=%23pypa-dev +.. _PyPA Code of Conduct: https://www.pypa.io/en/latest/code-of-conduct/ + + diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip-20.0.2.dist-info/RECORD b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip-20.0.2.dist-info/RECORD new file mode 100644 index 0000000..04cb791 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip-20.0.2.dist-info/RECORD @@ -0,0 +1,704 @@ +../../../bin/pip,sha256=FOR8B20lehN56Rfo0OU8AjdVD4X6T6KCHIbAGpfcLvM,258 +../../../bin/pip2,sha256=FOR8B20lehN56Rfo0OU8AjdVD4X6T6KCHIbAGpfcLvM,258 +../../../bin/pip2.7,sha256=FOR8B20lehN56Rfo0OU8AjdVD4X6T6KCHIbAGpfcLvM,258 +pip-20.0.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +pip-20.0.2.dist-info/LICENSE.txt,sha256=W6Ifuwlk-TatfRU2LR7W1JMcyMj5_y1NkRkOEJvnRDE,1090 +pip-20.0.2.dist-info/METADATA,sha256=MSgjT2JTt8usp4Hopp5AGEmc-7sKR2Jd7HTMJqCoRhw,3352 +pip-20.0.2.dist-info/RECORD,, +pip-20.0.2.dist-info/WHEEL,sha256=8zNYZbwQSXoB9IfXOjPfeNwvAsALAjffgk27FqvCWbo,110 +pip-20.0.2.dist-info/entry_points.txt,sha256=HtfDOwpUlr9s73jqLQ6wF9V0_0qvUXJwCBz7Vwx0Ue0,125 +pip-20.0.2.dist-info/top_level.txt,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +pip/__init__.py,sha256=U1AM82iShMaw90K6Yq0Q2-AZ1EsOcqQLQRB-rxwFtII,455 +pip/__init__.pyc,, +pip/__main__.py,sha256=NM95x7KuQr-lwPoTjAC0d_QzLJsJjpmAoxZg0mP8s98,632 +pip/__main__.pyc,, +pip/_internal/__init__.py,sha256=j5fiII6yCeZjpW7_7wAVRMM4DwE-gyARGVU4yAADDeE,517 +pip/_internal/__init__.pyc,, +pip/_internal/build_env.py,sha256=--aNgzIdYrCOclHMwoAdpclCpfdFE_jooRuCy5gczwg,7532 +pip/_internal/build_env.pyc,, +pip/_internal/cache.py,sha256=16GrnDRLBQNlfKWIuIF6Sa-EFS78kez_w1WEjT3ykTI,11605 +pip/_internal/cache.pyc,, +pip/_internal/cli/__init__.py,sha256=FkHBgpxxb-_gd6r1FjnNhfMOzAUYyXoXKJ6abijfcFU,132 +pip/_internal/cli/__init__.pyc,, +pip/_internal/cli/autocompletion.py,sha256=ekGNtcDI0p7rFVc-7s4T9Tbss4Jgb7vsB649XJIblRg,6547 +pip/_internal/cli/autocompletion.pyc,, +pip/_internal/cli/base_command.py,sha256=v6yl5XNRqye8BT9ep8wvpMu6lylP_Hu6D95r_HqbpbQ,7948 +pip/_internal/cli/base_command.pyc,, +pip/_internal/cli/cmdoptions.py,sha256=pppqSTy3R7YLFqSRLdVmwwO6ZIvQ1MmWYHPaXr4wvuI,28115 +pip/_internal/cli/cmdoptions.pyc,, +pip/_internal/cli/command_context.py,sha256=ygMVoTy2jpNilKT-6416gFSQpaBtrKRBbVbi2fy__EU,975 +pip/_internal/cli/command_context.pyc,, +pip/_internal/cli/main.py,sha256=8iq3bHe5lxJTB2EvKOqZ38NS0MmoS79_S1kgj4QuH8A,2610 +pip/_internal/cli/main.pyc,, +pip/_internal/cli/main_parser.py,sha256=W9OWeryh7ZkqELohaFh0Ko9sB98ZkSeDmnYbOZ1imBc,2819 +pip/_internal/cli/main_parser.pyc,, +pip/_internal/cli/parser.py,sha256=O9djTuYQuSfObiY-NU6p4MJCfWsRUnDpE2YGA_fwols,9487 +pip/_internal/cli/parser.pyc,, +pip/_internal/cli/req_command.py,sha256=pAUAglpTn0mUA6lRs7KN71yOm1KDabD0ySVTQTqWTSA,12463 +pip/_internal/cli/req_command.pyc,, +pip/_internal/cli/status_codes.py,sha256=F6uDG6Gj7RNKQJUDnd87QKqI16Us-t-B0wPF_4QMpWc,156 +pip/_internal/cli/status_codes.pyc,, +pip/_internal/commands/__init__.py,sha256=uTSj58QlrSKeXqCUSdL-eAf_APzx5BHy1ABxb0j5ZNE,3714 +pip/_internal/commands/__init__.pyc,, +pip/_internal/commands/check.py,sha256=mgLNYT3bd6Kmynwh4zzcBmVlFZ-urMo40jTgk6U405E,1505 +pip/_internal/commands/check.pyc,, +pip/_internal/commands/completion.py,sha256=UFQvq0Q4_B96z1bvnQyMOq82aPSu05RejbLmqeTZjC0,2975 +pip/_internal/commands/completion.pyc,, +pip/_internal/commands/configuration.py,sha256=6riioZjMhsNSEct7dE-X8SobGodk3WERKJvuyjBje4Q,7226 +pip/_internal/commands/configuration.pyc,, +pip/_internal/commands/debug.py,sha256=a8llax2hRkxgK-tvwdJgaCaZCYPIx0fDvrlMDoYr8bQ,4209 +pip/_internal/commands/debug.pyc,, +pip/_internal/commands/download.py,sha256=zX_0-IeFb4C8dxSmGHxk-6H5kehtyTSsdWpjNpAhSww,5007 +pip/_internal/commands/download.pyc,, +pip/_internal/commands/freeze.py,sha256=G9I_yoBHlpWLX1qItsWNOmmqc8ET7pekFybdbV333d4,3464 +pip/_internal/commands/freeze.pyc,, +pip/_internal/commands/hash.py,sha256=47teimfAPhpkaVbSDaafck51BT3XXYuL83lAqc5lOcE,1735 +pip/_internal/commands/hash.pyc,, +pip/_internal/commands/help.py,sha256=Nhecq--ydFn80Gm1Zvbf9943EcRJfO0TnXUhsF0RO7s,1181 +pip/_internal/commands/help.pyc,, +pip/_internal/commands/install.py,sha256=WYv_h_pIcO7i-Iur2Y84GfzOEB5UJmQ-xY74ZJwA8dw,26252 +pip/_internal/commands/install.pyc,, +pip/_internal/commands/list.py,sha256=RqjYu3-Bo_mdh5BYbq1zBU_WTz2C8H8S2Z0_1EG7GXA,10563 +pip/_internal/commands/list.pyc,, +pip/_internal/commands/search.py,sha256=7Il8nKZ9mM7qF5jlnBoPvSIFY9f-0-5IbYoX3miTuZY,5148 +pip/_internal/commands/search.pyc,, +pip/_internal/commands/show.py,sha256=Vzsj2oX0JBl94MPyF3LV8YoMcigl8B2UsMM8zp0pH2s,6792 +pip/_internal/commands/show.pyc,, +pip/_internal/commands/uninstall.py,sha256=8mldFbrQecSoWDZRqxBgJkrlvx6Y9Iy7cs-2BIgtXt4,2983 +pip/_internal/commands/uninstall.pyc,, +pip/_internal/commands/wheel.py,sha256=TMU5ZhjLo7BIZQApGPsYfoCsbGTnvP-N9jkgPJXhj1Y,7170 +pip/_internal/commands/wheel.pyc,, +pip/_internal/configuration.py,sha256=MgKrLFBJBkF3t2VJM4tvlnEspfSuS4scp_LhHWh53nY,14222 +pip/_internal/configuration.pyc,, +pip/_internal/distributions/__init__.py,sha256=ECBUW5Gtu9TjJwyFLvim-i6kUMYVuikNh9I5asL6tbA,959 +pip/_internal/distributions/__init__.pyc,, +pip/_internal/distributions/base.py,sha256=ruprpM_L2T2HNi3KLUHlbHimZ1sWVw-3Q0Lb8O7TDAI,1425 +pip/_internal/distributions/base.pyc,, +pip/_internal/distributions/installed.py,sha256=YqlkBKr6TVP1MAYS6SG8ojud21wVOYLMZ8jMLJe9MSU,760 +pip/_internal/distributions/installed.pyc,, +pip/_internal/distributions/sdist.py,sha256=D4XTMlCwgPlK69l62GLYkNSVTVe99fR5iAcVt2EbGok,4086 +pip/_internal/distributions/sdist.pyc,, +pip/_internal/distributions/wheel.py,sha256=95uD-TfaYoq3KiKBdzk9YMN4RRqJ28LNoSTS2K46gek,1294 +pip/_internal/distributions/wheel.pyc,, +pip/_internal/exceptions.py,sha256=6YRuwXAK6F1iyUWKIkCIpWWN2khkAn1sZOgrFA9S8Ro,10247 +pip/_internal/exceptions.pyc,, +pip/_internal/index/__init__.py,sha256=vpt-JeTZefh8a-FC22ZeBSXFVbuBcXSGiILhQZJaNpQ,30 +pip/_internal/index/__init__.pyc,, +pip/_internal/index/collector.py,sha256=YS7Ix4oylU7ZbPTPFugh-244GSRqMvdHsGUG6nmz2gE,17892 +pip/_internal/index/collector.pyc,, +pip/_internal/index/package_finder.py,sha256=2Rg75AOpLj8BN1jyL8EI-Iw-Hv6ibJkrYVARCht3bX8,37542 +pip/_internal/index/package_finder.pyc,, +pip/_internal/legacy_resolve.py,sha256=L7R72I7CjVgJlPTggmA1j4b-H8NmxNu_dKVhrpGXGps,16277 +pip/_internal/legacy_resolve.pyc,, +pip/_internal/locations.py,sha256=VifFEqhc7FWFV8QGoEM3CpECRY8Doq7kTytytxsEgx0,6734 +pip/_internal/locations.pyc,, +pip/_internal/main.py,sha256=IVBnUQ-FG7DK6617uEXRB5_QJqspAsBFmTmTesYkbdQ,437 +pip/_internal/main.pyc,, +pip/_internal/models/__init__.py,sha256=3DHUd_qxpPozfzouoqa9g9ts1Czr5qaHfFxbnxriepM,63 +pip/_internal/models/__init__.pyc,, +pip/_internal/models/candidate.py,sha256=Y58Bcm6oXUj0iS-yhmerlGo5CQJI2p0Ww9h6hR9zQDw,1150 +pip/_internal/models/candidate.pyc,, +pip/_internal/models/format_control.py,sha256=ICzVjjGwfZYdX-eLLKHjMHLutEJlAGpfj09OG_eMqac,2673 +pip/_internal/models/format_control.pyc,, +pip/_internal/models/index.py,sha256=K59A8-hVhBM20Xkahr4dTwP7OjkJyEqXH11UwHFVgqM,1060 +pip/_internal/models/index.pyc,, +pip/_internal/models/link.py,sha256=y0H2ZOk0P6d1lfGUL2Pl09xFgZcRt5HwN2LElMifOpI,6827 +pip/_internal/models/link.pyc,, +pip/_internal/models/scheme.py,sha256=vvhBrrno7eVDXcdKHiZWwxhPHf4VG5uSCEkC0QDR2RU,679 +pip/_internal/models/scheme.pyc,, +pip/_internal/models/search_scope.py,sha256=2LXbU4wV8LwqdtXQXNXFYKv-IxiDI_QwSz9ZgbwtAfk,3898 +pip/_internal/models/search_scope.pyc,, +pip/_internal/models/selection_prefs.py,sha256=rPeif2KKjhTPXeMoQYffjqh10oWpXhdkxRDaPT1HO8k,1908 +pip/_internal/models/selection_prefs.pyc,, +pip/_internal/models/target_python.py,sha256=c-cFi6zCuo5HYbXNS3rVVpKRaHVh5yQlYEjEW23SidQ,3799 +pip/_internal/models/target_python.pyc,, +pip/_internal/models/wheel.py,sha256=6KLuLKH5b0C5goWQXGSISRaq2UZtkHUEAU1y1Zsrwms,2766 +pip/_internal/models/wheel.pyc,, +pip/_internal/network/__init__.py,sha256=jf6Tt5nV_7zkARBrKojIXItgejvoegVJVKUbhAa5Ioc,50 +pip/_internal/network/__init__.pyc,, +pip/_internal/network/auth.py,sha256=K3G1ukKb3PiH8w_UnpXTz8qQsTULO-qdbfOE9zTo1fE,11119 +pip/_internal/network/auth.pyc,, +pip/_internal/network/cache.py,sha256=51CExcRkXWrgMZ7WsrZ6cmijKfViD5tVgKbBvJHO1IE,2394 +pip/_internal/network/cache.pyc,, +pip/_internal/network/download.py,sha256=3D9vdJmVwmCUMxzC-TaVI_GvVOpQna3BLEYNPCSx3Fc,6260 +pip/_internal/network/download.pyc,, +pip/_internal/network/session.py,sha256=u1IXQfv21R1xv86ulyiB58-be4sYm90eFB0Wp8fVMYw,14702 +pip/_internal/network/session.pyc,, +pip/_internal/network/utils.py,sha256=iiixo1OeaQ3niUWiBjg59PN6f1w7vvTww1vFriTD_IU,1959 +pip/_internal/network/utils.pyc,, +pip/_internal/network/xmlrpc.py,sha256=AL115M3vFJ8xiHVJneb8Hi0ZFeRvdPhblC89w25OG5s,1597 +pip/_internal/network/xmlrpc.pyc,, +pip/_internal/operations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_internal/operations/__init__.pyc,, +pip/_internal/operations/build/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_internal/operations/build/__init__.pyc,, +pip/_internal/operations/build/metadata.py,sha256=yHMi5gHYXcXyHcvUPWHdO-UyOo3McFWljn_nHfM1O9c,1307 +pip/_internal/operations/build/metadata.pyc,, +pip/_internal/operations/build/metadata_legacy.py,sha256=4n6N7BTysqVmEpITzT2UVClyt0Peij_Im8Qm965IWB4,3957 +pip/_internal/operations/build/metadata_legacy.pyc,, +pip/_internal/operations/build/wheel.py,sha256=ntltdNP6D2Tpr4V0agssu6rE0F9LaBpJkYT6zSdhEbw,1469 +pip/_internal/operations/build/wheel.pyc,, +pip/_internal/operations/build/wheel_legacy.py,sha256=DYSxQKutwSZnmNvWkwsl2HzE2XQBxV0i0wTphjtUe90,3349 +pip/_internal/operations/build/wheel_legacy.pyc,, +pip/_internal/operations/check.py,sha256=a6uHG0daoWpmSPCdL7iYJaGQYZ-CRvPvTnCv2PnIIs0,5353 +pip/_internal/operations/check.pyc,, +pip/_internal/operations/freeze.py,sha256=td4BeRnW10EXFTZrx6VgygO3CrjqD5B9f0BGzjQm-Ew,10180 +pip/_internal/operations/freeze.pyc,, +pip/_internal/operations/install/__init__.py,sha256=mX7hyD2GNBO2mFGokDQ30r_GXv7Y_PLdtxcUv144e-s,51 +pip/_internal/operations/install/__init__.pyc,, +pip/_internal/operations/install/editable_legacy.py,sha256=rJ_xs2qtDUjpY2-n6eYlVyZiNoKbOtZXZrYrcnIELt4,1488 +pip/_internal/operations/install/editable_legacy.pyc,, +pip/_internal/operations/install/legacy.py,sha256=eBV8gHbO9sBlBc-4nuR3Sd2nikHgEcnC9khfeLiypio,4566 +pip/_internal/operations/install/legacy.pyc,, +pip/_internal/operations/install/wheel.py,sha256=xdCjH6uIUyg39Pf8tUaMFUN4a7eozJAFMb_wKcgQlsY,23012 +pip/_internal/operations/install/wheel.pyc,, +pip/_internal/operations/prepare.py,sha256=ro2teBlbBpkRJhBKraP9CoJgVLpueSk62ziWhRToXww,20942 +pip/_internal/operations/prepare.pyc,, +pip/_internal/pep425tags.py,sha256=SlIQokevkoKnXhoK3PZvXiDoj8hFKoJ7thDifDtga3k,5490 +pip/_internal/pep425tags.pyc,, +pip/_internal/pyproject.py,sha256=kB966ZCSxiZQRa3W2RXN9as5pRuKW6Elnb4xdqDxASg,7404 +pip/_internal/pyproject.pyc,, +pip/_internal/req/__init__.py,sha256=UVaYPlHZVGRBQQPjvGC_6jJDQtewXm0ws-8Lxhg_TiY,2671 +pip/_internal/req/__init__.pyc,, +pip/_internal/req/constructors.py,sha256=w5-kWWVCqlSqcIBitw86yq7XGMPpKrHDfQZSE2mJ_xc,14388 +pip/_internal/req/constructors.pyc,, +pip/_internal/req/req_file.py,sha256=ECqRUicCw5Y08R1YynZAAp8dSKQhDXoc1Q-mY3a9b6I,18485 +pip/_internal/req/req_file.pyc,, +pip/_internal/req/req_install.py,sha256=wjsIr4lDpbVSLqANKJI9mXwRVHaRxcnj8q30UiHoLRA,30442 +pip/_internal/req/req_install.pyc,, +pip/_internal/req/req_set.py,sha256=GsrKmupRKhNMhjkofVfCEHEHfgEvYBxClaQH5xLBQHg,8066 +pip/_internal/req/req_set.pyc,, +pip/_internal/req/req_tracker.py,sha256=27fvVG8Y2MJS1KpU2rBMnQyUEMHG4lkHT_bzbzQK-c0,4723 +pip/_internal/req/req_tracker.pyc,, +pip/_internal/req/req_uninstall.py,sha256=DWnOsuyYGju6-sylyoCm7GtUNevn9qMAVhjAGLcdXUE,23609 +pip/_internal/req/req_uninstall.pyc,, +pip/_internal/self_outdated_check.py,sha256=3KO1pTJUuYaiV9X0t87I9PimkGL82HbhLWbocqKZpBU,8009 +pip/_internal/self_outdated_check.pyc,, +pip/_internal/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_internal/utils/__init__.pyc,, +pip/_internal/utils/appdirs.py,sha256=frpKbfJiyKLgpPDYNDrPtkfaZ0akY9SyB7ryPV29sMg,1144 +pip/_internal/utils/appdirs.pyc,, +pip/_internal/utils/compat.py,sha256=D7FKGLBdQwWH-dHIGaoWMawDZWBYApvtJVL1kFPJ930,8869 +pip/_internal/utils/compat.pyc,, +pip/_internal/utils/deprecation.py,sha256=pBnNogoA4UGTxa_JDnPXBRRYpKMbExAhXpBwAwklOBs,3318 +pip/_internal/utils/deprecation.pyc,, +pip/_internal/utils/distutils_args.py,sha256=a56mblNxk9BGifbpEETG61mmBrqhjtjRkJ4HYn-oOEE,1350 +pip/_internal/utils/distutils_args.pyc,, +pip/_internal/utils/encoding.py,sha256=hxZz0t3Whw3d4MHQEiofxalTlfKwxFdLc8fpeGfhKo8,1320 +pip/_internal/utils/encoding.pyc,, +pip/_internal/utils/entrypoints.py,sha256=vHcNpnksCv6mllihU6hfifdsKPEjwcaJ1aLIXEaynaU,1152 +pip/_internal/utils/entrypoints.pyc,, +pip/_internal/utils/filesystem.py,sha256=PXa3vMcz4mbEKtkD0joFI8pBwddLQxhfPFOkVH5xjfE,5255 +pip/_internal/utils/filesystem.pyc,, +pip/_internal/utils/filetypes.py,sha256=R2FwzoeX7b-rZALOXx5cuO8VPPMhUQ4ne7wm3n3IcWA,571 +pip/_internal/utils/filetypes.pyc,, +pip/_internal/utils/glibc.py,sha256=LOeNGgawCKS-4ke9fii78fwXD73dtNav3uxz1Bf-Ab8,3297 +pip/_internal/utils/glibc.pyc,, +pip/_internal/utils/hashes.py,sha256=my-wSnAWEDvl_8rQaOQcVIWjwh1-f_QiEvGy9TPf53U,3942 +pip/_internal/utils/hashes.pyc,, +pip/_internal/utils/inject_securetransport.py,sha256=M17ZlFVY66ApgeASVjKKLKNz0LAfk-SyU0HZ4ZB6MmI,810 +pip/_internal/utils/inject_securetransport.pyc,, +pip/_internal/utils/logging.py,sha256=aJL7NldPhS5KGFof6Qt3o3MG5cjm5TOoo7bGRu9_wsg,13033 +pip/_internal/utils/logging.pyc,, +pip/_internal/utils/marker_files.py,sha256=CO5djQlrPIozJpJybViH_insoAaBGY1aqEt6-cC-iW0,741 +pip/_internal/utils/marker_files.pyc,, +pip/_internal/utils/misc.py,sha256=itSJCAJfjGJiUaQyooUPxqjjy21M71GXsVn4wFEIMJA,25334 +pip/_internal/utils/misc.pyc,, +pip/_internal/utils/models.py,sha256=IA0hw_T4awQzui0kqfIEASm5yLtgZAB08ag59Nip5G8,1148 +pip/_internal/utils/models.pyc,, +pip/_internal/utils/packaging.py,sha256=VtiwcAAL7LBi7tGL2je7LeW4bE11KMHGCsJ1NZY5XtM,3035 +pip/_internal/utils/packaging.pyc,, +pip/_internal/utils/pkg_resources.py,sha256=ZX-k7V5q_aNWyDse92nN7orN1aCpRLsaxzpkBZ1XKzU,1254 +pip/_internal/utils/pkg_resources.pyc,, +pip/_internal/utils/setuptools_build.py,sha256=DouaVolV9olDDFIIN9IszaL-FHdNaZt10ufOZFH9ZAU,5070 +pip/_internal/utils/setuptools_build.pyc,, +pip/_internal/utils/subprocess.py,sha256=Ph3x5eHQBxFotyGhpZN8asSMBud-BBkmgaNfARG-di8,9922 +pip/_internal/utils/subprocess.pyc,, +pip/_internal/utils/temp_dir.py,sha256=87Ib8aNic_hoSDEmUYJHTQIn5-prL2AYL5u_yZ3s4sI,7768 +pip/_internal/utils/temp_dir.pyc,, +pip/_internal/utils/typing.py,sha256=xkYwOeHlf4zsHXBDC4310HtEqwhQcYXFPq2h35Tcrl0,1401 +pip/_internal/utils/typing.pyc,, +pip/_internal/utils/ui.py,sha256=0FNxXlGtbpPtTviv2oXS9t8bQG_NBdfUgP4GbubhS9U,13911 +pip/_internal/utils/ui.pyc,, +pip/_internal/utils/unpacking.py,sha256=M944JTSiapBOSKLWu7lbawpVHSE7flfzZTEr3TAG7v8,9438 +pip/_internal/utils/unpacking.pyc,, +pip/_internal/utils/urls.py,sha256=aNV9wq5ClUmrz6sG-al7hEWJ4ToitOy7l82CmFGFNW8,1481 +pip/_internal/utils/urls.pyc,, +pip/_internal/utils/virtualenv.py,sha256=Q3S1WPlI7JWpGOT2jUVJ8l2chm_k7VPJ9cHA_cUluEU,3396 +pip/_internal/utils/virtualenv.pyc,, +pip/_internal/utils/wheel.py,sha256=grTRwZtMQwApwbbSPmRVLtac6FKy6SVKeCXNkWyyePA,7302 +pip/_internal/utils/wheel.pyc,, +pip/_internal/vcs/__init__.py,sha256=viJxJRqRE_mVScum85bgQIXAd6o0ozFt18VpC-qIJrM,617 +pip/_internal/vcs/__init__.pyc,, +pip/_internal/vcs/bazaar.py,sha256=84q1-kj1_nJ9AMzMu8RmMp-riRZu81M7K9kowcYgi3U,3957 +pip/_internal/vcs/bazaar.pyc,, +pip/_internal/vcs/git.py,sha256=X0j5jv_x3ZnM_NP09B1ZDxW-PAmfHzqOqX7Wf5XW--0,14058 +pip/_internal/vcs/git.pyc,, +pip/_internal/vcs/mercurial.py,sha256=2mg7BdYI_Fe00fF6omaNccFQLPHBsDBG5CAEzvqn5sA,5110 +pip/_internal/vcs/mercurial.pyc,, +pip/_internal/vcs/subversion.py,sha256=Fpwy71AmuqXnoKi6h1SrXRtPjEMn8fieuM1O4j01IBg,12292 +pip/_internal/vcs/subversion.pyc,, +pip/_internal/vcs/versioncontrol.py,sha256=nqoaM1_rzx24WnHtihXA8RcPpnUae0sV2sR_LS_5HFA,22600 +pip/_internal/vcs/versioncontrol.pyc,, +pip/_internal/wheel_builder.py,sha256=gr9jE14W5ZuYblpldo-tpRuyG0e0AVmHLttImuAvXlE,9441 +pip/_internal/wheel_builder.pyc,, +pip/_vendor/__init__.py,sha256=gEJYEfJm7XGLslyjW3KBQyQxyTYxdvTEkRT5Bz28MDs,4657 +pip/_vendor/__init__.pyc,, +pip/_vendor/appdirs.py,sha256=kVvdzRSQW6hsZYPMrct3jav-CGIZ4horsK7KnUTjt7w,26130 +pip/_vendor/appdirs.pyc,, +pip/_vendor/cachecontrol/__init__.py,sha256=pJtAaUxOsMPnytI1A3juAJkXYDr8krdSnsg4Yg3OBEg,302 +pip/_vendor/cachecontrol/__init__.pyc,, +pip/_vendor/cachecontrol/_cmd.py,sha256=URGE0KrA87QekCG3SGPatlSPT571dZTDjNa-ZXX3pDc,1295 +pip/_vendor/cachecontrol/_cmd.pyc,, +pip/_vendor/cachecontrol/adapter.py,sha256=sSwaSYd93IIfCFU4tOMgSo6b2LCt_gBSaQUj8ktJFOA,4882 +pip/_vendor/cachecontrol/adapter.pyc,, +pip/_vendor/cachecontrol/cache.py,sha256=1fc4wJP8HYt1ycnJXeEw5pCpeBL2Cqxx6g9Fb0AYDWQ,805 +pip/_vendor/cachecontrol/cache.pyc,, +pip/_vendor/cachecontrol/caches/__init__.py,sha256=-gHNKYvaeD0kOk5M74eOrsSgIKUtC6i6GfbmugGweEo,86 +pip/_vendor/cachecontrol/caches/__init__.pyc,, +pip/_vendor/cachecontrol/caches/file_cache.py,sha256=nYVKsJtXh6gJXvdn1iWyrhxvkwpQrK-eKoMRzuiwkKk,4153 +pip/_vendor/cachecontrol/caches/file_cache.pyc,, +pip/_vendor/cachecontrol/caches/redis_cache.py,sha256=HxelMpNCo-dYr2fiJDwM3hhhRmxUYtB5tXm1GpAAT4Y,856 +pip/_vendor/cachecontrol/caches/redis_cache.pyc,, +pip/_vendor/cachecontrol/compat.py,sha256=kHNvMRdt6s_Xwqq_9qJmr9ou3wYMOMUMxPPcwNxT8Mc,695 +pip/_vendor/cachecontrol/compat.pyc,, +pip/_vendor/cachecontrol/controller.py,sha256=CWEX3pedIM9s60suf4zZPtm_JvVgnvogMGK_OiBG5F8,14149 +pip/_vendor/cachecontrol/controller.pyc,, +pip/_vendor/cachecontrol/filewrapper.py,sha256=vACKO8Llzu_ZWyjV1Fxn1MA4TGU60N5N3GSrAFdAY2Q,2533 +pip/_vendor/cachecontrol/filewrapper.pyc,, +pip/_vendor/cachecontrol/heuristics.py,sha256=BFGHJ3yQcxvZizfo90LLZ04T_Z5XSCXvFotrp7Us0sc,4070 +pip/_vendor/cachecontrol/heuristics.pyc,, +pip/_vendor/cachecontrol/serialize.py,sha256=vIa4jvq4x_KSOLdEIedoknX2aXYHQujLDFV4-F21Dno,7091 +pip/_vendor/cachecontrol/serialize.pyc,, +pip/_vendor/cachecontrol/wrapper.py,sha256=5LX0uJwkNQUtYSEw3aGmGu9WY8wGipd81mJ8lG0d0M4,690 +pip/_vendor/cachecontrol/wrapper.pyc,, +pip/_vendor/certifi/__init__.py,sha256=JVwzDhkMttyVVtfNDrU_i0v2a-WmtEBXq0Z8oz4Ghzk,52 +pip/_vendor/certifi/__init__.pyc,, +pip/_vendor/certifi/__main__.py,sha256=NaCn6WtWME-zzVWQ2j4zFyl8cY4knDa9CwtHNIeFPhM,53 +pip/_vendor/certifi/__main__.pyc,, +pip/_vendor/certifi/cacert.pem,sha256=cyvv5Jx1gHACNEj2GaOrsIj0Tk8FmSvHR42uhzvlatg,281457 +pip/_vendor/certifi/core.py,sha256=EuFc2BsToG5O1-qsx4BSjQ1r1-7WRtH87b1WflZOWhI,218 +pip/_vendor/certifi/core.pyc,, +pip/_vendor/chardet/__init__.py,sha256=YsP5wQlsHJ2auF1RZJfypiSrCA7_bQiRm3ES_NI76-Y,1559 +pip/_vendor/chardet/__init__.pyc,, +pip/_vendor/chardet/big5freq.py,sha256=D_zK5GyzoVsRes0HkLJziltFQX0bKCLOrFe9_xDvO_8,31254 +pip/_vendor/chardet/big5freq.pyc,, +pip/_vendor/chardet/big5prober.py,sha256=kBxHbdetBpPe7xrlb-e990iot64g_eGSLd32lB7_h3M,1757 +pip/_vendor/chardet/big5prober.pyc,, +pip/_vendor/chardet/chardistribution.py,sha256=3woWS62KrGooKyqz4zQSnjFbJpa6V7g02daAibTwcl8,9411 +pip/_vendor/chardet/chardistribution.pyc,, +pip/_vendor/chardet/charsetgroupprober.py,sha256=6bDu8YIiRuScX4ca9Igb0U69TA2PGXXDej6Cc4_9kO4,3787 +pip/_vendor/chardet/charsetgroupprober.pyc,, +pip/_vendor/chardet/charsetprober.py,sha256=KSmwJErjypyj0bRZmC5F5eM7c8YQgLYIjZXintZNstg,5110 +pip/_vendor/chardet/charsetprober.pyc,, +pip/_vendor/chardet/cli/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1 +pip/_vendor/chardet/cli/__init__.pyc,, +pip/_vendor/chardet/cli/chardetect.py,sha256=DI8dlV3FBD0c0XA_y3sQ78z754DUv1J8n34RtDjOXNw,2774 +pip/_vendor/chardet/cli/chardetect.pyc,, +pip/_vendor/chardet/codingstatemachine.py,sha256=VYp_6cyyki5sHgXDSZnXW4q1oelHc3cu9AyQTX7uug8,3590 +pip/_vendor/chardet/codingstatemachine.pyc,, +pip/_vendor/chardet/compat.py,sha256=PKTzHkSbtbHDqS9PyujMbX74q1a8mMpeQTDVsQhZMRw,1134 +pip/_vendor/chardet/compat.pyc,, +pip/_vendor/chardet/cp949prober.py,sha256=TZ434QX8zzBsnUvL_8wm4AQVTZ2ZkqEEQL_lNw9f9ow,1855 +pip/_vendor/chardet/cp949prober.pyc,, +pip/_vendor/chardet/enums.py,sha256=Aimwdb9as1dJKZaFNUH2OhWIVBVd6ZkJJ_WK5sNY8cU,1661 +pip/_vendor/chardet/enums.pyc,, +pip/_vendor/chardet/escprober.py,sha256=kkyqVg1Yw3DIOAMJ2bdlyQgUFQhuHAW8dUGskToNWSc,3950 +pip/_vendor/chardet/escprober.pyc,, +pip/_vendor/chardet/escsm.py,sha256=RuXlgNvTIDarndvllNCk5WZBIpdCxQ0kcd9EAuxUh84,10510 +pip/_vendor/chardet/escsm.pyc,, +pip/_vendor/chardet/eucjpprober.py,sha256=iD8Jdp0ISRjgjiVN7f0e8xGeQJ5GM2oeZ1dA8nbSeUw,3749 +pip/_vendor/chardet/eucjpprober.pyc,, +pip/_vendor/chardet/euckrfreq.py,sha256=-7GdmvgWez4-eO4SuXpa7tBiDi5vRXQ8WvdFAzVaSfo,13546 +pip/_vendor/chardet/euckrfreq.pyc,, +pip/_vendor/chardet/euckrprober.py,sha256=MqFMTQXxW4HbzIpZ9lKDHB3GN8SP4yiHenTmf8g_PxY,1748 +pip/_vendor/chardet/euckrprober.pyc,, +pip/_vendor/chardet/euctwfreq.py,sha256=No1WyduFOgB5VITUA7PLyC5oJRNzRyMbBxaKI1l16MA,31621 +pip/_vendor/chardet/euctwfreq.pyc,, +pip/_vendor/chardet/euctwprober.py,sha256=13p6EP4yRaxqnP4iHtxHOJ6R2zxHq1_m8hTRjzVZ95c,1747 +pip/_vendor/chardet/euctwprober.pyc,, +pip/_vendor/chardet/gb2312freq.py,sha256=JX8lsweKLmnCwmk8UHEQsLgkr_rP_kEbvivC4qPOrlc,20715 +pip/_vendor/chardet/gb2312freq.pyc,, +pip/_vendor/chardet/gb2312prober.py,sha256=gGvIWi9WhDjE-xQXHvNIyrnLvEbMAYgyUSZ65HUfylw,1754 +pip/_vendor/chardet/gb2312prober.pyc,, +pip/_vendor/chardet/hebrewprober.py,sha256=c3SZ-K7hvyzGY6JRAZxJgwJ_sUS9k0WYkvMY00YBYFo,13838 +pip/_vendor/chardet/hebrewprober.pyc,, +pip/_vendor/chardet/jisfreq.py,sha256=vpmJv2Bu0J8gnMVRPHMFefTRvo_ha1mryLig8CBwgOg,25777 +pip/_vendor/chardet/jisfreq.pyc,, +pip/_vendor/chardet/jpcntx.py,sha256=PYlNqRUQT8LM3cT5FmHGP0iiscFlTWED92MALvBungo,19643 +pip/_vendor/chardet/jpcntx.pyc,, +pip/_vendor/chardet/langbulgarianmodel.py,sha256=1HqQS9Pbtnj1xQgxitJMvw8X6kKr5OockNCZWfEQrPE,12839 +pip/_vendor/chardet/langbulgarianmodel.pyc,, +pip/_vendor/chardet/langcyrillicmodel.py,sha256=LODajvsetH87yYDDQKA2CULXUH87tI223dhfjh9Zx9c,17948 +pip/_vendor/chardet/langcyrillicmodel.pyc,, +pip/_vendor/chardet/langgreekmodel.py,sha256=8YAW7bU8YwSJap0kIJSbPMw1BEqzGjWzqcqf0WgUKAA,12688 +pip/_vendor/chardet/langgreekmodel.pyc,, +pip/_vendor/chardet/langhebrewmodel.py,sha256=JSnqmE5E62tDLTPTvLpQsg5gOMO4PbdWRvV7Avkc0HA,11345 +pip/_vendor/chardet/langhebrewmodel.pyc,, +pip/_vendor/chardet/langhungarianmodel.py,sha256=RhapYSG5l0ZaO-VV4Fan5sW0WRGQqhwBM61yx3yxyOA,12592 +pip/_vendor/chardet/langhungarianmodel.pyc,, +pip/_vendor/chardet/langthaimodel.py,sha256=8l0173Gu_W6G8mxmQOTEF4ls2YdE7FxWf3QkSxEGXJQ,11290 +pip/_vendor/chardet/langthaimodel.pyc,, +pip/_vendor/chardet/langturkishmodel.py,sha256=W22eRNJsqI6uWAfwXSKVWWnCerYqrI8dZQTm_M0lRFk,11102 +pip/_vendor/chardet/langturkishmodel.pyc,, +pip/_vendor/chardet/latin1prober.py,sha256=S2IoORhFk39FEFOlSFWtgVybRiP6h7BlLldHVclNkU8,5370 +pip/_vendor/chardet/latin1prober.pyc,, +pip/_vendor/chardet/mbcharsetprober.py,sha256=AR95eFH9vuqSfvLQZN-L5ijea25NOBCoXqw8s5O9xLQ,3413 +pip/_vendor/chardet/mbcharsetprober.pyc,, +pip/_vendor/chardet/mbcsgroupprober.py,sha256=h6TRnnYq2OxG1WdD5JOyxcdVpn7dG0q-vB8nWr5mbh4,2012 +pip/_vendor/chardet/mbcsgroupprober.pyc,, +pip/_vendor/chardet/mbcssm.py,sha256=SY32wVIF3HzcjY3BaEspy9metbNSKxIIB0RKPn7tjpI,25481 +pip/_vendor/chardet/mbcssm.pyc,, +pip/_vendor/chardet/sbcharsetprober.py,sha256=LDSpCldDCFlYwUkGkwD2oFxLlPWIWXT09akH_2PiY74,5657 +pip/_vendor/chardet/sbcharsetprober.pyc,, +pip/_vendor/chardet/sbcsgroupprober.py,sha256=1IprcCB_k1qfmnxGC6MBbxELlKqD3scW6S8YIwdeyXA,3546 +pip/_vendor/chardet/sbcsgroupprober.pyc,, +pip/_vendor/chardet/sjisprober.py,sha256=IIt-lZj0WJqK4rmUZzKZP4GJlE8KUEtFYVuY96ek5MQ,3774 +pip/_vendor/chardet/sjisprober.pyc,, +pip/_vendor/chardet/universaldetector.py,sha256=qL0174lSZE442eB21nnktT9_VcAye07laFWUeUrjttY,12485 +pip/_vendor/chardet/universaldetector.pyc,, +pip/_vendor/chardet/utf8prober.py,sha256=IdD8v3zWOsB8OLiyPi-y_fqwipRFxV9Nc1eKBLSuIEw,2766 +pip/_vendor/chardet/utf8prober.pyc,, +pip/_vendor/chardet/version.py,sha256=sp3B08mrDXB-pf3K9fqJ_zeDHOCLC8RrngQyDFap_7g,242 +pip/_vendor/chardet/version.pyc,, +pip/_vendor/colorama/__init__.py,sha256=DqjXH9URVP3IJwmMt7peYw50ns1RNAymIB9-XdPEFV8,239 +pip/_vendor/colorama/__init__.pyc,, +pip/_vendor/colorama/ansi.py,sha256=Fi0un-QLqRm-v7o_nKiOqyC8PapBJK7DLV_q9LKtTO0,2524 +pip/_vendor/colorama/ansi.pyc,, +pip/_vendor/colorama/ansitowin32.py,sha256=u8QaqdqS_xYSfNkPM1eRJLHz6JMWPodaJaP0mxgHCDc,10462 +pip/_vendor/colorama/ansitowin32.pyc,, +pip/_vendor/colorama/initialise.py,sha256=PprovDNxMTrvoNHFcL2NZjpH2XzDc8BLxLxiErfUl4k,1915 +pip/_vendor/colorama/initialise.pyc,, +pip/_vendor/colorama/win32.py,sha256=bJ8Il9jwaBN5BJ8bmN6FoYZ1QYuMKv2j8fGrXh7TJjw,5404 +pip/_vendor/colorama/win32.pyc,, +pip/_vendor/colorama/winterm.py,sha256=2y_2b7Zsv34feAsP67mLOVc-Bgq51mdYGo571VprlrM,6438 +pip/_vendor/colorama/winterm.pyc,, +pip/_vendor/contextlib2.py,sha256=5HjGflUzwWAUfcILhSmC2GqvoYdZZzFzVfIDztHigUs,16915 +pip/_vendor/contextlib2.pyc,, +pip/_vendor/distlib/__init__.py,sha256=gzl1hjUXmDGrqRyU7ZLjBwJGAcMimQbrZ22XPVaKaRE,581 +pip/_vendor/distlib/__init__.pyc,, +pip/_vendor/distlib/_backport/__init__.py,sha256=bqS_dTOH6uW9iGgd0uzfpPjo6vZ4xpPZ7kyfZJ2vNaw,274 +pip/_vendor/distlib/_backport/__init__.pyc,, +pip/_vendor/distlib/_backport/misc.py,sha256=KWecINdbFNOxSOP1fGF680CJnaC6S4fBRgEtaYTw0ig,971 +pip/_vendor/distlib/_backport/misc.pyc,, +pip/_vendor/distlib/_backport/shutil.py,sha256=VW1t3uYqUjWZH7jV-6QiimLhnldoV5uIpH4EuiT1jfw,25647 +pip/_vendor/distlib/_backport/shutil.pyc,, +pip/_vendor/distlib/_backport/sysconfig.cfg,sha256=swZKxq9RY5e9r3PXCrlvQPMsvOdiWZBTHLEbqS8LJLU,2617 +pip/_vendor/distlib/_backport/sysconfig.py,sha256=BQHFlb6pubCl_dvT1NjtzIthylofjKisox239stDg0U,26854 +pip/_vendor/distlib/_backport/sysconfig.pyc,, +pip/_vendor/distlib/_backport/tarfile.py,sha256=Ihp7rXRcjbIKw8COm9wSePV9ARGXbSF9gGXAMn2Q-KU,92628 +pip/_vendor/distlib/_backport/tarfile.pyc,, +pip/_vendor/distlib/compat.py,sha256=xdNZmqFN5HwF30HjRn5M415pcC2kgXRBXn767xS8v-M,41404 +pip/_vendor/distlib/compat.pyc,, +pip/_vendor/distlib/database.py,sha256=fhNzEDtb4HXrpxKyQvhVzDXcOiJlzrOM--UYnvCeZrI,51045 +pip/_vendor/distlib/database.pyc,, +pip/_vendor/distlib/index.py,sha256=SXKzpQCERctxYDMp_OLee2f0J0e19ZhGdCIoMlUfUQM,21066 +pip/_vendor/distlib/index.pyc,, +pip/_vendor/distlib/locators.py,sha256=c9E4cDEacJ_uKbuE5BqAVocoWp6rsuBGTkiNDQq3zV4,52100 +pip/_vendor/distlib/locators.pyc,, +pip/_vendor/distlib/manifest.py,sha256=nQEhYmgoreaBZzyFzwYsXxJARu3fo4EkunU163U16iE,14811 +pip/_vendor/distlib/manifest.pyc,, +pip/_vendor/distlib/markers.py,sha256=6Ac3cCfFBERexiESWIOXmg-apIP8l2esafNSX3KMy-8,4387 +pip/_vendor/distlib/markers.pyc,, +pip/_vendor/distlib/metadata.py,sha256=OhbCKmf5lswE8unWBopI1hj7tRpHp4ZbFvU4d6aAEMM,40234 +pip/_vendor/distlib/metadata.pyc,, +pip/_vendor/distlib/resources.py,sha256=2FGv0ZHF14KXjLIlL0R991lyQQGcewOS4mJ-5n-JVnc,10766 +pip/_vendor/distlib/resources.pyc,, +pip/_vendor/distlib/scripts.py,sha256=OAkEwxRvIzX-VSfhEttQEKJFVLA47gbW0OgQXJRs7OQ,16998 +pip/_vendor/distlib/scripts.pyc,, +pip/_vendor/distlib/t32.exe,sha256=NS3xBCVAld35JVFNmb-1QRyVtThukMrwZVeXn4LhaEQ,96768 +pip/_vendor/distlib/t64.exe,sha256=oAqHes78rUWVM0OtVqIhUvequl_PKhAhXYQWnUf7zR0,105984 +pip/_vendor/distlib/util.py,sha256=f2jZCPrcLCt6LcnC0gUy-Fur60tXD8reA7k4rDpHMDw,59845 +pip/_vendor/distlib/util.pyc,, +pip/_vendor/distlib/version.py,sha256=_n7F6juvQGAcn769E_SHa7fOcf5ERlEVymJ_EjPRwGw,23391 +pip/_vendor/distlib/version.pyc,, +pip/_vendor/distlib/w32.exe,sha256=lJtnZdeUxTZWya_EW5DZos_K5rswRECGspIl8ZJCIXs,90112 +pip/_vendor/distlib/w64.exe,sha256=0aRzoN2BO9NWW4ENy4_4vHkHR4qZTFZNVSAJJYlODTI,99840 +pip/_vendor/distlib/wheel.py,sha256=bRtR5bNR_u_DwkwktN1bgZuwLVOJT1p_vNIUPyN8kJc,40452 +pip/_vendor/distlib/wheel.pyc,, +pip/_vendor/distro.py,sha256=X2So5kjrRKyMbQJ90Xgy93HU5eFtujCzKaYNeoy1k1c,43251 +pip/_vendor/distro.pyc,, +pip/_vendor/html5lib/__init__.py,sha256=Ztrn7UvF-wIFAgRBBa0ML-Gu5AffH3BPX_INJx4SaBI,1162 +pip/_vendor/html5lib/__init__.pyc,, +pip/_vendor/html5lib/_ihatexml.py,sha256=3LBtJMlzgwM8vpQiU1TvGmEEmNH72sV0yD8yS53y07A,16705 +pip/_vendor/html5lib/_ihatexml.pyc,, +pip/_vendor/html5lib/_inputstream.py,sha256=bPUWcAfJScK4xkjQQaG_HsI2BvEVbFvI0AsodDYPQj0,32552 +pip/_vendor/html5lib/_inputstream.pyc,, +pip/_vendor/html5lib/_tokenizer.py,sha256=YAaOEBD6qc5ISq9Xt9Nif1OFgcybTTfMdwqBkZhpAq4,76580 +pip/_vendor/html5lib/_tokenizer.pyc,, +pip/_vendor/html5lib/_trie/__init__.py,sha256=8VR1bcgD2OpeS2XExpu5yBhP_Q1K-lwKbBKICBPf1kU,289 +pip/_vendor/html5lib/_trie/__init__.pyc,, +pip/_vendor/html5lib/_trie/_base.py,sha256=CaybYyMro8uERQYjby2tTeSUatnWDfWroUN9N7ety5w,1013 +pip/_vendor/html5lib/_trie/_base.pyc,, +pip/_vendor/html5lib/_trie/datrie.py,sha256=EQpqSfkZRuTbE-DuhW7xMdVDxdZNZ0CfmnYfHA_3zxM,1178 +pip/_vendor/html5lib/_trie/datrie.pyc,, +pip/_vendor/html5lib/_trie/py.py,sha256=wXmQLrZRf4MyWNyg0m3h81m9InhLR7GJ002mIIZh-8o,1775 +pip/_vendor/html5lib/_trie/py.pyc,, +pip/_vendor/html5lib/_utils.py,sha256=ismpASeqa2jqEPQjHUj8vReAf7yIoKnvLN5fuOw6nv0,4015 +pip/_vendor/html5lib/_utils.pyc,, +pip/_vendor/html5lib/constants.py,sha256=4lmZWLtEPRLnl8NzftOoYTJdo6jpeMtP6dqQC0g_bWQ,83518 +pip/_vendor/html5lib/constants.pyc,, +pip/_vendor/html5lib/filters/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_vendor/html5lib/filters/__init__.pyc,, +pip/_vendor/html5lib/filters/alphabeticalattributes.py,sha256=lViZc2JMCclXi_5gduvmdzrRxtO5Xo9ONnbHBVCsykU,919 +pip/_vendor/html5lib/filters/alphabeticalattributes.pyc,, +pip/_vendor/html5lib/filters/base.py,sha256=z-IU9ZAYjpsVsqmVt7kuWC63jR11hDMr6CVrvuao8W0,286 +pip/_vendor/html5lib/filters/base.pyc,, +pip/_vendor/html5lib/filters/inject_meta_charset.py,sha256=egDXUEHXmAG9504xz0K6ALDgYkvUrC2q15YUVeNlVQg,2945 +pip/_vendor/html5lib/filters/inject_meta_charset.pyc,, +pip/_vendor/html5lib/filters/lint.py,sha256=jk6q56xY0ojiYfvpdP-OZSm9eTqcAdRqhCoPItemPYA,3643 +pip/_vendor/html5lib/filters/lint.pyc,, +pip/_vendor/html5lib/filters/optionaltags.py,sha256=8lWT75J0aBOHmPgfmqTHSfPpPMp01T84NKu0CRedxcE,10588 +pip/_vendor/html5lib/filters/optionaltags.pyc,, +pip/_vendor/html5lib/filters/sanitizer.py,sha256=4ON02KNjuqda1lCw5_JCUZxb0BzWR5M7ON84dtJ7dm0,26248 +pip/_vendor/html5lib/filters/sanitizer.pyc,, +pip/_vendor/html5lib/filters/whitespace.py,sha256=8eWqZxd4UC4zlFGW6iyY6f-2uuT8pOCSALc3IZt7_t4,1214 +pip/_vendor/html5lib/filters/whitespace.pyc,, +pip/_vendor/html5lib/html5parser.py,sha256=g5g2ezkusHxhi7b23vK_-d6K6BfIJRbqIQmvQ9z4EgI,118963 +pip/_vendor/html5lib/html5parser.pyc,, +pip/_vendor/html5lib/serializer.py,sha256=yfcfBHse2wDs6ojxn-kieJjLT5s1ipilQJ0gL3-rJis,15758 +pip/_vendor/html5lib/serializer.pyc,, +pip/_vendor/html5lib/treeadapters/__init__.py,sha256=A0rY5gXIe4bJOiSGRO_j_tFhngRBO8QZPzPtPw5dFzo,679 +pip/_vendor/html5lib/treeadapters/__init__.pyc,, +pip/_vendor/html5lib/treeadapters/genshi.py,sha256=CH27pAsDKmu4ZGkAUrwty7u0KauGLCZRLPMzaO3M5vo,1715 +pip/_vendor/html5lib/treeadapters/genshi.pyc,, +pip/_vendor/html5lib/treeadapters/sax.py,sha256=BKS8woQTnKiqeffHsxChUqL4q2ZR_wb5fc9MJ3zQC8s,1776 +pip/_vendor/html5lib/treeadapters/sax.pyc,, +pip/_vendor/html5lib/treebuilders/__init__.py,sha256=AysSJyvPfikCMMsTVvaxwkgDieELD5dfR8FJIAuq7hY,3592 +pip/_vendor/html5lib/treebuilders/__init__.pyc,, +pip/_vendor/html5lib/treebuilders/base.py,sha256=wQGp5yy22TNG8tJ6aREe4UUeTR7A99dEz0BXVaedWb4,14579 +pip/_vendor/html5lib/treebuilders/base.pyc,, +pip/_vendor/html5lib/treebuilders/dom.py,sha256=22whb0C71zXIsai5mamg6qzBEiigcBIvaDy4Asw3at0,8925 +pip/_vendor/html5lib/treebuilders/dom.pyc,, +pip/_vendor/html5lib/treebuilders/etree.py,sha256=aqIBOGj_dFYqBURIcTegGNBhAIJOw5iFDHb4jrkYH-8,12764 +pip/_vendor/html5lib/treebuilders/etree.pyc,, +pip/_vendor/html5lib/treebuilders/etree_lxml.py,sha256=9V0dXxbJYYq-Skgb5-_OL2NkVYpjioEb4CHajo0e9yI,14122 +pip/_vendor/html5lib/treebuilders/etree_lxml.pyc,, +pip/_vendor/html5lib/treewalkers/__init__.py,sha256=yhXxHpjlSqfQyUag3v8-vWjMPriFBU8YRAPNpDgBTn8,5714 +pip/_vendor/html5lib/treewalkers/__init__.pyc,, +pip/_vendor/html5lib/treewalkers/base.py,sha256=ouiOsuSzvI0KgzdWP8PlxIaSNs9falhbiinAEc_UIJY,7476 +pip/_vendor/html5lib/treewalkers/base.pyc,, +pip/_vendor/html5lib/treewalkers/dom.py,sha256=EHyFR8D8lYNnyDU9lx_IKigVJRyecUGua0mOi7HBukc,1413 +pip/_vendor/html5lib/treewalkers/dom.pyc,, +pip/_vendor/html5lib/treewalkers/etree.py,sha256=sz1o6mmE93NQ53qJFDO7HKyDtuwgK-Ay3qSFZPC6u00,4550 +pip/_vendor/html5lib/treewalkers/etree.pyc,, +pip/_vendor/html5lib/treewalkers/etree_lxml.py,sha256=sY6wfRshWTllu6n48TPWpKsQRPp-0CQrT0hj_AdzHSU,6309 +pip/_vendor/html5lib/treewalkers/etree_lxml.pyc,, +pip/_vendor/html5lib/treewalkers/genshi.py,sha256=4D2PECZ5n3ZN3qu3jMl9yY7B81jnQApBQSVlfaIuYbA,2309 +pip/_vendor/html5lib/treewalkers/genshi.pyc,, +pip/_vendor/idna/__init__.py,sha256=9Nt7xpyet3DmOrPUGooDdAwmHZZu1qUAy2EaJ93kGiQ,58 +pip/_vendor/idna/__init__.pyc,, +pip/_vendor/idna/codec.py,sha256=lvYb7yu7PhAqFaAIAdWcwgaWI2UmgseUua-1c0AsG0A,3299 +pip/_vendor/idna/codec.pyc,, +pip/_vendor/idna/compat.py,sha256=R-h29D-6mrnJzbXxymrWUW7iZUvy-26TQwZ0ij57i4U,232 +pip/_vendor/idna/compat.pyc,, +pip/_vendor/idna/core.py,sha256=JDCZZ_PLESqIgEbU8mPyoEufWwoOiIqygA17-QZIe3s,11733 +pip/_vendor/idna/core.pyc,, +pip/_vendor/idna/idnadata.py,sha256=HXaPFw6_YAJ0qppACPu0YLAULtRs3QovRM_CCZHGdY0,40899 +pip/_vendor/idna/idnadata.pyc,, +pip/_vendor/idna/intranges.py,sha256=TY1lpxZIQWEP6tNqjZkFA5hgoMWOj1OBmnUG8ihT87E,1749 +pip/_vendor/idna/intranges.pyc,, +pip/_vendor/idna/package_data.py,sha256=kIzeKKXEouXLR4srqwf9Q3zv-NffKSOz5aSDOJARPB0,21 +pip/_vendor/idna/package_data.pyc,, +pip/_vendor/idna/uts46data.py,sha256=oLyNZ1pBaiBlj9zFzLFRd_P7J8MkRcgDisjExZR_4MY,198292 +pip/_vendor/idna/uts46data.pyc,, +pip/_vendor/ipaddress.py,sha256=-0RmurI31XgAaN20WCi0zrcuoat90nNA70_6yGlx2PU,79875 +pip/_vendor/ipaddress.pyc,, +pip/_vendor/msgpack/__init__.py,sha256=LnKzG5v0RyZgs7KlY2-SZYDBn-toylovXxKiXR6C-IQ,1535 +pip/_vendor/msgpack/__init__.pyc,, +pip/_vendor/msgpack/_version.py,sha256=72BxB5FMl1q3Nz1hteHINzHhrFpXQ9nNtULaK52NLk8,20 +pip/_vendor/msgpack/_version.pyc,, +pip/_vendor/msgpack/exceptions.py,sha256=dCTWei8dpkrMsQDcjQk74ATl9HsIBH0ybt8zOPNqMYc,1081 +pip/_vendor/msgpack/exceptions.pyc,, +pip/_vendor/msgpack/fallback.py,sha256=vXo6S67Dmil9mz0PRBCLDu6znpv6CGKt9WPCEsdZx2A,37454 +pip/_vendor/msgpack/fallback.pyc,, +pip/_vendor/packaging/__about__.py,sha256=G5P2sPs0QxgVqD0zzcSjVLfY31ni6HVUh9ZWlHSAG3M,744 +pip/_vendor/packaging/__about__.pyc,, +pip/_vendor/packaging/__init__.py,sha256=6enbp5XgRfjBjsI9-bn00HjHf5TH21PDMOKkJW8xw-w,562 +pip/_vendor/packaging/__init__.pyc,, +pip/_vendor/packaging/_compat.py,sha256=Z-PwchK0cREbaRGF5MZP8LEv8JkC-qydn2FRrtjeixk,1138 +pip/_vendor/packaging/_compat.pyc,, +pip/_vendor/packaging/_structures.py,sha256=ozkCX8Q8f2qE1Eic3YiQ4buDVfgz2iYevY9e7R2y3iY,2022 +pip/_vendor/packaging/_structures.pyc,, +pip/_vendor/packaging/_typing.py,sha256=-cq_iNeveAWCVoseVvqmknWLbvZ_i9g7BeZBo0ShtHg,1449 +pip/_vendor/packaging/_typing.pyc,, +pip/_vendor/packaging/markers.py,sha256=yap5bk3c8QyPuGtiVbQSYhN70bxWj1nLDv2ZuaCLq7g,9501 +pip/_vendor/packaging/markers.pyc,, +pip/_vendor/packaging/requirements.py,sha256=G43p2ylM_REg87RLG9JybjbdwfaPyzaKYRtllRfNdrM,4913 +pip/_vendor/packaging/requirements.pyc,, +pip/_vendor/packaging/specifiers.py,sha256=Nz8bnFp53cQInmRGZy50QXlIi2tkDXMfRuGyGps2IRE,31314 +pip/_vendor/packaging/specifiers.pyc,, +pip/_vendor/packaging/tags.py,sha256=lJ_91F0icMlFvMp7EiKWPSzgJclNsEYdjdErhryfGj4,23510 +pip/_vendor/packaging/tags.pyc,, +pip/_vendor/packaging/utils.py,sha256=v5Wk8B7gUL13Rzed6NNhCZlutPQT7jNV-7hr-WOtacU,1700 +pip/_vendor/packaging/utils.pyc,, +pip/_vendor/packaging/version.py,sha256=qRdNN0_XuPFOJ3fut8ehzxJrNYtBzqF8ZtagEvgNUUM,15480 +pip/_vendor/packaging/version.pyc,, +pip/_vendor/pep517/__init__.py,sha256=nCw8ZdLH4c19g8xP_Ndag1KPdQhlSDKaL9pg-X7uNWU,84 +pip/_vendor/pep517/__init__.pyc,, +pip/_vendor/pep517/_in_process.py,sha256=v1Viek27-MGCOFu8eSlLd2jGCrIqc1fISnutGFoRDps,7792 +pip/_vendor/pep517/_in_process.pyc,, +pip/_vendor/pep517/build.py,sha256=WqM0-X4KyzY566qxGf3FeaYc1hw95H7YP0ElZ1zuTb0,3318 +pip/_vendor/pep517/build.pyc,, +pip/_vendor/pep517/check.py,sha256=ST02kRWBrRMOxgnRm9clw18Q2X7sJGaD4j3h6GmBhJ8,5949 +pip/_vendor/pep517/check.pyc,, +pip/_vendor/pep517/colorlog.py,sha256=Tk9AuYm_cLF3BKTBoSTJt9bRryn0aFojIQOwbfVUTxQ,4098 +pip/_vendor/pep517/colorlog.pyc,, +pip/_vendor/pep517/compat.py,sha256=M-5s4VNp8rjyT76ZZ_ibnPD44DYVzSQlyCEHayjtDPw,780 +pip/_vendor/pep517/compat.pyc,, +pip/_vendor/pep517/dirtools.py,sha256=2mkAkAL0mRz_elYFjRKuekTJVipH1zTn4tbf1EDev84,1129 +pip/_vendor/pep517/dirtools.pyc,, +pip/_vendor/pep517/envbuild.py,sha256=K4dIGAbkXf3RoQX_9RFpZvMvPrVSHtcbH7o9VSrNnlM,6024 +pip/_vendor/pep517/envbuild.pyc,, +pip/_vendor/pep517/meta.py,sha256=8mnM5lDnT4zXQpBTliJbRGfesH7iioHwozbDxALPS9Y,2463 +pip/_vendor/pep517/meta.pyc,, +pip/_vendor/pep517/wrappers.py,sha256=QiQaEQlfCrhRpPBFQiGVM9QjrKSlj8AvM39haoyfPRk,10599 +pip/_vendor/pep517/wrappers.pyc,, +pip/_vendor/pkg_resources/__init__.py,sha256=XpGBfvS9fafA6bm5rx7vnxdxs7yqyoc_NnpzKApkJ64,108277 +pip/_vendor/pkg_resources/__init__.pyc,, +pip/_vendor/pkg_resources/py31compat.py,sha256=CRk8fkiPRDLsbi5pZcKsHI__Pbmh_94L8mr9Qy9Ab2U,562 +pip/_vendor/pkg_resources/py31compat.pyc,, +pip/_vendor/progress/__init__.py,sha256=fcbQQXo5np2CoQyhSH5XprkicwLZNLePR3uIahznSO0,4857 +pip/_vendor/progress/__init__.pyc,, +pip/_vendor/progress/bar.py,sha256=QuDuVNcmXgpxtNtxO0Fq72xKigxABaVmxYGBw4J3Z_E,2854 +pip/_vendor/progress/bar.pyc,, +pip/_vendor/progress/counter.py,sha256=MznyBrvPWrOlGe4MZAlGUb9q3aODe6_aNYeAE_VNoYA,1372 +pip/_vendor/progress/counter.pyc,, +pip/_vendor/progress/spinner.py,sha256=k8JbDW94T0-WXuXfxZIFhdoNPYp3jfnpXqBnfRv5fGs,1380 +pip/_vendor/progress/spinner.pyc,, +pip/_vendor/pyparsing.py,sha256=_9UdBKfzmMgIpLtacjV7T1HDfnXomNxlzNEJSCZfyMA,272429 +pip/_vendor/pyparsing.pyc,, +pip/_vendor/pytoml/__init__.py,sha256=W_SKx36Hsew-Fty36BOpreLm4uF4V_Tgkm_z9rIoOE8,127 +pip/_vendor/pytoml/__init__.pyc,, +pip/_vendor/pytoml/core.py,sha256=9CrLLTs1PdWjEwRnYzt_i4dhHcZvGxs_GsMlYAX3iY4,509 +pip/_vendor/pytoml/core.pyc,, +pip/_vendor/pytoml/parser.py,sha256=qsc0NRnTgdFZgRp9gmr6D_KWFelrwxLkTj9dVxUcqS8,10309 +pip/_vendor/pytoml/parser.pyc,, +pip/_vendor/pytoml/test.py,sha256=2nQs4aX3XQEaaQCx6x_OJTS2Hb0_IiTZRqNOeDmLCzo,1021 +pip/_vendor/pytoml/test.pyc,, +pip/_vendor/pytoml/utils.py,sha256=JCLHx77Hu1R3F-bRgiROIiKyCzLwyebnp5P35cRJxWs,1665 +pip/_vendor/pytoml/utils.pyc,, +pip/_vendor/pytoml/writer.py,sha256=4QQky9JSuRv60uzuhVZASU8T3CuobSkLG1285X6bDW8,3369 +pip/_vendor/pytoml/writer.pyc,, +pip/_vendor/requests/__init__.py,sha256=ONVsH6kJuPTV9nf-XVoubWsVX3qVtjCyju42kTW6Uug,4074 +pip/_vendor/requests/__init__.pyc,, +pip/_vendor/requests/__version__.py,sha256=Bm-GFstQaFezsFlnmEMrJDe8JNROz9n2XXYtODdvjjc,436 +pip/_vendor/requests/__version__.pyc,, +pip/_vendor/requests/_internal_utils.py,sha256=Zx3PnEUccyfsB-ie11nZVAW8qClJy0gx1qNME7rgT18,1096 +pip/_vendor/requests/_internal_utils.pyc,, +pip/_vendor/requests/adapters.py,sha256=e-bmKEApNVqFdylxuMJJfiaHdlmS_zhWhIMEzlHvGuc,21548 +pip/_vendor/requests/adapters.pyc,, +pip/_vendor/requests/api.py,sha256=fbUo11QoLOoNgWU6FfvNz8vMj9bE_cMmICXBa7TZHJs,6271 +pip/_vendor/requests/api.pyc,, +pip/_vendor/requests/auth.py,sha256=QB2-cSUj1jrvWZfPXttsZpyAacQgtKLVk14vQW9TpSE,10206 +pip/_vendor/requests/auth.pyc,, +pip/_vendor/requests/certs.py,sha256=nXRVq9DtGmv_1AYbwjTu9UrgAcdJv05ZvkNeaoLOZxY,465 +pip/_vendor/requests/certs.pyc,, +pip/_vendor/requests/compat.py,sha256=FZX4Q_EMKiMnhZpZ3g_gOsT-j2ca9ij2gehDx1cwYeo,1941 +pip/_vendor/requests/compat.pyc,, +pip/_vendor/requests/cookies.py,sha256=Y-bKX6TvW3FnYlE6Au0SXtVVWcaNdFvuAwQxw-G0iTI,18430 +pip/_vendor/requests/cookies.pyc,, +pip/_vendor/requests/exceptions.py,sha256=-mLam3TAx80V09EaH3H-ZxR61eAVuLRZ8zgBBSLjK44,3197 +pip/_vendor/requests/exceptions.pyc,, +pip/_vendor/requests/help.py,sha256=SJPVcoXeo7KfK4AxJN5eFVQCjr0im87tU2n7ubLsksU,3578 +pip/_vendor/requests/help.pyc,, +pip/_vendor/requests/hooks.py,sha256=QReGyy0bRcr5rkwCuObNakbYsc7EkiKeBwG4qHekr2Q,757 +pip/_vendor/requests/hooks.pyc,, +pip/_vendor/requests/models.py,sha256=6s-37iAqXVptq8z7U_LoH_pbIPrCQUm_Z8QuIGE29Q0,34275 +pip/_vendor/requests/models.pyc,, +pip/_vendor/requests/packages.py,sha256=njJmVifY4aSctuW3PP5EFRCxjEwMRDO6J_feG2dKWsI,695 +pip/_vendor/requests/packages.pyc,, +pip/_vendor/requests/sessions.py,sha256=DjbCotDW6xSAaBsjbW-L8l4N0UcwmrxVNgSrZgIjGWM,29332 +pip/_vendor/requests/sessions.pyc,, +pip/_vendor/requests/status_codes.py,sha256=XWlcpBjbCtq9sSqpH9_KKxgnLTf9Z__wCWolq21ySlg,4129 +pip/_vendor/requests/status_codes.pyc,, +pip/_vendor/requests/structures.py,sha256=zoP8qly2Jak5e89HwpqjN1z2diztI-_gaqts1raJJBc,2981 +pip/_vendor/requests/structures.pyc,, +pip/_vendor/requests/utils.py,sha256=LtPJ1db6mJff2TJSJWKi7rBpzjPS3mSOrjC9zRhoD3A,30049 +pip/_vendor/requests/utils.pyc,, +pip/_vendor/retrying.py,sha256=k3fflf5_Mm0XcIJYhB7Tj34bqCCPhUDkYbx1NvW2FPE,9972 +pip/_vendor/retrying.pyc,, +pip/_vendor/six.py,sha256=Q6WvEXZ1DGEASAo3CGNCJkKv2tPy8xkSmK-VHE9PYIA,34074 +pip/_vendor/six.pyc,, +pip/_vendor/urllib3/__init__.py,sha256=--dxP-3k5qC8gGCQJbU_jJK666_rbCduadrwRB25wZg,2683 +pip/_vendor/urllib3/__init__.pyc,, +pip/_vendor/urllib3/_collections.py,sha256=GouVsNzwg6jADZTmimMI6oqmwKSswnMo9dh5tGNVWO4,10792 +pip/_vendor/urllib3/_collections.pyc,, +pip/_vendor/urllib3/connection.py,sha256=JaGozqRdvNogTwHDGxbp2N3Hi2MtJQrkbr7b5qcBGXk,15168 +pip/_vendor/urllib3/connection.pyc,, +pip/_vendor/urllib3/connectionpool.py,sha256=2RPMZJU_PhkAbY1tvy3-W_9os4Kdk_XXu8Zi6YSCgSU,36488 +pip/_vendor/urllib3/connectionpool.pyc,, +pip/_vendor/urllib3/contrib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_vendor/urllib3/contrib/__init__.pyc,, +pip/_vendor/urllib3/contrib/_appengine_environ.py,sha256=PCxFG7RoB-AOkIWQWGBIg1yZnK0dwPxWcNx7BTpZFBI,909 +pip/_vendor/urllib3/contrib/_appengine_environ.pyc,, +pip/_vendor/urllib3/contrib/_securetransport/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_vendor/urllib3/contrib/_securetransport/__init__.pyc,, +pip/_vendor/urllib3/contrib/_securetransport/bindings.py,sha256=mullWYFaghBdRWla6HYU-TBgFRTPLBEfxj3jplbeJmQ,16886 +pip/_vendor/urllib3/contrib/_securetransport/bindings.pyc,, +pip/_vendor/urllib3/contrib/_securetransport/low_level.py,sha256=V7GnujxnWZh2N2sMsV5N4d9Imymokkm3zBwgt77_bSE,11956 +pip/_vendor/urllib3/contrib/_securetransport/low_level.pyc,, +pip/_vendor/urllib3/contrib/appengine.py,sha256=gfdK4T7CRin7v9HRhHDbDh-Hbk66hHDWeoz7nV3PJo8,11034 +pip/_vendor/urllib3/contrib/appengine.pyc,, +pip/_vendor/urllib3/contrib/ntlmpool.py,sha256=a402AwGN_Ll3N-4ur_AS6UrU-ycUtlnYqoBF76lORg8,4160 +pip/_vendor/urllib3/contrib/ntlmpool.pyc,, +pip/_vendor/urllib3/contrib/pyopenssl.py,sha256=w35mWy_1POZUsbOhurVb_zhf0C1Jkd79AFlucLs6KuQ,16440 +pip/_vendor/urllib3/contrib/pyopenssl.pyc,, +pip/_vendor/urllib3/contrib/securetransport.py,sha256=iKzVUAxKnChsADR5YMwc05oEixXDzAk0xPU0g-rc2z8,32275 +pip/_vendor/urllib3/contrib/securetransport.pyc,, +pip/_vendor/urllib3/contrib/socks.py,sha256=nzDMgDIFJWVubKHqvIn2-SKCO91hhJInP92WgHChGzA,7036 +pip/_vendor/urllib3/contrib/socks.pyc,, +pip/_vendor/urllib3/exceptions.py,sha256=P3e-p9_LScyIxX7FoR3wU0A6hZmDqFAVCz2wgI3D0lM,6607 +pip/_vendor/urllib3/exceptions.pyc,, +pip/_vendor/urllib3/fields.py,sha256=kroD76QK-GdHHW7f_AUN4XxDC3OQPI2FFrS9eSL4BCs,8553 +pip/_vendor/urllib3/fields.pyc,, +pip/_vendor/urllib3/filepost.py,sha256=vj0qbrpT1AFzvvW4SuC8M5kJiw7wftHcSr-7b8UpPpw,2440 +pip/_vendor/urllib3/filepost.pyc,, +pip/_vendor/urllib3/packages/__init__.py,sha256=h4BLhD4tLaBx1adaDtKXfupsgqY0wWLXb_f1_yVlV6A,108 +pip/_vendor/urllib3/packages/__init__.pyc,, +pip/_vendor/urllib3/packages/backports/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_vendor/urllib3/packages/backports/__init__.pyc,, +pip/_vendor/urllib3/packages/backports/makefile.py,sha256=005wrvH-_pWSnTFqQ2sdzzh4zVCtQUUQ4mR2Yyxwc0A,1418 +pip/_vendor/urllib3/packages/backports/makefile.pyc,, +pip/_vendor/urllib3/packages/six.py,sha256=adx4z-eM_D0Vvu0IIqVzFACQ_ux9l64y7DkSEfbxCDs,32536 +pip/_vendor/urllib3/packages/six.pyc,, +pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.py,sha256=ywgKMtfHi1-DrXlzPfVAhzsLzzqcK7GT6eLgdode1Fg,688 +pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.pyc,, +pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.py,sha256=rvQDQviqQLtPJB6MfEgABnBFj3nXft7ZJ3Dx-BC0AQY,5696 +pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.pyc,, +pip/_vendor/urllib3/poolmanager.py,sha256=JYUyBUN3IiEknUdjZ7VJrpCQr6SP7vi0WwSndrn8XpE,17053 +pip/_vendor/urllib3/poolmanager.pyc,, +pip/_vendor/urllib3/request.py,sha256=hhoHvEEatyd9Tn5EbGjQ0emn-ENMCyY591yNWTneINA,6018 +pip/_vendor/urllib3/request.pyc,, +pip/_vendor/urllib3/response.py,sha256=O2DVzBeWOzyxZDZ8k0EDFU3GW1jWXk_b03mS0O1ybxs,27836 +pip/_vendor/urllib3/response.pyc,, +pip/_vendor/urllib3/util/__init__.py,sha256=bWNaav_OT-1L7-sxm59cGb59rDORlbhb_4noduM5m0U,1038 +pip/_vendor/urllib3/util/__init__.pyc,, +pip/_vendor/urllib3/util/connection.py,sha256=NsxUAKQ98GKywta--zg57CdVpeTCI6N-GElCq78Dl8U,4637 +pip/_vendor/urllib3/util/connection.pyc,, +pip/_vendor/urllib3/util/queue.py,sha256=myTX3JDHntglKQNBf3b6dasHH-uF-W59vzGSQiFdAfI,497 +pip/_vendor/urllib3/util/queue.pyc,, +pip/_vendor/urllib3/util/request.py,sha256=C-6-AWffxZG03AdRGoY59uqsn4CVItKU6gjxz7Hc3Mc,3815 +pip/_vendor/urllib3/util/request.pyc,, +pip/_vendor/urllib3/util/response.py,sha256=_WbTQr8xRQuJuY2rTIZxVdJD6mnEOtQupjaK_bF_Vj8,2573 +pip/_vendor/urllib3/util/response.pyc,, +pip/_vendor/urllib3/util/retry.py,sha256=Ui74h44gLIIWkAxT9SK3A2mEvu55-odWgJMw3LiUNGk,15450 +pip/_vendor/urllib3/util/retry.pyc,, +pip/_vendor/urllib3/util/ssl_.py,sha256=7mB3AsidIqLLq6gbeBL-7Ta0MyVOL5uZax8_5bH3y7c,14163 +pip/_vendor/urllib3/util/ssl_.pyc,, +pip/_vendor/urllib3/util/timeout.py,sha256=bCtaS_xVKaTDJ5VMlroXBfCnPUDNVGZqik7-z83issg,9871 +pip/_vendor/urllib3/util/timeout.pyc,, +pip/_vendor/urllib3/util/url.py,sha256=jXDEENCiE7gZPFcCMxTCcNjkQw6nbpgqSuIUPrS07FI,14113 +pip/_vendor/urllib3/util/url.pyc,, +pip/_vendor/urllib3/util/wait.py,sha256=k46KzqIYu3Vnzla5YW3EvtInNlU_QycFqQAghIOxoAg,5406 +pip/_vendor/urllib3/util/wait.pyc,, +pip/_vendor/webencodings/__init__.py,sha256=qOBJIuPy_4ByYH6W_bNgJF-qYQ2DoU-dKsDu5yRWCXg,10579 +pip/_vendor/webencodings/__init__.pyc,, +pip/_vendor/webencodings/labels.py,sha256=4AO_KxTddqGtrL9ns7kAPjb0CcN6xsCIxbK37HY9r3E,8979 +pip/_vendor/webencodings/labels.pyc,, +pip/_vendor/webencodings/mklabels.py,sha256=GYIeywnpaLnP0GSic8LFWgd0UVvO_l1Nc6YoF-87R_4,1305 +pip/_vendor/webencodings/mklabels.pyc,, +pip/_vendor/webencodings/tests.py,sha256=OtGLyjhNY1fvkW1GvLJ_FV9ZoqC9Anyjr7q3kxTbzNs,6563 +pip/_vendor/webencodings/tests.pyc,, +pip/_vendor/webencodings/x_user_defined.py,sha256=yOqWSdmpytGfUgh_Z6JYgDNhoc-BAHyyeeT15Fr42tM,4307 +pip/_vendor/webencodings/x_user_defined.pyc,, diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip-20.0.2.dist-info/RECORD 2 b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip-20.0.2.dist-info/RECORD 2 new file mode 100644 index 0000000..04cb791 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip-20.0.2.dist-info/RECORD 2 @@ -0,0 +1,704 @@ +../../../bin/pip,sha256=FOR8B20lehN56Rfo0OU8AjdVD4X6T6KCHIbAGpfcLvM,258 +../../../bin/pip2,sha256=FOR8B20lehN56Rfo0OU8AjdVD4X6T6KCHIbAGpfcLvM,258 +../../../bin/pip2.7,sha256=FOR8B20lehN56Rfo0OU8AjdVD4X6T6KCHIbAGpfcLvM,258 +pip-20.0.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +pip-20.0.2.dist-info/LICENSE.txt,sha256=W6Ifuwlk-TatfRU2LR7W1JMcyMj5_y1NkRkOEJvnRDE,1090 +pip-20.0.2.dist-info/METADATA,sha256=MSgjT2JTt8usp4Hopp5AGEmc-7sKR2Jd7HTMJqCoRhw,3352 +pip-20.0.2.dist-info/RECORD,, +pip-20.0.2.dist-info/WHEEL,sha256=8zNYZbwQSXoB9IfXOjPfeNwvAsALAjffgk27FqvCWbo,110 +pip-20.0.2.dist-info/entry_points.txt,sha256=HtfDOwpUlr9s73jqLQ6wF9V0_0qvUXJwCBz7Vwx0Ue0,125 +pip-20.0.2.dist-info/top_level.txt,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +pip/__init__.py,sha256=U1AM82iShMaw90K6Yq0Q2-AZ1EsOcqQLQRB-rxwFtII,455 +pip/__init__.pyc,, +pip/__main__.py,sha256=NM95x7KuQr-lwPoTjAC0d_QzLJsJjpmAoxZg0mP8s98,632 +pip/__main__.pyc,, +pip/_internal/__init__.py,sha256=j5fiII6yCeZjpW7_7wAVRMM4DwE-gyARGVU4yAADDeE,517 +pip/_internal/__init__.pyc,, +pip/_internal/build_env.py,sha256=--aNgzIdYrCOclHMwoAdpclCpfdFE_jooRuCy5gczwg,7532 +pip/_internal/build_env.pyc,, +pip/_internal/cache.py,sha256=16GrnDRLBQNlfKWIuIF6Sa-EFS78kez_w1WEjT3ykTI,11605 +pip/_internal/cache.pyc,, +pip/_internal/cli/__init__.py,sha256=FkHBgpxxb-_gd6r1FjnNhfMOzAUYyXoXKJ6abijfcFU,132 +pip/_internal/cli/__init__.pyc,, +pip/_internal/cli/autocompletion.py,sha256=ekGNtcDI0p7rFVc-7s4T9Tbss4Jgb7vsB649XJIblRg,6547 +pip/_internal/cli/autocompletion.pyc,, +pip/_internal/cli/base_command.py,sha256=v6yl5XNRqye8BT9ep8wvpMu6lylP_Hu6D95r_HqbpbQ,7948 +pip/_internal/cli/base_command.pyc,, +pip/_internal/cli/cmdoptions.py,sha256=pppqSTy3R7YLFqSRLdVmwwO6ZIvQ1MmWYHPaXr4wvuI,28115 +pip/_internal/cli/cmdoptions.pyc,, +pip/_internal/cli/command_context.py,sha256=ygMVoTy2jpNilKT-6416gFSQpaBtrKRBbVbi2fy__EU,975 +pip/_internal/cli/command_context.pyc,, +pip/_internal/cli/main.py,sha256=8iq3bHe5lxJTB2EvKOqZ38NS0MmoS79_S1kgj4QuH8A,2610 +pip/_internal/cli/main.pyc,, +pip/_internal/cli/main_parser.py,sha256=W9OWeryh7ZkqELohaFh0Ko9sB98ZkSeDmnYbOZ1imBc,2819 +pip/_internal/cli/main_parser.pyc,, +pip/_internal/cli/parser.py,sha256=O9djTuYQuSfObiY-NU6p4MJCfWsRUnDpE2YGA_fwols,9487 +pip/_internal/cli/parser.pyc,, +pip/_internal/cli/req_command.py,sha256=pAUAglpTn0mUA6lRs7KN71yOm1KDabD0ySVTQTqWTSA,12463 +pip/_internal/cli/req_command.pyc,, +pip/_internal/cli/status_codes.py,sha256=F6uDG6Gj7RNKQJUDnd87QKqI16Us-t-B0wPF_4QMpWc,156 +pip/_internal/cli/status_codes.pyc,, +pip/_internal/commands/__init__.py,sha256=uTSj58QlrSKeXqCUSdL-eAf_APzx5BHy1ABxb0j5ZNE,3714 +pip/_internal/commands/__init__.pyc,, +pip/_internal/commands/check.py,sha256=mgLNYT3bd6Kmynwh4zzcBmVlFZ-urMo40jTgk6U405E,1505 +pip/_internal/commands/check.pyc,, +pip/_internal/commands/completion.py,sha256=UFQvq0Q4_B96z1bvnQyMOq82aPSu05RejbLmqeTZjC0,2975 +pip/_internal/commands/completion.pyc,, +pip/_internal/commands/configuration.py,sha256=6riioZjMhsNSEct7dE-X8SobGodk3WERKJvuyjBje4Q,7226 +pip/_internal/commands/configuration.pyc,, +pip/_internal/commands/debug.py,sha256=a8llax2hRkxgK-tvwdJgaCaZCYPIx0fDvrlMDoYr8bQ,4209 +pip/_internal/commands/debug.pyc,, +pip/_internal/commands/download.py,sha256=zX_0-IeFb4C8dxSmGHxk-6H5kehtyTSsdWpjNpAhSww,5007 +pip/_internal/commands/download.pyc,, +pip/_internal/commands/freeze.py,sha256=G9I_yoBHlpWLX1qItsWNOmmqc8ET7pekFybdbV333d4,3464 +pip/_internal/commands/freeze.pyc,, +pip/_internal/commands/hash.py,sha256=47teimfAPhpkaVbSDaafck51BT3XXYuL83lAqc5lOcE,1735 +pip/_internal/commands/hash.pyc,, +pip/_internal/commands/help.py,sha256=Nhecq--ydFn80Gm1Zvbf9943EcRJfO0TnXUhsF0RO7s,1181 +pip/_internal/commands/help.pyc,, +pip/_internal/commands/install.py,sha256=WYv_h_pIcO7i-Iur2Y84GfzOEB5UJmQ-xY74ZJwA8dw,26252 +pip/_internal/commands/install.pyc,, +pip/_internal/commands/list.py,sha256=RqjYu3-Bo_mdh5BYbq1zBU_WTz2C8H8S2Z0_1EG7GXA,10563 +pip/_internal/commands/list.pyc,, +pip/_internal/commands/search.py,sha256=7Il8nKZ9mM7qF5jlnBoPvSIFY9f-0-5IbYoX3miTuZY,5148 +pip/_internal/commands/search.pyc,, +pip/_internal/commands/show.py,sha256=Vzsj2oX0JBl94MPyF3LV8YoMcigl8B2UsMM8zp0pH2s,6792 +pip/_internal/commands/show.pyc,, +pip/_internal/commands/uninstall.py,sha256=8mldFbrQecSoWDZRqxBgJkrlvx6Y9Iy7cs-2BIgtXt4,2983 +pip/_internal/commands/uninstall.pyc,, +pip/_internal/commands/wheel.py,sha256=TMU5ZhjLo7BIZQApGPsYfoCsbGTnvP-N9jkgPJXhj1Y,7170 +pip/_internal/commands/wheel.pyc,, +pip/_internal/configuration.py,sha256=MgKrLFBJBkF3t2VJM4tvlnEspfSuS4scp_LhHWh53nY,14222 +pip/_internal/configuration.pyc,, +pip/_internal/distributions/__init__.py,sha256=ECBUW5Gtu9TjJwyFLvim-i6kUMYVuikNh9I5asL6tbA,959 +pip/_internal/distributions/__init__.pyc,, +pip/_internal/distributions/base.py,sha256=ruprpM_L2T2HNi3KLUHlbHimZ1sWVw-3Q0Lb8O7TDAI,1425 +pip/_internal/distributions/base.pyc,, +pip/_internal/distributions/installed.py,sha256=YqlkBKr6TVP1MAYS6SG8ojud21wVOYLMZ8jMLJe9MSU,760 +pip/_internal/distributions/installed.pyc,, +pip/_internal/distributions/sdist.py,sha256=D4XTMlCwgPlK69l62GLYkNSVTVe99fR5iAcVt2EbGok,4086 +pip/_internal/distributions/sdist.pyc,, +pip/_internal/distributions/wheel.py,sha256=95uD-TfaYoq3KiKBdzk9YMN4RRqJ28LNoSTS2K46gek,1294 +pip/_internal/distributions/wheel.pyc,, +pip/_internal/exceptions.py,sha256=6YRuwXAK6F1iyUWKIkCIpWWN2khkAn1sZOgrFA9S8Ro,10247 +pip/_internal/exceptions.pyc,, +pip/_internal/index/__init__.py,sha256=vpt-JeTZefh8a-FC22ZeBSXFVbuBcXSGiILhQZJaNpQ,30 +pip/_internal/index/__init__.pyc,, +pip/_internal/index/collector.py,sha256=YS7Ix4oylU7ZbPTPFugh-244GSRqMvdHsGUG6nmz2gE,17892 +pip/_internal/index/collector.pyc,, +pip/_internal/index/package_finder.py,sha256=2Rg75AOpLj8BN1jyL8EI-Iw-Hv6ibJkrYVARCht3bX8,37542 +pip/_internal/index/package_finder.pyc,, +pip/_internal/legacy_resolve.py,sha256=L7R72I7CjVgJlPTggmA1j4b-H8NmxNu_dKVhrpGXGps,16277 +pip/_internal/legacy_resolve.pyc,, +pip/_internal/locations.py,sha256=VifFEqhc7FWFV8QGoEM3CpECRY8Doq7kTytytxsEgx0,6734 +pip/_internal/locations.pyc,, +pip/_internal/main.py,sha256=IVBnUQ-FG7DK6617uEXRB5_QJqspAsBFmTmTesYkbdQ,437 +pip/_internal/main.pyc,, +pip/_internal/models/__init__.py,sha256=3DHUd_qxpPozfzouoqa9g9ts1Czr5qaHfFxbnxriepM,63 +pip/_internal/models/__init__.pyc,, +pip/_internal/models/candidate.py,sha256=Y58Bcm6oXUj0iS-yhmerlGo5CQJI2p0Ww9h6hR9zQDw,1150 +pip/_internal/models/candidate.pyc,, +pip/_internal/models/format_control.py,sha256=ICzVjjGwfZYdX-eLLKHjMHLutEJlAGpfj09OG_eMqac,2673 +pip/_internal/models/format_control.pyc,, +pip/_internal/models/index.py,sha256=K59A8-hVhBM20Xkahr4dTwP7OjkJyEqXH11UwHFVgqM,1060 +pip/_internal/models/index.pyc,, +pip/_internal/models/link.py,sha256=y0H2ZOk0P6d1lfGUL2Pl09xFgZcRt5HwN2LElMifOpI,6827 +pip/_internal/models/link.pyc,, +pip/_internal/models/scheme.py,sha256=vvhBrrno7eVDXcdKHiZWwxhPHf4VG5uSCEkC0QDR2RU,679 +pip/_internal/models/scheme.pyc,, +pip/_internal/models/search_scope.py,sha256=2LXbU4wV8LwqdtXQXNXFYKv-IxiDI_QwSz9ZgbwtAfk,3898 +pip/_internal/models/search_scope.pyc,, +pip/_internal/models/selection_prefs.py,sha256=rPeif2KKjhTPXeMoQYffjqh10oWpXhdkxRDaPT1HO8k,1908 +pip/_internal/models/selection_prefs.pyc,, +pip/_internal/models/target_python.py,sha256=c-cFi6zCuo5HYbXNS3rVVpKRaHVh5yQlYEjEW23SidQ,3799 +pip/_internal/models/target_python.pyc,, +pip/_internal/models/wheel.py,sha256=6KLuLKH5b0C5goWQXGSISRaq2UZtkHUEAU1y1Zsrwms,2766 +pip/_internal/models/wheel.pyc,, +pip/_internal/network/__init__.py,sha256=jf6Tt5nV_7zkARBrKojIXItgejvoegVJVKUbhAa5Ioc,50 +pip/_internal/network/__init__.pyc,, +pip/_internal/network/auth.py,sha256=K3G1ukKb3PiH8w_UnpXTz8qQsTULO-qdbfOE9zTo1fE,11119 +pip/_internal/network/auth.pyc,, +pip/_internal/network/cache.py,sha256=51CExcRkXWrgMZ7WsrZ6cmijKfViD5tVgKbBvJHO1IE,2394 +pip/_internal/network/cache.pyc,, +pip/_internal/network/download.py,sha256=3D9vdJmVwmCUMxzC-TaVI_GvVOpQna3BLEYNPCSx3Fc,6260 +pip/_internal/network/download.pyc,, +pip/_internal/network/session.py,sha256=u1IXQfv21R1xv86ulyiB58-be4sYm90eFB0Wp8fVMYw,14702 +pip/_internal/network/session.pyc,, +pip/_internal/network/utils.py,sha256=iiixo1OeaQ3niUWiBjg59PN6f1w7vvTww1vFriTD_IU,1959 +pip/_internal/network/utils.pyc,, +pip/_internal/network/xmlrpc.py,sha256=AL115M3vFJ8xiHVJneb8Hi0ZFeRvdPhblC89w25OG5s,1597 +pip/_internal/network/xmlrpc.pyc,, +pip/_internal/operations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_internal/operations/__init__.pyc,, +pip/_internal/operations/build/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_internal/operations/build/__init__.pyc,, +pip/_internal/operations/build/metadata.py,sha256=yHMi5gHYXcXyHcvUPWHdO-UyOo3McFWljn_nHfM1O9c,1307 +pip/_internal/operations/build/metadata.pyc,, +pip/_internal/operations/build/metadata_legacy.py,sha256=4n6N7BTysqVmEpITzT2UVClyt0Peij_Im8Qm965IWB4,3957 +pip/_internal/operations/build/metadata_legacy.pyc,, +pip/_internal/operations/build/wheel.py,sha256=ntltdNP6D2Tpr4V0agssu6rE0F9LaBpJkYT6zSdhEbw,1469 +pip/_internal/operations/build/wheel.pyc,, +pip/_internal/operations/build/wheel_legacy.py,sha256=DYSxQKutwSZnmNvWkwsl2HzE2XQBxV0i0wTphjtUe90,3349 +pip/_internal/operations/build/wheel_legacy.pyc,, +pip/_internal/operations/check.py,sha256=a6uHG0daoWpmSPCdL7iYJaGQYZ-CRvPvTnCv2PnIIs0,5353 +pip/_internal/operations/check.pyc,, +pip/_internal/operations/freeze.py,sha256=td4BeRnW10EXFTZrx6VgygO3CrjqD5B9f0BGzjQm-Ew,10180 +pip/_internal/operations/freeze.pyc,, +pip/_internal/operations/install/__init__.py,sha256=mX7hyD2GNBO2mFGokDQ30r_GXv7Y_PLdtxcUv144e-s,51 +pip/_internal/operations/install/__init__.pyc,, +pip/_internal/operations/install/editable_legacy.py,sha256=rJ_xs2qtDUjpY2-n6eYlVyZiNoKbOtZXZrYrcnIELt4,1488 +pip/_internal/operations/install/editable_legacy.pyc,, +pip/_internal/operations/install/legacy.py,sha256=eBV8gHbO9sBlBc-4nuR3Sd2nikHgEcnC9khfeLiypio,4566 +pip/_internal/operations/install/legacy.pyc,, +pip/_internal/operations/install/wheel.py,sha256=xdCjH6uIUyg39Pf8tUaMFUN4a7eozJAFMb_wKcgQlsY,23012 +pip/_internal/operations/install/wheel.pyc,, +pip/_internal/operations/prepare.py,sha256=ro2teBlbBpkRJhBKraP9CoJgVLpueSk62ziWhRToXww,20942 +pip/_internal/operations/prepare.pyc,, +pip/_internal/pep425tags.py,sha256=SlIQokevkoKnXhoK3PZvXiDoj8hFKoJ7thDifDtga3k,5490 +pip/_internal/pep425tags.pyc,, +pip/_internal/pyproject.py,sha256=kB966ZCSxiZQRa3W2RXN9as5pRuKW6Elnb4xdqDxASg,7404 +pip/_internal/pyproject.pyc,, +pip/_internal/req/__init__.py,sha256=UVaYPlHZVGRBQQPjvGC_6jJDQtewXm0ws-8Lxhg_TiY,2671 +pip/_internal/req/__init__.pyc,, +pip/_internal/req/constructors.py,sha256=w5-kWWVCqlSqcIBitw86yq7XGMPpKrHDfQZSE2mJ_xc,14388 +pip/_internal/req/constructors.pyc,, +pip/_internal/req/req_file.py,sha256=ECqRUicCw5Y08R1YynZAAp8dSKQhDXoc1Q-mY3a9b6I,18485 +pip/_internal/req/req_file.pyc,, +pip/_internal/req/req_install.py,sha256=wjsIr4lDpbVSLqANKJI9mXwRVHaRxcnj8q30UiHoLRA,30442 +pip/_internal/req/req_install.pyc,, +pip/_internal/req/req_set.py,sha256=GsrKmupRKhNMhjkofVfCEHEHfgEvYBxClaQH5xLBQHg,8066 +pip/_internal/req/req_set.pyc,, +pip/_internal/req/req_tracker.py,sha256=27fvVG8Y2MJS1KpU2rBMnQyUEMHG4lkHT_bzbzQK-c0,4723 +pip/_internal/req/req_tracker.pyc,, +pip/_internal/req/req_uninstall.py,sha256=DWnOsuyYGju6-sylyoCm7GtUNevn9qMAVhjAGLcdXUE,23609 +pip/_internal/req/req_uninstall.pyc,, +pip/_internal/self_outdated_check.py,sha256=3KO1pTJUuYaiV9X0t87I9PimkGL82HbhLWbocqKZpBU,8009 +pip/_internal/self_outdated_check.pyc,, +pip/_internal/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_internal/utils/__init__.pyc,, +pip/_internal/utils/appdirs.py,sha256=frpKbfJiyKLgpPDYNDrPtkfaZ0akY9SyB7ryPV29sMg,1144 +pip/_internal/utils/appdirs.pyc,, +pip/_internal/utils/compat.py,sha256=D7FKGLBdQwWH-dHIGaoWMawDZWBYApvtJVL1kFPJ930,8869 +pip/_internal/utils/compat.pyc,, +pip/_internal/utils/deprecation.py,sha256=pBnNogoA4UGTxa_JDnPXBRRYpKMbExAhXpBwAwklOBs,3318 +pip/_internal/utils/deprecation.pyc,, +pip/_internal/utils/distutils_args.py,sha256=a56mblNxk9BGifbpEETG61mmBrqhjtjRkJ4HYn-oOEE,1350 +pip/_internal/utils/distutils_args.pyc,, +pip/_internal/utils/encoding.py,sha256=hxZz0t3Whw3d4MHQEiofxalTlfKwxFdLc8fpeGfhKo8,1320 +pip/_internal/utils/encoding.pyc,, +pip/_internal/utils/entrypoints.py,sha256=vHcNpnksCv6mllihU6hfifdsKPEjwcaJ1aLIXEaynaU,1152 +pip/_internal/utils/entrypoints.pyc,, +pip/_internal/utils/filesystem.py,sha256=PXa3vMcz4mbEKtkD0joFI8pBwddLQxhfPFOkVH5xjfE,5255 +pip/_internal/utils/filesystem.pyc,, +pip/_internal/utils/filetypes.py,sha256=R2FwzoeX7b-rZALOXx5cuO8VPPMhUQ4ne7wm3n3IcWA,571 +pip/_internal/utils/filetypes.pyc,, +pip/_internal/utils/glibc.py,sha256=LOeNGgawCKS-4ke9fii78fwXD73dtNav3uxz1Bf-Ab8,3297 +pip/_internal/utils/glibc.pyc,, +pip/_internal/utils/hashes.py,sha256=my-wSnAWEDvl_8rQaOQcVIWjwh1-f_QiEvGy9TPf53U,3942 +pip/_internal/utils/hashes.pyc,, +pip/_internal/utils/inject_securetransport.py,sha256=M17ZlFVY66ApgeASVjKKLKNz0LAfk-SyU0HZ4ZB6MmI,810 +pip/_internal/utils/inject_securetransport.pyc,, +pip/_internal/utils/logging.py,sha256=aJL7NldPhS5KGFof6Qt3o3MG5cjm5TOoo7bGRu9_wsg,13033 +pip/_internal/utils/logging.pyc,, +pip/_internal/utils/marker_files.py,sha256=CO5djQlrPIozJpJybViH_insoAaBGY1aqEt6-cC-iW0,741 +pip/_internal/utils/marker_files.pyc,, +pip/_internal/utils/misc.py,sha256=itSJCAJfjGJiUaQyooUPxqjjy21M71GXsVn4wFEIMJA,25334 +pip/_internal/utils/misc.pyc,, +pip/_internal/utils/models.py,sha256=IA0hw_T4awQzui0kqfIEASm5yLtgZAB08ag59Nip5G8,1148 +pip/_internal/utils/models.pyc,, +pip/_internal/utils/packaging.py,sha256=VtiwcAAL7LBi7tGL2je7LeW4bE11KMHGCsJ1NZY5XtM,3035 +pip/_internal/utils/packaging.pyc,, +pip/_internal/utils/pkg_resources.py,sha256=ZX-k7V5q_aNWyDse92nN7orN1aCpRLsaxzpkBZ1XKzU,1254 +pip/_internal/utils/pkg_resources.pyc,, +pip/_internal/utils/setuptools_build.py,sha256=DouaVolV9olDDFIIN9IszaL-FHdNaZt10ufOZFH9ZAU,5070 +pip/_internal/utils/setuptools_build.pyc,, +pip/_internal/utils/subprocess.py,sha256=Ph3x5eHQBxFotyGhpZN8asSMBud-BBkmgaNfARG-di8,9922 +pip/_internal/utils/subprocess.pyc,, +pip/_internal/utils/temp_dir.py,sha256=87Ib8aNic_hoSDEmUYJHTQIn5-prL2AYL5u_yZ3s4sI,7768 +pip/_internal/utils/temp_dir.pyc,, +pip/_internal/utils/typing.py,sha256=xkYwOeHlf4zsHXBDC4310HtEqwhQcYXFPq2h35Tcrl0,1401 +pip/_internal/utils/typing.pyc,, +pip/_internal/utils/ui.py,sha256=0FNxXlGtbpPtTviv2oXS9t8bQG_NBdfUgP4GbubhS9U,13911 +pip/_internal/utils/ui.pyc,, +pip/_internal/utils/unpacking.py,sha256=M944JTSiapBOSKLWu7lbawpVHSE7flfzZTEr3TAG7v8,9438 +pip/_internal/utils/unpacking.pyc,, +pip/_internal/utils/urls.py,sha256=aNV9wq5ClUmrz6sG-al7hEWJ4ToitOy7l82CmFGFNW8,1481 +pip/_internal/utils/urls.pyc,, +pip/_internal/utils/virtualenv.py,sha256=Q3S1WPlI7JWpGOT2jUVJ8l2chm_k7VPJ9cHA_cUluEU,3396 +pip/_internal/utils/virtualenv.pyc,, +pip/_internal/utils/wheel.py,sha256=grTRwZtMQwApwbbSPmRVLtac6FKy6SVKeCXNkWyyePA,7302 +pip/_internal/utils/wheel.pyc,, +pip/_internal/vcs/__init__.py,sha256=viJxJRqRE_mVScum85bgQIXAd6o0ozFt18VpC-qIJrM,617 +pip/_internal/vcs/__init__.pyc,, +pip/_internal/vcs/bazaar.py,sha256=84q1-kj1_nJ9AMzMu8RmMp-riRZu81M7K9kowcYgi3U,3957 +pip/_internal/vcs/bazaar.pyc,, +pip/_internal/vcs/git.py,sha256=X0j5jv_x3ZnM_NP09B1ZDxW-PAmfHzqOqX7Wf5XW--0,14058 +pip/_internal/vcs/git.pyc,, +pip/_internal/vcs/mercurial.py,sha256=2mg7BdYI_Fe00fF6omaNccFQLPHBsDBG5CAEzvqn5sA,5110 +pip/_internal/vcs/mercurial.pyc,, +pip/_internal/vcs/subversion.py,sha256=Fpwy71AmuqXnoKi6h1SrXRtPjEMn8fieuM1O4j01IBg,12292 +pip/_internal/vcs/subversion.pyc,, +pip/_internal/vcs/versioncontrol.py,sha256=nqoaM1_rzx24WnHtihXA8RcPpnUae0sV2sR_LS_5HFA,22600 +pip/_internal/vcs/versioncontrol.pyc,, +pip/_internal/wheel_builder.py,sha256=gr9jE14W5ZuYblpldo-tpRuyG0e0AVmHLttImuAvXlE,9441 +pip/_internal/wheel_builder.pyc,, +pip/_vendor/__init__.py,sha256=gEJYEfJm7XGLslyjW3KBQyQxyTYxdvTEkRT5Bz28MDs,4657 +pip/_vendor/__init__.pyc,, +pip/_vendor/appdirs.py,sha256=kVvdzRSQW6hsZYPMrct3jav-CGIZ4horsK7KnUTjt7w,26130 +pip/_vendor/appdirs.pyc,, +pip/_vendor/cachecontrol/__init__.py,sha256=pJtAaUxOsMPnytI1A3juAJkXYDr8krdSnsg4Yg3OBEg,302 +pip/_vendor/cachecontrol/__init__.pyc,, +pip/_vendor/cachecontrol/_cmd.py,sha256=URGE0KrA87QekCG3SGPatlSPT571dZTDjNa-ZXX3pDc,1295 +pip/_vendor/cachecontrol/_cmd.pyc,, +pip/_vendor/cachecontrol/adapter.py,sha256=sSwaSYd93IIfCFU4tOMgSo6b2LCt_gBSaQUj8ktJFOA,4882 +pip/_vendor/cachecontrol/adapter.pyc,, +pip/_vendor/cachecontrol/cache.py,sha256=1fc4wJP8HYt1ycnJXeEw5pCpeBL2Cqxx6g9Fb0AYDWQ,805 +pip/_vendor/cachecontrol/cache.pyc,, +pip/_vendor/cachecontrol/caches/__init__.py,sha256=-gHNKYvaeD0kOk5M74eOrsSgIKUtC6i6GfbmugGweEo,86 +pip/_vendor/cachecontrol/caches/__init__.pyc,, +pip/_vendor/cachecontrol/caches/file_cache.py,sha256=nYVKsJtXh6gJXvdn1iWyrhxvkwpQrK-eKoMRzuiwkKk,4153 +pip/_vendor/cachecontrol/caches/file_cache.pyc,, +pip/_vendor/cachecontrol/caches/redis_cache.py,sha256=HxelMpNCo-dYr2fiJDwM3hhhRmxUYtB5tXm1GpAAT4Y,856 +pip/_vendor/cachecontrol/caches/redis_cache.pyc,, +pip/_vendor/cachecontrol/compat.py,sha256=kHNvMRdt6s_Xwqq_9qJmr9ou3wYMOMUMxPPcwNxT8Mc,695 +pip/_vendor/cachecontrol/compat.pyc,, +pip/_vendor/cachecontrol/controller.py,sha256=CWEX3pedIM9s60suf4zZPtm_JvVgnvogMGK_OiBG5F8,14149 +pip/_vendor/cachecontrol/controller.pyc,, +pip/_vendor/cachecontrol/filewrapper.py,sha256=vACKO8Llzu_ZWyjV1Fxn1MA4TGU60N5N3GSrAFdAY2Q,2533 +pip/_vendor/cachecontrol/filewrapper.pyc,, +pip/_vendor/cachecontrol/heuristics.py,sha256=BFGHJ3yQcxvZizfo90LLZ04T_Z5XSCXvFotrp7Us0sc,4070 +pip/_vendor/cachecontrol/heuristics.pyc,, +pip/_vendor/cachecontrol/serialize.py,sha256=vIa4jvq4x_KSOLdEIedoknX2aXYHQujLDFV4-F21Dno,7091 +pip/_vendor/cachecontrol/serialize.pyc,, +pip/_vendor/cachecontrol/wrapper.py,sha256=5LX0uJwkNQUtYSEw3aGmGu9WY8wGipd81mJ8lG0d0M4,690 +pip/_vendor/cachecontrol/wrapper.pyc,, +pip/_vendor/certifi/__init__.py,sha256=JVwzDhkMttyVVtfNDrU_i0v2a-WmtEBXq0Z8oz4Ghzk,52 +pip/_vendor/certifi/__init__.pyc,, +pip/_vendor/certifi/__main__.py,sha256=NaCn6WtWME-zzVWQ2j4zFyl8cY4knDa9CwtHNIeFPhM,53 +pip/_vendor/certifi/__main__.pyc,, +pip/_vendor/certifi/cacert.pem,sha256=cyvv5Jx1gHACNEj2GaOrsIj0Tk8FmSvHR42uhzvlatg,281457 +pip/_vendor/certifi/core.py,sha256=EuFc2BsToG5O1-qsx4BSjQ1r1-7WRtH87b1WflZOWhI,218 +pip/_vendor/certifi/core.pyc,, +pip/_vendor/chardet/__init__.py,sha256=YsP5wQlsHJ2auF1RZJfypiSrCA7_bQiRm3ES_NI76-Y,1559 +pip/_vendor/chardet/__init__.pyc,, +pip/_vendor/chardet/big5freq.py,sha256=D_zK5GyzoVsRes0HkLJziltFQX0bKCLOrFe9_xDvO_8,31254 +pip/_vendor/chardet/big5freq.pyc,, +pip/_vendor/chardet/big5prober.py,sha256=kBxHbdetBpPe7xrlb-e990iot64g_eGSLd32lB7_h3M,1757 +pip/_vendor/chardet/big5prober.pyc,, +pip/_vendor/chardet/chardistribution.py,sha256=3woWS62KrGooKyqz4zQSnjFbJpa6V7g02daAibTwcl8,9411 +pip/_vendor/chardet/chardistribution.pyc,, +pip/_vendor/chardet/charsetgroupprober.py,sha256=6bDu8YIiRuScX4ca9Igb0U69TA2PGXXDej6Cc4_9kO4,3787 +pip/_vendor/chardet/charsetgroupprober.pyc,, +pip/_vendor/chardet/charsetprober.py,sha256=KSmwJErjypyj0bRZmC5F5eM7c8YQgLYIjZXintZNstg,5110 +pip/_vendor/chardet/charsetprober.pyc,, +pip/_vendor/chardet/cli/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1 +pip/_vendor/chardet/cli/__init__.pyc,, +pip/_vendor/chardet/cli/chardetect.py,sha256=DI8dlV3FBD0c0XA_y3sQ78z754DUv1J8n34RtDjOXNw,2774 +pip/_vendor/chardet/cli/chardetect.pyc,, +pip/_vendor/chardet/codingstatemachine.py,sha256=VYp_6cyyki5sHgXDSZnXW4q1oelHc3cu9AyQTX7uug8,3590 +pip/_vendor/chardet/codingstatemachine.pyc,, +pip/_vendor/chardet/compat.py,sha256=PKTzHkSbtbHDqS9PyujMbX74q1a8mMpeQTDVsQhZMRw,1134 +pip/_vendor/chardet/compat.pyc,, +pip/_vendor/chardet/cp949prober.py,sha256=TZ434QX8zzBsnUvL_8wm4AQVTZ2ZkqEEQL_lNw9f9ow,1855 +pip/_vendor/chardet/cp949prober.pyc,, +pip/_vendor/chardet/enums.py,sha256=Aimwdb9as1dJKZaFNUH2OhWIVBVd6ZkJJ_WK5sNY8cU,1661 +pip/_vendor/chardet/enums.pyc,, +pip/_vendor/chardet/escprober.py,sha256=kkyqVg1Yw3DIOAMJ2bdlyQgUFQhuHAW8dUGskToNWSc,3950 +pip/_vendor/chardet/escprober.pyc,, +pip/_vendor/chardet/escsm.py,sha256=RuXlgNvTIDarndvllNCk5WZBIpdCxQ0kcd9EAuxUh84,10510 +pip/_vendor/chardet/escsm.pyc,, +pip/_vendor/chardet/eucjpprober.py,sha256=iD8Jdp0ISRjgjiVN7f0e8xGeQJ5GM2oeZ1dA8nbSeUw,3749 +pip/_vendor/chardet/eucjpprober.pyc,, +pip/_vendor/chardet/euckrfreq.py,sha256=-7GdmvgWez4-eO4SuXpa7tBiDi5vRXQ8WvdFAzVaSfo,13546 +pip/_vendor/chardet/euckrfreq.pyc,, +pip/_vendor/chardet/euckrprober.py,sha256=MqFMTQXxW4HbzIpZ9lKDHB3GN8SP4yiHenTmf8g_PxY,1748 +pip/_vendor/chardet/euckrprober.pyc,, +pip/_vendor/chardet/euctwfreq.py,sha256=No1WyduFOgB5VITUA7PLyC5oJRNzRyMbBxaKI1l16MA,31621 +pip/_vendor/chardet/euctwfreq.pyc,, +pip/_vendor/chardet/euctwprober.py,sha256=13p6EP4yRaxqnP4iHtxHOJ6R2zxHq1_m8hTRjzVZ95c,1747 +pip/_vendor/chardet/euctwprober.pyc,, +pip/_vendor/chardet/gb2312freq.py,sha256=JX8lsweKLmnCwmk8UHEQsLgkr_rP_kEbvivC4qPOrlc,20715 +pip/_vendor/chardet/gb2312freq.pyc,, +pip/_vendor/chardet/gb2312prober.py,sha256=gGvIWi9WhDjE-xQXHvNIyrnLvEbMAYgyUSZ65HUfylw,1754 +pip/_vendor/chardet/gb2312prober.pyc,, +pip/_vendor/chardet/hebrewprober.py,sha256=c3SZ-K7hvyzGY6JRAZxJgwJ_sUS9k0WYkvMY00YBYFo,13838 +pip/_vendor/chardet/hebrewprober.pyc,, +pip/_vendor/chardet/jisfreq.py,sha256=vpmJv2Bu0J8gnMVRPHMFefTRvo_ha1mryLig8CBwgOg,25777 +pip/_vendor/chardet/jisfreq.pyc,, +pip/_vendor/chardet/jpcntx.py,sha256=PYlNqRUQT8LM3cT5FmHGP0iiscFlTWED92MALvBungo,19643 +pip/_vendor/chardet/jpcntx.pyc,, +pip/_vendor/chardet/langbulgarianmodel.py,sha256=1HqQS9Pbtnj1xQgxitJMvw8X6kKr5OockNCZWfEQrPE,12839 +pip/_vendor/chardet/langbulgarianmodel.pyc,, +pip/_vendor/chardet/langcyrillicmodel.py,sha256=LODajvsetH87yYDDQKA2CULXUH87tI223dhfjh9Zx9c,17948 +pip/_vendor/chardet/langcyrillicmodel.pyc,, +pip/_vendor/chardet/langgreekmodel.py,sha256=8YAW7bU8YwSJap0kIJSbPMw1BEqzGjWzqcqf0WgUKAA,12688 +pip/_vendor/chardet/langgreekmodel.pyc,, +pip/_vendor/chardet/langhebrewmodel.py,sha256=JSnqmE5E62tDLTPTvLpQsg5gOMO4PbdWRvV7Avkc0HA,11345 +pip/_vendor/chardet/langhebrewmodel.pyc,, +pip/_vendor/chardet/langhungarianmodel.py,sha256=RhapYSG5l0ZaO-VV4Fan5sW0WRGQqhwBM61yx3yxyOA,12592 +pip/_vendor/chardet/langhungarianmodel.pyc,, +pip/_vendor/chardet/langthaimodel.py,sha256=8l0173Gu_W6G8mxmQOTEF4ls2YdE7FxWf3QkSxEGXJQ,11290 +pip/_vendor/chardet/langthaimodel.pyc,, +pip/_vendor/chardet/langturkishmodel.py,sha256=W22eRNJsqI6uWAfwXSKVWWnCerYqrI8dZQTm_M0lRFk,11102 +pip/_vendor/chardet/langturkishmodel.pyc,, +pip/_vendor/chardet/latin1prober.py,sha256=S2IoORhFk39FEFOlSFWtgVybRiP6h7BlLldHVclNkU8,5370 +pip/_vendor/chardet/latin1prober.pyc,, +pip/_vendor/chardet/mbcharsetprober.py,sha256=AR95eFH9vuqSfvLQZN-L5ijea25NOBCoXqw8s5O9xLQ,3413 +pip/_vendor/chardet/mbcharsetprober.pyc,, +pip/_vendor/chardet/mbcsgroupprober.py,sha256=h6TRnnYq2OxG1WdD5JOyxcdVpn7dG0q-vB8nWr5mbh4,2012 +pip/_vendor/chardet/mbcsgroupprober.pyc,, +pip/_vendor/chardet/mbcssm.py,sha256=SY32wVIF3HzcjY3BaEspy9metbNSKxIIB0RKPn7tjpI,25481 +pip/_vendor/chardet/mbcssm.pyc,, +pip/_vendor/chardet/sbcharsetprober.py,sha256=LDSpCldDCFlYwUkGkwD2oFxLlPWIWXT09akH_2PiY74,5657 +pip/_vendor/chardet/sbcharsetprober.pyc,, +pip/_vendor/chardet/sbcsgroupprober.py,sha256=1IprcCB_k1qfmnxGC6MBbxELlKqD3scW6S8YIwdeyXA,3546 +pip/_vendor/chardet/sbcsgroupprober.pyc,, +pip/_vendor/chardet/sjisprober.py,sha256=IIt-lZj0WJqK4rmUZzKZP4GJlE8KUEtFYVuY96ek5MQ,3774 +pip/_vendor/chardet/sjisprober.pyc,, +pip/_vendor/chardet/universaldetector.py,sha256=qL0174lSZE442eB21nnktT9_VcAye07laFWUeUrjttY,12485 +pip/_vendor/chardet/universaldetector.pyc,, +pip/_vendor/chardet/utf8prober.py,sha256=IdD8v3zWOsB8OLiyPi-y_fqwipRFxV9Nc1eKBLSuIEw,2766 +pip/_vendor/chardet/utf8prober.pyc,, +pip/_vendor/chardet/version.py,sha256=sp3B08mrDXB-pf3K9fqJ_zeDHOCLC8RrngQyDFap_7g,242 +pip/_vendor/chardet/version.pyc,, +pip/_vendor/colorama/__init__.py,sha256=DqjXH9URVP3IJwmMt7peYw50ns1RNAymIB9-XdPEFV8,239 +pip/_vendor/colorama/__init__.pyc,, +pip/_vendor/colorama/ansi.py,sha256=Fi0un-QLqRm-v7o_nKiOqyC8PapBJK7DLV_q9LKtTO0,2524 +pip/_vendor/colorama/ansi.pyc,, +pip/_vendor/colorama/ansitowin32.py,sha256=u8QaqdqS_xYSfNkPM1eRJLHz6JMWPodaJaP0mxgHCDc,10462 +pip/_vendor/colorama/ansitowin32.pyc,, +pip/_vendor/colorama/initialise.py,sha256=PprovDNxMTrvoNHFcL2NZjpH2XzDc8BLxLxiErfUl4k,1915 +pip/_vendor/colorama/initialise.pyc,, +pip/_vendor/colorama/win32.py,sha256=bJ8Il9jwaBN5BJ8bmN6FoYZ1QYuMKv2j8fGrXh7TJjw,5404 +pip/_vendor/colorama/win32.pyc,, +pip/_vendor/colorama/winterm.py,sha256=2y_2b7Zsv34feAsP67mLOVc-Bgq51mdYGo571VprlrM,6438 +pip/_vendor/colorama/winterm.pyc,, +pip/_vendor/contextlib2.py,sha256=5HjGflUzwWAUfcILhSmC2GqvoYdZZzFzVfIDztHigUs,16915 +pip/_vendor/contextlib2.pyc,, +pip/_vendor/distlib/__init__.py,sha256=gzl1hjUXmDGrqRyU7ZLjBwJGAcMimQbrZ22XPVaKaRE,581 +pip/_vendor/distlib/__init__.pyc,, +pip/_vendor/distlib/_backport/__init__.py,sha256=bqS_dTOH6uW9iGgd0uzfpPjo6vZ4xpPZ7kyfZJ2vNaw,274 +pip/_vendor/distlib/_backport/__init__.pyc,, +pip/_vendor/distlib/_backport/misc.py,sha256=KWecINdbFNOxSOP1fGF680CJnaC6S4fBRgEtaYTw0ig,971 +pip/_vendor/distlib/_backport/misc.pyc,, +pip/_vendor/distlib/_backport/shutil.py,sha256=VW1t3uYqUjWZH7jV-6QiimLhnldoV5uIpH4EuiT1jfw,25647 +pip/_vendor/distlib/_backport/shutil.pyc,, +pip/_vendor/distlib/_backport/sysconfig.cfg,sha256=swZKxq9RY5e9r3PXCrlvQPMsvOdiWZBTHLEbqS8LJLU,2617 +pip/_vendor/distlib/_backport/sysconfig.py,sha256=BQHFlb6pubCl_dvT1NjtzIthylofjKisox239stDg0U,26854 +pip/_vendor/distlib/_backport/sysconfig.pyc,, +pip/_vendor/distlib/_backport/tarfile.py,sha256=Ihp7rXRcjbIKw8COm9wSePV9ARGXbSF9gGXAMn2Q-KU,92628 +pip/_vendor/distlib/_backport/tarfile.pyc,, +pip/_vendor/distlib/compat.py,sha256=xdNZmqFN5HwF30HjRn5M415pcC2kgXRBXn767xS8v-M,41404 +pip/_vendor/distlib/compat.pyc,, +pip/_vendor/distlib/database.py,sha256=fhNzEDtb4HXrpxKyQvhVzDXcOiJlzrOM--UYnvCeZrI,51045 +pip/_vendor/distlib/database.pyc,, +pip/_vendor/distlib/index.py,sha256=SXKzpQCERctxYDMp_OLee2f0J0e19ZhGdCIoMlUfUQM,21066 +pip/_vendor/distlib/index.pyc,, +pip/_vendor/distlib/locators.py,sha256=c9E4cDEacJ_uKbuE5BqAVocoWp6rsuBGTkiNDQq3zV4,52100 +pip/_vendor/distlib/locators.pyc,, +pip/_vendor/distlib/manifest.py,sha256=nQEhYmgoreaBZzyFzwYsXxJARu3fo4EkunU163U16iE,14811 +pip/_vendor/distlib/manifest.pyc,, +pip/_vendor/distlib/markers.py,sha256=6Ac3cCfFBERexiESWIOXmg-apIP8l2esafNSX3KMy-8,4387 +pip/_vendor/distlib/markers.pyc,, +pip/_vendor/distlib/metadata.py,sha256=OhbCKmf5lswE8unWBopI1hj7tRpHp4ZbFvU4d6aAEMM,40234 +pip/_vendor/distlib/metadata.pyc,, +pip/_vendor/distlib/resources.py,sha256=2FGv0ZHF14KXjLIlL0R991lyQQGcewOS4mJ-5n-JVnc,10766 +pip/_vendor/distlib/resources.pyc,, +pip/_vendor/distlib/scripts.py,sha256=OAkEwxRvIzX-VSfhEttQEKJFVLA47gbW0OgQXJRs7OQ,16998 +pip/_vendor/distlib/scripts.pyc,, +pip/_vendor/distlib/t32.exe,sha256=NS3xBCVAld35JVFNmb-1QRyVtThukMrwZVeXn4LhaEQ,96768 +pip/_vendor/distlib/t64.exe,sha256=oAqHes78rUWVM0OtVqIhUvequl_PKhAhXYQWnUf7zR0,105984 +pip/_vendor/distlib/util.py,sha256=f2jZCPrcLCt6LcnC0gUy-Fur60tXD8reA7k4rDpHMDw,59845 +pip/_vendor/distlib/util.pyc,, +pip/_vendor/distlib/version.py,sha256=_n7F6juvQGAcn769E_SHa7fOcf5ERlEVymJ_EjPRwGw,23391 +pip/_vendor/distlib/version.pyc,, +pip/_vendor/distlib/w32.exe,sha256=lJtnZdeUxTZWya_EW5DZos_K5rswRECGspIl8ZJCIXs,90112 +pip/_vendor/distlib/w64.exe,sha256=0aRzoN2BO9NWW4ENy4_4vHkHR4qZTFZNVSAJJYlODTI,99840 +pip/_vendor/distlib/wheel.py,sha256=bRtR5bNR_u_DwkwktN1bgZuwLVOJT1p_vNIUPyN8kJc,40452 +pip/_vendor/distlib/wheel.pyc,, +pip/_vendor/distro.py,sha256=X2So5kjrRKyMbQJ90Xgy93HU5eFtujCzKaYNeoy1k1c,43251 +pip/_vendor/distro.pyc,, +pip/_vendor/html5lib/__init__.py,sha256=Ztrn7UvF-wIFAgRBBa0ML-Gu5AffH3BPX_INJx4SaBI,1162 +pip/_vendor/html5lib/__init__.pyc,, +pip/_vendor/html5lib/_ihatexml.py,sha256=3LBtJMlzgwM8vpQiU1TvGmEEmNH72sV0yD8yS53y07A,16705 +pip/_vendor/html5lib/_ihatexml.pyc,, +pip/_vendor/html5lib/_inputstream.py,sha256=bPUWcAfJScK4xkjQQaG_HsI2BvEVbFvI0AsodDYPQj0,32552 +pip/_vendor/html5lib/_inputstream.pyc,, +pip/_vendor/html5lib/_tokenizer.py,sha256=YAaOEBD6qc5ISq9Xt9Nif1OFgcybTTfMdwqBkZhpAq4,76580 +pip/_vendor/html5lib/_tokenizer.pyc,, +pip/_vendor/html5lib/_trie/__init__.py,sha256=8VR1bcgD2OpeS2XExpu5yBhP_Q1K-lwKbBKICBPf1kU,289 +pip/_vendor/html5lib/_trie/__init__.pyc,, +pip/_vendor/html5lib/_trie/_base.py,sha256=CaybYyMro8uERQYjby2tTeSUatnWDfWroUN9N7ety5w,1013 +pip/_vendor/html5lib/_trie/_base.pyc,, +pip/_vendor/html5lib/_trie/datrie.py,sha256=EQpqSfkZRuTbE-DuhW7xMdVDxdZNZ0CfmnYfHA_3zxM,1178 +pip/_vendor/html5lib/_trie/datrie.pyc,, +pip/_vendor/html5lib/_trie/py.py,sha256=wXmQLrZRf4MyWNyg0m3h81m9InhLR7GJ002mIIZh-8o,1775 +pip/_vendor/html5lib/_trie/py.pyc,, +pip/_vendor/html5lib/_utils.py,sha256=ismpASeqa2jqEPQjHUj8vReAf7yIoKnvLN5fuOw6nv0,4015 +pip/_vendor/html5lib/_utils.pyc,, +pip/_vendor/html5lib/constants.py,sha256=4lmZWLtEPRLnl8NzftOoYTJdo6jpeMtP6dqQC0g_bWQ,83518 +pip/_vendor/html5lib/constants.pyc,, +pip/_vendor/html5lib/filters/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_vendor/html5lib/filters/__init__.pyc,, +pip/_vendor/html5lib/filters/alphabeticalattributes.py,sha256=lViZc2JMCclXi_5gduvmdzrRxtO5Xo9ONnbHBVCsykU,919 +pip/_vendor/html5lib/filters/alphabeticalattributes.pyc,, +pip/_vendor/html5lib/filters/base.py,sha256=z-IU9ZAYjpsVsqmVt7kuWC63jR11hDMr6CVrvuao8W0,286 +pip/_vendor/html5lib/filters/base.pyc,, +pip/_vendor/html5lib/filters/inject_meta_charset.py,sha256=egDXUEHXmAG9504xz0K6ALDgYkvUrC2q15YUVeNlVQg,2945 +pip/_vendor/html5lib/filters/inject_meta_charset.pyc,, +pip/_vendor/html5lib/filters/lint.py,sha256=jk6q56xY0ojiYfvpdP-OZSm9eTqcAdRqhCoPItemPYA,3643 +pip/_vendor/html5lib/filters/lint.pyc,, +pip/_vendor/html5lib/filters/optionaltags.py,sha256=8lWT75J0aBOHmPgfmqTHSfPpPMp01T84NKu0CRedxcE,10588 +pip/_vendor/html5lib/filters/optionaltags.pyc,, +pip/_vendor/html5lib/filters/sanitizer.py,sha256=4ON02KNjuqda1lCw5_JCUZxb0BzWR5M7ON84dtJ7dm0,26248 +pip/_vendor/html5lib/filters/sanitizer.pyc,, +pip/_vendor/html5lib/filters/whitespace.py,sha256=8eWqZxd4UC4zlFGW6iyY6f-2uuT8pOCSALc3IZt7_t4,1214 +pip/_vendor/html5lib/filters/whitespace.pyc,, +pip/_vendor/html5lib/html5parser.py,sha256=g5g2ezkusHxhi7b23vK_-d6K6BfIJRbqIQmvQ9z4EgI,118963 +pip/_vendor/html5lib/html5parser.pyc,, +pip/_vendor/html5lib/serializer.py,sha256=yfcfBHse2wDs6ojxn-kieJjLT5s1ipilQJ0gL3-rJis,15758 +pip/_vendor/html5lib/serializer.pyc,, +pip/_vendor/html5lib/treeadapters/__init__.py,sha256=A0rY5gXIe4bJOiSGRO_j_tFhngRBO8QZPzPtPw5dFzo,679 +pip/_vendor/html5lib/treeadapters/__init__.pyc,, +pip/_vendor/html5lib/treeadapters/genshi.py,sha256=CH27pAsDKmu4ZGkAUrwty7u0KauGLCZRLPMzaO3M5vo,1715 +pip/_vendor/html5lib/treeadapters/genshi.pyc,, +pip/_vendor/html5lib/treeadapters/sax.py,sha256=BKS8woQTnKiqeffHsxChUqL4q2ZR_wb5fc9MJ3zQC8s,1776 +pip/_vendor/html5lib/treeadapters/sax.pyc,, +pip/_vendor/html5lib/treebuilders/__init__.py,sha256=AysSJyvPfikCMMsTVvaxwkgDieELD5dfR8FJIAuq7hY,3592 +pip/_vendor/html5lib/treebuilders/__init__.pyc,, +pip/_vendor/html5lib/treebuilders/base.py,sha256=wQGp5yy22TNG8tJ6aREe4UUeTR7A99dEz0BXVaedWb4,14579 +pip/_vendor/html5lib/treebuilders/base.pyc,, +pip/_vendor/html5lib/treebuilders/dom.py,sha256=22whb0C71zXIsai5mamg6qzBEiigcBIvaDy4Asw3at0,8925 +pip/_vendor/html5lib/treebuilders/dom.pyc,, +pip/_vendor/html5lib/treebuilders/etree.py,sha256=aqIBOGj_dFYqBURIcTegGNBhAIJOw5iFDHb4jrkYH-8,12764 +pip/_vendor/html5lib/treebuilders/etree.pyc,, +pip/_vendor/html5lib/treebuilders/etree_lxml.py,sha256=9V0dXxbJYYq-Skgb5-_OL2NkVYpjioEb4CHajo0e9yI,14122 +pip/_vendor/html5lib/treebuilders/etree_lxml.pyc,, +pip/_vendor/html5lib/treewalkers/__init__.py,sha256=yhXxHpjlSqfQyUag3v8-vWjMPriFBU8YRAPNpDgBTn8,5714 +pip/_vendor/html5lib/treewalkers/__init__.pyc,, +pip/_vendor/html5lib/treewalkers/base.py,sha256=ouiOsuSzvI0KgzdWP8PlxIaSNs9falhbiinAEc_UIJY,7476 +pip/_vendor/html5lib/treewalkers/base.pyc,, +pip/_vendor/html5lib/treewalkers/dom.py,sha256=EHyFR8D8lYNnyDU9lx_IKigVJRyecUGua0mOi7HBukc,1413 +pip/_vendor/html5lib/treewalkers/dom.pyc,, +pip/_vendor/html5lib/treewalkers/etree.py,sha256=sz1o6mmE93NQ53qJFDO7HKyDtuwgK-Ay3qSFZPC6u00,4550 +pip/_vendor/html5lib/treewalkers/etree.pyc,, +pip/_vendor/html5lib/treewalkers/etree_lxml.py,sha256=sY6wfRshWTllu6n48TPWpKsQRPp-0CQrT0hj_AdzHSU,6309 +pip/_vendor/html5lib/treewalkers/etree_lxml.pyc,, +pip/_vendor/html5lib/treewalkers/genshi.py,sha256=4D2PECZ5n3ZN3qu3jMl9yY7B81jnQApBQSVlfaIuYbA,2309 +pip/_vendor/html5lib/treewalkers/genshi.pyc,, +pip/_vendor/idna/__init__.py,sha256=9Nt7xpyet3DmOrPUGooDdAwmHZZu1qUAy2EaJ93kGiQ,58 +pip/_vendor/idna/__init__.pyc,, +pip/_vendor/idna/codec.py,sha256=lvYb7yu7PhAqFaAIAdWcwgaWI2UmgseUua-1c0AsG0A,3299 +pip/_vendor/idna/codec.pyc,, +pip/_vendor/idna/compat.py,sha256=R-h29D-6mrnJzbXxymrWUW7iZUvy-26TQwZ0ij57i4U,232 +pip/_vendor/idna/compat.pyc,, +pip/_vendor/idna/core.py,sha256=JDCZZ_PLESqIgEbU8mPyoEufWwoOiIqygA17-QZIe3s,11733 +pip/_vendor/idna/core.pyc,, +pip/_vendor/idna/idnadata.py,sha256=HXaPFw6_YAJ0qppACPu0YLAULtRs3QovRM_CCZHGdY0,40899 +pip/_vendor/idna/idnadata.pyc,, +pip/_vendor/idna/intranges.py,sha256=TY1lpxZIQWEP6tNqjZkFA5hgoMWOj1OBmnUG8ihT87E,1749 +pip/_vendor/idna/intranges.pyc,, +pip/_vendor/idna/package_data.py,sha256=kIzeKKXEouXLR4srqwf9Q3zv-NffKSOz5aSDOJARPB0,21 +pip/_vendor/idna/package_data.pyc,, +pip/_vendor/idna/uts46data.py,sha256=oLyNZ1pBaiBlj9zFzLFRd_P7J8MkRcgDisjExZR_4MY,198292 +pip/_vendor/idna/uts46data.pyc,, +pip/_vendor/ipaddress.py,sha256=-0RmurI31XgAaN20WCi0zrcuoat90nNA70_6yGlx2PU,79875 +pip/_vendor/ipaddress.pyc,, +pip/_vendor/msgpack/__init__.py,sha256=LnKzG5v0RyZgs7KlY2-SZYDBn-toylovXxKiXR6C-IQ,1535 +pip/_vendor/msgpack/__init__.pyc,, +pip/_vendor/msgpack/_version.py,sha256=72BxB5FMl1q3Nz1hteHINzHhrFpXQ9nNtULaK52NLk8,20 +pip/_vendor/msgpack/_version.pyc,, +pip/_vendor/msgpack/exceptions.py,sha256=dCTWei8dpkrMsQDcjQk74ATl9HsIBH0ybt8zOPNqMYc,1081 +pip/_vendor/msgpack/exceptions.pyc,, +pip/_vendor/msgpack/fallback.py,sha256=vXo6S67Dmil9mz0PRBCLDu6znpv6CGKt9WPCEsdZx2A,37454 +pip/_vendor/msgpack/fallback.pyc,, +pip/_vendor/packaging/__about__.py,sha256=G5P2sPs0QxgVqD0zzcSjVLfY31ni6HVUh9ZWlHSAG3M,744 +pip/_vendor/packaging/__about__.pyc,, +pip/_vendor/packaging/__init__.py,sha256=6enbp5XgRfjBjsI9-bn00HjHf5TH21PDMOKkJW8xw-w,562 +pip/_vendor/packaging/__init__.pyc,, +pip/_vendor/packaging/_compat.py,sha256=Z-PwchK0cREbaRGF5MZP8LEv8JkC-qydn2FRrtjeixk,1138 +pip/_vendor/packaging/_compat.pyc,, +pip/_vendor/packaging/_structures.py,sha256=ozkCX8Q8f2qE1Eic3YiQ4buDVfgz2iYevY9e7R2y3iY,2022 +pip/_vendor/packaging/_structures.pyc,, +pip/_vendor/packaging/_typing.py,sha256=-cq_iNeveAWCVoseVvqmknWLbvZ_i9g7BeZBo0ShtHg,1449 +pip/_vendor/packaging/_typing.pyc,, +pip/_vendor/packaging/markers.py,sha256=yap5bk3c8QyPuGtiVbQSYhN70bxWj1nLDv2ZuaCLq7g,9501 +pip/_vendor/packaging/markers.pyc,, +pip/_vendor/packaging/requirements.py,sha256=G43p2ylM_REg87RLG9JybjbdwfaPyzaKYRtllRfNdrM,4913 +pip/_vendor/packaging/requirements.pyc,, +pip/_vendor/packaging/specifiers.py,sha256=Nz8bnFp53cQInmRGZy50QXlIi2tkDXMfRuGyGps2IRE,31314 +pip/_vendor/packaging/specifiers.pyc,, +pip/_vendor/packaging/tags.py,sha256=lJ_91F0icMlFvMp7EiKWPSzgJclNsEYdjdErhryfGj4,23510 +pip/_vendor/packaging/tags.pyc,, +pip/_vendor/packaging/utils.py,sha256=v5Wk8B7gUL13Rzed6NNhCZlutPQT7jNV-7hr-WOtacU,1700 +pip/_vendor/packaging/utils.pyc,, +pip/_vendor/packaging/version.py,sha256=qRdNN0_XuPFOJ3fut8ehzxJrNYtBzqF8ZtagEvgNUUM,15480 +pip/_vendor/packaging/version.pyc,, +pip/_vendor/pep517/__init__.py,sha256=nCw8ZdLH4c19g8xP_Ndag1KPdQhlSDKaL9pg-X7uNWU,84 +pip/_vendor/pep517/__init__.pyc,, +pip/_vendor/pep517/_in_process.py,sha256=v1Viek27-MGCOFu8eSlLd2jGCrIqc1fISnutGFoRDps,7792 +pip/_vendor/pep517/_in_process.pyc,, +pip/_vendor/pep517/build.py,sha256=WqM0-X4KyzY566qxGf3FeaYc1hw95H7YP0ElZ1zuTb0,3318 +pip/_vendor/pep517/build.pyc,, +pip/_vendor/pep517/check.py,sha256=ST02kRWBrRMOxgnRm9clw18Q2X7sJGaD4j3h6GmBhJ8,5949 +pip/_vendor/pep517/check.pyc,, +pip/_vendor/pep517/colorlog.py,sha256=Tk9AuYm_cLF3BKTBoSTJt9bRryn0aFojIQOwbfVUTxQ,4098 +pip/_vendor/pep517/colorlog.pyc,, +pip/_vendor/pep517/compat.py,sha256=M-5s4VNp8rjyT76ZZ_ibnPD44DYVzSQlyCEHayjtDPw,780 +pip/_vendor/pep517/compat.pyc,, +pip/_vendor/pep517/dirtools.py,sha256=2mkAkAL0mRz_elYFjRKuekTJVipH1zTn4tbf1EDev84,1129 +pip/_vendor/pep517/dirtools.pyc,, +pip/_vendor/pep517/envbuild.py,sha256=K4dIGAbkXf3RoQX_9RFpZvMvPrVSHtcbH7o9VSrNnlM,6024 +pip/_vendor/pep517/envbuild.pyc,, +pip/_vendor/pep517/meta.py,sha256=8mnM5lDnT4zXQpBTliJbRGfesH7iioHwozbDxALPS9Y,2463 +pip/_vendor/pep517/meta.pyc,, +pip/_vendor/pep517/wrappers.py,sha256=QiQaEQlfCrhRpPBFQiGVM9QjrKSlj8AvM39haoyfPRk,10599 +pip/_vendor/pep517/wrappers.pyc,, +pip/_vendor/pkg_resources/__init__.py,sha256=XpGBfvS9fafA6bm5rx7vnxdxs7yqyoc_NnpzKApkJ64,108277 +pip/_vendor/pkg_resources/__init__.pyc,, +pip/_vendor/pkg_resources/py31compat.py,sha256=CRk8fkiPRDLsbi5pZcKsHI__Pbmh_94L8mr9Qy9Ab2U,562 +pip/_vendor/pkg_resources/py31compat.pyc,, +pip/_vendor/progress/__init__.py,sha256=fcbQQXo5np2CoQyhSH5XprkicwLZNLePR3uIahznSO0,4857 +pip/_vendor/progress/__init__.pyc,, +pip/_vendor/progress/bar.py,sha256=QuDuVNcmXgpxtNtxO0Fq72xKigxABaVmxYGBw4J3Z_E,2854 +pip/_vendor/progress/bar.pyc,, +pip/_vendor/progress/counter.py,sha256=MznyBrvPWrOlGe4MZAlGUb9q3aODe6_aNYeAE_VNoYA,1372 +pip/_vendor/progress/counter.pyc,, +pip/_vendor/progress/spinner.py,sha256=k8JbDW94T0-WXuXfxZIFhdoNPYp3jfnpXqBnfRv5fGs,1380 +pip/_vendor/progress/spinner.pyc,, +pip/_vendor/pyparsing.py,sha256=_9UdBKfzmMgIpLtacjV7T1HDfnXomNxlzNEJSCZfyMA,272429 +pip/_vendor/pyparsing.pyc,, +pip/_vendor/pytoml/__init__.py,sha256=W_SKx36Hsew-Fty36BOpreLm4uF4V_Tgkm_z9rIoOE8,127 +pip/_vendor/pytoml/__init__.pyc,, +pip/_vendor/pytoml/core.py,sha256=9CrLLTs1PdWjEwRnYzt_i4dhHcZvGxs_GsMlYAX3iY4,509 +pip/_vendor/pytoml/core.pyc,, +pip/_vendor/pytoml/parser.py,sha256=qsc0NRnTgdFZgRp9gmr6D_KWFelrwxLkTj9dVxUcqS8,10309 +pip/_vendor/pytoml/parser.pyc,, +pip/_vendor/pytoml/test.py,sha256=2nQs4aX3XQEaaQCx6x_OJTS2Hb0_IiTZRqNOeDmLCzo,1021 +pip/_vendor/pytoml/test.pyc,, +pip/_vendor/pytoml/utils.py,sha256=JCLHx77Hu1R3F-bRgiROIiKyCzLwyebnp5P35cRJxWs,1665 +pip/_vendor/pytoml/utils.pyc,, +pip/_vendor/pytoml/writer.py,sha256=4QQky9JSuRv60uzuhVZASU8T3CuobSkLG1285X6bDW8,3369 +pip/_vendor/pytoml/writer.pyc,, +pip/_vendor/requests/__init__.py,sha256=ONVsH6kJuPTV9nf-XVoubWsVX3qVtjCyju42kTW6Uug,4074 +pip/_vendor/requests/__init__.pyc,, +pip/_vendor/requests/__version__.py,sha256=Bm-GFstQaFezsFlnmEMrJDe8JNROz9n2XXYtODdvjjc,436 +pip/_vendor/requests/__version__.pyc,, +pip/_vendor/requests/_internal_utils.py,sha256=Zx3PnEUccyfsB-ie11nZVAW8qClJy0gx1qNME7rgT18,1096 +pip/_vendor/requests/_internal_utils.pyc,, +pip/_vendor/requests/adapters.py,sha256=e-bmKEApNVqFdylxuMJJfiaHdlmS_zhWhIMEzlHvGuc,21548 +pip/_vendor/requests/adapters.pyc,, +pip/_vendor/requests/api.py,sha256=fbUo11QoLOoNgWU6FfvNz8vMj9bE_cMmICXBa7TZHJs,6271 +pip/_vendor/requests/api.pyc,, +pip/_vendor/requests/auth.py,sha256=QB2-cSUj1jrvWZfPXttsZpyAacQgtKLVk14vQW9TpSE,10206 +pip/_vendor/requests/auth.pyc,, +pip/_vendor/requests/certs.py,sha256=nXRVq9DtGmv_1AYbwjTu9UrgAcdJv05ZvkNeaoLOZxY,465 +pip/_vendor/requests/certs.pyc,, +pip/_vendor/requests/compat.py,sha256=FZX4Q_EMKiMnhZpZ3g_gOsT-j2ca9ij2gehDx1cwYeo,1941 +pip/_vendor/requests/compat.pyc,, +pip/_vendor/requests/cookies.py,sha256=Y-bKX6TvW3FnYlE6Au0SXtVVWcaNdFvuAwQxw-G0iTI,18430 +pip/_vendor/requests/cookies.pyc,, +pip/_vendor/requests/exceptions.py,sha256=-mLam3TAx80V09EaH3H-ZxR61eAVuLRZ8zgBBSLjK44,3197 +pip/_vendor/requests/exceptions.pyc,, +pip/_vendor/requests/help.py,sha256=SJPVcoXeo7KfK4AxJN5eFVQCjr0im87tU2n7ubLsksU,3578 +pip/_vendor/requests/help.pyc,, +pip/_vendor/requests/hooks.py,sha256=QReGyy0bRcr5rkwCuObNakbYsc7EkiKeBwG4qHekr2Q,757 +pip/_vendor/requests/hooks.pyc,, +pip/_vendor/requests/models.py,sha256=6s-37iAqXVptq8z7U_LoH_pbIPrCQUm_Z8QuIGE29Q0,34275 +pip/_vendor/requests/models.pyc,, +pip/_vendor/requests/packages.py,sha256=njJmVifY4aSctuW3PP5EFRCxjEwMRDO6J_feG2dKWsI,695 +pip/_vendor/requests/packages.pyc,, +pip/_vendor/requests/sessions.py,sha256=DjbCotDW6xSAaBsjbW-L8l4N0UcwmrxVNgSrZgIjGWM,29332 +pip/_vendor/requests/sessions.pyc,, +pip/_vendor/requests/status_codes.py,sha256=XWlcpBjbCtq9sSqpH9_KKxgnLTf9Z__wCWolq21ySlg,4129 +pip/_vendor/requests/status_codes.pyc,, +pip/_vendor/requests/structures.py,sha256=zoP8qly2Jak5e89HwpqjN1z2diztI-_gaqts1raJJBc,2981 +pip/_vendor/requests/structures.pyc,, +pip/_vendor/requests/utils.py,sha256=LtPJ1db6mJff2TJSJWKi7rBpzjPS3mSOrjC9zRhoD3A,30049 +pip/_vendor/requests/utils.pyc,, +pip/_vendor/retrying.py,sha256=k3fflf5_Mm0XcIJYhB7Tj34bqCCPhUDkYbx1NvW2FPE,9972 +pip/_vendor/retrying.pyc,, +pip/_vendor/six.py,sha256=Q6WvEXZ1DGEASAo3CGNCJkKv2tPy8xkSmK-VHE9PYIA,34074 +pip/_vendor/six.pyc,, +pip/_vendor/urllib3/__init__.py,sha256=--dxP-3k5qC8gGCQJbU_jJK666_rbCduadrwRB25wZg,2683 +pip/_vendor/urllib3/__init__.pyc,, +pip/_vendor/urllib3/_collections.py,sha256=GouVsNzwg6jADZTmimMI6oqmwKSswnMo9dh5tGNVWO4,10792 +pip/_vendor/urllib3/_collections.pyc,, +pip/_vendor/urllib3/connection.py,sha256=JaGozqRdvNogTwHDGxbp2N3Hi2MtJQrkbr7b5qcBGXk,15168 +pip/_vendor/urllib3/connection.pyc,, +pip/_vendor/urllib3/connectionpool.py,sha256=2RPMZJU_PhkAbY1tvy3-W_9os4Kdk_XXu8Zi6YSCgSU,36488 +pip/_vendor/urllib3/connectionpool.pyc,, +pip/_vendor/urllib3/contrib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_vendor/urllib3/contrib/__init__.pyc,, +pip/_vendor/urllib3/contrib/_appengine_environ.py,sha256=PCxFG7RoB-AOkIWQWGBIg1yZnK0dwPxWcNx7BTpZFBI,909 +pip/_vendor/urllib3/contrib/_appengine_environ.pyc,, +pip/_vendor/urllib3/contrib/_securetransport/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_vendor/urllib3/contrib/_securetransport/__init__.pyc,, +pip/_vendor/urllib3/contrib/_securetransport/bindings.py,sha256=mullWYFaghBdRWla6HYU-TBgFRTPLBEfxj3jplbeJmQ,16886 +pip/_vendor/urllib3/contrib/_securetransport/bindings.pyc,, +pip/_vendor/urllib3/contrib/_securetransport/low_level.py,sha256=V7GnujxnWZh2N2sMsV5N4d9Imymokkm3zBwgt77_bSE,11956 +pip/_vendor/urllib3/contrib/_securetransport/low_level.pyc,, +pip/_vendor/urllib3/contrib/appengine.py,sha256=gfdK4T7CRin7v9HRhHDbDh-Hbk66hHDWeoz7nV3PJo8,11034 +pip/_vendor/urllib3/contrib/appengine.pyc,, +pip/_vendor/urllib3/contrib/ntlmpool.py,sha256=a402AwGN_Ll3N-4ur_AS6UrU-ycUtlnYqoBF76lORg8,4160 +pip/_vendor/urllib3/contrib/ntlmpool.pyc,, +pip/_vendor/urllib3/contrib/pyopenssl.py,sha256=w35mWy_1POZUsbOhurVb_zhf0C1Jkd79AFlucLs6KuQ,16440 +pip/_vendor/urllib3/contrib/pyopenssl.pyc,, +pip/_vendor/urllib3/contrib/securetransport.py,sha256=iKzVUAxKnChsADR5YMwc05oEixXDzAk0xPU0g-rc2z8,32275 +pip/_vendor/urllib3/contrib/securetransport.pyc,, +pip/_vendor/urllib3/contrib/socks.py,sha256=nzDMgDIFJWVubKHqvIn2-SKCO91hhJInP92WgHChGzA,7036 +pip/_vendor/urllib3/contrib/socks.pyc,, +pip/_vendor/urllib3/exceptions.py,sha256=P3e-p9_LScyIxX7FoR3wU0A6hZmDqFAVCz2wgI3D0lM,6607 +pip/_vendor/urllib3/exceptions.pyc,, +pip/_vendor/urllib3/fields.py,sha256=kroD76QK-GdHHW7f_AUN4XxDC3OQPI2FFrS9eSL4BCs,8553 +pip/_vendor/urllib3/fields.pyc,, +pip/_vendor/urllib3/filepost.py,sha256=vj0qbrpT1AFzvvW4SuC8M5kJiw7wftHcSr-7b8UpPpw,2440 +pip/_vendor/urllib3/filepost.pyc,, +pip/_vendor/urllib3/packages/__init__.py,sha256=h4BLhD4tLaBx1adaDtKXfupsgqY0wWLXb_f1_yVlV6A,108 +pip/_vendor/urllib3/packages/__init__.pyc,, +pip/_vendor/urllib3/packages/backports/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_vendor/urllib3/packages/backports/__init__.pyc,, +pip/_vendor/urllib3/packages/backports/makefile.py,sha256=005wrvH-_pWSnTFqQ2sdzzh4zVCtQUUQ4mR2Yyxwc0A,1418 +pip/_vendor/urllib3/packages/backports/makefile.pyc,, +pip/_vendor/urllib3/packages/six.py,sha256=adx4z-eM_D0Vvu0IIqVzFACQ_ux9l64y7DkSEfbxCDs,32536 +pip/_vendor/urllib3/packages/six.pyc,, +pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.py,sha256=ywgKMtfHi1-DrXlzPfVAhzsLzzqcK7GT6eLgdode1Fg,688 +pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.pyc,, +pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.py,sha256=rvQDQviqQLtPJB6MfEgABnBFj3nXft7ZJ3Dx-BC0AQY,5696 +pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.pyc,, +pip/_vendor/urllib3/poolmanager.py,sha256=JYUyBUN3IiEknUdjZ7VJrpCQr6SP7vi0WwSndrn8XpE,17053 +pip/_vendor/urllib3/poolmanager.pyc,, +pip/_vendor/urllib3/request.py,sha256=hhoHvEEatyd9Tn5EbGjQ0emn-ENMCyY591yNWTneINA,6018 +pip/_vendor/urllib3/request.pyc,, +pip/_vendor/urllib3/response.py,sha256=O2DVzBeWOzyxZDZ8k0EDFU3GW1jWXk_b03mS0O1ybxs,27836 +pip/_vendor/urllib3/response.pyc,, +pip/_vendor/urllib3/util/__init__.py,sha256=bWNaav_OT-1L7-sxm59cGb59rDORlbhb_4noduM5m0U,1038 +pip/_vendor/urllib3/util/__init__.pyc,, +pip/_vendor/urllib3/util/connection.py,sha256=NsxUAKQ98GKywta--zg57CdVpeTCI6N-GElCq78Dl8U,4637 +pip/_vendor/urllib3/util/connection.pyc,, +pip/_vendor/urllib3/util/queue.py,sha256=myTX3JDHntglKQNBf3b6dasHH-uF-W59vzGSQiFdAfI,497 +pip/_vendor/urllib3/util/queue.pyc,, +pip/_vendor/urllib3/util/request.py,sha256=C-6-AWffxZG03AdRGoY59uqsn4CVItKU6gjxz7Hc3Mc,3815 +pip/_vendor/urllib3/util/request.pyc,, +pip/_vendor/urllib3/util/response.py,sha256=_WbTQr8xRQuJuY2rTIZxVdJD6mnEOtQupjaK_bF_Vj8,2573 +pip/_vendor/urllib3/util/response.pyc,, +pip/_vendor/urllib3/util/retry.py,sha256=Ui74h44gLIIWkAxT9SK3A2mEvu55-odWgJMw3LiUNGk,15450 +pip/_vendor/urllib3/util/retry.pyc,, +pip/_vendor/urllib3/util/ssl_.py,sha256=7mB3AsidIqLLq6gbeBL-7Ta0MyVOL5uZax8_5bH3y7c,14163 +pip/_vendor/urllib3/util/ssl_.pyc,, +pip/_vendor/urllib3/util/timeout.py,sha256=bCtaS_xVKaTDJ5VMlroXBfCnPUDNVGZqik7-z83issg,9871 +pip/_vendor/urllib3/util/timeout.pyc,, +pip/_vendor/urllib3/util/url.py,sha256=jXDEENCiE7gZPFcCMxTCcNjkQw6nbpgqSuIUPrS07FI,14113 +pip/_vendor/urllib3/util/url.pyc,, +pip/_vendor/urllib3/util/wait.py,sha256=k46KzqIYu3Vnzla5YW3EvtInNlU_QycFqQAghIOxoAg,5406 +pip/_vendor/urllib3/util/wait.pyc,, +pip/_vendor/webencodings/__init__.py,sha256=qOBJIuPy_4ByYH6W_bNgJF-qYQ2DoU-dKsDu5yRWCXg,10579 +pip/_vendor/webencodings/__init__.pyc,, +pip/_vendor/webencodings/labels.py,sha256=4AO_KxTddqGtrL9ns7kAPjb0CcN6xsCIxbK37HY9r3E,8979 +pip/_vendor/webencodings/labels.pyc,, +pip/_vendor/webencodings/mklabels.py,sha256=GYIeywnpaLnP0GSic8LFWgd0UVvO_l1Nc6YoF-87R_4,1305 +pip/_vendor/webencodings/mklabels.pyc,, +pip/_vendor/webencodings/tests.py,sha256=OtGLyjhNY1fvkW1GvLJ_FV9ZoqC9Anyjr7q3kxTbzNs,6563 +pip/_vendor/webencodings/tests.pyc,, +pip/_vendor/webencodings/x_user_defined.py,sha256=yOqWSdmpytGfUgh_Z6JYgDNhoc-BAHyyeeT15Fr42tM,4307 +pip/_vendor/webencodings/x_user_defined.pyc,, diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip-20.0.2.dist-info/WHEEL b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip-20.0.2.dist-info/WHEEL new file mode 100644 index 0000000..8b701e9 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip-20.0.2.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.33.6) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip-20.0.2.dist-info/WHEEL 2 b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip-20.0.2.dist-info/WHEEL 2 new file mode 100644 index 0000000..8b701e9 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip-20.0.2.dist-info/WHEEL 2 @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.33.6) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip-20.0.2.dist-info/entry_points 2.txt b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip-20.0.2.dist-info/entry_points 2.txt new file mode 100644 index 0000000..d48bd8a --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip-20.0.2.dist-info/entry_points 2.txt @@ -0,0 +1,5 @@ +[console_scripts] +pip = pip._internal.cli.main:main +pip3 = pip._internal.cli.main:main +pip3.8 = pip._internal.cli.main:main + diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip-20.0.2.dist-info/entry_points.txt b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip-20.0.2.dist-info/entry_points.txt new file mode 100644 index 0000000..d48bd8a --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip-20.0.2.dist-info/entry_points.txt @@ -0,0 +1,5 @@ +[console_scripts] +pip = pip._internal.cli.main:main +pip3 = pip._internal.cli.main:main +pip3.8 = pip._internal.cli.main:main + diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip-20.0.2.dist-info/top_level 2.txt b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip-20.0.2.dist-info/top_level 2.txt new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip-20.0.2.dist-info/top_level 2.txt @@ -0,0 +1 @@ +pip diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip-20.0.2.dist-info/top_level.txt b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip-20.0.2.dist-info/top_level.txt new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip-20.0.2.dist-info/top_level.txt @@ -0,0 +1 @@ +pip diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/__init__.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/__init__.py new file mode 100644 index 0000000..827a4e2 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/__init__.py @@ -0,0 +1,18 @@ +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import List, Optional + + +__version__ = "20.0.2" + + +def main(args=None): + # type: (Optional[List[str]]) -> int + """This is an internal API only meant for use by pip's own console scripts. + + For additional details, see https://github.com/pypa/pip/issues/7498. + """ + from pip._internal.utils.entrypoints import _wrapper + + return _wrapper(args) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/__init__.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c0cbc6f148430a1dabb80660e6691a9d90962093 GIT binary patch literal 842 zcmcgq!EO^V5cOt5KtV_qH@M&%InZ^QRm2FIvZEJwpmXS7L^nH z1K-0p@c}Ti4JrrDjO@3wqw&mp9>+g#^gsQ0{9(p6*1_*n+~E)*#}%=Xu_|Jdh($VL zwP>RqR(4nwvq{XVE}L{&WHA^2udp0fmwm$%SIK`j=wT)E3vCdg2R9MkoF1Rb@yo;U zE1A7d)1&mofEq&=;k5|>*U)+E!8ohRKm|s_WSER*RDm*Sk8y|F2*@!!%b@wR;okVWfxETkGiQS< zH4n4ecnC?q&(WS^s>*Y7L6GMflqthK9<=5Q03RL-Q5aY(r^(D!!Z%(CtSL+gOC7}i z-h+drE%evDkYu^8mG`>7xQ#m)!BdI+!#G(2wn?;wy73O9AtQm8cc`ni(1bVtG~uj$4A;?< ra)ng!8A#bSNuAXhWw+Wc;lHRPIgcurFH8M|Xa)*wb$ZdQxEKEhP!!d* literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/__main__.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/__main__.py new file mode 100644 index 0000000..e83b9e0 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/__main__.py @@ -0,0 +1,19 @@ +from __future__ import absolute_import + +import os +import sys + +# If we are running from a wheel, add the wheel to sys.path +# This allows the usage python pip-*.whl/pip install pip-*.whl +if __package__ == '': + # __file__ is pip-*.whl/pip/__main__.py + # first dirname call strips of '/__main__.py', second strips off '/pip' + # Resulting path is the name of the wheel itself + # Add that to sys.path so we can import pip + path = os.path.dirname(os.path.dirname(__file__)) + sys.path.insert(0, path) + +from pip._internal.cli.main import main as _main # isort:skip # noqa + +if __name__ == '__main__': + sys.exit(_main()) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/__main__.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/__main__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6071461d9778380626dce1a6c7462fdb6739cf74 GIT binary patch literal 571 zcmYjN%TgOL5Nv6^Jp2egapdd^UWilSl2HBv4i2Y1pb}o$meD@48atS)KY~NPCf}4F z$Vf2-Dyh|@8TE8c@^{dE{`37|j>Ag$o=yS(n@Pc2zyYN|E+9fI;UsbybIcRu2}}n? zf+vY~1tYOeu|E1hjNZ={t}w07mQ7atTrXd~ zEUvE}uP3|RmexdcGx@c;; int + """This is preserved for old console scripts that may still be referencing + it. + + For additional details, see https://github.com/pypa/pip/issues/7498. + """ + from pip._internal.utils.entrypoints import _wrapper + + return _wrapper(args) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/__init__ 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/__init__ 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6890d980e4fcae24ff2e544222841cb05c3bd705 GIT binary patch literal 903 zcmcgq&2AGh5T4B@p+q26+~9(b5u)o>tyIdNK%xAo5US7~ngc6m*GU}hdW}6vwWyrn zId~SXJP!{5Gn)!7Ju|XD&x}3)j(^?k{rvIdV+NPhqVpN;a72*Pil6`(M-AVCq6K9P z;}{|xgMZX$V<_5Cc3|9rvJ2xbM7FWZ+wd)d@do?&(C?5x^P6bckBG%v1nZ~^d@ zBgXvZJHg4^1VPJr9kgHRTudu3sv;LzWkXeH5i)Na27z;hqExjAXo^BiwD5YWy|$UL zvz{O_nDiRvCAm;}Zq`|fT%$5YxG#d%Vvgv-Ln&tl=gUcwRi$*bQ_>kHO$bXJ@ literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/__init__.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/__init__.py new file mode 100644 index 0000000..3aa8a46 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/__init__.py @@ -0,0 +1,18 @@ +#!/usr/bin/env python +import pip._internal.utils.inject_securetransport # noqa +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Optional, List + + +def main(args=None): + # type: (Optional[List[str]]) -> int + """This is preserved for old console scripts that may still be referencing + it. + + For additional details, see https://github.com/pypa/pip/issues/7498. + """ + from pip._internal.utils.entrypoints import _wrapper + + return _wrapper(args) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/__init__.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..72f6264342bd304c5dc43ca06db6a7adf84a0123 GIT binary patch literal 903 zcmcgq&2AGh5T4B@p+q26+~9(b5u)psR)l{cMf|A{P$-Ayz{=fqHjZ|^#-5}sDkpdj z-i2r40bpiR!KG(L_UDtd5>v_8wBJ#r?dd72);%Tokeg4@QowJ z{N@M2(ZU2l%XuBNU+Y}VYcJ|D7g=pXU1||BZyW}J3x%RmjRT^ zATpQ?TIM;qP!ytnbIv_pJ5~ON13)CiK9=dSQ None + self.path = path + self.setup = False + self.bin_dir = get_paths( + 'nt' if os.name == 'nt' else 'posix_prefix', + vars={'base': path, 'platbase': path} + )['scripts'] + # Note: prefer distutils' sysconfig to get the + # library paths so PyPy is correctly supported. + purelib = get_python_lib(plat_specific=False, prefix=path) + platlib = get_python_lib(plat_specific=True, prefix=path) + if purelib == platlib: + self.lib_dirs = [purelib] + else: + self.lib_dirs = [purelib, platlib] + + +class BuildEnvironment(object): + """Creates and manages an isolated environment to install build deps + """ + + def __init__(self): + # type: () -> None + self._temp_dir = TempDirectory(kind="build-env") + + self._prefixes = OrderedDict(( + (name, _Prefix(os.path.join(self._temp_dir.path, name))) + for name in ('normal', 'overlay') + )) + + self._bin_dirs = [] # type: List[str] + self._lib_dirs = [] # type: List[str] + for prefix in reversed(list(self._prefixes.values())): + self._bin_dirs.append(prefix.bin_dir) + self._lib_dirs.extend(prefix.lib_dirs) + + # Customize site to: + # - ensure .pth files are honored + # - prevent access to system site packages + system_sites = { + os.path.normcase(site) for site in ( + get_python_lib(plat_specific=False), + get_python_lib(plat_specific=True), + ) + } + self._site_dir = os.path.join(self._temp_dir.path, 'site') + if not os.path.exists(self._site_dir): + os.mkdir(self._site_dir) + with open(os.path.join(self._site_dir, 'sitecustomize.py'), 'w') as fp: + fp.write(textwrap.dedent( + ''' + import os, site, sys + + # First, drop system-sites related paths. + original_sys_path = sys.path[:] + known_paths = set() + for path in {system_sites!r}: + site.addsitedir(path, known_paths=known_paths) + system_paths = set( + os.path.normcase(path) + for path in sys.path[len(original_sys_path):] + ) + original_sys_path = [ + path for path in original_sys_path + if os.path.normcase(path) not in system_paths + ] + sys.path = original_sys_path + + # Second, add lib directories. + # ensuring .pth file are processed. + for path in {lib_dirs!r}: + assert not path in sys.path + site.addsitedir(path) + ''' + ).format(system_sites=system_sites, lib_dirs=self._lib_dirs)) + + def __enter__(self): + self._save_env = { + name: os.environ.get(name, None) + for name in ('PATH', 'PYTHONNOUSERSITE', 'PYTHONPATH') + } + + path = self._bin_dirs[:] + old_path = self._save_env['PATH'] + if old_path: + path.extend(old_path.split(os.pathsep)) + + pythonpath = [self._site_dir] + + os.environ.update({ + 'PATH': os.pathsep.join(path), + 'PYTHONNOUSERSITE': '1', + 'PYTHONPATH': os.pathsep.join(pythonpath), + }) + + def __exit__(self, exc_type, exc_val, exc_tb): + for varname, old_value in self._save_env.items(): + if old_value is None: + os.environ.pop(varname, None) + else: + os.environ[varname] = old_value + + def cleanup(self): + # type: () -> None + self._temp_dir.cleanup() + + def check_requirements(self, reqs): + # type: (Iterable[str]) -> Tuple[Set[Tuple[str, str]], Set[str]] + """Return 2 sets: + - conflicting requirements: set of (installed, wanted) reqs tuples + - missing requirements: set of reqs + """ + missing = set() + conflicting = set() + if reqs: + ws = WorkingSet(self._lib_dirs) + for req in reqs: + try: + if ws.find(Requirement.parse(req)) is None: + missing.add(req) + except VersionConflict as e: + conflicting.add((str(e.args[0].as_requirement()), + str(e.args[1]))) + return conflicting, missing + + def install_requirements( + self, + finder, # type: PackageFinder + requirements, # type: Iterable[str] + prefix_as_string, # type: str + message # type: Optional[str] + ): + # type: (...) -> None + prefix = self._prefixes[prefix_as_string] + assert not prefix.setup + prefix.setup = True + if not requirements: + return + args = [ + sys.executable, os.path.dirname(pip_location), 'install', + '--ignore-installed', '--no-user', '--prefix', prefix.path, + '--no-warn-script-location', + ] # type: List[str] + if logger.getEffectiveLevel() <= logging.DEBUG: + args.append('-v') + for format_control in ('no_binary', 'only_binary'): + formats = getattr(finder.format_control, format_control) + args.extend(('--' + format_control.replace('_', '-'), + ','.join(sorted(formats or {':none:'})))) + + index_urls = finder.index_urls + if index_urls: + args.extend(['-i', index_urls[0]]) + for extra_index in index_urls[1:]: + args.extend(['--extra-index-url', extra_index]) + else: + args.append('--no-index') + for link in finder.find_links: + args.extend(['--find-links', link]) + + for host in finder.trusted_hosts: + args.extend(['--trusted-host', host]) + if finder.allow_all_prereleases: + args.append('--pre') + args.append('--') + args.extend(requirements) + with open_spinner(message) as spinner: + call_subprocess(args, spinner=spinner) + + +class NoOpBuildEnvironment(BuildEnvironment): + """A no-op drop-in replacement for BuildEnvironment + """ + + def __init__(self): + pass + + def __enter__(self): + pass + + def __exit__(self, exc_type, exc_val, exc_tb): + pass + + def cleanup(self): + pass + + def install_requirements(self, finder, requirements, prefix, message): + raise NotImplementedError() diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/build_env 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/build_env 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..35b8efcf7b7ba25ed935f6edb7f353444adbd19e GIT binary patch literal 10025 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 literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/build_env.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/build_env.py new file mode 100644 index 0000000..f55f0e6 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/build_env.py @@ -0,0 +1,221 @@ +"""Build Environment used for isolation during sdist building +""" + +# The following comment should be removed at some point in the future. +# mypy: strict-optional=False +# mypy: disallow-untyped-defs=False + +import logging +import os +import sys +import textwrap +from collections import OrderedDict +from distutils.sysconfig import get_python_lib +from sysconfig import get_paths + +from pip._vendor.pkg_resources import Requirement, VersionConflict, WorkingSet + +from pip import __file__ as pip_location +from pip._internal.utils.subprocess import call_subprocess +from pip._internal.utils.temp_dir import TempDirectory +from pip._internal.utils.typing import MYPY_CHECK_RUNNING +from pip._internal.utils.ui import open_spinner + +if MYPY_CHECK_RUNNING: + from typing import Tuple, Set, Iterable, Optional, List + from pip._internal.index.package_finder import PackageFinder + +logger = logging.getLogger(__name__) + + +class _Prefix: + + def __init__(self, path): + # type: (str) -> None + self.path = path + self.setup = False + self.bin_dir = get_paths( + 'nt' if os.name == 'nt' else 'posix_prefix', + vars={'base': path, 'platbase': path} + )['scripts'] + # Note: prefer distutils' sysconfig to get the + # library paths so PyPy is correctly supported. + purelib = get_python_lib(plat_specific=False, prefix=path) + platlib = get_python_lib(plat_specific=True, prefix=path) + if purelib == platlib: + self.lib_dirs = [purelib] + else: + self.lib_dirs = [purelib, platlib] + + +class BuildEnvironment(object): + """Creates and manages an isolated environment to install build deps + """ + + def __init__(self): + # type: () -> None + self._temp_dir = TempDirectory(kind="build-env") + + self._prefixes = OrderedDict(( + (name, _Prefix(os.path.join(self._temp_dir.path, name))) + for name in ('normal', 'overlay') + )) + + self._bin_dirs = [] # type: List[str] + self._lib_dirs = [] # type: List[str] + for prefix in reversed(list(self._prefixes.values())): + self._bin_dirs.append(prefix.bin_dir) + self._lib_dirs.extend(prefix.lib_dirs) + + # Customize site to: + # - ensure .pth files are honored + # - prevent access to system site packages + system_sites = { + os.path.normcase(site) for site in ( + get_python_lib(plat_specific=False), + get_python_lib(plat_specific=True), + ) + } + self._site_dir = os.path.join(self._temp_dir.path, 'site') + if not os.path.exists(self._site_dir): + os.mkdir(self._site_dir) + with open(os.path.join(self._site_dir, 'sitecustomize.py'), 'w') as fp: + fp.write(textwrap.dedent( + ''' + import os, site, sys + + # First, drop system-sites related paths. + original_sys_path = sys.path[:] + known_paths = set() + for path in {system_sites!r}: + site.addsitedir(path, known_paths=known_paths) + system_paths = set( + os.path.normcase(path) + for path in sys.path[len(original_sys_path):] + ) + original_sys_path = [ + path for path in original_sys_path + if os.path.normcase(path) not in system_paths + ] + sys.path = original_sys_path + + # Second, add lib directories. + # ensuring .pth file are processed. + for path in {lib_dirs!r}: + assert not path in sys.path + site.addsitedir(path) + ''' + ).format(system_sites=system_sites, lib_dirs=self._lib_dirs)) + + def __enter__(self): + self._save_env = { + name: os.environ.get(name, None) + for name in ('PATH', 'PYTHONNOUSERSITE', 'PYTHONPATH') + } + + path = self._bin_dirs[:] + old_path = self._save_env['PATH'] + if old_path: + path.extend(old_path.split(os.pathsep)) + + pythonpath = [self._site_dir] + + os.environ.update({ + 'PATH': os.pathsep.join(path), + 'PYTHONNOUSERSITE': '1', + 'PYTHONPATH': os.pathsep.join(pythonpath), + }) + + def __exit__(self, exc_type, exc_val, exc_tb): + for varname, old_value in self._save_env.items(): + if old_value is None: + os.environ.pop(varname, None) + else: + os.environ[varname] = old_value + + def cleanup(self): + # type: () -> None + self._temp_dir.cleanup() + + def check_requirements(self, reqs): + # type: (Iterable[str]) -> Tuple[Set[Tuple[str, str]], Set[str]] + """Return 2 sets: + - conflicting requirements: set of (installed, wanted) reqs tuples + - missing requirements: set of reqs + """ + missing = set() + conflicting = set() + if reqs: + ws = WorkingSet(self._lib_dirs) + for req in reqs: + try: + if ws.find(Requirement.parse(req)) is None: + missing.add(req) + except VersionConflict as e: + conflicting.add((str(e.args[0].as_requirement()), + str(e.args[1]))) + return conflicting, missing + + def install_requirements( + self, + finder, # type: PackageFinder + requirements, # type: Iterable[str] + prefix_as_string, # type: str + message # type: Optional[str] + ): + # type: (...) -> None + prefix = self._prefixes[prefix_as_string] + assert not prefix.setup + prefix.setup = True + if not requirements: + return + args = [ + sys.executable, os.path.dirname(pip_location), 'install', + '--ignore-installed', '--no-user', '--prefix', prefix.path, + '--no-warn-script-location', + ] # type: List[str] + if logger.getEffectiveLevel() <= logging.DEBUG: + args.append('-v') + for format_control in ('no_binary', 'only_binary'): + formats = getattr(finder.format_control, format_control) + args.extend(('--' + format_control.replace('_', '-'), + ','.join(sorted(formats or {':none:'})))) + + index_urls = finder.index_urls + if index_urls: + args.extend(['-i', index_urls[0]]) + for extra_index in index_urls[1:]: + args.extend(['--extra-index-url', extra_index]) + else: + args.append('--no-index') + for link in finder.find_links: + args.extend(['--find-links', link]) + + for host in finder.trusted_hosts: + args.extend(['--trusted-host', host]) + if finder.allow_all_prereleases: + args.append('--pre') + args.append('--') + args.extend(requirements) + with open_spinner(message) as spinner: + call_subprocess(args, spinner=spinner) + + +class NoOpBuildEnvironment(BuildEnvironment): + """A no-op drop-in replacement for BuildEnvironment + """ + + def __init__(self): + pass + + def __enter__(self): + pass + + def __exit__(self, exc_type, exc_val, exc_tb): + pass + + def cleanup(self): + pass + + def install_requirements(self, finder, requirements, prefix, message): + raise NotImplementedError() diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/build_env.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/build_env.pyc new file mode 100644 index 0000000000000000000000000000000000000000..81f696f666c61d6b3e5cc07a5ddcca6e75ab6fda GIT binary patch literal 10025 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 str + """Return a stable sha224 of a dictionary.""" + s = json.dumps(d, sort_keys=True, separators=(",", ":"), ensure_ascii=True) + return hashlib.sha224(s.encode("ascii")).hexdigest() + + +class Cache(object): + """An abstract class - provides cache directories for data from links + + + :param cache_dir: The root of the cache. + :param format_control: An object of FormatControl class to limit + binaries being read from the cache. + :param allowed_formats: which formats of files the cache should store. + ('binary' and 'source' are the only allowed values) + """ + + def __init__(self, cache_dir, format_control, allowed_formats): + # type: (str, FormatControl, Set[str]) -> None + super(Cache, self).__init__() + assert not cache_dir or os.path.isabs(cache_dir) + self.cache_dir = cache_dir or None + self.format_control = format_control + self.allowed_formats = allowed_formats + + _valid_formats = {"source", "binary"} + assert self.allowed_formats.union(_valid_formats) == _valid_formats + + def _get_cache_path_parts_legacy(self, link): + # type: (Link) -> List[str] + """Get parts of part that must be os.path.joined with cache_dir + + Legacy cache key (pip < 20) for compatibility with older caches. + """ + + # We want to generate an url to use as our cache key, we don't want to + # just re-use the URL because it might have other items in the fragment + # and we don't care about those. + key_parts = [link.url_without_fragment] + if link.hash_name is not None and link.hash is not None: + key_parts.append("=".join([link.hash_name, link.hash])) + key_url = "#".join(key_parts) + + # Encode our key url with sha224, we'll use this because it has similar + # security properties to sha256, but with a shorter total output (and + # thus less secure). However the differences don't make a lot of + # difference for our use case here. + hashed = hashlib.sha224(key_url.encode()).hexdigest() + + # We want to nest the directories some to prevent having a ton of top + # level directories where we might run out of sub directories on some + # FS. + parts = [hashed[:2], hashed[2:4], hashed[4:6], hashed[6:]] + + return parts + + def _get_cache_path_parts(self, link): + # type: (Link) -> List[str] + """Get parts of part that must be os.path.joined with cache_dir + """ + + # We want to generate an url to use as our cache key, we don't want to + # just re-use the URL because it might have other items in the fragment + # and we don't care about those. + key_parts = {"url": link.url_without_fragment} + if link.hash_name is not None and link.hash is not None: + key_parts[link.hash_name] = link.hash + if link.subdirectory_fragment: + key_parts["subdirectory"] = link.subdirectory_fragment + + # Include interpreter name, major and minor version in cache key + # to cope with ill-behaved sdists that build a different wheel + # depending on the python version their setup.py is being run on, + # and don't encode the difference in compatibility tags. + # https://github.com/pypa/pip/issues/7296 + key_parts["interpreter_name"] = interpreter_name() + key_parts["interpreter_version"] = interpreter_version() + + # Encode our key url with sha224, we'll use this because it has similar + # security properties to sha256, but with a shorter total output (and + # thus less secure). However the differences don't make a lot of + # difference for our use case here. + hashed = _hash_dict(key_parts) + + # We want to nest the directories some to prevent having a ton of top + # level directories where we might run out of sub directories on some + # FS. + parts = [hashed[:2], hashed[2:4], hashed[4:6], hashed[6:]] + + return parts + + def _get_candidates(self, link, canonical_package_name): + # type: (Link, Optional[str]) -> List[Any] + can_not_cache = ( + not self.cache_dir or + not canonical_package_name or + not link + ) + if can_not_cache: + return [] + + formats = self.format_control.get_allowed_formats( + canonical_package_name + ) + if not self.allowed_formats.intersection(formats): + return [] + + candidates = [] + path = self.get_path_for_link(link) + if os.path.isdir(path): + for candidate in os.listdir(path): + candidates.append((candidate, path)) + # TODO remove legacy path lookup in pip>=21 + legacy_path = self.get_path_for_link_legacy(link) + if os.path.isdir(legacy_path): + for candidate in os.listdir(legacy_path): + candidates.append((candidate, legacy_path)) + return candidates + + def get_path_for_link_legacy(self, link): + # type: (Link) -> str + raise NotImplementedError() + + def get_path_for_link(self, link): + # type: (Link) -> str + """Return a directory to store cached items in for link. + """ + raise NotImplementedError() + + def get( + self, + link, # type: Link + package_name, # type: Optional[str] + supported_tags, # type: List[Tag] + ): + # type: (...) -> Link + """Returns a link to a cached item if it exists, otherwise returns the + passed link. + """ + raise NotImplementedError() + + def cleanup(self): + # type: () -> None + pass + + +class SimpleWheelCache(Cache): + """A cache of wheels for future installs. + """ + + def __init__(self, cache_dir, format_control): + # type: (str, FormatControl) -> None + super(SimpleWheelCache, self).__init__( + cache_dir, format_control, {"binary"} + ) + + def get_path_for_link_legacy(self, link): + # type: (Link) -> str + parts = self._get_cache_path_parts_legacy(link) + return os.path.join(self.cache_dir, "wheels", *parts) + + def get_path_for_link(self, link): + # type: (Link) -> str + """Return a directory to store cached wheels for link + + Because there are M wheels for any one sdist, we provide a directory + to cache them in, and then consult that directory when looking up + cache hits. + + We only insert things into the cache if they have plausible version + numbers, so that we don't contaminate the cache with things that were + not unique. E.g. ./package might have dozens of installs done for it + and build a version of 0.0...and if we built and cached a wheel, we'd + end up using the same wheel even if the source has been edited. + + :param link: The link of the sdist for which this will cache wheels. + """ + parts = self._get_cache_path_parts(link) + + # Store wheels within the root cache_dir + return os.path.join(self.cache_dir, "wheels", *parts) + + def get( + self, + link, # type: Link + package_name, # type: Optional[str] + supported_tags, # type: List[Tag] + ): + # type: (...) -> Link + candidates = [] + + if not package_name: + return link + + canonical_package_name = canonicalize_name(package_name) + for wheel_name, wheel_dir in self._get_candidates( + link, canonical_package_name + ): + try: + wheel = Wheel(wheel_name) + except InvalidWheelFilename: + continue + if canonicalize_name(wheel.name) != canonical_package_name: + logger.debug( + "Ignoring cached wheel {} for {} as it " + "does not match the expected distribution name {}.".format( + wheel_name, link, package_name + ) + ) + continue + if not wheel.supported(supported_tags): + # Built for a different python/arch/etc + continue + candidates.append( + ( + wheel.support_index_min(supported_tags), + wheel_name, + wheel_dir, + ) + ) + + if not candidates: + return link + + _, wheel_name, wheel_dir = min(candidates) + return Link(path_to_url(os.path.join(wheel_dir, wheel_name))) + + +class EphemWheelCache(SimpleWheelCache): + """A SimpleWheelCache that creates it's own temporary cache directory + """ + + def __init__(self, format_control): + # type: (FormatControl) -> None + self._temp_dir = TempDirectory(kind="ephem-wheel-cache") + + super(EphemWheelCache, self).__init__( + self._temp_dir.path, format_control + ) + + def cleanup(self): + # type: () -> None + self._temp_dir.cleanup() + + +class WheelCache(Cache): + """Wraps EphemWheelCache and SimpleWheelCache into a single Cache + + This Cache allows for gracefully degradation, using the ephem wheel cache + when a certain link is not found in the simple wheel cache first. + """ + + def __init__(self, cache_dir, format_control): + # type: (str, FormatControl) -> None + super(WheelCache, self).__init__( + cache_dir, format_control, {'binary'} + ) + self._wheel_cache = SimpleWheelCache(cache_dir, format_control) + self._ephem_cache = EphemWheelCache(format_control) + + def get_path_for_link_legacy(self, link): + # type: (Link) -> str + return self._wheel_cache.get_path_for_link_legacy(link) + + def get_path_for_link(self, link): + # type: (Link) -> str + return self._wheel_cache.get_path_for_link(link) + + def get_ephem_path_for_link(self, link): + # type: (Link) -> str + return self._ephem_cache.get_path_for_link(link) + + def get( + self, + link, # type: Link + package_name, # type: Optional[str] + supported_tags, # type: List[Tag] + ): + # type: (...) -> Link + retval = self._wheel_cache.get( + link=link, + package_name=package_name, + supported_tags=supported_tags, + ) + if retval is not link: + return retval + + return self._ephem_cache.get( + link=link, + package_name=package_name, + supported_tags=supported_tags, + ) + + def cleanup(self): + # type: () -> None + self._wheel_cache.cleanup() + self._ephem_cache.cleanup() diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cache 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cache 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7ed2c2993472d6b313d9446fdf5fb134c1ae5550 GIT binary patch literal 11650 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 str + """Return a stable sha224 of a dictionary.""" + s = json.dumps(d, sort_keys=True, separators=(",", ":"), ensure_ascii=True) + return hashlib.sha224(s.encode("ascii")).hexdigest() + + +class Cache(object): + """An abstract class - provides cache directories for data from links + + + :param cache_dir: The root of the cache. + :param format_control: An object of FormatControl class to limit + binaries being read from the cache. + :param allowed_formats: which formats of files the cache should store. + ('binary' and 'source' are the only allowed values) + """ + + def __init__(self, cache_dir, format_control, allowed_formats): + # type: (str, FormatControl, Set[str]) -> None + super(Cache, self).__init__() + assert not cache_dir or os.path.isabs(cache_dir) + self.cache_dir = cache_dir or None + self.format_control = format_control + self.allowed_formats = allowed_formats + + _valid_formats = {"source", "binary"} + assert self.allowed_formats.union(_valid_formats) == _valid_formats + + def _get_cache_path_parts_legacy(self, link): + # type: (Link) -> List[str] + """Get parts of part that must be os.path.joined with cache_dir + + Legacy cache key (pip < 20) for compatibility with older caches. + """ + + # We want to generate an url to use as our cache key, we don't want to + # just re-use the URL because it might have other items in the fragment + # and we don't care about those. + key_parts = [link.url_without_fragment] + if link.hash_name is not None and link.hash is not None: + key_parts.append("=".join([link.hash_name, link.hash])) + key_url = "#".join(key_parts) + + # Encode our key url with sha224, we'll use this because it has similar + # security properties to sha256, but with a shorter total output (and + # thus less secure). However the differences don't make a lot of + # difference for our use case here. + hashed = hashlib.sha224(key_url.encode()).hexdigest() + + # We want to nest the directories some to prevent having a ton of top + # level directories where we might run out of sub directories on some + # FS. + parts = [hashed[:2], hashed[2:4], hashed[4:6], hashed[6:]] + + return parts + + def _get_cache_path_parts(self, link): + # type: (Link) -> List[str] + """Get parts of part that must be os.path.joined with cache_dir + """ + + # We want to generate an url to use as our cache key, we don't want to + # just re-use the URL because it might have other items in the fragment + # and we don't care about those. + key_parts = {"url": link.url_without_fragment} + if link.hash_name is not None and link.hash is not None: + key_parts[link.hash_name] = link.hash + if link.subdirectory_fragment: + key_parts["subdirectory"] = link.subdirectory_fragment + + # Include interpreter name, major and minor version in cache key + # to cope with ill-behaved sdists that build a different wheel + # depending on the python version their setup.py is being run on, + # and don't encode the difference in compatibility tags. + # https://github.com/pypa/pip/issues/7296 + key_parts["interpreter_name"] = interpreter_name() + key_parts["interpreter_version"] = interpreter_version() + + # Encode our key url with sha224, we'll use this because it has similar + # security properties to sha256, but with a shorter total output (and + # thus less secure). However the differences don't make a lot of + # difference for our use case here. + hashed = _hash_dict(key_parts) + + # We want to nest the directories some to prevent having a ton of top + # level directories where we might run out of sub directories on some + # FS. + parts = [hashed[:2], hashed[2:4], hashed[4:6], hashed[6:]] + + return parts + + def _get_candidates(self, link, canonical_package_name): + # type: (Link, Optional[str]) -> List[Any] + can_not_cache = ( + not self.cache_dir or + not canonical_package_name or + not link + ) + if can_not_cache: + return [] + + formats = self.format_control.get_allowed_formats( + canonical_package_name + ) + if not self.allowed_formats.intersection(formats): + return [] + + candidates = [] + path = self.get_path_for_link(link) + if os.path.isdir(path): + for candidate in os.listdir(path): + candidates.append((candidate, path)) + # TODO remove legacy path lookup in pip>=21 + legacy_path = self.get_path_for_link_legacy(link) + if os.path.isdir(legacy_path): + for candidate in os.listdir(legacy_path): + candidates.append((candidate, legacy_path)) + return candidates + + def get_path_for_link_legacy(self, link): + # type: (Link) -> str + raise NotImplementedError() + + def get_path_for_link(self, link): + # type: (Link) -> str + """Return a directory to store cached items in for link. + """ + raise NotImplementedError() + + def get( + self, + link, # type: Link + package_name, # type: Optional[str] + supported_tags, # type: List[Tag] + ): + # type: (...) -> Link + """Returns a link to a cached item if it exists, otherwise returns the + passed link. + """ + raise NotImplementedError() + + def cleanup(self): + # type: () -> None + pass + + +class SimpleWheelCache(Cache): + """A cache of wheels for future installs. + """ + + def __init__(self, cache_dir, format_control): + # type: (str, FormatControl) -> None + super(SimpleWheelCache, self).__init__( + cache_dir, format_control, {"binary"} + ) + + def get_path_for_link_legacy(self, link): + # type: (Link) -> str + parts = self._get_cache_path_parts_legacy(link) + return os.path.join(self.cache_dir, "wheels", *parts) + + def get_path_for_link(self, link): + # type: (Link) -> str + """Return a directory to store cached wheels for link + + Because there are M wheels for any one sdist, we provide a directory + to cache them in, and then consult that directory when looking up + cache hits. + + We only insert things into the cache if they have plausible version + numbers, so that we don't contaminate the cache with things that were + not unique. E.g. ./package might have dozens of installs done for it + and build a version of 0.0...and if we built and cached a wheel, we'd + end up using the same wheel even if the source has been edited. + + :param link: The link of the sdist for which this will cache wheels. + """ + parts = self._get_cache_path_parts(link) + + # Store wheels within the root cache_dir + return os.path.join(self.cache_dir, "wheels", *parts) + + def get( + self, + link, # type: Link + package_name, # type: Optional[str] + supported_tags, # type: List[Tag] + ): + # type: (...) -> Link + candidates = [] + + if not package_name: + return link + + canonical_package_name = canonicalize_name(package_name) + for wheel_name, wheel_dir in self._get_candidates( + link, canonical_package_name + ): + try: + wheel = Wheel(wheel_name) + except InvalidWheelFilename: + continue + if canonicalize_name(wheel.name) != canonical_package_name: + logger.debug( + "Ignoring cached wheel {} for {} as it " + "does not match the expected distribution name {}.".format( + wheel_name, link, package_name + ) + ) + continue + if not wheel.supported(supported_tags): + # Built for a different python/arch/etc + continue + candidates.append( + ( + wheel.support_index_min(supported_tags), + wheel_name, + wheel_dir, + ) + ) + + if not candidates: + return link + + _, wheel_name, wheel_dir = min(candidates) + return Link(path_to_url(os.path.join(wheel_dir, wheel_name))) + + +class EphemWheelCache(SimpleWheelCache): + """A SimpleWheelCache that creates it's own temporary cache directory + """ + + def __init__(self, format_control): + # type: (FormatControl) -> None + self._temp_dir = TempDirectory(kind="ephem-wheel-cache") + + super(EphemWheelCache, self).__init__( + self._temp_dir.path, format_control + ) + + def cleanup(self): + # type: () -> None + self._temp_dir.cleanup() + + +class WheelCache(Cache): + """Wraps EphemWheelCache and SimpleWheelCache into a single Cache + + This Cache allows for gracefully degradation, using the ephem wheel cache + when a certain link is not found in the simple wheel cache first. + """ + + def __init__(self, cache_dir, format_control): + # type: (str, FormatControl) -> None + super(WheelCache, self).__init__( + cache_dir, format_control, {'binary'} + ) + self._wheel_cache = SimpleWheelCache(cache_dir, format_control) + self._ephem_cache = EphemWheelCache(format_control) + + def get_path_for_link_legacy(self, link): + # type: (Link) -> str + return self._wheel_cache.get_path_for_link_legacy(link) + + def get_path_for_link(self, link): + # type: (Link) -> str + return self._wheel_cache.get_path_for_link(link) + + def get_ephem_path_for_link(self, link): + # type: (Link) -> str + return self._ephem_cache.get_path_for_link(link) + + def get( + self, + link, # type: Link + package_name, # type: Optional[str] + supported_tags, # type: List[Tag] + ): + # type: (...) -> Link + retval = self._wheel_cache.get( + link=link, + package_name=package_name, + supported_tags=supported_tags, + ) + if retval is not link: + return retval + + return self._ephem_cache.get( + link=link, + package_name=package_name, + supported_tags=supported_tags, + ) + + def cleanup(self): + # type: () -> None + self._wheel_cache.cleanup() + self._ephem_cache.cleanup() diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cache.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cache.pyc new file mode 100644 index 0000000000000000000000000000000000000000..148cc60803ee0c2aa2c41dc16c018970f4026945 GIT binary patch literal 11650 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 None + """Entry Point for completion of main and subcommand options. + """ + # Don't complete if user hasn't sourced bash_completion file. + if 'PIP_AUTO_COMPLETE' not in os.environ: + return + cwords = os.environ['COMP_WORDS'].split()[1:] + cword = int(os.environ['COMP_CWORD']) + try: + current = cwords[cword - 1] + except IndexError: + current = '' + + parser = create_main_parser() + subcommands = list(commands_dict) + options = [] + + # subcommand + subcommand_name = None # type: Optional[str] + for word in cwords: + if word in subcommands: + subcommand_name = word + break + # subcommand options + if subcommand_name is not None: + # special case: 'help' subcommand has no options + if subcommand_name == 'help': + sys.exit(1) + # special case: list locally installed dists for show and uninstall + should_list_installed = ( + subcommand_name in ['show', 'uninstall'] and + not current.startswith('-') + ) + if should_list_installed: + installed = [] + lc = current.lower() + for dist in get_installed_distributions(local_only=True): + if dist.key.startswith(lc) and dist.key not in cwords[1:]: + installed.append(dist.key) + # if there are no dists installed, fall back to option completion + if installed: + for dist in installed: + print(dist) + sys.exit(1) + + subcommand = create_command(subcommand_name) + + for opt in subcommand.parser.option_list_all: + if opt.help != optparse.SUPPRESS_HELP: + for opt_str in opt._long_opts + opt._short_opts: + options.append((opt_str, opt.nargs)) + + # filter out previously specified options from available options + prev_opts = [x.split('=')[0] for x in cwords[1:cword - 1]] + options = [(x, v) for (x, v) in options if x not in prev_opts] + # filter options by current input + options = [(k, v) for k, v in options if k.startswith(current)] + # get completion type given cwords and available subcommand options + completion_type = get_path_completion_type( + cwords, cword, subcommand.parser.option_list_all, + ) + # get completion files and directories if ``completion_type`` is + # ````, ``

`` or ```` + if completion_type: + paths = auto_complete_paths(current, completion_type) + options = [(path, 0) for path in paths] + for option in options: + opt_label = option[0] + # append '=' to options which require args + if option[1] and option[0][:2] == "--": + opt_label += '=' + print(opt_label) + else: + # show main parser options only when necessary + + opts = [i.option_list for i in parser.option_groups] + opts.append(parser.option_list) + flattened_opts = chain.from_iterable(opts) + if current.startswith('-'): + for opt in flattened_opts: + if opt.help != optparse.SUPPRESS_HELP: + subcommands += opt._long_opts + opt._short_opts + else: + # get completion type given cwords and all available options + completion_type = get_path_completion_type(cwords, cword, + flattened_opts) + if completion_type: + subcommands = list(auto_complete_paths(current, + completion_type)) + + print(' '.join([x for x in subcommands if x.startswith(current)])) + sys.exit(1) + + +def get_path_completion_type(cwords, cword, opts): + # type: (List[str], int, Iterable[Any]) -> Optional[str] + """Get the type of path completion (``file``, ``dir``, ``path`` or None) + + :param cwords: same as the environmental variable ``COMP_WORDS`` + :param cword: same as the environmental variable ``COMP_CWORD`` + :param opts: The available options to check + :return: path completion type (``file``, ``dir``, ``path`` or None) + """ + if cword < 2 or not cwords[cword - 2].startswith('-'): + return None + for opt in opts: + if opt.help == optparse.SUPPRESS_HELP: + continue + for o in str(opt).split('/'): + if cwords[cword - 2].split('=')[0] == o: + if not opt.metavar or any( + x in ('path', 'file', 'dir') + for x in opt.metavar.split('/')): + return opt.metavar + return None + + +def auto_complete_paths(current, completion_type): + # type: (str, str) -> Iterable[str] + """If ``completion_type`` is ``file`` or ``path``, list all regular files + and directories starting with ``current``; otherwise only list directories + starting with ``current``. + + :param current: The word to be completed + :param completion_type: path completion type(`file`, `path` or `dir`)i + :return: A generator of regular files and/or directories + """ + directory, filename = os.path.split(current) + current_path = os.path.abspath(directory) + # Don't complete paths if they can't be accessed + if not os.access(current_path, os.R_OK): + return + filename = os.path.normcase(filename) + # list all files that start with ``filename`` + file_list = (x for x in os.listdir(current_path) + if os.path.normcase(x).startswith(filename)) + for f in file_list: + opt = os.path.join(current_path, f) + comp_file = os.path.normcase(os.path.join(directory, f)) + # complete regular files when there is not ```` after option + # complete directories when there is ````, ```` or + # ````after option + if completion_type != 'dir' and os.path.isfile(opt): + yield comp_file + elif os.path.isdir(opt): + yield os.path.join(comp_file, '') diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cli/autocompletion 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cli/autocompletion 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b5a3fc6d720d952e6ccdbf635bb439d89eb2b389 GIT binary patch literal 5709 zcmd5=&2JmW6@Rl!Q4&RcSh6h1@yEK2Qznf?yGaqiP24z=V7rlJVP#hh5oNg|SJG0; zU21kEQ!SZ89rObQ0t7`5J@lMIuSL)4u|*HP7HCfGskgL$K>K@dC`xi%pgp-VIi7hl z^WK~H-u&Jh+W#Ca{Qk4IKB!Ue&%*z2N%9rbOh*wVKt z%29KGDg&f=U5=tWH3z9OXvPB+4N-HLD#O$)P^Dm~d5T7;S)@wQj0Y(irREq_#z+NY zq<<~EhbS7S<^)wHsCkAeXQ(+zl}Tz&QDur$3?+x@BWQb;>ILacQ+-4_=UDl*QjyQ} z4w~g;JFGd`j-NTLU@wH3CUuZALX{N)?eO53%7Ipu<)%U!GyGsl2dhVl@m3u39N;wu~qq!X)W<&V@UKVJ7 z6KCU@W$+Q|gBG*$Bk?=SMA;%qz+L>0$_HoYtecxfK8tCC)~&M>fR@W&w3}%>vxAqzhZNLkajK7f2M4h8U@xB zoH9ML^g zKD;$fU1*Bs6B0LNi~DC-4sR%1aO%;9ugQi<*?_aailU6JS{+1Be@~V7WaoSF)IazW zo4PRG6zRWM*$ccE{U^}itOz&@jlg=EIsk#uBl*8$Ua)5Sn@V(ko4V(y19ZTFx-b=b zIhxa#>>jN?MoxWP;s~@EKK>h6$3Zkh@YP?f_4w~1&!)x&h{W+{sWVHBi*nxA?d}|P z=EUS!aZ!w&U82Tirm{D2t`i}se`B{B)Hx4M%qXb6GScPq&vxDs7kaS_uw<*jn{-*l+^sl zOXBEIh;N0Mp^(uz<>uNoAv=QC?l>s!1e($nG#M{QQh*du5Fdm(i3R-ARupCexH!EC zxfj=i_LA0#c12}YF9Pnmk_C9QlEi^*Ne@#|I%tCj9}SsDXX)cG+Y#mwCn%S<$g+oe z-|X8B4&hcJztsxjx@+?S9-DNNvF66Y9t-x6&D=3w!}$OcvP|;P+N0G~cWG_SySuc! zDjIlE5^sB0lx8DX?ZKWpGhv9Gt&Y!*FEP%S^(@s5+DmmRi(YzmW{QjaDAS(b{t zo>tpB*>4#EC-ii&(WJ>Ooix4hWa4TdxJsO-|6ujDe0=HOI&KKwSUD(zPRxVu4Fm@dy7l321*qaA@`B`B=2NgEn*gE z+CUj1oyCm}hT~qnqzKG0CFM#T1r=92U{MpMgH%j^%Xb*%(??Ja5(ZCj0$Y6aXT6EF zy&B=O4&m#pV~Ov6x{P?c6J#iV1BWjw<1+`Hyst zy0-Z;ZWvZ=68h<;b?;q_$0LA=miL?c(2T_7j|53H0pJY~*Z=H7iY z<}yo8;b#82d#g`Hho09JPdWL%xed^1xAd(avL>uwUagdP#=XQ1+d@*3dzE`Hp)mAh;gL=o&!S;USYlj!5a_6}O#bpX=S)#)rb)?n` z<86n_EtX>Hhidg(P6B+?kHZw`fm+cpJ+W2T{m1R|r?Js+HK@cD1_RM%a0IwP{S*fF ze}#}z>e=vAG6x4b%c14`4AU=%r=jh(!LkX06`$xreXJjO(SSj56cMtV=gQ5TZGF6m4P)5`Z&?enx6&&1E$Vi;RS+S zyi00Sb{dyua;N`4fb5shE#*o)Pqq>OcKHXL5*M1sXFLWke=}wGm@>Uq3sO_Tx!!|! z-8JkHgyU$13*0gjxbz59!F`5?FvW~yZTA}(y6^BBM$jXlnPRFJwNhitG&7LWRbX+; zASCbOTjcSqSXEr)J_P-F+1LF#gafN6J&%S8vue_s24qfJm#tAXt*+!QsUZMnsh2(mLySX9uXHoM@c&0FGuH5j?SO>NzOdY&V6}V?*}@0thsy% zc~4^ literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cli/autocompletion.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cli/autocompletion.py new file mode 100644 index 0000000..329de60 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cli/autocompletion.py @@ -0,0 +1,164 @@ +"""Logic that powers autocompletion installed by ``pip completion``. +""" + +import optparse +import os +import sys +from itertools import chain + +from pip._internal.cli.main_parser import create_main_parser +from pip._internal.commands import commands_dict, create_command +from pip._internal.utils.misc import get_installed_distributions +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Any, Iterable, List, Optional + + +def autocomplete(): + # type: () -> None + """Entry Point for completion of main and subcommand options. + """ + # Don't complete if user hasn't sourced bash_completion file. + if 'PIP_AUTO_COMPLETE' not in os.environ: + return + cwords = os.environ['COMP_WORDS'].split()[1:] + cword = int(os.environ['COMP_CWORD']) + try: + current = cwords[cword - 1] + except IndexError: + current = '' + + parser = create_main_parser() + subcommands = list(commands_dict) + options = [] + + # subcommand + subcommand_name = None # type: Optional[str] + for word in cwords: + if word in subcommands: + subcommand_name = word + break + # subcommand options + if subcommand_name is not None: + # special case: 'help' subcommand has no options + if subcommand_name == 'help': + sys.exit(1) + # special case: list locally installed dists for show and uninstall + should_list_installed = ( + subcommand_name in ['show', 'uninstall'] and + not current.startswith('-') + ) + if should_list_installed: + installed = [] + lc = current.lower() + for dist in get_installed_distributions(local_only=True): + if dist.key.startswith(lc) and dist.key not in cwords[1:]: + installed.append(dist.key) + # if there are no dists installed, fall back to option completion + if installed: + for dist in installed: + print(dist) + sys.exit(1) + + subcommand = create_command(subcommand_name) + + for opt in subcommand.parser.option_list_all: + if opt.help != optparse.SUPPRESS_HELP: + for opt_str in opt._long_opts + opt._short_opts: + options.append((opt_str, opt.nargs)) + + # filter out previously specified options from available options + prev_opts = [x.split('=')[0] for x in cwords[1:cword - 1]] + options = [(x, v) for (x, v) in options if x not in prev_opts] + # filter options by current input + options = [(k, v) for k, v in options if k.startswith(current)] + # get completion type given cwords and available subcommand options + completion_type = get_path_completion_type( + cwords, cword, subcommand.parser.option_list_all, + ) + # get completion files and directories if ``completion_type`` is + # ````, ```` or ```` + if completion_type: + paths = auto_complete_paths(current, completion_type) + options = [(path, 0) for path in paths] + for option in options: + opt_label = option[0] + # append '=' to options which require args + if option[1] and option[0][:2] == "--": + opt_label += '=' + print(opt_label) + else: + # show main parser options only when necessary + + opts = [i.option_list for i in parser.option_groups] + opts.append(parser.option_list) + flattened_opts = chain.from_iterable(opts) + if current.startswith('-'): + for opt in flattened_opts: + if opt.help != optparse.SUPPRESS_HELP: + subcommands += opt._long_opts + opt._short_opts + else: + # get completion type given cwords and all available options + completion_type = get_path_completion_type(cwords, cword, + flattened_opts) + if completion_type: + subcommands = list(auto_complete_paths(current, + completion_type)) + + print(' '.join([x for x in subcommands if x.startswith(current)])) + sys.exit(1) + + +def get_path_completion_type(cwords, cword, opts): + # type: (List[str], int, Iterable[Any]) -> Optional[str] + """Get the type of path completion (``file``, ``dir``, ``path`` or None) + + :param cwords: same as the environmental variable ``COMP_WORDS`` + :param cword: same as the environmental variable ``COMP_CWORD`` + :param opts: The available options to check + :return: path completion type (``file``, ``dir``, ``path`` or None) + """ + if cword < 2 or not cwords[cword - 2].startswith('-'): + return None + for opt in opts: + if opt.help == optparse.SUPPRESS_HELP: + continue + for o in str(opt).split('/'): + if cwords[cword - 2].split('=')[0] == o: + if not opt.metavar or any( + x in ('path', 'file', 'dir') + for x in opt.metavar.split('/')): + return opt.metavar + return None + + +def auto_complete_paths(current, completion_type): + # type: (str, str) -> Iterable[str] + """If ``completion_type`` is ``file`` or ``path``, list all regular files + and directories starting with ``current``; otherwise only list directories + starting with ``current``. + + :param current: The word to be completed + :param completion_type: path completion type(`file`, `path` or `dir`)i + :return: A generator of regular files and/or directories + """ + directory, filename = os.path.split(current) + current_path = os.path.abspath(directory) + # Don't complete paths if they can't be accessed + if not os.access(current_path, os.R_OK): + return + filename = os.path.normcase(filename) + # list all files that start with ``filename`` + file_list = (x for x in os.listdir(current_path) + if os.path.normcase(x).startswith(filename)) + for f in file_list: + opt = os.path.join(current_path, f) + comp_file = os.path.normcase(os.path.join(directory, f)) + # complete regular files when there is not ```` after option + # complete directories when there is ````, ```` or + # ````after option + if completion_type != 'dir' and os.path.isfile(opt): + yield comp_file + elif os.path.isdir(opt): + yield os.path.join(comp_file, '') diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cli/autocompletion.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cli/autocompletion.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8bf811d2f2a8baae006aaeb2e9e8a224781fd256 GIT binary patch literal 5709 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 literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cli/base_command 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cli/base_command 2.py new file mode 100644 index 0000000..628faa3 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cli/base_command 2.py @@ -0,0 +1,226 @@ +"""Base Command class, and related routines""" + +from __future__ import absolute_import, print_function + +import logging +import logging.config +import optparse +import os +import platform +import sys +import traceback + +from pip._internal.cli import cmdoptions +from pip._internal.cli.command_context import CommandContextMixIn +from pip._internal.cli.parser import ( + ConfigOptionParser, + UpdatingDefaultsHelpFormatter, +) +from pip._internal.cli.status_codes import ( + ERROR, + PREVIOUS_BUILD_DIR_ERROR, + SUCCESS, + UNKNOWN_ERROR, + VIRTUALENV_NOT_FOUND, +) +from pip._internal.exceptions import ( + BadCommand, + CommandError, + InstallationError, + PreviousBuildDirError, + UninstallationError, +) +from pip._internal.utils.deprecation import deprecated +from pip._internal.utils.filesystem import check_path_owner +from pip._internal.utils.logging import BrokenStdoutLoggingError, setup_logging +from pip._internal.utils.misc import get_prog, normalize_path +from pip._internal.utils.temp_dir import global_tempdir_manager +from pip._internal.utils.typing import MYPY_CHECK_RUNNING +from pip._internal.utils.virtualenv import running_under_virtualenv + +if MYPY_CHECK_RUNNING: + from typing import List, Tuple, Any + from optparse import Values + +__all__ = ['Command'] + +logger = logging.getLogger(__name__) + + +class Command(CommandContextMixIn): + usage = None # type: str + ignore_require_venv = False # type: bool + + def __init__(self, name, summary, isolated=False): + # type: (str, str, bool) -> None + super(Command, self).__init__() + parser_kw = { + 'usage': self.usage, + 'prog': '%s %s' % (get_prog(), name), + 'formatter': UpdatingDefaultsHelpFormatter(), + 'add_help_option': False, + 'name': name, + 'description': self.__doc__, + 'isolated': isolated, + } + + self.name = name + self.summary = summary + self.parser = ConfigOptionParser(**parser_kw) + + # Commands should add options to this option group + optgroup_name = '%s Options' % self.name.capitalize() + self.cmd_opts = optparse.OptionGroup(self.parser, optgroup_name) + + # Add the general options + gen_opts = cmdoptions.make_option_group( + cmdoptions.general_group, + self.parser, + ) + self.parser.add_option_group(gen_opts) + + def handle_pip_version_check(self, options): + # type: (Values) -> None + """ + This is a no-op so that commands by default do not do the pip version + check. + """ + # Make sure we do the pip version check if the index_group options + # are present. + assert not hasattr(options, 'no_index') + + def run(self, options, args): + # type: (Values, List[Any]) -> Any + raise NotImplementedError + + def parse_args(self, args): + # type: (List[str]) -> Tuple[Any, Any] + # factored out for testability + return self.parser.parse_args(args) + + def main(self, args): + # type: (List[str]) -> int + try: + with self.main_context(): + return self._main(args) + finally: + logging.shutdown() + + def _main(self, args): + # type: (List[str]) -> int + # Intentionally set as early as possible so globally-managed temporary + # directories are available to the rest of the code. + self.enter_context(global_tempdir_manager()) + + options, args = self.parse_args(args) + + # Set verbosity so that it can be used elsewhere. + self.verbosity = options.verbose - options.quiet + + level_number = setup_logging( + verbosity=self.verbosity, + no_color=options.no_color, + user_log_file=options.log, + ) + + if ( + sys.version_info[:2] == (2, 7) and + not options.no_python_version_warning + ): + message = ( + "A future version of pip will drop support for Python 2.7. " + "More details about Python 2 support in pip, can be found at " + "https://pip.pypa.io/en/latest/development/release-process/#python-2-support" # noqa + ) + if platform.python_implementation() == "CPython": + message = ( + "Python 2.7 reached the end of its life on January " + "1st, 2020. Please upgrade your Python as Python 2.7 " + "is no longer maintained. " + ) + message + deprecated(message, replacement=None, gone_in=None) + + if options.skip_requirements_regex: + deprecated( + "--skip-requirements-regex is unsupported and will be removed", + replacement=( + "manage requirements/constraints files explicitly, " + "possibly generating them from metadata" + ), + gone_in="20.1", + issue=7297, + ) + + # TODO: Try to get these passing down from the command? + # without resorting to os.environ to hold these. + # This also affects isolated builds and it should. + + if options.no_input: + os.environ['PIP_NO_INPUT'] = '1' + + if options.exists_action: + os.environ['PIP_EXISTS_ACTION'] = ' '.join(options.exists_action) + + if options.require_venv and not self.ignore_require_venv: + # If a venv is required check if it can really be found + if not running_under_virtualenv(): + logger.critical( + 'Could not find an activated virtualenv (required).' + ) + sys.exit(VIRTUALENV_NOT_FOUND) + + if options.cache_dir: + options.cache_dir = normalize_path(options.cache_dir) + if not check_path_owner(options.cache_dir): + logger.warning( + "The directory '%s' or its parent directory is not owned " + "or is not writable by the current user. The cache " + "has been disabled. Check the permissions and owner of " + "that directory. If executing pip with sudo, you may want " + "sudo's -H flag.", + options.cache_dir, + ) + options.cache_dir = None + + try: + status = self.run(options, args) + # FIXME: all commands should return an exit status + # and when it is done, isinstance is not needed anymore + if isinstance(status, int): + return status + except PreviousBuildDirError as exc: + logger.critical(str(exc)) + logger.debug('Exception information:', exc_info=True) + + return PREVIOUS_BUILD_DIR_ERROR + except (InstallationError, UninstallationError, BadCommand) as exc: + logger.critical(str(exc)) + logger.debug('Exception information:', exc_info=True) + + return ERROR + except CommandError as exc: + logger.critical('%s', exc) + logger.debug('Exception information:', exc_info=True) + + return ERROR + except BrokenStdoutLoggingError: + # Bypass our logger and write any remaining messages to stderr + # because stdout no longer works. + print('ERROR: Pipe to stdout was broken', file=sys.stderr) + if level_number <= logging.DEBUG: + traceback.print_exc(file=sys.stderr) + + return ERROR + except KeyboardInterrupt: + logger.critical('Operation cancelled by user') + logger.debug('Exception information:', exc_info=True) + + return ERROR + except BaseException: + logger.critical('Exception:', exc_info=True) + + return UNKNOWN_ERROR + finally: + self.handle_pip_version_check(options) + + return SUCCESS diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cli/base_command 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cli/base_command 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6fbb2f9465b6fe083ab4b177e6b12043324dda55 GIT binary patch literal 7346 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 GruH{m?*6F& literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cli/base_command.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cli/base_command.py new file mode 100644 index 0000000..628faa3 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cli/base_command.py @@ -0,0 +1,226 @@ +"""Base Command class, and related routines""" + +from __future__ import absolute_import, print_function + +import logging +import logging.config +import optparse +import os +import platform +import sys +import traceback + +from pip._internal.cli import cmdoptions +from pip._internal.cli.command_context import CommandContextMixIn +from pip._internal.cli.parser import ( + ConfigOptionParser, + UpdatingDefaultsHelpFormatter, +) +from pip._internal.cli.status_codes import ( + ERROR, + PREVIOUS_BUILD_DIR_ERROR, + SUCCESS, + UNKNOWN_ERROR, + VIRTUALENV_NOT_FOUND, +) +from pip._internal.exceptions import ( + BadCommand, + CommandError, + InstallationError, + PreviousBuildDirError, + UninstallationError, +) +from pip._internal.utils.deprecation import deprecated +from pip._internal.utils.filesystem import check_path_owner +from pip._internal.utils.logging import BrokenStdoutLoggingError, setup_logging +from pip._internal.utils.misc import get_prog, normalize_path +from pip._internal.utils.temp_dir import global_tempdir_manager +from pip._internal.utils.typing import MYPY_CHECK_RUNNING +from pip._internal.utils.virtualenv import running_under_virtualenv + +if MYPY_CHECK_RUNNING: + from typing import List, Tuple, Any + from optparse import Values + +__all__ = ['Command'] + +logger = logging.getLogger(__name__) + + +class Command(CommandContextMixIn): + usage = None # type: str + ignore_require_venv = False # type: bool + + def __init__(self, name, summary, isolated=False): + # type: (str, str, bool) -> None + super(Command, self).__init__() + parser_kw = { + 'usage': self.usage, + 'prog': '%s %s' % (get_prog(), name), + 'formatter': UpdatingDefaultsHelpFormatter(), + 'add_help_option': False, + 'name': name, + 'description': self.__doc__, + 'isolated': isolated, + } + + self.name = name + self.summary = summary + self.parser = ConfigOptionParser(**parser_kw) + + # Commands should add options to this option group + optgroup_name = '%s Options' % self.name.capitalize() + self.cmd_opts = optparse.OptionGroup(self.parser, optgroup_name) + + # Add the general options + gen_opts = cmdoptions.make_option_group( + cmdoptions.general_group, + self.parser, + ) + self.parser.add_option_group(gen_opts) + + def handle_pip_version_check(self, options): + # type: (Values) -> None + """ + This is a no-op so that commands by default do not do the pip version + check. + """ + # Make sure we do the pip version check if the index_group options + # are present. + assert not hasattr(options, 'no_index') + + def run(self, options, args): + # type: (Values, List[Any]) -> Any + raise NotImplementedError + + def parse_args(self, args): + # type: (List[str]) -> Tuple[Any, Any] + # factored out for testability + return self.parser.parse_args(args) + + def main(self, args): + # type: (List[str]) -> int + try: + with self.main_context(): + return self._main(args) + finally: + logging.shutdown() + + def _main(self, args): + # type: (List[str]) -> int + # Intentionally set as early as possible so globally-managed temporary + # directories are available to the rest of the code. + self.enter_context(global_tempdir_manager()) + + options, args = self.parse_args(args) + + # Set verbosity so that it can be used elsewhere. + self.verbosity = options.verbose - options.quiet + + level_number = setup_logging( + verbosity=self.verbosity, + no_color=options.no_color, + user_log_file=options.log, + ) + + if ( + sys.version_info[:2] == (2, 7) and + not options.no_python_version_warning + ): + message = ( + "A future version of pip will drop support for Python 2.7. " + "More details about Python 2 support in pip, can be found at " + "https://pip.pypa.io/en/latest/development/release-process/#python-2-support" # noqa + ) + if platform.python_implementation() == "CPython": + message = ( + "Python 2.7 reached the end of its life on January " + "1st, 2020. Please upgrade your Python as Python 2.7 " + "is no longer maintained. " + ) + message + deprecated(message, replacement=None, gone_in=None) + + if options.skip_requirements_regex: + deprecated( + "--skip-requirements-regex is unsupported and will be removed", + replacement=( + "manage requirements/constraints files explicitly, " + "possibly generating them from metadata" + ), + gone_in="20.1", + issue=7297, + ) + + # TODO: Try to get these passing down from the command? + # without resorting to os.environ to hold these. + # This also affects isolated builds and it should. + + if options.no_input: + os.environ['PIP_NO_INPUT'] = '1' + + if options.exists_action: + os.environ['PIP_EXISTS_ACTION'] = ' '.join(options.exists_action) + + if options.require_venv and not self.ignore_require_venv: + # If a venv is required check if it can really be found + if not running_under_virtualenv(): + logger.critical( + 'Could not find an activated virtualenv (required).' + ) + sys.exit(VIRTUALENV_NOT_FOUND) + + if options.cache_dir: + options.cache_dir = normalize_path(options.cache_dir) + if not check_path_owner(options.cache_dir): + logger.warning( + "The directory '%s' or its parent directory is not owned " + "or is not writable by the current user. The cache " + "has been disabled. Check the permissions and owner of " + "that directory. If executing pip with sudo, you may want " + "sudo's -H flag.", + options.cache_dir, + ) + options.cache_dir = None + + try: + status = self.run(options, args) + # FIXME: all commands should return an exit status + # and when it is done, isinstance is not needed anymore + if isinstance(status, int): + return status + except PreviousBuildDirError as exc: + logger.critical(str(exc)) + logger.debug('Exception information:', exc_info=True) + + return PREVIOUS_BUILD_DIR_ERROR + except (InstallationError, UninstallationError, BadCommand) as exc: + logger.critical(str(exc)) + logger.debug('Exception information:', exc_info=True) + + return ERROR + except CommandError as exc: + logger.critical('%s', exc) + logger.debug('Exception information:', exc_info=True) + + return ERROR + except BrokenStdoutLoggingError: + # Bypass our logger and write any remaining messages to stderr + # because stdout no longer works. + print('ERROR: Pipe to stdout was broken', file=sys.stderr) + if level_number <= logging.DEBUG: + traceback.print_exc(file=sys.stderr) + + return ERROR + except KeyboardInterrupt: + logger.critical('Operation cancelled by user') + logger.debug('Exception information:', exc_info=True) + + return ERROR + except BaseException: + logger.critical('Exception:', exc_info=True) + + return UNKNOWN_ERROR + finally: + self.handle_pip_version_check(options) + + return SUCCESS diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cli/base_command.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cli/base_command.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8da1c6f4fb6e1e763c8a8676a77d1afc045afaa3 GIT binary patch literal 7346 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 F{XgHP{1E^E literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cli/cmdoptions 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cli/cmdoptions 2.py new file mode 100644 index 0000000..42e2695 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cli/cmdoptions 2.py @@ -0,0 +1,957 @@ +""" +shared options and groups + +The principle here is to define options once, but *not* instantiate them +globally. One reason being that options with action='append' can carry state +between parses. pip parses general options twice internally, and shouldn't +pass on state. To be consistent, all options will follow this design. +""" + +# The following comment should be removed at some point in the future. +# mypy: strict-optional=False + +from __future__ import absolute_import + +import logging +import os +import textwrap +import warnings +from distutils.util import strtobool +from functools import partial +from optparse import SUPPRESS_HELP, Option, OptionGroup +from textwrap import dedent + +from pip._internal.exceptions import CommandError +from pip._internal.locations import USER_CACHE_DIR, get_src_prefix +from pip._internal.models.format_control import FormatControl +from pip._internal.models.index import PyPI +from pip._internal.models.target_python import TargetPython +from pip._internal.utils.hashes import STRONG_HASHES +from pip._internal.utils.typing import MYPY_CHECK_RUNNING +from pip._internal.utils.ui import BAR_TYPES + +if MYPY_CHECK_RUNNING: + from typing import Any, Callable, Dict, Optional, Tuple + from optparse import OptionParser, Values + from pip._internal.cli.parser import ConfigOptionParser + +logger = logging.getLogger(__name__) + + +def raise_option_error(parser, option, msg): + # type: (OptionParser, Option, str) -> None + """ + Raise an option parsing error using parser.error(). + + Args: + parser: an OptionParser instance. + option: an Option instance. + msg: the error text. + """ + msg = '{} error: {}'.format(option, msg) + msg = textwrap.fill(' '.join(msg.split())) + parser.error(msg) + + +def make_option_group(group, parser): + # type: (Dict[str, Any], ConfigOptionParser) -> OptionGroup + """ + Return an OptionGroup object + group -- assumed to be dict with 'name' and 'options' keys + parser -- an optparse Parser + """ + option_group = OptionGroup(parser, group['name']) + for option in group['options']: + option_group.add_option(option()) + return option_group + + +def check_install_build_global(options, check_options=None): + # type: (Values, Optional[Values]) -> None + """Disable wheels if per-setup.py call options are set. + + :param options: The OptionParser options to update. + :param check_options: The options to check, if not supplied defaults to + options. + """ + if check_options is None: + check_options = options + + def getname(n): + # type: (str) -> Optional[Any] + return getattr(check_options, n, None) + names = ["build_options", "global_options", "install_options"] + if any(map(getname, names)): + control = options.format_control + control.disallow_binaries() + warnings.warn( + 'Disabling all use of wheels due to the use of --build-option ' + '/ --global-option / --install-option.', stacklevel=2, + ) + + +def check_dist_restriction(options, check_target=False): + # type: (Values, bool) -> None + """Function for determining if custom platform options are allowed. + + :param options: The OptionParser options. + :param check_target: Whether or not to check if --target is being used. + """ + dist_restriction_set = any([ + options.python_version, + options.platform, + options.abi, + options.implementation, + ]) + + binary_only = FormatControl(set(), {':all:'}) + sdist_dependencies_allowed = ( + options.format_control != binary_only and + not options.ignore_dependencies + ) + + # Installations or downloads using dist restrictions must not combine + # source distributions and dist-specific wheels, as they are not + # guaranteed to be locally compatible. + if dist_restriction_set and sdist_dependencies_allowed: + raise CommandError( + "When restricting platform and interpreter constraints using " + "--python-version, --platform, --abi, or --implementation, " + "either --no-deps must be set, or --only-binary=:all: must be " + "set and --no-binary must not be set (or must be set to " + ":none:)." + ) + + if check_target: + if dist_restriction_set and not options.target_dir: + raise CommandError( + "Can not use any platform or abi specific options unless " + "installing via '--target'" + ) + + +def _path_option_check(option, opt, value): + # type: (Option, str, str) -> str + return os.path.expanduser(value) + + +class PipOption(Option): + TYPES = Option.TYPES + ("path",) + TYPE_CHECKER = Option.TYPE_CHECKER.copy() + TYPE_CHECKER["path"] = _path_option_check + + +########### +# options # +########### + +help_ = partial( + Option, + '-h', '--help', + dest='help', + action='help', + help='Show help.', +) # type: Callable[..., Option] + +isolated_mode = partial( + Option, + "--isolated", + dest="isolated_mode", + action="store_true", + default=False, + help=( + "Run pip in an isolated mode, ignoring environment variables and user " + "configuration." + ), +) # type: Callable[..., Option] + +require_virtualenv = partial( + Option, + # Run only if inside a virtualenv, bail if not. + '--require-virtualenv', '--require-venv', + dest='require_venv', + action='store_true', + default=False, + help=SUPPRESS_HELP +) # type: Callable[..., Option] + +verbose = partial( + Option, + '-v', '--verbose', + dest='verbose', + action='count', + default=0, + help='Give more output. Option is additive, and can be used up to 3 times.' +) # type: Callable[..., Option] + +no_color = partial( + Option, + '--no-color', + dest='no_color', + action='store_true', + default=False, + help="Suppress colored output", +) # type: Callable[..., Option] + +version = partial( + Option, + '-V', '--version', + dest='version', + action='store_true', + help='Show version and exit.', +) # type: Callable[..., Option] + +quiet = partial( + Option, + '-q', '--quiet', + dest='quiet', + action='count', + default=0, + help=( + 'Give less output. Option is additive, and can be used up to 3' + ' times (corresponding to WARNING, ERROR, and CRITICAL logging' + ' levels).' + ), +) # type: Callable[..., Option] + +progress_bar = partial( + Option, + '--progress-bar', + dest='progress_bar', + type='choice', + choices=list(BAR_TYPES.keys()), + default='on', + help=( + 'Specify type of progress to be displayed [' + + '|'.join(BAR_TYPES.keys()) + '] (default: %default)' + ), +) # type: Callable[..., Option] + +log = partial( + PipOption, + "--log", "--log-file", "--local-log", + dest="log", + metavar="path", + type="path", + help="Path to a verbose appending log." +) # type: Callable[..., Option] + +no_input = partial( + Option, + # Don't ask for input + '--no-input', + dest='no_input', + action='store_true', + default=False, + help=SUPPRESS_HELP +) # type: Callable[..., Option] + +proxy = partial( + Option, + '--proxy', + dest='proxy', + type='str', + default='', + help="Specify a proxy in the form [user:passwd@]proxy.server:port." +) # type: Callable[..., Option] + +retries = partial( + Option, + '--retries', + dest='retries', + type='int', + default=5, + help="Maximum number of retries each connection should attempt " + "(default %default times).", +) # type: Callable[..., Option] + +timeout = partial( + Option, + '--timeout', '--default-timeout', + metavar='sec', + dest='timeout', + type='float', + default=15, + help='Set the socket timeout (default %default seconds).', +) # type: Callable[..., Option] + +skip_requirements_regex = partial( + Option, + # A regex to be used to skip requirements + '--skip-requirements-regex', + dest='skip_requirements_regex', + type='str', + default='', + help=SUPPRESS_HELP, +) # type: Callable[..., Option] + + +def exists_action(): + # type: () -> Option + return Option( + # Option when path already exist + '--exists-action', + dest='exists_action', + type='choice', + choices=['s', 'i', 'w', 'b', 'a'], + default=[], + action='append', + metavar='action', + help="Default action when a path already exists: " + "(s)witch, (i)gnore, (w)ipe, (b)ackup, (a)bort.", + ) + + +cert = partial( + PipOption, + '--cert', + dest='cert', + type='path', + metavar='path', + help="Path to alternate CA bundle.", +) # type: Callable[..., Option] + +client_cert = partial( + PipOption, + '--client-cert', + dest='client_cert', + type='path', + default=None, + metavar='path', + help="Path to SSL client certificate, a single file containing the " + "private key and the certificate in PEM format.", +) # type: Callable[..., Option] + +index_url = partial( + Option, + '-i', '--index-url', '--pypi-url', + dest='index_url', + metavar='URL', + default=PyPI.simple_url, + help="Base URL of the Python Package Index (default %default). " + "This should point to a repository compliant with PEP 503 " + "(the simple repository API) or a local directory laid out " + "in the same format.", +) # type: Callable[..., Option] + + +def extra_index_url(): + # type: () -> Option + return Option( + '--extra-index-url', + dest='extra_index_urls', + metavar='URL', + action='append', + default=[], + help="Extra URLs of package indexes to use in addition to " + "--index-url. Should follow the same rules as " + "--index-url.", + ) + + +no_index = partial( + Option, + '--no-index', + dest='no_index', + action='store_true', + default=False, + help='Ignore package index (only looking at --find-links URLs instead).', +) # type: Callable[..., Option] + + +def find_links(): + # type: () -> Option + return Option( + '-f', '--find-links', + dest='find_links', + action='append', + default=[], + metavar='url', + help="If a url or path to an html file, then parse for links to " + "archives. If a local path or file:// url that's a directory, " + "then look for archives in the directory listing.", + ) + + +def trusted_host(): + # type: () -> Option + return Option( + "--trusted-host", + dest="trusted_hosts", + action="append", + metavar="HOSTNAME", + default=[], + help="Mark this host or host:port pair as trusted, even though it " + "does not have valid or any HTTPS.", + ) + + +def constraints(): + # type: () -> Option + return Option( + '-c', '--constraint', + dest='constraints', + action='append', + default=[], + metavar='file', + help='Constrain versions using the given constraints file. ' + 'This option can be used multiple times.' + ) + + +def requirements(): + # type: () -> Option + return Option( + '-r', '--requirement', + dest='requirements', + action='append', + default=[], + metavar='file', + help='Install from the given requirements file. ' + 'This option can be used multiple times.' + ) + + +def editable(): + # type: () -> Option + return Option( + '-e', '--editable', + dest='editables', + action='append', + default=[], + metavar='path/url', + help=('Install a project in editable mode (i.e. setuptools ' + '"develop mode") from a local project path or a VCS url.'), + ) + + +def _handle_src(option, opt_str, value, parser): + # type: (Option, str, str, OptionParser) -> None + value = os.path.abspath(value) + setattr(parser.values, option.dest, value) + + +src = partial( + PipOption, + '--src', '--source', '--source-dir', '--source-directory', + dest='src_dir', + type='path', + metavar='dir', + default=get_src_prefix(), + action='callback', + callback=_handle_src, + help='Directory to check out editable projects into. ' + 'The default in a virtualenv is "/src". ' + 'The default for global installs is "/src".' +) # type: Callable[..., Option] + + +def _get_format_control(values, option): + # type: (Values, Option) -> Any + """Get a format_control object.""" + return getattr(values, option.dest) + + +def _handle_no_binary(option, opt_str, value, parser): + # type: (Option, str, str, OptionParser) -> None + existing = _get_format_control(parser.values, option) + FormatControl.handle_mutual_excludes( + value, existing.no_binary, existing.only_binary, + ) + + +def _handle_only_binary(option, opt_str, value, parser): + # type: (Option, str, str, OptionParser) -> None + existing = _get_format_control(parser.values, option) + FormatControl.handle_mutual_excludes( + value, existing.only_binary, existing.no_binary, + ) + + +def no_binary(): + # type: () -> Option + format_control = FormatControl(set(), set()) + return Option( + "--no-binary", dest="format_control", action="callback", + callback=_handle_no_binary, type="str", + default=format_control, + help="Do not use binary packages. Can be supplied multiple times, and " + "each time adds to the existing value. Accepts either :all: to " + "disable all binary packages, :none: to empty the set, or one or " + "more package names with commas between them (no colons). Note " + "that some packages are tricky to compile and may fail to " + "install when this option is used on them.", + ) + + +def only_binary(): + # type: () -> Option + format_control = FormatControl(set(), set()) + return Option( + "--only-binary", dest="format_control", action="callback", + callback=_handle_only_binary, type="str", + default=format_control, + help="Do not use source packages. Can be supplied multiple times, and " + "each time adds to the existing value. Accepts either :all: to " + "disable all source packages, :none: to empty the set, or one or " + "more package names with commas between them. Packages without " + "binary distributions will fail to install when this option is " + "used on them.", + ) + + +platform = partial( + Option, + '--platform', + dest='platform', + metavar='platform', + default=None, + help=("Only use wheels compatible with . " + "Defaults to the platform of the running system."), +) # type: Callable[..., Option] + + +# This was made a separate function for unit-testing purposes. +def _convert_python_version(value): + # type: (str) -> Tuple[Tuple[int, ...], Optional[str]] + """ + Convert a version string like "3", "37", or "3.7.3" into a tuple of ints. + + :return: A 2-tuple (version_info, error_msg), where `error_msg` is + non-None if and only if there was a parsing error. + """ + if not value: + # The empty string is the same as not providing a value. + return (None, None) + + parts = value.split('.') + if len(parts) > 3: + return ((), 'at most three version parts are allowed') + + if len(parts) == 1: + # Then we are in the case of "3" or "37". + value = parts[0] + if len(value) > 1: + parts = [value[0], value[1:]] + + try: + version_info = tuple(int(part) for part in parts) + except ValueError: + return ((), 'each version part must be an integer') + + return (version_info, None) + + +def _handle_python_version(option, opt_str, value, parser): + # type: (Option, str, str, OptionParser) -> None + """ + Handle a provided --python-version value. + """ + version_info, error_msg = _convert_python_version(value) + if error_msg is not None: + msg = ( + 'invalid --python-version value: {!r}: {}'.format( + value, error_msg, + ) + ) + raise_option_error(parser, option=option, msg=msg) + + parser.values.python_version = version_info + + +python_version = partial( + Option, + '--python-version', + dest='python_version', + metavar='python_version', + action='callback', + callback=_handle_python_version, type='str', + default=None, + help=dedent("""\ + The Python interpreter version to use for wheel and "Requires-Python" + compatibility checks. Defaults to a version derived from the running + interpreter. The version can be specified using up to three dot-separated + integers (e.g. "3" for 3.0.0, "3.7" for 3.7.0, or "3.7.3"). A major-minor + version can also be given as a string without dots (e.g. "37" for 3.7.0). + """), +) # type: Callable[..., Option] + + +implementation = partial( + Option, + '--implementation', + dest='implementation', + metavar='implementation', + default=None, + help=("Only use wheels compatible with Python " + "implementation , e.g. 'pp', 'jy', 'cp', " + " or 'ip'. If not specified, then the current " + "interpreter implementation is used. Use 'py' to force " + "implementation-agnostic wheels."), +) # type: Callable[..., Option] + + +abi = partial( + Option, + '--abi', + dest='abi', + metavar='abi', + default=None, + help=("Only use wheels compatible with Python " + "abi , e.g. 'pypy_41'. If not specified, then the " + "current interpreter abi tag is used. Generally " + "you will need to specify --implementation, " + "--platform, and --python-version when using " + "this option."), +) # type: Callable[..., Option] + + +def add_target_python_options(cmd_opts): + # type: (OptionGroup) -> None + cmd_opts.add_option(platform()) + cmd_opts.add_option(python_version()) + cmd_opts.add_option(implementation()) + cmd_opts.add_option(abi()) + + +def make_target_python(options): + # type: (Values) -> TargetPython + target_python = TargetPython( + platform=options.platform, + py_version_info=options.python_version, + abi=options.abi, + implementation=options.implementation, + ) + + return target_python + + +def prefer_binary(): + # type: () -> Option + return Option( + "--prefer-binary", + dest="prefer_binary", + action="store_true", + default=False, + help="Prefer older binary packages over newer source packages." + ) + + +cache_dir = partial( + PipOption, + "--cache-dir", + dest="cache_dir", + default=USER_CACHE_DIR, + metavar="dir", + type='path', + help="Store the cache data in ." +) # type: Callable[..., Option] + + +def _handle_no_cache_dir(option, opt, value, parser): + # type: (Option, str, str, OptionParser) -> None + """ + Process a value provided for the --no-cache-dir option. + + This is an optparse.Option callback for the --no-cache-dir option. + """ + # The value argument will be None if --no-cache-dir is passed via the + # command-line, since the option doesn't accept arguments. However, + # the value can be non-None if the option is triggered e.g. by an + # environment variable, like PIP_NO_CACHE_DIR=true. + if value is not None: + # Then parse the string value to get argument error-checking. + try: + strtobool(value) + except ValueError as exc: + raise_option_error(parser, option=option, msg=str(exc)) + + # Originally, setting PIP_NO_CACHE_DIR to a value that strtobool() + # converted to 0 (like "false" or "no") caused cache_dir to be disabled + # rather than enabled (logic would say the latter). Thus, we disable + # the cache directory not just on values that parse to True, but (for + # backwards compatibility reasons) also on values that parse to False. + # In other words, always set it to False if the option is provided in + # some (valid) form. + parser.values.cache_dir = False + + +no_cache = partial( + Option, + "--no-cache-dir", + dest="cache_dir", + action="callback", + callback=_handle_no_cache_dir, + help="Disable the cache.", +) # type: Callable[..., Option] + +no_deps = partial( + Option, + '--no-deps', '--no-dependencies', + dest='ignore_dependencies', + action='store_true', + default=False, + help="Don't install package dependencies.", +) # type: Callable[..., Option] + + +def _handle_build_dir(option, opt, value, parser): + # type: (Option, str, str, OptionParser) -> None + if value: + value = os.path.abspath(value) + setattr(parser.values, option.dest, value) + + +build_dir = partial( + PipOption, + '-b', '--build', '--build-dir', '--build-directory', + dest='build_dir', + type='path', + metavar='dir', + action='callback', + callback=_handle_build_dir, + help='Directory to unpack packages into and build in. Note that ' + 'an initial build still takes place in a temporary directory. ' + 'The location of temporary directories can be controlled by setting ' + 'the TMPDIR environment variable (TEMP on Windows) appropriately. ' + 'When passed, build directories are not cleaned in case of failures.' +) # type: Callable[..., Option] + +ignore_requires_python = partial( + Option, + '--ignore-requires-python', + dest='ignore_requires_python', + action='store_true', + help='Ignore the Requires-Python information.' +) # type: Callable[..., Option] + +no_build_isolation = partial( + Option, + '--no-build-isolation', + dest='build_isolation', + action='store_false', + default=True, + help='Disable isolation when building a modern source distribution. ' + 'Build dependencies specified by PEP 518 must be already installed ' + 'if this option is used.' +) # type: Callable[..., Option] + + +def _handle_no_use_pep517(option, opt, value, parser): + # type: (Option, str, str, OptionParser) -> None + """ + Process a value provided for the --no-use-pep517 option. + + This is an optparse.Option callback for the no_use_pep517 option. + """ + # Since --no-use-pep517 doesn't accept arguments, the value argument + # will be None if --no-use-pep517 is passed via the command-line. + # However, the value can be non-None if the option is triggered e.g. + # by an environment variable, for example "PIP_NO_USE_PEP517=true". + if value is not None: + msg = """A value was passed for --no-use-pep517, + probably using either the PIP_NO_USE_PEP517 environment variable + or the "no-use-pep517" config file option. Use an appropriate value + of the PIP_USE_PEP517 environment variable or the "use-pep517" + config file option instead. + """ + raise_option_error(parser, option=option, msg=msg) + + # Otherwise, --no-use-pep517 was passed via the command-line. + parser.values.use_pep517 = False + + +use_pep517 = partial( + Option, + '--use-pep517', + dest='use_pep517', + action='store_true', + default=None, + help='Use PEP 517 for building source distributions ' + '(use --no-use-pep517 to force legacy behaviour).' +) # type: Any + +no_use_pep517 = partial( + Option, + '--no-use-pep517', + dest='use_pep517', + action='callback', + callback=_handle_no_use_pep517, + default=None, + help=SUPPRESS_HELP +) # type: Any + +install_options = partial( + Option, + '--install-option', + dest='install_options', + action='append', + metavar='options', + help="Extra arguments to be supplied to the setup.py install " + "command (use like --install-option=\"--install-scripts=/usr/local/" + "bin\"). Use multiple --install-option options to pass multiple " + "options to setup.py install. If you are using an option with a " + "directory path, be sure to use absolute path.", +) # type: Callable[..., Option] + +global_options = partial( + Option, + '--global-option', + dest='global_options', + action='append', + metavar='options', + help="Extra global options to be supplied to the setup.py " + "call before the install command.", +) # type: Callable[..., Option] + +no_clean = partial( + Option, + '--no-clean', + action='store_true', + default=False, + help="Don't clean up build directories." +) # type: Callable[..., Option] + +pre = partial( + Option, + '--pre', + action='store_true', + default=False, + help="Include pre-release and development versions. By default, " + "pip only finds stable versions.", +) # type: Callable[..., Option] + +disable_pip_version_check = partial( + Option, + "--disable-pip-version-check", + dest="disable_pip_version_check", + action="store_true", + default=False, + help="Don't periodically check PyPI to determine whether a new version " + "of pip is available for download. Implied with --no-index.", +) # type: Callable[..., Option] + + +# Deprecated, Remove later +always_unzip = partial( + Option, + '-Z', '--always-unzip', + dest='always_unzip', + action='store_true', + help=SUPPRESS_HELP, +) # type: Callable[..., Option] + + +def _handle_merge_hash(option, opt_str, value, parser): + # type: (Option, str, str, OptionParser) -> None + """Given a value spelled "algo:digest", append the digest to a list + pointed to in a dict by the algo name.""" + if not parser.values.hashes: + parser.values.hashes = {} + try: + algo, digest = value.split(':', 1) + except ValueError: + parser.error('Arguments to %s must be a hash name ' + 'followed by a value, like --hash=sha256:abcde...' % + opt_str) + if algo not in STRONG_HASHES: + parser.error('Allowed hash algorithms for %s are %s.' % + (opt_str, ', '.join(STRONG_HASHES))) + parser.values.hashes.setdefault(algo, []).append(digest) + + +hash = partial( + Option, + '--hash', + # Hash values eventually end up in InstallRequirement.hashes due to + # __dict__ copying in process_line(). + dest='hashes', + action='callback', + callback=_handle_merge_hash, + type='string', + help="Verify that the package's archive matches this " + 'hash before installing. Example: --hash=sha256:abcdef...', +) # type: Callable[..., Option] + + +require_hashes = partial( + Option, + '--require-hashes', + dest='require_hashes', + action='store_true', + default=False, + help='Require a hash to check each requirement against, for ' + 'repeatable installs. This option is implied when any package in a ' + 'requirements file has a --hash option.', +) # type: Callable[..., Option] + + +list_path = partial( + PipOption, + '--path', + dest='path', + type='path', + action='append', + help='Restrict to the specified installation path for listing ' + 'packages (can be used multiple times).' +) # type: Callable[..., Option] + + +def check_list_path_option(options): + # type: (Values) -> None + if options.path and (options.user or options.local): + raise CommandError( + "Cannot combine '--path' with '--user' or '--local'" + ) + + +no_python_version_warning = partial( + Option, + '--no-python-version-warning', + dest='no_python_version_warning', + action='store_true', + default=False, + help='Silence deprecation warnings for upcoming unsupported Pythons.', +) # type: Callable[..., Option] + + +########## +# groups # +########## + +general_group = { + 'name': 'General Options', + 'options': [ + help_, + isolated_mode, + require_virtualenv, + verbose, + version, + quiet, + log, + no_input, + proxy, + retries, + timeout, + skip_requirements_regex, + exists_action, + trusted_host, + cert, + client_cert, + cache_dir, + no_cache, + disable_pip_version_check, + no_color, + no_python_version_warning, + ] +} # type: Dict[str, Any] + +index_group = { + 'name': 'Package Index Options', + 'options': [ + index_url, + extra_index_url, + no_index, + find_links, + ] +} # type: Dict[str, Any] diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cli/cmdoptions 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cli/cmdoptions 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ca5d6673120969251d708a28e53dc04d8fb95ee2 GIT binary patch literal 26026 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 e_TG|e21YaVG&V7e4Lt3_S& literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cli/cmdoptions.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cli/cmdoptions.py new file mode 100644 index 0000000..42e2695 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cli/cmdoptions.py @@ -0,0 +1,957 @@ +""" +shared options and groups + +The principle here is to define options once, but *not* instantiate them +globally. One reason being that options with action='append' can carry state +between parses. pip parses general options twice internally, and shouldn't +pass on state. To be consistent, all options will follow this design. +""" + +# The following comment should be removed at some point in the future. +# mypy: strict-optional=False + +from __future__ import absolute_import + +import logging +import os +import textwrap +import warnings +from distutils.util import strtobool +from functools import partial +from optparse import SUPPRESS_HELP, Option, OptionGroup +from textwrap import dedent + +from pip._internal.exceptions import CommandError +from pip._internal.locations import USER_CACHE_DIR, get_src_prefix +from pip._internal.models.format_control import FormatControl +from pip._internal.models.index import PyPI +from pip._internal.models.target_python import TargetPython +from pip._internal.utils.hashes import STRONG_HASHES +from pip._internal.utils.typing import MYPY_CHECK_RUNNING +from pip._internal.utils.ui import BAR_TYPES + +if MYPY_CHECK_RUNNING: + from typing import Any, Callable, Dict, Optional, Tuple + from optparse import OptionParser, Values + from pip._internal.cli.parser import ConfigOptionParser + +logger = logging.getLogger(__name__) + + +def raise_option_error(parser, option, msg): + # type: (OptionParser, Option, str) -> None + """ + Raise an option parsing error using parser.error(). + + Args: + parser: an OptionParser instance. + option: an Option instance. + msg: the error text. + """ + msg = '{} error: {}'.format(option, msg) + msg = textwrap.fill(' '.join(msg.split())) + parser.error(msg) + + +def make_option_group(group, parser): + # type: (Dict[str, Any], ConfigOptionParser) -> OptionGroup + """ + Return an OptionGroup object + group -- assumed to be dict with 'name' and 'options' keys + parser -- an optparse Parser + """ + option_group = OptionGroup(parser, group['name']) + for option in group['options']: + option_group.add_option(option()) + return option_group + + +def check_install_build_global(options, check_options=None): + # type: (Values, Optional[Values]) -> None + """Disable wheels if per-setup.py call options are set. + + :param options: The OptionParser options to update. + :param check_options: The options to check, if not supplied defaults to + options. + """ + if check_options is None: + check_options = options + + def getname(n): + # type: (str) -> Optional[Any] + return getattr(check_options, n, None) + names = ["build_options", "global_options", "install_options"] + if any(map(getname, names)): + control = options.format_control + control.disallow_binaries() + warnings.warn( + 'Disabling all use of wheels due to the use of --build-option ' + '/ --global-option / --install-option.', stacklevel=2, + ) + + +def check_dist_restriction(options, check_target=False): + # type: (Values, bool) -> None + """Function for determining if custom platform options are allowed. + + :param options: The OptionParser options. + :param check_target: Whether or not to check if --target is being used. + """ + dist_restriction_set = any([ + options.python_version, + options.platform, + options.abi, + options.implementation, + ]) + + binary_only = FormatControl(set(), {':all:'}) + sdist_dependencies_allowed = ( + options.format_control != binary_only and + not options.ignore_dependencies + ) + + # Installations or downloads using dist restrictions must not combine + # source distributions and dist-specific wheels, as they are not + # guaranteed to be locally compatible. + if dist_restriction_set and sdist_dependencies_allowed: + raise CommandError( + "When restricting platform and interpreter constraints using " + "--python-version, --platform, --abi, or --implementation, " + "either --no-deps must be set, or --only-binary=:all: must be " + "set and --no-binary must not be set (or must be set to " + ":none:)." + ) + + if check_target: + if dist_restriction_set and not options.target_dir: + raise CommandError( + "Can not use any platform or abi specific options unless " + "installing via '--target'" + ) + + +def _path_option_check(option, opt, value): + # type: (Option, str, str) -> str + return os.path.expanduser(value) + + +class PipOption(Option): + TYPES = Option.TYPES + ("path",) + TYPE_CHECKER = Option.TYPE_CHECKER.copy() + TYPE_CHECKER["path"] = _path_option_check + + +########### +# options # +########### + +help_ = partial( + Option, + '-h', '--help', + dest='help', + action='help', + help='Show help.', +) # type: Callable[..., Option] + +isolated_mode = partial( + Option, + "--isolated", + dest="isolated_mode", + action="store_true", + default=False, + help=( + "Run pip in an isolated mode, ignoring environment variables and user " + "configuration." + ), +) # type: Callable[..., Option] + +require_virtualenv = partial( + Option, + # Run only if inside a virtualenv, bail if not. + '--require-virtualenv', '--require-venv', + dest='require_venv', + action='store_true', + default=False, + help=SUPPRESS_HELP +) # type: Callable[..., Option] + +verbose = partial( + Option, + '-v', '--verbose', + dest='verbose', + action='count', + default=0, + help='Give more output. Option is additive, and can be used up to 3 times.' +) # type: Callable[..., Option] + +no_color = partial( + Option, + '--no-color', + dest='no_color', + action='store_true', + default=False, + help="Suppress colored output", +) # type: Callable[..., Option] + +version = partial( + Option, + '-V', '--version', + dest='version', + action='store_true', + help='Show version and exit.', +) # type: Callable[..., Option] + +quiet = partial( + Option, + '-q', '--quiet', + dest='quiet', + action='count', + default=0, + help=( + 'Give less output. Option is additive, and can be used up to 3' + ' times (corresponding to WARNING, ERROR, and CRITICAL logging' + ' levels).' + ), +) # type: Callable[..., Option] + +progress_bar = partial( + Option, + '--progress-bar', + dest='progress_bar', + type='choice', + choices=list(BAR_TYPES.keys()), + default='on', + help=( + 'Specify type of progress to be displayed [' + + '|'.join(BAR_TYPES.keys()) + '] (default: %default)' + ), +) # type: Callable[..., Option] + +log = partial( + PipOption, + "--log", "--log-file", "--local-log", + dest="log", + metavar="path", + type="path", + help="Path to a verbose appending log." +) # type: Callable[..., Option] + +no_input = partial( + Option, + # Don't ask for input + '--no-input', + dest='no_input', + action='store_true', + default=False, + help=SUPPRESS_HELP +) # type: Callable[..., Option] + +proxy = partial( + Option, + '--proxy', + dest='proxy', + type='str', + default='', + help="Specify a proxy in the form [user:passwd@]proxy.server:port." +) # type: Callable[..., Option] + +retries = partial( + Option, + '--retries', + dest='retries', + type='int', + default=5, + help="Maximum number of retries each connection should attempt " + "(default %default times).", +) # type: Callable[..., Option] + +timeout = partial( + Option, + '--timeout', '--default-timeout', + metavar='sec', + dest='timeout', + type='float', + default=15, + help='Set the socket timeout (default %default seconds).', +) # type: Callable[..., Option] + +skip_requirements_regex = partial( + Option, + # A regex to be used to skip requirements + '--skip-requirements-regex', + dest='skip_requirements_regex', + type='str', + default='', + help=SUPPRESS_HELP, +) # type: Callable[..., Option] + + +def exists_action(): + # type: () -> Option + return Option( + # Option when path already exist + '--exists-action', + dest='exists_action', + type='choice', + choices=['s', 'i', 'w', 'b', 'a'], + default=[], + action='append', + metavar='action', + help="Default action when a path already exists: " + "(s)witch, (i)gnore, (w)ipe, (b)ackup, (a)bort.", + ) + + +cert = partial( + PipOption, + '--cert', + dest='cert', + type='path', + metavar='path', + help="Path to alternate CA bundle.", +) # type: Callable[..., Option] + +client_cert = partial( + PipOption, + '--client-cert', + dest='client_cert', + type='path', + default=None, + metavar='path', + help="Path to SSL client certificate, a single file containing the " + "private key and the certificate in PEM format.", +) # type: Callable[..., Option] + +index_url = partial( + Option, + '-i', '--index-url', '--pypi-url', + dest='index_url', + metavar='URL', + default=PyPI.simple_url, + help="Base URL of the Python Package Index (default %default). " + "This should point to a repository compliant with PEP 503 " + "(the simple repository API) or a local directory laid out " + "in the same format.", +) # type: Callable[..., Option] + + +def extra_index_url(): + # type: () -> Option + return Option( + '--extra-index-url', + dest='extra_index_urls', + metavar='URL', + action='append', + default=[], + help="Extra URLs of package indexes to use in addition to " + "--index-url. Should follow the same rules as " + "--index-url.", + ) + + +no_index = partial( + Option, + '--no-index', + dest='no_index', + action='store_true', + default=False, + help='Ignore package index (only looking at --find-links URLs instead).', +) # type: Callable[..., Option] + + +def find_links(): + # type: () -> Option + return Option( + '-f', '--find-links', + dest='find_links', + action='append', + default=[], + metavar='url', + help="If a url or path to an html file, then parse for links to " + "archives. If a local path or file:// url that's a directory, " + "then look for archives in the directory listing.", + ) + + +def trusted_host(): + # type: () -> Option + return Option( + "--trusted-host", + dest="trusted_hosts", + action="append", + metavar="HOSTNAME", + default=[], + help="Mark this host or host:port pair as trusted, even though it " + "does not have valid or any HTTPS.", + ) + + +def constraints(): + # type: () -> Option + return Option( + '-c', '--constraint', + dest='constraints', + action='append', + default=[], + metavar='file', + help='Constrain versions using the given constraints file. ' + 'This option can be used multiple times.' + ) + + +def requirements(): + # type: () -> Option + return Option( + '-r', '--requirement', + dest='requirements', + action='append', + default=[], + metavar='file', + help='Install from the given requirements file. ' + 'This option can be used multiple times.' + ) + + +def editable(): + # type: () -> Option + return Option( + '-e', '--editable', + dest='editables', + action='append', + default=[], + metavar='path/url', + help=('Install a project in editable mode (i.e. setuptools ' + '"develop mode") from a local project path or a VCS url.'), + ) + + +def _handle_src(option, opt_str, value, parser): + # type: (Option, str, str, OptionParser) -> None + value = os.path.abspath(value) + setattr(parser.values, option.dest, value) + + +src = partial( + PipOption, + '--src', '--source', '--source-dir', '--source-directory', + dest='src_dir', + type='path', + metavar='dir', + default=get_src_prefix(), + action='callback', + callback=_handle_src, + help='Directory to check out editable projects into. ' + 'The default in a virtualenv is "/src". ' + 'The default for global installs is "/src".' +) # type: Callable[..., Option] + + +def _get_format_control(values, option): + # type: (Values, Option) -> Any + """Get a format_control object.""" + return getattr(values, option.dest) + + +def _handle_no_binary(option, opt_str, value, parser): + # type: (Option, str, str, OptionParser) -> None + existing = _get_format_control(parser.values, option) + FormatControl.handle_mutual_excludes( + value, existing.no_binary, existing.only_binary, + ) + + +def _handle_only_binary(option, opt_str, value, parser): + # type: (Option, str, str, OptionParser) -> None + existing = _get_format_control(parser.values, option) + FormatControl.handle_mutual_excludes( + value, existing.only_binary, existing.no_binary, + ) + + +def no_binary(): + # type: () -> Option + format_control = FormatControl(set(), set()) + return Option( + "--no-binary", dest="format_control", action="callback", + callback=_handle_no_binary, type="str", + default=format_control, + help="Do not use binary packages. Can be supplied multiple times, and " + "each time adds to the existing value. Accepts either :all: to " + "disable all binary packages, :none: to empty the set, or one or " + "more package names with commas between them (no colons). Note " + "that some packages are tricky to compile and may fail to " + "install when this option is used on them.", + ) + + +def only_binary(): + # type: () -> Option + format_control = FormatControl(set(), set()) + return Option( + "--only-binary", dest="format_control", action="callback", + callback=_handle_only_binary, type="str", + default=format_control, + help="Do not use source packages. Can be supplied multiple times, and " + "each time adds to the existing value. Accepts either :all: to " + "disable all source packages, :none: to empty the set, or one or " + "more package names with commas between them. Packages without " + "binary distributions will fail to install when this option is " + "used on them.", + ) + + +platform = partial( + Option, + '--platform', + dest='platform', + metavar='platform', + default=None, + help=("Only use wheels compatible with . " + "Defaults to the platform of the running system."), +) # type: Callable[..., Option] + + +# This was made a separate function for unit-testing purposes. +def _convert_python_version(value): + # type: (str) -> Tuple[Tuple[int, ...], Optional[str]] + """ + Convert a version string like "3", "37", or "3.7.3" into a tuple of ints. + + :return: A 2-tuple (version_info, error_msg), where `error_msg` is + non-None if and only if there was a parsing error. + """ + if not value: + # The empty string is the same as not providing a value. + return (None, None) + + parts = value.split('.') + if len(parts) > 3: + return ((), 'at most three version parts are allowed') + + if len(parts) == 1: + # Then we are in the case of "3" or "37". + value = parts[0] + if len(value) > 1: + parts = [value[0], value[1:]] + + try: + version_info = tuple(int(part) for part in parts) + except ValueError: + return ((), 'each version part must be an integer') + + return (version_info, None) + + +def _handle_python_version(option, opt_str, value, parser): + # type: (Option, str, str, OptionParser) -> None + """ + Handle a provided --python-version value. + """ + version_info, error_msg = _convert_python_version(value) + if error_msg is not None: + msg = ( + 'invalid --python-version value: {!r}: {}'.format( + value, error_msg, + ) + ) + raise_option_error(parser, option=option, msg=msg) + + parser.values.python_version = version_info + + +python_version = partial( + Option, + '--python-version', + dest='python_version', + metavar='python_version', + action='callback', + callback=_handle_python_version, type='str', + default=None, + help=dedent("""\ + The Python interpreter version to use for wheel and "Requires-Python" + compatibility checks. Defaults to a version derived from the running + interpreter. The version can be specified using up to three dot-separated + integers (e.g. "3" for 3.0.0, "3.7" for 3.7.0, or "3.7.3"). A major-minor + version can also be given as a string without dots (e.g. "37" for 3.7.0). + """), +) # type: Callable[..., Option] + + +implementation = partial( + Option, + '--implementation', + dest='implementation', + metavar='implementation', + default=None, + help=("Only use wheels compatible with Python " + "implementation , e.g. 'pp', 'jy', 'cp', " + " or 'ip'. If not specified, then the current " + "interpreter implementation is used. Use 'py' to force " + "implementation-agnostic wheels."), +) # type: Callable[..., Option] + + +abi = partial( + Option, + '--abi', + dest='abi', + metavar='abi', + default=None, + help=("Only use wheels compatible with Python " + "abi , e.g. 'pypy_41'. If not specified, then the " + "current interpreter abi tag is used. Generally " + "you will need to specify --implementation, " + "--platform, and --python-version when using " + "this option."), +) # type: Callable[..., Option] + + +def add_target_python_options(cmd_opts): + # type: (OptionGroup) -> None + cmd_opts.add_option(platform()) + cmd_opts.add_option(python_version()) + cmd_opts.add_option(implementation()) + cmd_opts.add_option(abi()) + + +def make_target_python(options): + # type: (Values) -> TargetPython + target_python = TargetPython( + platform=options.platform, + py_version_info=options.python_version, + abi=options.abi, + implementation=options.implementation, + ) + + return target_python + + +def prefer_binary(): + # type: () -> Option + return Option( + "--prefer-binary", + dest="prefer_binary", + action="store_true", + default=False, + help="Prefer older binary packages over newer source packages." + ) + + +cache_dir = partial( + PipOption, + "--cache-dir", + dest="cache_dir", + default=USER_CACHE_DIR, + metavar="dir", + type='path', + help="Store the cache data in ." +) # type: Callable[..., Option] + + +def _handle_no_cache_dir(option, opt, value, parser): + # type: (Option, str, str, OptionParser) -> None + """ + Process a value provided for the --no-cache-dir option. + + This is an optparse.Option callback for the --no-cache-dir option. + """ + # The value argument will be None if --no-cache-dir is passed via the + # command-line, since the option doesn't accept arguments. However, + # the value can be non-None if the option is triggered e.g. by an + # environment variable, like PIP_NO_CACHE_DIR=true. + if value is not None: + # Then parse the string value to get argument error-checking. + try: + strtobool(value) + except ValueError as exc: + raise_option_error(parser, option=option, msg=str(exc)) + + # Originally, setting PIP_NO_CACHE_DIR to a value that strtobool() + # converted to 0 (like "false" or "no") caused cache_dir to be disabled + # rather than enabled (logic would say the latter). Thus, we disable + # the cache directory not just on values that parse to True, but (for + # backwards compatibility reasons) also on values that parse to False. + # In other words, always set it to False if the option is provided in + # some (valid) form. + parser.values.cache_dir = False + + +no_cache = partial( + Option, + "--no-cache-dir", + dest="cache_dir", + action="callback", + callback=_handle_no_cache_dir, + help="Disable the cache.", +) # type: Callable[..., Option] + +no_deps = partial( + Option, + '--no-deps', '--no-dependencies', + dest='ignore_dependencies', + action='store_true', + default=False, + help="Don't install package dependencies.", +) # type: Callable[..., Option] + + +def _handle_build_dir(option, opt, value, parser): + # type: (Option, str, str, OptionParser) -> None + if value: + value = os.path.abspath(value) + setattr(parser.values, option.dest, value) + + +build_dir = partial( + PipOption, + '-b', '--build', '--build-dir', '--build-directory', + dest='build_dir', + type='path', + metavar='dir', + action='callback', + callback=_handle_build_dir, + help='Directory to unpack packages into and build in. Note that ' + 'an initial build still takes place in a temporary directory. ' + 'The location of temporary directories can be controlled by setting ' + 'the TMPDIR environment variable (TEMP on Windows) appropriately. ' + 'When passed, build directories are not cleaned in case of failures.' +) # type: Callable[..., Option] + +ignore_requires_python = partial( + Option, + '--ignore-requires-python', + dest='ignore_requires_python', + action='store_true', + help='Ignore the Requires-Python information.' +) # type: Callable[..., Option] + +no_build_isolation = partial( + Option, + '--no-build-isolation', + dest='build_isolation', + action='store_false', + default=True, + help='Disable isolation when building a modern source distribution. ' + 'Build dependencies specified by PEP 518 must be already installed ' + 'if this option is used.' +) # type: Callable[..., Option] + + +def _handle_no_use_pep517(option, opt, value, parser): + # type: (Option, str, str, OptionParser) -> None + """ + Process a value provided for the --no-use-pep517 option. + + This is an optparse.Option callback for the no_use_pep517 option. + """ + # Since --no-use-pep517 doesn't accept arguments, the value argument + # will be None if --no-use-pep517 is passed via the command-line. + # However, the value can be non-None if the option is triggered e.g. + # by an environment variable, for example "PIP_NO_USE_PEP517=true". + if value is not None: + msg = """A value was passed for --no-use-pep517, + probably using either the PIP_NO_USE_PEP517 environment variable + or the "no-use-pep517" config file option. Use an appropriate value + of the PIP_USE_PEP517 environment variable or the "use-pep517" + config file option instead. + """ + raise_option_error(parser, option=option, msg=msg) + + # Otherwise, --no-use-pep517 was passed via the command-line. + parser.values.use_pep517 = False + + +use_pep517 = partial( + Option, + '--use-pep517', + dest='use_pep517', + action='store_true', + default=None, + help='Use PEP 517 for building source distributions ' + '(use --no-use-pep517 to force legacy behaviour).' +) # type: Any + +no_use_pep517 = partial( + Option, + '--no-use-pep517', + dest='use_pep517', + action='callback', + callback=_handle_no_use_pep517, + default=None, + help=SUPPRESS_HELP +) # type: Any + +install_options = partial( + Option, + '--install-option', + dest='install_options', + action='append', + metavar='options', + help="Extra arguments to be supplied to the setup.py install " + "command (use like --install-option=\"--install-scripts=/usr/local/" + "bin\"). Use multiple --install-option options to pass multiple " + "options to setup.py install. If you are using an option with a " + "directory path, be sure to use absolute path.", +) # type: Callable[..., Option] + +global_options = partial( + Option, + '--global-option', + dest='global_options', + action='append', + metavar='options', + help="Extra global options to be supplied to the setup.py " + "call before the install command.", +) # type: Callable[..., Option] + +no_clean = partial( + Option, + '--no-clean', + action='store_true', + default=False, + help="Don't clean up build directories." +) # type: Callable[..., Option] + +pre = partial( + Option, + '--pre', + action='store_true', + default=False, + help="Include pre-release and development versions. By default, " + "pip only finds stable versions.", +) # type: Callable[..., Option] + +disable_pip_version_check = partial( + Option, + "--disable-pip-version-check", + dest="disable_pip_version_check", + action="store_true", + default=False, + help="Don't periodically check PyPI to determine whether a new version " + "of pip is available for download. Implied with --no-index.", +) # type: Callable[..., Option] + + +# Deprecated, Remove later +always_unzip = partial( + Option, + '-Z', '--always-unzip', + dest='always_unzip', + action='store_true', + help=SUPPRESS_HELP, +) # type: Callable[..., Option] + + +def _handle_merge_hash(option, opt_str, value, parser): + # type: (Option, str, str, OptionParser) -> None + """Given a value spelled "algo:digest", append the digest to a list + pointed to in a dict by the algo name.""" + if not parser.values.hashes: + parser.values.hashes = {} + try: + algo, digest = value.split(':', 1) + except ValueError: + parser.error('Arguments to %s must be a hash name ' + 'followed by a value, like --hash=sha256:abcde...' % + opt_str) + if algo not in STRONG_HASHES: + parser.error('Allowed hash algorithms for %s are %s.' % + (opt_str, ', '.join(STRONG_HASHES))) + parser.values.hashes.setdefault(algo, []).append(digest) + + +hash = partial( + Option, + '--hash', + # Hash values eventually end up in InstallRequirement.hashes due to + # __dict__ copying in process_line(). + dest='hashes', + action='callback', + callback=_handle_merge_hash, + type='string', + help="Verify that the package's archive matches this " + 'hash before installing. Example: --hash=sha256:abcdef...', +) # type: Callable[..., Option] + + +require_hashes = partial( + Option, + '--require-hashes', + dest='require_hashes', + action='store_true', + default=False, + help='Require a hash to check each requirement against, for ' + 'repeatable installs. This option is implied when any package in a ' + 'requirements file has a --hash option.', +) # type: Callable[..., Option] + + +list_path = partial( + PipOption, + '--path', + dest='path', + type='path', + action='append', + help='Restrict to the specified installation path for listing ' + 'packages (can be used multiple times).' +) # type: Callable[..., Option] + + +def check_list_path_option(options): + # type: (Values) -> None + if options.path and (options.user or options.local): + raise CommandError( + "Cannot combine '--path' with '--user' or '--local'" + ) + + +no_python_version_warning = partial( + Option, + '--no-python-version-warning', + dest='no_python_version_warning', + action='store_true', + default=False, + help='Silence deprecation warnings for upcoming unsupported Pythons.', +) # type: Callable[..., Option] + + +########## +# groups # +########## + +general_group = { + 'name': 'General Options', + 'options': [ + help_, + isolated_mode, + require_virtualenv, + verbose, + version, + quiet, + log, + no_input, + proxy, + retries, + timeout, + skip_requirements_regex, + exists_action, + trusted_host, + cert, + client_cert, + cache_dir, + no_cache, + disable_pip_version_check, + no_color, + no_python_version_warning, + ] +} # type: Dict[str, Any] + +index_group = { + 'name': 'Package Index Options', + 'options': [ + index_url, + extra_index_url, + no_index, + find_links, + ] +} # type: Dict[str, Any] diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cli/cmdoptions.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cli/cmdoptions.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b49667406abb0d7ef4c670e39a04299b3bb72a09 GIT binary patch literal 26026 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 VE;9>wKyIr|9uIO*!B z8TOw-+O`la4N^cqWB?C=V8N)(3_fE;1zJXgF08Rqoato9T8g|>A2PlmJcPvFM2>T} zEyOkTAuKE4ww@a3w2lK%%NBJzY>UwC#`oIrkgc6Bf{b~XV1_4PITj0ta4Ix5 zG=bQSF`N+jYu$hh|By%^`CH$12J$j5V#}^@xp6qkHFp*v?|#_3BJi8z4j&Y7>5N(z z$LAc6gHBWqPG76hJv;{?N02RRyTZj~6k`A8wOuKFMZ!g3YcB9S{5s&A`VFd4cOXqM z8hee@!He6~RuQzHArOeVn&)k=)OS0EhNF(JJWE(uvQh}HBN3l>XEK%C< ztUKqFx3sTk;UF(&Mv}c)np2>M6+Qa;UM>Twrj~tI@#r@dyutNA( znY_k?mXFu~H<&W~456fJNN05zGof4w*O*XE3ENCMOs+7w#$*$TmB%`I zn0%edH<)}AiAdi&XSLh#fIXgt-y+DjnfwmnhLK$4_e_X5z({-VJAT67Bjk4oN&N!= zV4Th)VQn^=8@=A>)6$f{Ov2x1)jweJ$An=|B+2kk_{43~<8I-1@f3cKH?< z9K?s%#`ccwnYe3WdTiv5@gi8cy?QoQWZqp992y(J(~!TEX5Vdn@)rsR-wozRhsH+x zEh5&v7!327@v!_SSoci;_vCxG@A^-w=X<}Q=J43Qem~n=!t+3{IMCZQcIy`C;jvrC z_PBoM+wpk1u~myd-@9E?hnwNC1M02V edrPVr7|oWak+H4Vz|$_A)% None + super(CommandContextMixIn, self).__init__() + self._in_main_context = False + self._main_context = ExitStack() + + @contextmanager + def main_context(self): + # type: () -> Iterator[None] + assert not self._in_main_context + + self._in_main_context = True + try: + with self._main_context: + yield + finally: + self._in_main_context = False + + def enter_context(self, context_provider): + # type: (ContextManager[_T]) -> _T + assert self._in_main_context + + return self._main_context.enter_context(context_provider) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cli/command_context 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cli/command_context 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1113530f442c6a7cf333e4ed72608a2eac926eff GIT binary patch literal 1851 zcmd5+&2G~`5T3R3=QJgOf)EG^jzOYvOOdz$qJ#hyYE(9DX??(Q?M-m-AKp!9DlSm& zyb@QQhX;U}b<*|?sFNM<%kdfm4!-|P3c`mft2g{h&~QX=23*BnRJ?0=qm$Vf4@ydpbG;`GLdtt zSr_iQVG=6W)xK9=B!z0B53O$Op_t>#HQ>wSxo9rHEm2qz4cqtzEhJ_Lc9w@zPYD}w zvWICDh+NvE%nm+}M<uX2r8?)I|jg?Z5H@nubpdUJL?H-bGO$D4TNtNkuv$4;hhpK|BIL zqr;mtBN!A3L5*B=u1&!;CYpV7(z#ilPD7;4B>;-k4RQ~Mq=LX`8f{|O{0t>tEbt5w z`CKaXu0N7u$82|tP literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cli/command_context.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cli/command_context.py new file mode 100644 index 0000000..d1a64a7 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cli/command_context.py @@ -0,0 +1,36 @@ +from contextlib import contextmanager + +from pip._vendor.contextlib2 import ExitStack + +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Iterator, ContextManager, TypeVar + + _T = TypeVar('_T', covariant=True) + + +class CommandContextMixIn(object): + def __init__(self): + # type: () -> None + super(CommandContextMixIn, self).__init__() + self._in_main_context = False + self._main_context = ExitStack() + + @contextmanager + def main_context(self): + # type: () -> Iterator[None] + assert not self._in_main_context + + self._in_main_context = True + try: + with self._main_context: + yield + finally: + self._in_main_context = False + + def enter_context(self, context_provider): + # type: (ContextManager[_T]) -> _T + assert self._in_main_context + + return self._main_context.enter_context(context_provider) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cli/command_context.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cli/command_context.pyc new file mode 100644 index 0000000000000000000000000000000000000000..177104482669d0003d59b0ca0eefe05525295d58 GIT binary patch literal 1851 zcmd5++iuf95S_JiZ%P6MArKNg8i~feAo>CbhzeAw5o|(f{eb1#o8aIZ-c3jH)Xi|{W#7Q>mkg2GP|C1xu25^p5(!d^%F?krS&<@uir z(={~hAH6+tyRUb~{UWBSqJJ>Y#DSM91Ly8Q z(HH!5>gA!AD7A)KH;pleV7WD%?ImX@(xw+Ur*yExC1-K;&E25!=Z_q+whG1uTIQ5jU5hr_? zMuEtsJ<9Ch%XoD1aJac~ytzG}Pt{l{wX^;8(*{1H#2(mLn5~D2R9+OVZ|ywlIh;&- zU|!g%#EWb{3T?jteVJq@n{%QF@j_NmfU(Bv>PB+Ls9FhtGqh(mcu*Dflyjb8FBJ#Oz zoCcE!Rn0|CtNB$D6ydy*|9nnrm<+W+pOXr!S6a=UMWob4EE*7n$2xy?6CHR2JML5@ zL7I2Y{aeM&aC^C6c|JQ66-Kh7=2@7GIJH-4yb9e!ooi<3!$UU?*KQK&@mTmuUs0C@ ZF5TwGMPr}RRj7|h+n`^C-7#*M{{R~(uv`ED literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cli/main 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cli/main 2.py new file mode 100644 index 0000000..5e97a51 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cli/main 2.py @@ -0,0 +1,75 @@ +"""Primary application entrypoint. +""" +from __future__ import absolute_import + +import locale +import logging +import os +import sys + +from pip._internal.cli.autocompletion import autocomplete +from pip._internal.cli.main_parser import parse_command +from pip._internal.commands import create_command +from pip._internal.exceptions import PipError +from pip._internal.utils import deprecation +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import List, Optional + +logger = logging.getLogger(__name__) + + +# Do not import and use main() directly! Using it directly is actively +# discouraged by pip's maintainers. The name, location and behavior of +# this function is subject to change, so calling it directly is not +# portable across different pip versions. + +# In addition, running pip in-process is unsupported and unsafe. This is +# elaborated in detail at +# https://pip.pypa.io/en/stable/user_guide/#using-pip-from-your-program. +# That document also provides suggestions that should work for nearly +# all users that are considering importing and using main() directly. + +# However, we know that certain users will still want to invoke pip +# in-process. If you understand and accept the implications of using pip +# in an unsupported manner, the best approach is to use runpy to avoid +# depending on the exact location of this entry point. + +# The following example shows how to use runpy to invoke pip in that +# case: +# +# sys.argv = ["pip", your, args, here] +# runpy.run_module("pip", run_name="__main__") +# +# Note that this will exit the process after running, unlike a direct +# call to main. As it is not safe to do any processing after calling +# main, this should not be an issue in practice. + +def main(args=None): + # type: (Optional[List[str]]) -> int + if args is None: + args = sys.argv[1:] + + # Configure our deprecation warnings to be sent through loggers + deprecation.install_warning_logger() + + autocomplete() + + try: + cmd_name, cmd_args = parse_command(args) + except PipError as exc: + sys.stderr.write("ERROR: %s" % exc) + sys.stderr.write(os.linesep) + sys.exit(1) + + # Needed for locale.getpreferredencoding(False) to work + # in pip._internal.utils.encoding.auto_decode + try: + locale.setlocale(locale.LC_ALL, '') + except locale.Error as e: + # setlocale can apparently crash if locale are uninitialized + logger.debug("Ignoring error %s when setting locale", e) + command = create_command(cmd_name, isolated=("--isolated" in cmd_args)) + + return command.main(cmd_args) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cli/main 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cli/main 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..715b81530c1b814553248ed7eba803ec06850e4b GIT binary patch literal 1814 zcmcgsTW=dh6#iy?iR0WH$GK1__@$L!VmB%h5(1PeM5Q9Q(Uz)og}T~!C+<447iPvu zjgqJE$dBTM2PA$5zX1LK=gh_}r95M6&(8Vg%(;HEmA_V+zy0$0ixF;q9=-SX0rLkf zVjv(X5PMJpsfWOWV7&rWK~Qmfw5}qk&et^rwfVY^pzhXHs0E}A1dZ~14Qdf-6G5}o z>rhKbmk}(N`U2Dn(p3bjrQU#AL)t>nD)mLEb);m-fztQ!@DN=A`Q@~kT}t7k=?WVYW- z$Ob(@!mg2sPE4+*R)$Gh#5vhr>t1hdmylt&%uOjJ53R zalyqzYQ)Lc>8a6kuupaWNsCK2=(7g&2e1MYk9+yi6+q3i6-=tQ286A-*K7;6&PS-5 z-+QN;*wG%D?V>Ga7p|m22z$D&g$e@T-9({ z!=%Fq1$xq3pt6Svcf%}_IQ0F;{-@nL#*zYahs2|Cmg^)NcO?&jwz?NDW!5#)T1Hhq zifFvt+=OUA6O2uhl-=FA+S?@6jbWH)lKM!FXT|}M9-sR>0=q>b$&8JZ3NIp^k?T<9 zrvY|l$7do-h@^)^h@qkJ)X=LI2%U6kY2X3h^7K#zstt28Kda!!pKoJV?ank%Z!493ME{$Voy@#E9IdnbGMXR~uVvDSWa|KjC6 z`i--}w}T=nc5j-t`{2t%bNrMc_k?s&r6#5iMk*O_+WlhY-=b)H9JWgW-m+*_n%;s} z5nEzSbi{^OuU5piXnP&8 int + if args is None: + args = sys.argv[1:] + + # Configure our deprecation warnings to be sent through loggers + deprecation.install_warning_logger() + + autocomplete() + + try: + cmd_name, cmd_args = parse_command(args) + except PipError as exc: + sys.stderr.write("ERROR: %s" % exc) + sys.stderr.write(os.linesep) + sys.exit(1) + + # Needed for locale.getpreferredencoding(False) to work + # in pip._internal.utils.encoding.auto_decode + try: + locale.setlocale(locale.LC_ALL, '') + except locale.Error as e: + # setlocale can apparently crash if locale are uninitialized + logger.debug("Ignoring error %s when setting locale", e) + command = create_command(cmd_name, isolated=("--isolated" in cmd_args)) + + return command.main(cmd_args) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cli/main.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cli/main.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ffc3e9cfb02fba573d7b444dc0cfa0619270dc48 GIT binary patch literal 1814 zcmcgsTW=dh6#iy?iR0WH$GK1_^-GaoVmA~~2>}XYXKd}+Ip3T)*KfA+*Glv9*Ux?!;r8dzdw(A=f6yWZ z0+Ir;2PKet2s{YZD^L{#6}Lz0DuU{KT|-ctuj>fvZe4|1K-xgiD9_iR7Lhg)G)uh> zwS;sT!E&iDK&>EMMX*}x4X8DwEd;GnUxZpm+D6cZkZtJST$Co%2GS0K4$@5on-Ccw ztC(y-ZsSHE*x}UUCHze5JG_3@Tc$!ym&CD7(n!y`QBkO56xk%tx-zqRR^&-$`^|)G z&=Vx=8j0w{A3sq5ti0_+39r*qVFIwqWaggu3~? zhiidr56`p5sM-abHKBijxUP^nIci|C$ke&2V2jLOW44LO5_@paGRI>j6Zmen4ZDKL zs*`Ixp&O#y^Xvl(KzPf=_?==@>F_!xZNybvQHo^6=j{frh@Zqj%F@GGoji-{8m?-X zbQqyP&w2|~_AudYm_-tYzW>z!qj_u{3@x<*>dsLDqX zjhCC75DjR8v1yXByE|8Vo20ri4D(D*CGqokhGc^gwUGzj2ACstbC&J8slP)R0@ES!INnOJw=HcKv%62H~h)6qfr z#nF-Tl%aiHY=bW9xG)l4_pPQ#|T;-!Q4znmN+rSDHW?ZH6azq56yXSJ7 zbDIG4SQx%agF+|g)VRTUqz9+DqT0-0TnyqLC*z+!I^BD4viEQ{JGT>S?W2bmFCWlv zoDIGi6iKmr+qB&eAALLwe1_Z;(nXb;m_8V(WWZ_nidzWln+F=;yqc9}00%3SMwNov_&}SchXKuvPqN(}ojPm8T zT@sW}|5Yx1%BBC0ZvtIKH(h)8KP@@y(0welo4+H;zZ{ky5mQcR=PftXexd@!F(r96 z-m;k5M46I<+?_YwyUo6x6K#mT5JX_Q>(o5h8SSpdN8bK7X@Z@7>H_ ni~o1}F0oJ3Jf14~IbRs_K8d<$5f9woYl&BXuP)y4*6#idB4d`C literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cli/main_parser 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cli/main_parser 2.py new file mode 100644 index 0000000..a89821d --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cli/main_parser 2.py @@ -0,0 +1,99 @@ +"""A single place for constructing and exposing the main parser +""" + +import os +import sys + +from pip._internal.cli import cmdoptions +from pip._internal.cli.parser import ( + ConfigOptionParser, + UpdatingDefaultsHelpFormatter, +) +from pip._internal.commands import commands_dict, get_similar_commands +from pip._internal.exceptions import CommandError +from pip._internal.utils.misc import get_pip_version, get_prog +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Tuple, List + + +__all__ = ["create_main_parser", "parse_command"] + + +def create_main_parser(): + # type: () -> ConfigOptionParser + """Creates and returns the main parser for pip's CLI + """ + + parser_kw = { + 'usage': '\n%prog [options]', + 'add_help_option': False, + 'formatter': UpdatingDefaultsHelpFormatter(), + 'name': 'global', + 'prog': get_prog(), + } + + parser = ConfigOptionParser(**parser_kw) + parser.disable_interspersed_args() + + parser.version = get_pip_version() + + # add the general options + gen_opts = cmdoptions.make_option_group(cmdoptions.general_group, parser) + parser.add_option_group(gen_opts) + + # so the help formatter knows + parser.main = True # type: ignore + + # create command listing for description + description = [''] + [ + '%-27s %s' % (name, command_info.summary) + for name, command_info in commands_dict.items() + ] + parser.description = '\n'.join(description) + + return parser + + +def parse_command(args): + # type: (List[str]) -> Tuple[str, List[str]] + parser = create_main_parser() + + # Note: parser calls disable_interspersed_args(), so the result of this + # call is to split the initial args into the general options before the + # subcommand and everything else. + # For example: + # args: ['--timeout=5', 'install', '--user', 'INITools'] + # general_options: ['--timeout==5'] + # args_else: ['install', '--user', 'INITools'] + general_options, args_else = parser.parse_args(args) + + # --version + if general_options.version: + sys.stdout.write(parser.version) # type: ignore + sys.stdout.write(os.linesep) + sys.exit() + + # pip || pip help -> print_help() + if not args_else or (args_else[0] == 'help' and len(args_else) == 1): + parser.print_help() + sys.exit() + + # the subcommand name + cmd_name = args_else[0] + + if cmd_name not in commands_dict: + guess = get_similar_commands(cmd_name) + + msg = ['unknown command "%s"' % cmd_name] + if guess: + msg.append('maybe you meant "%s"' % guess) + + raise CommandError(' - '.join(msg)) + + # all the args without the subcommand + cmd_args = args[:] + cmd_args.remove(cmd_name) + + return cmd_name, cmd_args diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cli/main_parser 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cli/main_parser 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a50b480d05e3d9daf5f37855fd638721922b3f9f GIT binary patch literal 2750 zcmc&$&2rR65N=89UGI9=KVS?_RX`!-WI5OiA!QB$DwKghg*cRe1Dk+KUX6v;`a?5o zvnl%$a!uu)m&hyRn#w89kVnWdhve&)Ob9#xvS&2YGt<*Q-`85_uU_Z3U#~qKQT^C> ze~zaAKo=4X(OVSSlvp&xpc>mWv}Np2;!xV4VS_AQYfv&nX_JOcN?SB+Rni$sW+`pc zuuW-)hMh{%rQ@TLIg-SY0$s(moG+ZJ}Em8T4+}oz)1f?fw zc#_g(8ZMKS!O#wca}>e2QxtaT2Ux#CVNV99*@p-Hd3Nm@x*M*JvnWw+kpv^A4YJTxFN&OZx#pR2(;&{=A}F;gJMlkww)+$GalX&-Gbhk( z<=Ji=eJ$eqa?HFB@uMOP_=1~iH<%=;tt{xuZL z9&K;m-TtDoV+LyvCq<%61EYJfHsaW*RDn@G$HTAUVc23B9$O}GYC_6w3r+uyE}p6J zvuThlhc=BxFEMJ+W{9OG1hxoTw0VRuI&?_%BhisXhZc<+yk?mheqru6$+T!ZD}9?K zFKs%qWow5Hp~=GTIoaB!aF!yAB53W=c%D_^jxE6^B@ag^jcK_ZFDg0#vQ zD@UMVC+B@_{gW%&UDKLT+v#)S<(At)qLs(6^;+Bss8=xxV;$@y%8xT3Qx|9|^n)_e z9$$#i6V|=*2Uuq#E>|r^n3}UX@&lbFV-GgYnVB8@Zsie z?wy06k5+ZMz-UmE@jd`Q*bmCVZk~h)#2_jL;q!6y-KV>kF78~qJe}^Fu`%Y#<%4Gz z@kH6+;Q$F=k5N&ABw4?4^OnBm}WsT7$x!GH70EoQ;(fGgQm};qZ!9);je?% zbGlZ??mDM1YCBEKu`b#t>=7r7UE_dlq3Kmfkas}5CJum$sU>I^z=IrPo5~?m473{0 z2x)4@9E%XTajPN`M6*IZ6j{)ut6%a9^?nsabq|_;CSVdGToO99gelvRQ+&(o=lLKw z2eu)Ddo3#e=2T#cKF zo#qoaRY7K|1&+A8?)Di=k~aAmRE1E8vVsLT59L!WNYp0GCq`g>Py*PfcSL!G?j+8X zR)tulUc^QYCMv6xmVmp|03n9Qd=ZU7QK&5Rm?+-aV_~V%d|&k$6{1dz`G9BDSD~U~ zU2LS9@D5+06390K-!osz2&;`IN^3DD)zPbEKJc!Y!u0(NO@D-r>~{N<)3#3HujgC< zV|otQVs-7F)wGuFGY%MJ_nBEzOng7gN51b}fWTt~Qoz8_jaTg406VMN#;4v|+NkP^ zR7@$LhV%W#w)#8%TGrmyrCyAXcmDYxc{FeDn3y=x8)>XZQhcRS8~%j+|F&wInHKng z;Ys$TB35&*iyr@4soh6ig8N);JPzc4$&}GMseOX3t7#ri5_O%aA)m>nWO312X{=c2 Otwp ConfigOptionParser + """Creates and returns the main parser for pip's CLI + """ + + parser_kw = { + 'usage': '\n%prog [options]', + 'add_help_option': False, + 'formatter': UpdatingDefaultsHelpFormatter(), + 'name': 'global', + 'prog': get_prog(), + } + + parser = ConfigOptionParser(**parser_kw) + parser.disable_interspersed_args() + + parser.version = get_pip_version() + + # add the general options + gen_opts = cmdoptions.make_option_group(cmdoptions.general_group, parser) + parser.add_option_group(gen_opts) + + # so the help formatter knows + parser.main = True # type: ignore + + # create command listing for description + description = [''] + [ + '%-27s %s' % (name, command_info.summary) + for name, command_info in commands_dict.items() + ] + parser.description = '\n'.join(description) + + return parser + + +def parse_command(args): + # type: (List[str]) -> Tuple[str, List[str]] + parser = create_main_parser() + + # Note: parser calls disable_interspersed_args(), so the result of this + # call is to split the initial args into the general options before the + # subcommand and everything else. + # For example: + # args: ['--timeout=5', 'install', '--user', 'INITools'] + # general_options: ['--timeout==5'] + # args_else: ['install', '--user', 'INITools'] + general_options, args_else = parser.parse_args(args) + + # --version + if general_options.version: + sys.stdout.write(parser.version) # type: ignore + sys.stdout.write(os.linesep) + sys.exit() + + # pip || pip help -> print_help() + if not args_else or (args_else[0] == 'help' and len(args_else) == 1): + parser.print_help() + sys.exit() + + # the subcommand name + cmd_name = args_else[0] + + if cmd_name not in commands_dict: + guess = get_similar_commands(cmd_name) + + msg = ['unknown command "%s"' % cmd_name] + if guess: + msg.append('maybe you meant "%s"' % guess) + + raise CommandError(' - '.join(msg)) + + # all the args without the subcommand + cmd_args = args[:] + cmd_args.remove(cmd_name) + + return cmd_name, cmd_args diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cli/main_parser.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cli/main_parser.pyc new file mode 100644 index 0000000000000000000000000000000000000000..523e0f74baf5239112c28a5a4c044e30b242882c GIT binary patch literal 2750 zcmc&$&2rR65N=89UGI9=*kBA!RX`!-WI5o4kTQn=m6U-%g*cRe14=+8uf{@a{h^ul zPs+Z8TvNH{CGre8=ags2BjlJv@^wol1Rem{Gn(m{>FJ;EYpwIwptt|qjb~$O9vkn^ z(exkaA|fBXMUhRZMLq`g*e2hWu|ugtS&RG@S-jSwbcV7v`EANN(4Rl|)I?3Zyxn&xTmAhS3?zqUc zsitFt1vktiSM8St?{dv^W2<7ZBy+bHtw zB>qOk59FA6AL7Sl6!HbP)OI*cjlQeW@=j4@p)snePY+mQk!3JJ2T?LMW(ks5nLsC5 zl7>}qyjok(m)m6j?W!soEhm~YWl{#as?xB|%pS|CBCgM}rC&dJ@Fdu{dwb)nzw+%G?JGx}1!Oyxu zvK(4B7QMu%Me7lk+7Q?x=+OER!syT;(N9E279CnNY4Mt6X8479&?eKN$*lBUmb|p- z$d;`=I)o+*yXRzUpQ2fcEsCLaK$Ce^aqH=M`VJ=?I%-h_1-Pz7lM}RU)ABQ$Ui?gF zj$l@gCJS_kTg8fCkrh51&aqSL?45)|3t%c`rd6)r#EYN{dH7hn8~5+^Ts->!u4C5L<)BaE#-$*a}lgR32t^##lK5 z4LdpStCv2xrrlMo8MVD3Cthy36Q){u3|p_moq&1;qbSkgR;q#|2QqburlKIMV(syT z2t84QD-T05i|Dd&M>R$UaaBx9fkv!yRfTCIS-?JasP?51GQu8J)7o%`mglfe4nty8 zrsX<41<0!d@p4kYE>1$E^teidWCGq!Cwz;;PkDY z-FHr7)OFgHV_mjS+G9=_yT$?AK+`LbAn$;9LmU7XQ%le;fCo7yHdQ`T478fe2x%I| z9E%XTNv9?eM6*IZ6j{)uuV3;D^?n6KbqAV$Az%_BToO5rgelvTQ+&(o=lLKw2eu)D zI~}V2=2T#c zOoh3r7dYbXC3nbJlC;Ukpe}?$lw~Zyc_=^7f<$eiVrm4|dli6d&ta^ViE*VF%AOnA_N{QkOBsVuDxRC8rWIaHa_*%(pp_tq+&_| zHJtA^wl&}J*RuAuF10^K-udT)', ', ') + + def _format_option_strings(self, option, mvarfmt=' <%s>', optsep=', '): + """ + Return a comma-separated list of option strings and metavars. + + :param option: tuple of (short opt, long opt), e.g: ('-f', '--format') + :param mvarfmt: metavar format string - evaluated as mvarfmt % metavar + :param optsep: separator + """ + opts = [] + + if option._short_opts: + opts.append(option._short_opts[0]) + if option._long_opts: + opts.append(option._long_opts[0]) + if len(opts) > 1: + opts.insert(1, optsep) + + if option.takes_value(): + metavar = option.metavar or option.dest.lower() + opts.append(mvarfmt % metavar.lower()) + + return ''.join(opts) + + def format_heading(self, heading): + if heading == 'Options': + return '' + return heading + ':\n' + + def format_usage(self, usage): + """ + Ensure there is only one newline between usage and the first heading + if there is no description. + """ + msg = '\nUsage: %s\n' % self.indent_lines(textwrap.dedent(usage), " ") + return msg + + def format_description(self, description): + # leave full control over description to us + if description: + if hasattr(self.parser, 'main'): + label = 'Commands' + else: + label = 'Description' + # some doc strings have initial newlines, some don't + description = description.lstrip('\n') + # some doc strings have final newlines and spaces, some don't + description = description.rstrip() + # dedent, then reindent + description = self.indent_lines(textwrap.dedent(description), " ") + description = '%s:\n%s\n' % (label, description) + return description + else: + return '' + + def format_epilog(self, epilog): + # leave full control over epilog to us + if epilog: + return epilog + else: + return '' + + def indent_lines(self, text, indent): + new_lines = [indent + line for line in text.split('\n')] + return "\n".join(new_lines) + + +class UpdatingDefaultsHelpFormatter(PrettyHelpFormatter): + """Custom help formatter for use in ConfigOptionParser. + + This is updates the defaults before expanding them, allowing + them to show up correctly in the help listing. + """ + + def expand_default(self, option): + if self.parser is not None: + self.parser._update_defaults(self.parser.defaults) + return optparse.IndentedHelpFormatter.expand_default(self, option) + + +class CustomOptionParser(optparse.OptionParser): + + def insert_option_group(self, idx, *args, **kwargs): + """Insert an OptionGroup at a given position.""" + group = self.add_option_group(*args, **kwargs) + + self.option_groups.pop() + self.option_groups.insert(idx, group) + + return group + + @property + def option_list_all(self): + """Get a list of all options, including those in option groups.""" + res = self.option_list[:] + for i in self.option_groups: + res.extend(i.option_list) + + return res + + +class ConfigOptionParser(CustomOptionParser): + """Custom option parser which updates its defaults by checking the + configuration files and environmental variables""" + + def __init__(self, *args, **kwargs): + self.name = kwargs.pop('name') + + isolated = kwargs.pop("isolated", False) + self.config = Configuration(isolated) + + assert self.name + optparse.OptionParser.__init__(self, *args, **kwargs) + + def check_default(self, option, key, val): + try: + return option.check_value(key, val) + except optparse.OptionValueError as exc: + print("An error occurred during configuration: %s" % exc) + sys.exit(3) + + def _get_ordered_configuration_items(self): + # Configuration gives keys in an unordered manner. Order them. + override_order = ["global", self.name, ":env:"] + + # Pool the options into different groups + section_items = {name: [] for name in override_order} + for section_key, val in self.config.items(): + # ignore empty values + if not val: + logger.debug( + "Ignoring configuration key '%s' as it's value is empty.", + section_key + ) + continue + + section, key = section_key.split(".", 1) + if section in override_order: + section_items[section].append((key, val)) + + # Yield each group in their override order + for section in override_order: + for key, val in section_items[section]: + yield key, val + + def _update_defaults(self, defaults): + """Updates the given defaults with values from the config files and + the environ. Does a little special handling for certain types of + options (lists).""" + + # Accumulate complex default state. + self.values = optparse.Values(self.defaults) + late_eval = set() + # Then set the options with those values + for key, val in self._get_ordered_configuration_items(): + # '--' because configuration supports only long names + option = self.get_option('--' + key) + + # Ignore options not present in this parser. E.g. non-globals put + # in [global] by users that want them to apply to all applicable + # commands. + if option is None: + continue + + if option.action in ('store_true', 'store_false', 'count'): + try: + val = strtobool(val) + except ValueError: + error_msg = invalid_config_error_message( + option.action, key, val + ) + self.error(error_msg) + + elif option.action == 'append': + val = val.split() + val = [self.check_default(option, key, v) for v in val] + elif option.action == 'callback': + late_eval.add(option.dest) + opt_str = option.get_opt_string() + val = option.convert_value(opt_str, val) + # From take_action + args = option.callback_args or () + kwargs = option.callback_kwargs or {} + option.callback(option, opt_str, val, self, *args, **kwargs) + else: + val = self.check_default(option, key, val) + + defaults[option.dest] = val + + for key in late_eval: + defaults[key] = getattr(self.values, key) + self.values = None + return defaults + + def get_default_values(self): + """Overriding to make updating the defaults after instantiation of + the option parser possible, _update_defaults() does the dirty work.""" + if not self.process_default_values: + # Old, pre-Optik 1.5 behaviour. + return optparse.Values(self.defaults) + + # Load the configuration, or error out in case of an error + try: + self.config.load() + except ConfigurationError as err: + self.exit(UNKNOWN_ERROR, str(err)) + + defaults = self._update_defaults(self.defaults.copy()) # ours + for option in self._get_all_options(): + default = defaults.get(option.dest) + if isinstance(default, string_types): + opt_str = option.get_opt_string() + defaults[option.dest] = option.check_value(opt_str, default) + return optparse.Values(defaults) + + def error(self, msg): + self.print_usage(sys.stderr) + self.exit(UNKNOWN_ERROR, "%s\n" % msg) + + +def invalid_config_error_message(action, key, val): + """Returns a better error message when invalid configuration option + is provided.""" + if action in ('store_true', 'store_false'): + return ("{0} is not a valid value for {1} option, " + "please specify a boolean value like yes/no, " + "true/false or 1/0 instead.").format(val, key) + + return ("{0} is not a valid value for {1} option, " + "please specify a numerical value like 1/0 " + "instead.").format(val, key) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cli/parser 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cli/parser 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..256050fcfdfbe1240f88bb73b47e00c6f0cbcdf9 GIT binary patch literal 11512 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 literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cli/parser.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cli/parser.py new file mode 100644 index 0000000..c99456b --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cli/parser.py @@ -0,0 +1,265 @@ +"""Base option parser setup""" + +# The following comment should be removed at some point in the future. +# mypy: disallow-untyped-defs=False + +from __future__ import absolute_import + +import logging +import optparse +import sys +import textwrap +from distutils.util import strtobool + +from pip._vendor.six import string_types + +from pip._internal.cli.status_codes import UNKNOWN_ERROR +from pip._internal.configuration import Configuration, ConfigurationError +from pip._internal.utils.compat import get_terminal_size + +logger = logging.getLogger(__name__) + + +class PrettyHelpFormatter(optparse.IndentedHelpFormatter): + """A prettier/less verbose help formatter for optparse.""" + + def __init__(self, *args, **kwargs): + # help position must be aligned with __init__.parseopts.description + kwargs['max_help_position'] = 30 + kwargs['indent_increment'] = 1 + kwargs['width'] = get_terminal_size()[0] - 2 + optparse.IndentedHelpFormatter.__init__(self, *args, **kwargs) + + def format_option_strings(self, option): + return self._format_option_strings(option, ' <%s>', ', ') + + def _format_option_strings(self, option, mvarfmt=' <%s>', optsep=', '): + """ + Return a comma-separated list of option strings and metavars. + + :param option: tuple of (short opt, long opt), e.g: ('-f', '--format') + :param mvarfmt: metavar format string - evaluated as mvarfmt % metavar + :param optsep: separator + """ + opts = [] + + if option._short_opts: + opts.append(option._short_opts[0]) + if option._long_opts: + opts.append(option._long_opts[0]) + if len(opts) > 1: + opts.insert(1, optsep) + + if option.takes_value(): + metavar = option.metavar or option.dest.lower() + opts.append(mvarfmt % metavar.lower()) + + return ''.join(opts) + + def format_heading(self, heading): + if heading == 'Options': + return '' + return heading + ':\n' + + def format_usage(self, usage): + """ + Ensure there is only one newline between usage and the first heading + if there is no description. + """ + msg = '\nUsage: %s\n' % self.indent_lines(textwrap.dedent(usage), " ") + return msg + + def format_description(self, description): + # leave full control over description to us + if description: + if hasattr(self.parser, 'main'): + label = 'Commands' + else: + label = 'Description' + # some doc strings have initial newlines, some don't + description = description.lstrip('\n') + # some doc strings have final newlines and spaces, some don't + description = description.rstrip() + # dedent, then reindent + description = self.indent_lines(textwrap.dedent(description), " ") + description = '%s:\n%s\n' % (label, description) + return description + else: + return '' + + def format_epilog(self, epilog): + # leave full control over epilog to us + if epilog: + return epilog + else: + return '' + + def indent_lines(self, text, indent): + new_lines = [indent + line for line in text.split('\n')] + return "\n".join(new_lines) + + +class UpdatingDefaultsHelpFormatter(PrettyHelpFormatter): + """Custom help formatter for use in ConfigOptionParser. + + This is updates the defaults before expanding them, allowing + them to show up correctly in the help listing. + """ + + def expand_default(self, option): + if self.parser is not None: + self.parser._update_defaults(self.parser.defaults) + return optparse.IndentedHelpFormatter.expand_default(self, option) + + +class CustomOptionParser(optparse.OptionParser): + + def insert_option_group(self, idx, *args, **kwargs): + """Insert an OptionGroup at a given position.""" + group = self.add_option_group(*args, **kwargs) + + self.option_groups.pop() + self.option_groups.insert(idx, group) + + return group + + @property + def option_list_all(self): + """Get a list of all options, including those in option groups.""" + res = self.option_list[:] + for i in self.option_groups: + res.extend(i.option_list) + + return res + + +class ConfigOptionParser(CustomOptionParser): + """Custom option parser which updates its defaults by checking the + configuration files and environmental variables""" + + def __init__(self, *args, **kwargs): + self.name = kwargs.pop('name') + + isolated = kwargs.pop("isolated", False) + self.config = Configuration(isolated) + + assert self.name + optparse.OptionParser.__init__(self, *args, **kwargs) + + def check_default(self, option, key, val): + try: + return option.check_value(key, val) + except optparse.OptionValueError as exc: + print("An error occurred during configuration: %s" % exc) + sys.exit(3) + + def _get_ordered_configuration_items(self): + # Configuration gives keys in an unordered manner. Order them. + override_order = ["global", self.name, ":env:"] + + # Pool the options into different groups + section_items = {name: [] for name in override_order} + for section_key, val in self.config.items(): + # ignore empty values + if not val: + logger.debug( + "Ignoring configuration key '%s' as it's value is empty.", + section_key + ) + continue + + section, key = section_key.split(".", 1) + if section in override_order: + section_items[section].append((key, val)) + + # Yield each group in their override order + for section in override_order: + for key, val in section_items[section]: + yield key, val + + def _update_defaults(self, defaults): + """Updates the given defaults with values from the config files and + the environ. Does a little special handling for certain types of + options (lists).""" + + # Accumulate complex default state. + self.values = optparse.Values(self.defaults) + late_eval = set() + # Then set the options with those values + for key, val in self._get_ordered_configuration_items(): + # '--' because configuration supports only long names + option = self.get_option('--' + key) + + # Ignore options not present in this parser. E.g. non-globals put + # in [global] by users that want them to apply to all applicable + # commands. + if option is None: + continue + + if option.action in ('store_true', 'store_false', 'count'): + try: + val = strtobool(val) + except ValueError: + error_msg = invalid_config_error_message( + option.action, key, val + ) + self.error(error_msg) + + elif option.action == 'append': + val = val.split() + val = [self.check_default(option, key, v) for v in val] + elif option.action == 'callback': + late_eval.add(option.dest) + opt_str = option.get_opt_string() + val = option.convert_value(opt_str, val) + # From take_action + args = option.callback_args or () + kwargs = option.callback_kwargs or {} + option.callback(option, opt_str, val, self, *args, **kwargs) + else: + val = self.check_default(option, key, val) + + defaults[option.dest] = val + + for key in late_eval: + defaults[key] = getattr(self.values, key) + self.values = None + return defaults + + def get_default_values(self): + """Overriding to make updating the defaults after instantiation of + the option parser possible, _update_defaults() does the dirty work.""" + if not self.process_default_values: + # Old, pre-Optik 1.5 behaviour. + return optparse.Values(self.defaults) + + # Load the configuration, or error out in case of an error + try: + self.config.load() + except ConfigurationError as err: + self.exit(UNKNOWN_ERROR, str(err)) + + defaults = self._update_defaults(self.defaults.copy()) # ours + for option in self._get_all_options(): + default = defaults.get(option.dest) + if isinstance(default, string_types): + opt_str = option.get_opt_string() + defaults[option.dest] = option.check_value(opt_str, default) + return optparse.Values(defaults) + + def error(self, msg): + self.print_usage(sys.stderr) + self.exit(UNKNOWN_ERROR, "%s\n" % msg) + + +def invalid_config_error_message(action, key, val): + """Returns a better error message when invalid configuration option + is provided.""" + if action in ('store_true', 'store_false'): + return ("{0} is not a valid value for {1} option, " + "please specify a boolean value like yes/no, " + "true/false or 1/0 instead.").format(val, key) + + return ("{0} is not a valid value for {1} option, " + "please specify a numerical value like 1/0 " + "instead.").format(val, key) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cli/parser.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cli/parser.pyc new file mode 100644 index 0000000000000000000000000000000000000000..da1527e1d850ae5babdebc7c9f67d1d4f0b94aca GIT binary patch literal 11512 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 MCyO&n*B8(J7ieL*G5`Po literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cli/req_command 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cli/req_command 2.py new file mode 100644 index 0000000..9383b3b --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cli/req_command 2.py @@ -0,0 +1,333 @@ +"""Contains the Command base classes that depend on PipSession. + +The classes in this module are in a separate module so the commands not +needing download / PackageFinder capability don't unnecessarily import the +PackageFinder machinery and all its vendored dependencies, etc. +""" + +import logging +import os +from functools import partial + +from pip._internal.cli.base_command import Command +from pip._internal.cli.command_context import CommandContextMixIn +from pip._internal.exceptions import CommandError +from pip._internal.index.package_finder import PackageFinder +from pip._internal.legacy_resolve import Resolver +from pip._internal.models.selection_prefs import SelectionPreferences +from pip._internal.network.download import Downloader +from pip._internal.network.session import PipSession +from pip._internal.operations.prepare import RequirementPreparer +from pip._internal.req.constructors import ( + install_req_from_editable, + install_req_from_line, + install_req_from_req_string, +) +from pip._internal.req.req_file import parse_requirements +from pip._internal.self_outdated_check import ( + make_link_collector, + pip_self_version_check, +) +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from optparse import Values + from typing import List, Optional, Tuple + from pip._internal.cache import WheelCache + from pip._internal.models.target_python import TargetPython + from pip._internal.req.req_set import RequirementSet + from pip._internal.req.req_tracker import RequirementTracker + from pip._internal.utils.temp_dir import TempDirectory + +logger = logging.getLogger(__name__) + + +class SessionCommandMixin(CommandContextMixIn): + + """ + A class mixin for command classes needing _build_session(). + """ + def __init__(self): + # type: () -> None + super(SessionCommandMixin, self).__init__() + self._session = None # Optional[PipSession] + + @classmethod + def _get_index_urls(cls, options): + # type: (Values) -> Optional[List[str]] + """Return a list of index urls from user-provided options.""" + index_urls = [] + if not getattr(options, "no_index", False): + url = getattr(options, "index_url", None) + if url: + index_urls.append(url) + urls = getattr(options, "extra_index_urls", None) + if urls: + index_urls.extend(urls) + # Return None rather than an empty list + return index_urls or None + + def get_default_session(self, options): + # type: (Values) -> PipSession + """Get a default-managed session.""" + if self._session is None: + self._session = self.enter_context(self._build_session(options)) + # there's no type annotation on requests.Session, so it's + # automatically ContextManager[Any] and self._session becomes Any, + # then https://github.com/python/mypy/issues/7696 kicks in + assert self._session is not None + return self._session + + def _build_session(self, options, retries=None, timeout=None): + # type: (Values, Optional[int], Optional[int]) -> PipSession + assert not options.cache_dir or os.path.isabs(options.cache_dir) + session = PipSession( + cache=( + os.path.join(options.cache_dir, "http") + if options.cache_dir else None + ), + retries=retries if retries is not None else options.retries, + trusted_hosts=options.trusted_hosts, + index_urls=self._get_index_urls(options), + ) + + # Handle custom ca-bundles from the user + if options.cert: + session.verify = options.cert + + # Handle SSL client certificate + if options.client_cert: + session.cert = options.client_cert + + # Handle timeouts + if options.timeout or timeout: + session.timeout = ( + timeout if timeout is not None else options.timeout + ) + + # Handle configured proxies + if options.proxy: + session.proxies = { + "http": options.proxy, + "https": options.proxy, + } + + # Determine if we can prompt the user for authentication or not + session.auth.prompting = not options.no_input + + return session + + +class IndexGroupCommand(Command, SessionCommandMixin): + + """ + Abstract base class for commands with the index_group options. + + This also corresponds to the commands that permit the pip version check. + """ + + def handle_pip_version_check(self, options): + # type: (Values) -> None + """ + Do the pip version check if not disabled. + + This overrides the default behavior of not doing the check. + """ + # Make sure the index_group options are present. + assert hasattr(options, 'no_index') + + if options.disable_pip_version_check or options.no_index: + return + + # Otherwise, check if we're using the latest version of pip available. + session = self._build_session( + options, + retries=0, + timeout=min(5, options.timeout) + ) + with session: + pip_self_version_check(session, options) + + +class RequirementCommand(IndexGroupCommand): + + @staticmethod + def make_requirement_preparer( + temp_build_dir, # type: TempDirectory + options, # type: Values + req_tracker, # type: RequirementTracker + session, # type: PipSession + finder, # type: PackageFinder + use_user_site, # type: bool + download_dir=None, # type: str + wheel_download_dir=None, # type: str + ): + # type: (...) -> RequirementPreparer + """ + Create a RequirementPreparer instance for the given parameters. + """ + downloader = Downloader(session, progress_bar=options.progress_bar) + + temp_build_dir_path = temp_build_dir.path + assert temp_build_dir_path is not None + + return RequirementPreparer( + build_dir=temp_build_dir_path, + src_dir=options.src_dir, + download_dir=download_dir, + wheel_download_dir=wheel_download_dir, + build_isolation=options.build_isolation, + req_tracker=req_tracker, + downloader=downloader, + finder=finder, + require_hashes=options.require_hashes, + use_user_site=use_user_site, + ) + + @staticmethod + def make_resolver( + preparer, # type: RequirementPreparer + finder, # type: PackageFinder + options, # type: Values + wheel_cache=None, # type: Optional[WheelCache] + use_user_site=False, # type: bool + ignore_installed=True, # type: bool + ignore_requires_python=False, # type: bool + force_reinstall=False, # type: bool + upgrade_strategy="to-satisfy-only", # type: str + use_pep517=None, # type: Optional[bool] + py_version_info=None # type: Optional[Tuple[int, ...]] + ): + # type: (...) -> Resolver + """ + Create a Resolver instance for the given parameters. + """ + make_install_req = partial( + install_req_from_req_string, + isolated=options.isolated_mode, + wheel_cache=wheel_cache, + use_pep517=use_pep517, + ) + return Resolver( + preparer=preparer, + finder=finder, + make_install_req=make_install_req, + use_user_site=use_user_site, + ignore_dependencies=options.ignore_dependencies, + ignore_installed=ignore_installed, + ignore_requires_python=ignore_requires_python, + force_reinstall=force_reinstall, + upgrade_strategy=upgrade_strategy, + py_version_info=py_version_info, + ) + + def populate_requirement_set( + self, + requirement_set, # type: RequirementSet + args, # type: List[str] + options, # type: Values + finder, # type: PackageFinder + session, # type: PipSession + wheel_cache, # type: Optional[WheelCache] + ): + # type: (...) -> None + """ + Marshal cmd line args into a requirement set. + """ + for filename in options.constraints: + for req_to_add in parse_requirements( + filename, + constraint=True, finder=finder, options=options, + session=session, wheel_cache=wheel_cache): + req_to_add.is_direct = True + requirement_set.add_requirement(req_to_add) + + for req in args: + req_to_add = install_req_from_line( + req, None, isolated=options.isolated_mode, + use_pep517=options.use_pep517, + wheel_cache=wheel_cache + ) + req_to_add.is_direct = True + requirement_set.add_requirement(req_to_add) + + for req in options.editables: + req_to_add = install_req_from_editable( + req, + isolated=options.isolated_mode, + use_pep517=options.use_pep517, + wheel_cache=wheel_cache + ) + req_to_add.is_direct = True + requirement_set.add_requirement(req_to_add) + + # NOTE: options.require_hashes may be set if --require-hashes is True + for filename in options.requirements: + for req_to_add in parse_requirements( + filename, + finder=finder, options=options, session=session, + wheel_cache=wheel_cache, + use_pep517=options.use_pep517): + req_to_add.is_direct = True + requirement_set.add_requirement(req_to_add) + + # If any requirement has hash options, enable hash checking. + requirements = ( + requirement_set.unnamed_requirements + + list(requirement_set.requirements.values()) + ) + if any(req.has_hash_options for req in requirements): + options.require_hashes = True + + if not (args or options.editables or options.requirements): + opts = {'name': self.name} + if options.find_links: + raise CommandError( + 'You must give at least one requirement to %(name)s ' + '(maybe you meant "pip %(name)s %(links)s"?)' % + dict(opts, links=' '.join(options.find_links))) + else: + raise CommandError( + 'You must give at least one requirement to %(name)s ' + '(see "pip help %(name)s")' % opts) + + @staticmethod + def trace_basic_info(finder): + # type: (PackageFinder) -> None + """ + Trace basic information about the provided objects. + """ + # Display where finder is looking for packages + search_scope = finder.search_scope + locations = search_scope.get_formatted_locations() + if locations: + logger.info(locations) + + def _build_package_finder( + self, + options, # type: Values + session, # type: PipSession + target_python=None, # type: Optional[TargetPython] + ignore_requires_python=None, # type: Optional[bool] + ): + # type: (...) -> PackageFinder + """ + Create a package finder appropriate to this requirement command. + + :param ignore_requires_python: Whether to ignore incompatible + "Requires-Python" values in links. Defaults to False. + """ + link_collector = make_link_collector(session, options=options) + selection_prefs = SelectionPreferences( + allow_yanked=True, + format_control=options.format_control, + allow_all_prereleases=options.pre, + prefer_binary=options.prefer_binary, + ignore_requires_python=ignore_requires_python, + ) + + return PackageFinder.create( + link_collector=link_collector, + selection_prefs=selection_prefs, + target_python=target_python, + ) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cli/req_command 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cli/req_command 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e384a509902054bf789573828e160430455c072f GIT binary patch literal 10660 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 literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cli/req_command.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cli/req_command.py new file mode 100644 index 0000000..9383b3b --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cli/req_command.py @@ -0,0 +1,333 @@ +"""Contains the Command base classes that depend on PipSession. + +The classes in this module are in a separate module so the commands not +needing download / PackageFinder capability don't unnecessarily import the +PackageFinder machinery and all its vendored dependencies, etc. +""" + +import logging +import os +from functools import partial + +from pip._internal.cli.base_command import Command +from pip._internal.cli.command_context import CommandContextMixIn +from pip._internal.exceptions import CommandError +from pip._internal.index.package_finder import PackageFinder +from pip._internal.legacy_resolve import Resolver +from pip._internal.models.selection_prefs import SelectionPreferences +from pip._internal.network.download import Downloader +from pip._internal.network.session import PipSession +from pip._internal.operations.prepare import RequirementPreparer +from pip._internal.req.constructors import ( + install_req_from_editable, + install_req_from_line, + install_req_from_req_string, +) +from pip._internal.req.req_file import parse_requirements +from pip._internal.self_outdated_check import ( + make_link_collector, + pip_self_version_check, +) +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from optparse import Values + from typing import List, Optional, Tuple + from pip._internal.cache import WheelCache + from pip._internal.models.target_python import TargetPython + from pip._internal.req.req_set import RequirementSet + from pip._internal.req.req_tracker import RequirementTracker + from pip._internal.utils.temp_dir import TempDirectory + +logger = logging.getLogger(__name__) + + +class SessionCommandMixin(CommandContextMixIn): + + """ + A class mixin for command classes needing _build_session(). + """ + def __init__(self): + # type: () -> None + super(SessionCommandMixin, self).__init__() + self._session = None # Optional[PipSession] + + @classmethod + def _get_index_urls(cls, options): + # type: (Values) -> Optional[List[str]] + """Return a list of index urls from user-provided options.""" + index_urls = [] + if not getattr(options, "no_index", False): + url = getattr(options, "index_url", None) + if url: + index_urls.append(url) + urls = getattr(options, "extra_index_urls", None) + if urls: + index_urls.extend(urls) + # Return None rather than an empty list + return index_urls or None + + def get_default_session(self, options): + # type: (Values) -> PipSession + """Get a default-managed session.""" + if self._session is None: + self._session = self.enter_context(self._build_session(options)) + # there's no type annotation on requests.Session, so it's + # automatically ContextManager[Any] and self._session becomes Any, + # then https://github.com/python/mypy/issues/7696 kicks in + assert self._session is not None + return self._session + + def _build_session(self, options, retries=None, timeout=None): + # type: (Values, Optional[int], Optional[int]) -> PipSession + assert not options.cache_dir or os.path.isabs(options.cache_dir) + session = PipSession( + cache=( + os.path.join(options.cache_dir, "http") + if options.cache_dir else None + ), + retries=retries if retries is not None else options.retries, + trusted_hosts=options.trusted_hosts, + index_urls=self._get_index_urls(options), + ) + + # Handle custom ca-bundles from the user + if options.cert: + session.verify = options.cert + + # Handle SSL client certificate + if options.client_cert: + session.cert = options.client_cert + + # Handle timeouts + if options.timeout or timeout: + session.timeout = ( + timeout if timeout is not None else options.timeout + ) + + # Handle configured proxies + if options.proxy: + session.proxies = { + "http": options.proxy, + "https": options.proxy, + } + + # Determine if we can prompt the user for authentication or not + session.auth.prompting = not options.no_input + + return session + + +class IndexGroupCommand(Command, SessionCommandMixin): + + """ + Abstract base class for commands with the index_group options. + + This also corresponds to the commands that permit the pip version check. + """ + + def handle_pip_version_check(self, options): + # type: (Values) -> None + """ + Do the pip version check if not disabled. + + This overrides the default behavior of not doing the check. + """ + # Make sure the index_group options are present. + assert hasattr(options, 'no_index') + + if options.disable_pip_version_check or options.no_index: + return + + # Otherwise, check if we're using the latest version of pip available. + session = self._build_session( + options, + retries=0, + timeout=min(5, options.timeout) + ) + with session: + pip_self_version_check(session, options) + + +class RequirementCommand(IndexGroupCommand): + + @staticmethod + def make_requirement_preparer( + temp_build_dir, # type: TempDirectory + options, # type: Values + req_tracker, # type: RequirementTracker + session, # type: PipSession + finder, # type: PackageFinder + use_user_site, # type: bool + download_dir=None, # type: str + wheel_download_dir=None, # type: str + ): + # type: (...) -> RequirementPreparer + """ + Create a RequirementPreparer instance for the given parameters. + """ + downloader = Downloader(session, progress_bar=options.progress_bar) + + temp_build_dir_path = temp_build_dir.path + assert temp_build_dir_path is not None + + return RequirementPreparer( + build_dir=temp_build_dir_path, + src_dir=options.src_dir, + download_dir=download_dir, + wheel_download_dir=wheel_download_dir, + build_isolation=options.build_isolation, + req_tracker=req_tracker, + downloader=downloader, + finder=finder, + require_hashes=options.require_hashes, + use_user_site=use_user_site, + ) + + @staticmethod + def make_resolver( + preparer, # type: RequirementPreparer + finder, # type: PackageFinder + options, # type: Values + wheel_cache=None, # type: Optional[WheelCache] + use_user_site=False, # type: bool + ignore_installed=True, # type: bool + ignore_requires_python=False, # type: bool + force_reinstall=False, # type: bool + upgrade_strategy="to-satisfy-only", # type: str + use_pep517=None, # type: Optional[bool] + py_version_info=None # type: Optional[Tuple[int, ...]] + ): + # type: (...) -> Resolver + """ + Create a Resolver instance for the given parameters. + """ + make_install_req = partial( + install_req_from_req_string, + isolated=options.isolated_mode, + wheel_cache=wheel_cache, + use_pep517=use_pep517, + ) + return Resolver( + preparer=preparer, + finder=finder, + make_install_req=make_install_req, + use_user_site=use_user_site, + ignore_dependencies=options.ignore_dependencies, + ignore_installed=ignore_installed, + ignore_requires_python=ignore_requires_python, + force_reinstall=force_reinstall, + upgrade_strategy=upgrade_strategy, + py_version_info=py_version_info, + ) + + def populate_requirement_set( + self, + requirement_set, # type: RequirementSet + args, # type: List[str] + options, # type: Values + finder, # type: PackageFinder + session, # type: PipSession + wheel_cache, # type: Optional[WheelCache] + ): + # type: (...) -> None + """ + Marshal cmd line args into a requirement set. + """ + for filename in options.constraints: + for req_to_add in parse_requirements( + filename, + constraint=True, finder=finder, options=options, + session=session, wheel_cache=wheel_cache): + req_to_add.is_direct = True + requirement_set.add_requirement(req_to_add) + + for req in args: + req_to_add = install_req_from_line( + req, None, isolated=options.isolated_mode, + use_pep517=options.use_pep517, + wheel_cache=wheel_cache + ) + req_to_add.is_direct = True + requirement_set.add_requirement(req_to_add) + + for req in options.editables: + req_to_add = install_req_from_editable( + req, + isolated=options.isolated_mode, + use_pep517=options.use_pep517, + wheel_cache=wheel_cache + ) + req_to_add.is_direct = True + requirement_set.add_requirement(req_to_add) + + # NOTE: options.require_hashes may be set if --require-hashes is True + for filename in options.requirements: + for req_to_add in parse_requirements( + filename, + finder=finder, options=options, session=session, + wheel_cache=wheel_cache, + use_pep517=options.use_pep517): + req_to_add.is_direct = True + requirement_set.add_requirement(req_to_add) + + # If any requirement has hash options, enable hash checking. + requirements = ( + requirement_set.unnamed_requirements + + list(requirement_set.requirements.values()) + ) + if any(req.has_hash_options for req in requirements): + options.require_hashes = True + + if not (args or options.editables or options.requirements): + opts = {'name': self.name} + if options.find_links: + raise CommandError( + 'You must give at least one requirement to %(name)s ' + '(maybe you meant "pip %(name)s %(links)s"?)' % + dict(opts, links=' '.join(options.find_links))) + else: + raise CommandError( + 'You must give at least one requirement to %(name)s ' + '(see "pip help %(name)s")' % opts) + + @staticmethod + def trace_basic_info(finder): + # type: (PackageFinder) -> None + """ + Trace basic information about the provided objects. + """ + # Display where finder is looking for packages + search_scope = finder.search_scope + locations = search_scope.get_formatted_locations() + if locations: + logger.info(locations) + + def _build_package_finder( + self, + options, # type: Values + session, # type: PipSession + target_python=None, # type: Optional[TargetPython] + ignore_requires_python=None, # type: Optional[bool] + ): + # type: (...) -> PackageFinder + """ + Create a package finder appropriate to this requirement command. + + :param ignore_requires_python: Whether to ignore incompatible + "Requires-Python" values in links. Defaults to False. + """ + link_collector = make_link_collector(session, options=options) + selection_prefs = SelectionPreferences( + allow_yanked=True, + format_control=options.format_control, + allow_all_prereleases=options.pre, + prefer_binary=options.prefer_binary, + ignore_requires_python=ignore_requires_python, + ) + + return PackageFinder.create( + link_collector=link_collector, + selection_prefs=selection_prefs, + target_python=target_python, + ) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cli/req_command.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cli/req_command.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6829b8cd6121d6c570556bb6577e9dd9e89a581f GIT binary patch literal 10660 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 literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cli/status_codes.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cli/status_codes.py new file mode 100644 index 0000000..275360a --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cli/status_codes.py @@ -0,0 +1,8 @@ +from __future__ import absolute_import + +SUCCESS = 0 +ERROR = 1 +UNKNOWN_ERROR = 2 +VIRTUALENV_NOT_FOUND = 3 +PREVIOUS_BUILD_DIR_ERROR = 4 +NO_MATCHES_FOUND = 23 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cli/status_codes.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/cli/status_codes.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0b534070fc02219def5cbc354659362d68ec6d3f GIT binary patch literal 454 zcmYL_-A=+l5QV4w8X}Pk6MY13a6ycCp$3E+8*yt|ib*fr6t>`!LQ6YE@$GyjU%;tg zoZb2M%$c2Rvia|7<>Tw-bqf2)(b??+Bv&LPZ4Cl|r3S7B8r5zNWDeXs$UL|OkOgpy zAdBFZK$gHQgDitxKcHbn33ZKtM+9$@gh7hFP|GNcQDqI4y{7UR3K>oa{C5~DB!!rz zn8v;k7FB>{g6;JCx@}{Tv~F3Zg;i1xf8^#17dz*eoUvhzoZe99W5LalxHla>z*A~G zTl&~A9b4Qv#&948hP9unQInhEsW<9B==N@+P9FRtSyRcPSZzG?*~W|6EDWR{Cu|-u zxn9gaFJ`Ugq}ASTH@HB=PW%0>Nikos5sOsRP^$#JAZVO-F1c%E)^7^6LO))40h Command + """ + Create an instance of the Command class with the given name. + """ + module_path, class_name, summary = commands_dict[name] + module = importlib.import_module(module_path) + command_class = getattr(module, class_name) + command = command_class(name=name, summary=summary, **kwargs) + + return command + + +def get_similar_commands(name): + """Command name auto-correct.""" + from difflib import get_close_matches + + name = name.lower() + + close_commands = get_close_matches(name, commands_dict.keys()) + + if close_commands: + return close_commands[0] + else: + return False diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/__init__ 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/__init__ 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8e554483eeed9539eb18fc5fa82bd0ffa6431f91 GIT binary patch literal 3539 zcmc&$SyLNF5bl+b02zGY3m@@1KB72Ag4nTh_`n7qlw(YZI4P@A*;;l+(!%VnyfX_W zmv|zt`A>OFeoy{Dx_fspt^iM|vQ!$)eAClC)BR2Nl>eEm{r%^I-vTH;Q}{nW51{{Y z00clATL(l5lmk%-+9hykTn1H!cA4i!K#f3Dfp!I=DzvM)L;904%_ViI=B&?$j9%HS~& z$3dL1;7JCjK%4?`+Ja{oJPYC+h-nL+XYc}uiy$sp@G}N4gK$AyvEb(nUIlRt#B~ea zVDJkNbr4@#@Fs&_fw%=?#)1t7n;>RE%vtbj25*D71L7MC-evF}h;KoBXTk3o`~k#$ z5DzT)kikbF=0Q9z!0u7laiDz^#1r@(gNB}2;12qy46F4;jHM;wHvF!1gCsV7 z7>9A!^_6n_VIQF=@?)WEAqqkr;}7N-HvXDURA!_XM*So;%k>h?9Kq&wDr73fVi*`x z!*T3KQkbl-WWM?&Vz1t=y!94dJY9I{wcac*FD*aM=gK(uI3DDKQ5-Df=2>ykUy3`4 zc5yCBM5d(I_f7AX8z^6Ek8Is?b%uLR2Zj`cu{L-X{TcT0JPj|5jZ9--HSEb6g@`$d zB1^e=VM?F)0J;6#NxEUi5EaQ*tP)@7%LgmAGVHL$Vu4jnZm`%M-Qx&n7=e7(?!n4; zh0JjjdSjPZ^>k%-!9Dt`h<8#c-%EYzVCA`lnM8?aENs=zA@Vvi{mi(<9;MjTj*y$m zcUhRqNXACHog|HX(=a2rN`>0!3kRE|c@FcB*se{!z6b7wPfEzHB1G?gPsgF^u>d>&jMxw1r|uun!1O;&oT`=gME(R_WVt{ zbP-ZGTvO5&vM*yH;~n$WGYR*A6kv5?P8W@b;df4eUkiMsDE5D?g@Nu9Co4 zE?#Q4tCBVB=0*w?xm_*&H0T{hkz9f)vdY5N(llDi5qD*hwMI1f5B1SnCsS;XmvylK6i&o#9qL4!&z*=JYvZi7 zL5JFV3f%~(eo*=(Zoizz`tu4q24Dy<{c9PvOR$aY2p9*}OE4@^1>3HGDZ{V=!!kVq zwyQA27lA`-@Ch;;fuRF`KxumvhND>4sD|ig*wkG7ETq!MVES=>|KdPWL`_e+#dh<` z;ckVd$8Z-T9J^FV8mxem7Y(_b6s4t38I8G*f#Le-395ILz4L;o!Zn`HM_yj5SVdPF z-doS(8#jMyBC}_TWIywG z@u^;ULlFOVt7+5vq3IzO8qaI=2V7AD4uDt8)Agq;pXwlzxt)diJo$+Sg}DCWtA z9B9U$`ASQsB8NC%Ko5*uv-Q@e4-pj%IR+>N_FxN zJHqos5_lf-)AKr+$x`WgEs}3hj$tAPiBjlb%8)I(_$_`TQZPPFmYE3^Ce=Y7^G=Ic zz!WdWeAD)My{WLV=3|fwSGFh`EeaGzqt&F|U2HzM_>*3RG2F`i{MJ6CBkFZ*sulFD ca|S(Jb&fkz*WMzEvU*%)9c>n+a literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/__init__.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/__init__.py new file mode 100644 index 0000000..2a311f8 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/__init__.py @@ -0,0 +1,114 @@ +""" +Package containing all pip commands +""" + +# The following comment should be removed at some point in the future. +# mypy: disallow-untyped-defs=False + +from __future__ import absolute_import + +import importlib +from collections import OrderedDict, namedtuple + +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Any + from pip._internal.cli.base_command import Command + + +CommandInfo = namedtuple('CommandInfo', 'module_path, class_name, summary') + +# The ordering matters for help display. +# Also, even though the module path starts with the same +# "pip._internal.commands" prefix in each case, we include the full path +# because it makes testing easier (specifically when modifying commands_dict +# in test setup / teardown by adding info for a FakeCommand class defined +# in a test-related module). +# Finally, we need to pass an iterable of pairs here rather than a dict +# so that the ordering won't be lost when using Python 2.7. +commands_dict = OrderedDict([ + ('install', CommandInfo( + 'pip._internal.commands.install', 'InstallCommand', + 'Install packages.', + )), + ('download', CommandInfo( + 'pip._internal.commands.download', 'DownloadCommand', + 'Download packages.', + )), + ('uninstall', CommandInfo( + 'pip._internal.commands.uninstall', 'UninstallCommand', + 'Uninstall packages.', + )), + ('freeze', CommandInfo( + 'pip._internal.commands.freeze', 'FreezeCommand', + 'Output installed packages in requirements format.', + )), + ('list', CommandInfo( + 'pip._internal.commands.list', 'ListCommand', + 'List installed packages.', + )), + ('show', CommandInfo( + 'pip._internal.commands.show', 'ShowCommand', + 'Show information about installed packages.', + )), + ('check', CommandInfo( + 'pip._internal.commands.check', 'CheckCommand', + 'Verify installed packages have compatible dependencies.', + )), + ('config', CommandInfo( + 'pip._internal.commands.configuration', 'ConfigurationCommand', + 'Manage local and global configuration.', + )), + ('search', CommandInfo( + 'pip._internal.commands.search', 'SearchCommand', + 'Search PyPI for packages.', + )), + ('wheel', CommandInfo( + 'pip._internal.commands.wheel', 'WheelCommand', + 'Build wheels from your requirements.', + )), + ('hash', CommandInfo( + 'pip._internal.commands.hash', 'HashCommand', + 'Compute hashes of package archives.', + )), + ('completion', CommandInfo( + 'pip._internal.commands.completion', 'CompletionCommand', + 'A helper command used for command completion.', + )), + ('debug', CommandInfo( + 'pip._internal.commands.debug', 'DebugCommand', + 'Show information useful for debugging.', + )), + ('help', CommandInfo( + 'pip._internal.commands.help', 'HelpCommand', + 'Show help for commands.', + )), +]) # type: OrderedDict[str, CommandInfo] + + +def create_command(name, **kwargs): + # type: (str, **Any) -> Command + """ + Create an instance of the Command class with the given name. + """ + module_path, class_name, summary = commands_dict[name] + module = importlib.import_module(module_path) + command_class = getattr(module, class_name) + command = command_class(name=name, summary=summary, **kwargs) + + return command + + +def get_similar_commands(name): + """Command name auto-correct.""" + from difflib import get_close_matches + + name = name.lower() + + close_commands = get_close_matches(name, commands_dict.keys()) + + if close_commands: + return close_commands[0] + else: + return False diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/__init__.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..62c58b54bd8d18d52af41d6bf144d19f46108cb6 GIT binary patch literal 3539 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 literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/completion 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/completion 2.py new file mode 100644 index 0000000..c532806 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/completion 2.py @@ -0,0 +1,96 @@ +# The following comment should be removed at some point in the future. +# mypy: disallow-untyped-defs=False + +from __future__ import absolute_import + +import sys +import textwrap + +from pip._internal.cli.base_command import Command +from pip._internal.utils.misc import get_prog + +BASE_COMPLETION = """ +# pip %(shell)s completion start%(script)s# pip %(shell)s completion end +""" + +COMPLETION_SCRIPTS = { + 'bash': """ + _pip_completion() + { + COMPREPLY=( $( COMP_WORDS="${COMP_WORDS[*]}" \\ + COMP_CWORD=$COMP_CWORD \\ + PIP_AUTO_COMPLETE=1 $1 2>/dev/null ) ) + } + complete -o default -F _pip_completion %(prog)s + """, + 'zsh': """ + function _pip_completion { + local words cword + read -Ac words + read -cn cword + reply=( $( COMP_WORDS="$words[*]" \\ + COMP_CWORD=$(( cword-1 )) \\ + PIP_AUTO_COMPLETE=1 $words[1] 2>/dev/null )) + } + compctl -K _pip_completion %(prog)s + """, + 'fish': """ + function __fish_complete_pip + set -lx COMP_WORDS (commandline -o) "" + set -lx COMP_CWORD ( \\ + math (contains -i -- (commandline -t) $COMP_WORDS)-1 \\ + ) + set -lx PIP_AUTO_COMPLETE 1 + string split \\ -- (eval $COMP_WORDS[1]) + end + complete -fa "(__fish_complete_pip)" -c %(prog)s + """, +} + + +class CompletionCommand(Command): + """A helper command to be used for command completion.""" + + ignore_require_venv = True + + def __init__(self, *args, **kw): + super(CompletionCommand, self).__init__(*args, **kw) + + cmd_opts = self.cmd_opts + + cmd_opts.add_option( + '--bash', '-b', + action='store_const', + const='bash', + dest='shell', + help='Emit completion code for bash') + cmd_opts.add_option( + '--zsh', '-z', + action='store_const', + const='zsh', + dest='shell', + help='Emit completion code for zsh') + cmd_opts.add_option( + '--fish', '-f', + action='store_const', + const='fish', + dest='shell', + help='Emit completion code for fish') + + self.parser.insert_option_group(0, cmd_opts) + + def run(self, options, args): + """Prints the completion code of the given shell""" + shells = COMPLETION_SCRIPTS.keys() + shell_options = ['--' + shell for shell in sorted(shells)] + if options.shell in shells: + script = textwrap.dedent( + COMPLETION_SCRIPTS.get(options.shell, '') % { + 'prog': get_prog(), + } + ) + print(BASE_COMPLETION % {'script': script, 'shell': options.shell}) + else: + sys.stderr.write( + 'ERROR: You must pass %s\n' % ' or '.join(shell_options) + ) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/completion 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/completion 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d5b8b0a0bf48e33ad7acdd03d339a6efc1d591c7 GIT binary patch literal 3498 zcmd5;-BQ~|6kf^3U;_>LY1(v>c88Ew&Wv!}bZDnjG7v)Bv+q2f4&HN?IG=dZTP(6nzYj zu@H(C7L2mFV2lM-ylN~MXLB1>7ECZP!rBH4CfToyVeiKqm^4|-`T%}}c$j6NQRmQj zTQZ4qCET!=CYf3(W=1iyl=OOD925g%80ZM)rdiUFKcQ2*&eJgEH!Qg=qNpyppY+m5 zs4$7SR9>bq<7Z*2>hc|$A`WWuDx9hD{?CO~cVNq^AI-czl1O!F_2HVcy!PPnyv1iM z-F1Iib?&w1r)OT%WYK$abMs)DKRveeaI5}XD=*R7`I&+I?lo)o*WATN>#Hs;c(A;_ zJm2IqP5$MbMj&B7S%3)9>&O$%GvNi?Ui6FU6BB-X%8E4FI|XoUA5fo( z^Z?iS8Oti{+D%@sp9S-&02kXdH;?0d7Rn-Uqmp%Z0oC+#2!c@&MGZyu6sVhJDz2z@sFUFN3o!I21ciTt z?W3-mtZTA;$R_)pF#|*05<4id{SxbHci>2XG7T9{>0({fYLx0XX4&ZLjZ?uM=uJ{l z@9TXqtapwDQ$u>^hx9HKdT?Nbb+OS!@&W$Q9n-Qd!Rr-SL2KK(ikKvBDH`!~1yOWD zsgg{9>akR61brg?XjJufWX!fH$@Ipr9Kuvy zeb+itE*vIa6zkd!8G84Aq+Q%^bb;w($Q)63$e5x#%yq*!RIaN#elKv7R7q9Cj2Gw* zBCnB2y-bQsUBnC$5E5x(((PnPo?3JU4T2O=TMJ&+k%~_EeAl6i)xuLW5}aX;Gz)h; zB^obQ3xAW?&cJtO&^Y-4}j_N9_v?}t0f8jTX;6zbLhVR29Lanh8b7Ps#!6rMn(UPqCHhMeTq6E zNQf^jVErEuaEh)$pA+DC2VIaKEHl`>%_(-E3BO-vA3ZbKi!1D4gfav90F~zzmi-Lf$kElz>cikZIAydfKvs@I3-ifIOX5vL2 z;tgu-=oE6kfY#vjTKfNznu0}FnjAxeR5mMS^%INO**|DIS2^5w2_)ulYN*<(Ptl-s z%pR4ESw9MAQKPBs>s!&GD^F3ZkL%?sjO1)Dl)fgR^BFXpE7XuP?+Y?I=-(A#zN0T0 YBKH&+GGR^`Q{{?Ts*aA2j@Qcn0{d@58UO$Q literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/completion.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/completion.py new file mode 100644 index 0000000..c532806 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/completion.py @@ -0,0 +1,96 @@ +# The following comment should be removed at some point in the future. +# mypy: disallow-untyped-defs=False + +from __future__ import absolute_import + +import sys +import textwrap + +from pip._internal.cli.base_command import Command +from pip._internal.utils.misc import get_prog + +BASE_COMPLETION = """ +# pip %(shell)s completion start%(script)s# pip %(shell)s completion end +""" + +COMPLETION_SCRIPTS = { + 'bash': """ + _pip_completion() + { + COMPREPLY=( $( COMP_WORDS="${COMP_WORDS[*]}" \\ + COMP_CWORD=$COMP_CWORD \\ + PIP_AUTO_COMPLETE=1 $1 2>/dev/null ) ) + } + complete -o default -F _pip_completion %(prog)s + """, + 'zsh': """ + function _pip_completion { + local words cword + read -Ac words + read -cn cword + reply=( $( COMP_WORDS="$words[*]" \\ + COMP_CWORD=$(( cword-1 )) \\ + PIP_AUTO_COMPLETE=1 $words[1] 2>/dev/null )) + } + compctl -K _pip_completion %(prog)s + """, + 'fish': """ + function __fish_complete_pip + set -lx COMP_WORDS (commandline -o) "" + set -lx COMP_CWORD ( \\ + math (contains -i -- (commandline -t) $COMP_WORDS)-1 \\ + ) + set -lx PIP_AUTO_COMPLETE 1 + string split \\ -- (eval $COMP_WORDS[1]) + end + complete -fa "(__fish_complete_pip)" -c %(prog)s + """, +} + + +class CompletionCommand(Command): + """A helper command to be used for command completion.""" + + ignore_require_venv = True + + def __init__(self, *args, **kw): + super(CompletionCommand, self).__init__(*args, **kw) + + cmd_opts = self.cmd_opts + + cmd_opts.add_option( + '--bash', '-b', + action='store_const', + const='bash', + dest='shell', + help='Emit completion code for bash') + cmd_opts.add_option( + '--zsh', '-z', + action='store_const', + const='zsh', + dest='shell', + help='Emit completion code for zsh') + cmd_opts.add_option( + '--fish', '-f', + action='store_const', + const='fish', + dest='shell', + help='Emit completion code for fish') + + self.parser.insert_option_group(0, cmd_opts) + + def run(self, options, args): + """Prints the completion code of the given shell""" + shells = COMPLETION_SCRIPTS.keys() + shell_options = ['--' + shell for shell in sorted(shells)] + if options.shell in shells: + script = textwrap.dedent( + COMPLETION_SCRIPTS.get(options.shell, '') % { + 'prog': get_prog(), + } + ) + print(BASE_COMPLETION % {'script': script, 'shell': options.shell}) + else: + sys.stderr.write( + 'ERROR: You must pass %s\n' % ' or '.join(shell_options) + ) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/completion.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/completion.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d92d251d207d24e94891904d7d35938d24894be8 GIT binary patch literal 3498 zcmd5;-BQ~|6kf^3#s(Vl)3oU%?G7QWoEhOb>5xvRWJm~Y(kbUJZDG{RaNIkKc^ zR}d1oN@sf4=jd%8q0iJ8=yz5IoAA@i#-P>N-Lq%Ue&;)9RrqJB`ugvM7i~8974TkM zWK6z;;N#z5A!B`mwG3uZ-(;c5TBe?ZTwtw&mJ2K_vi=xrjpcep7M57Q%vxpiF+9!! zD3+LCX7m0y^DB5&nLokiTNUO{GBL(F2J@%bZ;WB@r!7pHtZ97&KLR|=GSH}VXuM4s zhnW&?&`;u2t>iOh%q+$Iz8CrVz&HlFLb*vAcjZs$RIl?SNcas)Ziz6gN#2h8Nhnkh zM_ei|RhVg~L85B%3{4UFRe2T8RQcfN!m2y8Wz`O6-X2P%y0rRa%~@W1{B*(MvzG3< zzpgqDn+r3uZ)q~`J-fNFKf|9NS$eS5;H{OHXzjx6P(FLj+M_l1{x9pRE-iSxyuQ59 z;Ij>W`(E7_+w~|5Ltf)U*Y^+iADm2ZJLbOVcv+~p{XKv0)PR+Mu1UR46@mArC%5F2 zQKULq)Yfpnzjzd=Fm8Jx--%Nn5u(?jC!D9k^SOP$olhT|Xh$ckNW$F{0N3^b^{Ge? zab1|TtlX~M;I-OmFrNr;zD;A}D9)$B+*TpCfBp|>DMjA^*`1S-bvuFFI-sKyHenD^kZXKq=JX|+b=*1ugubV?$X2AhAd=h;xNW~@Th(~ZS55mG z;55bnwgsHrG z);dzo9VTAn>pBh@I(t9T&hIz6!1OU>hNwGaOwk?Yx-Sab#rf)rs#3trllica`)$DxbW!jm@=oMH7O4YoZc z>f2sg@5G@mQd#dNb^leb`{wITM5n}-r3o@g!uo*Kl7zu6JeTY`bl-o2N8Uukj4NivEEyG}r2oojPn69zMV$~N z#FrMa{!a)vMbDtm32?lNF31m-8SLT4G~3sN-z&0DUYP9F6}CS{nSp$O%F7Z!^@viaN&QfU724?jlNn5wW|mGzJ|I;DD( zY;TO*ptS}Pr)gE-thCXrp_D1f)s{HM&bXt8yTP`=_X>T&P5#Z~47_&G{s0)QkD6wYLk<$Y%$zi? z8|OgfkB#$%Yi7mJ=N#mE~&e)TQIQt{=A{Q^?lSOyr5)ji?5u;#C&l z4Qg!b6mq_T*6{RN`u~!ef<;%F97lsxHcMvZGmF?cIA|wR8QgaXB<65xsM@N}(V%q9 z9hQx`b{Nc|MpN0>x1vK=o}ySE)yq^6%DH|Z+nR*V7tnC7P(#jqD9Grbf0u{(p1x#= X+|yvlq&aO&7fWWLQl2PJREz%t0Ny~R literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/configuration 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/configuration 2.py new file mode 100644 index 0000000..efcf5bb --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/configuration 2.py @@ -0,0 +1,233 @@ +# The following comment should be removed at some point in the future. +# mypy: disallow-untyped-defs=False + +import logging +import os +import subprocess + +from pip._internal.cli.base_command import Command +from pip._internal.cli.status_codes import ERROR, SUCCESS +from pip._internal.configuration import ( + Configuration, + get_configuration_files, + kinds, +) +from pip._internal.exceptions import PipError +from pip._internal.utils.misc import get_prog, write_output + +logger = logging.getLogger(__name__) + + +class ConfigurationCommand(Command): + """Manage local and global configuration. + + Subcommands: + + list: List the active configuration (or from the file specified) + edit: Edit the configuration file in an editor + get: Get the value associated with name + set: Set the name=value + unset: Unset the value associated with name + + If none of --user, --global and --site are passed, a virtual + environment configuration file is used if one is active and the file + exists. Otherwise, all modifications happen on the to the user file by + default. + """ + + ignore_require_venv = True + usage = """ + %prog [] list + %prog [] [--editor ] edit + + %prog [] get name + %prog [] set name value + %prog [] unset name + """ + + def __init__(self, *args, **kwargs): + super(ConfigurationCommand, self).__init__(*args, **kwargs) + + self.configuration = None + + self.cmd_opts.add_option( + '--editor', + dest='editor', + action='store', + default=None, + help=( + 'Editor to use to edit the file. Uses VISUAL or EDITOR ' + 'environment variables if not provided.' + ) + ) + + self.cmd_opts.add_option( + '--global', + dest='global_file', + action='store_true', + default=False, + help='Use the system-wide configuration file only' + ) + + self.cmd_opts.add_option( + '--user', + dest='user_file', + action='store_true', + default=False, + help='Use the user configuration file only' + ) + + self.cmd_opts.add_option( + '--site', + dest='site_file', + action='store_true', + default=False, + help='Use the current environment configuration file only' + ) + + self.parser.insert_option_group(0, self.cmd_opts) + + def run(self, options, args): + handlers = { + "list": self.list_values, + "edit": self.open_in_editor, + "get": self.get_name, + "set": self.set_name_value, + "unset": self.unset_name + } + + # Determine action + if not args or args[0] not in handlers: + logger.error("Need an action ({}) to perform.".format( + ", ".join(sorted(handlers))) + ) + return ERROR + + action = args[0] + + # Determine which configuration files are to be loaded + # Depends on whether the command is modifying. + try: + load_only = self._determine_file( + options, need_value=(action in ["get", "set", "unset", "edit"]) + ) + except PipError as e: + logger.error(e.args[0]) + return ERROR + + # Load a new configuration + self.configuration = Configuration( + isolated=options.isolated_mode, load_only=load_only + ) + self.configuration.load() + + # Error handling happens here, not in the action-handlers. + try: + handlers[action](options, args[1:]) + except PipError as e: + logger.error(e.args[0]) + return ERROR + + return SUCCESS + + def _determine_file(self, options, need_value): + file_options = [key for key, value in ( + (kinds.USER, options.user_file), + (kinds.GLOBAL, options.global_file), + (kinds.SITE, options.site_file), + ) if value] + + if not file_options: + if not need_value: + return None + # Default to user, unless there's a site file. + elif any( + os.path.exists(site_config_file) + for site_config_file in get_configuration_files()[kinds.SITE] + ): + return kinds.SITE + else: + return kinds.USER + elif len(file_options) == 1: + return file_options[0] + + raise PipError( + "Need exactly one file to operate upon " + "(--user, --site, --global) to perform." + ) + + def list_values(self, options, args): + self._get_n_args(args, "list", n=0) + + for key, value in sorted(self.configuration.items()): + write_output("%s=%r", key, value) + + def get_name(self, options, args): + key = self._get_n_args(args, "get [name]", n=1) + value = self.configuration.get_value(key) + + write_output("%s", value) + + def set_name_value(self, options, args): + key, value = self._get_n_args(args, "set [name] [value]", n=2) + self.configuration.set_value(key, value) + + self._save_configuration() + + def unset_name(self, options, args): + key = self._get_n_args(args, "unset [name]", n=1) + self.configuration.unset_value(key) + + self._save_configuration() + + def open_in_editor(self, options, args): + editor = self._determine_editor(options) + + fname = self.configuration.get_file_to_edit() + if fname is None: + raise PipError("Could not determine appropriate file.") + + try: + subprocess.check_call([editor, fname]) + except subprocess.CalledProcessError as e: + raise PipError( + "Editor Subprocess exited with exit code {}" + .format(e.returncode) + ) + + def _get_n_args(self, args, example, n): + """Helper to make sure the command got the right number of arguments + """ + if len(args) != n: + msg = ( + 'Got unexpected number of arguments, expected {}. ' + '(example: "{} config {}")' + ).format(n, get_prog(), example) + raise PipError(msg) + + if n == 1: + return args[0] + else: + return args + + def _save_configuration(self): + # We successfully ran a modifying command. Need to save the + # configuration. + try: + self.configuration.save() + except Exception: + logger.error( + "Unable to save configuration. Please report this as a bug.", + exc_info=1 + ) + raise PipError("Internal Error.") + + def _determine_editor(self, options): + if options.editor is not None: + return options.editor + elif "VISUAL" in os.environ: + return os.environ["VISUAL"] + elif "EDITOR" in os.environ: + return os.environ["EDITOR"] + else: + raise PipError("Could not determine editor to use.") diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/configuration 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/configuration 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..da0093179f42ed6b5338439e3af4db04b85b1291 GIT binary patch literal 8359 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] list + %prog [] [--editor ] edit + + %prog [] get name + %prog [] set name value + %prog [] unset name + """ + + def __init__(self, *args, **kwargs): + super(ConfigurationCommand, self).__init__(*args, **kwargs) + + self.configuration = None + + self.cmd_opts.add_option( + '--editor', + dest='editor', + action='store', + default=None, + help=( + 'Editor to use to edit the file. Uses VISUAL or EDITOR ' + 'environment variables if not provided.' + ) + ) + + self.cmd_opts.add_option( + '--global', + dest='global_file', + action='store_true', + default=False, + help='Use the system-wide configuration file only' + ) + + self.cmd_opts.add_option( + '--user', + dest='user_file', + action='store_true', + default=False, + help='Use the user configuration file only' + ) + + self.cmd_opts.add_option( + '--site', + dest='site_file', + action='store_true', + default=False, + help='Use the current environment configuration file only' + ) + + self.parser.insert_option_group(0, self.cmd_opts) + + def run(self, options, args): + handlers = { + "list": self.list_values, + "edit": self.open_in_editor, + "get": self.get_name, + "set": self.set_name_value, + "unset": self.unset_name + } + + # Determine action + if not args or args[0] not in handlers: + logger.error("Need an action ({}) to perform.".format( + ", ".join(sorted(handlers))) + ) + return ERROR + + action = args[0] + + # Determine which configuration files are to be loaded + # Depends on whether the command is modifying. + try: + load_only = self._determine_file( + options, need_value=(action in ["get", "set", "unset", "edit"]) + ) + except PipError as e: + logger.error(e.args[0]) + return ERROR + + # Load a new configuration + self.configuration = Configuration( + isolated=options.isolated_mode, load_only=load_only + ) + self.configuration.load() + + # Error handling happens here, not in the action-handlers. + try: + handlers[action](options, args[1:]) + except PipError as e: + logger.error(e.args[0]) + return ERROR + + return SUCCESS + + def _determine_file(self, options, need_value): + file_options = [key for key, value in ( + (kinds.USER, options.user_file), + (kinds.GLOBAL, options.global_file), + (kinds.SITE, options.site_file), + ) if value] + + if not file_options: + if not need_value: + return None + # Default to user, unless there's a site file. + elif any( + os.path.exists(site_config_file) + for site_config_file in get_configuration_files()[kinds.SITE] + ): + return kinds.SITE + else: + return kinds.USER + elif len(file_options) == 1: + return file_options[0] + + raise PipError( + "Need exactly one file to operate upon " + "(--user, --site, --global) to perform." + ) + + def list_values(self, options, args): + self._get_n_args(args, "list", n=0) + + for key, value in sorted(self.configuration.items()): + write_output("%s=%r", key, value) + + def get_name(self, options, args): + key = self._get_n_args(args, "get [name]", n=1) + value = self.configuration.get_value(key) + + write_output("%s", value) + + def set_name_value(self, options, args): + key, value = self._get_n_args(args, "set [name] [value]", n=2) + self.configuration.set_value(key, value) + + self._save_configuration() + + def unset_name(self, options, args): + key = self._get_n_args(args, "unset [name]", n=1) + self.configuration.unset_value(key) + + self._save_configuration() + + def open_in_editor(self, options, args): + editor = self._determine_editor(options) + + fname = self.configuration.get_file_to_edit() + if fname is None: + raise PipError("Could not determine appropriate file.") + + try: + subprocess.check_call([editor, fname]) + except subprocess.CalledProcessError as e: + raise PipError( + "Editor Subprocess exited with exit code {}" + .format(e.returncode) + ) + + def _get_n_args(self, args, example, n): + """Helper to make sure the command got the right number of arguments + """ + if len(args) != n: + msg = ( + 'Got unexpected number of arguments, expected {}. ' + '(example: "{} config {}")' + ).format(n, get_prog(), example) + raise PipError(msg) + + if n == 1: + return args[0] + else: + return args + + def _save_configuration(self): + # We successfully ran a modifying command. Need to save the + # configuration. + try: + self.configuration.save() + except Exception: + logger.error( + "Unable to save configuration. Please report this as a bug.", + exc_info=1 + ) + raise PipError("Internal Error.") + + def _determine_editor(self, options): + if options.editor is not None: + return options.editor + elif "VISUAL" in os.environ: + return os.environ["VISUAL"] + elif "EDITOR" in os.environ: + return os.environ["EDITOR"] + else: + raise PipError("Could not determine editor to use.") diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/configuration.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/configuration.pyc new file mode 100644 index 0000000000000000000000000000000000000000..774dc28361da346a536ec875a7f3fd6fe1257983 GIT binary patch literal 8359 zcmdT}OLH7o6~5gw8fo;178ENMY}l}7#|HiaKLEb(+}4aq}?x?Dd+TNmy##Fbg>Sfg(SM_n#olx}&J2s-CN!6WF^(osfspvV?omTZ} z)tyoG8RclD)=nsWQa!^FPN`s2>7r`mEMw|3rJgDEv-)YCwpJ=B9*cVN>Ujo+ekB!v#maMl*)|qYZWrayaD!o(2ScM?L|qe8F^r-*NKu9RQK_xIzH~@Kehf! z%QD~G81_b?$!>UeQF_^`_L{9M+|c{i@G42_wbP_46lAz(db$<1LmgZkEU$wQ3oW7) zvVEuUWKtO8m>%hpbTAEKi=?WB!n)W;c&Nm^ku(}A}cW~*M@?CJr%A$={U=g6Bf zX)xZ8g<_d6ImlP6Ihb^(?Zru~y`=5U&Gn5=FX5fDlboHKGmsXqnQE_x)9K)n*Yq~R zH0w8`!6G_FPZD=^oE_kw{d(hJ<-iNu9=8h3F0Z)(Sx>6rVq3ToQ}ym)B;5>+#*R_s zb&~*WZ;3(}Z?)O$=@`q&{49|dk8k~{tXct3|*i~cn@!K`?;h? zReS4^N3r-Cl81A1_Ab4f_C42YW~-RX)=HpvJ&7z-obN38drwlOq61Wkzy|uL1%Y!hkx8pM>X}b4yeJCmLA)SZ zd~ub5#8$m!qmB3Bo!au-cRc{b;;lOm?)lzcZP;k0VRHpIP2rD|%!9~ngnKGQQu_sn4@zyt76ljKi$a5cV$t zB*X~rTT19!-Jk(Qg@R&IGmysaUB26lpfmjPUNgm~Wv5UL0fuSDIUs9v(xl(BMwY^1 zbkvp|n`y_$%=JxHD;QH!m`&8?dug}Bk;mhhRf&hIFGI;@yxd~_pM?`y|9gez2T^4PZ znkc>0ME9j85O8g$K)9GR_xOUM&ps`v^-+~>@j?k1qiRh6Vr@)8WH1URY4GRZ#%lS* zoub-4CnuO72*LP2#THX)y##t^XGDDzS5y(M%KErU|E`>!l5*@GPfKbINP^9=uq^p; z222^}GHdV^u-*vVFc;s{n2{Z3=&(Hl_qJzwBy2QmaSsS}j^MF(uj|&?ec~kij)g1i{zVgoTgy};Rjd%@+wbuE)rCr3GF29Rt+7)OP{F&vakmjQd&_Eh`bFMRv!|%V zFDl3~HB#_p-Bsxy*o0d#TZ3T27r@9bF-QZ>Pg!d5rg+Je2E&Jv40V2VR_!?X=ULwc zQ$KVb1En~b)0Ql-b9Q1xWayNM6l!rPZ8*g7>g8+(FEMHscEz?G4+$}}iZ?qt)?2;w ztzYw;Jafqrb+>487af8odJA9@ZHr$mzBcd#>W#Qjd;K2V$9{4?z0RW;*nzqs3obS!#Z5#^?$`afWC zVV7WCZwqu-eB;(UdTykTi}igS$NC(PIgf%$I*s3R&PkURxad+n&$^@TxO37OLrYYW z4CEs!c^?%TSClZAq5_coXRhOHUCAABNb(xG;E_8}#g~Sv2tGqQtigI#P|o8^>Z75S z_#T!PP>ZcNaL)_o%?qh$kzjs95WPWn#(xdN7D!15Dd-xXpfA*dr1pXYhk17Y7Dw?M z122fj_$?msX_a%vJ%0qRe*}Ufc}=fHFp;1kE(w4RB1`T9es-e=@@2`;&@noDNK5$0 ze-};BInloh##-9j=(WtGo|4NV#@`%q1cW6+7-1}Hnd&_hZsp7+t{ufyIv^Gt2r~`S+|c`TU*8DHWzhC}em!weIWIe> zEThR63Y?$>efuLBeOPiO>^{U_!lw=Y4~p$U&N9Zdew>xqpQ3GPh8R77fMcTlmvF{E z;u#3*%n{Dd=OD;=C?UsQ)&X3tYXkUPA5-ZYv|&JF>v_aVZJ*5p7>l+YmqQ2(st7?4 z*o;aP@(V;EBZxRK6_7nfF9ul%5a!D`>SL^L^S4Xp0?xCL^rJu`{(;BqA!n5)2qtNq zY4NItx|k;!kfX$COB>_CT^VEmSx1nLSpUh64WCb7&K@_~I`I~fXrhToVotL}9DFg- zVvi-TFoSKR*;>`D^#;$v!KmaMByZZrG5O){v8f=brbIto${yij_kbi-{)@`mMt=vb3 zmATM7AK-P6EMhwiJFCb9_PZ;fMwS*9z0X9e8RRHsx!WM`(`D2x%FYq=mmpX9=#!nQ zSApx;?M3>AcmByvo(6)9oxeDAGnXtnyo1w<82F60tZPU7vYrDkUjngwJu#c&6n0JL zm`DI^_TTUrM!%{6AI?1q37CZE)?(p|O1;2Nc{lZW?fK8E}A0MMh#lIgW!5 zL`*gG>ez+IW*`N-fWTFk%ng*wG4p`DZ<@3HdAF)}KhjO)_fp+Mz>IrmjvRm9O21Q; zs8(;a5VE%u>yR*%zLRH=JkistRmwrQ%uOU)u(;LIlKt}MFv+j7ph1$DNv`miToTRE zKk($2RB%o>Q&7&5GwQbJDC|C>pbVcG$RdXYTraEiOx~>FPH<81Ly%5NFXwf1&eoum z!;$xQM_dM@xJnq-VK7P{Sd!q!W_P7()4LK69EI){h>co%h7R~Kxrh&NsDI(H7lEi}6wd@7w?gA1^4PE$qK24;26Huigm4Y{#6}}XT6r?} z0n*nt6WfWAYj33baX-X+136s7{~@`-xXULed>TjpRTlIDe8RXd-Zv%1 z=P8E_liL3^TgzyG8C&xbiqdq+Esd4j@+;+6%P*Eo`R{ajx;$ASmGFsKv@q`YlntN% zrpXAVND)^D>EUWC3acxC2Kc}7-(w#XUq**abJjPY#D6^`|2Ky-J5Eb%$r2- zKG7_0{~C*pk53h-N0 Wd None + logger.info('{}: {}'.format(name, value)) + + +def show_sys_implementation(): + # type: () -> None + logger.info('sys.implementation:') + if hasattr(sys, 'implementation'): + implementation = sys.implementation # type: ignore + implementation_name = implementation.name + else: + implementation_name = '' + + with indent_log(): + show_value('name', implementation_name) + + +def show_tags(options): + # type: (Values) -> None + tag_limit = 10 + + target_python = make_target_python(options) + tags = target_python.get_tags() + + # Display the target options that were explicitly provided. + formatted_target = target_python.format_given() + suffix = '' + if formatted_target: + suffix = ' (target: {})'.format(formatted_target) + + msg = 'Compatible tags: {}{}'.format(len(tags), suffix) + logger.info(msg) + + if options.verbose < 1 and len(tags) > tag_limit: + tags_limited = True + tags = tags[:tag_limit] + else: + tags_limited = False + + with indent_log(): + for tag in tags: + logger.info(str(tag)) + + if tags_limited: + msg = ( + '...\n' + '[First {tag_limit} tags shown. Pass --verbose to show all.]' + ).format(tag_limit=tag_limit) + logger.info(msg) + + +def ca_bundle_info(config): + levels = set() + for key, value in config.items(): + levels.add(key.split('.')[0]) + + if not levels: + return "Not specified" + + levels_that_override_global = ['install', 'wheel', 'download'] + global_overriding_level = [ + level for level in levels if level in levels_that_override_global + ] + if not global_overriding_level: + return 'global' + + levels.remove('global') + return ", ".join(levels) + + +class DebugCommand(Command): + """ + Display debug information. + """ + + usage = """ + %prog """ + ignore_require_venv = True + + def __init__(self, *args, **kw): + super(DebugCommand, self).__init__(*args, **kw) + + cmd_opts = self.cmd_opts + cmdoptions.add_target_python_options(cmd_opts) + self.parser.insert_option_group(0, cmd_opts) + self.parser.config.load() + + def run(self, options, args): + # type: (Values, List[Any]) -> int + logger.warning( + "This command is only meant for debugging. " + "Do not use this with automation for parsing and getting these " + "details, since the output and options of this command may " + "change without notice." + ) + show_value('pip version', get_pip_version()) + show_value('sys.version', sys.version) + show_value('sys.executable', sys.executable) + show_value('sys.getdefaultencoding', sys.getdefaultencoding()) + show_value('sys.getfilesystemencoding', sys.getfilesystemencoding()) + show_value( + 'locale.getpreferredencoding', locale.getpreferredencoding(), + ) + show_value('sys.platform', sys.platform) + show_sys_implementation() + + show_value("'cert' config value", ca_bundle_info(self.parser.config)) + show_value("REQUESTS_CA_BUNDLE", os.environ.get('REQUESTS_CA_BUNDLE')) + show_value("CURL_CA_BUNDLE", os.environ.get('CURL_CA_BUNDLE')) + show_value("pip._vendor.certifi.where()", where()) + + show_tags(options) + + return SUCCESS diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/debug 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/debug 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b89d8563fc5c056b2b217f0d6abb453b2f67c2a4 GIT binary patch literal 5384 zcmd5=TX!5s5w4llZFR9^D~_$iF=LaEH78yrC*g2T2*I|b5Wpz*$V%b`XENI9UCnwf z>*-$E!qQWC;0b;M`4xHOmEXgGH_qYvYIY+Tn`fidwyLXd)m2|zT8)1!&Hw#xKmV#L z@~?>m(J_r z6(Xh~gG*xGkZ*A5%aSa~A4NJpkmQUKfh5aHT#;l&iK~*F6|*2cPm*)wd?Rwd^Fyj? zr?m=wrqpc<`V_Z}Cf>7UHgYCP^I=)J?RsPyBain@W$Nxcy4^e}hb}D(Tk~eY+bHuq zE|QvY4vaj0Xd)L^edD6xq1!KulgT@~8yj0YJ10A)MPdpUWo5tSQ5;>E4xxtPL_1iE9&1m<_$B_zii9Oy<{I0fW)TlSW{}P?=^+H`ZpSlK$pquJF(t{~EhPI%* zX*u?!n31GG0(t=E{&Eg$W+j;#>(l!J+PwRvs+9WJwgjU+v~2({GdYkD6I~y=GvGhV zgCHW|3Yr$J8!oZoG#ntZAKTcuN|Av5Lhh@RLmDI`EY%)5;M4`4IWeM*Ub1B_KuEO= zE6<)KLR z*Hg1Sd5C?%nUmvLZUL7Ha6Ta7nq&cqgved-o?PMh=7Tjko*VD(7UXD-2k?wX-^mw8 zvr_$Ak{ODWU_V~R`)^?&^eKc7y`Blpx{nG$*Q$kZCK<!nY04Y{Ghx8L082$Hd}>WW`zk=|iTyP_YX`mr9|3&(2#-_J*9^1y z;G+7Uy5PeZslKL@edWueujyy-F#9KheFys>(1PN|$sB_%9l%3o;3e7^u=_XSECctl2#)+D_pOt%n5tG3?L5pFt#*%TmDs?8e%88Ri zId+((PM20DFAt1DX;7v`izn(pw=8;TU&+iIn5^F5p*alCa?0yyYJTMQV;5nQs!9_R z)w1X*I_?-7YvyE9TEH2(=S#*NqjEQn_C`gLp@2dSa0eXwDjGqcUh^*dGv1WH?7yXd zmppZ#O{U{<<<#X={?LlIZeZ~{APh=86eMU-*`n@ih(R?A4EZeRI+|!n%u2Y^B5LiM zXyya_Y^E?xd>ClX4=57r5#-gj4y$ZR1;Jaxs_X|Jjbp^eU5dcX8u)&81Dk#h0&W0= zA<`rM6YZdV`7`8Y@CTkXNf48oCzOjgjjVu)VEOe#uz=hqJ?d0ZrJ!vwNY|Je4NVn( z#4f{k1cjz9inN2`GlHNtBt#v<8IbsFp~-Ppr;4~?Tv?Q6n(PZwDS-mkqTmsE_&8)Hc)2(WKc=MkTIx!?H3Y3CZ`JG4QvC8J8o2%i0v4;Q zSq2PT0-%BGLi02R`xBE*`cqT|vihVyt$hTXlO@R8n1ZBy!a@>n%0Tn@WFZnbW-Zhk zEpoD+*JSD;T+YZ~S@Zf>ka=+{GB_)PbCO^qM78n2!l?mlcQUXjFzG~ySH^+RbLSBZ znccSScWCeJr#2WDzX8ay$PRvUVAr zP9$M+fM-sCr0qz%eS;;5adDd2cLI!exq}JHksFSj&K;vMD0}tZ6M=F#XLmm?`bLk# z3d)dnP1`O&c$D$M`0b;87RZx6!wvi9iRq49jIu@DnJh?_m|i@}oGH3x0wFD(WIWVM zG4;?Qihn<<;kWF@nc>=DWqJs|2Jf-)YL+EjjbP#!L$q3dy9-Zx8@gp=5A+e?SYC%) zcXzjT?(IYyH=|p-+ncwyw20r>4R4>YERV$X+IZU)Nm;eI8M0KnerH~5F>GqVqgm^5 zTot&6mhT~xO2}~?8tX%!Gbg%GNuJjOz@e|o=XFr0Ce?vsk@zA#Xz-cnAiPL1e#Yh| z8;v525~WqSOmUD_Wub`@n}rOh;WajV@aVfS++_C(n=SJ2eTnbE22QU=1tNyns}u!k zYIb_X<7XA0hPUFcc(eW*QrQ~ld0*dOlwHug_Q=M4 z6J7>YN8^4`Rwk;x9}cjoTx*om+?l{{L_Uj8f#}7_;@H2=UQ*_2K8Ng zBR7KVQ3#fV+Z-T3`R@QC_Aa>!R;Hg9AYOstSOw|e None + logger.info('{}: {}'.format(name, value)) + + +def show_sys_implementation(): + # type: () -> None + logger.info('sys.implementation:') + if hasattr(sys, 'implementation'): + implementation = sys.implementation # type: ignore + implementation_name = implementation.name + else: + implementation_name = '' + + with indent_log(): + show_value('name', implementation_name) + + +def show_tags(options): + # type: (Values) -> None + tag_limit = 10 + + target_python = make_target_python(options) + tags = target_python.get_tags() + + # Display the target options that were explicitly provided. + formatted_target = target_python.format_given() + suffix = '' + if formatted_target: + suffix = ' (target: {})'.format(formatted_target) + + msg = 'Compatible tags: {}{}'.format(len(tags), suffix) + logger.info(msg) + + if options.verbose < 1 and len(tags) > tag_limit: + tags_limited = True + tags = tags[:tag_limit] + else: + tags_limited = False + + with indent_log(): + for tag in tags: + logger.info(str(tag)) + + if tags_limited: + msg = ( + '...\n' + '[First {tag_limit} tags shown. Pass --verbose to show all.]' + ).format(tag_limit=tag_limit) + logger.info(msg) + + +def ca_bundle_info(config): + levels = set() + for key, value in config.items(): + levels.add(key.split('.')[0]) + + if not levels: + return "Not specified" + + levels_that_override_global = ['install', 'wheel', 'download'] + global_overriding_level = [ + level for level in levels if level in levels_that_override_global + ] + if not global_overriding_level: + return 'global' + + levels.remove('global') + return ", ".join(levels) + + +class DebugCommand(Command): + """ + Display debug information. + """ + + usage = """ + %prog """ + ignore_require_venv = True + + def __init__(self, *args, **kw): + super(DebugCommand, self).__init__(*args, **kw) + + cmd_opts = self.cmd_opts + cmdoptions.add_target_python_options(cmd_opts) + self.parser.insert_option_group(0, cmd_opts) + self.parser.config.load() + + def run(self, options, args): + # type: (Values, List[Any]) -> int + logger.warning( + "This command is only meant for debugging. " + "Do not use this with automation for parsing and getting these " + "details, since the output and options of this command may " + "change without notice." + ) + show_value('pip version', get_pip_version()) + show_value('sys.version', sys.version) + show_value('sys.executable', sys.executable) + show_value('sys.getdefaultencoding', sys.getdefaultencoding()) + show_value('sys.getfilesystemencoding', sys.getfilesystemencoding()) + show_value( + 'locale.getpreferredencoding', locale.getpreferredencoding(), + ) + show_value('sys.platform', sys.platform) + show_sys_implementation() + + show_value("'cert' config value", ca_bundle_info(self.parser.config)) + show_value("REQUESTS_CA_BUNDLE", os.environ.get('REQUESTS_CA_BUNDLE')) + show_value("CURL_CA_BUNDLE", os.environ.get('CURL_CA_BUNDLE')) + show_value("pip._vendor.certifi.where()", where()) + + show_tags(options) + + return SUCCESS diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/debug.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/debug.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a86c9b089b73c754cb450902a1fc8046c8a4b209 GIT binary patch literal 5384 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 pq_? [package-index-options] ... + %prog [options] -r [package-index-options] ... + %prog [options] ... + %prog [options] ... + %prog [options] ...""" + + def __init__(self, *args, **kw): + super(DownloadCommand, self).__init__(*args, **kw) + + cmd_opts = self.cmd_opts + + cmd_opts.add_option(cmdoptions.constraints()) + cmd_opts.add_option(cmdoptions.requirements()) + cmd_opts.add_option(cmdoptions.build_dir()) + cmd_opts.add_option(cmdoptions.no_deps()) + cmd_opts.add_option(cmdoptions.global_options()) + cmd_opts.add_option(cmdoptions.no_binary()) + cmd_opts.add_option(cmdoptions.only_binary()) + cmd_opts.add_option(cmdoptions.prefer_binary()) + cmd_opts.add_option(cmdoptions.src()) + cmd_opts.add_option(cmdoptions.pre()) + cmd_opts.add_option(cmdoptions.no_clean()) + cmd_opts.add_option(cmdoptions.require_hashes()) + cmd_opts.add_option(cmdoptions.progress_bar()) + cmd_opts.add_option(cmdoptions.no_build_isolation()) + cmd_opts.add_option(cmdoptions.use_pep517()) + cmd_opts.add_option(cmdoptions.no_use_pep517()) + + cmd_opts.add_option( + '-d', '--dest', '--destination-dir', '--destination-directory', + dest='download_dir', + metavar='dir', + default=os.curdir, + help=("Download packages into ."), + ) + + cmdoptions.add_target_python_options(cmd_opts) + + index_opts = cmdoptions.make_option_group( + cmdoptions.index_group, + self.parser, + ) + + self.parser.insert_option_group(0, index_opts) + self.parser.insert_option_group(0, cmd_opts) + + def run(self, options, args): + options.ignore_installed = True + # editable doesn't really make sense for `pip download`, but the bowels + # of the RequirementSet code require that property. + options.editables = [] + + cmdoptions.check_dist_restriction(options) + + options.download_dir = normalize_path(options.download_dir) + + ensure_dir(options.download_dir) + + session = self.get_default_session(options) + + target_python = make_target_python(options) + finder = self._build_package_finder( + options=options, + session=session, + target_python=target_python, + ) + build_delete = (not (options.no_clean or options.build_dir)) + + with get_requirement_tracker() as req_tracker, TempDirectory( + options.build_dir, delete=build_delete, kind="download" + ) as directory: + + requirement_set = RequirementSet() + self.populate_requirement_set( + requirement_set, + args, + options, + finder, + session, + None + ) + + preparer = self.make_requirement_preparer( + temp_build_dir=directory, + options=options, + req_tracker=req_tracker, + session=session, + finder=finder, + download_dir=options.download_dir, + use_user_site=False, + ) + + resolver = self.make_resolver( + preparer=preparer, + finder=finder, + options=options, + py_version_info=options.python_version, + ) + + self.trace_basic_info(finder) + + resolver.resolve(requirement_set) + + downloaded = ' '.join([ + req.name for req in requirement_set.successfully_downloaded + ]) + if downloaded: + write_output('Successfully downloaded %s', downloaded) + + # Clean up + if not options.no_clean: + requirement_set.cleanup_files() + + return requirement_set diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/download 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/download 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0205178705613306ed737a9b02f2f161858f820e GIT binary patch literal 4720 zcmd5<&2JmW6@R;wNKvFLS#lhIwOtr+!2*$FH!WNQs^QjdfdYo(Qcl`3O%|)&A-VK^ zd1qEC1M#Gy#|Hf?`X}_-YY)BjU+Jx<{@$AfWHA>fMux|O*C}~pK zqCv~9*D2Ycv`vGyT{kJ&q_jhWj$OAX=~B8ygDtz>pyV2*+cemwbcY5zlwPO7b-UN5 zWS7!C8tjpyT$!hd3nw^We~nmWshTESP7Nss#JaymxkqJd6@=D{JHXrz>E#s zb5_RCKCets)q=M`eXY{sIkX8)UQWf(=lNNdK8b<>ESb%>=jTx7%A-y%RK#HQ#SX#SJPL&@_KNGmz%LF zy*P{1AC&%qSLrw#c}wPdx=>*}j8&-*>cbyDJNAk)pTH2WDw75MMIHvpVh8RKOJnsv z40#FpX>OFK^QsJ$7nI>RK4ms}KoJ*Skm%ggRl(ucUR1k@Rbw-}`%4PKvN%!t{(Iip zI1b1B{L?s6A}Yu{73isV7EC<@fnv(k3&5Hu%2U~CT;>^P2XCLK#gkNIjn#MO4)weT zkUa7}sq^ns?`TPhOD{d~KB-;4FHYTG@E;slnX8ia%PYdHMPEnI(P^j`0YGS;c>n*Q zN6D3NaqfO4dmSZ?_~C*%w6{vS zu}T7bE;|R+kJ66-04V)+ikcL)DB7T?P39&|0H~V`uor7<4!iaiyO~|fi`(MuI~_H?8n9=9NHXRHhnhjb2q-#-m zsp_?9gW;r#lW1W;miv(^v~-41lAi<#i|39d%-BAGPk{d{JI|8oe9ay%N;OpFoWefP zWhlPDj;M?CVWNUe@~W^qMOYE_y&Oyi7a zwG7MB<6udcwMvFEL0i{`^?7sF=ToA*mC8};fkZOs60^gij86lj4v|8K!#s)5wGKzc zVf1z~`us=3M-NXPy+56vnu#&y@%v}vhxm-L!`FxCIe=?zf+X4h+4EoMS06D+en=Lh z$}C6@LwkeJhx4pGD5ib(F)N^tFpzWGZM%EUSAN~5v+XqTZ9A>T7FJEC+t_nL4maN? zxOkpDg~Y#EC|| z90RBTDS#^s0@RqTi--;tf09X;x-$qCko@Ai&a6eqK7L4-f#@74Bv^FexL^E-W*dBm z18mLkFksCNonvB~0OZQ8^rC5jW|#5n9Qb9mfTn;ms|(IR=%zdd59knb=7L%?P$2Y% zAQsfOZ1(t;Ff(MX%{sz%lZ8lc=`cD%5ne>s7#i81ZHC3?pKj9(_}8V$9s10rx1j^B z8KiAd`4`9BrD&Vy4278lVbUS}SBFpEV?&wx8-V1me``l<9QSq*#Fv6z^Xg|L)2K{9 zft1{pQj%JWRHBTMw10yXmwKP4n$)|&1+uPYE=ooaK*0QhDl&##8)cuNK%T-?jbG_& z+(<Qoe)-~?AQi={Wg7mii<22iQ_h7DAWLq^6vyGB&*Ge!tH@Fl#) zeZTfvpJBkfgQ508eb4f1o4?0WxOn;uBYlSEK5J=iVJPyV0{p2fH+!vYQ+b(ZN+3=^ zYzg4~g|k@XFL5hX;?+vjfh zCC>qiE$USX*b)i#`?{cjt^F&SRwl+PYZ~iN(8huf`@yWLZg~ZEQ7!^0QaeDW7w`vw q_G3QCS;79PFPYztAWQWg*~EOpNTL~mcTf>scgLB3?>Rf}cH_Sws*P6w literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/download.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/download.py new file mode 100644 index 0000000..24da3eb --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/download.py @@ -0,0 +1,147 @@ +# The following comment should be removed at some point in the future. +# mypy: disallow-untyped-defs=False + +from __future__ import absolute_import + +import logging +import os + +from pip._internal.cli import cmdoptions +from pip._internal.cli.cmdoptions import make_target_python +from pip._internal.cli.req_command import RequirementCommand +from pip._internal.req import RequirementSet +from pip._internal.req.req_tracker import get_requirement_tracker +from pip._internal.utils.misc import ensure_dir, normalize_path, write_output +from pip._internal.utils.temp_dir import TempDirectory + +logger = logging.getLogger(__name__) + + +class DownloadCommand(RequirementCommand): + """ + Download packages from: + + - PyPI (and other indexes) using requirement specifiers. + - VCS project urls. + - Local project directories. + - Local or remote source archives. + + pip also supports downloading from "requirements files", which provide + an easy way to specify a whole environment to be downloaded. + """ + + usage = """ + %prog [options] [package-index-options] ... + %prog [options] -r [package-index-options] ... + %prog [options] ... + %prog [options] ... + %prog [options] ...""" + + def __init__(self, *args, **kw): + super(DownloadCommand, self).__init__(*args, **kw) + + cmd_opts = self.cmd_opts + + cmd_opts.add_option(cmdoptions.constraints()) + cmd_opts.add_option(cmdoptions.requirements()) + cmd_opts.add_option(cmdoptions.build_dir()) + cmd_opts.add_option(cmdoptions.no_deps()) + cmd_opts.add_option(cmdoptions.global_options()) + cmd_opts.add_option(cmdoptions.no_binary()) + cmd_opts.add_option(cmdoptions.only_binary()) + cmd_opts.add_option(cmdoptions.prefer_binary()) + cmd_opts.add_option(cmdoptions.src()) + cmd_opts.add_option(cmdoptions.pre()) + cmd_opts.add_option(cmdoptions.no_clean()) + cmd_opts.add_option(cmdoptions.require_hashes()) + cmd_opts.add_option(cmdoptions.progress_bar()) + cmd_opts.add_option(cmdoptions.no_build_isolation()) + cmd_opts.add_option(cmdoptions.use_pep517()) + cmd_opts.add_option(cmdoptions.no_use_pep517()) + + cmd_opts.add_option( + '-d', '--dest', '--destination-dir', '--destination-directory', + dest='download_dir', + metavar='dir', + default=os.curdir, + help=("Download packages into ."), + ) + + cmdoptions.add_target_python_options(cmd_opts) + + index_opts = cmdoptions.make_option_group( + cmdoptions.index_group, + self.parser, + ) + + self.parser.insert_option_group(0, index_opts) + self.parser.insert_option_group(0, cmd_opts) + + def run(self, options, args): + options.ignore_installed = True + # editable doesn't really make sense for `pip download`, but the bowels + # of the RequirementSet code require that property. + options.editables = [] + + cmdoptions.check_dist_restriction(options) + + options.download_dir = normalize_path(options.download_dir) + + ensure_dir(options.download_dir) + + session = self.get_default_session(options) + + target_python = make_target_python(options) + finder = self._build_package_finder( + options=options, + session=session, + target_python=target_python, + ) + build_delete = (not (options.no_clean or options.build_dir)) + + with get_requirement_tracker() as req_tracker, TempDirectory( + options.build_dir, delete=build_delete, kind="download" + ) as directory: + + requirement_set = RequirementSet() + self.populate_requirement_set( + requirement_set, + args, + options, + finder, + session, + None + ) + + preparer = self.make_requirement_preparer( + temp_build_dir=directory, + options=options, + req_tracker=req_tracker, + session=session, + finder=finder, + download_dir=options.download_dir, + use_user_site=False, + ) + + resolver = self.make_resolver( + preparer=preparer, + finder=finder, + options=options, + py_version_info=options.python_version, + ) + + self.trace_basic_info(finder) + + resolver.resolve(requirement_set) + + downloaded = ' '.join([ + req.name for req in requirement_set.successfully_downloaded + ]) + if downloaded: + write_output('Successfully downloaded %s', downloaded) + + # Clean up + if not options.no_clean: + requirement_set.cleanup_files() + + return requirement_set diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/download.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/download.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0f4162a4f39ae37eaf3b162fbcb0099d8379df7f GIT binary patch literal 4720 zcmd5(6+bgh>^O0nwCQ&H4;WP{GSVh#cY&f+s47|^AyuVJ$^u??N0XUrd))cg zxp$KFDt-#$krkhUkH9k@fET_BZ#?lk=Z+l*FZ;mDV#hc4o_p?@^Y?e|wEnrh`NiLU z`gugnr-lE|o)PK4V-n-fp_C|dXyA~;YnM`&2CnR3-l9QE<}FIsC|jq&y5(D=v`txu z1|7Rzr*wm|E)BYN-KKPtvMm~H*>#7~9%b7!*tY8pO0QA2LxUa4c4@Fn*>xIRw|iYm zZ&0>JgFSMTOOu23Cagxv1m)C>i~MrWSMTbiQklxl^CHW_ zJhpq+aBgYuSQ$%yA9R*eU7ia}6-IAW)#n%(Rzl^vu2c{wm0>w~QDtG8e5rymG-Jc| zoK*?5FKScPjo@ui->9s70c|2vR8ukZMRAs=MHn}_EyB&7_}Mdr`}>$E;wU4?9A0=6 zfpyu5gEfj_jE;|R+kJ66;04V)+irW--DBhsBOXe0$0H~V`uor7<4!ia?yO~|fi#y`&yBw9t zJr2xlt(i~mQ{1ETH6}`g?omU+X^??Z-+ReSI-a@{oafA9b%8 zMlHh~?`;ge&PmijxGtO8t;qlS-g z=;?v&C(H)Zk(70*Dxaa-Y+wk2Bu`8b$O0WDK#6KW_Ar(O%zGe@Xl^UvQPGKMD zDiU8{N7TjnC{>qHvfCZ8*$PU2z!hV9L(9(qw5rS=rb*7T zMuuhSbFd`LTBSpopsj1e`n)~!`IIPcrE=8zAdw8Z!tAiDlGD(rL!{8*ut;Nct;11y z7{8m0zWm|v@uQQ+A5EvHW@3za^3mD&5k8~*@XaB54&YjwFirPAeDdR01D{FqL$VlE z+U(<_;uUPj?>1s>vUS%ShbyAYtM-|+BDSdfqfC0#n?bOEY9246FAXjds7i|kPHyFRpfnQb&XbL#9y5J0iZpvfufGtAKTu^5Q3WVMi z#De;k%^u$tW`@kQ*_N=~VjG4gwoCc?;5$J?89~S7^M4rBj@wkp6XgjRabh>mc@*e8G;3|Xho2piZ zEloza1mn7HD@erxbt+Cwc!H~$#nM~gi^eK?3#in5!v?A*5hJ6|t`U`e#t1m^?Y z^N7QXtbHD4%IB^n4;JjNOPCD5_8Bew4|sUQ!#)p>dH9frpJ0%l&@?E?F8>Kr**D0b zr8kjfqhX}~F|+Yw8-;C02A2TvrH+EVGJHz_EZwoH^ViT-{~iN5-B#D#c5mRfX)V5;mgQhB#$=q98Kd$xWVD?J`0avv$L&jgvRi_H1A{vR-ztJ2 zE8;rkCC4~G3?s}rXKIa?FKH6~ud%#z*SG02xeDEcI+{&sZ?!vZx7+V?oiz3gYs0U& zfe#Y56r!{kjqv{EKV$+oeDueIMQ=Qa(!`ee{jb|PxO{K7Rm>2wBH)0*tZA}7cf+rF z4p?kauS&p{NNC>I1qE#FU(vKS30_&VL`Q-)7JS$bW>s~|E3k`l5lE5R0Xn^eKLE6! p@IlTB_D^%k{Qn5DRPT{Z%%_Ybnh|&x7148do%#2^v+M4({tX&?i{k(Q literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/freeze 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/freeze 2.py new file mode 100644 index 0000000..c59eb39 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/freeze 2.py @@ -0,0 +1,103 @@ +# The following comment should be removed at some point in the future. +# mypy: disallow-untyped-defs=False + +from __future__ import absolute_import + +import sys + +from pip._internal.cache import WheelCache +from pip._internal.cli import cmdoptions +from pip._internal.cli.base_command import Command +from pip._internal.models.format_control import FormatControl +from pip._internal.operations.freeze import freeze +from pip._internal.utils.compat import stdlib_pkgs + +DEV_PKGS = {'pip', 'setuptools', 'distribute', 'wheel'} + + +class FreezeCommand(Command): + """ + Output installed packages in requirements format. + + packages are listed in a case-insensitive sorted order. + """ + + usage = """ + %prog [options]""" + log_streams = ("ext://sys.stderr", "ext://sys.stderr") + + def __init__(self, *args, **kw): + super(FreezeCommand, self).__init__(*args, **kw) + + self.cmd_opts.add_option( + '-r', '--requirement', + dest='requirements', + action='append', + default=[], + metavar='file', + help="Use the order in the given requirements file and its " + "comments when generating output. This option can be " + "used multiple times.") + self.cmd_opts.add_option( + '-f', '--find-links', + dest='find_links', + action='append', + default=[], + metavar='URL', + help='URL for finding packages, which will be added to the ' + 'output.') + self.cmd_opts.add_option( + '-l', '--local', + dest='local', + action='store_true', + default=False, + help='If in a virtualenv that has global access, do not output ' + 'globally-installed packages.') + self.cmd_opts.add_option( + '--user', + dest='user', + action='store_true', + default=False, + help='Only output packages installed in user-site.') + self.cmd_opts.add_option(cmdoptions.list_path()) + self.cmd_opts.add_option( + '--all', + dest='freeze_all', + action='store_true', + help='Do not skip these packages in the output:' + ' %s' % ', '.join(DEV_PKGS)) + self.cmd_opts.add_option( + '--exclude-editable', + dest='exclude_editable', + action='store_true', + help='Exclude editable package from output.') + + self.parser.insert_option_group(0, self.cmd_opts) + + def run(self, options, args): + format_control = FormatControl(set(), set()) + wheel_cache = WheelCache(options.cache_dir, format_control) + skip = set(stdlib_pkgs) + if not options.freeze_all: + skip.update(DEV_PKGS) + + cmdoptions.check_list_path_option(options) + + freeze_kwargs = dict( + requirement=options.requirements, + find_links=options.find_links, + local_only=options.local, + user_only=options.user, + paths=options.path, + skip_regex=options.skip_requirements_regex, + isolated=options.isolated_mode, + wheel_cache=wheel_cache, + skip=skip, + exclude_editable=options.exclude_editable, + ) + + try: + for line in freeze(**freeze_kwargs): + sys.stdout.write(line + '\n') + finally: + wheel_cache.cleanup() diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/freeze 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/freeze 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..aa5a3d86e2aa05455a7a6ebe0eef3463a0f5cc83 GIT binary patch literal 3766 zcmd5<-)|eo5uW33(UKy|wj8@oa&6&&C`{5p3bY8)K&kB%MN->1$92LWJ)G{AdUeVt*BDI#?i473nD*`j2gn4%1vt1Bjp=J8IuJR5@AFE!2 zYHQ8*p6FeFL+@QW_tx}mhZbE1^EnFal`A)7_0834*#8A3w`kELyTPh^=U#J7{XJ2C ze@*=ZXgQ5OEl@>1hYoQ<^tg_n41S5=J~RxgVP!bd!{J)`Z3~h_8EZGuS(`98Fsdu& zVsYKFRC!{#ViGltYHg*TDH|O{mDri4T1jWFbZO3@`P3-i&Xq$61BnMSz~^-gVx^BF z^iu#bMnMWPQ7gGWQ@N@lo8~jW5KNE!uji@p9khVU+&@r$ZGgoLhe}IWvT3G(GI4rp z*t6kqn&!z+r}?2POCE-9$Pj!Qd}Tg$f4Lxhp5`rA^>D{Oo~QBLKTfsg{h}nnhPH6t zxpTSwwBZm9hq{O(EhX=ILJhX4RA{SOnWs?t^VHSWQCitL(kefKxybtS$oMl|97NiW z;#e7T$4?4BFYGb`%SnC01^HTej|}H+I7C2PQn({z@+j9QD+4RHu>Z;clEbP)l(!lg zrmEo(%pn}+s4v7&EZuj9F^6f%{v*e0_SPcuiGSNjQ119=)JN@YH z!ABpToE+JOwf1)(AJ6aNXO@q@9^=AU0buy~{RigpQx?e=o?BJrksfm~p|H%@<#1G< z1h=s1d-$5iXvn+K*zh*I&hpc3{$#W^*G2zA%iFtH)ATN1^t+9iUFYau!}s1kcKI(l zj?}?^pmww%r?Vy@9AI~F)v3_cS&L^8EYRLrTc+A%zM|7MEjk3UVdl(XqDPAjp5`&& ziR*yPfcu<1kUdO70?KbmM_8XFAp4F;@Sf;O2SneaQ`{r4DE!W9yEtS2tV1uy^kP6r z@@a>DB)b3oO*+FpaFrIV*QhnP z$`N5c5M~Gq6s7==>(7lCm5e|KS1z=$QZrnj9N82v9^fSryYik0V}9m1z(F^-2`$67 zYk%-A+JH%3-Y9sR1T2^BWKo!;Rlt-H++aEP>N0`(;8!e^qTqWS_Txhk=CU+a{@*fIISuyNd8;0RKz99#`Nf zxqV`-q8#>1IN<9_a21Am zlqv8fLo?)D)S8E^5Qa$+qt9un4c?IgK3&X0ylz#L8DW)RAJeZQ_w$8ME&;xB4Exe) zcbbS$W8?1NGKNe4rnRkc8;1cz6#Skin9f0=qYL^RNsYLY;ia!l>eLm;`)`{X9pK3f z%nAPnOpEr{Z|E`LwHdtzP^s4s-cT-Zz2PN<|6WE8w603H+JAbm+NLmytxjm^f6ckyZLHvb1{=#c9G literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/freeze.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/freeze.py new file mode 100644 index 0000000..c59eb39 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/freeze.py @@ -0,0 +1,103 @@ +# The following comment should be removed at some point in the future. +# mypy: disallow-untyped-defs=False + +from __future__ import absolute_import + +import sys + +from pip._internal.cache import WheelCache +from pip._internal.cli import cmdoptions +from pip._internal.cli.base_command import Command +from pip._internal.models.format_control import FormatControl +from pip._internal.operations.freeze import freeze +from pip._internal.utils.compat import stdlib_pkgs + +DEV_PKGS = {'pip', 'setuptools', 'distribute', 'wheel'} + + +class FreezeCommand(Command): + """ + Output installed packages in requirements format. + + packages are listed in a case-insensitive sorted order. + """ + + usage = """ + %prog [options]""" + log_streams = ("ext://sys.stderr", "ext://sys.stderr") + + def __init__(self, *args, **kw): + super(FreezeCommand, self).__init__(*args, **kw) + + self.cmd_opts.add_option( + '-r', '--requirement', + dest='requirements', + action='append', + default=[], + metavar='file', + help="Use the order in the given requirements file and its " + "comments when generating output. This option can be " + "used multiple times.") + self.cmd_opts.add_option( + '-f', '--find-links', + dest='find_links', + action='append', + default=[], + metavar='URL', + help='URL for finding packages, which will be added to the ' + 'output.') + self.cmd_opts.add_option( + '-l', '--local', + dest='local', + action='store_true', + default=False, + help='If in a virtualenv that has global access, do not output ' + 'globally-installed packages.') + self.cmd_opts.add_option( + '--user', + dest='user', + action='store_true', + default=False, + help='Only output packages installed in user-site.') + self.cmd_opts.add_option(cmdoptions.list_path()) + self.cmd_opts.add_option( + '--all', + dest='freeze_all', + action='store_true', + help='Do not skip these packages in the output:' + ' %s' % ', '.join(DEV_PKGS)) + self.cmd_opts.add_option( + '--exclude-editable', + dest='exclude_editable', + action='store_true', + help='Exclude editable package from output.') + + self.parser.insert_option_group(0, self.cmd_opts) + + def run(self, options, args): + format_control = FormatControl(set(), set()) + wheel_cache = WheelCache(options.cache_dir, format_control) + skip = set(stdlib_pkgs) + if not options.freeze_all: + skip.update(DEV_PKGS) + + cmdoptions.check_list_path_option(options) + + freeze_kwargs = dict( + requirement=options.requirements, + find_links=options.find_links, + local_only=options.local, + user_only=options.user, + paths=options.path, + skip_regex=options.skip_requirements_regex, + isolated=options.isolated_mode, + wheel_cache=wheel_cache, + skip=skip, + exclude_editable=options.exclude_editable, + ) + + try: + for line in freeze(**freeze_kwargs): + sys.stdout.write(line + '\n') + finally: + wheel_cache.cleanup() diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/freeze.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/freeze.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6b24aee24186625cdc3f4441c747d95d8f0d5f3e GIT binary patch literal 3766 zcmd5<+j1Mn5$(mD5J^*%L|KY#Z<109l@b8?QgO;4l!v_fbPqtmlHMJH7|!(c^h|f3J~M3ocdLK$pU?gg)AFZ< zzx(?{=HKWf`1ME=WgbmD@_5`J-JnTB=9;9Nl(lHma&s-xZOS?{>9}#5beFOoO?qzJ zA-zFapC)}b?vlPj*(Oak-MB}3i?VH+Y-7AZNuQD{lx)%*Tf9Zd7O5UhJxaFed!h@X zzfE@dKu-p5;jk&bH1N<^9!3YI(6v=znw3RmAGw)6W}eNJ(hs6|u3pOGEGbHx7P)b< zF7zH0Sr+Aq6Kp~7Wl?33eNg1KDzp=KAf8rAy;$11g0ZoQP7lKJaAs^1<1#HR?`xE; zOIsA$$S_Hbt2xS~GT<|s6EuAvKaXo$*49sRVXu4>$*A{FtsCdElYYTukz;6e;tuMGr$*wH8CJV0f4oDxX-hgUr z&Gw$?-F!{&ZMyK*^lXO~T?X?73hbpTw`BG0)oR%P1toWA(IdOTs(Tk+b4~pnQGa($ z{XJ+ojXo_VXhK6QV&Abg(YEm!q$&p)20@!UU7wdVbzB*BKZaNfCd zx&5@^5DkaAh$Af}?|MQFwy0ESt6G_-Q2OK4)z(p3**elHKZ3c)`t!*6GhG}++K=K` z8FSB13O_IGG6Ks92&VE&OR!WGf`NyMXg6fi`uis(`uK_Rxf3nx{4lWdP<60U4KkWRC|7 zZFcm_NE;O}T2OREOnYG&*|}hOQKY$8c=*L%!f*cc)f1_PGO9Sh*Pza%SlOk$a8?y{ zIbcZ1YNPa2I#Gpdg10z49-t*@Oo`sOtkR>%sxiuFJS{Y+(Tr#1IC;L9z4&PQ{{4gZ zKRi7>vI}eN#~&Wg@8f5dkG~z`!dU@e_`%1&do&4HBwu)LRh372%*BMlGGmv+QF$8N z!KUxvYra84-mS)lx8Ze`pKkLfqqVs%`j=YX-sPI6clEO0ZN%(4NB;)C5B9Ok|Il%y z4)z1JqXjvgHwobYyMwFFgs#q8Jd0p~_RiZf)h6>bowaGvA&?C-XAToRT5Rw%j{#3y z2W$r1=j?&(VG`W~I(9)U&ScUIfQ8T;oQdNHPx0U^m} z9r`EH!|!g>Iqre$w75ZwJv!_1yX7Vy>215mKHbJL+`Ibz6{MrmJzu|t-*DU z2=jq3Ls+0N1$bP4Zp5f$1Uk5Kp@o&2;R5Bzrg-rHFNxTd_e2=;GsgiAy1{K|8NOZn zgSXKJO!D$Z!P_KYxojtk!X&K%ri|bg%ehyV3Cst-VxbfT-|Mg+AA&HKrLig>xjxd^ z27I%KV*zUiysex^>gXm$ODA4FJeD5u!j(s1RwPPJA8-WRkx$)Kgf|2DU+VR^0!PX1 z6KfUas5cHvz_cOK<*Ot34GXr>xF=2+yC+>RV(l?c^5#o&J3N*WWruJrD5+0rewHE? z*Q+}JGmc|^i-x=#-mbTaO515{H9Gja{^7dZY&N}X-krvPbN0pu*BgZczODpUVVFmm z0$(yTL(WC5dB_T3m=rPkoR-?)9Vy_`#Vo|@Rz;Z+Rtfeo{W5YtU-;w_;48)#r*^ikW%n c{~tLs`+1T+eKaJhyk5dAVcK`qY literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/hash 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/hash 2.py new file mode 100644 index 0000000..1dc7fb0 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/hash 2.py @@ -0,0 +1,58 @@ +# The following comment should be removed at some point in the future. +# mypy: disallow-untyped-defs=False + +from __future__ import absolute_import + +import hashlib +import logging +import sys + +from pip._internal.cli.base_command import Command +from pip._internal.cli.status_codes import ERROR +from pip._internal.utils.hashes import FAVORITE_HASH, STRONG_HASHES +from pip._internal.utils.misc import read_chunks, write_output + +logger = logging.getLogger(__name__) + + +class HashCommand(Command): + """ + Compute a hash of a local package archive. + + These can be used with --hash in a requirements file to do repeatable + installs. + """ + + usage = '%prog [options] ...' + ignore_require_venv = True + + def __init__(self, *args, **kw): + super(HashCommand, self).__init__(*args, **kw) + self.cmd_opts.add_option( + '-a', '--algorithm', + dest='algorithm', + choices=STRONG_HASHES, + action='store', + default=FAVORITE_HASH, + help='The hash algorithm to use: one of %s' % + ', '.join(STRONG_HASHES)) + self.parser.insert_option_group(0, self.cmd_opts) + + def run(self, options, args): + if not args: + self.parser.print_usage(sys.stderr) + return ERROR + + algorithm = options.algorithm + for path in args: + write_output('%s:\n--hash=%s:%s', + path, algorithm, _hash_of_file(path, algorithm)) + + +def _hash_of_file(path, algorithm): + """Return the hash digest of a file.""" + with open(path, 'rb') as archive: + hash = hashlib.new(algorithm) + for chunk in read_chunks(archive): + hash.update(chunk) + return hash.hexdigest() diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/hash 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/hash 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3ac3ee0babda5324dcf1fe78bb72dff5071eb89f GIT binary patch literal 2716 zcmc&#-EQ1O6h5~1C%Z|SG(jmK3T{QD1$B2@wGvX)RtZfYNGJhsN?=j2y!Ncu8~?>K zP8yV4gaNz9keXaXDgGzB8iiPk3*PoQ>u~ZA_pA`}I%Sx4(O0mMO zCnvMru2anpez}QMKY}0-0s=#e)FN7o1kzdOpg6h)1(p_?U7uyKi zvnSZa&c=}9%=cnD_xxio#7yB&qEpdpYyE?Xkiz!8)E)`Dlp?UtA~mtQUA;U?vAhr` zWmJenq)OW3C>FNL>>$HXw&(Rc<3v3*gV4wLr=rFK*k}>XjlCkM_y*SK(*d$S$*+598 zS`coAnJoS!i+oHqc*f`OupgpOSs@fF1Y+!!vC=jsBF^Qf7(}uwSgwt6Dv|XKJ4*$F zwJxqcp$TvvDeByf>psaV?!bO#PO?7qV})=o^bDAn%f zULi%HRxts{An{`8yJ3-)dFOh86!BQE^omd_PSNpM2QBGFrjYu15uJKU^iRE_KhEMn z6tW-Y{orI8{`zeEB{1A$Zj@v`M`8I zB4>@~m;kfW6Fa4n|g@=cbTrP zn`A*5bC+Xt-5~QJbHr7?n8XJ~DJs5(DbANWD@g9CNKZ8>oKK*26TOyhgPo9 zH5v^Qvv&iDUO{qyX!J*0d;HqHLMG<)+`Jv`bl! zydGsMN6kPR1J8um6MdUkuA%w* z@sE4r+x=($^T*@oW@NlC_IAH9{b%DwaRrK%3?e_A)%i=MSJ6MN66{yhx~#Qkh3A2q zEp|IgH9Pp#4pMy+fubamlI1;$Gm=wOmcV=2j%4$@Q&O;3FYkG9LIh}~a`QYS^OUbqi<^&@vU z9EKdPgO4%U+d%|}5Hx-ky#|^#&24%O*`_~VR$l$Bt^dKr!HCwZcM-*mz(@{wYtSv!bK2M!5#UvQ3%6Z0a;jk{$~ zDOu@FOaL-Sycqg^TorZMKU<(=IyEbUDps0P^zyimmQ15^NTae!jsh)5M?p237HK3a zHHynobU2THyF0yoYjXR}$;pwPYpw6yIiB6Z6X&D-QJIv31z!eV-1~CZ6Fg)-M5bkx z2k9tm4x}0}6^G@C*ua+8@TvFEkoAGp#oJlDj&<1z*?Go+bM#~fngM zD9ivgpA;fLf=lunHY0f*clxx3MIDMKuR3{B_lt#iT!FB{wOfZ{FW$`&=znJ=bVEP=9 z*y1@Rz~VHCt31lf3`k|5XBUc&iL9#g&)|`|goXgjrq!~$)*2*}k_C73Ad}!O)7AI0 zBC1pFa%{dI6(MAfxXBljc)zM;!`C>+`SKS9$v=|$ks*cn1X}0O8|fkl${}3Ar#Q4u zr(=Vhc6T*oggGRhH?;f#0*W1q5egc3_1ArRV{`3msvgM6jJ!@rDoBa$(-)h}OVANT z5Oiev9uDc?0M+pOpLiJMjtiRM*L9c|QrA`P>bE5)N@CQj=0adr4b73RCcAyZI?i)Z zqQtY0%)T_47)Wz@EZBEbJL)pRaX0mFCSNrs8+v}sTN*a9fyEtTn90TrpyouY-ra4&DtKnI#8ir{y zoCHexi=rj?etU-=u1Q@hXyR@$hhMYN|J$o|f}5062OY-LRCE3QI~21-g$AXjgfI@M zHQ&K!+!`)=20e~paf=Af#5oohbz)3Gc+ix9M@&Ie+BfV~3$MLlZCG2@mc8z5-S`jd C-+7Dx literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/help 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/help 2.py new file mode 100644 index 0000000..75af999 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/help 2.py @@ -0,0 +1,41 @@ +# The following comment should be removed at some point in the future. +# mypy: disallow-untyped-defs=False + +from __future__ import absolute_import + +from pip._internal.cli.base_command import Command +from pip._internal.cli.status_codes import SUCCESS +from pip._internal.exceptions import CommandError + + +class HelpCommand(Command): + """Show help for commands""" + + usage = """ + %prog """ + ignore_require_venv = True + + def run(self, options, args): + from pip._internal.commands import ( + commands_dict, create_command, get_similar_commands, + ) + + try: + # 'pip help' with no args is handled by pip.__init__.parseopt() + cmd_name = args[0] # the command we need help for + except IndexError: + return SUCCESS + + if cmd_name not in commands_dict: + guess = get_similar_commands(cmd_name) + + msg = ['unknown command "%s"' % cmd_name] + if guess: + msg.append('maybe you meant "%s"' % guess) + + raise CommandError(' - '.join(msg)) + + command = create_command(cmd_name) + command.parser.print_help() + + return SUCCESS diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/help 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/help 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a933d615884843436592e6078e685326a2231ebb GIT binary patch literal 1611 zcmc&!&2HO95S}F^N>(i=Xi_5uf`Uj9fESwyQXrSqaO)aqFF`>iXsbgBT3peT`Ip_L z92HUzO`oAJ(iiBp&(jy^H%rL|(%wUJS3BSA&d&GE(C$Cu(cgc4`SXmnkBi^aQzAXZ zBE>7HASwk-1qrqtDjX_Zn!26sQqiNbPt$&9_o(ow9ME(CyHC=kxuDde--+H4{WKj? zI-p4~MED$o0)ffg!IWI+x@e7z^RlUx=^O(%&g!yEs`M6^ygoZSpG-Pn|8~c@QaJb# zfNy2dY>(YgQOWaSPOlKX>wU#`C^fAs(5#~=Ua1YC8<=nVbI<$dwE^Q#)>VVcZlTSAu z{ZM^OJ=3GB5vdarLYO{Heq4LBcIj$B>JM7?3FbRNn*pURuMaaALt4ZAE3JpL@F?xE zd5B%2g2vd{rvg#GJqyOl!eq=)5t1~ER`PYMU7DG zXcDERvgaBFEaq|t90qkj{bVtRfJAj;^19L%OjM@dznJ@aR;F>4loC~g4z1MM@P(z$ zY=~{n0U)xIMinT;wM&Q?E)x~b>mrp(hglP*Zx-1vU(BCAxp?|)wOX2mG3NQR>&qv2 zvMPKPLXe{z86`z=^wl@#`uo=m*>R&&xYH?QTF1@GCZt;Q8Mr;l}!&=sWvj z-x&)}+;<*eJ$3>sDKm>LuQ;|k#c^4uZ6RUuhB!{^8P-g?)d}j)!o5nZ)dV=G~22+!w)Z%VSQe7ML)4$1p{}Ty8?gi Ezs%@+MF0Q* literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/help.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/help.py new file mode 100644 index 0000000..75af999 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/help.py @@ -0,0 +1,41 @@ +# The following comment should be removed at some point in the future. +# mypy: disallow-untyped-defs=False + +from __future__ import absolute_import + +from pip._internal.cli.base_command import Command +from pip._internal.cli.status_codes import SUCCESS +from pip._internal.exceptions import CommandError + + +class HelpCommand(Command): + """Show help for commands""" + + usage = """ + %prog """ + ignore_require_venv = True + + def run(self, options, args): + from pip._internal.commands import ( + commands_dict, create_command, get_similar_commands, + ) + + try: + # 'pip help' with no args is handled by pip.__init__.parseopt() + cmd_name = args[0] # the command we need help for + except IndexError: + return SUCCESS + + if cmd_name not in commands_dict: + guess = get_similar_commands(cmd_name) + + msg = ['unknown command "%s"' % cmd_name] + if guess: + msg.append('maybe you meant "%s"' % guess) + + raise CommandError(' - '.join(msg)) + + command = create_command(cmd_name) + command.parser.print_help() + + return SUCCESS diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/help.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/help.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ce43b4f4c0bff19c69af8874e48684588fb0fdf4 GIT binary patch literal 1611 zcmc&!&2HO95S}F^N>(i=Xi_5uf`Uj9Ko^@y6Ev69Flq#7FFsHy+VW6>7FRT7{$+P5 zTZPm^(`V?5^a=V*eSv~#@$TadOoK9E^eTZp#Szr5?2xKui{fpjiyAl>SK);5#RHy-_1 zeM&vkqpK0A6B0t0K23jGd$e}xYC!5wTK5U&dqJB4r7o`zGZ;f!!~GkrhqUl0?Xh`? zU7~`<*x9EAwhZ|o-rofQUt?DnYLC`?w7@&!QrSx<9`Zi#3dNkv7}HLGIL&9q95A9} zg2HVb<{_X=npo#$ULVW#mVh#a`>c-@Cr7f7KOn-PW_w}qy<0>g7ss#S|isI<2S6`n;AwzcD>J;pB3YgY$v$6@P7JUY8k2w?ZxaT?tVl4X3zSwuh z!V?djM_7-YiItR@#gK zuFdhgl+`l)4EUW4A4`jn^W^^0Owkjbi{YG4_F!#^&Rf$W={N*L<_k<8v|*7SUnKhW z3kdB$wg2CTN|{#Un@FYZ8uQVA;>nwt>>ACss?G4@3uRcJ*Im(1>{r3SedoTwpZhPR Cf_fSN literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/install 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/install 2.py new file mode 100644 index 0000000..02a187c --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/install 2.py @@ -0,0 +1,701 @@ +# The following comment should be removed at some point in the future. +# It's included for now because without it InstallCommand.run() has a +# couple errors where we have to know req.name is str rather than +# Optional[str] for the InstallRequirement req. +# mypy: strict-optional=False +# mypy: disallow-untyped-defs=False + +from __future__ import absolute_import + +import errno +import logging +import operator +import os +import shutil +import site +from optparse import SUPPRESS_HELP + +from pip._vendor import pkg_resources +from pip._vendor.packaging.utils import canonicalize_name + +from pip._internal.cache import WheelCache +from pip._internal.cli import cmdoptions +from pip._internal.cli.cmdoptions import make_target_python +from pip._internal.cli.req_command import RequirementCommand +from pip._internal.cli.status_codes import ERROR, SUCCESS +from pip._internal.exceptions import ( + CommandError, + InstallationError, + PreviousBuildDirError, +) +from pip._internal.locations import distutils_scheme +from pip._internal.operations.check import check_install_conflicts +from pip._internal.req import RequirementSet, install_given_reqs +from pip._internal.req.req_tracker import get_requirement_tracker +from pip._internal.utils.deprecation import deprecated +from pip._internal.utils.distutils_args import parse_distutils_args +from pip._internal.utils.filesystem import test_writable_dir +from pip._internal.utils.misc import ( + ensure_dir, + get_installed_version, + protect_pip_from_modification_on_windows, + write_output, +) +from pip._internal.utils.temp_dir import TempDirectory +from pip._internal.utils.typing import MYPY_CHECK_RUNNING +from pip._internal.utils.virtualenv import virtualenv_no_global +from pip._internal.wheel_builder import build, should_build_for_install_command + +if MYPY_CHECK_RUNNING: + from optparse import Values + from typing import Any, Iterable, List, Optional + + from pip._internal.models.format_control import FormatControl + from pip._internal.req.req_install import InstallRequirement + from pip._internal.wheel_builder import BinaryAllowedPredicate + + +logger = logging.getLogger(__name__) + + +def get_check_binary_allowed(format_control): + # type: (FormatControl) -> BinaryAllowedPredicate + def check_binary_allowed(req): + # type: (InstallRequirement) -> bool + if req.use_pep517: + return True + canonical_name = canonicalize_name(req.name) + allowed_formats = format_control.get_allowed_formats(canonical_name) + return "binary" in allowed_formats + + return check_binary_allowed + + +class InstallCommand(RequirementCommand): + """ + Install packages from: + + - PyPI (and other indexes) using requirement specifiers. + - VCS project urls. + - Local project directories. + - Local or remote source archives. + + pip also supports installing from "requirements files", which provide + an easy way to specify a whole environment to be installed. + """ + + usage = """ + %prog [options] [package-index-options] ... + %prog [options] -r [package-index-options] ... + %prog [options] [-e] ... + %prog [options] [-e] ... + %prog [options] ...""" + + def __init__(self, *args, **kw): + super(InstallCommand, self).__init__(*args, **kw) + + cmd_opts = self.cmd_opts + + cmd_opts.add_option(cmdoptions.requirements()) + cmd_opts.add_option(cmdoptions.constraints()) + cmd_opts.add_option(cmdoptions.no_deps()) + cmd_opts.add_option(cmdoptions.pre()) + + cmd_opts.add_option(cmdoptions.editable()) + cmd_opts.add_option( + '-t', '--target', + dest='target_dir', + metavar='dir', + default=None, + help='Install packages into . ' + 'By default this will not replace existing files/folders in ' + '. Use --upgrade to replace existing packages in ' + 'with new versions.' + ) + cmdoptions.add_target_python_options(cmd_opts) + + cmd_opts.add_option( + '--user', + dest='use_user_site', + action='store_true', + help="Install to the Python user install directory for your " + "platform. Typically ~/.local/, or %APPDATA%\\Python on " + "Windows. (See the Python documentation for site.USER_BASE " + "for full details.)") + cmd_opts.add_option( + '--no-user', + dest='use_user_site', + action='store_false', + help=SUPPRESS_HELP) + cmd_opts.add_option( + '--root', + dest='root_path', + metavar='dir', + default=None, + help="Install everything relative to this alternate root " + "directory.") + cmd_opts.add_option( + '--prefix', + dest='prefix_path', + metavar='dir', + default=None, + help="Installation prefix where lib, bin and other top-level " + "folders are placed") + + cmd_opts.add_option(cmdoptions.build_dir()) + + cmd_opts.add_option(cmdoptions.src()) + + cmd_opts.add_option( + '-U', '--upgrade', + dest='upgrade', + action='store_true', + help='Upgrade all specified packages to the newest available ' + 'version. The handling of dependencies depends on the ' + 'upgrade-strategy used.' + ) + + cmd_opts.add_option( + '--upgrade-strategy', + dest='upgrade_strategy', + default='only-if-needed', + choices=['only-if-needed', 'eager'], + help='Determines how dependency upgrading should be handled ' + '[default: %default]. ' + '"eager" - dependencies are upgraded regardless of ' + 'whether the currently installed version satisfies the ' + 'requirements of the upgraded package(s). ' + '"only-if-needed" - are upgraded only when they do not ' + 'satisfy the requirements of the upgraded package(s).' + ) + + cmd_opts.add_option( + '--force-reinstall', + dest='force_reinstall', + action='store_true', + help='Reinstall all packages even if they are already ' + 'up-to-date.') + + cmd_opts.add_option( + '-I', '--ignore-installed', + dest='ignore_installed', + action='store_true', + help='Ignore the installed packages, overwriting them. ' + 'This can break your system if the existing package ' + 'is of a different version or was installed ' + 'with a different package manager!' + ) + + cmd_opts.add_option(cmdoptions.ignore_requires_python()) + cmd_opts.add_option(cmdoptions.no_build_isolation()) + cmd_opts.add_option(cmdoptions.use_pep517()) + cmd_opts.add_option(cmdoptions.no_use_pep517()) + + cmd_opts.add_option(cmdoptions.install_options()) + cmd_opts.add_option(cmdoptions.global_options()) + + cmd_opts.add_option( + "--compile", + action="store_true", + dest="compile", + default=True, + help="Compile Python source files to bytecode", + ) + + cmd_opts.add_option( + "--no-compile", + action="store_false", + dest="compile", + help="Do not compile Python source files to bytecode", + ) + + cmd_opts.add_option( + "--no-warn-script-location", + action="store_false", + dest="warn_script_location", + default=True, + help="Do not warn when installing scripts outside PATH", + ) + cmd_opts.add_option( + "--no-warn-conflicts", + action="store_false", + dest="warn_about_conflicts", + default=True, + help="Do not warn about broken dependencies", + ) + + cmd_opts.add_option(cmdoptions.no_binary()) + cmd_opts.add_option(cmdoptions.only_binary()) + cmd_opts.add_option(cmdoptions.prefer_binary()) + cmd_opts.add_option(cmdoptions.no_clean()) + cmd_opts.add_option(cmdoptions.require_hashes()) + cmd_opts.add_option(cmdoptions.progress_bar()) + + index_opts = cmdoptions.make_option_group( + cmdoptions.index_group, + self.parser, + ) + + self.parser.insert_option_group(0, index_opts) + self.parser.insert_option_group(0, cmd_opts) + + def run(self, options, args): + # type: (Values, List[Any]) -> int + cmdoptions.check_install_build_global(options) + upgrade_strategy = "to-satisfy-only" + if options.upgrade: + upgrade_strategy = options.upgrade_strategy + + cmdoptions.check_dist_restriction(options, check_target=True) + + install_options = options.install_options or [] + + options.use_user_site = decide_user_install( + options.use_user_site, + prefix_path=options.prefix_path, + target_dir=options.target_dir, + root_path=options.root_path, + isolated_mode=options.isolated_mode, + ) + + target_temp_dir = None # type: Optional[TempDirectory] + target_temp_dir_path = None # type: Optional[str] + if options.target_dir: + options.ignore_installed = True + options.target_dir = os.path.abspath(options.target_dir) + if (os.path.exists(options.target_dir) and not + os.path.isdir(options.target_dir)): + raise CommandError( + "Target path exists but is not a directory, will not " + "continue." + ) + + # Create a target directory for using with the target option + target_temp_dir = TempDirectory(kind="target") + target_temp_dir_path = target_temp_dir.path + + global_options = options.global_options or [] + + session = self.get_default_session(options) + + target_python = make_target_python(options) + finder = self._build_package_finder( + options=options, + session=session, + target_python=target_python, + ignore_requires_python=options.ignore_requires_python, + ) + build_delete = (not (options.no_clean or options.build_dir)) + wheel_cache = WheelCache(options.cache_dir, options.format_control) + + with get_requirement_tracker() as req_tracker, TempDirectory( + options.build_dir, delete=build_delete, kind="install" + ) as directory: + requirement_set = RequirementSet( + check_supported_wheels=not options.target_dir, + ) + + try: + self.populate_requirement_set( + requirement_set, args, options, finder, session, + wheel_cache + ) + + warn_deprecated_install_options( + requirement_set, options.install_options + ) + + preparer = self.make_requirement_preparer( + temp_build_dir=directory, + options=options, + req_tracker=req_tracker, + session=session, + finder=finder, + use_user_site=options.use_user_site, + ) + resolver = self.make_resolver( + preparer=preparer, + finder=finder, + options=options, + wheel_cache=wheel_cache, + use_user_site=options.use_user_site, + ignore_installed=options.ignore_installed, + ignore_requires_python=options.ignore_requires_python, + force_reinstall=options.force_reinstall, + upgrade_strategy=upgrade_strategy, + use_pep517=options.use_pep517, + ) + + self.trace_basic_info(finder) + + resolver.resolve(requirement_set) + + try: + pip_req = requirement_set.get_requirement("pip") + except KeyError: + modifying_pip = None + else: + # If we're not replacing an already installed pip, + # we're not modifying it. + modifying_pip = pip_req.satisfied_by is None + protect_pip_from_modification_on_windows( + modifying_pip=modifying_pip + ) + + check_binary_allowed = get_check_binary_allowed( + finder.format_control + ) + + reqs_to_build = [ + r for r in requirement_set.requirements.values() + if should_build_for_install_command( + r, check_binary_allowed + ) + ] + + _, build_failures = build( + reqs_to_build, + wheel_cache=wheel_cache, + build_options=[], + global_options=[], + ) + + # If we're using PEP 517, we cannot do a direct install + # so we fail here. + # We don't care about failures building legacy + # requirements, as we'll fall through to a direct + # install for those. + pep517_build_failures = [ + r for r in build_failures if r.use_pep517 + ] + if pep517_build_failures: + raise InstallationError( + "Could not build wheels for {} which use" + " PEP 517 and cannot be installed directly".format( + ", ".join(r.name for r in pep517_build_failures))) + + to_install = resolver.get_installation_order( + requirement_set + ) + + # Consistency Checking of the package set we're installing. + should_warn_about_conflicts = ( + not options.ignore_dependencies and + options.warn_about_conflicts + ) + if should_warn_about_conflicts: + self._warn_about_conflicts(to_install) + + # Don't warn about script install locations if + # --target has been specified + warn_script_location = options.warn_script_location + if options.target_dir: + warn_script_location = False + + installed = install_given_reqs( + to_install, + install_options, + global_options, + root=options.root_path, + home=target_temp_dir_path, + prefix=options.prefix_path, + pycompile=options.compile, + warn_script_location=warn_script_location, + use_user_site=options.use_user_site, + ) + + lib_locations = get_lib_location_guesses( + user=options.use_user_site, + home=target_temp_dir_path, + root=options.root_path, + prefix=options.prefix_path, + isolated=options.isolated_mode, + ) + working_set = pkg_resources.WorkingSet(lib_locations) + + installed.sort(key=operator.attrgetter('name')) + items = [] + for result in installed: + item = result.name + try: + installed_version = get_installed_version( + result.name, working_set=working_set + ) + if installed_version: + item += '-' + installed_version + except Exception: + pass + items.append(item) + installed_desc = ' '.join(items) + if installed_desc: + write_output( + 'Successfully installed %s', installed_desc, + ) + except EnvironmentError as error: + show_traceback = (self.verbosity >= 1) + + message = create_env_error_message( + error, show_traceback, options.use_user_site, + ) + logger.error(message, exc_info=show_traceback) + + return ERROR + except PreviousBuildDirError: + options.no_clean = True + raise + finally: + # Clean up + if not options.no_clean: + requirement_set.cleanup_files() + wheel_cache.cleanup() + + if options.target_dir: + self._handle_target_dir( + options.target_dir, target_temp_dir, options.upgrade + ) + + return SUCCESS + + def _handle_target_dir(self, target_dir, target_temp_dir, upgrade): + ensure_dir(target_dir) + + # Checking both purelib and platlib directories for installed + # packages to be moved to target directory + lib_dir_list = [] + + with target_temp_dir: + # Checking both purelib and platlib directories for installed + # packages to be moved to target directory + scheme = distutils_scheme('', home=target_temp_dir.path) + purelib_dir = scheme['purelib'] + platlib_dir = scheme['platlib'] + data_dir = scheme['data'] + + if os.path.exists(purelib_dir): + lib_dir_list.append(purelib_dir) + if os.path.exists(platlib_dir) and platlib_dir != purelib_dir: + lib_dir_list.append(platlib_dir) + if os.path.exists(data_dir): + lib_dir_list.append(data_dir) + + for lib_dir in lib_dir_list: + for item in os.listdir(lib_dir): + if lib_dir == data_dir: + ddir = os.path.join(data_dir, item) + if any(s.startswith(ddir) for s in lib_dir_list[:-1]): + continue + target_item_dir = os.path.join(target_dir, item) + if os.path.exists(target_item_dir): + if not upgrade: + logger.warning( + 'Target directory %s already exists. Specify ' + '--upgrade to force replacement.', + target_item_dir + ) + continue + if os.path.islink(target_item_dir): + logger.warning( + 'Target directory %s already exists and is ' + 'a link. Pip will not automatically replace ' + 'links, please remove if replacement is ' + 'desired.', + target_item_dir + ) + continue + if os.path.isdir(target_item_dir): + shutil.rmtree(target_item_dir) + else: + os.remove(target_item_dir) + + shutil.move( + os.path.join(lib_dir, item), + target_item_dir + ) + + def _warn_about_conflicts(self, to_install): + try: + package_set, _dep_info = check_install_conflicts(to_install) + except Exception: + logger.error("Error checking for conflicts.", exc_info=True) + return + missing, conflicting = _dep_info + + # NOTE: There is some duplication here from pip check + for project_name in missing: + version = package_set[project_name][0] + for dependency in missing[project_name]: + logger.critical( + "%s %s requires %s, which is not installed.", + project_name, version, dependency[1], + ) + + for project_name in conflicting: + version = package_set[project_name][0] + for dep_name, dep_version, req in conflicting[project_name]: + logger.critical( + "%s %s has requirement %s, but you'll have %s %s which is " + "incompatible.", + project_name, version, req, dep_name, dep_version, + ) + + +def get_lib_location_guesses(*args, **kwargs): + scheme = distutils_scheme('', *args, **kwargs) + return [scheme['purelib'], scheme['platlib']] + + +def site_packages_writable(**kwargs): + return all( + test_writable_dir(d) for d in set(get_lib_location_guesses(**kwargs)) + ) + + +def decide_user_install( + use_user_site, # type: Optional[bool] + prefix_path=None, # type: Optional[str] + target_dir=None, # type: Optional[str] + root_path=None, # type: Optional[str] + isolated_mode=False, # type: bool +): + # type: (...) -> bool + """Determine whether to do a user install based on the input options. + + If use_user_site is False, no additional checks are done. + If use_user_site is True, it is checked for compatibility with other + options. + If use_user_site is None, the default behaviour depends on the environment, + which is provided by the other arguments. + """ + # In some cases (config from tox), use_user_site can be set to an integer + # rather than a bool, which 'use_user_site is False' wouldn't catch. + if (use_user_site is not None) and (not use_user_site): + logger.debug("Non-user install by explicit request") + return False + + if use_user_site: + if prefix_path: + raise CommandError( + "Can not combine '--user' and '--prefix' as they imply " + "different installation locations" + ) + if virtualenv_no_global(): + raise InstallationError( + "Can not perform a '--user' install. User site-packages " + "are not visible in this virtualenv." + ) + logger.debug("User install by explicit request") + return True + + # If we are here, user installs have not been explicitly requested/avoided + assert use_user_site is None + + # user install incompatible with --prefix/--target + if prefix_path or target_dir: + logger.debug("Non-user install due to --prefix or --target option") + return False + + # If user installs are not enabled, choose a non-user install + if not site.ENABLE_USER_SITE: + logger.debug("Non-user install because user site-packages disabled") + return False + + # If we have permission for a non-user install, do that, + # otherwise do a user install. + if site_packages_writable(root=root_path, isolated=isolated_mode): + logger.debug("Non-user install because site-packages writeable") + return False + + logger.info("Defaulting to user installation because normal site-packages " + "is not writeable") + return True + + +def warn_deprecated_install_options(requirement_set, options): + # type: (RequirementSet, Optional[List[str]]) -> None + """If any location-changing --install-option arguments were passed for + requirements or on the command-line, then show a deprecation warning. + """ + def format_options(option_names): + # type: (Iterable[str]) -> List[str] + return ["--{}".format(name.replace("_", "-")) for name in option_names] + + requirements = ( + requirement_set.unnamed_requirements + + list(requirement_set.requirements.values()) + ) + + offenders = [] + + for requirement in requirements: + install_options = requirement.options.get("install_options", []) + location_options = parse_distutils_args(install_options) + if location_options: + offenders.append( + "{!r} from {}".format( + format_options(location_options.keys()), requirement + ) + ) + + if options: + location_options = parse_distutils_args(options) + if location_options: + offenders.append( + "{!r} from command line".format( + format_options(location_options.keys()) + ) + ) + + if not offenders: + return + + deprecated( + reason=( + "Location-changing options found in --install-option: {}. " + "This configuration may cause unexpected behavior and is " + "unsupported.".format( + "; ".join(offenders) + ) + ), + replacement=( + "using pip-level options like --user, --prefix, --root, and " + "--target" + ), + gone_in="20.2", + issue=7309, + ) + + +def create_env_error_message(error, show_traceback, using_user_site): + """Format an error message for an EnvironmentError + + It may occur anytime during the execution of the install command. + """ + parts = [] + + # Mention the error if we are not going to show a traceback + parts.append("Could not install packages due to an EnvironmentError") + if not show_traceback: + parts.append(": ") + parts.append(str(error)) + else: + parts.append(".") + + # Spilt the error indication from a helper message (if any) + parts[-1] += "\n" + + # Suggest useful actions to the user: + # (1) using user site-packages or (2) verifying the permissions + if error.errno == errno.EACCES: + user_option_part = "Consider using the `--user` option" + permissions_part = "Check the permissions" + + if not using_user_site: + parts.extend([ + user_option_part, " or ", + permissions_part.lower(), + ]) + else: + parts.append(permissions_part) + parts.append(".\n") + + return "".join(parts).strip() + "\n" diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/install 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/install 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2b1c83d753a4163f723ca49e1264eb743a4819f0 GIT binary patch literal 19513 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 fU~$MP BinaryAllowedPredicate + def check_binary_allowed(req): + # type: (InstallRequirement) -> bool + if req.use_pep517: + return True + canonical_name = canonicalize_name(req.name) + allowed_formats = format_control.get_allowed_formats(canonical_name) + return "binary" in allowed_formats + + return check_binary_allowed + + +class InstallCommand(RequirementCommand): + """ + Install packages from: + + - PyPI (and other indexes) using requirement specifiers. + - VCS project urls. + - Local project directories. + - Local or remote source archives. + + pip also supports installing from "requirements files", which provide + an easy way to specify a whole environment to be installed. + """ + + usage = """ + %prog [options] [package-index-options] ... + %prog [options] -r [package-index-options] ... + %prog [options] [-e] ... + %prog [options] [-e] ... + %prog [options] ...""" + + def __init__(self, *args, **kw): + super(InstallCommand, self).__init__(*args, **kw) + + cmd_opts = self.cmd_opts + + cmd_opts.add_option(cmdoptions.requirements()) + cmd_opts.add_option(cmdoptions.constraints()) + cmd_opts.add_option(cmdoptions.no_deps()) + cmd_opts.add_option(cmdoptions.pre()) + + cmd_opts.add_option(cmdoptions.editable()) + cmd_opts.add_option( + '-t', '--target', + dest='target_dir', + metavar='dir', + default=None, + help='Install packages into . ' + 'By default this will not replace existing files/folders in ' + '. Use --upgrade to replace existing packages in ' + 'with new versions.' + ) + cmdoptions.add_target_python_options(cmd_opts) + + cmd_opts.add_option( + '--user', + dest='use_user_site', + action='store_true', + help="Install to the Python user install directory for your " + "platform. Typically ~/.local/, or %APPDATA%\\Python on " + "Windows. (See the Python documentation for site.USER_BASE " + "for full details.)") + cmd_opts.add_option( + '--no-user', + dest='use_user_site', + action='store_false', + help=SUPPRESS_HELP) + cmd_opts.add_option( + '--root', + dest='root_path', + metavar='dir', + default=None, + help="Install everything relative to this alternate root " + "directory.") + cmd_opts.add_option( + '--prefix', + dest='prefix_path', + metavar='dir', + default=None, + help="Installation prefix where lib, bin and other top-level " + "folders are placed") + + cmd_opts.add_option(cmdoptions.build_dir()) + + cmd_opts.add_option(cmdoptions.src()) + + cmd_opts.add_option( + '-U', '--upgrade', + dest='upgrade', + action='store_true', + help='Upgrade all specified packages to the newest available ' + 'version. The handling of dependencies depends on the ' + 'upgrade-strategy used.' + ) + + cmd_opts.add_option( + '--upgrade-strategy', + dest='upgrade_strategy', + default='only-if-needed', + choices=['only-if-needed', 'eager'], + help='Determines how dependency upgrading should be handled ' + '[default: %default]. ' + '"eager" - dependencies are upgraded regardless of ' + 'whether the currently installed version satisfies the ' + 'requirements of the upgraded package(s). ' + '"only-if-needed" - are upgraded only when they do not ' + 'satisfy the requirements of the upgraded package(s).' + ) + + cmd_opts.add_option( + '--force-reinstall', + dest='force_reinstall', + action='store_true', + help='Reinstall all packages even if they are already ' + 'up-to-date.') + + cmd_opts.add_option( + '-I', '--ignore-installed', + dest='ignore_installed', + action='store_true', + help='Ignore the installed packages, overwriting them. ' + 'This can break your system if the existing package ' + 'is of a different version or was installed ' + 'with a different package manager!' + ) + + cmd_opts.add_option(cmdoptions.ignore_requires_python()) + cmd_opts.add_option(cmdoptions.no_build_isolation()) + cmd_opts.add_option(cmdoptions.use_pep517()) + cmd_opts.add_option(cmdoptions.no_use_pep517()) + + cmd_opts.add_option(cmdoptions.install_options()) + cmd_opts.add_option(cmdoptions.global_options()) + + cmd_opts.add_option( + "--compile", + action="store_true", + dest="compile", + default=True, + help="Compile Python source files to bytecode", + ) + + cmd_opts.add_option( + "--no-compile", + action="store_false", + dest="compile", + help="Do not compile Python source files to bytecode", + ) + + cmd_opts.add_option( + "--no-warn-script-location", + action="store_false", + dest="warn_script_location", + default=True, + help="Do not warn when installing scripts outside PATH", + ) + cmd_opts.add_option( + "--no-warn-conflicts", + action="store_false", + dest="warn_about_conflicts", + default=True, + help="Do not warn about broken dependencies", + ) + + cmd_opts.add_option(cmdoptions.no_binary()) + cmd_opts.add_option(cmdoptions.only_binary()) + cmd_opts.add_option(cmdoptions.prefer_binary()) + cmd_opts.add_option(cmdoptions.no_clean()) + cmd_opts.add_option(cmdoptions.require_hashes()) + cmd_opts.add_option(cmdoptions.progress_bar()) + + index_opts = cmdoptions.make_option_group( + cmdoptions.index_group, + self.parser, + ) + + self.parser.insert_option_group(0, index_opts) + self.parser.insert_option_group(0, cmd_opts) + + def run(self, options, args): + # type: (Values, List[Any]) -> int + cmdoptions.check_install_build_global(options) + upgrade_strategy = "to-satisfy-only" + if options.upgrade: + upgrade_strategy = options.upgrade_strategy + + cmdoptions.check_dist_restriction(options, check_target=True) + + install_options = options.install_options or [] + + options.use_user_site = decide_user_install( + options.use_user_site, + prefix_path=options.prefix_path, + target_dir=options.target_dir, + root_path=options.root_path, + isolated_mode=options.isolated_mode, + ) + + target_temp_dir = None # type: Optional[TempDirectory] + target_temp_dir_path = None # type: Optional[str] + if options.target_dir: + options.ignore_installed = True + options.target_dir = os.path.abspath(options.target_dir) + if (os.path.exists(options.target_dir) and not + os.path.isdir(options.target_dir)): + raise CommandError( + "Target path exists but is not a directory, will not " + "continue." + ) + + # Create a target directory for using with the target option + target_temp_dir = TempDirectory(kind="target") + target_temp_dir_path = target_temp_dir.path + + global_options = options.global_options or [] + + session = self.get_default_session(options) + + target_python = make_target_python(options) + finder = self._build_package_finder( + options=options, + session=session, + target_python=target_python, + ignore_requires_python=options.ignore_requires_python, + ) + build_delete = (not (options.no_clean or options.build_dir)) + wheel_cache = WheelCache(options.cache_dir, options.format_control) + + with get_requirement_tracker() as req_tracker, TempDirectory( + options.build_dir, delete=build_delete, kind="install" + ) as directory: + requirement_set = RequirementSet( + check_supported_wheels=not options.target_dir, + ) + + try: + self.populate_requirement_set( + requirement_set, args, options, finder, session, + wheel_cache + ) + + warn_deprecated_install_options( + requirement_set, options.install_options + ) + + preparer = self.make_requirement_preparer( + temp_build_dir=directory, + options=options, + req_tracker=req_tracker, + session=session, + finder=finder, + use_user_site=options.use_user_site, + ) + resolver = self.make_resolver( + preparer=preparer, + finder=finder, + options=options, + wheel_cache=wheel_cache, + use_user_site=options.use_user_site, + ignore_installed=options.ignore_installed, + ignore_requires_python=options.ignore_requires_python, + force_reinstall=options.force_reinstall, + upgrade_strategy=upgrade_strategy, + use_pep517=options.use_pep517, + ) + + self.trace_basic_info(finder) + + resolver.resolve(requirement_set) + + try: + pip_req = requirement_set.get_requirement("pip") + except KeyError: + modifying_pip = None + else: + # If we're not replacing an already installed pip, + # we're not modifying it. + modifying_pip = pip_req.satisfied_by is None + protect_pip_from_modification_on_windows( + modifying_pip=modifying_pip + ) + + check_binary_allowed = get_check_binary_allowed( + finder.format_control + ) + + reqs_to_build = [ + r for r in requirement_set.requirements.values() + if should_build_for_install_command( + r, check_binary_allowed + ) + ] + + _, build_failures = build( + reqs_to_build, + wheel_cache=wheel_cache, + build_options=[], + global_options=[], + ) + + # If we're using PEP 517, we cannot do a direct install + # so we fail here. + # We don't care about failures building legacy + # requirements, as we'll fall through to a direct + # install for those. + pep517_build_failures = [ + r for r in build_failures if r.use_pep517 + ] + if pep517_build_failures: + raise InstallationError( + "Could not build wheels for {} which use" + " PEP 517 and cannot be installed directly".format( + ", ".join(r.name for r in pep517_build_failures))) + + to_install = resolver.get_installation_order( + requirement_set + ) + + # Consistency Checking of the package set we're installing. + should_warn_about_conflicts = ( + not options.ignore_dependencies and + options.warn_about_conflicts + ) + if should_warn_about_conflicts: + self._warn_about_conflicts(to_install) + + # Don't warn about script install locations if + # --target has been specified + warn_script_location = options.warn_script_location + if options.target_dir: + warn_script_location = False + + installed = install_given_reqs( + to_install, + install_options, + global_options, + root=options.root_path, + home=target_temp_dir_path, + prefix=options.prefix_path, + pycompile=options.compile, + warn_script_location=warn_script_location, + use_user_site=options.use_user_site, + ) + + lib_locations = get_lib_location_guesses( + user=options.use_user_site, + home=target_temp_dir_path, + root=options.root_path, + prefix=options.prefix_path, + isolated=options.isolated_mode, + ) + working_set = pkg_resources.WorkingSet(lib_locations) + + installed.sort(key=operator.attrgetter('name')) + items = [] + for result in installed: + item = result.name + try: + installed_version = get_installed_version( + result.name, working_set=working_set + ) + if installed_version: + item += '-' + installed_version + except Exception: + pass + items.append(item) + installed_desc = ' '.join(items) + if installed_desc: + write_output( + 'Successfully installed %s', installed_desc, + ) + except EnvironmentError as error: + show_traceback = (self.verbosity >= 1) + + message = create_env_error_message( + error, show_traceback, options.use_user_site, + ) + logger.error(message, exc_info=show_traceback) + + return ERROR + except PreviousBuildDirError: + options.no_clean = True + raise + finally: + # Clean up + if not options.no_clean: + requirement_set.cleanup_files() + wheel_cache.cleanup() + + if options.target_dir: + self._handle_target_dir( + options.target_dir, target_temp_dir, options.upgrade + ) + + return SUCCESS + + def _handle_target_dir(self, target_dir, target_temp_dir, upgrade): + ensure_dir(target_dir) + + # Checking both purelib and platlib directories for installed + # packages to be moved to target directory + lib_dir_list = [] + + with target_temp_dir: + # Checking both purelib and platlib directories for installed + # packages to be moved to target directory + scheme = distutils_scheme('', home=target_temp_dir.path) + purelib_dir = scheme['purelib'] + platlib_dir = scheme['platlib'] + data_dir = scheme['data'] + + if os.path.exists(purelib_dir): + lib_dir_list.append(purelib_dir) + if os.path.exists(platlib_dir) and platlib_dir != purelib_dir: + lib_dir_list.append(platlib_dir) + if os.path.exists(data_dir): + lib_dir_list.append(data_dir) + + for lib_dir in lib_dir_list: + for item in os.listdir(lib_dir): + if lib_dir == data_dir: + ddir = os.path.join(data_dir, item) + if any(s.startswith(ddir) for s in lib_dir_list[:-1]): + continue + target_item_dir = os.path.join(target_dir, item) + if os.path.exists(target_item_dir): + if not upgrade: + logger.warning( + 'Target directory %s already exists. Specify ' + '--upgrade to force replacement.', + target_item_dir + ) + continue + if os.path.islink(target_item_dir): + logger.warning( + 'Target directory %s already exists and is ' + 'a link. Pip will not automatically replace ' + 'links, please remove if replacement is ' + 'desired.', + target_item_dir + ) + continue + if os.path.isdir(target_item_dir): + shutil.rmtree(target_item_dir) + else: + os.remove(target_item_dir) + + shutil.move( + os.path.join(lib_dir, item), + target_item_dir + ) + + def _warn_about_conflicts(self, to_install): + try: + package_set, _dep_info = check_install_conflicts(to_install) + except Exception: + logger.error("Error checking for conflicts.", exc_info=True) + return + missing, conflicting = _dep_info + + # NOTE: There is some duplication here from pip check + for project_name in missing: + version = package_set[project_name][0] + for dependency in missing[project_name]: + logger.critical( + "%s %s requires %s, which is not installed.", + project_name, version, dependency[1], + ) + + for project_name in conflicting: + version = package_set[project_name][0] + for dep_name, dep_version, req in conflicting[project_name]: + logger.critical( + "%s %s has requirement %s, but you'll have %s %s which is " + "incompatible.", + project_name, version, req, dep_name, dep_version, + ) + + +def get_lib_location_guesses(*args, **kwargs): + scheme = distutils_scheme('', *args, **kwargs) + return [scheme['purelib'], scheme['platlib']] + + +def site_packages_writable(**kwargs): + return all( + test_writable_dir(d) for d in set(get_lib_location_guesses(**kwargs)) + ) + + +def decide_user_install( + use_user_site, # type: Optional[bool] + prefix_path=None, # type: Optional[str] + target_dir=None, # type: Optional[str] + root_path=None, # type: Optional[str] + isolated_mode=False, # type: bool +): + # type: (...) -> bool + """Determine whether to do a user install based on the input options. + + If use_user_site is False, no additional checks are done. + If use_user_site is True, it is checked for compatibility with other + options. + If use_user_site is None, the default behaviour depends on the environment, + which is provided by the other arguments. + """ + # In some cases (config from tox), use_user_site can be set to an integer + # rather than a bool, which 'use_user_site is False' wouldn't catch. + if (use_user_site is not None) and (not use_user_site): + logger.debug("Non-user install by explicit request") + return False + + if use_user_site: + if prefix_path: + raise CommandError( + "Can not combine '--user' and '--prefix' as they imply " + "different installation locations" + ) + if virtualenv_no_global(): + raise InstallationError( + "Can not perform a '--user' install. User site-packages " + "are not visible in this virtualenv." + ) + logger.debug("User install by explicit request") + return True + + # If we are here, user installs have not been explicitly requested/avoided + assert use_user_site is None + + # user install incompatible with --prefix/--target + if prefix_path or target_dir: + logger.debug("Non-user install due to --prefix or --target option") + return False + + # If user installs are not enabled, choose a non-user install + if not site.ENABLE_USER_SITE: + logger.debug("Non-user install because user site-packages disabled") + return False + + # If we have permission for a non-user install, do that, + # otherwise do a user install. + if site_packages_writable(root=root_path, isolated=isolated_mode): + logger.debug("Non-user install because site-packages writeable") + return False + + logger.info("Defaulting to user installation because normal site-packages " + "is not writeable") + return True + + +def warn_deprecated_install_options(requirement_set, options): + # type: (RequirementSet, Optional[List[str]]) -> None + """If any location-changing --install-option arguments were passed for + requirements or on the command-line, then show a deprecation warning. + """ + def format_options(option_names): + # type: (Iterable[str]) -> List[str] + return ["--{}".format(name.replace("_", "-")) for name in option_names] + + requirements = ( + requirement_set.unnamed_requirements + + list(requirement_set.requirements.values()) + ) + + offenders = [] + + for requirement in requirements: + install_options = requirement.options.get("install_options", []) + location_options = parse_distutils_args(install_options) + if location_options: + offenders.append( + "{!r} from {}".format( + format_options(location_options.keys()), requirement + ) + ) + + if options: + location_options = parse_distutils_args(options) + if location_options: + offenders.append( + "{!r} from command line".format( + format_options(location_options.keys()) + ) + ) + + if not offenders: + return + + deprecated( + reason=( + "Location-changing options found in --install-option: {}. " + "This configuration may cause unexpected behavior and is " + "unsupported.".format( + "; ".join(offenders) + ) + ), + replacement=( + "using pip-level options like --user, --prefix, --root, and " + "--target" + ), + gone_in="20.2", + issue=7309, + ) + + +def create_env_error_message(error, show_traceback, using_user_site): + """Format an error message for an EnvironmentError + + It may occur anytime during the execution of the install command. + """ + parts = [] + + # Mention the error if we are not going to show a traceback + parts.append("Could not install packages due to an EnvironmentError") + if not show_traceback: + parts.append(": ") + parts.append(str(error)) + else: + parts.append(".") + + # Spilt the error indication from a helper message (if any) + parts[-1] += "\n" + + # Suggest useful actions to the user: + # (1) using user site-packages or (2) verifying the permissions + if error.errno == errno.EACCES: + user_option_part = "Consider using the `--user` option" + permissions_part = "Check the permissions" + + if not using_user_site: + parts.extend([ + user_option_part, " or ", + permissions_part.lower(), + ]) + else: + parts.append(permissions_part) + parts.append(".\n") + + return "".join(parts).strip() + "\n" diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/install.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/install.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e5555777ceafec9eaacfdedd5bd9d8a1139c18d0 GIT binary patch literal 19513 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 #Vjy0t{8p_|{MMB)kgB0OL1Ht1I50u< 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 literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/list 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/list 2.py new file mode 100644 index 0000000..cce470a --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/list 2.py @@ -0,0 +1,313 @@ +# The following comment should be removed at some point in the future. +# mypy: disallow-untyped-defs=False + +from __future__ import absolute_import + +import json +import logging + +from pip._vendor import six +from pip._vendor.six.moves import zip_longest + +from pip._internal.cli import cmdoptions +from pip._internal.cli.req_command import IndexGroupCommand +from pip._internal.exceptions import CommandError +from pip._internal.index.package_finder import PackageFinder +from pip._internal.models.selection_prefs import SelectionPreferences +from pip._internal.self_outdated_check import make_link_collector +from pip._internal.utils.misc import ( + dist_is_editable, + get_installed_distributions, + write_output, +) +from pip._internal.utils.packaging import get_installer + +logger = logging.getLogger(__name__) + + +class ListCommand(IndexGroupCommand): + """ + List installed packages, including editables. + + Packages are listed in a case-insensitive sorted order. + """ + + usage = """ + %prog [options]""" + + def __init__(self, *args, **kw): + super(ListCommand, self).__init__(*args, **kw) + + cmd_opts = self.cmd_opts + + cmd_opts.add_option( + '-o', '--outdated', + action='store_true', + default=False, + help='List outdated packages') + cmd_opts.add_option( + '-u', '--uptodate', + action='store_true', + default=False, + help='List uptodate packages') + cmd_opts.add_option( + '-e', '--editable', + action='store_true', + default=False, + help='List editable projects.') + cmd_opts.add_option( + '-l', '--local', + action='store_true', + default=False, + help=('If in a virtualenv that has global access, do not list ' + 'globally-installed packages.'), + ) + self.cmd_opts.add_option( + '--user', + dest='user', + action='store_true', + default=False, + help='Only output packages installed in user-site.') + cmd_opts.add_option(cmdoptions.list_path()) + cmd_opts.add_option( + '--pre', + action='store_true', + default=False, + help=("Include pre-release and development versions. By default, " + "pip only finds stable versions."), + ) + + cmd_opts.add_option( + '--format', + action='store', + dest='list_format', + default="columns", + choices=('columns', 'freeze', 'json'), + help="Select the output format among: columns (default), freeze, " + "or json", + ) + + cmd_opts.add_option( + '--not-required', + action='store_true', + dest='not_required', + help="List packages that are not dependencies of " + "installed packages.", + ) + + cmd_opts.add_option( + '--exclude-editable', + action='store_false', + dest='include_editable', + help='Exclude editable package from output.', + ) + cmd_opts.add_option( + '--include-editable', + action='store_true', + dest='include_editable', + help='Include editable package from output.', + default=True, + ) + index_opts = cmdoptions.make_option_group( + cmdoptions.index_group, self.parser + ) + + self.parser.insert_option_group(0, index_opts) + self.parser.insert_option_group(0, cmd_opts) + + def _build_package_finder(self, options, session): + """ + Create a package finder appropriate to this list command. + """ + link_collector = make_link_collector(session, options=options) + + # Pass allow_yanked=False to ignore yanked versions. + selection_prefs = SelectionPreferences( + allow_yanked=False, + allow_all_prereleases=options.pre, + ) + + return PackageFinder.create( + link_collector=link_collector, + selection_prefs=selection_prefs, + ) + + def run(self, options, args): + if options.outdated and options.uptodate: + raise CommandError( + "Options --outdated and --uptodate cannot be combined.") + + cmdoptions.check_list_path_option(options) + + packages = get_installed_distributions( + local_only=options.local, + user_only=options.user, + editables_only=options.editable, + include_editables=options.include_editable, + paths=options.path, + ) + + # get_not_required must be called firstly in order to find and + # filter out all dependencies correctly. Otherwise a package + # can't be identified as requirement because some parent packages + # could be filtered out before. + if options.not_required: + packages = self.get_not_required(packages, options) + + if options.outdated: + packages = self.get_outdated(packages, options) + elif options.uptodate: + packages = self.get_uptodate(packages, options) + + self.output_package_listing(packages, options) + + def get_outdated(self, packages, options): + return [ + dist for dist in self.iter_packages_latest_infos(packages, options) + if dist.latest_version > dist.parsed_version + ] + + def get_uptodate(self, packages, options): + return [ + dist for dist in self.iter_packages_latest_infos(packages, options) + if dist.latest_version == dist.parsed_version + ] + + def get_not_required(self, packages, options): + dep_keys = set() + for dist in packages: + dep_keys.update(requirement.key for requirement in dist.requires()) + return {pkg for pkg in packages if pkg.key not in dep_keys} + + def iter_packages_latest_infos(self, packages, options): + with self._build_session(options) as session: + finder = self._build_package_finder(options, session) + + for dist in packages: + typ = 'unknown' + all_candidates = finder.find_all_candidates(dist.key) + if not options.pre: + # Remove prereleases + all_candidates = [candidate for candidate in all_candidates + if not candidate.version.is_prerelease] + + evaluator = finder.make_candidate_evaluator( + project_name=dist.project_name, + ) + best_candidate = evaluator.sort_best_candidate(all_candidates) + if best_candidate is None: + continue + + remote_version = best_candidate.version + if best_candidate.link.is_wheel: + typ = 'wheel' + else: + typ = 'sdist' + # This is dirty but makes the rest of the code much cleaner + dist.latest_version = remote_version + dist.latest_filetype = typ + yield dist + + def output_package_listing(self, packages, options): + packages = sorted( + packages, + key=lambda dist: dist.project_name.lower(), + ) + if options.list_format == 'columns' and packages: + data, header = format_for_columns(packages, options) + self.output_package_listing_columns(data, header) + elif options.list_format == 'freeze': + for dist in packages: + if options.verbose >= 1: + write_output("%s==%s (%s)", dist.project_name, + dist.version, dist.location) + else: + write_output("%s==%s", dist.project_name, dist.version) + elif options.list_format == 'json': + write_output(format_for_json(packages, options)) + + def output_package_listing_columns(self, data, header): + # insert the header first: we need to know the size of column names + if len(data) > 0: + data.insert(0, header) + + pkg_strings, sizes = tabulate(data) + + # Create and add a separator. + if len(data) > 0: + pkg_strings.insert(1, " ".join(map(lambda x: '-' * x, sizes))) + + for val in pkg_strings: + write_output(val) + + +def tabulate(vals): + # From pfmoore on GitHub: + # https://github.com/pypa/pip/issues/3651#issuecomment-216932564 + assert len(vals) > 0 + + sizes = [0] * max(len(x) for x in vals) + for row in vals: + sizes = [max(s, len(str(c))) for s, c in zip_longest(sizes, row)] + + result = [] + for row in vals: + display = " ".join([str(c).ljust(s) if c is not None else '' + for s, c in zip_longest(sizes, row)]) + result.append(display) + + return result, sizes + + +def format_for_columns(pkgs, options): + """ + Convert the package data into something usable + by output_package_listing_columns. + """ + running_outdated = options.outdated + # Adjust the header for the `pip list --outdated` case. + if running_outdated: + header = ["Package", "Version", "Latest", "Type"] + else: + header = ["Package", "Version"] + + data = [] + if options.verbose >= 1 or any(dist_is_editable(x) for x in pkgs): + header.append("Location") + if options.verbose >= 1: + header.append("Installer") + + for proj in pkgs: + # if we're working on the 'outdated' list, separate out the + # latest_version and type + row = [proj.project_name, proj.version] + + if running_outdated: + row.append(proj.latest_version) + row.append(proj.latest_filetype) + + if options.verbose >= 1 or dist_is_editable(proj): + row.append(proj.location) + if options.verbose >= 1: + row.append(get_installer(proj)) + + data.append(row) + + return data, header + + +def format_for_json(packages, options): + data = [] + for dist in packages: + info = { + 'name': dist.project_name, + 'version': six.text_type(dist.version), + } + if options.verbose >= 1: + info['location'] = dist.location + info['installer'] = get_installer(dist) + if options.outdated: + info['latest_version'] = six.text_type(dist.latest_version) + info['latest_filetype'] = dist.latest_filetype + data.append(info) + return json.dumps(data) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/list 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/list 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3043b992c672cf69855b82b8575bafcba86e5edd GIT binary patch literal 11265 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 literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/list.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/list.py new file mode 100644 index 0000000..cce470a --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/list.py @@ -0,0 +1,313 @@ +# The following comment should be removed at some point in the future. +# mypy: disallow-untyped-defs=False + +from __future__ import absolute_import + +import json +import logging + +from pip._vendor import six +from pip._vendor.six.moves import zip_longest + +from pip._internal.cli import cmdoptions +from pip._internal.cli.req_command import IndexGroupCommand +from pip._internal.exceptions import CommandError +from pip._internal.index.package_finder import PackageFinder +from pip._internal.models.selection_prefs import SelectionPreferences +from pip._internal.self_outdated_check import make_link_collector +from pip._internal.utils.misc import ( + dist_is_editable, + get_installed_distributions, + write_output, +) +from pip._internal.utils.packaging import get_installer + +logger = logging.getLogger(__name__) + + +class ListCommand(IndexGroupCommand): + """ + List installed packages, including editables. + + Packages are listed in a case-insensitive sorted order. + """ + + usage = """ + %prog [options]""" + + def __init__(self, *args, **kw): + super(ListCommand, self).__init__(*args, **kw) + + cmd_opts = self.cmd_opts + + cmd_opts.add_option( + '-o', '--outdated', + action='store_true', + default=False, + help='List outdated packages') + cmd_opts.add_option( + '-u', '--uptodate', + action='store_true', + default=False, + help='List uptodate packages') + cmd_opts.add_option( + '-e', '--editable', + action='store_true', + default=False, + help='List editable projects.') + cmd_opts.add_option( + '-l', '--local', + action='store_true', + default=False, + help=('If in a virtualenv that has global access, do not list ' + 'globally-installed packages.'), + ) + self.cmd_opts.add_option( + '--user', + dest='user', + action='store_true', + default=False, + help='Only output packages installed in user-site.') + cmd_opts.add_option(cmdoptions.list_path()) + cmd_opts.add_option( + '--pre', + action='store_true', + default=False, + help=("Include pre-release and development versions. By default, " + "pip only finds stable versions."), + ) + + cmd_opts.add_option( + '--format', + action='store', + dest='list_format', + default="columns", + choices=('columns', 'freeze', 'json'), + help="Select the output format among: columns (default), freeze, " + "or json", + ) + + cmd_opts.add_option( + '--not-required', + action='store_true', + dest='not_required', + help="List packages that are not dependencies of " + "installed packages.", + ) + + cmd_opts.add_option( + '--exclude-editable', + action='store_false', + dest='include_editable', + help='Exclude editable package from output.', + ) + cmd_opts.add_option( + '--include-editable', + action='store_true', + dest='include_editable', + help='Include editable package from output.', + default=True, + ) + index_opts = cmdoptions.make_option_group( + cmdoptions.index_group, self.parser + ) + + self.parser.insert_option_group(0, index_opts) + self.parser.insert_option_group(0, cmd_opts) + + def _build_package_finder(self, options, session): + """ + Create a package finder appropriate to this list command. + """ + link_collector = make_link_collector(session, options=options) + + # Pass allow_yanked=False to ignore yanked versions. + selection_prefs = SelectionPreferences( + allow_yanked=False, + allow_all_prereleases=options.pre, + ) + + return PackageFinder.create( + link_collector=link_collector, + selection_prefs=selection_prefs, + ) + + def run(self, options, args): + if options.outdated and options.uptodate: + raise CommandError( + "Options --outdated and --uptodate cannot be combined.") + + cmdoptions.check_list_path_option(options) + + packages = get_installed_distributions( + local_only=options.local, + user_only=options.user, + editables_only=options.editable, + include_editables=options.include_editable, + paths=options.path, + ) + + # get_not_required must be called firstly in order to find and + # filter out all dependencies correctly. Otherwise a package + # can't be identified as requirement because some parent packages + # could be filtered out before. + if options.not_required: + packages = self.get_not_required(packages, options) + + if options.outdated: + packages = self.get_outdated(packages, options) + elif options.uptodate: + packages = self.get_uptodate(packages, options) + + self.output_package_listing(packages, options) + + def get_outdated(self, packages, options): + return [ + dist for dist in self.iter_packages_latest_infos(packages, options) + if dist.latest_version > dist.parsed_version + ] + + def get_uptodate(self, packages, options): + return [ + dist for dist in self.iter_packages_latest_infos(packages, options) + if dist.latest_version == dist.parsed_version + ] + + def get_not_required(self, packages, options): + dep_keys = set() + for dist in packages: + dep_keys.update(requirement.key for requirement in dist.requires()) + return {pkg for pkg in packages if pkg.key not in dep_keys} + + def iter_packages_latest_infos(self, packages, options): + with self._build_session(options) as session: + finder = self._build_package_finder(options, session) + + for dist in packages: + typ = 'unknown' + all_candidates = finder.find_all_candidates(dist.key) + if not options.pre: + # Remove prereleases + all_candidates = [candidate for candidate in all_candidates + if not candidate.version.is_prerelease] + + evaluator = finder.make_candidate_evaluator( + project_name=dist.project_name, + ) + best_candidate = evaluator.sort_best_candidate(all_candidates) + if best_candidate is None: + continue + + remote_version = best_candidate.version + if best_candidate.link.is_wheel: + typ = 'wheel' + else: + typ = 'sdist' + # This is dirty but makes the rest of the code much cleaner + dist.latest_version = remote_version + dist.latest_filetype = typ + yield dist + + def output_package_listing(self, packages, options): + packages = sorted( + packages, + key=lambda dist: dist.project_name.lower(), + ) + if options.list_format == 'columns' and packages: + data, header = format_for_columns(packages, options) + self.output_package_listing_columns(data, header) + elif options.list_format == 'freeze': + for dist in packages: + if options.verbose >= 1: + write_output("%s==%s (%s)", dist.project_name, + dist.version, dist.location) + else: + write_output("%s==%s", dist.project_name, dist.version) + elif options.list_format == 'json': + write_output(format_for_json(packages, options)) + + def output_package_listing_columns(self, data, header): + # insert the header first: we need to know the size of column names + if len(data) > 0: + data.insert(0, header) + + pkg_strings, sizes = tabulate(data) + + # Create and add a separator. + if len(data) > 0: + pkg_strings.insert(1, " ".join(map(lambda x: '-' * x, sizes))) + + for val in pkg_strings: + write_output(val) + + +def tabulate(vals): + # From pfmoore on GitHub: + # https://github.com/pypa/pip/issues/3651#issuecomment-216932564 + assert len(vals) > 0 + + sizes = [0] * max(len(x) for x in vals) + for row in vals: + sizes = [max(s, len(str(c))) for s, c in zip_longest(sizes, row)] + + result = [] + for row in vals: + display = " ".join([str(c).ljust(s) if c is not None else '' + for s, c in zip_longest(sizes, row)]) + result.append(display) + + return result, sizes + + +def format_for_columns(pkgs, options): + """ + Convert the package data into something usable + by output_package_listing_columns. + """ + running_outdated = options.outdated + # Adjust the header for the `pip list --outdated` case. + if running_outdated: + header = ["Package", "Version", "Latest", "Type"] + else: + header = ["Package", "Version"] + + data = [] + if options.verbose >= 1 or any(dist_is_editable(x) for x in pkgs): + header.append("Location") + if options.verbose >= 1: + header.append("Installer") + + for proj in pkgs: + # if we're working on the 'outdated' list, separate out the + # latest_version and type + row = [proj.project_name, proj.version] + + if running_outdated: + row.append(proj.latest_version) + row.append(proj.latest_filetype) + + if options.verbose >= 1 or dist_is_editable(proj): + row.append(proj.location) + if options.verbose >= 1: + row.append(get_installer(proj)) + + data.append(row) + + return data, header + + +def format_for_json(packages, options): + data = [] + for dist in packages: + info = { + 'name': dist.project_name, + 'version': six.text_type(dist.version), + } + if options.verbose >= 1: + info['location'] = dist.location + info['installer'] = get_installer(dist) + if options.outdated: + info['latest_version'] = six.text_type(dist.latest_version) + info['latest_filetype'] = dist.latest_filetype + data.append(info) + return json.dumps(data) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/list.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/list.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0a6517aec308c1e4a0652aa6c7755d93d2437fb2 GIT binary patch literal 11265 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.""" + + usage = """ + %prog [options] """ + ignore_require_venv = True + + def __init__(self, *args, **kw): + super(SearchCommand, self).__init__(*args, **kw) + self.cmd_opts.add_option( + '-i', '--index', + dest='index', + metavar='URL', + default=PyPI.pypi_url, + help='Base URL of Python Package Index (default %default)') + + self.parser.insert_option_group(0, self.cmd_opts) + + def run(self, options, args): + if not args: + raise CommandError('Missing required argument (search query).') + query = args + pypi_hits = self.search(query, options) + hits = transform_hits(pypi_hits) + + terminal_width = None + if sys.stdout.isatty(): + terminal_width = get_terminal_size()[0] + + print_results(hits, terminal_width=terminal_width) + if pypi_hits: + return SUCCESS + return NO_MATCHES_FOUND + + def search(self, query, options): + index_url = options.index + + session = self.get_default_session(options) + + transport = PipXmlrpcTransport(index_url, session) + pypi = xmlrpc_client.ServerProxy(index_url, transport) + hits = pypi.search({'name': query, 'summary': query}, 'or') + return hits + + +def transform_hits(hits): + """ + The list from pypi is really a list of versions. We want a list of + packages with the list of versions stored inline. This converts the + list from pypi into one we can use. + """ + packages = OrderedDict() + for hit in hits: + name = hit['name'] + summary = hit['summary'] + version = hit['version'] + + if name not in packages.keys(): + packages[name] = { + 'name': name, + 'summary': summary, + 'versions': [version], + } + else: + packages[name]['versions'].append(version) + + # if this is the highest version, replace summary and score + if version == highest_version(packages[name]['versions']): + packages[name]['summary'] = summary + + return list(packages.values()) + + +def print_results(hits, name_column_width=None, terminal_width=None): + if not hits: + return + if name_column_width is None: + name_column_width = max([ + len(hit['name']) + len(highest_version(hit.get('versions', ['-']))) + for hit in hits + ]) + 4 + + installed_packages = [p.project_name for p in pkg_resources.working_set] + for hit in hits: + name = hit['name'] + summary = hit['summary'] or '' + latest = highest_version(hit.get('versions', ['-'])) + if terminal_width is not None: + target_width = terminal_width - name_column_width - 5 + if target_width > 10: + # wrap and indent summary to fit terminal + summary = textwrap.wrap(summary, target_width) + summary = ('\n' + ' ' * (name_column_width + 3)).join(summary) + + line = '%-*s - %s' % (name_column_width, + '%s (%s)' % (name, latest), summary) + try: + write_output(line) + if name in installed_packages: + dist = pkg_resources.get_distribution(name) + with indent_log(): + if dist.version == latest: + write_output('INSTALLED: %s (latest)', dist.version) + else: + write_output('INSTALLED: %s', dist.version) + if parse_version(latest).pre: + write_output('LATEST: %s (pre-release; install' + ' with "pip install --pre")', latest) + else: + write_output('LATEST: %s', latest) + except UnicodeEncodeError: + pass + + +def highest_version(versions): + return max(versions, key=parse_version) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/search 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/search 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d7496402c4c711aff9383cf62418dd158e1a2e8b GIT binary patch literal 5716 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.""" + + usage = """ + %prog [options] """ + ignore_require_venv = True + + def __init__(self, *args, **kw): + super(SearchCommand, self).__init__(*args, **kw) + self.cmd_opts.add_option( + '-i', '--index', + dest='index', + metavar='URL', + default=PyPI.pypi_url, + help='Base URL of Python Package Index (default %default)') + + self.parser.insert_option_group(0, self.cmd_opts) + + def run(self, options, args): + if not args: + raise CommandError('Missing required argument (search query).') + query = args + pypi_hits = self.search(query, options) + hits = transform_hits(pypi_hits) + + terminal_width = None + if sys.stdout.isatty(): + terminal_width = get_terminal_size()[0] + + print_results(hits, terminal_width=terminal_width) + if pypi_hits: + return SUCCESS + return NO_MATCHES_FOUND + + def search(self, query, options): + index_url = options.index + + session = self.get_default_session(options) + + transport = PipXmlrpcTransport(index_url, session) + pypi = xmlrpc_client.ServerProxy(index_url, transport) + hits = pypi.search({'name': query, 'summary': query}, 'or') + return hits + + +def transform_hits(hits): + """ + The list from pypi is really a list of versions. We want a list of + packages with the list of versions stored inline. This converts the + list from pypi into one we can use. + """ + packages = OrderedDict() + for hit in hits: + name = hit['name'] + summary = hit['summary'] + version = hit['version'] + + if name not in packages.keys(): + packages[name] = { + 'name': name, + 'summary': summary, + 'versions': [version], + } + else: + packages[name]['versions'].append(version) + + # if this is the highest version, replace summary and score + if version == highest_version(packages[name]['versions']): + packages[name]['summary'] = summary + + return list(packages.values()) + + +def print_results(hits, name_column_width=None, terminal_width=None): + if not hits: + return + if name_column_width is None: + name_column_width = max([ + len(hit['name']) + len(highest_version(hit.get('versions', ['-']))) + for hit in hits + ]) + 4 + + installed_packages = [p.project_name for p in pkg_resources.working_set] + for hit in hits: + name = hit['name'] + summary = hit['summary'] or '' + latest = highest_version(hit.get('versions', ['-'])) + if terminal_width is not None: + target_width = terminal_width - name_column_width - 5 + if target_width > 10: + # wrap and indent summary to fit terminal + summary = textwrap.wrap(summary, target_width) + summary = ('\n' + ' ' * (name_column_width + 3)).join(summary) + + line = '%-*s - %s' % (name_column_width, + '%s (%s)' % (name, latest), summary) + try: + write_output(line) + if name in installed_packages: + dist = pkg_resources.get_distribution(name) + with indent_log(): + if dist.version == latest: + write_output('INSTALLED: %s (latest)', dist.version) + else: + write_output('INSTALLED: %s', dist.version) + if parse_version(latest).pre: + write_output('LATEST: %s (pre-release; install' + ' with "pip install --pre")', latest) + else: + write_output('LATEST: %s', latest) + except UnicodeEncodeError: + pass + + +def highest_version(versions): + return max(versions, key=parse_version) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/search.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/search.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5af67f6a82d18ace6d713dae213dea1defb828a0 GIT binary patch literal 5716 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 A-2eap literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/show 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/show 2.py new file mode 100644 index 0000000..a46b08e --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/show 2.py @@ -0,0 +1,180 @@ +# The following comment should be removed at some point in the future. +# mypy: disallow-untyped-defs=False + +from __future__ import absolute_import + +import logging +import os +from email.parser import FeedParser + +from pip._vendor import pkg_resources +from pip._vendor.packaging.utils import canonicalize_name + +from pip._internal.cli.base_command import Command +from pip._internal.cli.status_codes import ERROR, SUCCESS +from pip._internal.utils.misc import write_output + +logger = logging.getLogger(__name__) + + +class ShowCommand(Command): + """ + Show information about one or more installed packages. + + The output is in RFC-compliant mail header format. + """ + + usage = """ + %prog [options] ...""" + ignore_require_venv = True + + def __init__(self, *args, **kw): + super(ShowCommand, self).__init__(*args, **kw) + self.cmd_opts.add_option( + '-f', '--files', + dest='files', + action='store_true', + default=False, + help='Show the full list of installed files for each package.') + + self.parser.insert_option_group(0, self.cmd_opts) + + def run(self, options, args): + if not args: + logger.warning('ERROR: Please provide a package name or names.') + return ERROR + query = args + + results = search_packages_info(query) + if not print_results( + results, list_files=options.files, verbose=options.verbose): + return ERROR + return SUCCESS + + +def search_packages_info(query): + """ + Gather details from installed distributions. Print distribution name, + version, location, and installed files. Installed files requires a + pip generated 'installed-files.txt' in the distributions '.egg-info' + directory. + """ + installed = {} + for p in pkg_resources.working_set: + installed[canonicalize_name(p.project_name)] = p + + query_names = [canonicalize_name(name) for name in query] + missing = sorted( + [name for name, pkg in zip(query, query_names) if pkg not in installed] + ) + if missing: + logger.warning('Package(s) not found: %s', ', '.join(missing)) + + def get_requiring_packages(package_name): + canonical_name = canonicalize_name(package_name) + return [ + pkg.project_name for pkg in pkg_resources.working_set + if canonical_name in + [canonicalize_name(required.name) for required in + pkg.requires()] + ] + + for dist in [installed[pkg] for pkg in query_names if pkg in installed]: + package = { + 'name': dist.project_name, + 'version': dist.version, + 'location': dist.location, + 'requires': [dep.project_name for dep in dist.requires()], + 'required_by': get_requiring_packages(dist.project_name) + } + file_list = None + metadata = None + if isinstance(dist, pkg_resources.DistInfoDistribution): + # RECORDs should be part of .dist-info metadatas + if dist.has_metadata('RECORD'): + lines = dist.get_metadata_lines('RECORD') + paths = [l.split(',')[0] for l in lines] + paths = [os.path.join(dist.location, p) for p in paths] + file_list = [os.path.relpath(p, dist.location) for p in paths] + + if dist.has_metadata('METADATA'): + metadata = dist.get_metadata('METADATA') + else: + # Otherwise use pip's log for .egg-info's + if dist.has_metadata('installed-files.txt'): + paths = dist.get_metadata_lines('installed-files.txt') + paths = [os.path.join(dist.egg_info, p) for p in paths] + file_list = [os.path.relpath(p, dist.location) for p in paths] + + if dist.has_metadata('PKG-INFO'): + metadata = dist.get_metadata('PKG-INFO') + + if dist.has_metadata('entry_points.txt'): + entry_points = dist.get_metadata_lines('entry_points.txt') + package['entry_points'] = entry_points + + if dist.has_metadata('INSTALLER'): + for line in dist.get_metadata_lines('INSTALLER'): + if line.strip(): + package['installer'] = line.strip() + break + + # @todo: Should pkg_resources.Distribution have a + # `get_pkg_info` method? + feed_parser = FeedParser() + feed_parser.feed(metadata) + pkg_info_dict = feed_parser.close() + for key in ('metadata-version', 'summary', + 'home-page', 'author', 'author-email', 'license'): + package[key] = pkg_info_dict.get(key) + + # It looks like FeedParser cannot deal with repeated headers + classifiers = [] + for line in metadata.splitlines(): + if line.startswith('Classifier: '): + classifiers.append(line[len('Classifier: '):]) + package['classifiers'] = classifiers + + if file_list: + package['files'] = sorted(file_list) + yield package + + +def print_results(distributions, list_files=False, verbose=False): + """ + Print the informations from installed distributions found. + """ + results_printed = False + for i, dist in enumerate(distributions): + results_printed = True + if i > 0: + write_output("---") + + write_output("Name: %s", dist.get('name', '')) + write_output("Version: %s", dist.get('version', '')) + write_output("Summary: %s", dist.get('summary', '')) + write_output("Home-page: %s", dist.get('home-page', '')) + write_output("Author: %s", dist.get('author', '')) + write_output("Author-email: %s", dist.get('author-email', '')) + write_output("License: %s", dist.get('license', '')) + write_output("Location: %s", dist.get('location', '')) + write_output("Requires: %s", ', '.join(dist.get('requires', []))) + write_output("Required-by: %s", ', '.join(dist.get('required_by', []))) + + if verbose: + write_output("Metadata-Version: %s", + dist.get('metadata-version', '')) + write_output("Installer: %s", dist.get('installer', '')) + write_output("Classifiers:") + for classifier in dist.get('classifiers', []): + write_output(" %s", classifier) + write_output("Entry-points:") + for entry in dist.get('entry_points', []): + write_output(" %s", entry.strip()) + if list_files: + write_output("Files:") + for line in dist.get('files', []): + write_output(" %s", line.strip()) + if "files" not in dist: + write_output("Cannot locate installed-files.txt") + return results_printed diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/show 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/show 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5dcb1206a7f3c6cc5662c4af785b9c73f2a9cc05 GIT binary patch literal 6804 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 literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/show.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/show.py new file mode 100644 index 0000000..a46b08e --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/show.py @@ -0,0 +1,180 @@ +# The following comment should be removed at some point in the future. +# mypy: disallow-untyped-defs=False + +from __future__ import absolute_import + +import logging +import os +from email.parser import FeedParser + +from pip._vendor import pkg_resources +from pip._vendor.packaging.utils import canonicalize_name + +from pip._internal.cli.base_command import Command +from pip._internal.cli.status_codes import ERROR, SUCCESS +from pip._internal.utils.misc import write_output + +logger = logging.getLogger(__name__) + + +class ShowCommand(Command): + """ + Show information about one or more installed packages. + + The output is in RFC-compliant mail header format. + """ + + usage = """ + %prog [options] ...""" + ignore_require_venv = True + + def __init__(self, *args, **kw): + super(ShowCommand, self).__init__(*args, **kw) + self.cmd_opts.add_option( + '-f', '--files', + dest='files', + action='store_true', + default=False, + help='Show the full list of installed files for each package.') + + self.parser.insert_option_group(0, self.cmd_opts) + + def run(self, options, args): + if not args: + logger.warning('ERROR: Please provide a package name or names.') + return ERROR + query = args + + results = search_packages_info(query) + if not print_results( + results, list_files=options.files, verbose=options.verbose): + return ERROR + return SUCCESS + + +def search_packages_info(query): + """ + Gather details from installed distributions. Print distribution name, + version, location, and installed files. Installed files requires a + pip generated 'installed-files.txt' in the distributions '.egg-info' + directory. + """ + installed = {} + for p in pkg_resources.working_set: + installed[canonicalize_name(p.project_name)] = p + + query_names = [canonicalize_name(name) for name in query] + missing = sorted( + [name for name, pkg in zip(query, query_names) if pkg not in installed] + ) + if missing: + logger.warning('Package(s) not found: %s', ', '.join(missing)) + + def get_requiring_packages(package_name): + canonical_name = canonicalize_name(package_name) + return [ + pkg.project_name for pkg in pkg_resources.working_set + if canonical_name in + [canonicalize_name(required.name) for required in + pkg.requires()] + ] + + for dist in [installed[pkg] for pkg in query_names if pkg in installed]: + package = { + 'name': dist.project_name, + 'version': dist.version, + 'location': dist.location, + 'requires': [dep.project_name for dep in dist.requires()], + 'required_by': get_requiring_packages(dist.project_name) + } + file_list = None + metadata = None + if isinstance(dist, pkg_resources.DistInfoDistribution): + # RECORDs should be part of .dist-info metadatas + if dist.has_metadata('RECORD'): + lines = dist.get_metadata_lines('RECORD') + paths = [l.split(',')[0] for l in lines] + paths = [os.path.join(dist.location, p) for p in paths] + file_list = [os.path.relpath(p, dist.location) for p in paths] + + if dist.has_metadata('METADATA'): + metadata = dist.get_metadata('METADATA') + else: + # Otherwise use pip's log for .egg-info's + if dist.has_metadata('installed-files.txt'): + paths = dist.get_metadata_lines('installed-files.txt') + paths = [os.path.join(dist.egg_info, p) for p in paths] + file_list = [os.path.relpath(p, dist.location) for p in paths] + + if dist.has_metadata('PKG-INFO'): + metadata = dist.get_metadata('PKG-INFO') + + if dist.has_metadata('entry_points.txt'): + entry_points = dist.get_metadata_lines('entry_points.txt') + package['entry_points'] = entry_points + + if dist.has_metadata('INSTALLER'): + for line in dist.get_metadata_lines('INSTALLER'): + if line.strip(): + package['installer'] = line.strip() + break + + # @todo: Should pkg_resources.Distribution have a + # `get_pkg_info` method? + feed_parser = FeedParser() + feed_parser.feed(metadata) + pkg_info_dict = feed_parser.close() + for key in ('metadata-version', 'summary', + 'home-page', 'author', 'author-email', 'license'): + package[key] = pkg_info_dict.get(key) + + # It looks like FeedParser cannot deal with repeated headers + classifiers = [] + for line in metadata.splitlines(): + if line.startswith('Classifier: '): + classifiers.append(line[len('Classifier: '):]) + package['classifiers'] = classifiers + + if file_list: + package['files'] = sorted(file_list) + yield package + + +def print_results(distributions, list_files=False, verbose=False): + """ + Print the informations from installed distributions found. + """ + results_printed = False + for i, dist in enumerate(distributions): + results_printed = True + if i > 0: + write_output("---") + + write_output("Name: %s", dist.get('name', '')) + write_output("Version: %s", dist.get('version', '')) + write_output("Summary: %s", dist.get('summary', '')) + write_output("Home-page: %s", dist.get('home-page', '')) + write_output("Author: %s", dist.get('author', '')) + write_output("Author-email: %s", dist.get('author-email', '')) + write_output("License: %s", dist.get('license', '')) + write_output("Location: %s", dist.get('location', '')) + write_output("Requires: %s", ', '.join(dist.get('requires', []))) + write_output("Required-by: %s", ', '.join(dist.get('required_by', []))) + + if verbose: + write_output("Metadata-Version: %s", + dist.get('metadata-version', '')) + write_output("Installer: %s", dist.get('installer', '')) + write_output("Classifiers:") + for classifier in dist.get('classifiers', []): + write_output(" %s", classifier) + write_output("Entry-points:") + for entry in dist.get('entry_points', []): + write_output(" %s", entry.strip()) + if list_files: + write_output("Files:") + for line in dist.get('files', []): + write_output(" %s", line.strip()) + if "files" not in dist: + write_output("Cannot locate installed-files.txt") + return results_printed diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/show.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/show.pyc new file mode 100644 index 0000000000000000000000000000000000000000..05dd6e4da5879ce990d46e48820273aa596744de GIT binary patch literal 6804 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 literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/uninstall 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/uninstall 2.py new file mode 100644 index 0000000..1bde414 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/uninstall 2.py @@ -0,0 +1,82 @@ +# The following comment should be removed at some point in the future. +# mypy: disallow-untyped-defs=False + +from __future__ import absolute_import + +from pip._vendor.packaging.utils import canonicalize_name + +from pip._internal.cli.base_command import Command +from pip._internal.cli.req_command import SessionCommandMixin +from pip._internal.exceptions import InstallationError +from pip._internal.req import parse_requirements +from pip._internal.req.constructors import install_req_from_line +from pip._internal.utils.misc import protect_pip_from_modification_on_windows + + +class UninstallCommand(Command, SessionCommandMixin): + """ + Uninstall packages. + + pip is able to uninstall most installed packages. Known exceptions are: + + - Pure distutils packages installed with ``python setup.py install``, which + leave behind no metadata to determine what files were installed. + - Script wrappers installed by ``python setup.py develop``. + """ + + usage = """ + %prog [options] ... + %prog [options] -r ...""" + + def __init__(self, *args, **kw): + super(UninstallCommand, self).__init__(*args, **kw) + self.cmd_opts.add_option( + '-r', '--requirement', + dest='requirements', + action='append', + default=[], + metavar='file', + help='Uninstall all the packages listed in the given requirements ' + 'file. This option can be used multiple times.', + ) + self.cmd_opts.add_option( + '-y', '--yes', + dest='yes', + action='store_true', + help="Don't ask for confirmation of uninstall deletions.") + + self.parser.insert_option_group(0, self.cmd_opts) + + def run(self, options, args): + session = self.get_default_session(options) + + reqs_to_uninstall = {} + for name in args: + req = install_req_from_line( + name, isolated=options.isolated_mode, + ) + if req.name: + reqs_to_uninstall[canonicalize_name(req.name)] = req + for filename in options.requirements: + for req in parse_requirements( + filename, + options=options, + session=session): + if req.name: + reqs_to_uninstall[canonicalize_name(req.name)] = req + if not reqs_to_uninstall: + raise InstallationError( + 'You must give at least one requirement to %(name)s (see ' + '"pip help %(name)s")' % dict(name=self.name) + ) + + protect_pip_from_modification_on_windows( + modifying_pip="pip" in reqs_to_uninstall + ) + + for req in reqs_to_uninstall.values(): + uninstall_pathset = req.uninstall( + auto_confirm=options.yes, verbose=self.verbosity > 0, + ) + if uninstall_pathset: + uninstall_pathset.commit() diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/uninstall 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/uninstall 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..be07c5477e57c10a9f183822fae236ae1961327e GIT binary patch literal 3367 zcmd5;TW=dh6h3RmcAPX#pnxcpGD0dC3ESKxq^guqS_xDr$f1fbDx1yj*dAwZ*_n;w zDtRHi@WMafzwpWr;FqAj^PQQE9cbT+cXvFObIzRGcV_B;Z>;_K$EQDqRQ>As-`*zD zzoQf3^(ZDvJQ{lB@wi5DjgmSI>uy}9c!iP%4I6H}LUEIl77bf&+@N@sk~R(7Zrr4J zjgoa5uDfxI;!Bil&~U?zS1GaG=kZjSYM$sDmLUcy-!*GkDb=v7%f`$qo zbv!g?6HTzMv$!jS>nek zt#s%xYmpfl8b4RLTTZe_ji4`Y~vN@s_%evP2jf>E%G2d2*y(P*6acl6H1F6V?^qm4y_M(xx;j)(fr+f@aE0#NJ*$Hk&<#X%EPl+K?T^H* z%AdDIujil(J^>EIsqtZG_BDI`ZfBE$ivjM zPE!OL34rJ$^yoJzYEsmqF+jXZfEEx19G%q~7Z@&4v|$-8TZTIX_$%Zcih_sEp(&C}U&$ z9L=MkuyQzjwlk4&uBV_}<}7e2%tS8JDMp4NDOGBx$LdI?;^O|+!#yFspCGqgtOP0r z5=oRAj0rSQIj6iz00n2^TsN?5w>yVL925Ru!@o9JA$?PnQh$iy-7I~_h(I5RQC5gB zOGm0mES^O+x&WX^!XO4n&($(E-tZ2(L=FyCdB~0Lt5g}^w}UW=eCX>o4k9}^ccLvr zh2ctu1eb+jN-X;0A}jL_t85*pWjwN-pcrez!8@37Eh5`!jb1-5)KOq$AKveevN!@L z`s2JG9ZtuOKOTMX{{9Ca&F4pEYK-~hquJzr{Kjej`##D=w?bF<^Sk%-cMo~WelP=g zOoO-|y27jbi)sRd4_?B)Z{pL}(2#f4YvXBFPpf`DYSluvq>axO@ojM21WY(H(Ry^| z(P^E}htm~0zQfSC`{*W}HY{d<1)#-a*qnLZX_HQxoY2KJ?wqW!gWL?H+&a8Qcz2I? zEJp)!zNFI@9e+kh+LIPT45EOt6F|bN-F`{t%0jw6gpgw5g5cIs``>f}54Ff3j>G_W9jBPdyKyF)6fb$w1tbnd| ziltR5o^U(8%$(lg6T-V|QM?XcKCtPfaEc=A4vAF_vq;qLXw+YW^oOhjKv4Y|R|1t4 zMHr(Dh4uo*xB}nk@QM4b79B06c#F>xM(<+&t#@r6GLhlxVGqB#O2>R2T8!~O7muJc znO|YaDs&`^{Y*;-9linBydO*BR|UkcR331tvC_|t^RbN_aHy_0g zQlS}GKr;7H5ChwY1<@j72Yk7(Q%)0Q=C+b?ZY$Ga+QC(B-r(jnZmy#-%my!MANDMT zu`8DjY|`=kSy<4>9G_C-Vq)vWppW6w3(vQ3 zu?c)V)7)vcn=8#)`^tlkO%P|%s5H3u`2GL{WL`&uyzcopm7=WZxf=qqzGp8*HYp7! zizPa*n!PYqz5M_e&8mD3xN;j#uczsdMhh}q_g{UAY8BmYp5DY7)Jv2OEt>41_CE=mh1o5aYquHrnq# ... + %prog [options] -r ...""" + + def __init__(self, *args, **kw): + super(UninstallCommand, self).__init__(*args, **kw) + self.cmd_opts.add_option( + '-r', '--requirement', + dest='requirements', + action='append', + default=[], + metavar='file', + help='Uninstall all the packages listed in the given requirements ' + 'file. This option can be used multiple times.', + ) + self.cmd_opts.add_option( + '-y', '--yes', + dest='yes', + action='store_true', + help="Don't ask for confirmation of uninstall deletions.") + + self.parser.insert_option_group(0, self.cmd_opts) + + def run(self, options, args): + session = self.get_default_session(options) + + reqs_to_uninstall = {} + for name in args: + req = install_req_from_line( + name, isolated=options.isolated_mode, + ) + if req.name: + reqs_to_uninstall[canonicalize_name(req.name)] = req + for filename in options.requirements: + for req in parse_requirements( + filename, + options=options, + session=session): + if req.name: + reqs_to_uninstall[canonicalize_name(req.name)] = req + if not reqs_to_uninstall: + raise InstallationError( + 'You must give at least one requirement to %(name)s (see ' + '"pip help %(name)s")' % dict(name=self.name) + ) + + protect_pip_from_modification_on_windows( + modifying_pip="pip" in reqs_to_uninstall + ) + + for req in reqs_to_uninstall.values(): + uninstall_pathset = req.uninstall( + auto_confirm=options.yes, verbose=self.verbosity > 0, + ) + if uninstall_pathset: + uninstall_pathset.commit() diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/uninstall.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/uninstall.pyc new file mode 100644 index 0000000000000000000000000000000000000000..98fd5cb0461d5adea884a1f841080e134adac6c8 GIT binary patch literal 3367 zcmd5;-EJF26h3RmcAPX#+5)0b%BWJom9X6c0;wtxl_G%(1v#LoMrE_v9oysVUv_5W z7$rA^8*X?59)^eDNf7sZXJ%su+I#Tsj_2o`Gw1I+Gxa|=){cMw=!cN1UmgG3+eG>| zbRxVS#YBlmLytTj*C?)0Qm0|vjq4PzP|~1b!;M!cZc@^sVatsh6t7a!reWKSn-s56 zvQEQwH*QgUiINQ(Zn*I(#g{4Bq~RvUZITU=EgID*TBDzd&WN54wlBGgR zQ|7&VeonBr_l}rNR5-E92@%WSNQ!+qfty5{iA0(p3QWMdM$*V4fxE#G7%@_@)M6%~ zz(Vbw71I?vVWDy(W<`+avd~Kcu|I!-GLbxzahC7xIez^ed|4@U8xb9g?=xrnGx4DE z=f|SgbJRloo2FZc2N$!)s%jZRjw~Z{1K-!%h}bXa7`z^x02DQv*60NN8vRP-VQN~Z zDFTfIK=cuM^cxg4DQeLeAYLUv3y1=a&T5Sd43{X{und~uK$pXeIeZlPJnZuf#AhI1^E+89Rcg#~Szmi zkt!04XOWFA04S0$hyl`bwTz87yn`;0gM(Eba^w3dRmS)2AWR}3`nrvS$PUh(Xv#@cZ34rW}7$TnJ|*Ut-e6d2iu_xqzPjsS}O zIPXV?)A5h*kM7;wzxUpJeq^S`m=E8ZP4411PW#{XQ7*a_y1MUv_`#FmfT!#SGl0i5 zi2I={yt==rCP4V$CG7hqK79iXdDp!*o@Vv5>gS_YEo4jD_-qm12FHECgfkPZM`s?L z*77>aCUEJW#$qGBj%|Ob7!yANm_jt#0 zG$7}5I&IPMCxoOuX)(kg3Me}PB)rwf&@a|d^ufvy5Y23<9{w5L1{9- z!je_!NEZ8OCd$lhCF9&yro*&@>)gD-&1>A;L}Qo@UeZ47Sqfui zti4#Wf#7Oq-NN(>IzJE01V`e3k5;E_nR3CiRgb*QTGQL`>fY5_+k4I1s(`xz5Z^?< zj^}zE6!mMEc^$MJ8yHvN*i=+Fj)c$QDPtaT0DM2nLi9O4rN+g?)`>wM!=)Gg+rq^r z@bye{r`c|BtNTwu5Mp8R0$s4w0~$3B ty%49Lb|8Cx6KhZ}Q986}vWMFLBy1LD4_vN&%)r+i!>t+~ByaW9{|4qfT&w^9 literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/wheel 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/wheel 2.py new file mode 100644 index 0000000..eb44bce --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/wheel 2.py @@ -0,0 +1,197 @@ +# -*- coding: utf-8 -*- + +# The following comment should be removed at some point in the future. +# mypy: disallow-untyped-defs=False + +from __future__ import absolute_import + +import logging +import os +import shutil + +from pip._internal.cache import WheelCache +from pip._internal.cli import cmdoptions +from pip._internal.cli.req_command import RequirementCommand +from pip._internal.exceptions import CommandError, PreviousBuildDirError +from pip._internal.req import RequirementSet +from pip._internal.req.req_tracker import get_requirement_tracker +from pip._internal.utils.misc import ensure_dir, normalize_path +from pip._internal.utils.temp_dir import TempDirectory +from pip._internal.utils.typing import MYPY_CHECK_RUNNING +from pip._internal.wheel_builder import build, should_build_for_wheel_command + +if MYPY_CHECK_RUNNING: + from optparse import Values + from typing import Any, List + + +logger = logging.getLogger(__name__) + + +class WheelCommand(RequirementCommand): + """ + Build Wheel archives for your requirements and dependencies. + + Wheel is a built-package format, and offers the advantage of not + recompiling your software during every install. For more details, see the + wheel docs: https://wheel.readthedocs.io/en/latest/ + + Requirements: setuptools>=0.8, and wheel. + + 'pip wheel' uses the bdist_wheel setuptools extension from the wheel + package to build individual wheels. + + """ + + usage = """ + %prog [options] ... + %prog [options] -r ... + %prog [options] [-e] ... + %prog [options] [-e] ... + %prog [options] ...""" + + def __init__(self, *args, **kw): + super(WheelCommand, self).__init__(*args, **kw) + + cmd_opts = self.cmd_opts + + cmd_opts.add_option( + '-w', '--wheel-dir', + dest='wheel_dir', + metavar='dir', + default=os.curdir, + help=("Build wheels into , where the default is the " + "current working directory."), + ) + cmd_opts.add_option(cmdoptions.no_binary()) + cmd_opts.add_option(cmdoptions.only_binary()) + cmd_opts.add_option(cmdoptions.prefer_binary()) + cmd_opts.add_option( + '--build-option', + dest='build_options', + metavar='options', + action='append', + help="Extra arguments to be supplied to 'setup.py bdist_wheel'.", + ) + cmd_opts.add_option(cmdoptions.no_build_isolation()) + cmd_opts.add_option(cmdoptions.use_pep517()) + cmd_opts.add_option(cmdoptions.no_use_pep517()) + cmd_opts.add_option(cmdoptions.constraints()) + cmd_opts.add_option(cmdoptions.editable()) + cmd_opts.add_option(cmdoptions.requirements()) + cmd_opts.add_option(cmdoptions.src()) + cmd_opts.add_option(cmdoptions.ignore_requires_python()) + cmd_opts.add_option(cmdoptions.no_deps()) + cmd_opts.add_option(cmdoptions.build_dir()) + cmd_opts.add_option(cmdoptions.progress_bar()) + + cmd_opts.add_option( + '--global-option', + dest='global_options', + action='append', + metavar='options', + help="Extra global options to be supplied to the setup.py " + "call before the 'bdist_wheel' command.") + + cmd_opts.add_option( + '--pre', + action='store_true', + default=False, + help=("Include pre-release and development versions. By default, " + "pip only finds stable versions."), + ) + + cmd_opts.add_option(cmdoptions.no_clean()) + cmd_opts.add_option(cmdoptions.require_hashes()) + + index_opts = cmdoptions.make_option_group( + cmdoptions.index_group, + self.parser, + ) + + self.parser.insert_option_group(0, index_opts) + self.parser.insert_option_group(0, cmd_opts) + + def run(self, options, args): + # type: (Values, List[Any]) -> None + cmdoptions.check_install_build_global(options) + + session = self.get_default_session(options) + + finder = self._build_package_finder(options, session) + build_delete = (not (options.no_clean or options.build_dir)) + wheel_cache = WheelCache(options.cache_dir, options.format_control) + + options.wheel_dir = normalize_path(options.wheel_dir) + ensure_dir(options.wheel_dir) + + with get_requirement_tracker() as req_tracker, TempDirectory( + options.build_dir, delete=build_delete, kind="wheel" + ) as directory: + + requirement_set = RequirementSet() + + try: + self.populate_requirement_set( + requirement_set, args, options, finder, session, + wheel_cache + ) + + preparer = self.make_requirement_preparer( + temp_build_dir=directory, + options=options, + req_tracker=req_tracker, + session=session, + finder=finder, + wheel_download_dir=options.wheel_dir, + use_user_site=False, + ) + + resolver = self.make_resolver( + preparer=preparer, + finder=finder, + options=options, + wheel_cache=wheel_cache, + ignore_requires_python=options.ignore_requires_python, + use_pep517=options.use_pep517, + ) + + self.trace_basic_info(finder) + + resolver.resolve(requirement_set) + + reqs_to_build = [ + r for r in requirement_set.requirements.values() + if should_build_for_wheel_command(r) + ] + + # build wheels + build_successes, build_failures = build( + reqs_to_build, + wheel_cache=wheel_cache, + build_options=options.build_options or [], + global_options=options.global_options or [], + ) + for req in build_successes: + assert req.link and req.link.is_wheel + assert req.local_file_path + # copy from cache to target directory + try: + shutil.copy(req.local_file_path, options.wheel_dir) + except OSError as e: + logger.warning( + "Building wheel for %s failed: %s", + req.name, e, + ) + build_failures.append(req) + if len(build_failures) != 0: + raise CommandError( + "Failed to build one or more wheels" + ) + except PreviousBuildDirError: + options.no_clean = True + raise + finally: + if not options.no_clean: + requirement_set.cleanup_files() + wheel_cache.cleanup() diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/wheel 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/wheel 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b1e4ae8bbc500e11efd6389d950b63b8a535201a GIT binary patch literal 6191 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 literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/wheel.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/wheel.py new file mode 100644 index 0000000..eb44bce --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/wheel.py @@ -0,0 +1,197 @@ +# -*- coding: utf-8 -*- + +# The following comment should be removed at some point in the future. +# mypy: disallow-untyped-defs=False + +from __future__ import absolute_import + +import logging +import os +import shutil + +from pip._internal.cache import WheelCache +from pip._internal.cli import cmdoptions +from pip._internal.cli.req_command import RequirementCommand +from pip._internal.exceptions import CommandError, PreviousBuildDirError +from pip._internal.req import RequirementSet +from pip._internal.req.req_tracker import get_requirement_tracker +from pip._internal.utils.misc import ensure_dir, normalize_path +from pip._internal.utils.temp_dir import TempDirectory +from pip._internal.utils.typing import MYPY_CHECK_RUNNING +from pip._internal.wheel_builder import build, should_build_for_wheel_command + +if MYPY_CHECK_RUNNING: + from optparse import Values + from typing import Any, List + + +logger = logging.getLogger(__name__) + + +class WheelCommand(RequirementCommand): + """ + Build Wheel archives for your requirements and dependencies. + + Wheel is a built-package format, and offers the advantage of not + recompiling your software during every install. For more details, see the + wheel docs: https://wheel.readthedocs.io/en/latest/ + + Requirements: setuptools>=0.8, and wheel. + + 'pip wheel' uses the bdist_wheel setuptools extension from the wheel + package to build individual wheels. + + """ + + usage = """ + %prog [options] ... + %prog [options] -r ... + %prog [options] [-e] ... + %prog [options] [-e] ... + %prog [options] ...""" + + def __init__(self, *args, **kw): + super(WheelCommand, self).__init__(*args, **kw) + + cmd_opts = self.cmd_opts + + cmd_opts.add_option( + '-w', '--wheel-dir', + dest='wheel_dir', + metavar='dir', + default=os.curdir, + help=("Build wheels into , where the default is the " + "current working directory."), + ) + cmd_opts.add_option(cmdoptions.no_binary()) + cmd_opts.add_option(cmdoptions.only_binary()) + cmd_opts.add_option(cmdoptions.prefer_binary()) + cmd_opts.add_option( + '--build-option', + dest='build_options', + metavar='options', + action='append', + help="Extra arguments to be supplied to 'setup.py bdist_wheel'.", + ) + cmd_opts.add_option(cmdoptions.no_build_isolation()) + cmd_opts.add_option(cmdoptions.use_pep517()) + cmd_opts.add_option(cmdoptions.no_use_pep517()) + cmd_opts.add_option(cmdoptions.constraints()) + cmd_opts.add_option(cmdoptions.editable()) + cmd_opts.add_option(cmdoptions.requirements()) + cmd_opts.add_option(cmdoptions.src()) + cmd_opts.add_option(cmdoptions.ignore_requires_python()) + cmd_opts.add_option(cmdoptions.no_deps()) + cmd_opts.add_option(cmdoptions.build_dir()) + cmd_opts.add_option(cmdoptions.progress_bar()) + + cmd_opts.add_option( + '--global-option', + dest='global_options', + action='append', + metavar='options', + help="Extra global options to be supplied to the setup.py " + "call before the 'bdist_wheel' command.") + + cmd_opts.add_option( + '--pre', + action='store_true', + default=False, + help=("Include pre-release and development versions. By default, " + "pip only finds stable versions."), + ) + + cmd_opts.add_option(cmdoptions.no_clean()) + cmd_opts.add_option(cmdoptions.require_hashes()) + + index_opts = cmdoptions.make_option_group( + cmdoptions.index_group, + self.parser, + ) + + self.parser.insert_option_group(0, index_opts) + self.parser.insert_option_group(0, cmd_opts) + + def run(self, options, args): + # type: (Values, List[Any]) -> None + cmdoptions.check_install_build_global(options) + + session = self.get_default_session(options) + + finder = self._build_package_finder(options, session) + build_delete = (not (options.no_clean or options.build_dir)) + wheel_cache = WheelCache(options.cache_dir, options.format_control) + + options.wheel_dir = normalize_path(options.wheel_dir) + ensure_dir(options.wheel_dir) + + with get_requirement_tracker() as req_tracker, TempDirectory( + options.build_dir, delete=build_delete, kind="wheel" + ) as directory: + + requirement_set = RequirementSet() + + try: + self.populate_requirement_set( + requirement_set, args, options, finder, session, + wheel_cache + ) + + preparer = self.make_requirement_preparer( + temp_build_dir=directory, + options=options, + req_tracker=req_tracker, + session=session, + finder=finder, + wheel_download_dir=options.wheel_dir, + use_user_site=False, + ) + + resolver = self.make_resolver( + preparer=preparer, + finder=finder, + options=options, + wheel_cache=wheel_cache, + ignore_requires_python=options.ignore_requires_python, + use_pep517=options.use_pep517, + ) + + self.trace_basic_info(finder) + + resolver.resolve(requirement_set) + + reqs_to_build = [ + r for r in requirement_set.requirements.values() + if should_build_for_wheel_command(r) + ] + + # build wheels + build_successes, build_failures = build( + reqs_to_build, + wheel_cache=wheel_cache, + build_options=options.build_options or [], + global_options=options.global_options or [], + ) + for req in build_successes: + assert req.link and req.link.is_wheel + assert req.local_file_path + # copy from cache to target directory + try: + shutil.copy(req.local_file_path, options.wheel_dir) + except OSError as e: + logger.warning( + "Building wheel for %s failed: %s", + req.name, e, + ) + build_failures.append(req) + if len(build_failures) != 0: + raise CommandError( + "Failed to build one or more wheels" + ) + except PreviousBuildDirError: + options.no_clean = True + raise + finally: + if not options.no_clean: + requirement_set.cleanup_files() + wheel_cache.cleanup() diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/wheel.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/commands/wheel.pyc new file mode 100644 index 0000000000000000000000000000000000000000..aab52bdb7ed6e5ed82419958590c1d8cc2253afe GIT binary patch literal 6191 zcmd5=OLH5?5$;`(AVCo%^`JzFlC^%wViEzA?KpN+vPzb0Ij%UgvvMK}erzpw2jqhL z($0VqT;wH6<&vuS59A;CnxiXK`58GSzaW=X?)kcBL4u;~936sK%=C2k%=C2k*Rzd( zx96Vx?X52&s{b1Jy?vWV-*Sjz{5zBqWe)Wma=7nO>Qc{@F|-@hYmD1d)SHragVJfr zn$&ArnJG$VD4V6;tnE)z+M;ZZdULklr1S)3^VFNCtWCYPrOr^gK-nVo7Hxl)(k04H zQtzbgwcd!(?}ENMoA(`)jOK{{@nB9{$9po+$UiD%wtVmG-bsZ&VB`Z^C@q!y$RGDpek< zJW7=A&WQ#qn_%4IU7Ah_GlyG>wPc~WCUQl;uPW`CZRLgWZkQWpDEeMr7*PW27Fn63 zNxo%g)V#Okr^SIeaI zgmBdxY8a09w;AKe>@iPh@YE9ne?t^_{i?`>QzT`N2nB@$J%s4>; z%d@1pqojCFCO9Dz%v0Q^ctNx;Le-@96G!EE!ujK*_Hoj}aT0VtyR4<-q?5-&fwcVO;DTHpK)7yN*xG@ENiCSs8{Jr!isQb4S&(QC7wz?wlun zUf{DHtnzX1Pu1^y9S-{G)SoOnUYD8>XrKSD=M4L!OSR;H9$v44&>l()|@)T!= zTFyhRoY}MEH8r1 zBoC{RVNc{`jQf1b*bKmOOyO#Y`MIJ964YIxoH82&kQ0=ueEpR-#5=$>L1E1iwvE$= zH)>g`iWAwV6ciI^p~by*6`8Y;O14l5sd4F~gK}iHu^;w)Oo0kO%O>oKI3~DgV=Sta z*1;x%g-v!ZOmWm~EeJ(8np}#kde&e&)Z2(SHfa{_sM?!?t*QXz^4f7M>Pg*amoCFf ztIC{~A#NQJS>q`sAhk;S(tyirIfR|ZzQ?0%GOLx3YYjb;hc3`sFRNr1rNBCZeZ60# zF}!Adt6YyC4Yt1gY5$e$o3Fe!8ts~aG3Jfe9&caA-&Vf<@j4u-Qa+^-eY2wpzW*Vm*{&3HJW?V~o<_Vec zXQpw`ngW-M%tKGanTwr>GvM9ZnDHBnn*(5_gCuNoreG&JjF(T zKxd1%H8@w});piC(EdD`^R$O;J5)su8eh2dD024OWPoHS5bRvo8|GT2^3SXVh|1lI zRDR7}z~pDJ?gH&E(vv^Z-U7Yz`BT~l(-I9XQT2DnHU`g;{)b~O)9+wW40)vgRd+`h z$UIMj7izk-1*7GIM}Kvu%!{-$N7ZfD*~gvKyhMX5jOVQ5W!i(e8rbO~4X!eYcM73T z@O@y`2y{?@^*ar!`mXsA0qQ})8gkqQ^Gh^kek|($;5v?De!^P|rs#J_3l4qq0NBi{ znIiqQ%htQb=kCD%gO0SIM3{bEKLyLrz>_y5vBt>xMoG8>LSsoh0>P4N3@&bU;^g#u z9%7POkb}mTLCI>U+!-N6Bf|lb3kOVH2o#U=vWeMbb_fl!69KIJ3)%` zmX(V53hZ~$_c_P-EBv^KhxYKe!^xZ>Uzp{(bp^#YE;1^<;a$;!KKcc4-V>TYDa!z| zaBZruJ|e8wWD`3fTU?gZ$#>$q3<<{D<|}s1S>HnfYX$!`jQH32 z!Ns>^ec9N-mDyhLaGT9dRir+bPd;a8pUvVkV)&eOeNNzpZBQ2FkZ)XLbYXWCw+(yxf^Q0Gy0}kJO`dNG>`GQ!_M z_t1{g`axzs`Ugn`ew&VRsEP9G?s zx(CHm*XB~mKs>`UgK1*xYOd9f4dH#yqw%{ozrpGy2^~?doNm_o&biV7!HR%7q-DDd#ZG7C~ d@X;^fvE__#|Bf6h)mQ4%jX=NpTS{{qG`>^}ei literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/configuration 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/configuration 2.py new file mode 100644 index 0000000..f09a1ae --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/configuration 2.py @@ -0,0 +1,422 @@ +"""Configuration management setup + +Some terminology: +- name + As written in config files. +- value + Value associated with a name +- key + Name combined with it's section (section.name) +- variant + A single word describing where the configuration key-value pair came from +""" + +# The following comment should be removed at some point in the future. +# mypy: strict-optional=False + +import locale +import logging +import os +import sys + +from pip._vendor.six.moves import configparser + +from pip._internal.exceptions import ( + ConfigurationError, + ConfigurationFileCouldNotBeLoaded, +) +from pip._internal.utils import appdirs +from pip._internal.utils.compat import WINDOWS, expanduser +from pip._internal.utils.misc import ensure_dir, enum +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import ( + Any, Dict, Iterable, List, NewType, Optional, Tuple + ) + + RawConfigParser = configparser.RawConfigParser # Shorthand + Kind = NewType("Kind", str) + +logger = logging.getLogger(__name__) + + +# NOTE: Maybe use the optionx attribute to normalize keynames. +def _normalize_name(name): + # type: (str) -> str + """Make a name consistent regardless of source (environment or file) + """ + name = name.lower().replace('_', '-') + if name.startswith('--'): + name = name[2:] # only prefer long opts + return name + + +def _disassemble_key(name): + # type: (str) -> List[str] + if "." not in name: + error_message = ( + "Key does not contain dot separated section and key. " + "Perhaps you wanted to use 'global.{}' instead?" + ).format(name) + raise ConfigurationError(error_message) + return name.split(".", 1) + + +# The kinds of configurations there are. +kinds = enum( + USER="user", # User Specific + GLOBAL="global", # System Wide + SITE="site", # [Virtual] Environment Specific + ENV="env", # from PIP_CONFIG_FILE + ENV_VAR="env-var", # from Environment Variables +) + + +CONFIG_BASENAME = 'pip.ini' if WINDOWS else 'pip.conf' + + +def get_configuration_files(): + # type: () -> Dict[Kind, List[str]] + global_config_files = [ + os.path.join(path, CONFIG_BASENAME) + for path in appdirs.site_config_dirs('pip') + ] + + site_config_file = os.path.join(sys.prefix, CONFIG_BASENAME) + legacy_config_file = os.path.join( + expanduser('~'), + 'pip' if WINDOWS else '.pip', + CONFIG_BASENAME, + ) + new_config_file = os.path.join( + appdirs.user_config_dir("pip"), CONFIG_BASENAME + ) + return { + kinds.GLOBAL: global_config_files, + kinds.SITE: [site_config_file], + kinds.USER: [legacy_config_file, new_config_file], + } + + +class Configuration(object): + """Handles management of configuration. + + Provides an interface to accessing and managing configuration files. + + This class converts provides an API that takes "section.key-name" style + keys and stores the value associated with it as "key-name" under the + section "section". + + This allows for a clean interface wherein the both the section and the + key-name are preserved in an easy to manage form in the configuration files + and the data stored is also nice. + """ + + def __init__(self, isolated, load_only=None): + # type: (bool, Kind) -> None + super(Configuration, self).__init__() + + _valid_load_only = [kinds.USER, kinds.GLOBAL, kinds.SITE, None] + if load_only not in _valid_load_only: + raise ConfigurationError( + "Got invalid value for load_only - should be one of {}".format( + ", ".join(map(repr, _valid_load_only[:-1])) + ) + ) + self.isolated = isolated # type: bool + self.load_only = load_only # type: Optional[Kind] + + # The order here determines the override order. + self._override_order = [ + kinds.GLOBAL, kinds.USER, kinds.SITE, kinds.ENV, kinds.ENV_VAR + ] + + self._ignore_env_names = ["version", "help"] + + # Because we keep track of where we got the data from + self._parsers = { + variant: [] for variant in self._override_order + } # type: Dict[Kind, List[Tuple[str, RawConfigParser]]] + self._config = { + variant: {} for variant in self._override_order + } # type: Dict[Kind, Dict[str, Any]] + self._modified_parsers = [] # type: List[Tuple[str, RawConfigParser]] + + def load(self): + # type: () -> None + """Loads configuration from configuration files and environment + """ + self._load_config_files() + if not self.isolated: + self._load_environment_vars() + + def get_file_to_edit(self): + # type: () -> Optional[str] + """Returns the file with highest priority in configuration + """ + assert self.load_only is not None, \ + "Need to be specified a file to be editing" + + try: + return self._get_parser_to_modify()[0] + except IndexError: + return None + + def items(self): + # type: () -> Iterable[Tuple[str, Any]] + """Returns key-value pairs like dict.items() representing the loaded + configuration + """ + return self._dictionary.items() + + def get_value(self, key): + # type: (str) -> Any + """Get a value from the configuration. + """ + try: + return self._dictionary[key] + except KeyError: + raise ConfigurationError("No such key - {}".format(key)) + + def set_value(self, key, value): + # type: (str, Any) -> None + """Modify a value in the configuration. + """ + self._ensure_have_load_only() + + fname, parser = self._get_parser_to_modify() + + if parser is not None: + section, name = _disassemble_key(key) + + # Modify the parser and the configuration + if not parser.has_section(section): + parser.add_section(section) + parser.set(section, name, value) + + self._config[self.load_only][key] = value + self._mark_as_modified(fname, parser) + + def unset_value(self, key): + # type: (str) -> None + """Unset a value in the configuration. + """ + self._ensure_have_load_only() + + if key not in self._config[self.load_only]: + raise ConfigurationError("No such key - {}".format(key)) + + fname, parser = self._get_parser_to_modify() + + if parser is not None: + section, name = _disassemble_key(key) + + # Remove the key in the parser + modified_something = False + if parser.has_section(section): + # Returns whether the option was removed or not + modified_something = parser.remove_option(section, name) + + if modified_something: + # name removed from parser, section may now be empty + section_iter = iter(parser.items(section)) + try: + val = next(section_iter) + except StopIteration: + val = None + + if val is None: + parser.remove_section(section) + + self._mark_as_modified(fname, parser) + else: + raise ConfigurationError( + "Fatal Internal error [id=1]. Please report as a bug." + ) + + del self._config[self.load_only][key] + + def save(self): + # type: () -> None + """Save the current in-memory state. + """ + self._ensure_have_load_only() + + for fname, parser in self._modified_parsers: + logger.info("Writing to %s", fname) + + # Ensure directory exists. + ensure_dir(os.path.dirname(fname)) + + with open(fname, "w") as f: + parser.write(f) + + # + # Private routines + # + + def _ensure_have_load_only(self): + # type: () -> None + if self.load_only is None: + raise ConfigurationError("Needed a specific file to be modifying.") + logger.debug("Will be working with %s variant only", self.load_only) + + @property + def _dictionary(self): + # type: () -> Dict[str, Any] + """A dictionary representing the loaded configuration. + """ + # NOTE: Dictionaries are not populated if not loaded. So, conditionals + # are not needed here. + retval = {} + + for variant in self._override_order: + retval.update(self._config[variant]) + + return retval + + def _load_config_files(self): + # type: () -> None + """Loads configuration from configuration files + """ + config_files = dict(self._iter_config_files()) + if config_files[kinds.ENV][0:1] == [os.devnull]: + logger.debug( + "Skipping loading configuration files due to " + "environment's PIP_CONFIG_FILE being os.devnull" + ) + return + + for variant, files in config_files.items(): + for fname in files: + # If there's specific variant set in `load_only`, load only + # that variant, not the others. + if self.load_only is not None and variant != self.load_only: + logger.debug( + "Skipping file '%s' (variant: %s)", fname, variant + ) + continue + + parser = self._load_file(variant, fname) + + # Keeping track of the parsers used + self._parsers[variant].append((fname, parser)) + + def _load_file(self, variant, fname): + # type: (Kind, str) -> RawConfigParser + logger.debug("For variant '%s', will try loading '%s'", variant, fname) + parser = self._construct_parser(fname) + + for section in parser.sections(): + items = parser.items(section) + self._config[variant].update(self._normalized_keys(section, items)) + + return parser + + def _construct_parser(self, fname): + # type: (str) -> RawConfigParser + parser = configparser.RawConfigParser() + # If there is no such file, don't bother reading it but create the + # parser anyway, to hold the data. + # Doing this is useful when modifying and saving files, where we don't + # need to construct a parser. + if os.path.exists(fname): + try: + parser.read(fname) + except UnicodeDecodeError: + # See https://github.com/pypa/pip/issues/4963 + raise ConfigurationFileCouldNotBeLoaded( + reason="contains invalid {} characters".format( + locale.getpreferredencoding(False) + ), + fname=fname, + ) + except configparser.Error as error: + # See https://github.com/pypa/pip/issues/4893 + raise ConfigurationFileCouldNotBeLoaded(error=error) + return parser + + def _load_environment_vars(self): + # type: () -> None + """Loads configuration from environment variables + """ + self._config[kinds.ENV_VAR].update( + self._normalized_keys(":env:", self._get_environ_vars()) + ) + + def _normalized_keys(self, section, items): + # type: (str, Iterable[Tuple[str, Any]]) -> Dict[str, Any] + """Normalizes items to construct a dictionary with normalized keys. + + This routine is where the names become keys and are made the same + regardless of source - configuration files or environment. + """ + normalized = {} + for name, val in items: + key = section + "." + _normalize_name(name) + normalized[key] = val + return normalized + + def _get_environ_vars(self): + # type: () -> Iterable[Tuple[str, str]] + """Returns a generator with all environmental vars with prefix PIP_""" + for key, val in os.environ.items(): + should_be_yielded = ( + key.startswith("PIP_") and + key[4:].lower() not in self._ignore_env_names + ) + if should_be_yielded: + yield key[4:].lower(), val + + # XXX: This is patched in the tests. + def _iter_config_files(self): + # type: () -> Iterable[Tuple[Kind, List[str]]] + """Yields variant and configuration files associated with it. + + This should be treated like items of a dictionary. + """ + # SMELL: Move the conditions out of this function + + # environment variables have the lowest priority + config_file = os.environ.get('PIP_CONFIG_FILE', None) + if config_file is not None: + yield kinds.ENV, [config_file] + else: + yield kinds.ENV, [] + + config_files = get_configuration_files() + + # at the base we have any global configuration + yield kinds.GLOBAL, config_files[kinds.GLOBAL] + + # per-user configuration next + should_load_user_config = not self.isolated and not ( + config_file and os.path.exists(config_file) + ) + if should_load_user_config: + # The legacy config file is overridden by the new config file + yield kinds.USER, config_files[kinds.USER] + + # finally virtualenv configuration first trumping others + yield kinds.SITE, config_files[kinds.SITE] + + def _get_parser_to_modify(self): + # type: () -> Tuple[str, RawConfigParser] + # Determine which parser to modify + parsers = self._parsers[self.load_only] + if not parsers: + # This should not happen if everything works correctly. + raise ConfigurationError( + "Fatal Internal error [id=2]. Please report as a bug." + ) + + # Use the highest priority parser. + return parsers[-1] + + # XXX: This is patched in the tests. + def _mark_as_modified(self, fname, parser): + # type: (str, RawConfigParser) -> None + file_parser_tuple = (fname, parser) + if file_parser_tuple not in self._modified_parsers: + self._modified_parsers.append(file_parser_tuple) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/configuration 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/configuration 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..430e4507be4108582756512f297478ea09e23562 GIT binary patch literal 14013 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 Zw@VfHYSX34cx8fqoB64fW{Z`D{{el!Bjx}A literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/configuration.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/configuration.py new file mode 100644 index 0000000..f09a1ae --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/configuration.py @@ -0,0 +1,422 @@ +"""Configuration management setup + +Some terminology: +- name + As written in config files. +- value + Value associated with a name +- key + Name combined with it's section (section.name) +- variant + A single word describing where the configuration key-value pair came from +""" + +# The following comment should be removed at some point in the future. +# mypy: strict-optional=False + +import locale +import logging +import os +import sys + +from pip._vendor.six.moves import configparser + +from pip._internal.exceptions import ( + ConfigurationError, + ConfigurationFileCouldNotBeLoaded, +) +from pip._internal.utils import appdirs +from pip._internal.utils.compat import WINDOWS, expanduser +from pip._internal.utils.misc import ensure_dir, enum +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import ( + Any, Dict, Iterable, List, NewType, Optional, Tuple + ) + + RawConfigParser = configparser.RawConfigParser # Shorthand + Kind = NewType("Kind", str) + +logger = logging.getLogger(__name__) + + +# NOTE: Maybe use the optionx attribute to normalize keynames. +def _normalize_name(name): + # type: (str) -> str + """Make a name consistent regardless of source (environment or file) + """ + name = name.lower().replace('_', '-') + if name.startswith('--'): + name = name[2:] # only prefer long opts + return name + + +def _disassemble_key(name): + # type: (str) -> List[str] + if "." not in name: + error_message = ( + "Key does not contain dot separated section and key. " + "Perhaps you wanted to use 'global.{}' instead?" + ).format(name) + raise ConfigurationError(error_message) + return name.split(".", 1) + + +# The kinds of configurations there are. +kinds = enum( + USER="user", # User Specific + GLOBAL="global", # System Wide + SITE="site", # [Virtual] Environment Specific + ENV="env", # from PIP_CONFIG_FILE + ENV_VAR="env-var", # from Environment Variables +) + + +CONFIG_BASENAME = 'pip.ini' if WINDOWS else 'pip.conf' + + +def get_configuration_files(): + # type: () -> Dict[Kind, List[str]] + global_config_files = [ + os.path.join(path, CONFIG_BASENAME) + for path in appdirs.site_config_dirs('pip') + ] + + site_config_file = os.path.join(sys.prefix, CONFIG_BASENAME) + legacy_config_file = os.path.join( + expanduser('~'), + 'pip' if WINDOWS else '.pip', + CONFIG_BASENAME, + ) + new_config_file = os.path.join( + appdirs.user_config_dir("pip"), CONFIG_BASENAME + ) + return { + kinds.GLOBAL: global_config_files, + kinds.SITE: [site_config_file], + kinds.USER: [legacy_config_file, new_config_file], + } + + +class Configuration(object): + """Handles management of configuration. + + Provides an interface to accessing and managing configuration files. + + This class converts provides an API that takes "section.key-name" style + keys and stores the value associated with it as "key-name" under the + section "section". + + This allows for a clean interface wherein the both the section and the + key-name are preserved in an easy to manage form in the configuration files + and the data stored is also nice. + """ + + def __init__(self, isolated, load_only=None): + # type: (bool, Kind) -> None + super(Configuration, self).__init__() + + _valid_load_only = [kinds.USER, kinds.GLOBAL, kinds.SITE, None] + if load_only not in _valid_load_only: + raise ConfigurationError( + "Got invalid value for load_only - should be one of {}".format( + ", ".join(map(repr, _valid_load_only[:-1])) + ) + ) + self.isolated = isolated # type: bool + self.load_only = load_only # type: Optional[Kind] + + # The order here determines the override order. + self._override_order = [ + kinds.GLOBAL, kinds.USER, kinds.SITE, kinds.ENV, kinds.ENV_VAR + ] + + self._ignore_env_names = ["version", "help"] + + # Because we keep track of where we got the data from + self._parsers = { + variant: [] for variant in self._override_order + } # type: Dict[Kind, List[Tuple[str, RawConfigParser]]] + self._config = { + variant: {} for variant in self._override_order + } # type: Dict[Kind, Dict[str, Any]] + self._modified_parsers = [] # type: List[Tuple[str, RawConfigParser]] + + def load(self): + # type: () -> None + """Loads configuration from configuration files and environment + """ + self._load_config_files() + if not self.isolated: + self._load_environment_vars() + + def get_file_to_edit(self): + # type: () -> Optional[str] + """Returns the file with highest priority in configuration + """ + assert self.load_only is not None, \ + "Need to be specified a file to be editing" + + try: + return self._get_parser_to_modify()[0] + except IndexError: + return None + + def items(self): + # type: () -> Iterable[Tuple[str, Any]] + """Returns key-value pairs like dict.items() representing the loaded + configuration + """ + return self._dictionary.items() + + def get_value(self, key): + # type: (str) -> Any + """Get a value from the configuration. + """ + try: + return self._dictionary[key] + except KeyError: + raise ConfigurationError("No such key - {}".format(key)) + + def set_value(self, key, value): + # type: (str, Any) -> None + """Modify a value in the configuration. + """ + self._ensure_have_load_only() + + fname, parser = self._get_parser_to_modify() + + if parser is not None: + section, name = _disassemble_key(key) + + # Modify the parser and the configuration + if not parser.has_section(section): + parser.add_section(section) + parser.set(section, name, value) + + self._config[self.load_only][key] = value + self._mark_as_modified(fname, parser) + + def unset_value(self, key): + # type: (str) -> None + """Unset a value in the configuration. + """ + self._ensure_have_load_only() + + if key not in self._config[self.load_only]: + raise ConfigurationError("No such key - {}".format(key)) + + fname, parser = self._get_parser_to_modify() + + if parser is not None: + section, name = _disassemble_key(key) + + # Remove the key in the parser + modified_something = False + if parser.has_section(section): + # Returns whether the option was removed or not + modified_something = parser.remove_option(section, name) + + if modified_something: + # name removed from parser, section may now be empty + section_iter = iter(parser.items(section)) + try: + val = next(section_iter) + except StopIteration: + val = None + + if val is None: + parser.remove_section(section) + + self._mark_as_modified(fname, parser) + else: + raise ConfigurationError( + "Fatal Internal error [id=1]. Please report as a bug." + ) + + del self._config[self.load_only][key] + + def save(self): + # type: () -> None + """Save the current in-memory state. + """ + self._ensure_have_load_only() + + for fname, parser in self._modified_parsers: + logger.info("Writing to %s", fname) + + # Ensure directory exists. + ensure_dir(os.path.dirname(fname)) + + with open(fname, "w") as f: + parser.write(f) + + # + # Private routines + # + + def _ensure_have_load_only(self): + # type: () -> None + if self.load_only is None: + raise ConfigurationError("Needed a specific file to be modifying.") + logger.debug("Will be working with %s variant only", self.load_only) + + @property + def _dictionary(self): + # type: () -> Dict[str, Any] + """A dictionary representing the loaded configuration. + """ + # NOTE: Dictionaries are not populated if not loaded. So, conditionals + # are not needed here. + retval = {} + + for variant in self._override_order: + retval.update(self._config[variant]) + + return retval + + def _load_config_files(self): + # type: () -> None + """Loads configuration from configuration files + """ + config_files = dict(self._iter_config_files()) + if config_files[kinds.ENV][0:1] == [os.devnull]: + logger.debug( + "Skipping loading configuration files due to " + "environment's PIP_CONFIG_FILE being os.devnull" + ) + return + + for variant, files in config_files.items(): + for fname in files: + # If there's specific variant set in `load_only`, load only + # that variant, not the others. + if self.load_only is not None and variant != self.load_only: + logger.debug( + "Skipping file '%s' (variant: %s)", fname, variant + ) + continue + + parser = self._load_file(variant, fname) + + # Keeping track of the parsers used + self._parsers[variant].append((fname, parser)) + + def _load_file(self, variant, fname): + # type: (Kind, str) -> RawConfigParser + logger.debug("For variant '%s', will try loading '%s'", variant, fname) + parser = self._construct_parser(fname) + + for section in parser.sections(): + items = parser.items(section) + self._config[variant].update(self._normalized_keys(section, items)) + + return parser + + def _construct_parser(self, fname): + # type: (str) -> RawConfigParser + parser = configparser.RawConfigParser() + # If there is no such file, don't bother reading it but create the + # parser anyway, to hold the data. + # Doing this is useful when modifying and saving files, where we don't + # need to construct a parser. + if os.path.exists(fname): + try: + parser.read(fname) + except UnicodeDecodeError: + # See https://github.com/pypa/pip/issues/4963 + raise ConfigurationFileCouldNotBeLoaded( + reason="contains invalid {} characters".format( + locale.getpreferredencoding(False) + ), + fname=fname, + ) + except configparser.Error as error: + # See https://github.com/pypa/pip/issues/4893 + raise ConfigurationFileCouldNotBeLoaded(error=error) + return parser + + def _load_environment_vars(self): + # type: () -> None + """Loads configuration from environment variables + """ + self._config[kinds.ENV_VAR].update( + self._normalized_keys(":env:", self._get_environ_vars()) + ) + + def _normalized_keys(self, section, items): + # type: (str, Iterable[Tuple[str, Any]]) -> Dict[str, Any] + """Normalizes items to construct a dictionary with normalized keys. + + This routine is where the names become keys and are made the same + regardless of source - configuration files or environment. + """ + normalized = {} + for name, val in items: + key = section + "." + _normalize_name(name) + normalized[key] = val + return normalized + + def _get_environ_vars(self): + # type: () -> Iterable[Tuple[str, str]] + """Returns a generator with all environmental vars with prefix PIP_""" + for key, val in os.environ.items(): + should_be_yielded = ( + key.startswith("PIP_") and + key[4:].lower() not in self._ignore_env_names + ) + if should_be_yielded: + yield key[4:].lower(), val + + # XXX: This is patched in the tests. + def _iter_config_files(self): + # type: () -> Iterable[Tuple[Kind, List[str]]] + """Yields variant and configuration files associated with it. + + This should be treated like items of a dictionary. + """ + # SMELL: Move the conditions out of this function + + # environment variables have the lowest priority + config_file = os.environ.get('PIP_CONFIG_FILE', None) + if config_file is not None: + yield kinds.ENV, [config_file] + else: + yield kinds.ENV, [] + + config_files = get_configuration_files() + + # at the base we have any global configuration + yield kinds.GLOBAL, config_files[kinds.GLOBAL] + + # per-user configuration next + should_load_user_config = not self.isolated and not ( + config_file and os.path.exists(config_file) + ) + if should_load_user_config: + # The legacy config file is overridden by the new config file + yield kinds.USER, config_files[kinds.USER] + + # finally virtualenv configuration first trumping others + yield kinds.SITE, config_files[kinds.SITE] + + def _get_parser_to_modify(self): + # type: () -> Tuple[str, RawConfigParser] + # Determine which parser to modify + parsers = self._parsers[self.load_only] + if not parsers: + # This should not happen if everything works correctly. + raise ConfigurationError( + "Fatal Internal error [id=2]. Please report as a bug." + ) + + # Use the highest priority parser. + return parsers[-1] + + # XXX: This is patched in the tests. + def _mark_as_modified(self, fname, parser): + # type: (str, RawConfigParser) -> None + file_parser_tuple = (fname, parser) + if file_parser_tuple not in self._modified_parsers: + self._modified_parsers.append(file_parser_tuple) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/configuration.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/configuration.pyc new file mode 100644 index 0000000000000000000000000000000000000000..41cf5f665f2fa86693f0ddfe65e6c278e94959e2 GIT binary patch literal 14013 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 YcBukiZMsw$uT0QyGe4EmY_YQNKb;R8EC2ui literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/distributions/__init__ 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/distributions/__init__ 2.py new file mode 100644 index 0000000..d5c1afc --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/distributions/__init__ 2.py @@ -0,0 +1,24 @@ +from pip._internal.distributions.sdist import SourceDistribution +from pip._internal.distributions.wheel import WheelDistribution +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from pip._internal.distributions.base import AbstractDistribution + from pip._internal.req.req_install import InstallRequirement + + +def make_distribution_for_install_requirement(install_req): + # type: (InstallRequirement) -> AbstractDistribution + """Returns a Distribution for the given InstallRequirement + """ + # Editable requirements will always be source distributions. They use the + # legacy logic until we create a modern standard for them. + if install_req.editable: + return SourceDistribution(install_req) + + # If it's a wheel, it's a WheelDistribution + if install_req.is_wheel: + return WheelDistribution(install_req) + + # Otherwise, a SourceDistribution + return SourceDistribution(install_req) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/distributions/__init__ 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/distributions/__init__ 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6760a6801087124f1416cee37fc5918a5cd97fbf GIT binary patch literal 1071 zcmc&y&2G~`5T1?m(*%%!aza8f7ZeV)Q?(M8f~e98DnwK{R46`RIq@dhuy&l?NunTb z@L*hd9v%Q@;)VtVi6iUGWOnA8|8;)cX?*|o{KEjQPl^6t64@cKgnj}vKq?>p_i(%rCw25qs*k^zVfY}EWEPoNuWmO5x6F_I9 zx-qWv+Y|B(B+gA{-Pql(z#UGFi(~1I)Iw(NZW#@iPP0q_kmn>5g>hfYfaF4>Y_#Nw z1YB#;?k$p3(NJXMtjX9lvrCfv+^9v2(qF{JA5L{5jrB*lpUftsPshWJUj3O^z;Zw?;#vf(0 z4T-3K!mNkSwQi>0Ah2Zy)w*anOr0k8g^!6*TJLvCZ#$m#EMJT9{0n+BH+;Agm0q2; z9-#2+Cfrl9?_=NfEOC@LT{Gy|2M?-oTSrauH_4UP4+gi MyMn$_mH58%3x1g%{r~^~ literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/distributions/__init__.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/distributions/__init__.py new file mode 100644 index 0000000..d5c1afc --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/distributions/__init__.py @@ -0,0 +1,24 @@ +from pip._internal.distributions.sdist import SourceDistribution +from pip._internal.distributions.wheel import WheelDistribution +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from pip._internal.distributions.base import AbstractDistribution + from pip._internal.req.req_install import InstallRequirement + + +def make_distribution_for_install_requirement(install_req): + # type: (InstallRequirement) -> AbstractDistribution + """Returns a Distribution for the given InstallRequirement + """ + # Editable requirements will always be source distributions. They use the + # legacy logic until we create a modern standard for them. + if install_req.editable: + return SourceDistribution(install_req) + + # If it's a wheel, it's a WheelDistribution + if install_req.is_wheel: + return WheelDistribution(install_req) + + # Otherwise, a SourceDistribution + return SourceDistribution(install_req) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/distributions/__init__.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/distributions/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d27619413d9a08dee5f215c43dd767331b5a3653 GIT binary patch literal 1071 zcmc&yUyss25TB*|IZzYzd@?bqF9sj3op8bcp!3SD4vTgvVLVtmst z=4bK)=nOpsgNcuBnPGP3H~-i9ajo&``=bv7xI88Le?nx3#1i@m&;Y4`P=Mfj33Lfk z2STT~JD|&uRv@f^kQFe!wO1K*71A1nwE|TEeE?}4!a9hIqEz7Wj~+YPe4A4{qCP3-o%_of%MUp{ZYih_5Y&PC@%;dYB` zPx}-s9^l_SFEWd<)`6VOm655;aKObd@krW4wngj-_edJOhbylUX-*cPns*Q{&=Tx+AranY&*`!==+KQvl>S$wXn?*D@fv&?p-%c_IPV zTC{tGBvmvN898e*cFpXPBtJK55u@}MvGIpfok(N-QSK+R$>{Tg;c=^fe7agKaDs?u zr^|7R&M5QW`nk%FF2f$3oIUJ>0jt&&sSKsbV(lk8JF|X728B`N None + super(AbstractDistribution, self).__init__() + self.req = req + + @abc.abstractmethod + def get_pkg_resources_distribution(self): + # type: () -> Optional[Distribution] + raise NotImplementedError() + + @abc.abstractmethod + def prepare_distribution_metadata(self, finder, build_isolation): + # type: (PackageFinder, bool) -> None + raise NotImplementedError() diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/distributions/base 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/distributions/base 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e59925a83ebee00f63c699b92d8aa298d0a112f0 GIT binary patch literal 2413 zcmd5;-ESL35T84LByp1_G`xTWS|K4^MC?{YLgGuLX@CgTM3?p@e+PdHulzmy0Wh=Y%LkR{K zO6ePb0T|co5KI7B2;&d}mbJjNAZx?84S{Ndt-MAXOb4lYyD+822K)-}8sL<;<85~9q~9YK^G5fN@crSz4{`K-G&&l6SIgE(_G5{<$fc<{o5Xpd z9a=r9n15yCD0e80iPXzVTa~FCYZ)JVERz>NmupV#VQPn;`}RSw03 z#C!r4B2}ntrgI{0nisjuls}h_?vszCoXGqm6iH#NO3*B8w`D;aj-f5pMGk4L)jZGDr~aH=^$w78YzvDOBed= z5J&4MLNX*>k#o9imG7Y@R;o%x(8v?5-2Hz`UP8)9xfIuNBZ|p_(j(MGSvYouj%s|6 zlj4l-fFPerlmpLB7+*YEG!7Udf+nPI0I#TwLRf@cOu;Kp$1O(RiAVFuLkc^rRF%p` zUDo6>iDR8>jALY@1e!h{fF6L#Ors5=`ZVgvIa&=%tIsH!;hD5ULJpON8_vpM`f@S* z`P1pc2a|`7mdi6-AmV3_&gT#4ndQT0!%~-fE71IYH>6Y8|H6iqs7m z{eyBDv8RHDW5*!e4H9k*&G5P4dZk=Y{J;3JYXbK@WS4}a0*|uN_!3v?p|yqexrw;p z+Q7_d5L@ zA|ggLvW&`T5T8*iD(t}Ni-=f&?>2&_wg&X(Gj4#(lA2BA>%zBzn)Y@7PNTCjb_0tM z0|?)0wp^N}t`Tuv;s;M1& literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/distributions/base.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/distributions/base.py new file mode 100644 index 0000000..b836b98 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/distributions/base.py @@ -0,0 +1,45 @@ +import abc + +from pip._vendor.six import add_metaclass + +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Optional + + from pip._vendor.pkg_resources import Distribution + from pip._internal.req import InstallRequirement + from pip._internal.index.package_finder import PackageFinder + + +@add_metaclass(abc.ABCMeta) +class AbstractDistribution(object): + """A base class for handling installable artifacts. + + The requirements for anything installable are as follows: + + - we must be able to determine the requirement name + (or we can't correctly handle the non-upgrade case). + + - for packages with setup requirements, we must also be able + to determine their requirements without installing additional + packages (for the same reason as run-time dependencies) + + - we must be able to create a Distribution object exposing the + above metadata. + """ + + def __init__(self, req): + # type: (InstallRequirement) -> None + super(AbstractDistribution, self).__init__() + self.req = req + + @abc.abstractmethod + def get_pkg_resources_distribution(self): + # type: () -> Optional[Distribution] + raise NotImplementedError() + + @abc.abstractmethod + def prepare_distribution_metadata(self, finder, build_isolation): + # type: (PackageFinder, bool) -> None + raise NotImplementedError() diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/distributions/base.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/distributions/base.pyc new file mode 100644 index 0000000000000000000000000000000000000000..12116cc933f156dacb10013eff015c86979e7fa3 GIT binary patch literal 2413 zcmd5;UvC>l5T85$N#Z6=Xm|k$v_e8$5w=^3sKh^!h5`|)sV?Oq_rPiIZf&o-_ousi zPK^3Q`5b%~J`*1RX7+qZOeJ^>XYYDvW@mP0_BV6x{JA%{_~Xl;Q&>M;{QVk-`5mVW zzaA)ns9F1Nyz(I125}pvxY&W;0A2x{AvfA5w@!lrx+wp`XA*e0 zw0k)5EQ@ntd8)WE4f_tVpPW5Ci;us5eEdTk{xq4KOulPm+bH|7va&3=YB;;d`9>P6 zWl|IW%En1yELSQNFKVepE(+Vo=-8(`ea>g%TUlg6+c%MOl%Nfs+UvG1v+U!BM>x#q zIAOFAMu@XdabcWM2QZzB9%Q}?8$<55oKDNxg77rxl94?$cf=BI1ao1tX{p(q7nzd9 zjLF7ro+!b%wsMM2nbBat@Od^DOkc%goF*?;cK*61YLi^4^4xsZsIwtE7c8%hWeJMu z1Y5F9SfO)SAhBtl6+9R2Ts%5JA5l5w#Rrz9rPd;~YSp;iXclELtgD&k8ErG-?%HWQ zl>)4qlpA&~?VK55>uMvGk1l=V%9O2x?eYKgQ|b+6XSA$sn>|VgLQ6JCX^mXE5RgL@ zt-%P<5I1E(>C$yEv=UjFs02czNTo1$|1EhbDqGAYyN(-HCJRgt6Bku!$Q3-Q^?@hl z67K*ZpK;4aj-3*|XmoHK6GRwJ7QY_6#4_?>;ZrerFC86s2z{px%@YSH+asmA5<2XY zCY4DX%R<^Xwqz7R6VL(H0Z^!ExPw%HqnV7s)wt4fiP4OgT#pesSQ=(LtH#-j#q5_) zruXk9_aCfQOS`bvK74RKzlYDP7(W|VvKp>oJN)?Jr;{iomK*2y>dLMS-1U${6i!Nel2^)=xX2!BU22z`kQ&a- z$7tV0H)g`d)$>`bg(+*D3KL(?$NRX$(EUIsrR$G~S zNi9_tOH(TDdLy!K_P*^q=s~4L#kJVTfO`p0MSO@G)~N^x9BV97D?%*OjmB|aX0;-6 z%aK``#<4?^!#Yn=dm9CO-O;hu=4BSriz1|?Tp_}(ZVdW#SLBbOF#G#`f2Vh+7aSlF z5~?l9u#86W5?fKJM@C+R$O8LzD`;zLgl|4&Ms`(Uvk6^YxHizxuI}Gzb=Jl>KTtOS9NDLaIyq-fJSl*u`kwP~!%2A$1{lCr6KtpJ0b`aBO;^>r4NW%sWVZ(SYbH X%9f$O9J~Gje)=BH-hp@6+4ueimo0xU literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/distributions/installed 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/distributions/installed 2.py new file mode 100644 index 0000000..0d15bf4 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/distributions/installed 2.py @@ -0,0 +1,24 @@ +from pip._internal.distributions.base import AbstractDistribution +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Optional + + from pip._vendor.pkg_resources import Distribution + from pip._internal.index.package_finder import PackageFinder + + +class InstalledDistribution(AbstractDistribution): + """Represents an installed package. + + This does not need any preparation as the required information has already + been computed. + """ + + def get_pkg_resources_distribution(self): + # type: () -> Optional[Distribution] + return self.req.satisfied_by + + def prepare_distribution_metadata(self, finder, build_isolation): + # type: (PackageFinder, bool) -> None + pass diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/distributions/installed 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/distributions/installed 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7d6d27c4868296441f8b3a7eaa60ed5d7739a4ef GIT binary patch literal 1596 zcmd5+&2AGh5T4C%6R4>8lRyHkIOWpaRz>0hh|(6Q5TV+(hvtCgtewQI*SlRip+Vf> zz+-Xcd3XSr*-b*KJ^;0L#`etkXTJHo)!(b_Uq4@biec8O*uO%t7L~xy0}YUP(DT5f zc?EO@k}CA7;K?fFCq+~hbPbX^^y+0)4RiyNCiI%+ybgK=k{0w@;2GSd0n&qk2cikz z0lop8^x7a+;IPxebJZVg9S=wDE~@RmbvcjSuEJjR$4;fD^xj7Ahm(U7w)1Xp=RJ## zyWRcn+tRm!zK<9zLds~(Id=~#9)WC(RS&SPoW@&clarOcobQ*I=bZUF-{sI+R`4jG(} z3fU7Zm=i1$!3KS9WrQ){9$tyWpNzJFn`X)kBjQI<{n@;D7!T%aCenyB4=zzIB3ij8 u^N=}p17gobFnjN;BvVAJE7G`5xE8E Optional[Distribution] + return self.req.satisfied_by + + def prepare_distribution_metadata(self, finder, build_isolation): + # type: (PackageFinder, bool) -> None + pass diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/distributions/installed.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/distributions/installed.pyc new file mode 100644 index 0000000000000000000000000000000000000000..224601bddd3cc762072122a5daad819e83f929e2 GIT binary patch literal 1596 zcmd5+OK;Oa5FY2*1S%?C5=bD6Q!cezis%IpP+k=xRBk!M2UctECfRoVsCN?@#0?Jo zEq)U}0A}nYr0Nf#E6?oi%)o?oPd~>nZ*}aSqZorq;OBq_NE`?qaA;lw zU4x_!VI3SBPX+qenq8gxEkhCFeSMw(5HAp%TcECw-mlj9|h7O1}`~dh4 zFbKOK*5I($!E@CgY&{1@_9m(qk+B7j?JI@7iY8WNY303+-VcL=0o!}`dhb08KK1+i z{kN5G4SgSTisibpTt&;pJ=W2Bz~d7>l5bQhWMOZiWj{5RYc0jS~+H?AE^w~(h3RiIy`!>mXu-x!@-7m|xvxm_e>>c&};PplMPX^QFo z3)!RFby0l-IL6PxB9O1&tD&}Zc|6Awcm_`}LnQ@^W)-9jvPwPdVGpG;XE^fnLQT1q z{*)K~Fw=;t@khBYPLD@l9}Ty+qV1j8Y-*3KwYxiC##`7%sek0>D&L&rviWfLaX$>m zR0>n6l?4{l7b`q4{t`wnpV|9(_()oopNtqnolS~Z8n(KCC}SuysKt~U38h=YKfM!!b}>!L#T zcuVGZt3)tf#ElFv2JGDnk@%C*#Ic|?1M$f sg1R2D=ggbGcUF-pAl8*>TqaygRy?VA@QeU3RQU~Oqt-&%aBkH90((cNbN~PV literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/distributions/sdist 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/distributions/sdist 2.py new file mode 100644 index 0000000..be3d7d9 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/distributions/sdist 2.py @@ -0,0 +1,104 @@ +import logging + +from pip._internal.build_env import BuildEnvironment +from pip._internal.distributions.base import AbstractDistribution +from pip._internal.exceptions import InstallationError +from pip._internal.utils.subprocess import runner_with_spinner_message +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Set, Tuple + + from pip._vendor.pkg_resources import Distribution + from pip._internal.index.package_finder import PackageFinder + + +logger = logging.getLogger(__name__) + + +class SourceDistribution(AbstractDistribution): + """Represents a source distribution. + + The preparation step for these needs metadata for the packages to be + generated, either using PEP 517 or using the legacy `setup.py egg_info`. + """ + + def get_pkg_resources_distribution(self): + # type: () -> Distribution + return self.req.get_dist() + + def prepare_distribution_metadata(self, finder, build_isolation): + # type: (PackageFinder, bool) -> None + # Load pyproject.toml, to determine whether PEP 517 is to be used + self.req.load_pyproject_toml() + + # Set up the build isolation, if this requirement should be isolated + should_isolate = self.req.use_pep517 and build_isolation + if should_isolate: + self._setup_isolation(finder) + + self.req.prepare_metadata() + + def _setup_isolation(self, finder): + # type: (PackageFinder) -> None + def _raise_conflicts(conflicting_with, conflicting_reqs): + # type: (str, Set[Tuple[str, str]]) -> None + format_string = ( + "Some build dependencies for {requirement} " + "conflict with {conflicting_with}: {description}." + ) + error_message = format_string.format( + requirement=self.req, + conflicting_with=conflicting_with, + description=', '.join( + '{} is incompatible with {}'.format(installed, wanted) + for installed, wanted in sorted(conflicting) + ) + ) + raise InstallationError(error_message) + + # Isolate in a BuildEnvironment and install the build-time + # requirements. + pyproject_requires = self.req.pyproject_requires + assert pyproject_requires is not None + + self.req.build_env = BuildEnvironment() + self.req.build_env.install_requirements( + finder, pyproject_requires, 'overlay', + "Installing build dependencies" + ) + conflicting, missing = self.req.build_env.check_requirements( + self.req.requirements_to_check + ) + if conflicting: + _raise_conflicts("PEP 517/518 supported requirements", + conflicting) + if missing: + logger.warning( + "Missing build requirements in pyproject.toml for %s.", + self.req, + ) + logger.warning( + "The project does not specify a build backend, and " + "pip cannot fall back to setuptools without %s.", + " and ".join(map(repr, sorted(missing))) + ) + # Install any extra build dependencies that the backend requests. + # This must be done in a second pass, as the pyproject.toml + # dependencies must be installed before we can call the backend. + with self.req.build_env: + runner = runner_with_spinner_message( + "Getting requirements to build wheel" + ) + backend = self.req.pep517_backend + assert backend is not None + with backend.subprocess_runner(runner): + reqs = backend.get_requires_for_build_wheel() + + conflicting, missing = self.req.build_env.check_requirements(reqs) + if conflicting: + _raise_conflicts("the backend dependencies", conflicting) + self.req.build_env.install_requirements( + finder, missing, 'normal', + "Installing backend dependencies" + ) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/distributions/sdist 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/distributions/sdist 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a228d39b67585f846fc899cccba587de125613b9 GIT binary patch literal 4391 zcmd5<-Etg96+Sb&T4`63CCjl1B!R9_z(U!(b|oe$Dx{LwPDq8Ql#v5?3mA`PdRMca zKTr2c7S`TiDuk<4am%w%#RWIK058G=knfzHl~;&+XQk<#?mm6`{C?+b>pz>lfBoa< zzmKW;wDA2N9`jEO3I09Gh(_++r_7_=r;$${@3kmvQQoFe+s)gQtx(>fQOC_!C|jj` zjYey3-l42Zd5=at@^p{tzsU`&l&w>~L8A@IH)*u#XxAvaMEMqtw%oi+**4{uX>^&q zf=ClhcSv8MXC94SqNGQ%@6IP-@cHiU$Gac(eJoqH`o6Yy1>g5)Rn{C~ z(JuNB6R+8^LCKgIyVjbJ8>KHCSz8nr0#<)zIo z<&_l*_WNx<@^=h@u4-*yCZi%{MFaSY4@cSu1;p)2h%q zF)G(KN+KIAHdN&_G0K+eKntUZh9x7blj};uoVr#slNJ-TcW+PKzV(&@OSgbMmFYNgl{=bzMZ+aM{deXm|=8?ROjLsz;L$t`V0Q zk#!NX-vNc;*djk}VPxrfDi-(t6%1J!C1G_^)#X&jHne4)S>Bu(9ag%63nd9daaov}(j}BEx&YGQB2FX< z15O0n!7z3KzlGNW&f%rgm#}6I%h}nY{w8?pHAuD4Y1x@)3bHE=TZdYktsSr9ZTm4h ziUY9At9Z;82;e{C-=nc)?H5FIpT6{(Aa?$OKOS|-++;ZUqeoV}Z`1@Q_^JM2*S z7fFwFe+KMs7-4U9LAS;(|E*7d!A))Y68QF4j*LX!p8@}Y!KZDi|4p__(;g*@8+fl- z>QJ&u({-{NWH-rP;sf9c3O6#3v#Y=Q4Cl5ek&EXGZqsd=Ltb!l%58d1Ijl@C)9DIx z`U(|+=Q|vg^HusaXg~Xn8_(E7v(wcJI*mQnsmuB`Iz2z&%mhe;a_eFy33v|0-IzVp z#>0-|kT-i60H^Q@I8O2I+ykUV{$L6|FfT6aFu+0yzS5(+Yzao87JLYg!7Z4=dvez* znC==BU!Z%gl|;Nsbftm%MVx9QDEbt5HA`#Fg>0_kvKVJ+Y!z1`^>i@>eoAec|4cni zw2AAq;vzO5*mba9;viZ0zo&#~>6jqPbrmzNa)7ca3_m}@0Cj)&8pqCD>;X++4-Pr_ z-KSr9j}dxYnAwJgaq8(@rADPiT;>%@$3dnW;pa`smdr2fJhFYh&GN~?O+*lNVb-gZtkpHf=EGI#Er0Xm?F^r~755^6_#e^`ggQDpZhPQ9Mt<0>d#Hwm3#*KLs zWS^!++6u>Ic^k2)&g$2I>z5?j56r+k#6j2SNO4n1i7YHit4yWibbO+sMydn!HOSNJ zDk>6%!mi?|V7f8-N5z}m@JI!;Wtka?_;O|yU&1jW=gjx<_7NIG*7lr)+%0hdRL6%} zXXa(laW~Z5dJZHcv5ghhGQ#gXNj*8=` zE?}5|qe5EfJgP)EG@*6Cg*6bkU@=|a5jOU*+{~NV0a}z8$r8He-M)%dZu%CQhRCo` z%p8iD`)kaTD?q@e3D`Tq4>5>1xr--}vSG+lF0N#&fw6Ju#JL%8unM~umWu(W+)wbB z_b`yZv$Nst_*>ovGH})3@UHrtg+0l|me<3q<-fkN>9xErc6YpO?`8iL>~716K7*LF z&S6+Yxei0=`@%3UlUc@7Hb@vIWgLb9Ls-Dh79pO4_KQWQfP+^`Iy<|w(($|P?neI_ zCL%q@AHyv}Gtzo+)~gR(pdjL15~vFV%l)4j97IM3TtF=+?|D}GNvx$l8z~0T@1Li@ z57P`taTdZZ(z%-cKRSDYU!;?OLr}uAnM*AapK(EwgGa!uvL2lKVG*#`EC=g(-rS2n z88koOLf4uHY&8J@B+@S>SA(~)6x`r}ZTn4ew8ZH Distribution + return self.req.get_dist() + + def prepare_distribution_metadata(self, finder, build_isolation): + # type: (PackageFinder, bool) -> None + # Load pyproject.toml, to determine whether PEP 517 is to be used + self.req.load_pyproject_toml() + + # Set up the build isolation, if this requirement should be isolated + should_isolate = self.req.use_pep517 and build_isolation + if should_isolate: + self._setup_isolation(finder) + + self.req.prepare_metadata() + + def _setup_isolation(self, finder): + # type: (PackageFinder) -> None + def _raise_conflicts(conflicting_with, conflicting_reqs): + # type: (str, Set[Tuple[str, str]]) -> None + format_string = ( + "Some build dependencies for {requirement} " + "conflict with {conflicting_with}: {description}." + ) + error_message = format_string.format( + requirement=self.req, + conflicting_with=conflicting_with, + description=', '.join( + '{} is incompatible with {}'.format(installed, wanted) + for installed, wanted in sorted(conflicting) + ) + ) + raise InstallationError(error_message) + + # Isolate in a BuildEnvironment and install the build-time + # requirements. + pyproject_requires = self.req.pyproject_requires + assert pyproject_requires is not None + + self.req.build_env = BuildEnvironment() + self.req.build_env.install_requirements( + finder, pyproject_requires, 'overlay', + "Installing build dependencies" + ) + conflicting, missing = self.req.build_env.check_requirements( + self.req.requirements_to_check + ) + if conflicting: + _raise_conflicts("PEP 517/518 supported requirements", + conflicting) + if missing: + logger.warning( + "Missing build requirements in pyproject.toml for %s.", + self.req, + ) + logger.warning( + "The project does not specify a build backend, and " + "pip cannot fall back to setuptools without %s.", + " and ".join(map(repr, sorted(missing))) + ) + # Install any extra build dependencies that the backend requests. + # This must be done in a second pass, as the pyproject.toml + # dependencies must be installed before we can call the backend. + with self.req.build_env: + runner = runner_with_spinner_message( + "Getting requirements to build wheel" + ) + backend = self.req.pep517_backend + assert backend is not None + with backend.subprocess_runner(runner): + reqs = backend.get_requires_for_build_wheel() + + conflicting, missing = self.req.build_env.check_requirements(reqs) + if conflicting: + _raise_conflicts("the backend dependencies", conflicting) + self.req.build_env.install_requirements( + finder, missing, 'normal', + "Installing backend dependencies" + ) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/distributions/sdist.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/distributions/sdist.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e1179c52eefd35534c963f5b58149f272381d961 GIT binary patch literal 4391 zcmd5fbnRicQxy| zdAe7!u=WL0Av~puSAI(#sNy&9NB9BcJEv#m72@4lX?mx-PoF;5@0@M@XS4U@pFjU& zOwFf-@AvSSe_=@Q?@>lHa_>H69_2obeDZj&MOlmTHjUbD-llAY@(ztUZoWd5`?EAl?iELA zT^6}6tlN1BJHI$EwvJ-^L5lD6U}n>@aJ!eW`$=JJlw}dG-mB}fc3ZDttDY5wuEXQh z9)_k$Ws+-SqKS4yJ0SY>!QO-L?#K7;{xS@Hy}SF#?niwe%a*OaudQ9d_x)LwHAh(V zi-K%obuWq^f%AuHk?7ho>-}<8$9kFi%%`mO`*_TcF~D#mmW`_We;&$6B%Hai*fmIAk1Rce(~I8mDql#2p{}=94Y(apWWx4sP$vJ2BL|!A?xY< zC+5)ExQ`u@!C1Tvt2#Y`u*0LM9*)Zl{xHKyHB25)Cx3c#eCy`Htv60ij_lN0d*_Yg z!<+a_isAiXl~y-W7f&~Sdgra(QNT;`Kz^(1BFcu#W;R2^Q|M^F+elYEnuKtTxWtI8 zihwvEOf+@Twcddfy zu0inyy60L+#H&PC8mM2ysWyV5Pk~pnwANh6<|;0WahAqbaV1hu7gOM;)Ta5*)YC+p zxK1lBV)KDr2m2)sl7;_!N{E(@39?*QG2j;5?3e!%KE-1`>Z zE;t0vGRP-@p_nA(Mx~g@isqgK(Bj$-<|Ce4a;HG480f`SFYds?I!aLv7Lu9kSTnpq ztxl`!bpeF@cdcbP3Cbf~XVHmaG;Mk?ZU`qCtRZB5$%$p$l zG&RyzI4;ZEh(&c)zXn{tB+-6g2Ie6Sx<*Hen@UP#VNqITDjlce6BRX59iXp4o?cf` zkth^)6-NcrjnO|U-sFZyDxfXP%t*wSGpqO#juAO$zK^$$&=|6|=OpBAi3^}QKGZrh zFN2P|q2|_eAR(buaI9qJd!So3pcC>Od7tsj1t<5FXLdlNAuwYAQ-Gzi&_HxF%*LPt zUG&2NR=6T8%CjzxEVtE7nl5-SR2gYo<3k-kI=_4s^vk-Ufe3|66v@iT1Q&8t97lBl z!vq`^(n9A^CBmTztphHsfxrce>H3bav5)0u-pmfrqQpp+&^7P&RjhK;x6m|1hJ|A0 zP|Vz4W1d_A0ya&+-U)t)LBz>jJc*PILzZ%JC0h-QjYB8S&47bd*uAh^3^?U}g2%jv zf&87F4R6Qa@-~oxtNw;})#ohiNiMd$9%e27^_5Mp<#n;U<86B{`>$YkTTb*D#H4i& z!y?Lc7)sw4hIyIHGM=(Q!Z0c0Fbo*N0(Q0t@f@^YEII`oyi(HH*`1Y+-)(m{`qwZK z={f!wZW)@9)`PQNec%EG5$}>fT_9NQ|IFYZGCJS_YB_n&v(isuE%n(*F_3=$JOzH3 zW0%n!<;M@<3fW2lpSkLq3Ui`_R z`2iQY);wUV2>>9GekHjYyp5&c1`ll8Z;GQOPTz5n`7Zmxu#Y$VZ3MIYA=s~BcBQq| F`WhVCXjA|I literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/distributions/wheel 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/distributions/wheel 2.py new file mode 100644 index 0000000..bf3482b --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/distributions/wheel 2.py @@ -0,0 +1,36 @@ +from zipfile import ZipFile + +from pip._internal.distributions.base import AbstractDistribution +from pip._internal.utils.typing import MYPY_CHECK_RUNNING +from pip._internal.utils.wheel import pkg_resources_distribution_for_wheel + +if MYPY_CHECK_RUNNING: + from pip._vendor.pkg_resources import Distribution + from pip._internal.index.package_finder import PackageFinder + + +class WheelDistribution(AbstractDistribution): + """Represents a wheel distribution. + + This does not need any preparation as wheels can be directly unpacked. + """ + + def get_pkg_resources_distribution(self): + # type: () -> Distribution + """Loads the metadata from the wheel file into memory and returns a + Distribution that uses it, not relying on the wheel file or + requirement. + """ + # Set as part of preparation during download. + assert self.req.local_file_path + # Wheels are never unnamed. + assert self.req.name + + with ZipFile(self.req.local_file_path, allowZip64=True) as z: + return pkg_resources_distribution_for_wheel( + z, self.req.name, self.req.local_file_path + ) + + def prepare_distribution_metadata(self, finder, build_isolation): + # type: (PackageFinder, bool) -> None + pass diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/distributions/wheel 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/distributions/wheel 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dc0df7d7cf1c327b72dd6fea2d27e3cd4d772baa GIT binary patch literal 1989 zcmd5+O>-MX5bfR7hpi-F3>ToFrXU9$h?G=PZ~+SAIDrCGX6;n44or=9N76d`<(ZL< zT;YPb^B?#nT=_lu0q}a(7ILL>CM!+vY;R9*zt?XjdU31w_g`Q9oY3VJ;rMWiL71H5lsV1H|TdFeEVp8lhRE(==V@Z_7ARpfSK#UjI;Vtmg~mx4jelZ z>x@d=!wmOqvT#{dHgC7__J^bWBf0y{-tKoYeli+;J9^x_yN!4Cvzav7RtuA8E7P_0 za#|UAHrG0DqHiMl<@~qc-B-yoHPer>GS$Yt1eVFio^6hMXznP&h8 zsUVmqEs78N+zfjH6YCmP>e5-EgfB|0*E;C+1g^t*W<^?QE6U1=QtMQxaw)L1Rz@)? zLfK}y6^SavL?eySiOZK_QP#kr(}7QwaG@c_2F5OiMX~gp=otTi>^8ZOehaQV5!u_9 z9@n~Z0$M<>O&3A%$H(+5<{f&zwq%vhtVesa8;lQ4Mm*Tu{u?rS7*@Vrw>MbmZ#&kA>6%*dtN0fmt3c;m7BXa;M=hl zLP0zBjHwI=BPvy)W8BF<9h!xXIZK~g;9XYdQ^!p?@57Kc)?qfRO?IlB9-b;QoK`tB zXos_Un4TQZ&L2$g-JRUKzg(WWW9Qsw_s`~cam~u%;jqr?J6UNR%D=PoaL?{PVV55g zlxkC|e7LSMJM_#9>ZSV-AD(F^U%h>J<5^~hy4&G)_ Distribution + """Loads the metadata from the wheel file into memory and returns a + Distribution that uses it, not relying on the wheel file or + requirement. + """ + # Set as part of preparation during download. + assert self.req.local_file_path + # Wheels are never unnamed. + assert self.req.name + + with ZipFile(self.req.local_file_path, allowZip64=True) as z: + return pkg_resources_distribution_for_wheel( + z, self.req.name, self.req.local_file_path + ) + + def prepare_distribution_metadata(self, finder, build_isolation): + # type: (PackageFinder, bool) -> None + pass diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/distributions/wheel.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/distributions/wheel.pyc new file mode 100644 index 0000000000000000000000000000000000000000..20593d68f87a64d25ebbc655d457c8b5731ceb54 GIT binary patch literal 1989 zcmd5+O>-MX5bfR7hpi;w7%o6TO+gMi5Gh}kT!12&1Smii)=mZMz|=@PlGd61@XW}L zT;YPb^B?#p{3djr+tb_c^_xllzSev3*XO@X>Fi2y{}RKU!esbI zWQdB0#t}vQ9FvKuNNAii&k30p6>S=~o97mp4i#M*cPY|svU$kTCbL1sCXF|ns1BJP z6<26{g`yH!yQCAEMU-vO??m|a{`e|oo3z{Sp^p3?T>S_$--Q|H_2b;=#_=v34=2uB zHT7TTxaX6l&#SU|yN$O$?myX=JKsLq`Cg_^N2BjX-!$)T;9dQEF0FRe(oVIL+1h$J ztE@a;Xly=NT_s55Az6F?@yL1dIk0K!%N(X8;GO zAebjDN_YF*40i~V>Kaw*(mSCL{@1h%F2sU>rAL}C9t$sRxv3; zxn{W&Q&ozIMjET9-mJv3tbs#kgOF;VEjsrkhMB+MWKk(a(gL{Zrl@MgklzqBQo3P_lk^;TfD@?z=0Qtm$uOj&JKc{vy0hd;KK zy0RBJtUg?Vs{&1EDB{GP)v1iBj-ko>_eOn|r{}gI+`o;xsiw+Eu2a^^FZ^5ZJ#-F2 zK|3BYa9ex$q}9w|GVRR$V# z!+AZ-4iDxh_hz?mO>W;^t&aSG_x{1%P2UOJERZ{B%ue>6_n6@~<* z+Lp=;*Hz|*ftf+Q@*m;DbM58pw-0YT$LvsdJKl~zh>~c^h`AwkVLzLC*E`9mzIM?gP2yom(iu-L?zX2m9cU#IJ z9x00|TS6T&9Boo&)l|xq0jJF2e=x)Be`|Tl-QY9O@ubu0#G6~Ae&`cx{v@wibra}Ghy(T7zG3*k55ptx None + """ + :param dist: A Distribution object. + :param metadata_name: The name of the metadata being accessed + (can be "METADATA" or "PKG-INFO"). + """ + self.dist = dist + self.metadata_name = metadata_name + + def __str__(self): + # type: () -> str + # Use `dist` in the error message because its stringification + # includes more information, like the version and location. + return ( + 'None {} metadata found for distribution: {}'.format( + self.metadata_name, self.dist, + ) + ) + + +class DistributionNotFound(InstallationError): + """Raised when a distribution cannot be found to satisfy a requirement""" + + +class RequirementsFileParseError(InstallationError): + """Raised when a general error occurs parsing a requirements file line.""" + + +class BestVersionAlreadyInstalled(PipError): + """Raised when the most up-to-date version of a package is already + installed.""" + + +class BadCommand(PipError): + """Raised when virtualenv or a command is not found""" + + +class CommandError(PipError): + """Raised when there is an error in command-line arguments""" + + +class PreviousBuildDirError(PipError): + """Raised when there's a previous conflicting build directory""" + + +class InvalidWheelFilename(InstallationError): + """Invalid wheel filename.""" + + +class UnsupportedWheel(InstallationError): + """Unsupported wheel.""" + + +class HashErrors(InstallationError): + """Multiple HashError instances rolled into one for reporting""" + + def __init__(self): + self.errors = [] + + def append(self, error): + self.errors.append(error) + + def __str__(self): + lines = [] + self.errors.sort(key=lambda e: e.order) + for cls, errors_of_cls in groupby(self.errors, lambda e: e.__class__): + lines.append(cls.head) + lines.extend(e.body() for e in errors_of_cls) + if lines: + return '\n'.join(lines) + + def __nonzero__(self): + return bool(self.errors) + + def __bool__(self): + return self.__nonzero__() + + +class HashError(InstallationError): + """ + A failure to verify a package against known-good hashes + + :cvar order: An int sorting hash exception classes by difficulty of + recovery (lower being harder), so the user doesn't bother fretting + about unpinned packages when he has deeper issues, like VCS + dependencies, to deal with. Also keeps error reports in a + deterministic order. + :cvar head: A section heading for display above potentially many + exceptions of this kind + :ivar req: The InstallRequirement that triggered this error. This is + pasted on after the exception is instantiated, because it's not + typically available earlier. + + """ + req = None # type: Optional[InstallRequirement] + head = '' + + def body(self): + """Return a summary of me for display under the heading. + + This default implementation simply prints a description of the + triggering requirement. + + :param req: The InstallRequirement that provoked this error, with + populate_link() having already been called + + """ + return ' %s' % self._requirement_name() + + def __str__(self): + return '%s\n%s' % (self.head, self.body()) + + def _requirement_name(self): + """Return a description of the requirement that triggered me. + + This default implementation returns long description of the req, with + line numbers + + """ + return str(self.req) if self.req else 'unknown package' + + +class VcsHashUnsupported(HashError): + """A hash was provided for a version-control-system-based requirement, but + we don't have a method for hashing those.""" + + order = 0 + head = ("Can't verify hashes for these requirements because we don't " + "have a way to hash version control repositories:") + + +class DirectoryUrlHashUnsupported(HashError): + """A hash was provided for a version-control-system-based requirement, but + we don't have a method for hashing those.""" + + order = 1 + head = ("Can't verify hashes for these file:// requirements because they " + "point to directories:") + + +class HashMissing(HashError): + """A hash was needed for a requirement but is absent.""" + + order = 2 + head = ('Hashes are required in --require-hashes mode, but they are ' + 'missing from some requirements. Here is a list of those ' + 'requirements along with the hashes their downloaded archives ' + 'actually had. Add lines like these to your requirements files to ' + 'prevent tampering. (If you did not enable --require-hashes ' + 'manually, note that it turns on automatically when any package ' + 'has a hash.)') + + def __init__(self, gotten_hash): + """ + :param gotten_hash: The hash of the (possibly malicious) archive we + just downloaded + """ + self.gotten_hash = gotten_hash + + def body(self): + # Dodge circular import. + from pip._internal.utils.hashes import FAVORITE_HASH + + package = None + if self.req: + # In the case of URL-based requirements, display the original URL + # seen in the requirements file rather than the package name, + # so the output can be directly copied into the requirements file. + package = (self.req.original_link if self.req.original_link + # In case someone feeds something downright stupid + # to InstallRequirement's constructor. + else getattr(self.req, 'req', None)) + return ' %s --hash=%s:%s' % (package or 'unknown package', + FAVORITE_HASH, + self.gotten_hash) + + +class HashUnpinned(HashError): + """A requirement had a hash specified but was not pinned to a specific + version.""" + + order = 3 + head = ('In --require-hashes mode, all requirements must have their ' + 'versions pinned with ==. These do not:') + + +class HashMismatch(HashError): + """ + Distribution file hash values don't match. + + :ivar package_name: The name of the package that triggered the hash + mismatch. Feel free to write to this after the exception is raise to + improve its error message. + + """ + order = 4 + head = ('THESE PACKAGES DO NOT MATCH THE HASHES FROM THE REQUIREMENTS ' + 'FILE. If you have updated the package versions, please update ' + 'the hashes. Otherwise, examine the package contents carefully; ' + 'someone may have tampered with them.') + + def __init__(self, allowed, gots): + """ + :param allowed: A dict of algorithm names pointing to lists of allowed + hex digests + :param gots: A dict of algorithm names pointing to hashes we + actually got from the files under suspicion + """ + self.allowed = allowed + self.gots = gots + + def body(self): + return ' %s:\n%s' % (self._requirement_name(), + self._hash_comparison()) + + def _hash_comparison(self): + """ + Return a comparison of actual and expected hash values. + + Example:: + + Expected sha256 abcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcde + or 123451234512345123451234512345123451234512345 + Got bcdefbcdefbcdefbcdefbcdefbcdefbcdefbcdefbcdef + + """ + def hash_then_or(hash_name): + # For now, all the decent hashes have 6-char names, so we can get + # away with hard-coding space literals. + return chain([hash_name], repeat(' or')) + + lines = [] + for hash_name, expecteds in iteritems(self.allowed): + prefix = hash_then_or(hash_name) + lines.extend((' Expected %s %s' % (next(prefix), e)) + for e in expecteds) + lines.append(' Got %s\n' % + self.gots[hash_name].hexdigest()) + return '\n'.join(lines) + + +class UnsupportedPythonVersion(InstallationError): + """Unsupported python version according to Requires-Python package + metadata.""" + + +class ConfigurationFileCouldNotBeLoaded(ConfigurationError): + """When there are errors while loading a configuration file + """ + + def __init__(self, reason="could not be loaded", fname=None, error=None): + super(ConfigurationFileCouldNotBeLoaded, self).__init__(error) + self.reason = reason + self.fname = fname + self.error = error + + def __str__(self): + if self.fname is not None: + message_part = " in {}.".format(self.fname) + else: + assert self.error is not None + message_part = ".\n{}\n".format(self.error.message) + return "Configuration file {}{}".format(self.reason, message_part) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/exceptions 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/exceptions 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6f789ed14846806e1d9312e486d294e9478bb43a GIT binary patch literal 17569 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 None + """ + :param dist: A Distribution object. + :param metadata_name: The name of the metadata being accessed + (can be "METADATA" or "PKG-INFO"). + """ + self.dist = dist + self.metadata_name = metadata_name + + def __str__(self): + # type: () -> str + # Use `dist` in the error message because its stringification + # includes more information, like the version and location. + return ( + 'None {} metadata found for distribution: {}'.format( + self.metadata_name, self.dist, + ) + ) + + +class DistributionNotFound(InstallationError): + """Raised when a distribution cannot be found to satisfy a requirement""" + + +class RequirementsFileParseError(InstallationError): + """Raised when a general error occurs parsing a requirements file line.""" + + +class BestVersionAlreadyInstalled(PipError): + """Raised when the most up-to-date version of a package is already + installed.""" + + +class BadCommand(PipError): + """Raised when virtualenv or a command is not found""" + + +class CommandError(PipError): + """Raised when there is an error in command-line arguments""" + + +class PreviousBuildDirError(PipError): + """Raised when there's a previous conflicting build directory""" + + +class InvalidWheelFilename(InstallationError): + """Invalid wheel filename.""" + + +class UnsupportedWheel(InstallationError): + """Unsupported wheel.""" + + +class HashErrors(InstallationError): + """Multiple HashError instances rolled into one for reporting""" + + def __init__(self): + self.errors = [] + + def append(self, error): + self.errors.append(error) + + def __str__(self): + lines = [] + self.errors.sort(key=lambda e: e.order) + for cls, errors_of_cls in groupby(self.errors, lambda e: e.__class__): + lines.append(cls.head) + lines.extend(e.body() for e in errors_of_cls) + if lines: + return '\n'.join(lines) + + def __nonzero__(self): + return bool(self.errors) + + def __bool__(self): + return self.__nonzero__() + + +class HashError(InstallationError): + """ + A failure to verify a package against known-good hashes + + :cvar order: An int sorting hash exception classes by difficulty of + recovery (lower being harder), so the user doesn't bother fretting + about unpinned packages when he has deeper issues, like VCS + dependencies, to deal with. Also keeps error reports in a + deterministic order. + :cvar head: A section heading for display above potentially many + exceptions of this kind + :ivar req: The InstallRequirement that triggered this error. This is + pasted on after the exception is instantiated, because it's not + typically available earlier. + + """ + req = None # type: Optional[InstallRequirement] + head = '' + + def body(self): + """Return a summary of me for display under the heading. + + This default implementation simply prints a description of the + triggering requirement. + + :param req: The InstallRequirement that provoked this error, with + populate_link() having already been called + + """ + return ' %s' % self._requirement_name() + + def __str__(self): + return '%s\n%s' % (self.head, self.body()) + + def _requirement_name(self): + """Return a description of the requirement that triggered me. + + This default implementation returns long description of the req, with + line numbers + + """ + return str(self.req) if self.req else 'unknown package' + + +class VcsHashUnsupported(HashError): + """A hash was provided for a version-control-system-based requirement, but + we don't have a method for hashing those.""" + + order = 0 + head = ("Can't verify hashes for these requirements because we don't " + "have a way to hash version control repositories:") + + +class DirectoryUrlHashUnsupported(HashError): + """A hash was provided for a version-control-system-based requirement, but + we don't have a method for hashing those.""" + + order = 1 + head = ("Can't verify hashes for these file:// requirements because they " + "point to directories:") + + +class HashMissing(HashError): + """A hash was needed for a requirement but is absent.""" + + order = 2 + head = ('Hashes are required in --require-hashes mode, but they are ' + 'missing from some requirements. Here is a list of those ' + 'requirements along with the hashes their downloaded archives ' + 'actually had. Add lines like these to your requirements files to ' + 'prevent tampering. (If you did not enable --require-hashes ' + 'manually, note that it turns on automatically when any package ' + 'has a hash.)') + + def __init__(self, gotten_hash): + """ + :param gotten_hash: The hash of the (possibly malicious) archive we + just downloaded + """ + self.gotten_hash = gotten_hash + + def body(self): + # Dodge circular import. + from pip._internal.utils.hashes import FAVORITE_HASH + + package = None + if self.req: + # In the case of URL-based requirements, display the original URL + # seen in the requirements file rather than the package name, + # so the output can be directly copied into the requirements file. + package = (self.req.original_link if self.req.original_link + # In case someone feeds something downright stupid + # to InstallRequirement's constructor. + else getattr(self.req, 'req', None)) + return ' %s --hash=%s:%s' % (package or 'unknown package', + FAVORITE_HASH, + self.gotten_hash) + + +class HashUnpinned(HashError): + """A requirement had a hash specified but was not pinned to a specific + version.""" + + order = 3 + head = ('In --require-hashes mode, all requirements must have their ' + 'versions pinned with ==. These do not:') + + +class HashMismatch(HashError): + """ + Distribution file hash values don't match. + + :ivar package_name: The name of the package that triggered the hash + mismatch. Feel free to write to this after the exception is raise to + improve its error message. + + """ + order = 4 + head = ('THESE PACKAGES DO NOT MATCH THE HASHES FROM THE REQUIREMENTS ' + 'FILE. If you have updated the package versions, please update ' + 'the hashes. Otherwise, examine the package contents carefully; ' + 'someone may have tampered with them.') + + def __init__(self, allowed, gots): + """ + :param allowed: A dict of algorithm names pointing to lists of allowed + hex digests + :param gots: A dict of algorithm names pointing to hashes we + actually got from the files under suspicion + """ + self.allowed = allowed + self.gots = gots + + def body(self): + return ' %s:\n%s' % (self._requirement_name(), + self._hash_comparison()) + + def _hash_comparison(self): + """ + Return a comparison of actual and expected hash values. + + Example:: + + Expected sha256 abcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcde + or 123451234512345123451234512345123451234512345 + Got bcdefbcdefbcdefbcdefbcdefbcdefbcdefbcdefbcdef + + """ + def hash_then_or(hash_name): + # For now, all the decent hashes have 6-char names, so we can get + # away with hard-coding space literals. + return chain([hash_name], repeat(' or')) + + lines = [] + for hash_name, expecteds in iteritems(self.allowed): + prefix = hash_then_or(hash_name) + lines.extend((' Expected %s %s' % (next(prefix), e)) + for e in expecteds) + lines.append(' Got %s\n' % + self.gots[hash_name].hexdigest()) + return '\n'.join(lines) + + +class UnsupportedPythonVersion(InstallationError): + """Unsupported python version according to Requires-Python package + metadata.""" + + +class ConfigurationFileCouldNotBeLoaded(ConfigurationError): + """When there are errors while loading a configuration file + """ + + def __init__(self, reason="could not be loaded", fname=None, error=None): + super(ConfigurationFileCouldNotBeLoaded, self).__init__(error) + self.reason = reason + self.fname = fname + self.error = error + + def __str__(self): + if self.fname is not None: + message_part = " in {}.".format(self.fname) + else: + assert self.error is not None + message_part = ".\n{}\n".format(self.error.message) + return "Configuration file {}{}".format(self.reason, message_part) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/exceptions.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/exceptions.pyc new file mode 100644 index 0000000000000000000000000000000000000000..af3784469e55ab6b43eb805cce63330ad023c6cf GIT binary patch literal 17569 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 Ii;0o{1qqE@MF0Q* literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/index/__init__ 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/index/__init__ 2.py new file mode 100644 index 0000000..7a17b7b --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/index/__init__ 2.py @@ -0,0 +1,2 @@ +"""Index interaction code +""" diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/index/__init__ 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/index/__init__ 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6d0323dc75066509c14c0c039dbc386b7a7fb091 GIT binary patch literal 244 zcmYL^v5EpQ5QgJfC=1rMmfPqk3N|VVcZH1{c-LHEh?}@ZVv^g;t+zg%t*0e@9zXg~(7l+sT|%$tsPL z*dTB&UB-DzC3_(_YQYz}6sVvS1?-%WstAyKkiUogJlYNV+rhA^N<1LqczD|PDRK*6 w;I;2+8&DY2UA%vU&+lkG#2>dzfRmw-^PaD;NjoP;C;yC^#Sf6g?mNvu1^@s6 literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/index/__init__.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/index/__init__.py new file mode 100644 index 0000000..7a17b7b --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/index/__init__.py @@ -0,0 +1,2 @@ +"""Index interaction code +""" diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/index/__init__.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/index/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bb9fbe798bf15c7c8c39c1a615cf4611609ab8fa GIT binary patch literal 244 zcmYL^zYYOG5XKh;xkRm1Uc>ko8bqs6pi4_Qa#$*qRK>q+SzvEq>5H?n8Z4PbLkS! zV=CDnxuX_*rVD`z3X#Fl8L6@yQV;TaPM@P=zjx>l%d)^TB2I?)Q;#CGum!JuN822Q qF`dC=yxOgU^%ei#Vub-6P6JMcM$Wsw#0Kr0UYxucH4h&kiG2Xx{y%L1 literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/index/collector 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/index/collector 2.py new file mode 100644 index 0000000..8330793 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/index/collector 2.py @@ -0,0 +1,544 @@ +""" +The main purpose of this module is to expose LinkCollector.collect_links(). +""" + +import cgi +import itertools +import logging +import mimetypes +import os +from collections import OrderedDict + +from pip._vendor import html5lib, requests +from pip._vendor.distlib.compat import unescape +from pip._vendor.requests.exceptions import HTTPError, RetryError, SSLError +from pip._vendor.six.moves.urllib import parse as urllib_parse +from pip._vendor.six.moves.urllib import request as urllib_request + +from pip._internal.models.link import Link +from pip._internal.utils.filetypes import ARCHIVE_EXTENSIONS +from pip._internal.utils.misc import redact_auth_from_url +from pip._internal.utils.typing import MYPY_CHECK_RUNNING +from pip._internal.utils.urls import path_to_url, url_to_path +from pip._internal.vcs import is_url, vcs + +if MYPY_CHECK_RUNNING: + from typing import ( + Callable, Iterable, List, MutableMapping, Optional, Sequence, Tuple, + Union, + ) + import xml.etree.ElementTree + + from pip._vendor.requests import Response + + from pip._internal.models.search_scope import SearchScope + from pip._internal.network.session import PipSession + + HTMLElement = xml.etree.ElementTree.Element + ResponseHeaders = MutableMapping[str, str] + + +logger = logging.getLogger(__name__) + + +def _match_vcs_scheme(url): + # type: (str) -> Optional[str] + """Look for VCS schemes in the URL. + + Returns the matched VCS scheme, or None if there's no match. + """ + for scheme in vcs.schemes: + if url.lower().startswith(scheme) and url[len(scheme)] in '+:': + return scheme + return None + + +def _is_url_like_archive(url): + # type: (str) -> bool + """Return whether the URL looks like an archive. + """ + filename = Link(url).filename + for bad_ext in ARCHIVE_EXTENSIONS: + if filename.endswith(bad_ext): + return True + return False + + +class _NotHTML(Exception): + def __init__(self, content_type, request_desc): + # type: (str, str) -> None + super(_NotHTML, self).__init__(content_type, request_desc) + self.content_type = content_type + self.request_desc = request_desc + + +def _ensure_html_header(response): + # type: (Response) -> None + """Check the Content-Type header to ensure the response contains HTML. + + Raises `_NotHTML` if the content type is not text/html. + """ + content_type = response.headers.get("Content-Type", "") + if not content_type.lower().startswith("text/html"): + raise _NotHTML(content_type, response.request.method) + + +class _NotHTTP(Exception): + pass + + +def _ensure_html_response(url, session): + # type: (str, PipSession) -> None + """Send a HEAD request to the URL, and ensure the response contains HTML. + + Raises `_NotHTTP` if the URL is not available for a HEAD request, or + `_NotHTML` if the content type is not text/html. + """ + scheme, netloc, path, query, fragment = urllib_parse.urlsplit(url) + if scheme not in {'http', 'https'}: + raise _NotHTTP() + + resp = session.head(url, allow_redirects=True) + resp.raise_for_status() + + _ensure_html_header(resp) + + +def _get_html_response(url, session): + # type: (str, PipSession) -> Response + """Access an HTML page with GET, and return the response. + + This consists of three parts: + + 1. If the URL looks suspiciously like an archive, send a HEAD first to + check the Content-Type is HTML, to avoid downloading a large file. + Raise `_NotHTTP` if the content type cannot be determined, or + `_NotHTML` if it is not HTML. + 2. Actually perform the request. Raise HTTP exceptions on network failures. + 3. Check the Content-Type header to make sure we got HTML, and raise + `_NotHTML` otherwise. + """ + if _is_url_like_archive(url): + _ensure_html_response(url, session=session) + + logger.debug('Getting page %s', redact_auth_from_url(url)) + + resp = session.get( + url, + headers={ + "Accept": "text/html", + # We don't want to blindly returned cached data for + # /simple/, because authors generally expecting that + # twine upload && pip install will function, but if + # they've done a pip install in the last ~10 minutes + # it won't. Thus by setting this to zero we will not + # blindly use any cached data, however the benefit of + # using max-age=0 instead of no-cache, is that we will + # still support conditional requests, so we will still + # minimize traffic sent in cases where the page hasn't + # changed at all, we will just always incur the round + # trip for the conditional GET now instead of only + # once per 10 minutes. + # For more information, please see pypa/pip#5670. + "Cache-Control": "max-age=0", + }, + ) + resp.raise_for_status() + + # The check for archives above only works if the url ends with + # something that looks like an archive. However that is not a + # requirement of an url. Unless we issue a HEAD request on every + # url we cannot know ahead of time for sure if something is HTML + # or not. However we can check after we've downloaded it. + _ensure_html_header(resp) + + return resp + + +def _get_encoding_from_headers(headers): + # type: (ResponseHeaders) -> Optional[str] + """Determine if we have any encoding information in our headers. + """ + if headers and "Content-Type" in headers: + content_type, params = cgi.parse_header(headers["Content-Type"]) + if "charset" in params: + return params['charset'] + return None + + +def _determine_base_url(document, page_url): + # type: (HTMLElement, str) -> str + """Determine the HTML document's base URL. + + This looks for a ```` tag in the HTML document. If present, its href + attribute denotes the base URL of anchor tags in the document. If there is + no such tag (or if it does not have a valid href attribute), the HTML + file's URL is used as the base URL. + + :param document: An HTML document representation. The current + implementation expects the result of ``html5lib.parse()``. + :param page_url: The URL of the HTML document. + """ + for base in document.findall(".//base"): + href = base.get("href") + if href is not None: + return href + return page_url + + +def _clean_link(url): + # type: (str) -> str + """Makes sure a link is fully encoded. That is, if a ' ' shows up in + the link, it will be rewritten to %20 (while not over-quoting + % or other characters).""" + # Split the URL into parts according to the general structure + # `scheme://netloc/path;parameters?query#fragment`. Note that the + # `netloc` can be empty and the URI will then refer to a local + # filesystem path. + result = urllib_parse.urlparse(url) + # In both cases below we unquote prior to quoting to make sure + # nothing is double quoted. + if result.netloc == "": + # On Windows the path part might contain a drive letter which + # should not be quoted. On Linux where drive letters do not + # exist, the colon should be quoted. We rely on urllib.request + # to do the right thing here. + path = urllib_request.pathname2url( + urllib_request.url2pathname(result.path)) + else: + # In addition to the `/` character we protect `@` so that + # revision strings in VCS URLs are properly parsed. + path = urllib_parse.quote(urllib_parse.unquote(result.path), safe="/@") + return urllib_parse.urlunparse(result._replace(path=path)) + + +def _create_link_from_element( + anchor, # type: HTMLElement + page_url, # type: str + base_url, # type: str +): + # type: (...) -> Optional[Link] + """ + Convert an anchor element in a simple repository page to a Link. + """ + href = anchor.get("href") + if not href: + return None + + url = _clean_link(urllib_parse.urljoin(base_url, href)) + pyrequire = anchor.get('data-requires-python') + pyrequire = unescape(pyrequire) if pyrequire else None + + yanked_reason = anchor.get('data-yanked') + if yanked_reason: + # This is a unicode string in Python 2 (and 3). + yanked_reason = unescape(yanked_reason) + + link = Link( + url, + comes_from=page_url, + requires_python=pyrequire, + yanked_reason=yanked_reason, + ) + + return link + + +def parse_links(page): + # type: (HTMLPage) -> Iterable[Link] + """ + Parse an HTML document, and yield its anchor elements as Link objects. + """ + document = html5lib.parse( + page.content, + transport_encoding=page.encoding, + namespaceHTMLElements=False, + ) + + url = page.url + base_url = _determine_base_url(document, url) + for anchor in document.findall(".//a"): + link = _create_link_from_element( + anchor, + page_url=url, + base_url=base_url, + ) + if link is None: + continue + yield link + + +class HTMLPage(object): + """Represents one page, along with its URL""" + + def __init__( + self, + content, # type: bytes + encoding, # type: Optional[str] + url, # type: str + ): + # type: (...) -> None + """ + :param encoding: the encoding to decode the given content. + :param url: the URL from which the HTML was downloaded. + """ + self.content = content + self.encoding = encoding + self.url = url + + def __str__(self): + # type: () -> str + return redact_auth_from_url(self.url) + + +def _handle_get_page_fail( + link, # type: Link + reason, # type: Union[str, Exception] + meth=None # type: Optional[Callable[..., None]] +): + # type: (...) -> None + if meth is None: + meth = logger.debug + meth("Could not fetch URL %s: %s - skipping", link, reason) + + +def _make_html_page(response): + # type: (Response) -> HTMLPage + encoding = _get_encoding_from_headers(response.headers) + return HTMLPage(response.content, encoding=encoding, url=response.url) + + +def _get_html_page(link, session=None): + # type: (Link, Optional[PipSession]) -> Optional[HTMLPage] + if session is None: + raise TypeError( + "_get_html_page() missing 1 required keyword argument: 'session'" + ) + + url = link.url.split('#', 1)[0] + + # Check for VCS schemes that do not support lookup as web pages. + vcs_scheme = _match_vcs_scheme(url) + if vcs_scheme: + logger.debug('Cannot look at %s URL %s', vcs_scheme, link) + return None + + # Tack index.html onto file:// URLs that point to directories + scheme, _, path, _, _, _ = urllib_parse.urlparse(url) + if (scheme == 'file' and os.path.isdir(urllib_request.url2pathname(path))): + # add trailing slash if not present so urljoin doesn't trim + # final segment + if not url.endswith('/'): + url += '/' + url = urllib_parse.urljoin(url, 'index.html') + logger.debug(' file: URL is directory, getting %s', url) + + try: + resp = _get_html_response(url, session=session) + except _NotHTTP: + logger.debug( + 'Skipping page %s because it looks like an archive, and cannot ' + 'be checked by HEAD.', link, + ) + except _NotHTML as exc: + logger.debug( + 'Skipping page %s because the %s request got Content-Type: %s', + link, exc.request_desc, exc.content_type, + ) + except HTTPError as exc: + _handle_get_page_fail(link, exc) + except RetryError as exc: + _handle_get_page_fail(link, exc) + except SSLError as exc: + reason = "There was a problem confirming the ssl certificate: " + reason += str(exc) + _handle_get_page_fail(link, reason, meth=logger.info) + except requests.ConnectionError as exc: + _handle_get_page_fail(link, "connection error: %s" % exc) + except requests.Timeout: + _handle_get_page_fail(link, "timed out") + else: + return _make_html_page(resp) + return None + + +def _remove_duplicate_links(links): + # type: (Iterable[Link]) -> List[Link] + """ + Return a list of links, with duplicates removed and ordering preserved. + """ + # We preserve the ordering when removing duplicates because we can. + return list(OrderedDict.fromkeys(links)) + + +def group_locations(locations, expand_dir=False): + # type: (Sequence[str], bool) -> Tuple[List[str], List[str]] + """ + Divide a list of locations into two groups: "files" (archives) and "urls." + + :return: A pair of lists (files, urls). + """ + files = [] + urls = [] + + # puts the url for the given file path into the appropriate list + def sort_path(path): + # type: (str) -> None + url = path_to_url(path) + if mimetypes.guess_type(url, strict=False)[0] == 'text/html': + urls.append(url) + else: + files.append(url) + + for url in locations: + + is_local_path = os.path.exists(url) + is_file_url = url.startswith('file:') + + if is_local_path or is_file_url: + if is_local_path: + path = url + else: + path = url_to_path(url) + if os.path.isdir(path): + if expand_dir: + path = os.path.realpath(path) + for item in os.listdir(path): + sort_path(os.path.join(path, item)) + elif is_file_url: + urls.append(url) + else: + logger.warning( + "Path '{0}' is ignored: " + "it is a directory.".format(path), + ) + elif os.path.isfile(path): + sort_path(path) + else: + logger.warning( + "Url '%s' is ignored: it is neither a file " + "nor a directory.", url, + ) + elif is_url(url): + # Only add url with clear scheme + urls.append(url) + else: + logger.warning( + "Url '%s' is ignored. It is either a non-existing " + "path or lacks a specific scheme.", url, + ) + + return files, urls + + +class CollectedLinks(object): + + """ + Encapsulates the return value of a call to LinkCollector.collect_links(). + + The return value includes both URLs to project pages containing package + links, as well as individual package Link objects collected from other + sources. + + This info is stored separately as: + + (1) links from the configured file locations, + (2) links from the configured find_links, and + (3) urls to HTML project pages, as described by the PEP 503 simple + repository API. + """ + + def __init__( + self, + files, # type: List[Link] + find_links, # type: List[Link] + project_urls, # type: List[Link] + ): + # type: (...) -> None + """ + :param files: Links from file locations. + :param find_links: Links from find_links. + :param project_urls: URLs to HTML project pages, as described by + the PEP 503 simple repository API. + """ + self.files = files + self.find_links = find_links + self.project_urls = project_urls + + +class LinkCollector(object): + + """ + Responsible for collecting Link objects from all configured locations, + making network requests as needed. + + The class's main method is its collect_links() method. + """ + + def __init__( + self, + session, # type: PipSession + search_scope, # type: SearchScope + ): + # type: (...) -> None + self.search_scope = search_scope + self.session = session + + @property + def find_links(self): + # type: () -> List[str] + return self.search_scope.find_links + + def fetch_page(self, location): + # type: (Link) -> Optional[HTMLPage] + """ + Fetch an HTML page containing package links. + """ + return _get_html_page(location, session=self.session) + + def collect_links(self, project_name): + # type: (str) -> CollectedLinks + """Find all available links for the given project name. + + :return: All the Link objects (unfiltered), as a CollectedLinks object. + """ + search_scope = self.search_scope + index_locations = search_scope.get_index_urls_locations(project_name) + index_file_loc, index_url_loc = group_locations(index_locations) + fl_file_loc, fl_url_loc = group_locations( + self.find_links, expand_dir=True, + ) + + file_links = [ + Link(url) for url in itertools.chain(index_file_loc, fl_file_loc) + ] + + # We trust every directly linked archive in find_links + find_link_links = [Link(url, '-f') for url in self.find_links] + + # We trust every url that the user has given us whether it was given + # via --index-url or --find-links. + # We want to filter out anything that does not have a secure origin. + url_locations = [ + link for link in itertools.chain( + (Link(url) for url in index_url_loc), + (Link(url) for url in fl_url_loc), + ) + if self.session.is_secure_origin(link) + ] + + url_locations = _remove_duplicate_links(url_locations) + lines = [ + '{} location(s) to search for versions of {}:'.format( + len(url_locations), project_name, + ), + ] + for link in url_locations: + lines.append('* {}'.format(link)) + logger.debug('\n'.join(lines)) + + return CollectedLinks( + files=file_links, + find_links=find_link_links, + project_urls=url_locations, + ) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/index/collector 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/index/collector 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..306f20c4a41a1486c0bbfe10e72e75d16f905586 GIT binary patch literal 18625 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 MQK^hyo_guO0DXDy7ytkO literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/index/collector.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/index/collector.py new file mode 100644 index 0000000..8330793 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/index/collector.py @@ -0,0 +1,544 @@ +""" +The main purpose of this module is to expose LinkCollector.collect_links(). +""" + +import cgi +import itertools +import logging +import mimetypes +import os +from collections import OrderedDict + +from pip._vendor import html5lib, requests +from pip._vendor.distlib.compat import unescape +from pip._vendor.requests.exceptions import HTTPError, RetryError, SSLError +from pip._vendor.six.moves.urllib import parse as urllib_parse +from pip._vendor.six.moves.urllib import request as urllib_request + +from pip._internal.models.link import Link +from pip._internal.utils.filetypes import ARCHIVE_EXTENSIONS +from pip._internal.utils.misc import redact_auth_from_url +from pip._internal.utils.typing import MYPY_CHECK_RUNNING +from pip._internal.utils.urls import path_to_url, url_to_path +from pip._internal.vcs import is_url, vcs + +if MYPY_CHECK_RUNNING: + from typing import ( + Callable, Iterable, List, MutableMapping, Optional, Sequence, Tuple, + Union, + ) + import xml.etree.ElementTree + + from pip._vendor.requests import Response + + from pip._internal.models.search_scope import SearchScope + from pip._internal.network.session import PipSession + + HTMLElement = xml.etree.ElementTree.Element + ResponseHeaders = MutableMapping[str, str] + + +logger = logging.getLogger(__name__) + + +def _match_vcs_scheme(url): + # type: (str) -> Optional[str] + """Look for VCS schemes in the URL. + + Returns the matched VCS scheme, or None if there's no match. + """ + for scheme in vcs.schemes: + if url.lower().startswith(scheme) and url[len(scheme)] in '+:': + return scheme + return None + + +def _is_url_like_archive(url): + # type: (str) -> bool + """Return whether the URL looks like an archive. + """ + filename = Link(url).filename + for bad_ext in ARCHIVE_EXTENSIONS: + if filename.endswith(bad_ext): + return True + return False + + +class _NotHTML(Exception): + def __init__(self, content_type, request_desc): + # type: (str, str) -> None + super(_NotHTML, self).__init__(content_type, request_desc) + self.content_type = content_type + self.request_desc = request_desc + + +def _ensure_html_header(response): + # type: (Response) -> None + """Check the Content-Type header to ensure the response contains HTML. + + Raises `_NotHTML` if the content type is not text/html. + """ + content_type = response.headers.get("Content-Type", "") + if not content_type.lower().startswith("text/html"): + raise _NotHTML(content_type, response.request.method) + + +class _NotHTTP(Exception): + pass + + +def _ensure_html_response(url, session): + # type: (str, PipSession) -> None + """Send a HEAD request to the URL, and ensure the response contains HTML. + + Raises `_NotHTTP` if the URL is not available for a HEAD request, or + `_NotHTML` if the content type is not text/html. + """ + scheme, netloc, path, query, fragment = urllib_parse.urlsplit(url) + if scheme not in {'http', 'https'}: + raise _NotHTTP() + + resp = session.head(url, allow_redirects=True) + resp.raise_for_status() + + _ensure_html_header(resp) + + +def _get_html_response(url, session): + # type: (str, PipSession) -> Response + """Access an HTML page with GET, and return the response. + + This consists of three parts: + + 1. If the URL looks suspiciously like an archive, send a HEAD first to + check the Content-Type is HTML, to avoid downloading a large file. + Raise `_NotHTTP` if the content type cannot be determined, or + `_NotHTML` if it is not HTML. + 2. Actually perform the request. Raise HTTP exceptions on network failures. + 3. Check the Content-Type header to make sure we got HTML, and raise + `_NotHTML` otherwise. + """ + if _is_url_like_archive(url): + _ensure_html_response(url, session=session) + + logger.debug('Getting page %s', redact_auth_from_url(url)) + + resp = session.get( + url, + headers={ + "Accept": "text/html", + # We don't want to blindly returned cached data for + # /simple/, because authors generally expecting that + # twine upload && pip install will function, but if + # they've done a pip install in the last ~10 minutes + # it won't. Thus by setting this to zero we will not + # blindly use any cached data, however the benefit of + # using max-age=0 instead of no-cache, is that we will + # still support conditional requests, so we will still + # minimize traffic sent in cases where the page hasn't + # changed at all, we will just always incur the round + # trip for the conditional GET now instead of only + # once per 10 minutes. + # For more information, please see pypa/pip#5670. + "Cache-Control": "max-age=0", + }, + ) + resp.raise_for_status() + + # The check for archives above only works if the url ends with + # something that looks like an archive. However that is not a + # requirement of an url. Unless we issue a HEAD request on every + # url we cannot know ahead of time for sure if something is HTML + # or not. However we can check after we've downloaded it. + _ensure_html_header(resp) + + return resp + + +def _get_encoding_from_headers(headers): + # type: (ResponseHeaders) -> Optional[str] + """Determine if we have any encoding information in our headers. + """ + if headers and "Content-Type" in headers: + content_type, params = cgi.parse_header(headers["Content-Type"]) + if "charset" in params: + return params['charset'] + return None + + +def _determine_base_url(document, page_url): + # type: (HTMLElement, str) -> str + """Determine the HTML document's base URL. + + This looks for a ```` tag in the HTML document. If present, its href + attribute denotes the base URL of anchor tags in the document. If there is + no such tag (or if it does not have a valid href attribute), the HTML + file's URL is used as the base URL. + + :param document: An HTML document representation. The current + implementation expects the result of ``html5lib.parse()``. + :param page_url: The URL of the HTML document. + """ + for base in document.findall(".//base"): + href = base.get("href") + if href is not None: + return href + return page_url + + +def _clean_link(url): + # type: (str) -> str + """Makes sure a link is fully encoded. That is, if a ' ' shows up in + the link, it will be rewritten to %20 (while not over-quoting + % or other characters).""" + # Split the URL into parts according to the general structure + # `scheme://netloc/path;parameters?query#fragment`. Note that the + # `netloc` can be empty and the URI will then refer to a local + # filesystem path. + result = urllib_parse.urlparse(url) + # In both cases below we unquote prior to quoting to make sure + # nothing is double quoted. + if result.netloc == "": + # On Windows the path part might contain a drive letter which + # should not be quoted. On Linux where drive letters do not + # exist, the colon should be quoted. We rely on urllib.request + # to do the right thing here. + path = urllib_request.pathname2url( + urllib_request.url2pathname(result.path)) + else: + # In addition to the `/` character we protect `@` so that + # revision strings in VCS URLs are properly parsed. + path = urllib_parse.quote(urllib_parse.unquote(result.path), safe="/@") + return urllib_parse.urlunparse(result._replace(path=path)) + + +def _create_link_from_element( + anchor, # type: HTMLElement + page_url, # type: str + base_url, # type: str +): + # type: (...) -> Optional[Link] + """ + Convert an anchor element in a simple repository page to a Link. + """ + href = anchor.get("href") + if not href: + return None + + url = _clean_link(urllib_parse.urljoin(base_url, href)) + pyrequire = anchor.get('data-requires-python') + pyrequire = unescape(pyrequire) if pyrequire else None + + yanked_reason = anchor.get('data-yanked') + if yanked_reason: + # This is a unicode string in Python 2 (and 3). + yanked_reason = unescape(yanked_reason) + + link = Link( + url, + comes_from=page_url, + requires_python=pyrequire, + yanked_reason=yanked_reason, + ) + + return link + + +def parse_links(page): + # type: (HTMLPage) -> Iterable[Link] + """ + Parse an HTML document, and yield its anchor elements as Link objects. + """ + document = html5lib.parse( + page.content, + transport_encoding=page.encoding, + namespaceHTMLElements=False, + ) + + url = page.url + base_url = _determine_base_url(document, url) + for anchor in document.findall(".//a"): + link = _create_link_from_element( + anchor, + page_url=url, + base_url=base_url, + ) + if link is None: + continue + yield link + + +class HTMLPage(object): + """Represents one page, along with its URL""" + + def __init__( + self, + content, # type: bytes + encoding, # type: Optional[str] + url, # type: str + ): + # type: (...) -> None + """ + :param encoding: the encoding to decode the given content. + :param url: the URL from which the HTML was downloaded. + """ + self.content = content + self.encoding = encoding + self.url = url + + def __str__(self): + # type: () -> str + return redact_auth_from_url(self.url) + + +def _handle_get_page_fail( + link, # type: Link + reason, # type: Union[str, Exception] + meth=None # type: Optional[Callable[..., None]] +): + # type: (...) -> None + if meth is None: + meth = logger.debug + meth("Could not fetch URL %s: %s - skipping", link, reason) + + +def _make_html_page(response): + # type: (Response) -> HTMLPage + encoding = _get_encoding_from_headers(response.headers) + return HTMLPage(response.content, encoding=encoding, url=response.url) + + +def _get_html_page(link, session=None): + # type: (Link, Optional[PipSession]) -> Optional[HTMLPage] + if session is None: + raise TypeError( + "_get_html_page() missing 1 required keyword argument: 'session'" + ) + + url = link.url.split('#', 1)[0] + + # Check for VCS schemes that do not support lookup as web pages. + vcs_scheme = _match_vcs_scheme(url) + if vcs_scheme: + logger.debug('Cannot look at %s URL %s', vcs_scheme, link) + return None + + # Tack index.html onto file:// URLs that point to directories + scheme, _, path, _, _, _ = urllib_parse.urlparse(url) + if (scheme == 'file' and os.path.isdir(urllib_request.url2pathname(path))): + # add trailing slash if not present so urljoin doesn't trim + # final segment + if not url.endswith('/'): + url += '/' + url = urllib_parse.urljoin(url, 'index.html') + logger.debug(' file: URL is directory, getting %s', url) + + try: + resp = _get_html_response(url, session=session) + except _NotHTTP: + logger.debug( + 'Skipping page %s because it looks like an archive, and cannot ' + 'be checked by HEAD.', link, + ) + except _NotHTML as exc: + logger.debug( + 'Skipping page %s because the %s request got Content-Type: %s', + link, exc.request_desc, exc.content_type, + ) + except HTTPError as exc: + _handle_get_page_fail(link, exc) + except RetryError as exc: + _handle_get_page_fail(link, exc) + except SSLError as exc: + reason = "There was a problem confirming the ssl certificate: " + reason += str(exc) + _handle_get_page_fail(link, reason, meth=logger.info) + except requests.ConnectionError as exc: + _handle_get_page_fail(link, "connection error: %s" % exc) + except requests.Timeout: + _handle_get_page_fail(link, "timed out") + else: + return _make_html_page(resp) + return None + + +def _remove_duplicate_links(links): + # type: (Iterable[Link]) -> List[Link] + """ + Return a list of links, with duplicates removed and ordering preserved. + """ + # We preserve the ordering when removing duplicates because we can. + return list(OrderedDict.fromkeys(links)) + + +def group_locations(locations, expand_dir=False): + # type: (Sequence[str], bool) -> Tuple[List[str], List[str]] + """ + Divide a list of locations into two groups: "files" (archives) and "urls." + + :return: A pair of lists (files, urls). + """ + files = [] + urls = [] + + # puts the url for the given file path into the appropriate list + def sort_path(path): + # type: (str) -> None + url = path_to_url(path) + if mimetypes.guess_type(url, strict=False)[0] == 'text/html': + urls.append(url) + else: + files.append(url) + + for url in locations: + + is_local_path = os.path.exists(url) + is_file_url = url.startswith('file:') + + if is_local_path or is_file_url: + if is_local_path: + path = url + else: + path = url_to_path(url) + if os.path.isdir(path): + if expand_dir: + path = os.path.realpath(path) + for item in os.listdir(path): + sort_path(os.path.join(path, item)) + elif is_file_url: + urls.append(url) + else: + logger.warning( + "Path '{0}' is ignored: " + "it is a directory.".format(path), + ) + elif os.path.isfile(path): + sort_path(path) + else: + logger.warning( + "Url '%s' is ignored: it is neither a file " + "nor a directory.", url, + ) + elif is_url(url): + # Only add url with clear scheme + urls.append(url) + else: + logger.warning( + "Url '%s' is ignored. It is either a non-existing " + "path or lacks a specific scheme.", url, + ) + + return files, urls + + +class CollectedLinks(object): + + """ + Encapsulates the return value of a call to LinkCollector.collect_links(). + + The return value includes both URLs to project pages containing package + links, as well as individual package Link objects collected from other + sources. + + This info is stored separately as: + + (1) links from the configured file locations, + (2) links from the configured find_links, and + (3) urls to HTML project pages, as described by the PEP 503 simple + repository API. + """ + + def __init__( + self, + files, # type: List[Link] + find_links, # type: List[Link] + project_urls, # type: List[Link] + ): + # type: (...) -> None + """ + :param files: Links from file locations. + :param find_links: Links from find_links. + :param project_urls: URLs to HTML project pages, as described by + the PEP 503 simple repository API. + """ + self.files = files + self.find_links = find_links + self.project_urls = project_urls + + +class LinkCollector(object): + + """ + Responsible for collecting Link objects from all configured locations, + making network requests as needed. + + The class's main method is its collect_links() method. + """ + + def __init__( + self, + session, # type: PipSession + search_scope, # type: SearchScope + ): + # type: (...) -> None + self.search_scope = search_scope + self.session = session + + @property + def find_links(self): + # type: () -> List[str] + return self.search_scope.find_links + + def fetch_page(self, location): + # type: (Link) -> Optional[HTMLPage] + """ + Fetch an HTML page containing package links. + """ + return _get_html_page(location, session=self.session) + + def collect_links(self, project_name): + # type: (str) -> CollectedLinks + """Find all available links for the given project name. + + :return: All the Link objects (unfiltered), as a CollectedLinks object. + """ + search_scope = self.search_scope + index_locations = search_scope.get_index_urls_locations(project_name) + index_file_loc, index_url_loc = group_locations(index_locations) + fl_file_loc, fl_url_loc = group_locations( + self.find_links, expand_dir=True, + ) + + file_links = [ + Link(url) for url in itertools.chain(index_file_loc, fl_file_loc) + ] + + # We trust every directly linked archive in find_links + find_link_links = [Link(url, '-f') for url in self.find_links] + + # We trust every url that the user has given us whether it was given + # via --index-url or --find-links. + # We want to filter out anything that does not have a secure origin. + url_locations = [ + link for link in itertools.chain( + (Link(url) for url in index_url_loc), + (Link(url) for url in fl_url_loc), + ) + if self.session.is_secure_origin(link) + ] + + url_locations = _remove_duplicate_links(url_locations) + lines = [ + '{} location(s) to search for versions of {}:'.format( + len(url_locations), project_name, + ), + ] + for link in url_locations: + lines.append('* {}'.format(link)) + logger.debug('\n'.join(lines)) + + return CollectedLinks( + files=file_links, + find_links=find_link_links, + project_urls=url_locations, + ) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/index/collector.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/index/collector.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6e91925a2ad3a9816fada2146cd93dc7e907ca2b GIT binary patch literal 18625 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 bool + """ + Return whether the given Python version is compatible with a link's + "Requires-Python" value. + + :param version_info: A 3-tuple of ints representing the Python + major-minor-micro version to check. + :param ignore_requires_python: Whether to ignore the "Requires-Python" + value if the given Python version isn't compatible. + """ + try: + is_compatible = check_requires_python( + link.requires_python, version_info=version_info, + ) + except specifiers.InvalidSpecifier: + logger.debug( + "Ignoring invalid Requires-Python (%r) for link: %s", + link.requires_python, link, + ) + else: + if not is_compatible: + version = '.'.join(map(str, version_info)) + if not ignore_requires_python: + logger.debug( + 'Link requires a different Python (%s not in: %r): %s', + version, link.requires_python, link, + ) + return False + + logger.debug( + 'Ignoring failed Requires-Python check (%s not in: %r) ' + 'for link: %s', + version, link.requires_python, link, + ) + + return True + + +class LinkEvaluator(object): + + """ + Responsible for evaluating links for a particular project. + """ + + _py_version_re = re.compile(r'-py([123]\.?[0-9]?)$') + + # Don't include an allow_yanked default value to make sure each call + # site considers whether yanked releases are allowed. This also causes + # that decision to be made explicit in the calling code, which helps + # people when reading the code. + def __init__( + self, + project_name, # type: str + canonical_name, # type: str + formats, # type: FrozenSet[str] + target_python, # type: TargetPython + allow_yanked, # type: bool + ignore_requires_python=None, # type: Optional[bool] + ): + # type: (...) -> None + """ + :param project_name: The user supplied package name. + :param canonical_name: The canonical package name. + :param formats: The formats allowed for this package. Should be a set + with 'binary' or 'source' or both in it. + :param target_python: The target Python interpreter to use when + evaluating link compatibility. This is used, for example, to + check wheel compatibility, as well as when checking the Python + version, e.g. the Python version embedded in a link filename + (or egg fragment) and against an HTML link's optional PEP 503 + "data-requires-python" attribute. + :param allow_yanked: Whether files marked as yanked (in the sense + of PEP 592) are permitted to be candidates for install. + :param ignore_requires_python: Whether to ignore incompatible + PEP 503 "data-requires-python" values in HTML links. Defaults + to False. + """ + if ignore_requires_python is None: + ignore_requires_python = False + + self._allow_yanked = allow_yanked + self._canonical_name = canonical_name + self._ignore_requires_python = ignore_requires_python + self._formats = formats + self._target_python = target_python + + self.project_name = project_name + + def evaluate_link(self, link): + # type: (Link) -> Tuple[bool, Optional[Text]] + """ + Determine whether a link is a candidate for installation. + + :return: A tuple (is_candidate, result), where `result` is (1) a + version string if `is_candidate` is True, and (2) if + `is_candidate` is False, an optional string to log the reason + the link fails to qualify. + """ + version = None + if link.is_yanked and not self._allow_yanked: + reason = link.yanked_reason or '' + # Mark this as a unicode string to prevent "UnicodeEncodeError: + # 'ascii' codec can't encode character" in Python 2 when + # the reason contains non-ascii characters. + return (False, u'yanked for reason: {}'.format(reason)) + + if link.egg_fragment: + egg_info = link.egg_fragment + ext = link.ext + else: + egg_info, ext = link.splitext() + if not ext: + return (False, 'not a file') + if ext not in SUPPORTED_EXTENSIONS: + return (False, 'unsupported archive format: %s' % ext) + if "binary" not in self._formats and ext == WHEEL_EXTENSION: + reason = 'No binaries permitted for %s' % self.project_name + return (False, reason) + if "macosx10" in link.path and ext == '.zip': + return (False, 'macosx10 one') + if ext == WHEEL_EXTENSION: + try: + wheel = Wheel(link.filename) + except InvalidWheelFilename: + return (False, 'invalid wheel filename') + if canonicalize_name(wheel.name) != self._canonical_name: + reason = 'wrong project name (not %s)' % self.project_name + return (False, reason) + + supported_tags = self._target_python.get_tags() + if not wheel.supported(supported_tags): + # Include the wheel's tags in the reason string to + # simplify troubleshooting compatibility issues. + file_tags = wheel.get_formatted_file_tags() + reason = ( + "none of the wheel's tags match: {}".format( + ', '.join(file_tags) + ) + ) + return (False, reason) + + version = wheel.version + + # This should be up by the self.ok_binary check, but see issue 2700. + if "source" not in self._formats and ext != WHEEL_EXTENSION: + return (False, 'No sources permitted for %s' % self.project_name) + + if not version: + version = _extract_version_from_fragment( + egg_info, self._canonical_name, + ) + if not version: + return ( + False, 'Missing project version for %s' % self.project_name, + ) + + match = self._py_version_re.search(version) + if match: + version = version[:match.start()] + py_version = match.group(1) + if py_version != self._target_python.py_version: + return (False, 'Python version is incorrect') + + supports_python = _check_link_requires_python( + link, version_info=self._target_python.py_version_info, + ignore_requires_python=self._ignore_requires_python, + ) + if not supports_python: + # Return None for the reason text to suppress calling + # _log_skipped_link(). + return (False, None) + + logger.debug('Found link %s, version: %s', link, version) + + return (True, version) + + +def filter_unallowed_hashes( + candidates, # type: List[InstallationCandidate] + hashes, # type: Hashes + project_name, # type: str +): + # type: (...) -> List[InstallationCandidate] + """ + Filter out candidates whose hashes aren't allowed, and return a new + list of candidates. + + If at least one candidate has an allowed hash, then all candidates with + either an allowed hash or no hash specified are returned. Otherwise, + the given candidates are returned. + + Including the candidates with no hash specified when there is a match + allows a warning to be logged if there is a more preferred candidate + with no hash specified. Returning all candidates in the case of no + matches lets pip report the hash of the candidate that would otherwise + have been installed (e.g. permitting the user to more easily update + their requirements file with the desired hash). + """ + if not hashes: + logger.debug( + 'Given no hashes to check %s links for project %r: ' + 'discarding no candidates', + len(candidates), + project_name, + ) + # Make sure we're not returning back the given value. + return list(candidates) + + matches_or_no_digest = [] + # Collect the non-matches for logging purposes. + non_matches = [] + match_count = 0 + for candidate in candidates: + link = candidate.link + if not link.has_hash: + pass + elif link.is_hash_allowed(hashes=hashes): + match_count += 1 + else: + non_matches.append(candidate) + continue + + matches_or_no_digest.append(candidate) + + if match_count: + filtered = matches_or_no_digest + else: + # Make sure we're not returning back the given value. + filtered = list(candidates) + + if len(filtered) == len(candidates): + discard_message = 'discarding no candidates' + else: + discard_message = 'discarding {} non-matches:\n {}'.format( + len(non_matches), + '\n '.join(str(candidate.link) for candidate in non_matches) + ) + + logger.debug( + 'Checked %s links for project %r against %s hashes ' + '(%s matches, %s no digest): %s', + len(candidates), + project_name, + hashes.digest_count, + match_count, + len(matches_or_no_digest) - match_count, + discard_message + ) + + return filtered + + +class CandidatePreferences(object): + + """ + Encapsulates some of the preferences for filtering and sorting + InstallationCandidate objects. + """ + + def __init__( + self, + prefer_binary=False, # type: bool + allow_all_prereleases=False, # type: bool + ): + # type: (...) -> None + """ + :param allow_all_prereleases: Whether to allow all pre-releases. + """ + self.allow_all_prereleases = allow_all_prereleases + self.prefer_binary = prefer_binary + + +class BestCandidateResult(object): + """A collection of candidates, returned by `PackageFinder.find_best_candidate`. + + This class is only intended to be instantiated by CandidateEvaluator's + `compute_best_candidate()` method. + """ + + def __init__( + self, + candidates, # type: List[InstallationCandidate] + applicable_candidates, # type: List[InstallationCandidate] + best_candidate, # type: Optional[InstallationCandidate] + ): + # type: (...) -> None + """ + :param candidates: A sequence of all available candidates found. + :param applicable_candidates: The applicable candidates. + :param best_candidate: The most preferred candidate found, or None + if no applicable candidates were found. + """ + assert set(applicable_candidates) <= set(candidates) + + if best_candidate is None: + assert not applicable_candidates + else: + assert best_candidate in applicable_candidates + + self._applicable_candidates = applicable_candidates + self._candidates = candidates + + self.best_candidate = best_candidate + + def iter_all(self): + # type: () -> Iterable[InstallationCandidate] + """Iterate through all candidates. + """ + return iter(self._candidates) + + def iter_applicable(self): + # type: () -> Iterable[InstallationCandidate] + """Iterate through the applicable candidates. + """ + return iter(self._applicable_candidates) + + +class CandidateEvaluator(object): + + """ + Responsible for filtering and sorting candidates for installation based + on what tags are valid. + """ + + @classmethod + def create( + cls, + project_name, # type: str + target_python=None, # type: Optional[TargetPython] + prefer_binary=False, # type: bool + allow_all_prereleases=False, # type: bool + specifier=None, # type: Optional[specifiers.BaseSpecifier] + hashes=None, # type: Optional[Hashes] + ): + # type: (...) -> CandidateEvaluator + """Create a CandidateEvaluator object. + + :param target_python: The target Python interpreter to use when + checking compatibility. If None (the default), a TargetPython + object will be constructed from the running Python. + :param specifier: An optional object implementing `filter` + (e.g. `packaging.specifiers.SpecifierSet`) to filter applicable + versions. + :param hashes: An optional collection of allowed hashes. + """ + if target_python is None: + target_python = TargetPython() + if specifier is None: + specifier = specifiers.SpecifierSet() + + supported_tags = target_python.get_tags() + + return cls( + project_name=project_name, + supported_tags=supported_tags, + specifier=specifier, + prefer_binary=prefer_binary, + allow_all_prereleases=allow_all_prereleases, + hashes=hashes, + ) + + def __init__( + self, + project_name, # type: str + supported_tags, # type: List[Tag] + specifier, # type: specifiers.BaseSpecifier + prefer_binary=False, # type: bool + allow_all_prereleases=False, # type: bool + hashes=None, # type: Optional[Hashes] + ): + # type: (...) -> None + """ + :param supported_tags: The PEP 425 tags supported by the target + Python in order of preference (most preferred first). + """ + self._allow_all_prereleases = allow_all_prereleases + self._hashes = hashes + self._prefer_binary = prefer_binary + self._project_name = project_name + self._specifier = specifier + self._supported_tags = supported_tags + + def get_applicable_candidates( + self, + candidates, # type: List[InstallationCandidate] + ): + # type: (...) -> List[InstallationCandidate] + """ + Return the applicable candidates from a list of candidates. + """ + # Using None infers from the specifier instead. + allow_prereleases = self._allow_all_prereleases or None + specifier = self._specifier + versions = { + str(v) for v in specifier.filter( + # We turn the version object into a str here because otherwise + # when we're debundled but setuptools isn't, Python will see + # packaging.version.Version and + # pkg_resources._vendor.packaging.version.Version as different + # types. This way we'll use a str as a common data interchange + # format. If we stop using the pkg_resources provided specifier + # and start using our own, we can drop the cast to str(). + (str(c.version) for c in candidates), + prereleases=allow_prereleases, + ) + } + + # Again, converting version to str to deal with debundling. + applicable_candidates = [ + c for c in candidates if str(c.version) in versions + ] + + filtered_applicable_candidates = filter_unallowed_hashes( + candidates=applicable_candidates, + hashes=self._hashes, + project_name=self._project_name, + ) + + return sorted(filtered_applicable_candidates, key=self._sort_key) + + def _sort_key(self, candidate): + # type: (InstallationCandidate) -> CandidateSortingKey + """ + Function to pass as the `key` argument to a call to sorted() to sort + InstallationCandidates by preference. + + Returns a tuple such that tuples sorting as greater using Python's + default comparison operator are more preferred. + + The preference is as follows: + + First and foremost, candidates with allowed (matching) hashes are + always preferred over candidates without matching hashes. This is + because e.g. if the only candidate with an allowed hash is yanked, + we still want to use that candidate. + + Second, excepting hash considerations, candidates that have been + yanked (in the sense of PEP 592) are always less preferred than + candidates that haven't been yanked. Then: + + If not finding wheels, they are sorted by version only. + If finding wheels, then the sort order is by version, then: + 1. existing installs + 2. wheels ordered via Wheel.support_index_min(self._supported_tags) + 3. source archives + If prefer_binary was set, then all wheels are sorted above sources. + + Note: it was considered to embed this logic into the Link + comparison operators, but then different sdist links + with the same version, would have to be considered equal + """ + valid_tags = self._supported_tags + support_num = len(valid_tags) + build_tag = () # type: BuildTag + binary_preference = 0 + link = candidate.link + if link.is_wheel: + # can raise InvalidWheelFilename + wheel = Wheel(link.filename) + if not wheel.supported(valid_tags): + raise UnsupportedWheel( + "%s is not a supported wheel for this platform. It " + "can't be sorted." % wheel.filename + ) + if self._prefer_binary: + binary_preference = 1 + pri = -(wheel.support_index_min(valid_tags)) + if wheel.build_tag is not None: + match = re.match(r'^(\d+)(.*)$', wheel.build_tag) + build_tag_groups = match.groups() + build_tag = (int(build_tag_groups[0]), build_tag_groups[1]) + else: # sdist + pri = -(support_num) + has_allowed_hash = int(link.is_hash_allowed(self._hashes)) + yank_value = -1 * int(link.is_yanked) # -1 for yanked. + return ( + has_allowed_hash, yank_value, binary_preference, candidate.version, + build_tag, pri, + ) + + def sort_best_candidate( + self, + candidates, # type: List[InstallationCandidate] + ): + # type: (...) -> Optional[InstallationCandidate] + """ + Return the best candidate per the instance's sort order, or None if + no candidate is acceptable. + """ + if not candidates: + return None + + best_candidate = max(candidates, key=self._sort_key) + + # Log a warning per PEP 592 if necessary before returning. + link = best_candidate.link + if link.is_yanked: + reason = link.yanked_reason or '' + msg = ( + # Mark this as a unicode string to prevent + # "UnicodeEncodeError: 'ascii' codec can't encode character" + # in Python 2 when the reason contains non-ascii characters. + u'The candidate selected for download or install is a ' + 'yanked version: {candidate}\n' + 'Reason for being yanked: {reason}' + ).format(candidate=best_candidate, reason=reason) + logger.warning(msg) + + return best_candidate + + def compute_best_candidate( + self, + candidates, # type: List[InstallationCandidate] + ): + # type: (...) -> BestCandidateResult + """ + Compute and return a `BestCandidateResult` instance. + """ + applicable_candidates = self.get_applicable_candidates(candidates) + + best_candidate = self.sort_best_candidate(applicable_candidates) + + return BestCandidateResult( + candidates, + applicable_candidates=applicable_candidates, + best_candidate=best_candidate, + ) + + +class PackageFinder(object): + """This finds packages. + + This is meant to match easy_install's technique for looking for + packages, by reading pages and looking for appropriate links. + """ + + def __init__( + self, + link_collector, # type: LinkCollector + target_python, # type: TargetPython + allow_yanked, # type: bool + format_control=None, # type: Optional[FormatControl] + candidate_prefs=None, # type: CandidatePreferences + ignore_requires_python=None, # type: Optional[bool] + ): + # type: (...) -> None + """ + This constructor is primarily meant to be used by the create() class + method and from tests. + + :param format_control: A FormatControl object, used to control + the selection of source packages / binary packages when consulting + the index and links. + :param candidate_prefs: Options to use when creating a + CandidateEvaluator object. + """ + if candidate_prefs is None: + candidate_prefs = CandidatePreferences() + + format_control = format_control or FormatControl(set(), set()) + + self._allow_yanked = allow_yanked + self._candidate_prefs = candidate_prefs + self._ignore_requires_python = ignore_requires_python + self._link_collector = link_collector + self._target_python = target_python + + self.format_control = format_control + + # These are boring links that have already been logged somehow. + self._logged_links = set() # type: Set[Link] + + # Don't include an allow_yanked default value to make sure each call + # site considers whether yanked releases are allowed. This also causes + # that decision to be made explicit in the calling code, which helps + # people when reading the code. + @classmethod + def create( + cls, + link_collector, # type: LinkCollector + selection_prefs, # type: SelectionPreferences + target_python=None, # type: Optional[TargetPython] + ): + # type: (...) -> PackageFinder + """Create a PackageFinder. + + :param selection_prefs: The candidate selection preferences, as a + SelectionPreferences object. + :param target_python: The target Python interpreter to use when + checking compatibility. If None (the default), a TargetPython + object will be constructed from the running Python. + """ + if target_python is None: + target_python = TargetPython() + + candidate_prefs = CandidatePreferences( + prefer_binary=selection_prefs.prefer_binary, + allow_all_prereleases=selection_prefs.allow_all_prereleases, + ) + + return cls( + candidate_prefs=candidate_prefs, + link_collector=link_collector, + target_python=target_python, + allow_yanked=selection_prefs.allow_yanked, + format_control=selection_prefs.format_control, + ignore_requires_python=selection_prefs.ignore_requires_python, + ) + + @property + def search_scope(self): + # type: () -> SearchScope + return self._link_collector.search_scope + + @search_scope.setter + def search_scope(self, search_scope): + # type: (SearchScope) -> None + self._link_collector.search_scope = search_scope + + @property + def find_links(self): + # type: () -> List[str] + return self._link_collector.find_links + + @property + def index_urls(self): + # type: () -> List[str] + return self.search_scope.index_urls + + @property + def trusted_hosts(self): + # type: () -> Iterable[str] + for host_port in self._link_collector.session.pip_trusted_origins: + yield build_netloc(*host_port) + + @property + def allow_all_prereleases(self): + # type: () -> bool + return self._candidate_prefs.allow_all_prereleases + + def set_allow_all_prereleases(self): + # type: () -> None + self._candidate_prefs.allow_all_prereleases = True + + def make_link_evaluator(self, project_name): + # type: (str) -> LinkEvaluator + canonical_name = canonicalize_name(project_name) + formats = self.format_control.get_allowed_formats(canonical_name) + + return LinkEvaluator( + project_name=project_name, + canonical_name=canonical_name, + formats=formats, + target_python=self._target_python, + allow_yanked=self._allow_yanked, + ignore_requires_python=self._ignore_requires_python, + ) + + def _sort_links(self, links): + # type: (Iterable[Link]) -> List[Link] + """ + Returns elements of links in order, non-egg links first, egg links + second, while eliminating duplicates + """ + eggs, no_eggs = [], [] + seen = set() # type: Set[Link] + for link in links: + if link not in seen: + seen.add(link) + if link.egg_fragment: + eggs.append(link) + else: + no_eggs.append(link) + return no_eggs + eggs + + def _log_skipped_link(self, link, reason): + # type: (Link, Text) -> None + if link not in self._logged_links: + # Mark this as a unicode string to prevent "UnicodeEncodeError: + # 'ascii' codec can't encode character" in Python 2 when + # the reason contains non-ascii characters. + # Also, put the link at the end so the reason is more visible + # and because the link string is usually very long. + logger.debug(u'Skipping link: %s: %s', reason, link) + self._logged_links.add(link) + + def get_install_candidate(self, link_evaluator, link): + # type: (LinkEvaluator, Link) -> Optional[InstallationCandidate] + """ + If the link is a candidate for install, convert it to an + InstallationCandidate and return it. Otherwise, return None. + """ + is_candidate, result = link_evaluator.evaluate_link(link) + if not is_candidate: + if result: + self._log_skipped_link(link, reason=result) + return None + + return InstallationCandidate( + name=link_evaluator.project_name, + link=link, + # Convert the Text result to str since InstallationCandidate + # accepts str. + version=str(result), + ) + + def evaluate_links(self, link_evaluator, links): + # type: (LinkEvaluator, Iterable[Link]) -> List[InstallationCandidate] + """ + Convert links that are candidates to InstallationCandidate objects. + """ + candidates = [] + for link in self._sort_links(links): + candidate = self.get_install_candidate(link_evaluator, link) + if candidate is not None: + candidates.append(candidate) + + return candidates + + def process_project_url(self, project_url, link_evaluator): + # type: (Link, LinkEvaluator) -> List[InstallationCandidate] + logger.debug( + 'Fetching project page and analyzing links: %s', project_url, + ) + html_page = self._link_collector.fetch_page(project_url) + if html_page is None: + return [] + + page_links = list(parse_links(html_page)) + + with indent_log(): + package_links = self.evaluate_links( + link_evaluator, + links=page_links, + ) + + return package_links + + def find_all_candidates(self, project_name): + # type: (str) -> List[InstallationCandidate] + """Find all available InstallationCandidate for project_name + + This checks index_urls and find_links. + All versions found are returned as an InstallationCandidate list. + + See LinkEvaluator.evaluate_link() for details on which files + are accepted. + """ + collected_links = self._link_collector.collect_links(project_name) + + link_evaluator = self.make_link_evaluator(project_name) + + find_links_versions = self.evaluate_links( + link_evaluator, + links=collected_links.find_links, + ) + + page_versions = [] + for project_url in collected_links.project_urls: + package_links = self.process_project_url( + project_url, link_evaluator=link_evaluator, + ) + page_versions.extend(package_links) + + file_versions = self.evaluate_links( + link_evaluator, + links=collected_links.files, + ) + if file_versions: + file_versions.sort(reverse=True) + logger.debug( + 'Local files found: %s', + ', '.join([ + url_to_path(candidate.link.url) + for candidate in file_versions + ]) + ) + + # This is an intentional priority ordering + return file_versions + find_links_versions + page_versions + + def make_candidate_evaluator( + self, + project_name, # type: str + specifier=None, # type: Optional[specifiers.BaseSpecifier] + hashes=None, # type: Optional[Hashes] + ): + # type: (...) -> CandidateEvaluator + """Create a CandidateEvaluator object to use. + """ + candidate_prefs = self._candidate_prefs + return CandidateEvaluator.create( + project_name=project_name, + target_python=self._target_python, + prefer_binary=candidate_prefs.prefer_binary, + allow_all_prereleases=candidate_prefs.allow_all_prereleases, + specifier=specifier, + hashes=hashes, + ) + + def find_best_candidate( + self, + project_name, # type: str + specifier=None, # type: Optional[specifiers.BaseSpecifier] + hashes=None, # type: Optional[Hashes] + ): + # type: (...) -> BestCandidateResult + """Find matches for the given project and specifier. + + :param specifier: An optional object implementing `filter` + (e.g. `packaging.specifiers.SpecifierSet`) to filter applicable + versions. + + :return: A `BestCandidateResult` instance. + """ + candidates = self.find_all_candidates(project_name) + candidate_evaluator = self.make_candidate_evaluator( + project_name=project_name, + specifier=specifier, + hashes=hashes, + ) + return candidate_evaluator.compute_best_candidate(candidates) + + def find_requirement(self, req, upgrade): + # type: (InstallRequirement, bool) -> Optional[Link] + """Try to find a Link matching req + + Expects req, an InstallRequirement and upgrade, a boolean + Returns a Link if found, + Raises DistributionNotFound or BestVersionAlreadyInstalled otherwise + """ + hashes = req.hashes(trust_internet=False) + best_candidate_result = self.find_best_candidate( + req.name, specifier=req.specifier, hashes=hashes, + ) + best_candidate = best_candidate_result.best_candidate + + installed_version = None # type: Optional[_BaseVersion] + if req.satisfied_by is not None: + installed_version = parse_version(req.satisfied_by.version) + + def _format_versions(cand_iter): + # type: (Iterable[InstallationCandidate]) -> str + # This repeated parse_version and str() conversion is needed to + # handle different vendoring sources from pip and pkg_resources. + # If we stop using the pkg_resources provided specifier and start + # using our own, we can drop the cast to str(). + return ", ".join(sorted( + {str(c.version) for c in cand_iter}, + key=parse_version, + )) or "none" + + if installed_version is None and best_candidate is None: + logger.critical( + 'Could not find a version that satisfies the requirement %s ' + '(from versions: %s)', + req, + _format_versions(best_candidate_result.iter_all()), + ) + + raise DistributionNotFound( + 'No matching distribution found for %s' % req + ) + + best_installed = False + if installed_version and ( + best_candidate is None or + best_candidate.version <= installed_version): + best_installed = True + + if not upgrade and installed_version is not None: + if best_installed: + logger.debug( + 'Existing installed version (%s) is most up-to-date and ' + 'satisfies requirement', + installed_version, + ) + else: + logger.debug( + 'Existing installed version (%s) satisfies requirement ' + '(most up-to-date version is %s)', + installed_version, + best_candidate.version, + ) + return None + + if best_installed: + # We have an existing version, and its the best version + logger.debug( + 'Installed version (%s) is most up-to-date (past versions: ' + '%s)', + installed_version, + _format_versions(best_candidate_result.iter_applicable()), + ) + raise BestVersionAlreadyInstalled + + logger.debug( + 'Using version %s (newest of versions: %s)', + best_candidate.version, + _format_versions(best_candidate_result.iter_applicable()), + ) + return best_candidate.link + + +def _find_name_version_sep(fragment, canonical_name): + # type: (str, str) -> int + """Find the separator's index based on the package's canonical name. + + :param fragment: A + filename "fragment" (stem) or + egg fragment. + :param canonical_name: The package's canonical name. + + This function is needed since the canonicalized name does not necessarily + have the same length as the egg info's name part. An example:: + + >>> fragment = 'foo__bar-1.0' + >>> canonical_name = 'foo-bar' + >>> _find_name_version_sep(fragment, canonical_name) + 8 + """ + # Project name and version must be separated by one single dash. Find all + # occurrences of dashes; if the string in front of it matches the canonical + # name, this is the one separating the name and version parts. + for i, c in enumerate(fragment): + if c != "-": + continue + if canonicalize_name(fragment[:i]) == canonical_name: + return i + raise ValueError("{} does not match {}".format(fragment, canonical_name)) + + +def _extract_version_from_fragment(fragment, canonical_name): + # type: (str, str) -> Optional[str] + """Parse the version string from a + filename + "fragment" (stem) or egg fragment. + + :param fragment: The string to parse. E.g. foo-2.1 + :param canonical_name: The canonicalized name of the package this + belongs to. + """ + try: + version_start = _find_name_version_sep(fragment, canonical_name) + 1 + except ValueError: + return None + version = fragment[version_start:] + if not version: + return None + return version diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/index/package_finder 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/index/package_finder 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ba765e37ff5f20ba3cf0713ebb499f69a7286e9c GIT binary patch literal 31997 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 X@N46rJ-Gkise|7?_?Pb9_|g9hhVVCd literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/index/package_finder.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/index/package_finder.py new file mode 100644 index 0000000..a74d78d --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/index/package_finder.py @@ -0,0 +1,1013 @@ +"""Routines related to PyPI, indexes""" + +# The following comment should be removed at some point in the future. +# mypy: strict-optional=False + +from __future__ import absolute_import + +import logging +import re + +from pip._vendor.packaging import specifiers +from pip._vendor.packaging.utils import canonicalize_name +from pip._vendor.packaging.version import parse as parse_version + +from pip._internal.exceptions import ( + BestVersionAlreadyInstalled, + DistributionNotFound, + InvalidWheelFilename, + UnsupportedWheel, +) +from pip._internal.index.collector import parse_links +from pip._internal.models.candidate import InstallationCandidate +from pip._internal.models.format_control import FormatControl +from pip._internal.models.link import Link +from pip._internal.models.selection_prefs import SelectionPreferences +from pip._internal.models.target_python import TargetPython +from pip._internal.models.wheel import Wheel +from pip._internal.utils.filetypes import WHEEL_EXTENSION +from pip._internal.utils.logging import indent_log +from pip._internal.utils.misc import build_netloc +from pip._internal.utils.packaging import check_requires_python +from pip._internal.utils.typing import MYPY_CHECK_RUNNING +from pip._internal.utils.unpacking import SUPPORTED_EXTENSIONS +from pip._internal.utils.urls import url_to_path + +if MYPY_CHECK_RUNNING: + from typing import ( + FrozenSet, Iterable, List, Optional, Set, Text, Tuple, Union, + ) + + from pip._vendor.packaging.tags import Tag + from pip._vendor.packaging.version import _BaseVersion + + from pip._internal.index.collector import LinkCollector + from pip._internal.models.search_scope import SearchScope + from pip._internal.req import InstallRequirement + from pip._internal.utils.hashes import Hashes + + BuildTag = Union[Tuple[()], Tuple[int, str]] + CandidateSortingKey = ( + Tuple[int, int, int, _BaseVersion, BuildTag, Optional[int]] + ) + + +__all__ = ['FormatControl', 'BestCandidateResult', 'PackageFinder'] + + +logger = logging.getLogger(__name__) + + +def _check_link_requires_python( + link, # type: Link + version_info, # type: Tuple[int, int, int] + ignore_requires_python=False, # type: bool +): + # type: (...) -> bool + """ + Return whether the given Python version is compatible with a link's + "Requires-Python" value. + + :param version_info: A 3-tuple of ints representing the Python + major-minor-micro version to check. + :param ignore_requires_python: Whether to ignore the "Requires-Python" + value if the given Python version isn't compatible. + """ + try: + is_compatible = check_requires_python( + link.requires_python, version_info=version_info, + ) + except specifiers.InvalidSpecifier: + logger.debug( + "Ignoring invalid Requires-Python (%r) for link: %s", + link.requires_python, link, + ) + else: + if not is_compatible: + version = '.'.join(map(str, version_info)) + if not ignore_requires_python: + logger.debug( + 'Link requires a different Python (%s not in: %r): %s', + version, link.requires_python, link, + ) + return False + + logger.debug( + 'Ignoring failed Requires-Python check (%s not in: %r) ' + 'for link: %s', + version, link.requires_python, link, + ) + + return True + + +class LinkEvaluator(object): + + """ + Responsible for evaluating links for a particular project. + """ + + _py_version_re = re.compile(r'-py([123]\.?[0-9]?)$') + + # Don't include an allow_yanked default value to make sure each call + # site considers whether yanked releases are allowed. This also causes + # that decision to be made explicit in the calling code, which helps + # people when reading the code. + def __init__( + self, + project_name, # type: str + canonical_name, # type: str + formats, # type: FrozenSet[str] + target_python, # type: TargetPython + allow_yanked, # type: bool + ignore_requires_python=None, # type: Optional[bool] + ): + # type: (...) -> None + """ + :param project_name: The user supplied package name. + :param canonical_name: The canonical package name. + :param formats: The formats allowed for this package. Should be a set + with 'binary' or 'source' or both in it. + :param target_python: The target Python interpreter to use when + evaluating link compatibility. This is used, for example, to + check wheel compatibility, as well as when checking the Python + version, e.g. the Python version embedded in a link filename + (or egg fragment) and against an HTML link's optional PEP 503 + "data-requires-python" attribute. + :param allow_yanked: Whether files marked as yanked (in the sense + of PEP 592) are permitted to be candidates for install. + :param ignore_requires_python: Whether to ignore incompatible + PEP 503 "data-requires-python" values in HTML links. Defaults + to False. + """ + if ignore_requires_python is None: + ignore_requires_python = False + + self._allow_yanked = allow_yanked + self._canonical_name = canonical_name + self._ignore_requires_python = ignore_requires_python + self._formats = formats + self._target_python = target_python + + self.project_name = project_name + + def evaluate_link(self, link): + # type: (Link) -> Tuple[bool, Optional[Text]] + """ + Determine whether a link is a candidate for installation. + + :return: A tuple (is_candidate, result), where `result` is (1) a + version string if `is_candidate` is True, and (2) if + `is_candidate` is False, an optional string to log the reason + the link fails to qualify. + """ + version = None + if link.is_yanked and not self._allow_yanked: + reason = link.yanked_reason or '' + # Mark this as a unicode string to prevent "UnicodeEncodeError: + # 'ascii' codec can't encode character" in Python 2 when + # the reason contains non-ascii characters. + return (False, u'yanked for reason: {}'.format(reason)) + + if link.egg_fragment: + egg_info = link.egg_fragment + ext = link.ext + else: + egg_info, ext = link.splitext() + if not ext: + return (False, 'not a file') + if ext not in SUPPORTED_EXTENSIONS: + return (False, 'unsupported archive format: %s' % ext) + if "binary" not in self._formats and ext == WHEEL_EXTENSION: + reason = 'No binaries permitted for %s' % self.project_name + return (False, reason) + if "macosx10" in link.path and ext == '.zip': + return (False, 'macosx10 one') + if ext == WHEEL_EXTENSION: + try: + wheel = Wheel(link.filename) + except InvalidWheelFilename: + return (False, 'invalid wheel filename') + if canonicalize_name(wheel.name) != self._canonical_name: + reason = 'wrong project name (not %s)' % self.project_name + return (False, reason) + + supported_tags = self._target_python.get_tags() + if not wheel.supported(supported_tags): + # Include the wheel's tags in the reason string to + # simplify troubleshooting compatibility issues. + file_tags = wheel.get_formatted_file_tags() + reason = ( + "none of the wheel's tags match: {}".format( + ', '.join(file_tags) + ) + ) + return (False, reason) + + version = wheel.version + + # This should be up by the self.ok_binary check, but see issue 2700. + if "source" not in self._formats and ext != WHEEL_EXTENSION: + return (False, 'No sources permitted for %s' % self.project_name) + + if not version: + version = _extract_version_from_fragment( + egg_info, self._canonical_name, + ) + if not version: + return ( + False, 'Missing project version for %s' % self.project_name, + ) + + match = self._py_version_re.search(version) + if match: + version = version[:match.start()] + py_version = match.group(1) + if py_version != self._target_python.py_version: + return (False, 'Python version is incorrect') + + supports_python = _check_link_requires_python( + link, version_info=self._target_python.py_version_info, + ignore_requires_python=self._ignore_requires_python, + ) + if not supports_python: + # Return None for the reason text to suppress calling + # _log_skipped_link(). + return (False, None) + + logger.debug('Found link %s, version: %s', link, version) + + return (True, version) + + +def filter_unallowed_hashes( + candidates, # type: List[InstallationCandidate] + hashes, # type: Hashes + project_name, # type: str +): + # type: (...) -> List[InstallationCandidate] + """ + Filter out candidates whose hashes aren't allowed, and return a new + list of candidates. + + If at least one candidate has an allowed hash, then all candidates with + either an allowed hash or no hash specified are returned. Otherwise, + the given candidates are returned. + + Including the candidates with no hash specified when there is a match + allows a warning to be logged if there is a more preferred candidate + with no hash specified. Returning all candidates in the case of no + matches lets pip report the hash of the candidate that would otherwise + have been installed (e.g. permitting the user to more easily update + their requirements file with the desired hash). + """ + if not hashes: + logger.debug( + 'Given no hashes to check %s links for project %r: ' + 'discarding no candidates', + len(candidates), + project_name, + ) + # Make sure we're not returning back the given value. + return list(candidates) + + matches_or_no_digest = [] + # Collect the non-matches for logging purposes. + non_matches = [] + match_count = 0 + for candidate in candidates: + link = candidate.link + if not link.has_hash: + pass + elif link.is_hash_allowed(hashes=hashes): + match_count += 1 + else: + non_matches.append(candidate) + continue + + matches_or_no_digest.append(candidate) + + if match_count: + filtered = matches_or_no_digest + else: + # Make sure we're not returning back the given value. + filtered = list(candidates) + + if len(filtered) == len(candidates): + discard_message = 'discarding no candidates' + else: + discard_message = 'discarding {} non-matches:\n {}'.format( + len(non_matches), + '\n '.join(str(candidate.link) for candidate in non_matches) + ) + + logger.debug( + 'Checked %s links for project %r against %s hashes ' + '(%s matches, %s no digest): %s', + len(candidates), + project_name, + hashes.digest_count, + match_count, + len(matches_or_no_digest) - match_count, + discard_message + ) + + return filtered + + +class CandidatePreferences(object): + + """ + Encapsulates some of the preferences for filtering and sorting + InstallationCandidate objects. + """ + + def __init__( + self, + prefer_binary=False, # type: bool + allow_all_prereleases=False, # type: bool + ): + # type: (...) -> None + """ + :param allow_all_prereleases: Whether to allow all pre-releases. + """ + self.allow_all_prereleases = allow_all_prereleases + self.prefer_binary = prefer_binary + + +class BestCandidateResult(object): + """A collection of candidates, returned by `PackageFinder.find_best_candidate`. + + This class is only intended to be instantiated by CandidateEvaluator's + `compute_best_candidate()` method. + """ + + def __init__( + self, + candidates, # type: List[InstallationCandidate] + applicable_candidates, # type: List[InstallationCandidate] + best_candidate, # type: Optional[InstallationCandidate] + ): + # type: (...) -> None + """ + :param candidates: A sequence of all available candidates found. + :param applicable_candidates: The applicable candidates. + :param best_candidate: The most preferred candidate found, or None + if no applicable candidates were found. + """ + assert set(applicable_candidates) <= set(candidates) + + if best_candidate is None: + assert not applicable_candidates + else: + assert best_candidate in applicable_candidates + + self._applicable_candidates = applicable_candidates + self._candidates = candidates + + self.best_candidate = best_candidate + + def iter_all(self): + # type: () -> Iterable[InstallationCandidate] + """Iterate through all candidates. + """ + return iter(self._candidates) + + def iter_applicable(self): + # type: () -> Iterable[InstallationCandidate] + """Iterate through the applicable candidates. + """ + return iter(self._applicable_candidates) + + +class CandidateEvaluator(object): + + """ + Responsible for filtering and sorting candidates for installation based + on what tags are valid. + """ + + @classmethod + def create( + cls, + project_name, # type: str + target_python=None, # type: Optional[TargetPython] + prefer_binary=False, # type: bool + allow_all_prereleases=False, # type: bool + specifier=None, # type: Optional[specifiers.BaseSpecifier] + hashes=None, # type: Optional[Hashes] + ): + # type: (...) -> CandidateEvaluator + """Create a CandidateEvaluator object. + + :param target_python: The target Python interpreter to use when + checking compatibility. If None (the default), a TargetPython + object will be constructed from the running Python. + :param specifier: An optional object implementing `filter` + (e.g. `packaging.specifiers.SpecifierSet`) to filter applicable + versions. + :param hashes: An optional collection of allowed hashes. + """ + if target_python is None: + target_python = TargetPython() + if specifier is None: + specifier = specifiers.SpecifierSet() + + supported_tags = target_python.get_tags() + + return cls( + project_name=project_name, + supported_tags=supported_tags, + specifier=specifier, + prefer_binary=prefer_binary, + allow_all_prereleases=allow_all_prereleases, + hashes=hashes, + ) + + def __init__( + self, + project_name, # type: str + supported_tags, # type: List[Tag] + specifier, # type: specifiers.BaseSpecifier + prefer_binary=False, # type: bool + allow_all_prereleases=False, # type: bool + hashes=None, # type: Optional[Hashes] + ): + # type: (...) -> None + """ + :param supported_tags: The PEP 425 tags supported by the target + Python in order of preference (most preferred first). + """ + self._allow_all_prereleases = allow_all_prereleases + self._hashes = hashes + self._prefer_binary = prefer_binary + self._project_name = project_name + self._specifier = specifier + self._supported_tags = supported_tags + + def get_applicable_candidates( + self, + candidates, # type: List[InstallationCandidate] + ): + # type: (...) -> List[InstallationCandidate] + """ + Return the applicable candidates from a list of candidates. + """ + # Using None infers from the specifier instead. + allow_prereleases = self._allow_all_prereleases or None + specifier = self._specifier + versions = { + str(v) for v in specifier.filter( + # We turn the version object into a str here because otherwise + # when we're debundled but setuptools isn't, Python will see + # packaging.version.Version and + # pkg_resources._vendor.packaging.version.Version as different + # types. This way we'll use a str as a common data interchange + # format. If we stop using the pkg_resources provided specifier + # and start using our own, we can drop the cast to str(). + (str(c.version) for c in candidates), + prereleases=allow_prereleases, + ) + } + + # Again, converting version to str to deal with debundling. + applicable_candidates = [ + c for c in candidates if str(c.version) in versions + ] + + filtered_applicable_candidates = filter_unallowed_hashes( + candidates=applicable_candidates, + hashes=self._hashes, + project_name=self._project_name, + ) + + return sorted(filtered_applicable_candidates, key=self._sort_key) + + def _sort_key(self, candidate): + # type: (InstallationCandidate) -> CandidateSortingKey + """ + Function to pass as the `key` argument to a call to sorted() to sort + InstallationCandidates by preference. + + Returns a tuple such that tuples sorting as greater using Python's + default comparison operator are more preferred. + + The preference is as follows: + + First and foremost, candidates with allowed (matching) hashes are + always preferred over candidates without matching hashes. This is + because e.g. if the only candidate with an allowed hash is yanked, + we still want to use that candidate. + + Second, excepting hash considerations, candidates that have been + yanked (in the sense of PEP 592) are always less preferred than + candidates that haven't been yanked. Then: + + If not finding wheels, they are sorted by version only. + If finding wheels, then the sort order is by version, then: + 1. existing installs + 2. wheels ordered via Wheel.support_index_min(self._supported_tags) + 3. source archives + If prefer_binary was set, then all wheels are sorted above sources. + + Note: it was considered to embed this logic into the Link + comparison operators, but then different sdist links + with the same version, would have to be considered equal + """ + valid_tags = self._supported_tags + support_num = len(valid_tags) + build_tag = () # type: BuildTag + binary_preference = 0 + link = candidate.link + if link.is_wheel: + # can raise InvalidWheelFilename + wheel = Wheel(link.filename) + if not wheel.supported(valid_tags): + raise UnsupportedWheel( + "%s is not a supported wheel for this platform. It " + "can't be sorted." % wheel.filename + ) + if self._prefer_binary: + binary_preference = 1 + pri = -(wheel.support_index_min(valid_tags)) + if wheel.build_tag is not None: + match = re.match(r'^(\d+)(.*)$', wheel.build_tag) + build_tag_groups = match.groups() + build_tag = (int(build_tag_groups[0]), build_tag_groups[1]) + else: # sdist + pri = -(support_num) + has_allowed_hash = int(link.is_hash_allowed(self._hashes)) + yank_value = -1 * int(link.is_yanked) # -1 for yanked. + return ( + has_allowed_hash, yank_value, binary_preference, candidate.version, + build_tag, pri, + ) + + def sort_best_candidate( + self, + candidates, # type: List[InstallationCandidate] + ): + # type: (...) -> Optional[InstallationCandidate] + """ + Return the best candidate per the instance's sort order, or None if + no candidate is acceptable. + """ + if not candidates: + return None + + best_candidate = max(candidates, key=self._sort_key) + + # Log a warning per PEP 592 if necessary before returning. + link = best_candidate.link + if link.is_yanked: + reason = link.yanked_reason or '' + msg = ( + # Mark this as a unicode string to prevent + # "UnicodeEncodeError: 'ascii' codec can't encode character" + # in Python 2 when the reason contains non-ascii characters. + u'The candidate selected for download or install is a ' + 'yanked version: {candidate}\n' + 'Reason for being yanked: {reason}' + ).format(candidate=best_candidate, reason=reason) + logger.warning(msg) + + return best_candidate + + def compute_best_candidate( + self, + candidates, # type: List[InstallationCandidate] + ): + # type: (...) -> BestCandidateResult + """ + Compute and return a `BestCandidateResult` instance. + """ + applicable_candidates = self.get_applicable_candidates(candidates) + + best_candidate = self.sort_best_candidate(applicable_candidates) + + return BestCandidateResult( + candidates, + applicable_candidates=applicable_candidates, + best_candidate=best_candidate, + ) + + +class PackageFinder(object): + """This finds packages. + + This is meant to match easy_install's technique for looking for + packages, by reading pages and looking for appropriate links. + """ + + def __init__( + self, + link_collector, # type: LinkCollector + target_python, # type: TargetPython + allow_yanked, # type: bool + format_control=None, # type: Optional[FormatControl] + candidate_prefs=None, # type: CandidatePreferences + ignore_requires_python=None, # type: Optional[bool] + ): + # type: (...) -> None + """ + This constructor is primarily meant to be used by the create() class + method and from tests. + + :param format_control: A FormatControl object, used to control + the selection of source packages / binary packages when consulting + the index and links. + :param candidate_prefs: Options to use when creating a + CandidateEvaluator object. + """ + if candidate_prefs is None: + candidate_prefs = CandidatePreferences() + + format_control = format_control or FormatControl(set(), set()) + + self._allow_yanked = allow_yanked + self._candidate_prefs = candidate_prefs + self._ignore_requires_python = ignore_requires_python + self._link_collector = link_collector + self._target_python = target_python + + self.format_control = format_control + + # These are boring links that have already been logged somehow. + self._logged_links = set() # type: Set[Link] + + # Don't include an allow_yanked default value to make sure each call + # site considers whether yanked releases are allowed. This also causes + # that decision to be made explicit in the calling code, which helps + # people when reading the code. + @classmethod + def create( + cls, + link_collector, # type: LinkCollector + selection_prefs, # type: SelectionPreferences + target_python=None, # type: Optional[TargetPython] + ): + # type: (...) -> PackageFinder + """Create a PackageFinder. + + :param selection_prefs: The candidate selection preferences, as a + SelectionPreferences object. + :param target_python: The target Python interpreter to use when + checking compatibility. If None (the default), a TargetPython + object will be constructed from the running Python. + """ + if target_python is None: + target_python = TargetPython() + + candidate_prefs = CandidatePreferences( + prefer_binary=selection_prefs.prefer_binary, + allow_all_prereleases=selection_prefs.allow_all_prereleases, + ) + + return cls( + candidate_prefs=candidate_prefs, + link_collector=link_collector, + target_python=target_python, + allow_yanked=selection_prefs.allow_yanked, + format_control=selection_prefs.format_control, + ignore_requires_python=selection_prefs.ignore_requires_python, + ) + + @property + def search_scope(self): + # type: () -> SearchScope + return self._link_collector.search_scope + + @search_scope.setter + def search_scope(self, search_scope): + # type: (SearchScope) -> None + self._link_collector.search_scope = search_scope + + @property + def find_links(self): + # type: () -> List[str] + return self._link_collector.find_links + + @property + def index_urls(self): + # type: () -> List[str] + return self.search_scope.index_urls + + @property + def trusted_hosts(self): + # type: () -> Iterable[str] + for host_port in self._link_collector.session.pip_trusted_origins: + yield build_netloc(*host_port) + + @property + def allow_all_prereleases(self): + # type: () -> bool + return self._candidate_prefs.allow_all_prereleases + + def set_allow_all_prereleases(self): + # type: () -> None + self._candidate_prefs.allow_all_prereleases = True + + def make_link_evaluator(self, project_name): + # type: (str) -> LinkEvaluator + canonical_name = canonicalize_name(project_name) + formats = self.format_control.get_allowed_formats(canonical_name) + + return LinkEvaluator( + project_name=project_name, + canonical_name=canonical_name, + formats=formats, + target_python=self._target_python, + allow_yanked=self._allow_yanked, + ignore_requires_python=self._ignore_requires_python, + ) + + def _sort_links(self, links): + # type: (Iterable[Link]) -> List[Link] + """ + Returns elements of links in order, non-egg links first, egg links + second, while eliminating duplicates + """ + eggs, no_eggs = [], [] + seen = set() # type: Set[Link] + for link in links: + if link not in seen: + seen.add(link) + if link.egg_fragment: + eggs.append(link) + else: + no_eggs.append(link) + return no_eggs + eggs + + def _log_skipped_link(self, link, reason): + # type: (Link, Text) -> None + if link not in self._logged_links: + # Mark this as a unicode string to prevent "UnicodeEncodeError: + # 'ascii' codec can't encode character" in Python 2 when + # the reason contains non-ascii characters. + # Also, put the link at the end so the reason is more visible + # and because the link string is usually very long. + logger.debug(u'Skipping link: %s: %s', reason, link) + self._logged_links.add(link) + + def get_install_candidate(self, link_evaluator, link): + # type: (LinkEvaluator, Link) -> Optional[InstallationCandidate] + """ + If the link is a candidate for install, convert it to an + InstallationCandidate and return it. Otherwise, return None. + """ + is_candidate, result = link_evaluator.evaluate_link(link) + if not is_candidate: + if result: + self._log_skipped_link(link, reason=result) + return None + + return InstallationCandidate( + name=link_evaluator.project_name, + link=link, + # Convert the Text result to str since InstallationCandidate + # accepts str. + version=str(result), + ) + + def evaluate_links(self, link_evaluator, links): + # type: (LinkEvaluator, Iterable[Link]) -> List[InstallationCandidate] + """ + Convert links that are candidates to InstallationCandidate objects. + """ + candidates = [] + for link in self._sort_links(links): + candidate = self.get_install_candidate(link_evaluator, link) + if candidate is not None: + candidates.append(candidate) + + return candidates + + def process_project_url(self, project_url, link_evaluator): + # type: (Link, LinkEvaluator) -> List[InstallationCandidate] + logger.debug( + 'Fetching project page and analyzing links: %s', project_url, + ) + html_page = self._link_collector.fetch_page(project_url) + if html_page is None: + return [] + + page_links = list(parse_links(html_page)) + + with indent_log(): + package_links = self.evaluate_links( + link_evaluator, + links=page_links, + ) + + return package_links + + def find_all_candidates(self, project_name): + # type: (str) -> List[InstallationCandidate] + """Find all available InstallationCandidate for project_name + + This checks index_urls and find_links. + All versions found are returned as an InstallationCandidate list. + + See LinkEvaluator.evaluate_link() for details on which files + are accepted. + """ + collected_links = self._link_collector.collect_links(project_name) + + link_evaluator = self.make_link_evaluator(project_name) + + find_links_versions = self.evaluate_links( + link_evaluator, + links=collected_links.find_links, + ) + + page_versions = [] + for project_url in collected_links.project_urls: + package_links = self.process_project_url( + project_url, link_evaluator=link_evaluator, + ) + page_versions.extend(package_links) + + file_versions = self.evaluate_links( + link_evaluator, + links=collected_links.files, + ) + if file_versions: + file_versions.sort(reverse=True) + logger.debug( + 'Local files found: %s', + ', '.join([ + url_to_path(candidate.link.url) + for candidate in file_versions + ]) + ) + + # This is an intentional priority ordering + return file_versions + find_links_versions + page_versions + + def make_candidate_evaluator( + self, + project_name, # type: str + specifier=None, # type: Optional[specifiers.BaseSpecifier] + hashes=None, # type: Optional[Hashes] + ): + # type: (...) -> CandidateEvaluator + """Create a CandidateEvaluator object to use. + """ + candidate_prefs = self._candidate_prefs + return CandidateEvaluator.create( + project_name=project_name, + target_python=self._target_python, + prefer_binary=candidate_prefs.prefer_binary, + allow_all_prereleases=candidate_prefs.allow_all_prereleases, + specifier=specifier, + hashes=hashes, + ) + + def find_best_candidate( + self, + project_name, # type: str + specifier=None, # type: Optional[specifiers.BaseSpecifier] + hashes=None, # type: Optional[Hashes] + ): + # type: (...) -> BestCandidateResult + """Find matches for the given project and specifier. + + :param specifier: An optional object implementing `filter` + (e.g. `packaging.specifiers.SpecifierSet`) to filter applicable + versions. + + :return: A `BestCandidateResult` instance. + """ + candidates = self.find_all_candidates(project_name) + candidate_evaluator = self.make_candidate_evaluator( + project_name=project_name, + specifier=specifier, + hashes=hashes, + ) + return candidate_evaluator.compute_best_candidate(candidates) + + def find_requirement(self, req, upgrade): + # type: (InstallRequirement, bool) -> Optional[Link] + """Try to find a Link matching req + + Expects req, an InstallRequirement and upgrade, a boolean + Returns a Link if found, + Raises DistributionNotFound or BestVersionAlreadyInstalled otherwise + """ + hashes = req.hashes(trust_internet=False) + best_candidate_result = self.find_best_candidate( + req.name, specifier=req.specifier, hashes=hashes, + ) + best_candidate = best_candidate_result.best_candidate + + installed_version = None # type: Optional[_BaseVersion] + if req.satisfied_by is not None: + installed_version = parse_version(req.satisfied_by.version) + + def _format_versions(cand_iter): + # type: (Iterable[InstallationCandidate]) -> str + # This repeated parse_version and str() conversion is needed to + # handle different vendoring sources from pip and pkg_resources. + # If we stop using the pkg_resources provided specifier and start + # using our own, we can drop the cast to str(). + return ", ".join(sorted( + {str(c.version) for c in cand_iter}, + key=parse_version, + )) or "none" + + if installed_version is None and best_candidate is None: + logger.critical( + 'Could not find a version that satisfies the requirement %s ' + '(from versions: %s)', + req, + _format_versions(best_candidate_result.iter_all()), + ) + + raise DistributionNotFound( + 'No matching distribution found for %s' % req + ) + + best_installed = False + if installed_version and ( + best_candidate is None or + best_candidate.version <= installed_version): + best_installed = True + + if not upgrade and installed_version is not None: + if best_installed: + logger.debug( + 'Existing installed version (%s) is most up-to-date and ' + 'satisfies requirement', + installed_version, + ) + else: + logger.debug( + 'Existing installed version (%s) satisfies requirement ' + '(most up-to-date version is %s)', + installed_version, + best_candidate.version, + ) + return None + + if best_installed: + # We have an existing version, and its the best version + logger.debug( + 'Installed version (%s) is most up-to-date (past versions: ' + '%s)', + installed_version, + _format_versions(best_candidate_result.iter_applicable()), + ) + raise BestVersionAlreadyInstalled + + logger.debug( + 'Using version %s (newest of versions: %s)', + best_candidate.version, + _format_versions(best_candidate_result.iter_applicable()), + ) + return best_candidate.link + + +def _find_name_version_sep(fragment, canonical_name): + # type: (str, str) -> int + """Find the separator's index based on the package's canonical name. + + :param fragment: A + filename "fragment" (stem) or + egg fragment. + :param canonical_name: The package's canonical name. + + This function is needed since the canonicalized name does not necessarily + have the same length as the egg info's name part. An example:: + + >>> fragment = 'foo__bar-1.0' + >>> canonical_name = 'foo-bar' + >>> _find_name_version_sep(fragment, canonical_name) + 8 + """ + # Project name and version must be separated by one single dash. Find all + # occurrences of dashes; if the string in front of it matches the canonical + # name, this is the one separating the name and version parts. + for i, c in enumerate(fragment): + if c != "-": + continue + if canonicalize_name(fragment[:i]) == canonical_name: + return i + raise ValueError("{} does not match {}".format(fragment, canonical_name)) + + +def _extract_version_from_fragment(fragment, canonical_name): + # type: (str, str) -> Optional[str] + """Parse the version string from a + filename + "fragment" (stem) or egg fragment. + + :param fragment: The string to parse. E.g. foo-2.1 + :param canonical_name: The canonicalized name of the package this + belongs to. + """ + try: + version_start = _find_name_version_sep(fragment, canonical_name) + 1 + except ValueError: + return None + version = fragment[version_start:] + if not version: + return None + return version diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/index/package_finder.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/index/package_finder.pyc new file mode 100644 index 0000000000000000000000000000000000000000..aad5cef92992c46fcf550567de940bb1ec7452c2 GIT binary patch literal 31997 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 V None + """ + Check whether the given Python version is compatible with a distribution's + "Requires-Python" value. + + :param version_info: A 3-tuple of ints representing the Python + major-minor-micro version to check. + :param ignore_requires_python: Whether to ignore the "Requires-Python" + value if the given Python version isn't compatible. + + :raises UnsupportedPythonVersion: When the given Python version isn't + compatible. + """ + requires_python = get_requires_python(dist) + try: + is_compatible = check_requires_python( + requires_python, version_info=version_info, + ) + except specifiers.InvalidSpecifier as exc: + logger.warning( + "Package %r has an invalid Requires-Python: %s", + dist.project_name, exc, + ) + return + + if is_compatible: + return + + version = '.'.join(map(str, version_info)) + if ignore_requires_python: + logger.debug( + 'Ignoring failed Requires-Python check for package %r: ' + '%s not in %r', + dist.project_name, version, requires_python, + ) + return + + raise UnsupportedPythonVersion( + 'Package {!r} requires a different Python: {} not in {!r}'.format( + dist.project_name, version, requires_python, + )) + + +class Resolver(object): + """Resolves which packages need to be installed/uninstalled to perform \ + the requested operation without breaking the requirements of any package. + """ + + _allowed_strategies = {"eager", "only-if-needed", "to-satisfy-only"} + + def __init__( + self, + preparer, # type: RequirementPreparer + finder, # type: PackageFinder + make_install_req, # type: InstallRequirementProvider + use_user_site, # type: bool + ignore_dependencies, # type: bool + ignore_installed, # type: bool + ignore_requires_python, # type: bool + force_reinstall, # type: bool + upgrade_strategy, # type: str + py_version_info=None, # type: Optional[Tuple[int, ...]] + ): + # type: (...) -> None + super(Resolver, self).__init__() + assert upgrade_strategy in self._allowed_strategies + + if py_version_info is None: + py_version_info = sys.version_info[:3] + else: + py_version_info = normalize_version_info(py_version_info) + + self._py_version_info = py_version_info + + self.preparer = preparer + self.finder = finder + + self.upgrade_strategy = upgrade_strategy + self.force_reinstall = force_reinstall + self.ignore_dependencies = ignore_dependencies + self.ignore_installed = ignore_installed + self.ignore_requires_python = ignore_requires_python + self.use_user_site = use_user_site + self._make_install_req = make_install_req + + self._discovered_dependencies = \ + defaultdict(list) # type: DiscoveredDependencies + + def resolve(self, requirement_set): + # type: (RequirementSet) -> None + """Resolve what operations need to be done + + As a side-effect of this method, the packages (and their dependencies) + are downloaded, unpacked and prepared for installation. This + preparation is done by ``pip.operations.prepare``. + + Once PyPI has static dependency metadata available, it would be + possible to move the preparation to become a step separated from + dependency resolution. + """ + # If any top-level requirement has a hash specified, enter + # hash-checking mode, which requires hashes from all. + root_reqs = ( + requirement_set.unnamed_requirements + + list(requirement_set.requirements.values()) + ) + + # Actually prepare the files, and collect any exceptions. Most hash + # exceptions cannot be checked ahead of time, because + # req.populate_link() needs to be called before we can make decisions + # based on link type. + discovered_reqs = [] # type: List[InstallRequirement] + hash_errors = HashErrors() + for req in chain(root_reqs, discovered_reqs): + try: + discovered_reqs.extend(self._resolve_one(requirement_set, req)) + except HashError as exc: + exc.req = req + hash_errors.append(exc) + + if hash_errors: + raise hash_errors + + def _is_upgrade_allowed(self, req): + # type: (InstallRequirement) -> bool + if self.upgrade_strategy == "to-satisfy-only": + return False + elif self.upgrade_strategy == "eager": + return True + else: + assert self.upgrade_strategy == "only-if-needed" + return req.is_direct + + def _set_req_to_reinstall(self, req): + # type: (InstallRequirement) -> None + """ + Set a requirement to be installed. + """ + # Don't uninstall the conflict if doing a user install and the + # conflict is not a user install. + if not self.use_user_site or dist_in_usersite(req.satisfied_by): + req.should_reinstall = True + req.satisfied_by = None + + def _check_skip_installed(self, req_to_install): + # type: (InstallRequirement) -> Optional[str] + """Check if req_to_install should be skipped. + + This will check if the req is installed, and whether we should upgrade + or reinstall it, taking into account all the relevant user options. + + After calling this req_to_install will only have satisfied_by set to + None if the req_to_install is to be upgraded/reinstalled etc. Any + other value will be a dist recording the current thing installed that + satisfies the requirement. + + Note that for vcs urls and the like we can't assess skipping in this + routine - we simply identify that we need to pull the thing down, + then later on it is pulled down and introspected to assess upgrade/ + reinstalls etc. + + :return: A text reason for why it was skipped, or None. + """ + if self.ignore_installed: + return None + + req_to_install.check_if_exists(self.use_user_site) + if not req_to_install.satisfied_by: + return None + + if self.force_reinstall: + self._set_req_to_reinstall(req_to_install) + return None + + if not self._is_upgrade_allowed(req_to_install): + if self.upgrade_strategy == "only-if-needed": + return 'already satisfied, skipping upgrade' + return 'already satisfied' + + # Check for the possibility of an upgrade. For link-based + # requirements we have to pull the tree down and inspect to assess + # the version #, so it's handled way down. + if not req_to_install.link: + try: + self.finder.find_requirement(req_to_install, upgrade=True) + except BestVersionAlreadyInstalled: + # Then the best version is installed. + return 'already up-to-date' + except DistributionNotFound: + # No distribution found, so we squash the error. It will + # be raised later when we re-try later to do the install. + # Why don't we just raise here? + pass + + self._set_req_to_reinstall(req_to_install) + return None + + def _get_abstract_dist_for(self, req): + # type: (InstallRequirement) -> AbstractDistribution + """Takes a InstallRequirement and returns a single AbstractDist \ + representing a prepared variant of the same. + """ + if req.editable: + return self.preparer.prepare_editable_requirement(req) + + # satisfied_by is only evaluated by calling _check_skip_installed, + # so it must be None here. + assert req.satisfied_by is None + skip_reason = self._check_skip_installed(req) + + if req.satisfied_by: + return self.preparer.prepare_installed_requirement( + req, skip_reason + ) + + upgrade_allowed = self._is_upgrade_allowed(req) + + # We eagerly populate the link, since that's our "legacy" behavior. + require_hashes = self.preparer.require_hashes + req.populate_link(self.finder, upgrade_allowed, require_hashes) + abstract_dist = self.preparer.prepare_linked_requirement(req) + + # NOTE + # The following portion is for determining if a certain package is + # going to be re-installed/upgraded or not and reporting to the user. + # This should probably get cleaned up in a future refactor. + + # req.req is only avail after unpack for URL + # pkgs repeat check_if_exists to uninstall-on-upgrade + # (#14) + if not self.ignore_installed: + req.check_if_exists(self.use_user_site) + + if req.satisfied_by: + should_modify = ( + self.upgrade_strategy != "to-satisfy-only" or + self.force_reinstall or + self.ignore_installed or + req.link.scheme == 'file' + ) + if should_modify: + self._set_req_to_reinstall(req) + else: + logger.info( + 'Requirement already satisfied (use --upgrade to upgrade):' + ' %s', req, + ) + + return abstract_dist + + def _resolve_one( + self, + requirement_set, # type: RequirementSet + req_to_install, # type: InstallRequirement + ): + # type: (...) -> List[InstallRequirement] + """Prepare a single requirements file. + + :return: A list of additional InstallRequirements to also install. + """ + # Tell user what we are doing for this requirement: + # obtain (editable), skipping, processing (local url), collecting + # (remote url or package name) + if req_to_install.constraint or req_to_install.prepared: + return [] + + req_to_install.prepared = True + + # register tmp src for cleanup in case something goes wrong + requirement_set.reqs_to_cleanup.append(req_to_install) + + abstract_dist = self._get_abstract_dist_for(req_to_install) + + # Parse and return dependencies + dist = abstract_dist.get_pkg_resources_distribution() + # This will raise UnsupportedPythonVersion if the given Python + # version isn't compatible with the distribution's Requires-Python. + _check_dist_requires_python( + dist, version_info=self._py_version_info, + ignore_requires_python=self.ignore_requires_python, + ) + + more_reqs = [] # type: List[InstallRequirement] + + def add_req(subreq, extras_requested): + sub_install_req = self._make_install_req( + str(subreq), + req_to_install, + ) + parent_req_name = req_to_install.name + to_scan_again, add_to_parent = requirement_set.add_requirement( + sub_install_req, + parent_req_name=parent_req_name, + extras_requested=extras_requested, + ) + if parent_req_name and add_to_parent: + self._discovered_dependencies[parent_req_name].append( + add_to_parent + ) + more_reqs.extend(to_scan_again) + + with indent_log(): + # We add req_to_install before its dependencies, so that we + # can refer to it when adding dependencies. + if not requirement_set.has_requirement(req_to_install.name): + # 'unnamed' requirements will get added here + # 'unnamed' requirements can only come from being directly + # provided by the user. + assert req_to_install.is_direct + requirement_set.add_requirement( + req_to_install, parent_req_name=None, + ) + + if not self.ignore_dependencies: + if req_to_install.extras: + logger.debug( + "Installing extra requirements: %r", + ','.join(req_to_install.extras), + ) + missing_requested = sorted( + set(req_to_install.extras) - set(dist.extras) + ) + for missing in missing_requested: + logger.warning( + '%s does not provide the extra \'%s\'', + dist, missing + ) + + available_requested = sorted( + set(dist.extras) & set(req_to_install.extras) + ) + for subreq in dist.requires(available_requested): + add_req(subreq, extras_requested=available_requested) + + if not req_to_install.editable and not req_to_install.satisfied_by: + # XXX: --no-install leads this to report 'Successfully + # downloaded' for only non-editable reqs, even though we took + # action on them. + requirement_set.successfully_downloaded.append(req_to_install) + + return more_reqs + + def get_installation_order(self, req_set): + # type: (RequirementSet) -> List[InstallRequirement] + """Create the installation order. + + The installation order is topological - requirements are installed + before the requiring thing. We break cycles at an arbitrary point, + and make no other guarantees. + """ + # The current implementation, which we may change at any point + # installs the user specified things in the order given, except when + # dependencies must come earlier to achieve topological order. + order = [] + ordered_reqs = set() # type: Set[InstallRequirement] + + def schedule(req): + if req.satisfied_by or req in ordered_reqs: + return + if req.constraint: + return + ordered_reqs.add(req) + for dep in self._discovered_dependencies[req.name]: + schedule(dep) + order.append(req) + + for install_req in req_set.requirements.values(): + schedule(install_req) + return order diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/legacy_resolve 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/legacy_resolve 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6ed1013db14b2bc4ab3b81adcde5e37326433b6a GIT binary patch literal 12197 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 UT5qt0?fQ;iK%J~DPS3CZH;;Zk!vFvP literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/legacy_resolve.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/legacy_resolve.py new file mode 100644 index 0000000..ca26912 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/legacy_resolve.py @@ -0,0 +1,430 @@ +"""Dependency Resolution + +The dependency resolution in pip is performed as follows: + +for top-level requirements: + a. only one spec allowed per project, regardless of conflicts or not. + otherwise a "double requirement" exception is raised + b. they override sub-dependency requirements. +for sub-dependencies + a. "first found, wins" (where the order is breadth first) +""" + +# The following comment should be removed at some point in the future. +# mypy: strict-optional=False +# mypy: disallow-untyped-defs=False + +import logging +import sys +from collections import defaultdict +from itertools import chain + +from pip._vendor.packaging import specifiers + +from pip._internal.exceptions import ( + BestVersionAlreadyInstalled, + DistributionNotFound, + HashError, + HashErrors, + UnsupportedPythonVersion, +) +from pip._internal.utils.logging import indent_log +from pip._internal.utils.misc import dist_in_usersite, normalize_version_info +from pip._internal.utils.packaging import ( + check_requires_python, + get_requires_python, +) +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Callable, DefaultDict, List, Optional, Set, Tuple + from pip._vendor import pkg_resources + + from pip._internal.distributions import AbstractDistribution + from pip._internal.index.package_finder import PackageFinder + from pip._internal.operations.prepare import RequirementPreparer + from pip._internal.req.req_install import InstallRequirement + from pip._internal.req.req_set import RequirementSet + + InstallRequirementProvider = Callable[ + [str, InstallRequirement], InstallRequirement + ] + DiscoveredDependencies = DefaultDict[str, List[InstallRequirement]] + +logger = logging.getLogger(__name__) + + +def _check_dist_requires_python( + dist, # type: pkg_resources.Distribution + version_info, # type: Tuple[int, int, int] + ignore_requires_python=False, # type: bool +): + # type: (...) -> None + """ + Check whether the given Python version is compatible with a distribution's + "Requires-Python" value. + + :param version_info: A 3-tuple of ints representing the Python + major-minor-micro version to check. + :param ignore_requires_python: Whether to ignore the "Requires-Python" + value if the given Python version isn't compatible. + + :raises UnsupportedPythonVersion: When the given Python version isn't + compatible. + """ + requires_python = get_requires_python(dist) + try: + is_compatible = check_requires_python( + requires_python, version_info=version_info, + ) + except specifiers.InvalidSpecifier as exc: + logger.warning( + "Package %r has an invalid Requires-Python: %s", + dist.project_name, exc, + ) + return + + if is_compatible: + return + + version = '.'.join(map(str, version_info)) + if ignore_requires_python: + logger.debug( + 'Ignoring failed Requires-Python check for package %r: ' + '%s not in %r', + dist.project_name, version, requires_python, + ) + return + + raise UnsupportedPythonVersion( + 'Package {!r} requires a different Python: {} not in {!r}'.format( + dist.project_name, version, requires_python, + )) + + +class Resolver(object): + """Resolves which packages need to be installed/uninstalled to perform \ + the requested operation without breaking the requirements of any package. + """ + + _allowed_strategies = {"eager", "only-if-needed", "to-satisfy-only"} + + def __init__( + self, + preparer, # type: RequirementPreparer + finder, # type: PackageFinder + make_install_req, # type: InstallRequirementProvider + use_user_site, # type: bool + ignore_dependencies, # type: bool + ignore_installed, # type: bool + ignore_requires_python, # type: bool + force_reinstall, # type: bool + upgrade_strategy, # type: str + py_version_info=None, # type: Optional[Tuple[int, ...]] + ): + # type: (...) -> None + super(Resolver, self).__init__() + assert upgrade_strategy in self._allowed_strategies + + if py_version_info is None: + py_version_info = sys.version_info[:3] + else: + py_version_info = normalize_version_info(py_version_info) + + self._py_version_info = py_version_info + + self.preparer = preparer + self.finder = finder + + self.upgrade_strategy = upgrade_strategy + self.force_reinstall = force_reinstall + self.ignore_dependencies = ignore_dependencies + self.ignore_installed = ignore_installed + self.ignore_requires_python = ignore_requires_python + self.use_user_site = use_user_site + self._make_install_req = make_install_req + + self._discovered_dependencies = \ + defaultdict(list) # type: DiscoveredDependencies + + def resolve(self, requirement_set): + # type: (RequirementSet) -> None + """Resolve what operations need to be done + + As a side-effect of this method, the packages (and their dependencies) + are downloaded, unpacked and prepared for installation. This + preparation is done by ``pip.operations.prepare``. + + Once PyPI has static dependency metadata available, it would be + possible to move the preparation to become a step separated from + dependency resolution. + """ + # If any top-level requirement has a hash specified, enter + # hash-checking mode, which requires hashes from all. + root_reqs = ( + requirement_set.unnamed_requirements + + list(requirement_set.requirements.values()) + ) + + # Actually prepare the files, and collect any exceptions. Most hash + # exceptions cannot be checked ahead of time, because + # req.populate_link() needs to be called before we can make decisions + # based on link type. + discovered_reqs = [] # type: List[InstallRequirement] + hash_errors = HashErrors() + for req in chain(root_reqs, discovered_reqs): + try: + discovered_reqs.extend(self._resolve_one(requirement_set, req)) + except HashError as exc: + exc.req = req + hash_errors.append(exc) + + if hash_errors: + raise hash_errors + + def _is_upgrade_allowed(self, req): + # type: (InstallRequirement) -> bool + if self.upgrade_strategy == "to-satisfy-only": + return False + elif self.upgrade_strategy == "eager": + return True + else: + assert self.upgrade_strategy == "only-if-needed" + return req.is_direct + + def _set_req_to_reinstall(self, req): + # type: (InstallRequirement) -> None + """ + Set a requirement to be installed. + """ + # Don't uninstall the conflict if doing a user install and the + # conflict is not a user install. + if not self.use_user_site or dist_in_usersite(req.satisfied_by): + req.should_reinstall = True + req.satisfied_by = None + + def _check_skip_installed(self, req_to_install): + # type: (InstallRequirement) -> Optional[str] + """Check if req_to_install should be skipped. + + This will check if the req is installed, and whether we should upgrade + or reinstall it, taking into account all the relevant user options. + + After calling this req_to_install will only have satisfied_by set to + None if the req_to_install is to be upgraded/reinstalled etc. Any + other value will be a dist recording the current thing installed that + satisfies the requirement. + + Note that for vcs urls and the like we can't assess skipping in this + routine - we simply identify that we need to pull the thing down, + then later on it is pulled down and introspected to assess upgrade/ + reinstalls etc. + + :return: A text reason for why it was skipped, or None. + """ + if self.ignore_installed: + return None + + req_to_install.check_if_exists(self.use_user_site) + if not req_to_install.satisfied_by: + return None + + if self.force_reinstall: + self._set_req_to_reinstall(req_to_install) + return None + + if not self._is_upgrade_allowed(req_to_install): + if self.upgrade_strategy == "only-if-needed": + return 'already satisfied, skipping upgrade' + return 'already satisfied' + + # Check for the possibility of an upgrade. For link-based + # requirements we have to pull the tree down and inspect to assess + # the version #, so it's handled way down. + if not req_to_install.link: + try: + self.finder.find_requirement(req_to_install, upgrade=True) + except BestVersionAlreadyInstalled: + # Then the best version is installed. + return 'already up-to-date' + except DistributionNotFound: + # No distribution found, so we squash the error. It will + # be raised later when we re-try later to do the install. + # Why don't we just raise here? + pass + + self._set_req_to_reinstall(req_to_install) + return None + + def _get_abstract_dist_for(self, req): + # type: (InstallRequirement) -> AbstractDistribution + """Takes a InstallRequirement and returns a single AbstractDist \ + representing a prepared variant of the same. + """ + if req.editable: + return self.preparer.prepare_editable_requirement(req) + + # satisfied_by is only evaluated by calling _check_skip_installed, + # so it must be None here. + assert req.satisfied_by is None + skip_reason = self._check_skip_installed(req) + + if req.satisfied_by: + return self.preparer.prepare_installed_requirement( + req, skip_reason + ) + + upgrade_allowed = self._is_upgrade_allowed(req) + + # We eagerly populate the link, since that's our "legacy" behavior. + require_hashes = self.preparer.require_hashes + req.populate_link(self.finder, upgrade_allowed, require_hashes) + abstract_dist = self.preparer.prepare_linked_requirement(req) + + # NOTE + # The following portion is for determining if a certain package is + # going to be re-installed/upgraded or not and reporting to the user. + # This should probably get cleaned up in a future refactor. + + # req.req is only avail after unpack for URL + # pkgs repeat check_if_exists to uninstall-on-upgrade + # (#14) + if not self.ignore_installed: + req.check_if_exists(self.use_user_site) + + if req.satisfied_by: + should_modify = ( + self.upgrade_strategy != "to-satisfy-only" or + self.force_reinstall or + self.ignore_installed or + req.link.scheme == 'file' + ) + if should_modify: + self._set_req_to_reinstall(req) + else: + logger.info( + 'Requirement already satisfied (use --upgrade to upgrade):' + ' %s', req, + ) + + return abstract_dist + + def _resolve_one( + self, + requirement_set, # type: RequirementSet + req_to_install, # type: InstallRequirement + ): + # type: (...) -> List[InstallRequirement] + """Prepare a single requirements file. + + :return: A list of additional InstallRequirements to also install. + """ + # Tell user what we are doing for this requirement: + # obtain (editable), skipping, processing (local url), collecting + # (remote url or package name) + if req_to_install.constraint or req_to_install.prepared: + return [] + + req_to_install.prepared = True + + # register tmp src for cleanup in case something goes wrong + requirement_set.reqs_to_cleanup.append(req_to_install) + + abstract_dist = self._get_abstract_dist_for(req_to_install) + + # Parse and return dependencies + dist = abstract_dist.get_pkg_resources_distribution() + # This will raise UnsupportedPythonVersion if the given Python + # version isn't compatible with the distribution's Requires-Python. + _check_dist_requires_python( + dist, version_info=self._py_version_info, + ignore_requires_python=self.ignore_requires_python, + ) + + more_reqs = [] # type: List[InstallRequirement] + + def add_req(subreq, extras_requested): + sub_install_req = self._make_install_req( + str(subreq), + req_to_install, + ) + parent_req_name = req_to_install.name + to_scan_again, add_to_parent = requirement_set.add_requirement( + sub_install_req, + parent_req_name=parent_req_name, + extras_requested=extras_requested, + ) + if parent_req_name and add_to_parent: + self._discovered_dependencies[parent_req_name].append( + add_to_parent + ) + more_reqs.extend(to_scan_again) + + with indent_log(): + # We add req_to_install before its dependencies, so that we + # can refer to it when adding dependencies. + if not requirement_set.has_requirement(req_to_install.name): + # 'unnamed' requirements will get added here + # 'unnamed' requirements can only come from being directly + # provided by the user. + assert req_to_install.is_direct + requirement_set.add_requirement( + req_to_install, parent_req_name=None, + ) + + if not self.ignore_dependencies: + if req_to_install.extras: + logger.debug( + "Installing extra requirements: %r", + ','.join(req_to_install.extras), + ) + missing_requested = sorted( + set(req_to_install.extras) - set(dist.extras) + ) + for missing in missing_requested: + logger.warning( + '%s does not provide the extra \'%s\'', + dist, missing + ) + + available_requested = sorted( + set(dist.extras) & set(req_to_install.extras) + ) + for subreq in dist.requires(available_requested): + add_req(subreq, extras_requested=available_requested) + + if not req_to_install.editable and not req_to_install.satisfied_by: + # XXX: --no-install leads this to report 'Successfully + # downloaded' for only non-editable reqs, even though we took + # action on them. + requirement_set.successfully_downloaded.append(req_to_install) + + return more_reqs + + def get_installation_order(self, req_set): + # type: (RequirementSet) -> List[InstallRequirement] + """Create the installation order. + + The installation order is topological - requirements are installed + before the requiring thing. We break cycles at an arbitrary point, + and make no other guarantees. + """ + # The current implementation, which we may change at any point + # installs the user specified things in the order given, except when + # dependencies must come earlier to achieve topological order. + order = [] + ordered_reqs = set() # type: Set[InstallRequirement] + + def schedule(req): + if req.satisfied_by or req in ordered_reqs: + return + if req.constraint: + return + ordered_reqs.add(req) + for dep in self._discovered_dependencies[req.name]: + schedule(dep) + order.append(req) + + for install_req in req_set.requirements.values(): + schedule(install_req) + return order diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/legacy_resolve.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/legacy_resolve.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0f985779f80d2fbd56aeb97e5ae4abe6bf9c25d1 GIT binary patch literal 12197 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 str + """ + Return the major-minor version of the current Python as a string, e.g. + "3.7" or "3.10". + """ + return '{}.{}'.format(*sys.version_info) + + +def get_src_prefix(): + # type: () -> str + if running_under_virtualenv(): + src_prefix = os.path.join(sys.prefix, 'src') + else: + # FIXME: keep src in cwd for now (it is not a temporary folder) + try: + src_prefix = os.path.join(os.getcwd(), 'src') + except OSError: + # In case the current working directory has been renamed or deleted + sys.exit( + "The folder you are executing pip from can no longer be found." + ) + + # under macOS + virtualenv sys.prefix is not properly resolved + # it is something like /path/to/python/bin/.. + return os.path.abspath(src_prefix) + + +# FIXME doesn't account for venv linked to global site-packages + +site_packages = sysconfig.get_path("purelib") # type: Optional[str] + +# This is because of a bug in PyPy's sysconfig module, see +# https://bitbucket.org/pypy/pypy/issues/2506/sysconfig-returns-incorrect-paths +# for more information. +if platform.python_implementation().lower() == "pypy": + site_packages = distutils_sysconfig.get_python_lib() +try: + # Use getusersitepackages if this is present, as it ensures that the + # value is initialised properly. + user_site = site.getusersitepackages() +except AttributeError: + user_site = site.USER_SITE + +if WINDOWS: + bin_py = os.path.join(sys.prefix, 'Scripts') + bin_user = os.path.join(user_site, 'Scripts') + # buildout uses 'bin' on Windows too? + if not os.path.exists(bin_py): + bin_py = os.path.join(sys.prefix, 'bin') + bin_user = os.path.join(user_site, 'bin') +else: + bin_py = os.path.join(sys.prefix, 'bin') + bin_user = os.path.join(user_site, 'bin') + + # Forcing to use /usr/local/bin for standard macOS framework installs + # Also log to ~/Library/Logs/ for use with the Console.app log viewer + if sys.platform[:6] == 'darwin' and sys.prefix[:16] == '/System/Library/': + bin_py = '/usr/local/bin' + + +def distutils_scheme( + dist_name, user=False, home=None, root=None, isolated=False, prefix=None +): + # type:(str, bool, str, str, bool, str) -> Dict[str, str] + """ + Return a distutils install scheme + """ + from distutils.dist import Distribution + + dist_args = {'name': dist_name} # type: Dict[str, Union[str, List[str]]] + if isolated: + dist_args["script_args"] = ["--no-user-cfg"] + + d = Distribution(dist_args) + d.parse_config_files() + obj = None # type: Optional[DistutilsCommand] + obj = d.get_command_obj('install', create=True) + assert obj is not None + i = cast(distutils_install_command, obj) + # NOTE: setting user or home has the side-effect of creating the home dir + # or user base for installations during finalize_options() + # ideally, we'd prefer a scheme class that has no side-effects. + assert not (user and prefix), "user={} prefix={}".format(user, prefix) + assert not (home and prefix), "home={} prefix={}".format(home, prefix) + i.user = user or i.user + if user or home: + i.prefix = "" + i.prefix = prefix or i.prefix + i.home = home or i.home + i.root = root or i.root + i.finalize_options() + + scheme = {} + for key in SCHEME_KEYS: + scheme[key] = getattr(i, 'install_' + key) + + # install_lib specified in setup.cfg should install *everything* + # into there (i.e. it takes precedence over both purelib and + # platlib). Note, i.install_lib is *always* set after + # finalize_options(); we only want to override here if the user + # has explicitly requested it hence going back to the config + if 'install_lib' in d.get_option_dict('install'): + scheme.update(dict(purelib=i.install_lib, platlib=i.install_lib)) + + if running_under_virtualenv(): + scheme['headers'] = os.path.join( + sys.prefix, + 'include', + 'site', + 'python{}'.format(get_major_minor_version()), + dist_name, + ) + + if root is not None: + path_no_drive = os.path.splitdrive( + os.path.abspath(scheme["headers"]))[1] + scheme["headers"] = os.path.join( + root, + path_no_drive[1:], + ) + + return scheme + + +def get_scheme( + dist_name, # type: str + user=False, # type: bool + home=None, # type: Optional[str] + root=None, # type: Optional[str] + isolated=False, # type: bool + prefix=None, # type: Optional[str] +): + # type: (...) -> Scheme + """ + Get the "scheme" corresponding to the input parameters. The distutils + documentation provides the context for the available schemes: + https://docs.python.org/3/install/index.html#alternate-installation + + :param dist_name: the name of the package to retrieve the scheme for, used + in the headers scheme path + :param user: indicates to use the "user" scheme + :param home: indicates to use the "home" scheme and provides the base + directory for the same + :param root: root under which other directories are re-based + :param isolated: equivalent to --no-user-cfg, i.e. do not consider + ~/.pydistutils.cfg (posix) or ~/pydistutils.cfg (non-posix) for + scheme paths + :param prefix: indicates to use the "prefix" scheme and provides the + base directory for the same + """ + scheme = distutils_scheme( + dist_name, user, home, root, isolated, prefix + ) + return Scheme( + platlib=scheme["platlib"], + purelib=scheme["purelib"], + headers=scheme["headers"], + scripts=scheme["scripts"], + data=scheme["data"], + ) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/locations 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/locations 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7bd85fb039857034b278f71e9a2c4058685ba8c0 GIT binary patch literal 5698 zcmc&&OLH5?5$?r{;>)Bc@g?f9p)DJ-ML;rb%VFe1Dv`ETmTA>eD%q$cTTASaTyS67 z8Sr6|K14pI@)uIhF*)WB6`IpvnGdjOD(tsHGa8uaw^^z`(5Q2zJ$$lw3= z(Qn(-`>Wym-aR7yml9D()WYacSfbdWq(rR}IXo{@T&7l8)&N&d!BuKi`}i8QYJGT! zT0?#K9JS5~T%mZF5==)d-zvqUl#Eep%+6~vAE(x9c0NS$1SONynzZwC6rZPLids{4 zK1}fiN-k3CqMeUWJWa_AwPq-prPi#)j#4~F$vm~@$x$;@T$4MEQGAJ#1!^r&a+z9} zDY-(eE0kQN)>XT2oZ@SgxYYU?IVq8vqRt|PuhC0~TCY<$LEl1QZ%{ZXz;#mRsPiU; z=Y`-cQdR2I=_OI;29Mzs?Utz6bJPfR-eyeeEdtxaNm4cHyd#*K^enwZ6}3dWBUJp! z!5=R+sCAQ4hrU!7saPnfGIg5NxkYM-I=3mjKrdmdcj*LwvyWWvBi|$SE(@mjzqkG3 z4{f)|WqQ6}N`KvFGC1-7Zegk56Vv2|GjeAfX$74HYOaS0VUTxO0qT8rF#PKQm*`tK z)t&xyfL{>&hfKLqzYNFKcQ8E4+JT9(RJ;2-s!;B}a^o!9b+@v@ZD;9Lw5@NtQL0T4 z$F4Trt*x7`GVKUksqSDf6BvR`oyA?F{3yw@!mQhsVXWvwZP{4VC{P;@K3)5K&Hrre zs||}B0chgW6{$5m=ZV;<&H@g;vO)q{Ju|0Dq9fDX80EYa_AHIZ2>tcfcj^##wH*B}?sYQK;0oj}Ofbuz_|17^J{uV3EdlLs%^?H|{LD z*bLzItwoE}Ecc7!#*5=Ri)mQBux}C=5gR5lV?g!J^P_Ytt7A?lgNFFj%!_C*Fsiv1 z6wR$Hh5~hSJ8y>1JKJBsw{`p0=I!Of!#&e6#@t!n-?@dq?X>x%3B4@!?7MV-bxl8h z$|(7d!;C7R+h*K%#72H-W^vrMGQOz87j^hO@fNY9S-VsdWwQ_R{Y2RY0RF#(o!{u` zyHjSfazHs8r^iI;JvzL0Y87Uw@sv-B!e%#h@eHX(;F17zS5Cjf`@h&5$rn2vCm z1B0?&*R3{-w*CmSC$Oefl6#nS-2kzr4ph5qU@#Zgcejcxaoa)arWrym-ByLW$y?x= zjrs^UcpN{5ubOFb$UHDR0(7z{_0IDun=&udR&*dBbk^PvAv&CPW34CZY(;53U$ic=wk>wqhj01;C!_Gpv>|ArkOEqV-DwoK+g^Ht1tCB-_ z3txAmT|~LjVuH;mjaV_Fk}xRtF=uYVvbh0wS4s0xv{?kjVN>(*&8{xQ1LGz(w|O(8 z`CI(zJy?MYISM;b;?Qx8oXBD8Bb$D3JVZwoDwZj%&^E9r+*P`Z)O=Lq2^{43937#$ z!GQ?1@gg0=b1<(^h=M;vNGvZMhmpgC)!kvzdo2C$9Kz+0gMeq>9ibzKvOmyKmB#d+ znIZ%iY{Q{oA^wRyMO89kn%k{W@tuS9&J>vo6k5g?xsPCpP)MmHQ3-QT^Kr$kl9{2- zEOq9{%(KksG|*$9uYjh^C8og!4%{lAi@xG6q_=86*}OnKE|+^m^Vo!cXcp#=$NP(O zeDR}k#$L16V0O=Ml~`?~$P3f(AkFT4I?)Gih|+>g5bKlDD&S7fk%oi(}V@JRrgD zWQjV1=#aPQ@CAHnBcV+szuJPr&;qb=g?xEm^wQb#zGSs*}BuU;Gr#f}QN zY#?@!FY8yB2?yFh9}R}QHyF<)Jr4@4eA__yTT!fRB3#c>C4C2{jkc}8ezw_>gP#;# zB~0&Y+?KT_iO^$N;1H({L-CQmrq9CTBq2OlPad}mGGqM+P-K~b>!Nx_C|S|h%Fm=V z&>m-LxgaD$SuF|q~483PB&nXEmYMIxmZ zZxnk}D zD%YLs_#VS&N1PD}s%78!&r~(L?2T+yfUs83W&VHePfq0eh z|3n$-_ZIEt7SV>I@zZ&hhTJ-sOje^b?;02J0n?*{(hZjzj)7)`Q<$~830g*J@DcOb zUKA>An@Qvnbzr2;=e{%83!*sKjFoFo)hohb$CzBNG@Ib0xi3Q?H?m^8x!ml94!%Qm z(AY6a{5l$BZsm;XH+ypKh%j0aNku;K))kS0{kGrU=0STm*j9YMLLuR)J;0F6%EN-* zbP<-Ju;Z>dvK@0Tqx9+6O;4Z5k-P$01REzoW)GBbUgWjK-p12=INo2ihu8XhTr~b? z)w&sIH4qTb71cIbaX8Sj#(hs8#Q9{!<FBv#b=ANkxc)vAN!woZZnuZ^B8g5Vw#QdfS%MKi;fl}hu^Grtv zH~1a#P4jz;X_hYa2w;@~pPr%E0Q&SLZLN8gKJDr&H9FwVS0AY42Q=z&k(H|CH8@T= za&0xVB?DPEkY|_oDHC#6TxS~ZS3I1}o!&jhar*bxF#L4Mjx)b>#*&Wzh?(t*FO{7+ zB(ag+r~Y%S$c=p;k?Q+WGJJoli+82+eGkhd^+kv>gffgI6@sfbKLx!dCgB#r<0>#H zEz+c*?>duo`%n6_)wIzo#Eo8RkeVo6i1$9TT)=>LPh;@pYb05yV%@NgBPNlP&Ju|P z9>4I=yZtW*S>%IpA&=AOD{0JOj_m1)$+X4kwKfA>EwWOEo<#&oW+ei1qM+yr|$Bh~r6DSsh`3=}{XCTrs z);3URWVrEE_9e*#BJ0M(Cu^rV73q^$O?W!_5Qx>wATyJ00?$v4ry1Mu;~>_`yA8<3 z;b(wO;!B_(yQ5%n@4^+kvHB(ZzWx$Jt;#*b$!F5RrzE2@1E}UKmM&B#%EQCM(-YM> hbPwh7B)STIrp`Ijr74UHB|w!oo#D#deeN*$^Iw~+U%>zX literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/locations.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/locations.py new file mode 100644 index 0000000..0c11553 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/locations.py @@ -0,0 +1,194 @@ +"""Locations where we look for configs, install stuff, etc""" + +# The following comment should be removed at some point in the future. +# mypy: strict-optional=False + +from __future__ import absolute_import + +import os +import os.path +import platform +import site +import sys +import sysconfig +from distutils import sysconfig as distutils_sysconfig +from distutils.command.install import SCHEME_KEYS # type: ignore +from distutils.command.install import install as distutils_install_command + +from pip._internal.models.scheme import Scheme +from pip._internal.utils import appdirs +from pip._internal.utils.compat import WINDOWS +from pip._internal.utils.typing import MYPY_CHECK_RUNNING, cast +from pip._internal.utils.virtualenv import running_under_virtualenv + +if MYPY_CHECK_RUNNING: + from typing import Dict, List, Optional, Union + + from distutils.cmd import Command as DistutilsCommand + + +# Application Directories +USER_CACHE_DIR = appdirs.user_cache_dir("pip") + + +def get_major_minor_version(): + # type: () -> str + """ + Return the major-minor version of the current Python as a string, e.g. + "3.7" or "3.10". + """ + return '{}.{}'.format(*sys.version_info) + + +def get_src_prefix(): + # type: () -> str + if running_under_virtualenv(): + src_prefix = os.path.join(sys.prefix, 'src') + else: + # FIXME: keep src in cwd for now (it is not a temporary folder) + try: + src_prefix = os.path.join(os.getcwd(), 'src') + except OSError: + # In case the current working directory has been renamed or deleted + sys.exit( + "The folder you are executing pip from can no longer be found." + ) + + # under macOS + virtualenv sys.prefix is not properly resolved + # it is something like /path/to/python/bin/.. + return os.path.abspath(src_prefix) + + +# FIXME doesn't account for venv linked to global site-packages + +site_packages = sysconfig.get_path("purelib") # type: Optional[str] + +# This is because of a bug in PyPy's sysconfig module, see +# https://bitbucket.org/pypy/pypy/issues/2506/sysconfig-returns-incorrect-paths +# for more information. +if platform.python_implementation().lower() == "pypy": + site_packages = distutils_sysconfig.get_python_lib() +try: + # Use getusersitepackages if this is present, as it ensures that the + # value is initialised properly. + user_site = site.getusersitepackages() +except AttributeError: + user_site = site.USER_SITE + +if WINDOWS: + bin_py = os.path.join(sys.prefix, 'Scripts') + bin_user = os.path.join(user_site, 'Scripts') + # buildout uses 'bin' on Windows too? + if not os.path.exists(bin_py): + bin_py = os.path.join(sys.prefix, 'bin') + bin_user = os.path.join(user_site, 'bin') +else: + bin_py = os.path.join(sys.prefix, 'bin') + bin_user = os.path.join(user_site, 'bin') + + # Forcing to use /usr/local/bin for standard macOS framework installs + # Also log to ~/Library/Logs/ for use with the Console.app log viewer + if sys.platform[:6] == 'darwin' and sys.prefix[:16] == '/System/Library/': + bin_py = '/usr/local/bin' + + +def distutils_scheme( + dist_name, user=False, home=None, root=None, isolated=False, prefix=None +): + # type:(str, bool, str, str, bool, str) -> Dict[str, str] + """ + Return a distutils install scheme + """ + from distutils.dist import Distribution + + dist_args = {'name': dist_name} # type: Dict[str, Union[str, List[str]]] + if isolated: + dist_args["script_args"] = ["--no-user-cfg"] + + d = Distribution(dist_args) + d.parse_config_files() + obj = None # type: Optional[DistutilsCommand] + obj = d.get_command_obj('install', create=True) + assert obj is not None + i = cast(distutils_install_command, obj) + # NOTE: setting user or home has the side-effect of creating the home dir + # or user base for installations during finalize_options() + # ideally, we'd prefer a scheme class that has no side-effects. + assert not (user and prefix), "user={} prefix={}".format(user, prefix) + assert not (home and prefix), "home={} prefix={}".format(home, prefix) + i.user = user or i.user + if user or home: + i.prefix = "" + i.prefix = prefix or i.prefix + i.home = home or i.home + i.root = root or i.root + i.finalize_options() + + scheme = {} + for key in SCHEME_KEYS: + scheme[key] = getattr(i, 'install_' + key) + + # install_lib specified in setup.cfg should install *everything* + # into there (i.e. it takes precedence over both purelib and + # platlib). Note, i.install_lib is *always* set after + # finalize_options(); we only want to override here if the user + # has explicitly requested it hence going back to the config + if 'install_lib' in d.get_option_dict('install'): + scheme.update(dict(purelib=i.install_lib, platlib=i.install_lib)) + + if running_under_virtualenv(): + scheme['headers'] = os.path.join( + sys.prefix, + 'include', + 'site', + 'python{}'.format(get_major_minor_version()), + dist_name, + ) + + if root is not None: + path_no_drive = os.path.splitdrive( + os.path.abspath(scheme["headers"]))[1] + scheme["headers"] = os.path.join( + root, + path_no_drive[1:], + ) + + return scheme + + +def get_scheme( + dist_name, # type: str + user=False, # type: bool + home=None, # type: Optional[str] + root=None, # type: Optional[str] + isolated=False, # type: bool + prefix=None, # type: Optional[str] +): + # type: (...) -> Scheme + """ + Get the "scheme" corresponding to the input parameters. The distutils + documentation provides the context for the available schemes: + https://docs.python.org/3/install/index.html#alternate-installation + + :param dist_name: the name of the package to retrieve the scheme for, used + in the headers scheme path + :param user: indicates to use the "user" scheme + :param home: indicates to use the "home" scheme and provides the base + directory for the same + :param root: root under which other directories are re-based + :param isolated: equivalent to --no-user-cfg, i.e. do not consider + ~/.pydistutils.cfg (posix) or ~/pydistutils.cfg (non-posix) for + scheme paths + :param prefix: indicates to use the "prefix" scheme and provides the + base directory for the same + """ + scheme = distutils_scheme( + dist_name, user, home, root, isolated, prefix + ) + return Scheme( + platlib=scheme["platlib"], + purelib=scheme["purelib"], + headers=scheme["headers"], + scripts=scheme["scripts"], + data=scheme["data"], + ) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/locations.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/locations.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dbf55edbde5e2d3eaf7afb51763b491a53aae659 GIT binary patch literal 5698 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 gp int + """This is preserved for old console scripts that may still be referencing + it. + + For additional details, see https://github.com/pypa/pip/issues/7498. + """ + from pip._internal.utils.entrypoints import _wrapper + + return _wrapper(args) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/main 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/main 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e06ad4d8db94cb74433947757e41eab5506a6330 GIT binary patch literal 826 zcmcgq&2AGh5cXz6iXtIZ+~9(bInZ^hRw^L=sqGfZ)P_Ab*umL$CHn_xRMTipVNkC1O=@`I3cP;OcIfp zL`2nEJHmBDm5NC!s;-!HMdHb~D~eQnBi|nD9|kulhW$-4NJzum1nUAW8-0Z&`gIR+ovm6yj?_2~+m@ zPH?iYAZdkYz{Hg)y zEq__5N?V_WrX3dR8=RKuh>gw8XuwD0as8_nYyx$6%+A^Xts*9yFPnjGroy|@!xs(0@J>J$@ literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/main.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/main.py new file mode 100644 index 0000000..3208d5b --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/main.py @@ -0,0 +1,16 @@ +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Optional, List + + +def main(args=None): + # type: (Optional[List[str]]) -> int + """This is preserved for old console scripts that may still be referencing + it. + + For additional details, see https://github.com/pypa/pip/issues/7498. + """ + from pip._internal.utils.entrypoints import _wrapper + + return _wrapper(args) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/main.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/main.pyc new file mode 100644 index 0000000000000000000000000000000000000000..81914a7a1c635d68de103cded538162b6d55113b GIT binary patch literal 826 zcmcgq&2H2%5O$Jfi&jFaxWNS<_dw&8RxDINkyiW(2q=_8_rS`Vc(bk?$F*m-1eFs! z2k*i&@c=NBRP@4`k^N;n9?yI;ljPTp(dVC!KNaj!V*EbE9gYx6ToE&j)e)OTEK(8k zqO-=##H>!(EMfJ4%?2#8=sRF#!oH*Lkn|7ZYZycSMj1z_!A*p>C+|<@)0fYtujl#4 zEPIu`7*k5Pj_}TbZmcvgz{49IprB`TO?!$v+(tl3CFbu~eMMFm5xZdQTZ9P{^7(;q zywZW=a$W`HH>%{z#`DIMyl8A_jN+m2+Ckv3lE7=(@&MWxzEIq&rSi%a+Eycuq9Gl1 z%5w}M%To6&d8t5Z6Ylb$6kh?ja41BjVYObQMN0Db-9@~+wky%KU1>d>`ts$p6dv9u$^wp&a4{S^j6oPPGZzL$O zkzOpZc;$nroG8yut1k!3z1_v$e%o%~6aXgs=c`?m%8Fwmy`yaaY0S>O$^C4WcXd!L ze_4rIYMZ*Y8y4wXl$PkQt?f7)(-CM~|EdLAhuzJ|8HNP?nZ})WzXQd|8mn@;?JBy0 Z|5zJM=TY61YoneJxj=Nb<6(3w`2*bT)p!5^ literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/__init__ 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/__init__ 2.py new file mode 100644 index 0000000..7855226 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/__init__ 2.py @@ -0,0 +1,2 @@ +"""A package that contains models that represent entities. +""" diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/__init__ 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/__init__ 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cd2797a6906f10e9e66a72c4d5159b04b9aef4c6 GIT binary patch literal 278 zcmYL^!A=4(5Qd8!Fq`lWJ?;et0tpTq9iQpPYsY?vMKoZqx=&REN!i#J`Oq=P0|RGzf;NuDZ$ zE?s2A5HX=A$+2WH4YS9*eVTdQmGeKL|bb@sC9&W6G<3_K OF4%uKT(&zBNBjYVEKI%t literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/__init__.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/__init__.py new file mode 100644 index 0000000..7855226 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/__init__.py @@ -0,0 +1,2 @@ +"""A package that contains models that represent entities. +""" diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/__init__.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5bad0b2e9bcc5df7825b95f219187fafd027249c GIT binary patch literal 278 zcmYL^&rSj{5QmE#B%AOKJ?;gDe*q3^vY4;8FRl8EvYs${?ch2iC^nXq8is~?{OJSx Llf$QWN8*TI9D__H literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/candidate 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/candidate 2.py new file mode 100644 index 0000000..1dc1a57 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/candidate 2.py @@ -0,0 +1,36 @@ +from pip._vendor.packaging.version import parse as parse_version + +from pip._internal.utils.models import KeyBasedCompareMixin +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from pip._vendor.packaging.version import _BaseVersion + from pip._internal.models.link import Link + + +class InstallationCandidate(KeyBasedCompareMixin): + """Represents a potential "candidate" for installation. + """ + + def __init__(self, name, version, link): + # type: (str, str, Link) -> None + self.name = name + self.version = parse_version(version) # type: _BaseVersion + self.link = link + + super(InstallationCandidate, self).__init__( + key=(self.name, self.version, self.link), + defining_class=InstallationCandidate + ) + + def __repr__(self): + # type: () -> str + return "".format( + self.name, self.version, self.link, + ) + + def __str__(self): + # type: () -> str + return '{!r} candidate (version {} at {})'.format( + self.name, self.version, self.link, + ) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/candidate 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/candidate 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ac9cf193785071c57fa619f153e791f41895afac GIT binary patch literal 1953 zcmd5+O>fgc5FOj8+Z0Me0SORDE+YN)wh&rQ z;fHbM_wWPY%{ncJj|-Qw%D&9*%#LT@%&hlyZuZOPJFmJl86N)cVrmUY@N+058aUK( z$>Ft2nMZ>fb!yexqil)>K6QL@luzZhJyo-(rl~VsSxr$kLxVbX>g43`;*+XT&!J?R zJ`s(HwmY+w%+O|7$9L0j7@-5nOaY3x)T&yZ$MUHf-H)|OTEhV}>UsJ;%`5E!w9mIU zwq@(_!`4$NUbfp$+K(#TY3L-M+ft=Yhm#XE>^@8LU2_4#lU$oP%VGm{E6$TNiH$mD zhQqm!sh0qXsDtQ%E>na%bUfyUg&HNE6{bjRhWrJ63m{ZcDy?#(gE%OL22vVl!L{zu zm#zi9VHu=91<{-hFuLr5Cv(xl)LVcm|c!s?-i;PESVXAl<;b#v;_iwwm3f>+gJGgF9UbSRS&RhVZyr-~`H)+8=AF8`;9PXNTn;?>jy5S*Ab{iv!xh^{ zJdZt4>%yRItLOF~D=j=&EI(cke&Eu2MUIbyD2+jEex-*45S*lwCTfz>5;ZR6Wdx*| z7jpf7Cu$MrnTy~!Awf7Ptl;2d5F6lUk zQlb#|GG10ElVMj%TZy6py*LZ_k#8%VP!=iYF^SlgpsZ0?yf)6J?Q1y}iBZOo{EQ^Cz8_}Ma-esfm2 kY4S@XxGe1>^j|P&vwyqF_c~wGzB3KC;WW@X4d None + self.name = name + self.version = parse_version(version) # type: _BaseVersion + self.link = link + + super(InstallationCandidate, self).__init__( + key=(self.name, self.version, self.link), + defining_class=InstallationCandidate + ) + + def __repr__(self): + # type: () -> str + return "".format( + self.name, self.version, self.link, + ) + + def __str__(self): + # type: () -> str + return '{!r} candidate (version {} at {})'.format( + self.name, self.version, self.link, + ) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/candidate.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/candidate.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0102e0a09405982a597857f5859658e8d81f1371 GIT binary patch literal 1953 zcmd5+-*3|}5WXZ`wr&i{00|ICfu~G@h5-U00Ya+~OhAP^Kx!VaLgSWfX&Pd0P#90; zALDQ04}kBSZbSTd;e}cC*R$_@Ie&L&@7wa?hp+cu_h~jf{6E0d8j#}WP);;*D0a!= zwM)52qXxx|dhJm@M_S8JZ^R?9+aPNu^c2JdNcOHCa!zN;~5bH0oLQAuDR_3bfC9&wH}- z_+jUX6fe8ojqambcMLko=U%BwXXDw426mrj#kM&EVWZF{$@9cO-ARfxOB16GnBj2N zG4(1y5ygle=rTpPL+mj(EHo(ftT0DnGvqJmI{=}|N@-OX9V9_HHjuI;4=(rjzjQem zjH@8~DTwxBfYE0cJei9QrhWz3b7&7Y0!0v9n$}B~_B^}qk!dh{u$j8F<#Uvfw{Q>$ zGoVKU8#K(O%yImuYLFFKF_is0(K?*R7F-h*$w--H2sS-(x2Dyw zeqUy@oZ02b^-ifO!ID`3NC~e-N=uM+s8v1?tP+b1OMnow2K^3FR94w8auV$(RWumq zDZUvE%P4)fHT-yUuy*au+KtI%*K8SMZr^zS_8P{ph+afxR$iSEd-eM5TisajmYoR0 zsH#ZvXf#e$uA_r|w9AR$`<=klTt4JBofA&eU2)DjeJ%%{d`Fv<3lKo^jNzK?eV(Tt zsC8k`wbgU?kChgFx>S9>5**^{{hAyf2T>ZM#QaJR2Ou~}|C^{;N-Na3l;;tUW?snk z|DC8yIL}-J2MGznSz!gAJ_m^bu3CZwXXxls!yO@|Hee=zc)(1^d7Tl*%_ODa!j}?- zxRdj;KADdDQrb!sE$GEbz+t|v^q;zeo0;2GF93YkcbiL1zZ>$Fxd=dywec_%>9}f_ zNq;*T;vH$vk|5p-m*8j1ocqmL?WWBy hk>IklkI<1|&}RQ`o$vd6P5aKY+?LZq>$IFx-Vgfh(Aoe1 literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/format_control 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/format_control 2.py new file mode 100644 index 0000000..2e13727 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/format_control 2.py @@ -0,0 +1,84 @@ +# The following comment should be removed at some point in the future. +# mypy: strict-optional=False + +from pip._vendor.packaging.utils import canonicalize_name + +from pip._internal.exceptions import CommandError +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Optional, Set, FrozenSet + + +class FormatControl(object): + """Helper for managing formats from which a package can be installed. + """ + + def __init__(self, no_binary=None, only_binary=None): + # type: (Optional[Set[str]], Optional[Set[str]]) -> None + if no_binary is None: + no_binary = set() + if only_binary is None: + only_binary = set() + + self.no_binary = no_binary + self.only_binary = only_binary + + def __eq__(self, other): + # type: (object) -> bool + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + # type: (object) -> bool + return not self.__eq__(other) + + def __repr__(self): + # type: () -> str + return "{}({}, {})".format( + self.__class__.__name__, + self.no_binary, + self.only_binary + ) + + @staticmethod + def handle_mutual_excludes(value, target, other): + # type: (str, Optional[Set[str]], Optional[Set[str]]) -> None + if value.startswith('-'): + raise CommandError( + "--no-binary / --only-binary option requires 1 argument." + ) + new = value.split(',') + while ':all:' in new: + other.clear() + target.clear() + target.add(':all:') + del new[:new.index(':all:') + 1] + # Without a none, we want to discard everything as :all: covers it + if ':none:' not in new: + return + for name in new: + if name == ':none:': + target.clear() + continue + name = canonicalize_name(name) + other.discard(name) + target.add(name) + + def get_allowed_formats(self, canonical_name): + # type: (str) -> FrozenSet[str] + result = {"binary", "source"} + if canonical_name in self.only_binary: + result.discard('source') + elif canonical_name in self.no_binary: + result.discard('binary') + elif ':all:' in self.only_binary: + result.discard('source') + elif ':all:' in self.no_binary: + result.discard('binary') + return frozenset(result) + + def disallow_binaries(self): + # type: () -> None + self.handle_mutual_excludes( + ':all:', self.no_binary, self.only_binary, + ) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/format_control 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/format_control 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a428e4e48d5b516d6692767b280d2da64e7f07b8 GIT binary patch literal 3576 zcmd5;>uwuG6h6D_IB}Yg02Nf+x(FnU+SsXDsZsi{+!U{3Gn|F zlC6-X_<58Q6(03H^0@9(?o$y^Kd9>gh-?uJ!rE{j@SNi4+PN0~ z@0;qWF1fbIwaOH+TdzuIsyso1JUspzB)f%76N3RP`aY#|^7H7qPyGg?1Cszn8c3l@ zX+sLLq%m@a%V)r{H8H+F&xZ4qOB8Lkc{}z2vWGe!X%p^LCWMLcAS(x4!Om>BW2z!N z9A?QdjKfi!?8O5e0;X_VhgoS|oaZ|2%!haq-Zv*7X&uSlM|L8c-_5h{s$Yckx)7^vEba$#e)y8%Qqi(vtJ9v6)=f>*xjhn~E z2X5Cncl+kya23y>?EcgpWuuh|5G!Bby=ONbag!vKl};Nlpj%X_&MnquP*qZ&cV~1g zJW&{zIi;9@mZ?Vmf+w%v@)8DfngrBkGys@gffo6me-4lEn5m~!nk87W%`+oL#LXb9 z+)$f~VR%z^srQw7A0^BCB>z=o-$3)ZvEcH;lnHEVw1n)1i4hOJNY<5FsjJx2)H>cX zCnlpDC3iyd_$YCpCvy-Z9 zK&J9%G4?Sp-JXSkJ(xtaVsCT4QdTRqriI;bWra0uTCc>lghua=Gox*IBaF>pT_~SH{maI(m zQG^C^yw^0dNo>-Zi~PBRI3H_aB^DlNC-+fSDD|PJws=%tKp6Nsb@v@?VhDGhYgLTh zIL?(mO7d~4?KSk+PkEEUk{5Uj{*t%k&EsA4E<=~+@V|gs6ZvAT&WsV?QlaVZD1e~g z<FlsL!e19XdYh_oOGK+pnLE6%j`CoHyz1L|-| zVkKD~Y#itAVkpep*dlnSa1E+MovKMpBj<}lxe$xM$2}y3isL^ibRZ|sD)ApV#c^HN^U}b~0QrpjnH?_}^18Jk;;X>HxaG|^{ieS( z-)i8UTe{L(tYL5*q#&&8r~_T5mFd)xFaqVy*k!q`Rq@Jn&@}GrKvc9ywXG%gy;nxa z^o~0oVXcT&q!!S+&dL(;fkaF$>8ZANb>d{t7Y9O#IKHU)afkOS@yfEl>@9;ySA+im DaLhn> literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/format_control.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/format_control.py new file mode 100644 index 0000000..2e13727 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/format_control.py @@ -0,0 +1,84 @@ +# The following comment should be removed at some point in the future. +# mypy: strict-optional=False + +from pip._vendor.packaging.utils import canonicalize_name + +from pip._internal.exceptions import CommandError +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Optional, Set, FrozenSet + + +class FormatControl(object): + """Helper for managing formats from which a package can be installed. + """ + + def __init__(self, no_binary=None, only_binary=None): + # type: (Optional[Set[str]], Optional[Set[str]]) -> None + if no_binary is None: + no_binary = set() + if only_binary is None: + only_binary = set() + + self.no_binary = no_binary + self.only_binary = only_binary + + def __eq__(self, other): + # type: (object) -> bool + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + # type: (object) -> bool + return not self.__eq__(other) + + def __repr__(self): + # type: () -> str + return "{}({}, {})".format( + self.__class__.__name__, + self.no_binary, + self.only_binary + ) + + @staticmethod + def handle_mutual_excludes(value, target, other): + # type: (str, Optional[Set[str]], Optional[Set[str]]) -> None + if value.startswith('-'): + raise CommandError( + "--no-binary / --only-binary option requires 1 argument." + ) + new = value.split(',') + while ':all:' in new: + other.clear() + target.clear() + target.add(':all:') + del new[:new.index(':all:') + 1] + # Without a none, we want to discard everything as :all: covers it + if ':none:' not in new: + return + for name in new: + if name == ':none:': + target.clear() + continue + name = canonicalize_name(name) + other.discard(name) + target.add(name) + + def get_allowed_formats(self, canonical_name): + # type: (str) -> FrozenSet[str] + result = {"binary", "source"} + if canonical_name in self.only_binary: + result.discard('source') + elif canonical_name in self.no_binary: + result.discard('binary') + elif ':all:' in self.only_binary: + result.discard('source') + elif ':all:' in self.no_binary: + result.discard('binary') + return frozenset(result) + + def disallow_binaries(self): + # type: () -> None + self.handle_mutual_excludes( + ':all:', self.no_binary, self.only_binary, + ) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/format_control.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/format_control.pyc new file mode 100644 index 0000000000000000000000000000000000000000..69ed3248fcdc8ecd843efdd4de7332f72fe829ad GIT binary patch literal 3576 zcmd5;>uwuG6h6D_IB}Zb02Nf+x(FnU+SnSI5}G~%{=Y)9 z6|xjRk8+~Iqk%^r*L});Dgqh=bv>ZGLB$*m=E&1?WFE?_2IWmE=4mib#R3f$sA$ok zMP7*&=14Enjz?*eo)Mi9Z4E9_I!~LO1$;C67f;7S$-Ry&iOZ_Yk~q(vXjR6AuDh1d zwNVvCT&8!8sZ8Da23mjIda$K7?%&<`K}8Sy{qOqUcGxDzYyUKMSyjflJbj+ z1m+NN``WDCmv)a%h?LI*xDfELO+mchX<$LeS-&c^;A*G1mX+Gh%GeycOX#l3{CHZg z&x7Y!o$o|!bhL=9gH&hs0Hxm8WCyX+y@S~FcB(wp#`cEeUb??Kd~$2&#@hCco5#lo zZr3??`{voI7V9#oDyh%AJ3bbk zD2&UTQcOV0R3m@MlhRYKAmEDOmFfPG=H+vP1oK3os|p+gl^sp#^LMp)2eJh zrt)Vo_7N}LnTLUWm_)Q{Z*#s{R;#t9g}rcfl{IZvuf(;4M(2+~?j`;-fHqIVqZWQqtQ3yNEGbg1a*XU;W<203)tW5P$ zga&fF*EF+9Y|@&G{JDcTpJ-tv79MIR_fb|T^`WS?cvN0M82Bo6_bqH<1b3cmRZQF@ z&Xqn&@=2=gHT2kzd6Plg3%n)2?X|r{yvyEY=<)*omr!dWU#``eG2&Y)H2nhw5EQ%| z`E-i=EbfeD8Z5jfJeaZ8D<99ged+#w)-440$~#Qvn)5t6n{^B4z4Gd;yPo~qta~~e z$AsB3c2gW@U(ROgC7BSmnwUgCr;3ac=NP?*Zjla=76btZTHtEMnb!V<#TIcu9WF_% zB+G-1liXblg?STO1P>LiL3OB8HH~THoGzn}{cPJ?`Cm%-DsVa%>Gx4N7alIuCkkNe zm~E(pKw33<2gfKwH8Et6*w5Ty!ocz^xKQA z2Hu7CmDX|%gX16tVO>`p=rXNLw~mAnD0e3=%WbWSS7w7|abFjrqD880EwS&sG(x6# z-SHS}MXVyVfYxpykCh|R{Rxj1x&gc{0AbM BJ(mCg literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/index 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/index 2.py new file mode 100644 index 0000000..ead1efb --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/index 2.py @@ -0,0 +1,31 @@ +from pip._vendor.six.moves.urllib import parse as urllib_parse + + +class PackageIndex(object): + """Represents a Package Index and provides easier access to endpoints + """ + + def __init__(self, url, file_storage_domain): + # type: (str, str) -> None + super(PackageIndex, self).__init__() + self.url = url + self.netloc = urllib_parse.urlsplit(url).netloc + self.simple_url = self._url_for_path('simple') + self.pypi_url = self._url_for_path('pypi') + + # This is part of a temporary hack used to block installs of PyPI + # packages which depend on external urls only necessary until PyPI can + # block such packages themselves + self.file_storage_domain = file_storage_domain + + def _url_for_path(self, path): + # type: (str) -> str + return urllib_parse.urljoin(self.url, path) + + +PyPI = PackageIndex( + 'https://pypi.org/', file_storage_domain='files.pythonhosted.org' +) +TestPyPI = PackageIndex( + 'https://test.pypi.org/', file_storage_domain='test-files.pythonhosted.org' +) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/index 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/index 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9baab37f552d2424e6d224f07ed0e54ab2fe2936 GIT binary patch literal 1555 zcmc&!O>fgc5S_J?v(fa%KuG-?BNSNKE<~L)M%lYq zjg#~&nXBV6Qx|`;VY@e&CV)^x6I>1Haau@V;uBKhMTg>(&}YjJ5V5KoWmIWRkObF( z0~a|+$}FgxYNaz}0+kr8njlG2WlUhJK$TftY4{BSjFbc3%(onT3SsdGxp~$cpjy{D zyu%4FaOS*LP3&;o#8ygOYAdDXbkCc@L5g>wr?SPEt)MVk-C}PX$XV6E z)GjR3)ZWW_%Z_}v+w5R7(}j}8Rt@NqS+z`b>7aL68dc0<&OGM8A!aMg604|g^eV9` zS|v?1tBOoDCYsk#_9dTxdonvbm>wRj*DIS_Yo8u{T^wM{%jh(!b-k}kW0RuTfBo*g z8GmGzn<(6>rc8=xS!Jp)k>(B>*6WyI;^Ymt7kN9PFLuSY*zTqt?=cxH$19fwUUNqW zNM!~+5W)D4TygORo3H>TIeNqu8FG~P9v?Z10N<^a%+&2-8qSNnkRfmcN?9gLh5ld* zDFM|vNR+N12@+E&9bPe?|0}_*Zh<<+odGr6NjolM>k$p84HVRSMvy7tlIy->nL=TKZX^0Z75gxIaJNi=!@a9 zTH!7<0zR)8=hSuwCtFQ(mD={hhzJa0STB?E1k^9TOko-giu GzW4*eM}2w# literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/index.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/index.py new file mode 100644 index 0000000..ead1efb --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/index.py @@ -0,0 +1,31 @@ +from pip._vendor.six.moves.urllib import parse as urllib_parse + + +class PackageIndex(object): + """Represents a Package Index and provides easier access to endpoints + """ + + def __init__(self, url, file_storage_domain): + # type: (str, str) -> None + super(PackageIndex, self).__init__() + self.url = url + self.netloc = urllib_parse.urlsplit(url).netloc + self.simple_url = self._url_for_path('simple') + self.pypi_url = self._url_for_path('pypi') + + # This is part of a temporary hack used to block installs of PyPI + # packages which depend on external urls only necessary until PyPI can + # block such packages themselves + self.file_storage_domain = file_storage_domain + + def _url_for_path(self, path): + # type: (str) -> str + return urllib_parse.urljoin(self.url, path) + + +PyPI = PackageIndex( + 'https://pypi.org/', file_storage_domain='files.pythonhosted.org' +) +TestPyPI = PackageIndex( + 'https://test.pypi.org/', file_storage_domain='test-files.pythonhosted.org' +) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/index.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/index.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1e964e340488bd46ab2488a819b4404569791f22 GIT binary patch literal 1555 zcmc&!O>@&Q5M9|x+62l+JM9GyKKjzQP=?Mhz%X!NddYO$UdREBYblA0V;f5i4bxls zWBew50KAo3xNxt=T1%_l)$V(1hrhN)mp|Wp&go|K@P3DBClCscpps}QXc~}E0qKxt zf>cO9h^~n~O?#w!r111f4d_~kY2Rx$yk^sD2Bd~`8jldt{Kkj{R;~}xWUbZiK2|4L z{w161<4WnvzuB1iCYDqH z0S3-qG`dYaj+@v@X)5ESbe!%*TY5U?nW;SVK1-|1S<0EG95}}8gk55lG_6@>PA99Z zO=fkebZe7&lc=x7{QHa9vxDtJO=VqHmiy0-UQVVd ztNcXaPPbK7Cd*ps(k6yGXxyw*hKZB6++Gyyh@sdO+hV()2fW8*usp9^7I-Z@9Uzq% z3_t|qJMqP(8*IV?m=x#{Uu4Wt(g%FxDFS?VS~63&i)lG83Sx%96DVbsEj9XsEu;ig z7a&pkf+R@HrSy2EeEzQlzq$kJ7d|+j-)<% None + """ + :param url: url of the resource pointed to (href of the link) + :param comes_from: instance of HTMLPage where the link was found, + or string. + :param requires_python: String containing the `Requires-Python` + metadata field, specified in PEP 345. This may be specified by + a data-requires-python attribute in the HTML link tag, as + described in PEP 503. + :param yanked_reason: the reason the file has been yanked, if the + file has been yanked, or None if the file hasn't been yanked. + This is the value of the "data-yanked" attribute, if present, in + a simple repository HTML link. If the file has been yanked but + no reason was provided, this should be the empty string. See + PEP 592 for more information and the specification. + """ + + # url can be a UNC windows share + if url.startswith('\\\\'): + url = path_to_url(url) + + self._parsed_url = urllib_parse.urlsplit(url) + # Store the url as a private attribute to prevent accidentally + # trying to set a new value. + self._url = url + + self.comes_from = comes_from + self.requires_python = requires_python if requires_python else None + self.yanked_reason = yanked_reason + + super(Link, self).__init__(key=url, defining_class=Link) + + def __str__(self): + # type: () -> str + if self.requires_python: + rp = ' (requires-python:%s)' % self.requires_python + else: + rp = '' + if self.comes_from: + return '%s (from %s)%s' % (redact_auth_from_url(self._url), + self.comes_from, rp) + else: + return redact_auth_from_url(str(self._url)) + + def __repr__(self): + # type: () -> str + return '' % self + + @property + def url(self): + # type: () -> str + return self._url + + @property + def filename(self): + # type: () -> str + path = self.path.rstrip('/') + name = posixpath.basename(path) + if not name: + # Make sure we don't leak auth information if the netloc + # includes a username and password. + netloc, user_pass = split_auth_from_netloc(self.netloc) + return netloc + + name = urllib_parse.unquote(name) + assert name, ('URL %r produced no filename' % self._url) + return name + + @property + def file_path(self): + # type: () -> str + return url_to_path(self.url) + + @property + def scheme(self): + # type: () -> str + return self._parsed_url.scheme + + @property + def netloc(self): + # type: () -> str + """ + This can contain auth information. + """ + return self._parsed_url.netloc + + @property + def path(self): + # type: () -> str + return urllib_parse.unquote(self._parsed_url.path) + + def splitext(self): + # type: () -> Tuple[str, str] + return splitext(posixpath.basename(self.path.rstrip('/'))) + + @property + def ext(self): + # type: () -> str + return self.splitext()[1] + + @property + def url_without_fragment(self): + # type: () -> str + scheme, netloc, path, query, fragment = self._parsed_url + return urllib_parse.urlunsplit((scheme, netloc, path, query, None)) + + _egg_fragment_re = re.compile(r'[#&]egg=([^&]*)') + + @property + def egg_fragment(self): + # type: () -> Optional[str] + match = self._egg_fragment_re.search(self._url) + if not match: + return None + return match.group(1) + + _subdirectory_fragment_re = re.compile(r'[#&]subdirectory=([^&]*)') + + @property + def subdirectory_fragment(self): + # type: () -> Optional[str] + match = self._subdirectory_fragment_re.search(self._url) + if not match: + return None + return match.group(1) + + _hash_re = re.compile( + r'(sha1|sha224|sha384|sha256|sha512|md5)=([a-f0-9]+)' + ) + + @property + def hash(self): + # type: () -> Optional[str] + match = self._hash_re.search(self._url) + if match: + return match.group(2) + return None + + @property + def hash_name(self): + # type: () -> Optional[str] + match = self._hash_re.search(self._url) + if match: + return match.group(1) + return None + + @property + def show_url(self): + # type: () -> str + return posixpath.basename(self._url.split('#', 1)[0].split('?', 1)[0]) + + @property + def is_file(self): + # type: () -> bool + return self.scheme == 'file' + + def is_existing_dir(self): + # type: () -> bool + return self.is_file and os.path.isdir(self.file_path) + + @property + def is_wheel(self): + # type: () -> bool + return self.ext == WHEEL_EXTENSION + + @property + def is_vcs(self): + # type: () -> bool + from pip._internal.vcs import vcs + + return self.scheme in vcs.all_schemes + + @property + def is_yanked(self): + # type: () -> bool + return self.yanked_reason is not None + + @property + def has_hash(self): + # type: () -> bool + return self.hash_name is not None + + def is_hash_allowed(self, hashes): + # type: (Optional[Hashes]) -> bool + """ + Return True if the link has a hash and it is allowed. + """ + if hashes is None or not self.has_hash: + return False + # Assert non-None so mypy knows self.hash_name and self.hash are str. + assert self.hash_name is not None + assert self.hash is not None + + return hashes.is_hash_allowed(self.hash_name, hex_digest=self.hash) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/link 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/link 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..750358c18e50736f44146a3cb43a9b1ee271513a GIT binary patch literal 9824 zcmd5?OLr8<6|SCH|b)!w6Od)(N#N~TqNM%88=IP4Cs&ljlXKeL(`6<>V}!o4x9z} z`PG$`>-Ci{Zmm>TuYFdnkazYVs!T^=!`8!|ZPlAu+OGGq#4cdKbdz|rzoTuEHtb|R zq#s(hJXiTtZ+#dV9bHM=*jV3)AI2Rwx*wxAzP$Nm{mRvqE1%Yb+tuo|>L--~y6qlR z-4GkwRJJ9I?Fq8GGR8^V@UyOs(@vOJ_T0kGLgKAnH__6%-NCTikJGQ-x^ewxxZWqf z#GcT!w2{xR$DNIV3UR#;QOqyFI1S|yg`ui|weEjU{k*7ZV=5|;?NA%23>zh-CsZ^h zvVf*d3OJsFWdTb$I3?gj4nmapb}|R21uW;_jEbh%uI-inJ$e7EfKK|@aZc%d>fU}8 z&8Q~;56I}=eDcA3bXG>^WppkdUC2lG$><>&-Jg#h7Vtn0E(&-s2agCipMytLw7@o$ zkwhKJ`(F_7a1OpG;9?HGB;b)8^i_0}?b;7iuv&S65_u0*pu3qix?_zW`l8X1pFn;- zH5FYq!^Q^W>|g6d`r%3Ao45^?@NWm#r+oZ1Xb5?^!bP8;dgQ5lFei_cXD=%2u?OwP zo`RX#g1T4i_dHUnKE^g1Z zPar!^eS4Kg+SW$Q`LZ8(j14c7C$jiAL4V$vn=FP#|b_AULn=3c{3l}df`L|lJ@!R2+zotiKtZi*uD)hO~nH;S%4lO^lKx?gM zHCH4%$pEK8He5gLhi2O|E2j z%U)6fsLR5uIZ=HvRW_~+`-o_m?+aY6uA9i39SfZ~y4e1>+$S}~{ zxnp5!YC~_?z4(oEQ&hCxNJ3+(55jrF^ zO7wF5kwmXC%$5e18d{(P9SYSl4(A%$Hyq2*y-lMeo|#@(X94HSmi0RDwe`BV4O!3V zq$xB3o8S=U1&geXpsJv_${-t3%iS#A46REO+pImI7JG*x7 z!q(QNy=Sd`4wYJ*^=1qEi{(PuoA=6v26GdNgNzbyd3}(rupBN?(wBf?3OfV)?hZ2DQdR49U{$Ywh^Ek^!1K96 z$t!!a-d@M~ocqFgW=W3W3#&p*)s)fo_H_o=6Xsn<4?htqcal7!T8F#sg1#!+V$o_y z6Oj~}$OorEtC9-3WLV@T@J>?_ya)t?0R=^|2POjaO+o?f)lmSQcL@qiU^F9n3==3Q z^M0=GD33U?e?<#Sqotuq{A90rOn2Y#ekeW!|)d)Lz((CgKJ(`;g zvk(_A$cKO$ygN8ROu8tJ1Er_+RIF8$lya4G5qw83TH2%-bnq%$LL7~CcMwNR9-@3( zyu@03?MrCD2;uxd8R;vkdpP8aL4ryll&W40eu&y-1VZvjfC0UZxTfG0j_wMLCU%ce z9Ld7~Nh*Y7COXbSpGfpy?1%oC=sOy?#;%}7GA&&6{1ga{%8+q~MF^rfI)d(uGg(Bu zbAj;jcrI88bcl;MokvPFC0=gRV9{IAbUHAk)4h(Q_rYO+6>jC?5dDQ1uZu_wQ1^Q} z+mZymnT6|ZTvP01Fggf~fPS6Fm$YYb`gb_}0{w<^RmH=e;hEyAmtVQ7*Vo^veD(D! zcV9gvhEF9KD9UL7j;{z%Y`AO!ZBLn($jDW+2IjI&jmQ|w^uLZR21p=(a}hv?S)(N} zUKlK=o%Jm3bw^TaE`ifsqqURlK(`AgiZ=m*jG@nb?F$_Ao(xd%k0di)~m`naB%BsuzR?w7-p41GZe{A6OgJlfu z4#FAPLAZVx8;kq*Iff({)G0ZREaN( zn6i%s^c1$6Acv4Q9gi|aiZ2d-qm5KSpmL zeu8h5VUpC{S=NjMS{O6tt_mgr-9Mw%Px=j_PTu`nvFZR%hM{3vkQQisd$GfGQpU-*XdF~3(e1dHT_Zoq= zy{zNk%J7oZe}|GsLLlsieA{Ztqf2akyyL(W(g!*kUUkSrN=rY4|5?Y2d$mG`ED9BT zhL$A!ABTz2fym@Fj=sx*zW4U>*~UD!~s<9(!u%d>j_l0Hfs^}1umF?m-r=h2B#~s8IMj~#J%8k&bZ9#N37mvC3zbe?f6b_88EH|S6N+Sb%Rxv z6(uFa4*i+5{{JsZ)C#`A7@}S(l*Wr*(VISAo-U8gj?d1bjL%Najtf+pEuf8pcaI`k z=(pVuXi3O59y@*%$Ju`RmtG z&&G*aVya=cy4py>&z*xU5#|GW{paop z8jL(;29um7bKPgmkppURz None + """ + :param url: url of the resource pointed to (href of the link) + :param comes_from: instance of HTMLPage where the link was found, + or string. + :param requires_python: String containing the `Requires-Python` + metadata field, specified in PEP 345. This may be specified by + a data-requires-python attribute in the HTML link tag, as + described in PEP 503. + :param yanked_reason: the reason the file has been yanked, if the + file has been yanked, or None if the file hasn't been yanked. + This is the value of the "data-yanked" attribute, if present, in + a simple repository HTML link. If the file has been yanked but + no reason was provided, this should be the empty string. See + PEP 592 for more information and the specification. + """ + + # url can be a UNC windows share + if url.startswith('\\\\'): + url = path_to_url(url) + + self._parsed_url = urllib_parse.urlsplit(url) + # Store the url as a private attribute to prevent accidentally + # trying to set a new value. + self._url = url + + self.comes_from = comes_from + self.requires_python = requires_python if requires_python else None + self.yanked_reason = yanked_reason + + super(Link, self).__init__(key=url, defining_class=Link) + + def __str__(self): + # type: () -> str + if self.requires_python: + rp = ' (requires-python:%s)' % self.requires_python + else: + rp = '' + if self.comes_from: + return '%s (from %s)%s' % (redact_auth_from_url(self._url), + self.comes_from, rp) + else: + return redact_auth_from_url(str(self._url)) + + def __repr__(self): + # type: () -> str + return '' % self + + @property + def url(self): + # type: () -> str + return self._url + + @property + def filename(self): + # type: () -> str + path = self.path.rstrip('/') + name = posixpath.basename(path) + if not name: + # Make sure we don't leak auth information if the netloc + # includes a username and password. + netloc, user_pass = split_auth_from_netloc(self.netloc) + return netloc + + name = urllib_parse.unquote(name) + assert name, ('URL %r produced no filename' % self._url) + return name + + @property + def file_path(self): + # type: () -> str + return url_to_path(self.url) + + @property + def scheme(self): + # type: () -> str + return self._parsed_url.scheme + + @property + def netloc(self): + # type: () -> str + """ + This can contain auth information. + """ + return self._parsed_url.netloc + + @property + def path(self): + # type: () -> str + return urllib_parse.unquote(self._parsed_url.path) + + def splitext(self): + # type: () -> Tuple[str, str] + return splitext(posixpath.basename(self.path.rstrip('/'))) + + @property + def ext(self): + # type: () -> str + return self.splitext()[1] + + @property + def url_without_fragment(self): + # type: () -> str + scheme, netloc, path, query, fragment = self._parsed_url + return urllib_parse.urlunsplit((scheme, netloc, path, query, None)) + + _egg_fragment_re = re.compile(r'[#&]egg=([^&]*)') + + @property + def egg_fragment(self): + # type: () -> Optional[str] + match = self._egg_fragment_re.search(self._url) + if not match: + return None + return match.group(1) + + _subdirectory_fragment_re = re.compile(r'[#&]subdirectory=([^&]*)') + + @property + def subdirectory_fragment(self): + # type: () -> Optional[str] + match = self._subdirectory_fragment_re.search(self._url) + if not match: + return None + return match.group(1) + + _hash_re = re.compile( + r'(sha1|sha224|sha384|sha256|sha512|md5)=([a-f0-9]+)' + ) + + @property + def hash(self): + # type: () -> Optional[str] + match = self._hash_re.search(self._url) + if match: + return match.group(2) + return None + + @property + def hash_name(self): + # type: () -> Optional[str] + match = self._hash_re.search(self._url) + if match: + return match.group(1) + return None + + @property + def show_url(self): + # type: () -> str + return posixpath.basename(self._url.split('#', 1)[0].split('?', 1)[0]) + + @property + def is_file(self): + # type: () -> bool + return self.scheme == 'file' + + def is_existing_dir(self): + # type: () -> bool + return self.is_file and os.path.isdir(self.file_path) + + @property + def is_wheel(self): + # type: () -> bool + return self.ext == WHEEL_EXTENSION + + @property + def is_vcs(self): + # type: () -> bool + from pip._internal.vcs import vcs + + return self.scheme in vcs.all_schemes + + @property + def is_yanked(self): + # type: () -> bool + return self.yanked_reason is not None + + @property + def has_hash(self): + # type: () -> bool + return self.hash_name is not None + + def is_hash_allowed(self, hashes): + # type: (Optional[Hashes]) -> bool + """ + Return True if the link has a hash and it is allowed. + """ + if hashes is None or not self.has_hash: + return False + # Assert non-None so mypy knows self.hash_name and self.hash are str. + assert self.hash_name is not None + assert self.hash is not None + + return hashes.is_hash_allowed(self.hash_name, hex_digest=self.hash) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/link.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/link.pyc new file mode 100644 index 0000000000000000000000000000000000000000..69b50d708500008d0c99f6fbf462278c8ccbbdbb GIT binary patch literal 9824 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 HWSsv7tzIzL literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/scheme.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/scheme.py new file mode 100644 index 0000000..af07b40 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/scheme.py @@ -0,0 +1,25 @@ +""" +For types associated with installation schemes. + +For a general overview of available schemes and their context, see +https://docs.python.org/3/install/index.html#alternate-installation. +""" + + +class Scheme(object): + """A Scheme holds paths which are used as the base directories for + artifacts associated with a Python package. + """ + def __init__( + self, + platlib, # type: str + purelib, # type: str + headers, # type: str + scripts, # type: str + data, # type: str + ): + self.platlib = platlib + self.purelib = purelib + self.headers = headers + self.scripts = scripts + self.data = data diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/scheme.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/scheme.pyc new file mode 100644 index 0000000000000000000000000000000000000000..99968752248577665dfe9e36f4c07ac461d4307c GIT binary patch literal 1154 zcmc&y!EO^V5cOu;(5}=oS4&*>K;xDoDj`4xB#sfY(V;KR84snRjm1=w)C&Lyy-%os4sxx)_ zO?ozPJ?U`e9vO!adXjbgub@eRW0F5hvi_Km(a{?&?I8h>2~;~F6`ipI^ITN3a>NNp z@LKL(mz{S_l!L)8%1vkMPMQGnDv}c>ashH-BFM%DsL=;YX0<*Pl9mZ*TT|oz_8Iv; zRYv#LpUn~`DZggb9IWCkMLZ?A$;6Ein#d>-+UAMSb}tdy?kBRx70pVnbXx8c;sb(# z+T`qF$FBn1@eWJ_A*Slq@6dBDl8V8!J{-@hDZCRq_2L#SUUmObx-V zsT*o-f@;Y)x?U{@)qJ^Jetp`Wo-9t!w%avcBI5bkraPgv?9~S~*x{~&$4}0mP3ILK zrO=j!gL>@L$~WMm+D#je#sPg&)BhH=J|Z3q0&#Gd?S5&HZ SearchScope + """ + Create a SearchScope object after normalizing the `find_links`. + """ + # Build find_links. If an argument starts with ~, it may be + # a local file relative to a home directory. So try normalizing + # it and if it exists, use the normalized version. + # This is deliberately conservative - it might be fine just to + # blindly normalize anything starting with a ~... + built_find_links = [] # type: List[str] + for link in find_links: + if link.startswith('~'): + new_link = normalize_path(link) + if os.path.exists(new_link): + link = new_link + built_find_links.append(link) + + # If we don't have TLS enabled, then WARN if anyplace we're looking + # relies on TLS. + if not has_tls(): + for link in itertools.chain(index_urls, built_find_links): + parsed = urllib_parse.urlparse(link) + if parsed.scheme == 'https': + logger.warning( + 'pip is configured with locations that require ' + 'TLS/SSL, however the ssl module in Python is not ' + 'available.' + ) + break + + return cls( + find_links=built_find_links, + index_urls=index_urls, + ) + + def __init__( + self, + find_links, # type: List[str] + index_urls, # type: List[str] + ): + # type: (...) -> None + self.find_links = find_links + self.index_urls = index_urls + + def get_formatted_locations(self): + # type: () -> str + lines = [] + if self.index_urls and self.index_urls != [PyPI.simple_url]: + lines.append( + 'Looking in indexes: {}'.format(', '.join( + redact_auth_from_url(url) for url in self.index_urls)) + ) + if self.find_links: + lines.append( + 'Looking in links: {}'.format(', '.join( + redact_auth_from_url(url) for url in self.find_links)) + ) + return '\n'.join(lines) + + def get_index_urls_locations(self, project_name): + # type: (str) -> List[str] + """Returns the locations found via self.index_urls + + Checks the url_name on the main (first in the list) index and + use this url_name to produce all locations + """ + + def mkurl_pypi_url(url): + # type: (str) -> str + loc = posixpath.join( + url, + urllib_parse.quote(canonicalize_name(project_name))) + # For maximum compatibility with easy_install, ensure the path + # ends in a trailing slash. Although this isn't in the spec + # (and PyPI can handle it without the slash) some other index + # implementations might break if they relied on easy_install's + # behavior. + if not loc.endswith('/'): + loc = loc + '/' + return loc + + return [mkurl_pypi_url(url) for url in self.index_urls] diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/search_scope 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/search_scope 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..93909b0ccfe1d0e8b79244de412c39324c672d82 GIT binary patch literal 4290 zcmd5<>uwvz6+XM9Rw6B#mYw*LHtE(tQ5uLz2T9N(NP;A?lLl1;b?G!Qkz})44#}lv zFWMRElF0evqAk!D=vx#h(Et6JzCqq2572z)j6?}B@-Ki)afj#3%+8$aca9q0ueJa8 z-?zR<>EzSE?>l(RcNj+adZdYl3)-WhcRKIW&_AUcG;9d%lWtPJM8hTW`27ayfbwM; zt~kC)xs0?s?ph&z zmGWyeyhdI@q&%8EN9uWc0x7T4s72}qjUjHE{zCMG=+W>dD>Ud{f^yma@!9HnAniJa zG%3m=OB0=arQ#yVm0McEQkB%^gl&S|KHC1!EiQwbCMLGpbbZkFGKQk8b9YLW*r|OE zQ?(i;sg0AloyOz3%;R~j-3eE*`q889NAboV9&G$Ejy~Sn`f%$5x5jsEX2x0;cc79w zoet8nQVVDCmG9v(zsI29CUFg%qTmZpl!hgmH1e5-N8k-60va`iSf*&uWev^y7}_B| z4~jIY%v>i{nb1yEsLM35Sy?cb*s#i~Ff(CV7UOI(hhm{ELnFfV0k!_7f| zFxY%KoR$Y_A2+iDjnQFVj^?&VW5nR;ROLzz)a7J?BRIeglDdFNyG&cYA=M`0T#5KZdj-SJJkvHl zrxwe}hL<}Ebs%1lgXOkS7waU0v7q`@o$bTB{r#lwk4rsLwdqf){%CJD`RcXtEBAI@ zdG+XM-_ESHzkBsydJmsT(SO*7-|l7wjHUJ6cke$i+aL3kJTX*Ob&=>kyrQ(}yX=V# z=XS3;5@}Kis$W0^bDKr#1m2q0@m9U7c-EUO?-sa@7kJCfOMZY~Njo+IJ7fcoxsCzZ zh9HhXAR#~qKnw(4wgj=x?9~+?v3-ov<8$+vxoC@UK*X?HX5;uiOUPnU(DG8w8P<3K zHva^}U?YkHU+MuX4g%>l^J(JIZbK%)3Q7WH00aOO2aay@eIUW&%e9541FHYQ7UlPV zU5odY7)#xTr`{U@X#gH_+CU<8OB}OVmb(lG$VkaDW!?zCer#Bkm&1it>=MHd2Lf*R ze4Q0TV7deU?Cn7m)P@s>vN0mIgeyjTSnr->2G<*K7wkvF2=L}a73#36-yVPwg#$8N zB+r>dppgyo^H?JKHI9#NV|eC_@aZ`tu>0B)BLZL%`_Ex+mRDLa5J%jp2tbUv%dmpG zvob3rUtLE3innkSz>3N|0~*^K5N4u)!%k*}+IQMie1s+OJ^{sE0*M=14IxyLvu{T_Yc)7~xQ1|MSnjUiHYUP~WyzN;CR z^I{b4X9>C(J?@>=y!KgzpQ?1%bwluhG>0K-C>Pfp1uX22v)WkBWoejD{O-7{4wGWE zIAv}W)=_vDXP|ScYE{z=o>%|1~Tq{*(6)iZ}g?1kRTzjDvw?D3p22U4POu2E%ciH6CQI&BH0Wit1lpJym?`F_JX%*Qe z?YbOn5hqb}mxmq?tftE(!B}3nIF)YVc21|WP(911&sZ|nfL1z}yDRt=r^VumI2JgG zW7iIX<<=>VM`a3{JEv49#-P)hmZRt;@KMOaZ+YO SearchScope + """ + Create a SearchScope object after normalizing the `find_links`. + """ + # Build find_links. If an argument starts with ~, it may be + # a local file relative to a home directory. So try normalizing + # it and if it exists, use the normalized version. + # This is deliberately conservative - it might be fine just to + # blindly normalize anything starting with a ~... + built_find_links = [] # type: List[str] + for link in find_links: + if link.startswith('~'): + new_link = normalize_path(link) + if os.path.exists(new_link): + link = new_link + built_find_links.append(link) + + # If we don't have TLS enabled, then WARN if anyplace we're looking + # relies on TLS. + if not has_tls(): + for link in itertools.chain(index_urls, built_find_links): + parsed = urllib_parse.urlparse(link) + if parsed.scheme == 'https': + logger.warning( + 'pip is configured with locations that require ' + 'TLS/SSL, however the ssl module in Python is not ' + 'available.' + ) + break + + return cls( + find_links=built_find_links, + index_urls=index_urls, + ) + + def __init__( + self, + find_links, # type: List[str] + index_urls, # type: List[str] + ): + # type: (...) -> None + self.find_links = find_links + self.index_urls = index_urls + + def get_formatted_locations(self): + # type: () -> str + lines = [] + if self.index_urls and self.index_urls != [PyPI.simple_url]: + lines.append( + 'Looking in indexes: {}'.format(', '.join( + redact_auth_from_url(url) for url in self.index_urls)) + ) + if self.find_links: + lines.append( + 'Looking in links: {}'.format(', '.join( + redact_auth_from_url(url) for url in self.find_links)) + ) + return '\n'.join(lines) + + def get_index_urls_locations(self, project_name): + # type: (str) -> List[str] + """Returns the locations found via self.index_urls + + Checks the url_name on the main (first in the list) index and + use this url_name to produce all locations + """ + + def mkurl_pypi_url(url): + # type: (str) -> str + loc = posixpath.join( + url, + urllib_parse.quote(canonicalize_name(project_name))) + # For maximum compatibility with easy_install, ensure the path + # ends in a trailing slash. Although this isn't in the spec + # (and PyPI can handle it without the slash) some other index + # implementations might break if they relied on easy_install's + # behavior. + if not loc.endswith('/'): + loc = loc + '/' + return loc + + return [mkurl_pypi_url(url) for url in self.index_urls] diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/search_scope.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/search_scope.pyc new file mode 100644 index 0000000000000000000000000000000000000000..290c06546de1cb02a901f360090d819753a9e578 GIT binary patch literal 4290 zcmd5<>uwvz6+XM9Rw6B#mYw+0H0jnrQ5uLz=N<$}kXBCGpo*X_ounq3Y*x!5xzy}M zJ40Pkxqnlo6c zD2psjboQl+izHWWX$ebJQkxUD33mHv`$M<53~rj3*lN@DLEFn1in7k#DOF;p_8Cmo zYLuilPUdzRkLxmz=e2exT*c}~54Ru28-IL%<4%=M(+Nlb4nI<+X3+56VR#_EhCQQp>oK5CXEVN~4M7W+Dka7sIVffq)Jmv=s z6QV~AI($IK9^LgH;fCWp9(<=VL4_ zoox2@*633kuy@VB=@7>((`0Q zHeU><<$>DA&Fny9beNZ;xmICTgxg1US{CfWqJ(_=Nv4w>t$MbN+s@EOM9*}ZWCg5G zgiCa`6HBJq6*u7+F?c#vxsn5QIho)H4zPoyE@09w)0S^YwTU=aB0kYx!LT#Ww2jZH z#d5OY<&Hufh!^Bwxoy}%xsD4#v`|xgmKdJlUQjb(^`je_Z+M7+je0BWNy`7g{ zIXc?6Gi&V|uN+M8;WH`v5Bl)i-K>DIw7&cD8?SE-Bc75chRUig65WSals0{rJ+a~3 z?o~%3O)5e497Hg;S)@+jt$7`9)w_ykz1i|^f$MmIx7@ts2l$n=VK;UId5bMldUGWjy$0$8MH;YU(F0^8o7=AbqaKmTo ztQZ2*9r%g22T@QPP8`a{h}aUY81Z4fdy*MkZ@^u!9}OeG+Y?o&!>WFF07euJ$Z(N7 zXA*%%HptIoiRjljKDv$JsWZY~&KZH-*OnL&0E^gv4s)}-(u#pN;!Z^XV$5BJ72KVb zSt0rAGWu7%g`)sgROTtr*xrCJ69pW0GAq=+)28AhEQ$9CDE0zyY}I?-Z=L+6YynPn zek2$AAihGK0*-m~Poz0A+T|Xh)L-Qu`(p}dL!3WYDhNz)jTyqq#ushCbV>y?lVM6h{OXLnv>J${D)`9BkQb8Ql0;A^zE4zPSdK428^ zOlHhG3>Kho067@Qxc_C7Y)QY-mxe}4b5)w`kZXAK8!Shhk`hLH^U|sa97)kcIhXS9 zg6%d>vuof{*R^u(g;w1DxHcL*U0gBc#wFinlUGMo#yJGQB*Rj2$Ths1K?kK(WS6w- za{M2`!7YT`LwuJ!u4$zpzpGw4J*Bh Vx`03big$${?>c@1?^>hN_&+?Y2?GEC literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/selection_prefs 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/selection_prefs 2.py new file mode 100644 index 0000000..f58fdce --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/selection_prefs 2.py @@ -0,0 +1,47 @@ +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Optional + from pip._internal.models.format_control import FormatControl + + +class SelectionPreferences(object): + + """ + Encapsulates the candidate selection preferences for downloading + and installing files. + """ + + # Don't include an allow_yanked default value to make sure each call + # site considers whether yanked releases are allowed. This also causes + # that decision to be made explicit in the calling code, which helps + # people when reading the code. + def __init__( + self, + allow_yanked, # type: bool + allow_all_prereleases=False, # type: bool + format_control=None, # type: Optional[FormatControl] + prefer_binary=False, # type: bool + ignore_requires_python=None, # type: Optional[bool] + ): + # type: (...) -> None + """Create a SelectionPreferences object. + + :param allow_yanked: Whether files marked as yanked (in the sense + of PEP 592) are permitted to be candidates for install. + :param format_control: A FormatControl object or None. Used to control + the selection of source packages / binary packages when consulting + the index and links. + :param prefer_binary: Whether to prefer an old, but valid, binary + dist over a new source dist. + :param ignore_requires_python: Whether to ignore incompatible + "Requires-Python" values in links. Defaults to False. + """ + if ignore_requires_python is None: + ignore_requires_python = False + + self.allow_yanked = allow_yanked + self.allow_all_prereleases = allow_all_prereleases + self.format_control = format_control + self.prefer_binary = prefer_binary + self.ignore_requires_python = ignore_requires_python diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/selection_prefs 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/selection_prefs 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..951937b8fd867ea3762a55d7343c59351b1410aa GIT binary patch literal 1970 zcmd5-U5^_z6upzLc2_N`D9b~ito9{HY^J3k)D=`M=`J8dh$gJi<^ju@@g&}zv8T3^ zG$=gLAI2-chaUjeeOB7xB2(o!@vIg`qvaTrHOxEV09yGGW;Sa z0Llo)5kxWq`>gghplCqZgmDuhn$?7&1!Wt?ZHP4XTOd1-N07DQEx;cD7vo!ybzs!J zh3l$+uyiA|{D;{5crm=-{qIiuKk(#yF!+A(Z5X?aV?R}187+$7xr?4NV@u)tMtf@t z{}FmdvXCiF8(Nu5D|IT}Hla37_y((cgpCBs0|Ad4Ae)d~x0vPI7J*MjU1GrD6gXs9 zPIW3OH!p;jj`^8nsnD6qu*=-_wyfIi%W`8`W|q1zB2#)=FM=UVY3D^zpo`_Ikgivc zq#fLdY6EK@t2@JH-6r0zZi77nAHnZ!Ku*^YtO0lf*7%{(gf)I>v|x=N8f^+BqeJ1N zF0JX7*!Ha?z=FMxDP|^@NMG-;21GfZRKkjqAzHKKE1|DscEWy{Nlf1c@T?RTy-YY3 z##vYCnjR;$liQVOHIuX9>5zT#?6Xgpu##2MmdbmK_J&Pv5bA2~HarD-ZlFP4QFfjN z-A~v{ws#OVSukXOV6^P9a~F2l1nfZ~9e3&>KxgJQMQ9?u5>pg9W)r1_UF|%}nbZu| z!lU4?WhHb}XgQ@b`G%3uDDl-sT^ihw8IA}K%kJ1j3c?76GE-!qvdP@Dg(wu6HHJOp znR1?)1?nJ}mdk74*n$DM_UKFIZ|Tr zatSA${{Tn!wfFQ2?D6S8M$h}x?b79{A)w%SLcN5ZpoAWm_y#rT6~Jr_0%6EK?o-99OD3-kjj$m#L@hOW-lgYxx+Y?Cn=B|hO5GallmFN6E+K#e^qdU<-;~)yZLC7e~)S{G} zd&+=wTy|bim-6F0Gb!f@ah{L@330wlv$p=rToZa{DGNvFJMGRvGos(1OHTg)8)UAx zWvw^&s&GBOs_^K&9BTjo literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/selection_prefs.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/selection_prefs.py new file mode 100644 index 0000000..f58fdce --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/selection_prefs.py @@ -0,0 +1,47 @@ +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Optional + from pip._internal.models.format_control import FormatControl + + +class SelectionPreferences(object): + + """ + Encapsulates the candidate selection preferences for downloading + and installing files. + """ + + # Don't include an allow_yanked default value to make sure each call + # site considers whether yanked releases are allowed. This also causes + # that decision to be made explicit in the calling code, which helps + # people when reading the code. + def __init__( + self, + allow_yanked, # type: bool + allow_all_prereleases=False, # type: bool + format_control=None, # type: Optional[FormatControl] + prefer_binary=False, # type: bool + ignore_requires_python=None, # type: Optional[bool] + ): + # type: (...) -> None + """Create a SelectionPreferences object. + + :param allow_yanked: Whether files marked as yanked (in the sense + of PEP 592) are permitted to be candidates for install. + :param format_control: A FormatControl object or None. Used to control + the selection of source packages / binary packages when consulting + the index and links. + :param prefer_binary: Whether to prefer an old, but valid, binary + dist over a new source dist. + :param ignore_requires_python: Whether to ignore incompatible + "Requires-Python" values in links. Defaults to False. + """ + if ignore_requires_python is None: + ignore_requires_python = False + + self.allow_yanked = allow_yanked + self.allow_all_prereleases = allow_all_prereleases + self.format_control = format_control + self.prefer_binary = prefer_binary + self.ignore_requires_python = ignore_requires_python diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/selection_prefs.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/selection_prefs.pyc new file mode 100644 index 0000000000000000000000000000000000000000..51402161fe8fbe726d9a063237140c4800b5d06c GIT binary patch literal 1970 zcmd5-U5^_z6upzLc2_N`D9b~ito9{HY^EPT)fH6GunPzgq6rn+Jk)Y#Jc)N_?5XV} zO%fZ^*UBrSMG-u=(Q{^ODSY2(Z%yGp zLC;7QGNoxlD|2b3PNmx>)W!)fu(}7>NT56r@VEi83E5SPS-xu#_+->21{_X-Lx$y4 zr=oK6LU`$zpGlSqov94F%w28Es@=XUH9R$;Ic?F!@?=hyP+E~f0d_7lII$o{(%;>$n!xRLcnz9mJO^SW(?kAhz<6#|q zpPj^`@wd>re!TqA)`4!0lvuo6 z!b#^p!jXOLJ-q^ZeELt(^Wk*6bh&B>D0rSwFQF$Wp~odTpym*pF4oYvC0cQ1)dH_f zybw0dQ5R`lJgwsF^~Ln<7x|-ylSfZhtA)St-amb^oIS)c)$wm}rK;o22|j-O^sB)* zAy-|w(q3A8%Hq;wvT*VC1X8}a>!CgbisMA(IlqgxqwL}6R&>xfh{A6WG72-bC?)5f zGT&?9?T+gp6ynYFeg0H0w{rZ2&gZE+r)4l!klhC_Z2ZxuhM)E&mralE<2Q{BlVvZQO M)96HZqPxw10mAJYKmY&$ literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/target_python 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/target_python 2.py new file mode 100644 index 0000000..97ae85a --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/target_python 2.py @@ -0,0 +1,107 @@ +import sys + +from pip._internal.pep425tags import get_supported, version_info_to_nodot +from pip._internal.utils.misc import normalize_version_info +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import List, Optional, Tuple + + from pip._vendor.packaging.tags import Tag + + +class TargetPython(object): + + """ + Encapsulates the properties of a Python interpreter one is targeting + for a package install, download, etc. + """ + + def __init__( + self, + platform=None, # type: Optional[str] + py_version_info=None, # type: Optional[Tuple[int, ...]] + abi=None, # type: Optional[str] + implementation=None, # type: Optional[str] + ): + # type: (...) -> None + """ + :param platform: A string or None. If None, searches for packages + that are supported by the current system. Otherwise, will find + packages that can be built on the platform passed in. These + packages will only be downloaded for distribution: they will + not be built locally. + :param py_version_info: An optional tuple of ints representing the + Python version information to use (e.g. `sys.version_info[:3]`). + This can have length 1, 2, or 3 when provided. + :param abi: A string or None. This is passed to pep425tags.py's + get_supported() function as is. + :param implementation: A string or None. This is passed to + pep425tags.py's get_supported() function as is. + """ + # Store the given py_version_info for when we call get_supported(). + self._given_py_version_info = py_version_info + + if py_version_info is None: + py_version_info = sys.version_info[:3] + else: + py_version_info = normalize_version_info(py_version_info) + + py_version = '.'.join(map(str, py_version_info[:2])) + + self.abi = abi + self.implementation = implementation + self.platform = platform + self.py_version = py_version + self.py_version_info = py_version_info + + # This is used to cache the return value of get_tags(). + self._valid_tags = None # type: Optional[List[Tag]] + + def format_given(self): + # type: () -> str + """ + Format the given, non-None attributes for display. + """ + display_version = None + if self._given_py_version_info is not None: + display_version = '.'.join( + str(part) for part in self._given_py_version_info + ) + + key_values = [ + ('platform', self.platform), + ('version_info', display_version), + ('abi', self.abi), + ('implementation', self.implementation), + ] + return ' '.join( + '{}={!r}'.format(key, value) for key, value in key_values + if value is not None + ) + + def get_tags(self): + # type: () -> List[Tag] + """ + Return the supported PEP 425 tags to check wheel candidates against. + + The tags are returned in order of preference (most preferred first). + """ + if self._valid_tags is None: + # Pass versions=None if no py_version_info was given since + # versions=None uses special default logic. + py_version_info = self._given_py_version_info + if py_version_info is None: + version = None + else: + version = version_info_to_nodot(py_version_info) + + tags = get_supported( + version=version, + platform=self.platform, + abi=self.abi, + impl=self.implementation, + ) + self._valid_tags = tags + + return self._valid_tags diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/target_python 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/target_python 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7b05eeb7155fac111e0ad5f79a57dc5d86d55dc5 GIT binary patch literal 4201 zcmd5?szd(dCqsp2gxg+hYt{b-Mc59upfBK?RiHtvok&2zwY^UyY}yA(T=xHNPrsnM`T4zH+DT&JW#!$vu-Q{1GaMZ*?3x<$pQ z$Z1f#MM;~6ZA!LjxJ}758eS`RG%4;-vO~iia#Bcak$#EB4uxCvBhfRWr^D;4$zit* zt)lpxnXIPP24`u{^x~W4z`)G#c2#PP8tC^-KR8`ms(!%(x5zpasm_X_9x? zWfA6EG}{W#emV+rGmitSjj~g%@*>N1VIvH)u?keFfQnM9i@eZiRhDWMVRgU?M(IQZ zjk5x)^I&umOz=51Hi+Y06=tVtoCV>o(stC7l_S=miI;yL;Wht4bLP?+kuROFPA6Mb zyiL}nS&f~i&Rt47j3U-Oa|lBiH*1h>l5O!MOjOUxZw)%DiLfm?!v;ug)0rckZ92nO z%v`%Tu*10V%no-dcy84yco?Dwc~At2%7GD#OdhC@l(7ZuRxo)0Fna2g;aEQudG4Xg?ZtyWQ|j+cV`XkHXLwaP4w)k#l1fjf%R$mm^l8pW|1M`^er z>Oy`ga}=cNSgYfC6kE8cbY`V9R53<}a7#}eK|TFqIdV*v#!D7-;W=z$V?xAk5gpGt za38SnrD(MwD9!9zg*Y1_0+yxE+42hfK#-@}4@K>Xfg>A_{f5-ddRy97ivT3K0sq75LC9*ZKW--?PEQ^z!99n}M;x zMBUqJJWoerO<-`_o;x#2fK&o(#N^*}{04l#QbqmN<0D)RvP_4)h*@;deTgTS8vRMM z(5atqI#`&GuZiWI9Nf%qmmT5>8#6)9GWeaBB|%;;w}t!yVaw-iS}k09aWCyQzOT== z*Efbj=k^-r`~~Pc^w|krW+Bnf=y>eCijl`Dz~;{=S8#tU-lP4 z(I01Vh=kFf#AIl=^`>d2<#OYSs?Kn5wj{An&cB;SHh`qxo zt_b!A48k^@3klAUGum|0rs6(R>rAK==>a5&PmjT_Ot21dG8G;L1&<}efJC_?3_7bz zzbV@q+@I8imRllGk}qhv5_i~T@0iDER#EsDxv#=g5;(gm&C)v@DJrlf*HlCb?tzyt zQHjT?T+HOqk+@>b_~3p13_7snlnH_U%<{)!nqZRbTW=_|9`leF_ote}I)7^4>~ik# zxQMZ=JyLjYmA-rHvZ{1AyZ!~sP)5h5mqcb%7C(P@PEfhRE_2kr9#gE4Z#9;<;q2~7 z1+&_X@+-`WUilvbZ0xb$Jn;%I%#LSzWW}~CgS3Rp`(=Q9z-S5L9rvbl1BFe~dBc6R F_6xmJ6(;}y literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/target_python.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/target_python.py new file mode 100644 index 0000000..97ae85a --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/target_python.py @@ -0,0 +1,107 @@ +import sys + +from pip._internal.pep425tags import get_supported, version_info_to_nodot +from pip._internal.utils.misc import normalize_version_info +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import List, Optional, Tuple + + from pip._vendor.packaging.tags import Tag + + +class TargetPython(object): + + """ + Encapsulates the properties of a Python interpreter one is targeting + for a package install, download, etc. + """ + + def __init__( + self, + platform=None, # type: Optional[str] + py_version_info=None, # type: Optional[Tuple[int, ...]] + abi=None, # type: Optional[str] + implementation=None, # type: Optional[str] + ): + # type: (...) -> None + """ + :param platform: A string or None. If None, searches for packages + that are supported by the current system. Otherwise, will find + packages that can be built on the platform passed in. These + packages will only be downloaded for distribution: they will + not be built locally. + :param py_version_info: An optional tuple of ints representing the + Python version information to use (e.g. `sys.version_info[:3]`). + This can have length 1, 2, or 3 when provided. + :param abi: A string or None. This is passed to pep425tags.py's + get_supported() function as is. + :param implementation: A string or None. This is passed to + pep425tags.py's get_supported() function as is. + """ + # Store the given py_version_info for when we call get_supported(). + self._given_py_version_info = py_version_info + + if py_version_info is None: + py_version_info = sys.version_info[:3] + else: + py_version_info = normalize_version_info(py_version_info) + + py_version = '.'.join(map(str, py_version_info[:2])) + + self.abi = abi + self.implementation = implementation + self.platform = platform + self.py_version = py_version + self.py_version_info = py_version_info + + # This is used to cache the return value of get_tags(). + self._valid_tags = None # type: Optional[List[Tag]] + + def format_given(self): + # type: () -> str + """ + Format the given, non-None attributes for display. + """ + display_version = None + if self._given_py_version_info is not None: + display_version = '.'.join( + str(part) for part in self._given_py_version_info + ) + + key_values = [ + ('platform', self.platform), + ('version_info', display_version), + ('abi', self.abi), + ('implementation', self.implementation), + ] + return ' '.join( + '{}={!r}'.format(key, value) for key, value in key_values + if value is not None + ) + + def get_tags(self): + # type: () -> List[Tag] + """ + Return the supported PEP 425 tags to check wheel candidates against. + + The tags are returned in order of preference (most preferred first). + """ + if self._valid_tags is None: + # Pass versions=None if no py_version_info was given since + # versions=None uses special default logic. + py_version_info = self._given_py_version_info + if py_version_info is None: + version = None + else: + version = version_info_to_nodot(py_version_info) + + tags = get_supported( + version=version, + platform=self.platform, + abi=self.abi, + impl=self.implementation, + ) + self._valid_tags = tags + + return self._valid_tags diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/target_python.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/target_python.pyc new file mode 100644 index 0000000000000000000000000000000000000000..10d410637432dad80ec2923003fa155cda37808b GIT binary patch literal 4201 zcmd5 z1HZq*YyN>I!as)+qH)!CDRC%uY3x$kpmBp7UeTbWNokA5t!mt)q)lmu#vO8Whsslt z)1qXD(k_j=lbvOLJv38oeX}TvytF#9KgG;amnP0LKh7q(Z*xD(qull#-f$C5mX~Re#NTQE z^1|x-TloHm=g*$|kAMH<@t3~$$Icp!2k_I3h@F3xlIYk?2YQ zuRIE-wkN+OlzX2Cw-DjRv-`6Rk^8^U^?{Pl7&HG7D-^WQFf+PQRam%ZH!?)QGu!yP;q8;S(F;B$}_EEtPWVgIGc)~ zNnT=g5rikf6rVF=gCyBkQGS{wc@XU@ZNq`A3|WIVUjBWI*ZdvLnM-FxzI37{o$OHg zAz7E^4R)S7cPZ;Jidgs3Aq-*MyhXN6w!@P!QN66bwdkxN!glBk8z8kyXO47s=?q^n zbM4~59^=L{d)%qvxz(uQVTc|UK^df~07ft}eW-q|j4ffeg2^L*F;HJjq_eM#4$5!_ z>==$33?o*vB!28Huqr6ET1TBaUJ3HyqAYc0m0209(}8*lca*2G(fjH&P7*bVvuI1y zh5Slp7-Z^LtK&tSSh%QiX00<+F-Avl%Rn7LJ^gw)a!j5jD;9L&Ic#HNBE)VPA1^p? zAF}Y3XtgCM%k4&mBo7e*tIFqW`2~)vt(yZlGnLo(L0P^F9C(N~qe_j4Gr)ww#*tfx z)qz>xLTq5?1gxI2xmp;l`g$-OsBeJh;PPGl^TUI$zq!59i*-AiA)pz-S+LY9(b?3_ z)V+Omf1jOvpiXBx%z7Utt?VtFSAH?!Mihj_xqOpx;&e&=OrP*lrpDZfD2@;Td93zuHpOS_Bjo3rip zt)bAly@ok|3HpwFc0!+7Nc1y0nRstwnnyY@!-`yiCDT8GMNIXvEVjPSN*P9+Zgt(BbHnYq@3~#4{%eHn9Y%3Y zuz$lK>e9K8;2b%lODA0_A27Afg-VegK!W)6IoOp6)*()&!lR(ziDVd%D0hTG=S}Ii zWm}8;)27gJM><&kY3T(wSHIagQ;N?qH z;&Cb$GdXl5u2}rf(ZGtY-(>YI`eMqToNtjs2;9!NjHLB$pj%Y|EMah0q5wp1uY$7; zoA>EdXZl4^e)a?d!&)MJONesavI$YSi)!t2zD9=M12hcAZTgGLcpznRnsmhT0tmd# zX%R`&r3xgjlK3RkLG%6jqwn7@&#Pj|VCNONQBiIPj7xHR@sv4CQ8oxCxcZasD*^Q>WVXt&zUhQoioUvzKwId^zm z#8}oIDSWU_--AtARXLnp|C(heqZ2boV-r@z&(B^FRIRY90=2Kl6f5Lgk0ow6yL(c> ztaqdQit=(${l@?s2kbXbyuu6fvB3XsnjEkV5J-gIuDuxUH*xo(?P.+?)-(?P.*?)) + ((-(?P\d[^-]*?))?-(?P.+?)-(?P.+?)-(?P.+?) + \.whl|\.dist-info)$""", + re.VERBOSE + ) + + def __init__(self, filename): + # type: (str) -> None + """ + :raises InvalidWheelFilename: when the filename is invalid for a wheel + """ + wheel_info = self.wheel_file_re.match(filename) + if not wheel_info: + raise InvalidWheelFilename( + "%s is not a valid wheel filename." % filename + ) + self.filename = filename + self.name = wheel_info.group('name').replace('_', '-') + # we'll assume "_" means "-" due to wheel naming scheme + # (https://github.com/pypa/pip/issues/1150) + self.version = wheel_info.group('ver').replace('_', '-') + self.build_tag = wheel_info.group('build') + self.pyversions = wheel_info.group('pyver').split('.') + self.abis = wheel_info.group('abi').split('.') + self.plats = wheel_info.group('plat').split('.') + + # All the tag combinations from this file + self.file_tags = { + Tag(x, y, z) for x in self.pyversions + for y in self.abis for z in self.plats + } + + def get_formatted_file_tags(self): + # type: () -> List[str] + """Return the wheel's tags as a sorted list of strings.""" + return sorted(str(tag) for tag in self.file_tags) + + def support_index_min(self, tags): + # type: (List[Tag]) -> int + """Return the lowest index that one of the wheel's file_tag combinations + achieves in the given list of supported tags. + + For example, if there are 8 supported tags and one of the file tags + is first in the list, then return 0. + + :param tags: the PEP 425 tags to check the wheel against, in order + with most preferred first. + + :raises ValueError: If none of the wheel's file tags match one of + the supported tags. + """ + return min(tags.index(tag) for tag in self.file_tags if tag in tags) + + def supported(self, tags): + # type: (List[Tag]) -> bool + """Return whether the wheel is compatible with one of the given tags. + + :param tags: the PEP 425 tags to check the wheel against. + """ + return not self.file_tags.isdisjoint(tags) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/wheel 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/wheel 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7a0dce8318d15e06bdf6e2cd2f17c4d85be8cb17 GIT binary patch literal 4245 zcmc&%TXPge6h5<)Y_dzh0A3JEYP3+7OJ;+hQYlOX5-z32)NoM(VVvyr?oODUnN0WQ zLWLJYsZUzvFY?v@;J@Gp=y%TSZZ<;s-~(*7JKcS{`+Z(OVRjD7I)B1AJ|YOVqJx*(QtUBNUHNXOxyli}@(UW$KL4@)%iajPeI^ zs!Z`Xbt<%6AuGY9W2CCo#PM-@Mzl+GfB69Oxm~L;`ybGGD$A8tiP28rY_^q(on{m( zCrCmk%hQc0RG>5(N^8fYj%h1rBgmt)tDP*!aVl-{Vl@dm3WLBn?O;PW9Tg-|(sHZO z-}o%nEU+^C?mI!Nn7oO}tz;vJqwqUsdmUW)l7e~!)Nk%D-S@BET)6g?@7-NoytR0v zppAg`b)=0M#X!zBFpv*(xQeE4pi|H+-j2RR%BHmu))5azX}3hnW!41L0u@5tJQ!y^ z^PocEs0^y)-L94S!U=R&h7_cK!@{H5+|p$hdPC*2{qd}OcJA~P&v?~6Gk5xQ)#-g| zH6g5aqd1&>7(RG3wZil{Su{G8tq+`#etF8;Hro2W;@<_=!Ve5RFpK+)2A9G z$iyn>H~k!wUx?Q5wP?qpU5lQUXs1N_ESVDP1B-8C^+$^U7)-F+w|NJvtHcMOF6alE zfzp^-?o*-07pY@?YMH6Lf4sjkCi|h=@jj{ACske`9q5y)FOVkaXA)E&pr4B8RcXG* z>>z~`fcHVXTYrykpstxbh%})5GRV!aT@%4JV_%>gX(uYs=`_>a>G{UsI{iK_{}6k$ zlcWY@0rC(&_!8HQU>A=JkmIQe*o<>oE8H$}xIsvzcL57<9*`U7LO%p>>DWkJ5S>dcrMKW3&h> zu+)Vt;Hf%;y(2+tc{8lKP!`7G=P)HbERuU726dOLuumnja-bONt zEibfIo^~@chUHwr01f4FtdRv+PDg2Cn5$UNH$h7d=`4}RgvC5WhO_nOwN&BRA z#5%!$BLYvBmXUM~P0O1kt34BtG92Nd_};EDnDj+-o-*CMa65VW$H*{HjT3Mx(rIo~ z=)^!Irx;{L~4UEJvu(@ZgBW4lUv0Ov>2N#J1-Xzw=(ZI9N zHx}sCtGa-1OC@S6%V$4h8Tfr=5;2V=AJK((63g-&0mbW-*|2?E%J>M4a3dJ1@GLgp zh5if3mVDGV7Gp!dhYmLC#czw_H*EI;I{t#uhR_kGn+h<9l2C0GHAb4KUg1%MTtKJq zS`Na%YLo%LhgX${i$PF{HeQ9CI zx%kPag^QpPYqVA4u~5W$oS+qOy7s)amH^BLz>6Z!4s$}S|4DC!hj_HpD&aleY(0eznr3t-Lw80^IkdvQ^QJT6mi zOD_9Qr{=&c$k=mh?*pvu|ag zbC}r{7)K(2>-iA%5-+l(bZFq+Je8==C)k~bs?CWa0P9~t>UlKa3T)&<(1mAk?uN^* z!f6DmLzpXE^FSzl7?Jq3>rH@hxq!l~(?P.+?)-(?P.*?)) + ((-(?P\d[^-]*?))?-(?P.+?)-(?P.+?)-(?P.+?) + \.whl|\.dist-info)$""", + re.VERBOSE + ) + + def __init__(self, filename): + # type: (str) -> None + """ + :raises InvalidWheelFilename: when the filename is invalid for a wheel + """ + wheel_info = self.wheel_file_re.match(filename) + if not wheel_info: + raise InvalidWheelFilename( + "%s is not a valid wheel filename." % filename + ) + self.filename = filename + self.name = wheel_info.group('name').replace('_', '-') + # we'll assume "_" means "-" due to wheel naming scheme + # (https://github.com/pypa/pip/issues/1150) + self.version = wheel_info.group('ver').replace('_', '-') + self.build_tag = wheel_info.group('build') + self.pyversions = wheel_info.group('pyver').split('.') + self.abis = wheel_info.group('abi').split('.') + self.plats = wheel_info.group('plat').split('.') + + # All the tag combinations from this file + self.file_tags = { + Tag(x, y, z) for x in self.pyversions + for y in self.abis for z in self.plats + } + + def get_formatted_file_tags(self): + # type: () -> List[str] + """Return the wheel's tags as a sorted list of strings.""" + return sorted(str(tag) for tag in self.file_tags) + + def support_index_min(self, tags): + # type: (List[Tag]) -> int + """Return the lowest index that one of the wheel's file_tag combinations + achieves in the given list of supported tags. + + For example, if there are 8 supported tags and one of the file tags + is first in the list, then return 0. + + :param tags: the PEP 425 tags to check the wheel against, in order + with most preferred first. + + :raises ValueError: If none of the wheel's file tags match one of + the supported tags. + """ + return min(tags.index(tag) for tag in self.file_tags if tag in tags) + + def supported(self, tags): + # type: (List[Tag]) -> bool + """Return whether the wheel is compatible with one of the given tags. + + :param tags: the PEP 425 tags to check the wheel against. + """ + return not self.file_tags.isdisjoint(tags) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/wheel.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/models/wheel.pyc new file mode 100644 index 0000000000000000000000000000000000000000..27527be7c7ffdb2cf9b33f93908de52d2e6d8e82 GIT binary patch literal 4245 zcmc&%S#ujj5bo95vL!pgNjO4Mq!ucGa(I=CB;^VYByo-cjB67DQI2J;9ZBn~cGo*2 zA1UXBq<|-=;vexp_!s#B@O7^w%Ou4E54Nls&rHuu_jG@K$bPl2y7A}dPny*K*!cei zn(mBtbbQK1HaXP`8a=I!=qNMFsqrdT4 ztXW`X_}%w{b}@MylRL>;5J%zn%=RX@@+AfJAgJFwSbE@JzrAq%E8qKWaq-ULt%5cN z+SidbW*h@K+r&UV%;6fEzJ*Rfvv@oD5-FQj##l!@7^fE{YLrSX% zF||CPLXEFeCkE6qQ+fa7U}Zw~L${LyQguM8yhfTDkgBhdrs)?FR8P^*#q+9kqt9#~ zh0}odKD=B1fNrR+xjcw8p!_Dt&9Pk*!8T)Gpd4u@D$wb)(%k9$#_&4*Auj(Id$g0J z24n&92tN1{*NkBoj|}7Amwr~<0G1Z`3KC=_)|VZw?11^@I9tBS$N8>Fv_oi`LEeGE zh#p_2=b~sB`NrcK+ZS4gxof!22 z``Lxo*)z*$&u?z7nH6KqrSt2ZGx)TV`n`GH%ejI9n#$u?BMY#cj?%<1SFxUNg0>veSsWQt#k$y%cWI9W@ZRFXd_eeP zzZRu?90R@gn8>FJ5!sasyRc}oW%qSzSR+1E9vR<%A7gzO9gQEf%9d@-lq%LS`L^L z#6Tpc7;SQ-6YUDCL73Bg(@}Kn1_#&;jKnaoxo@o^W)ax2TqF4h7l{Pk4A#Zbz_ZXd z7HIcXUBI`k619=#^A}kLeqWhHOe4uhbm1MtvOGsXv6nI%wr^V*AE6O$1Va^`#pXLd zcmdgxj|RqKZ0HZr!AAY~ZE^gD?OsF2UohGTI^uL)0R~YLs*R$?NE6jBJc^JD=nP!T zK^Rz$lEAS04dZpt>_o`Y9MmPwx1%*g{2{t}SyteUU*J}U$8I9@tBs(W#p<*ZNu`r3 zCqTRG=pBcoU>XsN#Su6U??S3*MY+5~L}2Epd6YPaNbCt`MmW!*x(d2-!<=kiT3B)} zocpYB5maK$j%q#?ia3uGv;&Tu5HoSo91(ZOm}`&q$aI`;3hpTPS}M=sTO!RU%YKTy zAH+SikmqSW=iF%_zr9)6g(MP1onp%lj$A43RFONR@9<&)%t-))z1U$dF3OOnWy)>I zW&i2a9GC?e+ivZBgthJ5#5NUg*=y&%39)uKH~U04N(#?rM=3JGCoDc%-`jb*`=Xlz z%(lQd5&>M#hp3l%ktL=5L+|FPM14NN?mSX$P8R`K{{~XuqXAc7BOie-JcDyLTy_~w zBTyZ|T;Zz!a?Jnh9@`i!;KDIgl5eC@NUx+QG75sE=50e@+g{i}ex?oL%x#uIbYHGb zvD}mBe4pz}-t(rLt{X({|-ZWxO&|SEO#zCa|9iVMb}4U z57XSug67kp%|AjJJ5tRWu3}`*pqO;kMpI>yD~eKZc*}4{&qT3y&1QzHJXWRTSifS5>c+d4Fz_?OCVP5hsSD|HVx-?UoLG@O)4%zuD9%7Ejp*9m=GjmD`JZ+vUcP32_Md)&^D&N49e80Rd{mYkkcSg z$+SdmG-?$G$t-JL!w!LS>9(9_)UpTSkw)-AS9BFB5n$(xR3Sp)K_2(Td9oV~H=}V~ zSGY&S=ke)hNL5%^g4aH$ASjH<-#@?N{JXLK#kEBhtT1qo2b?U8oDY1BUHbLq*U8eT Jw`MOSu|LMUNc{i+ literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/network/__init__.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/network/__init__.py new file mode 100644 index 0000000..b51bde9 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/network/__init__.py @@ -0,0 +1,2 @@ +"""Contains purely network-related utilities. +""" diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/network/__init__.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/network/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0b64463635f703a97a7db6020b66396b39d67afd GIT binary patch literal 266 zcmYL^L2kk@5Je3viX!z6Sw^bDKtW|gt4i!yP*yCkTPOwa+OC3S;uu`P*u{?yS4Gwy1&?1|IQ%lckaKk#BKGzb<~Atd08U I_CgZ70b+?rWB>pF literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/network/auth 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/network/auth 2.py new file mode 100644 index 0000000..1e1da54 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/network/auth 2.py @@ -0,0 +1,298 @@ +"""Network Authentication Helpers + +Contains interface (MultiDomainBasicAuth) and associated glue code for +providing credentials in the context of network requests. +""" + +# The following comment should be removed at some point in the future. +# mypy: disallow-untyped-defs=False + +import logging + +from pip._vendor.requests.auth import AuthBase, HTTPBasicAuth +from pip._vendor.requests.utils import get_netrc_auth +from pip._vendor.six.moves.urllib import parse as urllib_parse + +from pip._internal.utils.misc import ( + ask, + ask_input, + ask_password, + remove_auth_from_url, + split_auth_netloc_from_url, +) +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from optparse import Values + from typing import Dict, Optional, Tuple + + from pip._internal.vcs.versioncontrol import AuthInfo + + Credentials = Tuple[str, str, str] + +logger = logging.getLogger(__name__) + +try: + import keyring # noqa +except ImportError: + keyring = None +except Exception as exc: + logger.warning( + "Keyring is skipped due to an exception: %s", str(exc), + ) + keyring = None + + +def get_keyring_auth(url, username): + """Return the tuple auth for a given url from keyring.""" + if not url or not keyring: + return None + + try: + try: + get_credential = keyring.get_credential + except AttributeError: + pass + else: + logger.debug("Getting credentials from keyring for %s", url) + cred = get_credential(url, username) + if cred is not None: + return cred.username, cred.password + return None + + if username: + logger.debug("Getting password from keyring for %s", url) + password = keyring.get_password(url, username) + if password: + return username, password + + except Exception as exc: + logger.warning( + "Keyring is skipped due to an exception: %s", str(exc), + ) + + +class MultiDomainBasicAuth(AuthBase): + + def __init__(self, prompting=True, index_urls=None): + # type: (bool, Optional[Values]) -> None + self.prompting = prompting + self.index_urls = index_urls + self.passwords = {} # type: Dict[str, AuthInfo] + # When the user is prompted to enter credentials and keyring is + # available, we will offer to save them. If the user accepts, + # this value is set to the credentials they entered. After the + # request authenticates, the caller should call + # ``save_credentials`` to save these. + self._credentials_to_save = None # type: Optional[Credentials] + + def _get_index_url(self, url): + """Return the original index URL matching the requested URL. + + Cached or dynamically generated credentials may work against + the original index URL rather than just the netloc. + + The provided url should have had its username and password + removed already. If the original index url had credentials then + they will be included in the return value. + + Returns None if no matching index was found, or if --no-index + was specified by the user. + """ + if not url or not self.index_urls: + return None + + for u in self.index_urls: + prefix = remove_auth_from_url(u).rstrip("/") + "/" + if url.startswith(prefix): + return u + + def _get_new_credentials(self, original_url, allow_netrc=True, + allow_keyring=True): + """Find and return credentials for the specified URL.""" + # Split the credentials and netloc from the url. + url, netloc, url_user_password = split_auth_netloc_from_url( + original_url, + ) + + # Start with the credentials embedded in the url + username, password = url_user_password + if username is not None and password is not None: + logger.debug("Found credentials in url for %s", netloc) + return url_user_password + + # Find a matching index url for this request + index_url = self._get_index_url(url) + if index_url: + # Split the credentials from the url. + index_info = split_auth_netloc_from_url(index_url) + if index_info: + index_url, _, index_url_user_password = index_info + logger.debug("Found index url %s", index_url) + + # If an index URL was found, try its embedded credentials + if index_url and index_url_user_password[0] is not None: + username, password = index_url_user_password + if username is not None and password is not None: + logger.debug("Found credentials in index url for %s", netloc) + return index_url_user_password + + # Get creds from netrc if we still don't have them + if allow_netrc: + netrc_auth = get_netrc_auth(original_url) + if netrc_auth: + logger.debug("Found credentials in netrc for %s", netloc) + return netrc_auth + + # If we don't have a password and keyring is available, use it. + if allow_keyring: + # The index url is more specific than the netloc, so try it first + kr_auth = ( + get_keyring_auth(index_url, username) or + get_keyring_auth(netloc, username) + ) + if kr_auth: + logger.debug("Found credentials in keyring for %s", netloc) + return kr_auth + + return username, password + + def _get_url_and_credentials(self, original_url): + """Return the credentials to use for the provided URL. + + If allowed, netrc and keyring may be used to obtain the + correct credentials. + + Returns (url_without_credentials, username, password). Note + that even if the original URL contains credentials, this + function may return a different username and password. + """ + url, netloc, _ = split_auth_netloc_from_url(original_url) + + # Use any stored credentials that we have for this netloc + username, password = self.passwords.get(netloc, (None, None)) + + if username is None and password is None: + # No stored credentials. Acquire new credentials without prompting + # the user. (e.g. from netrc, keyring, or the URL itself) + username, password = self._get_new_credentials(original_url) + + if username is not None or password is not None: + # Convert the username and password if they're None, so that + # this netloc will show up as "cached" in the conditional above. + # Further, HTTPBasicAuth doesn't accept None, so it makes sense to + # cache the value that is going to be used. + username = username or "" + password = password or "" + + # Store any acquired credentials. + self.passwords[netloc] = (username, password) + + assert ( + # Credentials were found + (username is not None and password is not None) or + # Credentials were not found + (username is None and password is None) + ), "Could not load credentials from url: {}".format(original_url) + + return url, username, password + + def __call__(self, req): + # Get credentials for this request + url, username, password = self._get_url_and_credentials(req.url) + + # Set the url of the request to the url without any credentials + req.url = url + + if username is not None and password is not None: + # Send the basic auth with this request + req = HTTPBasicAuth(username, password)(req) + + # Attach a hook to handle 401 responses + req.register_hook("response", self.handle_401) + + return req + + # Factored out to allow for easy patching in tests + def _prompt_for_password(self, netloc): + username = ask_input("User for %s: " % netloc) + if not username: + return None, None + auth = get_keyring_auth(netloc, username) + if auth: + return auth[0], auth[1], False + password = ask_password("Password: ") + return username, password, True + + # Factored out to allow for easy patching in tests + def _should_save_password_to_keyring(self): + if not keyring: + return False + return ask("Save credentials to keyring [y/N]: ", ["y", "n"]) == "y" + + def handle_401(self, resp, **kwargs): + # We only care about 401 responses, anything else we want to just + # pass through the actual response + if resp.status_code != 401: + return resp + + # We are not able to prompt the user so simply return the response + if not self.prompting: + return resp + + parsed = urllib_parse.urlparse(resp.url) + + # Prompt the user for a new username and password + username, password, save = self._prompt_for_password(parsed.netloc) + + # Store the new username and password to use for future requests + self._credentials_to_save = None + if username is not None and password is not None: + self.passwords[parsed.netloc] = (username, password) + + # Prompt to save the password to keyring + if save and self._should_save_password_to_keyring(): + self._credentials_to_save = (parsed.netloc, username, password) + + # Consume content and release the original connection to allow our new + # request to reuse the same one. + resp.content + resp.raw.release_conn() + + # Add our new username and password to the request + req = HTTPBasicAuth(username or "", password or "")(resp.request) + req.register_hook("response", self.warn_on_401) + + # On successful request, save the credentials that were used to + # keyring. (Note that if the user responded "no" above, this member + # is not set and nothing will be saved.) + if self._credentials_to_save: + req.register_hook("response", self.save_credentials) + + # Send our new request + new_resp = resp.connection.send(req, **kwargs) + new_resp.history.append(resp) + + return new_resp + + def warn_on_401(self, resp, **kwargs): + """Response callback to warn about incorrect credentials.""" + if resp.status_code == 401: + logger.warning( + '401 Error, Credentials not correct for %s', resp.request.url, + ) + + def save_credentials(self, resp, **kwargs): + """Response callback to save credentials on success.""" + assert keyring is not None, "should never reach here without keyring" + if not keyring: + return + + creds = self._credentials_to_save + self._credentials_to_save = None + if creds and resp.status_code < 400: + try: + logger.info('Saving credentials to keyring') + keyring.set_password(*creds) + except Exception: + logger.exception('Failed to save credentials') diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/network/auth 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/network/auth 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dffc09af800052316fc3674a824ec8fa69f55a3c GIT binary patch literal 8985 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 D-Pde! literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/network/auth.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/network/auth.py new file mode 100644 index 0000000..1e1da54 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/network/auth.py @@ -0,0 +1,298 @@ +"""Network Authentication Helpers + +Contains interface (MultiDomainBasicAuth) and associated glue code for +providing credentials in the context of network requests. +""" + +# The following comment should be removed at some point in the future. +# mypy: disallow-untyped-defs=False + +import logging + +from pip._vendor.requests.auth import AuthBase, HTTPBasicAuth +from pip._vendor.requests.utils import get_netrc_auth +from pip._vendor.six.moves.urllib import parse as urllib_parse + +from pip._internal.utils.misc import ( + ask, + ask_input, + ask_password, + remove_auth_from_url, + split_auth_netloc_from_url, +) +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from optparse import Values + from typing import Dict, Optional, Tuple + + from pip._internal.vcs.versioncontrol import AuthInfo + + Credentials = Tuple[str, str, str] + +logger = logging.getLogger(__name__) + +try: + import keyring # noqa +except ImportError: + keyring = None +except Exception as exc: + logger.warning( + "Keyring is skipped due to an exception: %s", str(exc), + ) + keyring = None + + +def get_keyring_auth(url, username): + """Return the tuple auth for a given url from keyring.""" + if not url or not keyring: + return None + + try: + try: + get_credential = keyring.get_credential + except AttributeError: + pass + else: + logger.debug("Getting credentials from keyring for %s", url) + cred = get_credential(url, username) + if cred is not None: + return cred.username, cred.password + return None + + if username: + logger.debug("Getting password from keyring for %s", url) + password = keyring.get_password(url, username) + if password: + return username, password + + except Exception as exc: + logger.warning( + "Keyring is skipped due to an exception: %s", str(exc), + ) + + +class MultiDomainBasicAuth(AuthBase): + + def __init__(self, prompting=True, index_urls=None): + # type: (bool, Optional[Values]) -> None + self.prompting = prompting + self.index_urls = index_urls + self.passwords = {} # type: Dict[str, AuthInfo] + # When the user is prompted to enter credentials and keyring is + # available, we will offer to save them. If the user accepts, + # this value is set to the credentials they entered. After the + # request authenticates, the caller should call + # ``save_credentials`` to save these. + self._credentials_to_save = None # type: Optional[Credentials] + + def _get_index_url(self, url): + """Return the original index URL matching the requested URL. + + Cached or dynamically generated credentials may work against + the original index URL rather than just the netloc. + + The provided url should have had its username and password + removed already. If the original index url had credentials then + they will be included in the return value. + + Returns None if no matching index was found, or if --no-index + was specified by the user. + """ + if not url or not self.index_urls: + return None + + for u in self.index_urls: + prefix = remove_auth_from_url(u).rstrip("/") + "/" + if url.startswith(prefix): + return u + + def _get_new_credentials(self, original_url, allow_netrc=True, + allow_keyring=True): + """Find and return credentials for the specified URL.""" + # Split the credentials and netloc from the url. + url, netloc, url_user_password = split_auth_netloc_from_url( + original_url, + ) + + # Start with the credentials embedded in the url + username, password = url_user_password + if username is not None and password is not None: + logger.debug("Found credentials in url for %s", netloc) + return url_user_password + + # Find a matching index url for this request + index_url = self._get_index_url(url) + if index_url: + # Split the credentials from the url. + index_info = split_auth_netloc_from_url(index_url) + if index_info: + index_url, _, index_url_user_password = index_info + logger.debug("Found index url %s", index_url) + + # If an index URL was found, try its embedded credentials + if index_url and index_url_user_password[0] is not None: + username, password = index_url_user_password + if username is not None and password is not None: + logger.debug("Found credentials in index url for %s", netloc) + return index_url_user_password + + # Get creds from netrc if we still don't have them + if allow_netrc: + netrc_auth = get_netrc_auth(original_url) + if netrc_auth: + logger.debug("Found credentials in netrc for %s", netloc) + return netrc_auth + + # If we don't have a password and keyring is available, use it. + if allow_keyring: + # The index url is more specific than the netloc, so try it first + kr_auth = ( + get_keyring_auth(index_url, username) or + get_keyring_auth(netloc, username) + ) + if kr_auth: + logger.debug("Found credentials in keyring for %s", netloc) + return kr_auth + + return username, password + + def _get_url_and_credentials(self, original_url): + """Return the credentials to use for the provided URL. + + If allowed, netrc and keyring may be used to obtain the + correct credentials. + + Returns (url_without_credentials, username, password). Note + that even if the original URL contains credentials, this + function may return a different username and password. + """ + url, netloc, _ = split_auth_netloc_from_url(original_url) + + # Use any stored credentials that we have for this netloc + username, password = self.passwords.get(netloc, (None, None)) + + if username is None and password is None: + # No stored credentials. Acquire new credentials without prompting + # the user. (e.g. from netrc, keyring, or the URL itself) + username, password = self._get_new_credentials(original_url) + + if username is not None or password is not None: + # Convert the username and password if they're None, so that + # this netloc will show up as "cached" in the conditional above. + # Further, HTTPBasicAuth doesn't accept None, so it makes sense to + # cache the value that is going to be used. + username = username or "" + password = password or "" + + # Store any acquired credentials. + self.passwords[netloc] = (username, password) + + assert ( + # Credentials were found + (username is not None and password is not None) or + # Credentials were not found + (username is None and password is None) + ), "Could not load credentials from url: {}".format(original_url) + + return url, username, password + + def __call__(self, req): + # Get credentials for this request + url, username, password = self._get_url_and_credentials(req.url) + + # Set the url of the request to the url without any credentials + req.url = url + + if username is not None and password is not None: + # Send the basic auth with this request + req = HTTPBasicAuth(username, password)(req) + + # Attach a hook to handle 401 responses + req.register_hook("response", self.handle_401) + + return req + + # Factored out to allow for easy patching in tests + def _prompt_for_password(self, netloc): + username = ask_input("User for %s: " % netloc) + if not username: + return None, None + auth = get_keyring_auth(netloc, username) + if auth: + return auth[0], auth[1], False + password = ask_password("Password: ") + return username, password, True + + # Factored out to allow for easy patching in tests + def _should_save_password_to_keyring(self): + if not keyring: + return False + return ask("Save credentials to keyring [y/N]: ", ["y", "n"]) == "y" + + def handle_401(self, resp, **kwargs): + # We only care about 401 responses, anything else we want to just + # pass through the actual response + if resp.status_code != 401: + return resp + + # We are not able to prompt the user so simply return the response + if not self.prompting: + return resp + + parsed = urllib_parse.urlparse(resp.url) + + # Prompt the user for a new username and password + username, password, save = self._prompt_for_password(parsed.netloc) + + # Store the new username and password to use for future requests + self._credentials_to_save = None + if username is not None and password is not None: + self.passwords[parsed.netloc] = (username, password) + + # Prompt to save the password to keyring + if save and self._should_save_password_to_keyring(): + self._credentials_to_save = (parsed.netloc, username, password) + + # Consume content and release the original connection to allow our new + # request to reuse the same one. + resp.content + resp.raw.release_conn() + + # Add our new username and password to the request + req = HTTPBasicAuth(username or "", password or "")(resp.request) + req.register_hook("response", self.warn_on_401) + + # On successful request, save the credentials that were used to + # keyring. (Note that if the user responded "no" above, this member + # is not set and nothing will be saved.) + if self._credentials_to_save: + req.register_hook("response", self.save_credentials) + + # Send our new request + new_resp = resp.connection.send(req, **kwargs) + new_resp.history.append(resp) + + return new_resp + + def warn_on_401(self, resp, **kwargs): + """Response callback to warn about incorrect credentials.""" + if resp.status_code == 401: + logger.warning( + '401 Error, Credentials not correct for %s', resp.request.url, + ) + + def save_credentials(self, resp, **kwargs): + """Response callback to save credentials on success.""" + assert keyring is not None, "should never reach here without keyring" + if not keyring: + return + + creds = self._credentials_to_save + self._credentials_to_save = None + if creds and resp.status_code < 400: + try: + logger.info('Saving credentials to keyring') + keyring.set_password(*creds) + except Exception: + logger.exception('Failed to save credentials') diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/network/auth.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/network/auth.pyc new file mode 100644 index 0000000000000000000000000000000000000000..79e6c6a817f1bc936ccc0e51b07aaef78a5390a8 GIT binary patch literal 8985 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 Cv1n`n literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/network/cache 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/network/cache 2.py new file mode 100644 index 0000000..c9386e1 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/network/cache 2.py @@ -0,0 +1,81 @@ +"""HTTP cache implementation. +""" + +# The following comment should be removed at some point in the future. +# mypy: disallow-untyped-defs=False + +import os +from contextlib import contextmanager + +from pip._vendor.cachecontrol.cache import BaseCache +from pip._vendor.cachecontrol.caches import FileCache +from pip._vendor.requests.models import Response + +from pip._internal.utils.filesystem import adjacent_tmp_file, replace +from pip._internal.utils.misc import ensure_dir +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Optional + + +def is_from_cache(response): + # type: (Response) -> bool + return getattr(response, "from_cache", False) + + +@contextmanager +def suppressed_cache_errors(): + """If we can't access the cache then we can just skip caching and process + requests as if caching wasn't enabled. + """ + try: + yield + except (OSError, IOError): + pass + + +class SafeFileCache(BaseCache): + """ + A file based cache which is safe to use even when the target directory may + not be accessible or writable. + """ + + def __init__(self, directory): + # type: (str) -> None + assert directory is not None, "Cache directory must not be None." + super(SafeFileCache, self).__init__() + self.directory = directory + + def _get_cache_path(self, name): + # type: (str) -> str + # From cachecontrol.caches.file_cache.FileCache._fn, brought into our + # class for backwards-compatibility and to avoid using a non-public + # method. + hashed = FileCache.encode(name) + parts = list(hashed[:5]) + [hashed] + return os.path.join(self.directory, *parts) + + def get(self, key): + # type: (str) -> Optional[bytes] + path = self._get_cache_path(key) + with suppressed_cache_errors(): + with open(path, 'rb') as f: + return f.read() + + def set(self, key, value): + # type: (str, bytes) -> None + path = self._get_cache_path(key) + with suppressed_cache_errors(): + ensure_dir(os.path.dirname(path)) + + with adjacent_tmp_file(path) as f: + f.write(value) + + replace(f.name, path) + + def delete(self, key): + # type: (str) -> None + path = self._get_cache_path(key) + with suppressed_cache_errors(): + os.remove(path) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/network/cache 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/network/cache 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3d4baa57c97e6b157ae6e69d34fa3a1b364cd534 GIT binary patch literal 3751 zcmc&$+j1L45ba%EY{}QyNt}WL77B=pB2q%Af+_+`fj{AuXFi1wfIhvtIC-@1Ldh!iR!i$L#cPzTQ*XT-Hz?kqWRrTEWT{Om{*b+!6kniZi+WpRrR>@Y z{l-3Sld4d-3jK`Tyh!01sT%d!xpgrTJ?mXU6#K0W1otM3?;bsR=mdUnsGKOtW0k1X z_$JEIb~E~yKi!tav&=e+AWMz<*(84I4^&aw8*IPhYqg6N=BB$*eBQLovs|U~EY+%I zW4#M3{BY<8yq#x~-0Sl%%o1A*mB(x@*J`psrFv8-FN`KzZn5qDvxm>T-S75xzxUk7 z-R`~ax8;0n^dN`(ejLDYJXL;n`O%v!4AH41(^zy?VI<&A*I=W5ktLo$QThmP28z)z zg{iTA*N@qKfdl&#(|}l~7KG+pP$w^bCMND9dWar zkIfoy8EJ3s`(-$Spva!lxy~aD^i>w)1~~Mi^(5V)D#O7*^ldt7Qt=*HmX%ucl;4-Y z=wtrDy}omzm?P;`BMO=WEPF_31kv5J#igI}ur31%LLnkjX{HE#fr%=yF zN*nF?+KKwJX(ztM;wtqIVimS!YImN52m5rKHJ7w4N)q^IOEcpfs7d-G&XSWA&Pfp&WUNeB0Mg;9@UzR0{+z|Bgmcs&eFaS8 zptv{vYLT(YR8Wd%HVvzE#-++rdF*j`G_6bhF4mInbj~NxY~oNiOI2G!H&vdBq4cWT zoRb25pkxlpmvf~G7mddtH69mLWIWHHh0PW(Nr$Dhiu*2#X`w80FR=$7!yTlT>?=$r z0U9pOfWE~8uH+#DDEPi$aBVsj4mpfBYXggRUQ~cNqdlwv>0zBtEA;!c*1HiMQMo?oN`eYVo&`<$s&ioK2)Lf(A+PKUMQjl zN1w+mpHwWu_=HU*z_kr)XAUr^Axz$51&9fs8BhSsNE5xhO4bZ&rt-@R#3(bY!wO#S zKM9F`cv?zUr^gLoEDl$UrkJQ-3nax}CX|-4s;SYm| zrd4)2d&6p4TULMNq9q!@ zci*2*Irig`k|o>^FomDR9sNLBD{}{5tMEipaGB+{Ej(*Vt8Jd1)e9Zw+#D3wz?ldpcT)96Kw%^4>`r)l;pi$t=o-yqtRGuth8`q zxg7{e6T+L^+vDiK))Pk#iS!<+2^%7O?m<3KMUY-1`bgf<{#J+N!l_Z(96kUlv)nwkwU=#>#*9t#YjZ literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/network/cache.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/network/cache.py new file mode 100644 index 0000000..c9386e1 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/network/cache.py @@ -0,0 +1,81 @@ +"""HTTP cache implementation. +""" + +# The following comment should be removed at some point in the future. +# mypy: disallow-untyped-defs=False + +import os +from contextlib import contextmanager + +from pip._vendor.cachecontrol.cache import BaseCache +from pip._vendor.cachecontrol.caches import FileCache +from pip._vendor.requests.models import Response + +from pip._internal.utils.filesystem import adjacent_tmp_file, replace +from pip._internal.utils.misc import ensure_dir +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Optional + + +def is_from_cache(response): + # type: (Response) -> bool + return getattr(response, "from_cache", False) + + +@contextmanager +def suppressed_cache_errors(): + """If we can't access the cache then we can just skip caching and process + requests as if caching wasn't enabled. + """ + try: + yield + except (OSError, IOError): + pass + + +class SafeFileCache(BaseCache): + """ + A file based cache which is safe to use even when the target directory may + not be accessible or writable. + """ + + def __init__(self, directory): + # type: (str) -> None + assert directory is not None, "Cache directory must not be None." + super(SafeFileCache, self).__init__() + self.directory = directory + + def _get_cache_path(self, name): + # type: (str) -> str + # From cachecontrol.caches.file_cache.FileCache._fn, brought into our + # class for backwards-compatibility and to avoid using a non-public + # method. + hashed = FileCache.encode(name) + parts = list(hashed[:5]) + [hashed] + return os.path.join(self.directory, *parts) + + def get(self, key): + # type: (str) -> Optional[bytes] + path = self._get_cache_path(key) + with suppressed_cache_errors(): + with open(path, 'rb') as f: + return f.read() + + def set(self, key, value): + # type: (str, bytes) -> None + path = self._get_cache_path(key) + with suppressed_cache_errors(): + ensure_dir(os.path.dirname(path)) + + with adjacent_tmp_file(path) as f: + f.write(value) + + replace(f.name, path) + + def delete(self, key): + # type: (str) -> None + path = self._get_cache_path(key) + with suppressed_cache_errors(): + os.remove(path) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/network/cache.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/network/cache.pyc new file mode 100644 index 0000000000000000000000000000000000000000..33fd8eafe64be0f7beaa54f7d675927977db8cdd GIT binary patch literal 3751 zcmc&$+j1L45ba&vEcqHciBnL(LIF`xM9PICR1qi=S3*)$l&}sY(F0rS-I2ZW-m){Y zBg%QfJW`c!;8XYpK7|i}KE1j)dErsAx7E`-n(01$x@Ri?thQeM_02BqWQ_`S*qa4>MUZSK){bo6C zP~4(qnfl9=tWbZYv@TJ+O351a*UE8|;&n6C=^{{sly_+g?X-@3Of6XE(ZBrZwJn}y)>s5tYSc@U_^H3IiqhU>`yF4a9jq`n-HYP0rX`-`DxGJkR&5*W zonzsLLqFi{Jd@6F*k1=~WwJiRR@Azrxg5v>cvQD zqa9y6(O@?1*wTw=gb4G!jd?i zf}>Jc8XTco#cEnxmZWLdAE;Sj%yI)h-N8~{vrt^dT&^r_Bnef`C2fmRMbCkyhGqk$ zPGL=y2D!U!Bv~J`5cqC8s3>QTYcrgr>i8fE4xC6knjLXW=8Uv*)DiNBBqFEAFPQNT z*P04UR*ap*AIoxSW}H1WNq@vyau{e=%4x6MefoU8R z_om-0GB%kCO7YaDVUPYCO%2P3vUUi#u zQlJl%%t85bu2kWo@ff7WF zXt1M7gDg~nZ5(OCs}f~e#<_0}L>XpLS|SCfT-1fwQ$JC%$bqj9R46?(_Y0#Jim1WS z=P}DC6^k&gv#A8Qwr*|D0R}aM$#+=+V!~$z6aX{QM6WNCHG`U|{Q4X*$_(qUg4erG zL!uv_m6FxzaRV5Oy|&=xuV^+CiJzKH4GsSUZ1B|RXSnDHb7#w zSS6NR!mu`Fo;|e+!T_h&#`dlQ0cc%t*?k8>00hao=D|=GU<)_V&Xfz^-S=3uMFaTm z$I~fCemqjLg!>7m@Uyt1A4qFu?%-<$o=6HVvfQ$zM_>X1mo!{u<&8AVD9o2grZ5xs z4TR5N353pI2^giW3zcL?s*P==>IEl3XR*K_=1}o{QaxmC(m6rT_7Yr&@I2(6yFYm1 zc}W(IVhlkH&kM7_^Q85bVSmb2_cI8z;(2hQE#U4Urx=`)yw|IByIF5Gn~mmj8z+|A zg^)BMyve;ij`mz0k$Im5-z+;GAN^rgbOM~Om{eqOIdD-!=7ay8r^|x^C3SYe=`F9r zu&P+QAjo{z>0P!nGEuBMxTff_HY$-yl=?H5rYpWRIf-;2wQLZb?D^IVGtT+q=^~H9 x(a9J&cX3xP+W~F?i%+94@m9&bZ*e4OL{+b?SR3|+#eeoik#%dU(yXm7{|8GbZ_EGy literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/network/download 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/network/download 2.py new file mode 100644 index 0000000..c90c4bf --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/network/download 2.py @@ -0,0 +1,200 @@ +"""Download files with progress indicators. +""" +import cgi +import logging +import mimetypes +import os + +from pip._vendor import requests +from pip._vendor.requests.models import CONTENT_CHUNK_SIZE + +from pip._internal.models.index import PyPI +from pip._internal.network.cache import is_from_cache +from pip._internal.network.utils import response_chunks +from pip._internal.utils.misc import ( + format_size, + redact_auth_from_url, + splitext, +) +from pip._internal.utils.typing import MYPY_CHECK_RUNNING +from pip._internal.utils.ui import DownloadProgressProvider + +if MYPY_CHECK_RUNNING: + from typing import Iterable, Optional + + from pip._vendor.requests.models import Response + + from pip._internal.models.link import Link + from pip._internal.network.session import PipSession + +logger = logging.getLogger(__name__) + + +def _get_http_response_size(resp): + # type: (Response) -> Optional[int] + try: + return int(resp.headers['content-length']) + except (ValueError, KeyError, TypeError): + return None + + +def _prepare_download( + resp, # type: Response + link, # type: Link + progress_bar # type: str +): + # type: (...) -> Iterable[bytes] + total_length = _get_http_response_size(resp) + + if link.netloc == PyPI.file_storage_domain: + url = link.show_url + else: + url = link.url_without_fragment + + logged_url = redact_auth_from_url(url) + + if total_length: + logged_url = '{} ({})'.format(logged_url, format_size(total_length)) + + if is_from_cache(resp): + logger.info("Using cached %s", logged_url) + else: + logger.info("Downloading %s", logged_url) + + if logger.getEffectiveLevel() > logging.INFO: + show_progress = False + elif is_from_cache(resp): + show_progress = False + elif not total_length: + show_progress = True + elif total_length > (40 * 1000): + show_progress = True + else: + show_progress = False + + chunks = response_chunks(resp, CONTENT_CHUNK_SIZE) + + if not show_progress: + return chunks + + return DownloadProgressProvider( + progress_bar, max=total_length + )(chunks) + + +def sanitize_content_filename(filename): + # type: (str) -> str + """ + Sanitize the "filename" value from a Content-Disposition header. + """ + return os.path.basename(filename) + + +def parse_content_disposition(content_disposition, default_filename): + # type: (str, str) -> str + """ + Parse the "filename" value from a Content-Disposition header, and + return the default filename if the result is empty. + """ + _type, params = cgi.parse_header(content_disposition) + filename = params.get('filename') + if filename: + # We need to sanitize the filename to prevent directory traversal + # in case the filename contains ".." path parts. + filename = sanitize_content_filename(filename) + return filename or default_filename + + +def _get_http_response_filename(resp, link): + # type: (Response, Link) -> str + """Get an ideal filename from the given HTTP response, falling back to + the link filename if not provided. + """ + filename = link.filename # fallback + # Have a look at the Content-Disposition header for a better guess + content_disposition = resp.headers.get('content-disposition') + if content_disposition: + filename = parse_content_disposition(content_disposition, filename) + ext = splitext(filename)[1] # type: Optional[str] + if not ext: + ext = mimetypes.guess_extension( + resp.headers.get('content-type', '') + ) + if ext: + filename += ext + if not ext and link.url != resp.url: + ext = os.path.splitext(resp.url)[1] + if ext: + filename += ext + return filename + + +def _http_get_download(session, link): + # type: (PipSession, Link) -> Response + target_url = link.url.split('#', 1)[0] + resp = session.get( + target_url, + # We use Accept-Encoding: identity here because requests + # defaults to accepting compressed responses. This breaks in + # a variety of ways depending on how the server is configured. + # - Some servers will notice that the file isn't a compressible + # file and will leave the file alone and with an empty + # Content-Encoding + # - Some servers will notice that the file is already + # compressed and will leave the file alone and will add a + # Content-Encoding: gzip header + # - Some servers won't notice anything at all and will take + # a file that's already been compressed and compress it again + # and set the Content-Encoding: gzip header + # By setting this to request only the identity encoding We're + # hoping to eliminate the third case. Hopefully there does not + # exist a server which when given a file will notice it is + # already compressed and that you're not asking for a + # compressed file and will then decompress it before sending + # because if that's the case I don't think it'll ever be + # possible to make this work. + headers={"Accept-Encoding": "identity"}, + stream=True, + ) + resp.raise_for_status() + return resp + + +class Download(object): + def __init__( + self, + response, # type: Response + filename, # type: str + chunks, # type: Iterable[bytes] + ): + # type: (...) -> None + self.response = response + self.filename = filename + self.chunks = chunks + + +class Downloader(object): + def __init__( + self, + session, # type: PipSession + progress_bar, # type: str + ): + # type: (...) -> None + self._session = session + self._progress_bar = progress_bar + + def __call__(self, link): + # type: (Link) -> Download + try: + resp = _http_get_download(self._session, link) + except requests.HTTPError as e: + logger.critical( + "HTTP error %s while getting %s", e.response.status_code, link + ) + raise + + return Download( + resp, + _get_http_response_filename(resp, link), + _prepare_download(resp, link, self._progress_bar), + ) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/network/download 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/network/download 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8c370f4f9e02f6278e2b838b5b470d8b893647ea GIT binary patch literal 6255 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 literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/network/download.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/network/download.py new file mode 100644 index 0000000..c90c4bf --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/network/download.py @@ -0,0 +1,200 @@ +"""Download files with progress indicators. +""" +import cgi +import logging +import mimetypes +import os + +from pip._vendor import requests +from pip._vendor.requests.models import CONTENT_CHUNK_SIZE + +from pip._internal.models.index import PyPI +from pip._internal.network.cache import is_from_cache +from pip._internal.network.utils import response_chunks +from pip._internal.utils.misc import ( + format_size, + redact_auth_from_url, + splitext, +) +from pip._internal.utils.typing import MYPY_CHECK_RUNNING +from pip._internal.utils.ui import DownloadProgressProvider + +if MYPY_CHECK_RUNNING: + from typing import Iterable, Optional + + from pip._vendor.requests.models import Response + + from pip._internal.models.link import Link + from pip._internal.network.session import PipSession + +logger = logging.getLogger(__name__) + + +def _get_http_response_size(resp): + # type: (Response) -> Optional[int] + try: + return int(resp.headers['content-length']) + except (ValueError, KeyError, TypeError): + return None + + +def _prepare_download( + resp, # type: Response + link, # type: Link + progress_bar # type: str +): + # type: (...) -> Iterable[bytes] + total_length = _get_http_response_size(resp) + + if link.netloc == PyPI.file_storage_domain: + url = link.show_url + else: + url = link.url_without_fragment + + logged_url = redact_auth_from_url(url) + + if total_length: + logged_url = '{} ({})'.format(logged_url, format_size(total_length)) + + if is_from_cache(resp): + logger.info("Using cached %s", logged_url) + else: + logger.info("Downloading %s", logged_url) + + if logger.getEffectiveLevel() > logging.INFO: + show_progress = False + elif is_from_cache(resp): + show_progress = False + elif not total_length: + show_progress = True + elif total_length > (40 * 1000): + show_progress = True + else: + show_progress = False + + chunks = response_chunks(resp, CONTENT_CHUNK_SIZE) + + if not show_progress: + return chunks + + return DownloadProgressProvider( + progress_bar, max=total_length + )(chunks) + + +def sanitize_content_filename(filename): + # type: (str) -> str + """ + Sanitize the "filename" value from a Content-Disposition header. + """ + return os.path.basename(filename) + + +def parse_content_disposition(content_disposition, default_filename): + # type: (str, str) -> str + """ + Parse the "filename" value from a Content-Disposition header, and + return the default filename if the result is empty. + """ + _type, params = cgi.parse_header(content_disposition) + filename = params.get('filename') + if filename: + # We need to sanitize the filename to prevent directory traversal + # in case the filename contains ".." path parts. + filename = sanitize_content_filename(filename) + return filename or default_filename + + +def _get_http_response_filename(resp, link): + # type: (Response, Link) -> str + """Get an ideal filename from the given HTTP response, falling back to + the link filename if not provided. + """ + filename = link.filename # fallback + # Have a look at the Content-Disposition header for a better guess + content_disposition = resp.headers.get('content-disposition') + if content_disposition: + filename = parse_content_disposition(content_disposition, filename) + ext = splitext(filename)[1] # type: Optional[str] + if not ext: + ext = mimetypes.guess_extension( + resp.headers.get('content-type', '') + ) + if ext: + filename += ext + if not ext and link.url != resp.url: + ext = os.path.splitext(resp.url)[1] + if ext: + filename += ext + return filename + + +def _http_get_download(session, link): + # type: (PipSession, Link) -> Response + target_url = link.url.split('#', 1)[0] + resp = session.get( + target_url, + # We use Accept-Encoding: identity here because requests + # defaults to accepting compressed responses. This breaks in + # a variety of ways depending on how the server is configured. + # - Some servers will notice that the file isn't a compressible + # file and will leave the file alone and with an empty + # Content-Encoding + # - Some servers will notice that the file is already + # compressed and will leave the file alone and will add a + # Content-Encoding: gzip header + # - Some servers won't notice anything at all and will take + # a file that's already been compressed and compress it again + # and set the Content-Encoding: gzip header + # By setting this to request only the identity encoding We're + # hoping to eliminate the third case. Hopefully there does not + # exist a server which when given a file will notice it is + # already compressed and that you're not asking for a + # compressed file and will then decompress it before sending + # because if that's the case I don't think it'll ever be + # possible to make this work. + headers={"Accept-Encoding": "identity"}, + stream=True, + ) + resp.raise_for_status() + return resp + + +class Download(object): + def __init__( + self, + response, # type: Response + filename, # type: str + chunks, # type: Iterable[bytes] + ): + # type: (...) -> None + self.response = response + self.filename = filename + self.chunks = chunks + + +class Downloader(object): + def __init__( + self, + session, # type: PipSession + progress_bar, # type: str + ): + # type: (...) -> None + self._session = session + self._progress_bar = progress_bar + + def __call__(self, link): + # type: (Link) -> Download + try: + resp = _http_get_download(self._session, link) + except requests.HTTPError as e: + logger.critical( + "HTTP error %s while getting %s", e.response.status_code, link + ) + raise + + return Download( + resp, + _get_http_response_filename(resp, link), + _prepare_download(resp, link, self._progress_bar), + ) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/network/download.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/network/download.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ad11da653c4c7b2410115f72c035e1170737b3d5 GIT binary patch literal 6255 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 literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/network/session 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/network/session 2.py new file mode 100644 index 0000000..f5eb15e --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/network/session 2.py @@ -0,0 +1,405 @@ +"""PipSession and supporting code, containing all pip-specific +network request configuration and behavior. +""" + +# The following comment should be removed at some point in the future. +# mypy: disallow-untyped-defs=False + +import email.utils +import json +import logging +import mimetypes +import os +import platform +import sys +import warnings + +from pip._vendor import requests, six, urllib3 +from pip._vendor.cachecontrol import CacheControlAdapter +from pip._vendor.requests.adapters import BaseAdapter, HTTPAdapter +from pip._vendor.requests.models import Response +from pip._vendor.requests.structures import CaseInsensitiveDict +from pip._vendor.six.moves.urllib import parse as urllib_parse +from pip._vendor.urllib3.exceptions import InsecureRequestWarning + +from pip import __version__ +from pip._internal.network.auth import MultiDomainBasicAuth +from pip._internal.network.cache import SafeFileCache +# Import ssl from compat so the initial import occurs in only one place. +from pip._internal.utils.compat import has_tls, ipaddress +from pip._internal.utils.glibc import libc_ver +from pip._internal.utils.misc import ( + build_url_from_netloc, + get_installed_version, + parse_netloc, +) +from pip._internal.utils.typing import MYPY_CHECK_RUNNING +from pip._internal.utils.urls import url_to_path + +if MYPY_CHECK_RUNNING: + from typing import ( + Iterator, List, Optional, Tuple, Union, + ) + + from pip._internal.models.link import Link + + SecureOrigin = Tuple[str, str, Optional[Union[int, str]]] + + +logger = logging.getLogger(__name__) + + +# Ignore warning raised when using --trusted-host. +warnings.filterwarnings("ignore", category=InsecureRequestWarning) + + +SECURE_ORIGINS = [ + # protocol, hostname, port + # Taken from Chrome's list of secure origins (See: http://bit.ly/1qrySKC) + ("https", "*", "*"), + ("*", "localhost", "*"), + ("*", "127.0.0.0/8", "*"), + ("*", "::1/128", "*"), + ("file", "*", None), + # ssh is always secure. + ("ssh", "*", "*"), +] # type: List[SecureOrigin] + + +# These are environment variables present when running under various +# CI systems. For each variable, some CI systems that use the variable +# are indicated. The collection was chosen so that for each of a number +# of popular systems, at least one of the environment variables is used. +# This list is used to provide some indication of and lower bound for +# CI traffic to PyPI. Thus, it is okay if the list is not comprehensive. +# For more background, see: https://github.com/pypa/pip/issues/5499 +CI_ENVIRONMENT_VARIABLES = ( + # Azure Pipelines + 'BUILD_BUILDID', + # Jenkins + 'BUILD_ID', + # AppVeyor, CircleCI, Codeship, Gitlab CI, Shippable, Travis CI + 'CI', + # Explicit environment variable. + 'PIP_IS_CI', +) + + +def looks_like_ci(): + # type: () -> bool + """ + Return whether it looks like pip is running under CI. + """ + # We don't use the method of checking for a tty (e.g. using isatty()) + # because some CI systems mimic a tty (e.g. Travis CI). Thus that + # method doesn't provide definitive information in either direction. + return any(name in os.environ for name in CI_ENVIRONMENT_VARIABLES) + + +def user_agent(): + """ + Return a string representing the user agent. + """ + data = { + "installer": {"name": "pip", "version": __version__}, + "python": platform.python_version(), + "implementation": { + "name": platform.python_implementation(), + }, + } + + if data["implementation"]["name"] == 'CPython': + data["implementation"]["version"] = platform.python_version() + elif data["implementation"]["name"] == 'PyPy': + if sys.pypy_version_info.releaselevel == 'final': + pypy_version_info = sys.pypy_version_info[:3] + else: + pypy_version_info = sys.pypy_version_info + data["implementation"]["version"] = ".".join( + [str(x) for x in pypy_version_info] + ) + elif data["implementation"]["name"] == 'Jython': + # Complete Guess + data["implementation"]["version"] = platform.python_version() + elif data["implementation"]["name"] == 'IronPython': + # Complete Guess + data["implementation"]["version"] = platform.python_version() + + if sys.platform.startswith("linux"): + from pip._vendor import distro + distro_infos = dict(filter( + lambda x: x[1], + zip(["name", "version", "id"], distro.linux_distribution()), + )) + libc = dict(filter( + lambda x: x[1], + zip(["lib", "version"], libc_ver()), + )) + if libc: + distro_infos["libc"] = libc + if distro_infos: + data["distro"] = distro_infos + + if sys.platform.startswith("darwin") and platform.mac_ver()[0]: + data["distro"] = {"name": "macOS", "version": platform.mac_ver()[0]} + + if platform.system(): + data.setdefault("system", {})["name"] = platform.system() + + if platform.release(): + data.setdefault("system", {})["release"] = platform.release() + + if platform.machine(): + data["cpu"] = platform.machine() + + if has_tls(): + import _ssl as ssl + data["openssl_version"] = ssl.OPENSSL_VERSION + + setuptools_version = get_installed_version("setuptools") + if setuptools_version is not None: + data["setuptools_version"] = setuptools_version + + # Use None rather than False so as not to give the impression that + # pip knows it is not being run under CI. Rather, it is a null or + # inconclusive result. Also, we include some value rather than no + # value to make it easier to know that the check has been run. + data["ci"] = True if looks_like_ci() else None + + user_data = os.environ.get("PIP_USER_AGENT_USER_DATA") + if user_data is not None: + data["user_data"] = user_data + + return "{data[installer][name]}/{data[installer][version]} {json}".format( + data=data, + json=json.dumps(data, separators=(",", ":"), sort_keys=True), + ) + + +class LocalFSAdapter(BaseAdapter): + + def send(self, request, stream=None, timeout=None, verify=None, cert=None, + proxies=None): + pathname = url_to_path(request.url) + + resp = Response() + resp.status_code = 200 + resp.url = request.url + + try: + stats = os.stat(pathname) + except OSError as exc: + resp.status_code = 404 + resp.raw = exc + else: + modified = email.utils.formatdate(stats.st_mtime, usegmt=True) + content_type = mimetypes.guess_type(pathname)[0] or "text/plain" + resp.headers = CaseInsensitiveDict({ + "Content-Type": content_type, + "Content-Length": stats.st_size, + "Last-Modified": modified, + }) + + resp.raw = open(pathname, "rb") + resp.close = resp.raw.close + + return resp + + def close(self): + pass + + +class InsecureHTTPAdapter(HTTPAdapter): + + def cert_verify(self, conn, url, verify, cert): + super(InsecureHTTPAdapter, self).cert_verify( + conn=conn, url=url, verify=False, cert=cert + ) + + +class PipSession(requests.Session): + + timeout = None # type: Optional[int] + + def __init__(self, *args, **kwargs): + """ + :param trusted_hosts: Domains not to emit warnings for when not using + HTTPS. + """ + retries = kwargs.pop("retries", 0) + cache = kwargs.pop("cache", None) + trusted_hosts = kwargs.pop("trusted_hosts", []) # type: List[str] + index_urls = kwargs.pop("index_urls", None) + + super(PipSession, self).__init__(*args, **kwargs) + + # Namespace the attribute with "pip_" just in case to prevent + # possible conflicts with the base class. + self.pip_trusted_origins = [] # type: List[Tuple[str, Optional[int]]] + + # Attach our User Agent to the request + self.headers["User-Agent"] = user_agent() + + # Attach our Authentication handler to the session + self.auth = MultiDomainBasicAuth(index_urls=index_urls) + + # Create our urllib3.Retry instance which will allow us to customize + # how we handle retries. + retries = urllib3.Retry( + # Set the total number of retries that a particular request can + # have. + total=retries, + + # A 503 error from PyPI typically means that the Fastly -> Origin + # connection got interrupted in some way. A 503 error in general + # is typically considered a transient error so we'll go ahead and + # retry it. + # A 500 may indicate transient error in Amazon S3 + # A 520 or 527 - may indicate transient error in CloudFlare + status_forcelist=[500, 503, 520, 527], + + # Add a small amount of back off between failed requests in + # order to prevent hammering the service. + backoff_factor=0.25, + ) + + # We want to _only_ cache responses on securely fetched origins. We do + # this because we can't validate the response of an insecurely fetched + # origin, and we don't want someone to be able to poison the cache and + # require manual eviction from the cache to fix it. + if cache: + secure_adapter = CacheControlAdapter( + cache=SafeFileCache(cache), + max_retries=retries, + ) + else: + secure_adapter = HTTPAdapter(max_retries=retries) + + # Our Insecure HTTPAdapter disables HTTPS validation. It does not + # support caching (see above) so we'll use it for all http:// URLs as + # well as any https:// host that we've marked as ignoring TLS errors + # for. + insecure_adapter = InsecureHTTPAdapter(max_retries=retries) + # Save this for later use in add_insecure_host(). + self._insecure_adapter = insecure_adapter + + self.mount("https://", secure_adapter) + self.mount("http://", insecure_adapter) + + # Enable file:// urls + self.mount("file://", LocalFSAdapter()) + + for host in trusted_hosts: + self.add_trusted_host(host, suppress_logging=True) + + def add_trusted_host(self, host, source=None, suppress_logging=False): + # type: (str, Optional[str], bool) -> None + """ + :param host: It is okay to provide a host that has previously been + added. + :param source: An optional source string, for logging where the host + string came from. + """ + if not suppress_logging: + msg = 'adding trusted host: {!r}'.format(host) + if source is not None: + msg += ' (from {})'.format(source) + logger.info(msg) + + host_port = parse_netloc(host) + if host_port not in self.pip_trusted_origins: + self.pip_trusted_origins.append(host_port) + + self.mount(build_url_from_netloc(host) + '/', self._insecure_adapter) + if not host_port[1]: + # Mount wildcard ports for the same host. + self.mount( + build_url_from_netloc(host) + ':', + self._insecure_adapter + ) + + def iter_secure_origins(self): + # type: () -> Iterator[SecureOrigin] + for secure_origin in SECURE_ORIGINS: + yield secure_origin + for host, port in self.pip_trusted_origins: + yield ('*', host, '*' if port is None else port) + + def is_secure_origin(self, location): + # type: (Link) -> bool + # Determine if this url used a secure transport mechanism + parsed = urllib_parse.urlparse(str(location)) + origin_protocol, origin_host, origin_port = ( + parsed.scheme, parsed.hostname, parsed.port, + ) + + # The protocol to use to see if the protocol matches. + # Don't count the repository type as part of the protocol: in + # cases such as "git+ssh", only use "ssh". (I.e., Only verify against + # the last scheme.) + origin_protocol = origin_protocol.rsplit('+', 1)[-1] + + # Determine if our origin is a secure origin by looking through our + # hardcoded list of secure origins, as well as any additional ones + # configured on this PackageFinder instance. + for secure_origin in self.iter_secure_origins(): + secure_protocol, secure_host, secure_port = secure_origin + if origin_protocol != secure_protocol and secure_protocol != "*": + continue + + try: + addr = ipaddress.ip_address( + None + if origin_host is None + else six.ensure_text(origin_host) + ) + network = ipaddress.ip_network( + six.ensure_text(secure_host) + ) + except ValueError: + # We don't have both a valid address or a valid network, so + # we'll check this origin against hostnames. + if ( + origin_host and + origin_host.lower() != secure_host.lower() and + secure_host != "*" + ): + continue + else: + # We have a valid address and network, so see if the address + # is contained within the network. + if addr not in network: + continue + + # Check to see if the port matches. + if ( + origin_port != secure_port and + secure_port != "*" and + secure_port is not None + ): + continue + + # If we've gotten here, then this origin matches the current + # secure origin and we should return True + return True + + # If we've gotten to this point, then the origin isn't secure and we + # will not accept it as a valid location to search. We will however + # log a warning that we are ignoring it. + logger.warning( + "The repository located at %s is not a trusted or secure host and " + "is being ignored. If this repository is available via HTTPS we " + "recommend you use HTTPS instead, otherwise you may silence " + "this warning and allow it anyway with '--trusted-host %s'.", + origin_host, + origin_host, + ) + + return False + + def request(self, method, url, *args, **kwargs): + # Allow setting a default timeout on a session + kwargs.setdefault("timeout", self.timeout) + + # Dispatch the actual request + return super(PipSession, self).request(method, url, *args, **kwargs) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/network/session 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/network/session 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8a4fb830b5038a0b344f32f8abbed4e89ba41d60 GIT binary patch literal 11888 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 bool + """ + Return whether it looks like pip is running under CI. + """ + # We don't use the method of checking for a tty (e.g. using isatty()) + # because some CI systems mimic a tty (e.g. Travis CI). Thus that + # method doesn't provide definitive information in either direction. + return any(name in os.environ for name in CI_ENVIRONMENT_VARIABLES) + + +def user_agent(): + """ + Return a string representing the user agent. + """ + data = { + "installer": {"name": "pip", "version": __version__}, + "python": platform.python_version(), + "implementation": { + "name": platform.python_implementation(), + }, + } + + if data["implementation"]["name"] == 'CPython': + data["implementation"]["version"] = platform.python_version() + elif data["implementation"]["name"] == 'PyPy': + if sys.pypy_version_info.releaselevel == 'final': + pypy_version_info = sys.pypy_version_info[:3] + else: + pypy_version_info = sys.pypy_version_info + data["implementation"]["version"] = ".".join( + [str(x) for x in pypy_version_info] + ) + elif data["implementation"]["name"] == 'Jython': + # Complete Guess + data["implementation"]["version"] = platform.python_version() + elif data["implementation"]["name"] == 'IronPython': + # Complete Guess + data["implementation"]["version"] = platform.python_version() + + if sys.platform.startswith("linux"): + from pip._vendor import distro + distro_infos = dict(filter( + lambda x: x[1], + zip(["name", "version", "id"], distro.linux_distribution()), + )) + libc = dict(filter( + lambda x: x[1], + zip(["lib", "version"], libc_ver()), + )) + if libc: + distro_infos["libc"] = libc + if distro_infos: + data["distro"] = distro_infos + + if sys.platform.startswith("darwin") and platform.mac_ver()[0]: + data["distro"] = {"name": "macOS", "version": platform.mac_ver()[0]} + + if platform.system(): + data.setdefault("system", {})["name"] = platform.system() + + if platform.release(): + data.setdefault("system", {})["release"] = platform.release() + + if platform.machine(): + data["cpu"] = platform.machine() + + if has_tls(): + import _ssl as ssl + data["openssl_version"] = ssl.OPENSSL_VERSION + + setuptools_version = get_installed_version("setuptools") + if setuptools_version is not None: + data["setuptools_version"] = setuptools_version + + # Use None rather than False so as not to give the impression that + # pip knows it is not being run under CI. Rather, it is a null or + # inconclusive result. Also, we include some value rather than no + # value to make it easier to know that the check has been run. + data["ci"] = True if looks_like_ci() else None + + user_data = os.environ.get("PIP_USER_AGENT_USER_DATA") + if user_data is not None: + data["user_data"] = user_data + + return "{data[installer][name]}/{data[installer][version]} {json}".format( + data=data, + json=json.dumps(data, separators=(",", ":"), sort_keys=True), + ) + + +class LocalFSAdapter(BaseAdapter): + + def send(self, request, stream=None, timeout=None, verify=None, cert=None, + proxies=None): + pathname = url_to_path(request.url) + + resp = Response() + resp.status_code = 200 + resp.url = request.url + + try: + stats = os.stat(pathname) + except OSError as exc: + resp.status_code = 404 + resp.raw = exc + else: + modified = email.utils.formatdate(stats.st_mtime, usegmt=True) + content_type = mimetypes.guess_type(pathname)[0] or "text/plain" + resp.headers = CaseInsensitiveDict({ + "Content-Type": content_type, + "Content-Length": stats.st_size, + "Last-Modified": modified, + }) + + resp.raw = open(pathname, "rb") + resp.close = resp.raw.close + + return resp + + def close(self): + pass + + +class InsecureHTTPAdapter(HTTPAdapter): + + def cert_verify(self, conn, url, verify, cert): + super(InsecureHTTPAdapter, self).cert_verify( + conn=conn, url=url, verify=False, cert=cert + ) + + +class PipSession(requests.Session): + + timeout = None # type: Optional[int] + + def __init__(self, *args, **kwargs): + """ + :param trusted_hosts: Domains not to emit warnings for when not using + HTTPS. + """ + retries = kwargs.pop("retries", 0) + cache = kwargs.pop("cache", None) + trusted_hosts = kwargs.pop("trusted_hosts", []) # type: List[str] + index_urls = kwargs.pop("index_urls", None) + + super(PipSession, self).__init__(*args, **kwargs) + + # Namespace the attribute with "pip_" just in case to prevent + # possible conflicts with the base class. + self.pip_trusted_origins = [] # type: List[Tuple[str, Optional[int]]] + + # Attach our User Agent to the request + self.headers["User-Agent"] = user_agent() + + # Attach our Authentication handler to the session + self.auth = MultiDomainBasicAuth(index_urls=index_urls) + + # Create our urllib3.Retry instance which will allow us to customize + # how we handle retries. + retries = urllib3.Retry( + # Set the total number of retries that a particular request can + # have. + total=retries, + + # A 503 error from PyPI typically means that the Fastly -> Origin + # connection got interrupted in some way. A 503 error in general + # is typically considered a transient error so we'll go ahead and + # retry it. + # A 500 may indicate transient error in Amazon S3 + # A 520 or 527 - may indicate transient error in CloudFlare + status_forcelist=[500, 503, 520, 527], + + # Add a small amount of back off between failed requests in + # order to prevent hammering the service. + backoff_factor=0.25, + ) + + # We want to _only_ cache responses on securely fetched origins. We do + # this because we can't validate the response of an insecurely fetched + # origin, and we don't want someone to be able to poison the cache and + # require manual eviction from the cache to fix it. + if cache: + secure_adapter = CacheControlAdapter( + cache=SafeFileCache(cache), + max_retries=retries, + ) + else: + secure_adapter = HTTPAdapter(max_retries=retries) + + # Our Insecure HTTPAdapter disables HTTPS validation. It does not + # support caching (see above) so we'll use it for all http:// URLs as + # well as any https:// host that we've marked as ignoring TLS errors + # for. + insecure_adapter = InsecureHTTPAdapter(max_retries=retries) + # Save this for later use in add_insecure_host(). + self._insecure_adapter = insecure_adapter + + self.mount("https://", secure_adapter) + self.mount("http://", insecure_adapter) + + # Enable file:// urls + self.mount("file://", LocalFSAdapter()) + + for host in trusted_hosts: + self.add_trusted_host(host, suppress_logging=True) + + def add_trusted_host(self, host, source=None, suppress_logging=False): + # type: (str, Optional[str], bool) -> None + """ + :param host: It is okay to provide a host that has previously been + added. + :param source: An optional source string, for logging where the host + string came from. + """ + if not suppress_logging: + msg = 'adding trusted host: {!r}'.format(host) + if source is not None: + msg += ' (from {})'.format(source) + logger.info(msg) + + host_port = parse_netloc(host) + if host_port not in self.pip_trusted_origins: + self.pip_trusted_origins.append(host_port) + + self.mount(build_url_from_netloc(host) + '/', self._insecure_adapter) + if not host_port[1]: + # Mount wildcard ports for the same host. + self.mount( + build_url_from_netloc(host) + ':', + self._insecure_adapter + ) + + def iter_secure_origins(self): + # type: () -> Iterator[SecureOrigin] + for secure_origin in SECURE_ORIGINS: + yield secure_origin + for host, port in self.pip_trusted_origins: + yield ('*', host, '*' if port is None else port) + + def is_secure_origin(self, location): + # type: (Link) -> bool + # Determine if this url used a secure transport mechanism + parsed = urllib_parse.urlparse(str(location)) + origin_protocol, origin_host, origin_port = ( + parsed.scheme, parsed.hostname, parsed.port, + ) + + # The protocol to use to see if the protocol matches. + # Don't count the repository type as part of the protocol: in + # cases such as "git+ssh", only use "ssh". (I.e., Only verify against + # the last scheme.) + origin_protocol = origin_protocol.rsplit('+', 1)[-1] + + # Determine if our origin is a secure origin by looking through our + # hardcoded list of secure origins, as well as any additional ones + # configured on this PackageFinder instance. + for secure_origin in self.iter_secure_origins(): + secure_protocol, secure_host, secure_port = secure_origin + if origin_protocol != secure_protocol and secure_protocol != "*": + continue + + try: + addr = ipaddress.ip_address( + None + if origin_host is None + else six.ensure_text(origin_host) + ) + network = ipaddress.ip_network( + six.ensure_text(secure_host) + ) + except ValueError: + # We don't have both a valid address or a valid network, so + # we'll check this origin against hostnames. + if ( + origin_host and + origin_host.lower() != secure_host.lower() and + secure_host != "*" + ): + continue + else: + # We have a valid address and network, so see if the address + # is contained within the network. + if addr not in network: + continue + + # Check to see if the port matches. + if ( + origin_port != secure_port and + secure_port != "*" and + secure_port is not None + ): + continue + + # If we've gotten here, then this origin matches the current + # secure origin and we should return True + return True + + # If we've gotten to this point, then the origin isn't secure and we + # will not accept it as a valid location to search. We will however + # log a warning that we are ignoring it. + logger.warning( + "The repository located at %s is not a trusted or secure host and " + "is being ignored. If this repository is available via HTTPS we " + "recommend you use HTTPS instead, otherwise you may silence " + "this warning and allow it anyway with '--trusted-host %s'.", + origin_host, + origin_host, + ) + + return False + + def request(self, method, url, *args, **kwargs): + # Allow setting a default timeout on a session + kwargs.setdefault("timeout", self.timeout) + + # Dispatch the actual request + return super(PipSession, self).request(method, url, *args, **kwargs) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/network/session.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/network/session.pyc new file mode 100644 index 0000000000000000000000000000000000000000..77061e07ddc1789b1eb66177678872cab5ec542a GIT binary patch literal 11888 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 lnXK+{k5@*k Iterator[bytes] + """Given a requests Response, provide the data chunks. + """ + try: + # Special case for urllib3. + for chunk in response.raw.stream( + chunk_size, + # We use decode_content=False here because we don't + # want urllib3 to mess with the raw bytes we get + # from the server. If we decompress inside of + # urllib3 then we cannot verify the checksum + # because the checksum will be of the compressed + # file. This breakage will only occur if the + # server adds a Content-Encoding header, which + # depends on how the server was configured: + # - Some servers will notice that the file isn't a + # compressible file and will leave the file alone + # and with an empty Content-Encoding + # - Some servers will notice that the file is + # already compressed and will leave the file + # alone and will add a Content-Encoding: gzip + # header + # - Some servers won't notice anything at all and + # will take a file that's already been compressed + # and compress it again and set the + # Content-Encoding: gzip header + # + # By setting this not to decode automatically we + # hope to eliminate problems with the second case. + decode_content=False, + ): + yield chunk + except AttributeError: + # Standard file-like object. + while True: + chunk = response.raw.read(chunk_size) + if not chunk: + break + yield chunk diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/network/utils 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/network/utils 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c3a50ccc93ee51bed3132ea4853e587d97a386ea GIT binary patch literal 983 zcmc&yQBTxB5T0p!r<|S|OfXR&`eJeqaD`x^4=NHkkq`?x4v|Z=Dc9vFwA->fcW?xs z@Q3;8@9_ud?A|s01UEa=?sUGH`M$3EyV>~l^X<0*%$CE?_iTEXUBVk71IQ8j2)P4& z2hcdhTGxR^qa}vCZS>~)WDQ= z*=lTtl2+^{i*WSZ)BE&8P@#%Usa zIu(8rQ|u2;NAg^^8$K_3z~Dp-ibO<%LXwaaTKRZ502N=7(NdEVaZZNqhd9&1qSlF2 zdORZ0QL0cpJwQ*5gni-k#13agRx^>Q!8x{jq|<9*>)B(A<6xa;nh=yK9mgbsajb%q zB1?qQ!LSUHi?iYN%afJm)Yj3~`?yPVKNZdr{OO~skxkX~R1p6lGl`je*9#HKTc^H@g@! Iterator[bytes] + """Given a requests Response, provide the data chunks. + """ + try: + # Special case for urllib3. + for chunk in response.raw.stream( + chunk_size, + # We use decode_content=False here because we don't + # want urllib3 to mess with the raw bytes we get + # from the server. If we decompress inside of + # urllib3 then we cannot verify the checksum + # because the checksum will be of the compressed + # file. This breakage will only occur if the + # server adds a Content-Encoding header, which + # depends on how the server was configured: + # - Some servers will notice that the file isn't a + # compressible file and will leave the file alone + # and with an empty Content-Encoding + # - Some servers will notice that the file is + # already compressed and will leave the file + # alone and will add a Content-Encoding: gzip + # header + # - Some servers won't notice anything at all and + # will take a file that's already been compressed + # and compress it again and set the + # Content-Encoding: gzip header + # + # By setting this not to decode automatically we + # hope to eliminate problems with the second case. + decode_content=False, + ): + yield chunk + except AttributeError: + # Standard file-like object. + while True: + chunk = response.raw.read(chunk_size) + if not chunk: + break + yield chunk diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/network/utils.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/network/utils.pyc new file mode 100644 index 0000000000000000000000000000000000000000..759b2ec751fcafc1406627df1bfc80f098ba64aa GIT binary patch literal 983 zcmc&y!EVz)5S_K1Km!3(q#^+aUyyQW>dBlM)&UEH~b!PVBY2J4u?V zoXU^!O?&{%ZesBXtairU@w}ON&ujm#*Dim(`96Ty+gm- z^1I>Qr(^#h?6mtWyiMVNt0EVQH&~hY`Q+$?vRZowVQ}pGZGV69O=q`}%LsEh&}D71 z3Yn&)B)R!ITt0(qfDvs5*EAIawBUxZ58v*<4-2j>_`)upLa!%w!9g3wHINxF#x6ZT zqL-BLiiY2?B}heZL_8PpUFZo0UrCxyL(iaIk=swET)2@d`Nf1QRBlOZ-7RE3O=9li zId|g-BX@8<5o6V?xwP;efnz?%V;&B2fn1<(y+@SE z=>&O8%3RX)09`rZ=7rK@Gn^4wE=9%~<(TfFO0Kx6XO0bugK>&zf>+378X@IsgsT#mg7CaG!`bG%P2%MrtcI4cxVYvjPOt-GxHsBYC+-CAL*tjZkbH}q}5 zC*-JpGbHWfTsBMbn;FTOszBodbFm(mndKDCMR%MRi5LdvmTIAwXRUpp|I9yO{+l|Q W>1!f1N%>pNMd`qr^}wpKhxT8x>hF^P literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/network/xmlrpc 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/network/xmlrpc 2.py new file mode 100644 index 0000000..121edd9 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/network/xmlrpc 2.py @@ -0,0 +1,44 @@ +"""xmlrpclib.Transport implementation +""" + +# The following comment should be removed at some point in the future. +# mypy: disallow-untyped-defs=False + +import logging + +from pip._vendor import requests +# NOTE: XMLRPC Client is not annotated in typeshed as on 2017-07-17, which is +# why we ignore the type on this import +from pip._vendor.six.moves import xmlrpc_client # type: ignore +from pip._vendor.six.moves.urllib import parse as urllib_parse + +logger = logging.getLogger(__name__) + + +class PipXmlrpcTransport(xmlrpc_client.Transport): + """Provide a `xmlrpclib.Transport` implementation via a `PipSession` + object. + """ + + def __init__(self, index_url, session, use_datetime=False): + xmlrpc_client.Transport.__init__(self, use_datetime) + index_parts = urllib_parse.urlparse(index_url) + self._scheme = index_parts.scheme + self._session = session + + def request(self, host, handler, request_body, verbose=False): + parts = (self._scheme, host, handler, None, None, None) + url = urllib_parse.urlunparse(parts) + try: + headers = {'Content-Type': 'text/xml'} + response = self._session.post(url, data=request_body, + headers=headers, stream=True) + response.raise_for_status() + self.verbose = verbose + return self.parse_response(response.raw) + except requests.HTTPError as exc: + logger.critical( + "HTTP error %s while getting %s", + exc.response.status_code, url, + ) + raise diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/network/xmlrpc 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/network/xmlrpc 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5c1cacd6ca30d947a1500512c16fab687f85890c GIT binary patch literal 2135 zcmd5-O^@S55UsWoXOf-S85UL`@u5hFB^)N%Wf2_s5U?!bfJP%vRt!1d@z|ZjUdQ%! zcQO-{xiI^ixNzah@8Ji)t8z3TwD-kwSE|d^-Bqt%b^Jf~dVl=>`A-RLA0NM8V%QQQ zC7M7gNZsu(&0$OxvvO`KM%Dbd{bdBY=C=E!r zDc_|j)^+GP(KXSJlRZA*WU#~Mz6)`=C`_Fc+4*p6;?mZYas6yj7kZ&f7rU$~d)Z%j zjs^Wn^b5Z1W@o8xaR3mDzW4K{xCIKcknWHkU12x*}>=W50p8-ei zI0dVVspF%vGS!z6HjzbJzvd*XqcnEfW!Ul7jVlgAZ80Sgwt_aQO}2vTXce2$v?@|< z>}Xbx(r5YX=Z~fj?w>z+xL&VZ?wtGN;l=zuo>@5>kLs*G%u4IxqB#8Oo5%L}37cdf zX{SvY7o$?Ui^@D5H6yXoU9m8^Rq+V6~YF8y}?P0J{O7j~OK%PS?Mjd!J?=+yR zHaU-SpEhkNQ9$cc%0Mo>9({b(k(Eu=0`4@_75%kA)vz+a8vkmCHanDexN{T=%+-Yn z2X^IywA#rJ<%iS)erUC)Ju<(Ny6S=+dz9biCfsx>->3Y5HrNww{0mX3=v1h|WjvA` zoxXIOzhw$Ms(?)C4#(?SOEFQUSjsooF+-2=fQ>UcUf6e_em5Q;_q8#V>Az?D7xS#p z{h4+yD`zkaUV%%W3$xm0A>?sAj`Be5lZQn zR)Se+b6%mrZ^J=$h>XSsQo_W|W8w>LQ4$t%gpWBu3B9OhGi`+XiOF1+#Krbz*{)|c zHYY_%mFfY97P3*onsa=N-8?SS0vj=C+gm9*uhMn+2D>s{gv=5S5)B0i223paGI_Z) zmmIcnzm2HuTM(q)1lxVJr|#mnr@HDjbw>rT9C!mM8`D3E%6Or1WiT>Pw5ZZ$!Be>y zqO?k&bN=7Ph1Jqd;XO?M$ycoepi c{|9JETYT1(_X`ePE{LGL>mB$9V8p)vHwNbfyZ`_I literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/network/xmlrpc.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/network/xmlrpc.py new file mode 100644 index 0000000..121edd9 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/network/xmlrpc.py @@ -0,0 +1,44 @@ +"""xmlrpclib.Transport implementation +""" + +# The following comment should be removed at some point in the future. +# mypy: disallow-untyped-defs=False + +import logging + +from pip._vendor import requests +# NOTE: XMLRPC Client is not annotated in typeshed as on 2017-07-17, which is +# why we ignore the type on this import +from pip._vendor.six.moves import xmlrpc_client # type: ignore +from pip._vendor.six.moves.urllib import parse as urllib_parse + +logger = logging.getLogger(__name__) + + +class PipXmlrpcTransport(xmlrpc_client.Transport): + """Provide a `xmlrpclib.Transport` implementation via a `PipSession` + object. + """ + + def __init__(self, index_url, session, use_datetime=False): + xmlrpc_client.Transport.__init__(self, use_datetime) + index_parts = urllib_parse.urlparse(index_url) + self._scheme = index_parts.scheme + self._session = session + + def request(self, host, handler, request_body, verbose=False): + parts = (self._scheme, host, handler, None, None, None) + url = urllib_parse.urlunparse(parts) + try: + headers = {'Content-Type': 'text/xml'} + response = self._session.post(url, data=request_body, + headers=headers, stream=True) + response.raise_for_status() + self.verbose = verbose + return self.parse_response(response.raw) + except requests.HTTPError as exc: + logger.critical( + "HTTP error %s while getting %s", + exc.response.status_code, url, + ) + raise diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/network/xmlrpc.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/network/xmlrpc.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c696a24f4e385deee851d1e3192add834ab8eda3 GIT binary patch literal 2135 zcmd5-OONA35U#cpXOf-S85UL`@lYhh5)PB>1MMDo2(bcjK%{eEt^0-hu02xDr@Td5#c*FiX;I$h&rv{I@ryc~$eF-# zB7lbiVHf+|z#xD|QC4OyirhXvElq)HL=AQfHw?`rz{DnVRK|6nMmwE-BHQFM;K&`P zV0AHdd{kDZdL3aCS+w(OPO>^mW2aq)9dF&Z;xN<}Qxah-XrtO>E4YqUu^COPBGtx@ zX7wn2na_UteEQ)2#e+wi&C2D@xhIb<=lAi<%F%dKXZ3MbS{E0^@xv#NPbMLoWFTp$ zO&J%XQoGB_ycjhl9M+qV(|8xda&n~JR)=a|C2Z|suu)3$I}|{kLn=lccsK7fpsO}H zk8+>3Z7ESen`e}PTzEZteASVaP1OSKG}IOSwMEsiGQb-DYLB*ily|su6bj7Mg$W0C z<%6`^*-zy|Y5_mA+KV2U-$-3`L5~B!S1)f$wrgX>SO|7Mvs8THDo9mdNM|i--867X|M^Jwlk5BvBn9B4&vHi<=R_Ojr zJC~I+7zS^_C1fthW+zptL*BqKmLSHm6n=#~6_2{IPL#1(YIg*)i8GL8TA2u?bW1D2 zthBkP(BQY>AUi}x;{qvR;^r~&CATOE3pv8?I6w)#sAe;5g!_rfT$aSe?q=DoXErt` zMM;(F0f!c{QNo&Ye2m>ZF4F=VF=)G6DY~fAP52(WGF^ns5)Kj#1qcRAEP9>1S(-}@ zySP6@RQ3Z1QtyN9zB*8M@!L~f^^Uru0$7f`fs~EuA4O%n(6}-fnJ8LR>9XLdTntfK zCD1wl@8iO1X{YcWrvKzC+8gO@<_7;KSWYJJ18+YVFonX;AS3~%2dFD|5^jrOw9;i- znTAbw;q@=$&}Qr5qFQO&+^!7aYd;S`09>pg|KBw9=Z-*^{3v7$KV>_w4*B{FIm-V5 aTGAF@Hs$@ALzfF8XzzPR{t*~)=>HA1{R2n< literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/__init__ 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/__init__ 2.py new file mode 100644 index 0000000..e69de29 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/__init__ 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/__init__ 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e9cb42a06b7e9e474415238a118a2cb8684ce87f GIT binary patch literal 203 zcmZ9GK?=e!5Je-p5W#zNQ>R72jf#S9MNqefXwsSzlbDQ^dOEkB#|xNQgU8^&I$1LmP%{UGQCv6=r3HSi%Eze4vtvGN zni?xa91rj3ETq)111oJRwMV8@x>&CKW*^nJRB9AXGX=&9$50yWfd(s)(t&NT8y-(C NhToK!#d&cE`2bn=H9G(R literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/__init__.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/__init__.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7ddfaec5b07bf95039a8e2d69e990a668b3e8a0c GIT binary patch literal 203 zcmZ9GF%H5o5Cn~&KuG)}O}K<0(g5NGDS(QC$Y3WpGPbdgK=>VR;se--ij{Uwn&!6u z9*-Wc<>5qr>G`|%bpsDZ$TkY5h&;$29C`=Fik2dWmRhK^WZXKa4X|rdKW9~%9Mi1p zT5J$8&+g~Mr&h27BTOumLn>uF&F95_6V$h*P{^&K613r#qR`4g>8-%BoR|)W{_*0X M*-i3Qm=}hS4+xnwq5uE@ literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/build/__init__ 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/build/__init__ 2.py new file mode 100644 index 0000000..e69de29 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/build/__init__ 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/build/__init__ 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c6a16a87fe0e5c944a8eea7d827935777c0a3d64 GIT binary patch literal 209 zcmZ9GK?=e!5Je-p5W#zNQ>UWfMnyrlBB)zSYSJ2sNleB{dpftC#|tLK+gcP;SSWxBxC<;!FQodLHcl zdpvr))~7T3rAKp1^#g)nY#($c2?*>D{z(q3Qw>K64R?@NT1e-iupn+_@m%E5G>hhK z+hB=^@%(<7QVIhHu*!zYc;s4#vv`>tcb)n+RR*OqTtj80;k)_5o=xHs=5U literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/build/metadata 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/build/metadata 2.py new file mode 100644 index 0000000..b13fbde --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/build/metadata 2.py @@ -0,0 +1,40 @@ +"""Metadata generation logic for source distributions. +""" + +import logging +import os + +from pip._internal.utils.subprocess import runner_with_spinner_message +from pip._internal.utils.temp_dir import TempDirectory +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from pip._internal.build_env import BuildEnvironment + from pip._vendor.pep517.wrappers import Pep517HookCaller + +logger = logging.getLogger(__name__) + + +def generate_metadata(build_env, backend): + # type: (BuildEnvironment, Pep517HookCaller) -> str + """Generate metadata using mechanisms described in PEP 517. + + Returns the generated metadata directory. + """ + metadata_tmpdir = TempDirectory( + kind="modern-metadata", globally_managed=True + ) + + metadata_dir = metadata_tmpdir.path + + with build_env: + # Note that Pep517HookCaller implements a fallback for + # prepare_metadata_for_build_wheel, so we don't have to + # consider the possibility that this hook doesn't exist. + runner = runner_with_spinner_message("Preparing wheel metadata") + with backend.subprocess_runner(runner): + distinfo_dir = backend.prepare_metadata_for_build_wheel( + metadata_dir + ) + + return os.path.join(metadata_dir, distinfo_dir) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/build/metadata 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/build/metadata 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f809542651d0f9b251845d0aee166efce64f9995 GIT binary patch literal 1551 zcmd5+QIFe15FXo!lS^}4phX}+$d7rsxThBS0tmRCS_DKPTt%A)R*t>rY|h>_yX!=$ za!<#5ANWJO@_YCJFtbi_52){~w3C^g@$Ag^?Iig7xcAqeU;diHZu$88HE#0Z#B?wMuWA_V=DR2KGjY47fsAmCK4{pJ~@nP%3(ubP>wg7KF2hRqCH)3?t zf-ORZ(wT1_fJb&4wt;iE;g_rpKfP?E4JpmCL*8v0ZV6N>z!WH+HCXbf+@o6?A#*g- zMIwbMO_XtyBBVTvgp4K^lL-46^?DJmDYvzjCbA2@X9dF!sj@wYBNuI3c;U5>nK?nF zR2kRubRTR9#=KB-L}|myL?R`b`4A5$npcUYqSgz}i$nVHu#4WQYBSNs>Cj) zcmVcY6sDe6TBS%bYuL9Do>nd?XZ!0Jz9BXz7MZ)n5>3jud`l&yL(I}!Y=XF4*$!Dr zdd+2KT}L|znJp`9-S*Lc$WI4^`mP4@(OVVrN-^{e(FP~XYt-UOi&bKIyh?O@r3!?~ z#Ca8Gzb*6EkFU-i&d(lgHY>Zd);@W(UOdE=%lI;`M0F~pv54a7H%~9j1eH!3c)c`dQgt;oZBC;7p^V6HpXO9a_o_)q#n7R-beM0zW)V> gRO%NvV0FR2B0S6k6rtbu`u+fE8~7p0`~FGrFSD7NY5)KL literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/build/metadata.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/build/metadata.py new file mode 100644 index 0000000..b13fbde --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/build/metadata.py @@ -0,0 +1,40 @@ +"""Metadata generation logic for source distributions. +""" + +import logging +import os + +from pip._internal.utils.subprocess import runner_with_spinner_message +from pip._internal.utils.temp_dir import TempDirectory +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from pip._internal.build_env import BuildEnvironment + from pip._vendor.pep517.wrappers import Pep517HookCaller + +logger = logging.getLogger(__name__) + + +def generate_metadata(build_env, backend): + # type: (BuildEnvironment, Pep517HookCaller) -> str + """Generate metadata using mechanisms described in PEP 517. + + Returns the generated metadata directory. + """ + metadata_tmpdir = TempDirectory( + kind="modern-metadata", globally_managed=True + ) + + metadata_dir = metadata_tmpdir.path + + with build_env: + # Note that Pep517HookCaller implements a fallback for + # prepare_metadata_for_build_wheel, so we don't have to + # consider the possibility that this hook doesn't exist. + runner = runner_with_spinner_message("Preparing wheel metadata") + with backend.subprocess_runner(runner): + distinfo_dir = backend.prepare_metadata_for_build_wheel( + metadata_dir + ) + + return os.path.join(metadata_dir, distinfo_dir) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/build/metadata.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/build/metadata.pyc new file mode 100644 index 0000000000000000000000000000000000000000..df77c6a569f3789d05ba5741c5f6762a83562db6 GIT binary patch literal 1551 zcmd5+!H(lZ5G~t@lgVb7z%Bv-LO$j)@eaG}TmT`4(Jlg_U;c$KNk;n?F(H08^A6 zIQNbnGsTE2_ zr7A=gT`L_KwbU7pa$&3%vn6@Ws3-oxH6D8Sx&07@UP}Cyt%aR4QwwKQ+?cfBP0%q0 zUGb{^T4TiJdJ(RK+ohH!vU9#?1;Y-h@;!(n7j0X3;f;{FIYFgT zIoI-ZA8ZN6qEs_PX~U{iA|<(b9}g#**QutW)^pCwL;CTsi{8X>OPR0qlDjMF)Xoz; z0Q)uyvz*mhWk@n>*tZd$)-EY$`|BCLAvPlxnY+ajP0F}@3nipO%+gzIg1B7S4q0h- z!)0z=M>`0at!ixD_R)XHPX~nht_JeaTNUzJG4u`51}Drb)Z$u;Rcd*>N_Bj#N`%V9 zMIGnAEs9r9ug@OO&Yo;GE4#4PoOFn`3l6E& e&v3w&CI5o(Fpp4#e&6f+1Eg)>hbSNVC&9lN`k9CT literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/build/metadata_legacy 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/build/metadata_legacy 2.py new file mode 100644 index 0000000..b6813f8 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/build/metadata_legacy 2.py @@ -0,0 +1,122 @@ +"""Metadata generation logic for legacy source distributions. +""" + +import logging +import os + +from pip._internal.exceptions import InstallationError +from pip._internal.utils.misc import ensure_dir +from pip._internal.utils.setuptools_build import make_setuptools_egg_info_args +from pip._internal.utils.subprocess import call_subprocess +from pip._internal.utils.typing import MYPY_CHECK_RUNNING +from pip._internal.vcs import vcs + +if MYPY_CHECK_RUNNING: + from typing import List, Optional + + from pip._internal.build_env import BuildEnvironment + +logger = logging.getLogger(__name__) + + +def _find_egg_info(source_directory, is_editable): + # type: (str, bool) -> str + """Find an .egg-info in `source_directory`, based on `is_editable`. + """ + + def looks_like_virtual_env(path): + # type: (str) -> bool + return ( + os.path.lexists(os.path.join(path, 'bin', 'python')) or + os.path.exists(os.path.join(path, 'Scripts', 'Python.exe')) + ) + + def locate_editable_egg_info(base): + # type: (str) -> List[str] + candidates = [] # type: List[str] + for root, dirs, files in os.walk(base): + for dir_ in vcs.dirnames: + if dir_ in dirs: + dirs.remove(dir_) + # Iterate over a copy of ``dirs``, since mutating + # a list while iterating over it can cause trouble. + # (See https://github.com/pypa/pip/pull/462.) + for dir_ in list(dirs): + if looks_like_virtual_env(os.path.join(root, dir_)): + dirs.remove(dir_) + # Also don't search through tests + elif dir_ == 'test' or dir_ == 'tests': + dirs.remove(dir_) + candidates.extend(os.path.join(root, dir_) for dir_ in dirs) + return [f for f in candidates if f.endswith('.egg-info')] + + def depth_of_directory(dir_): + # type: (str) -> int + return ( + dir_.count(os.path.sep) + + (os.path.altsep and dir_.count(os.path.altsep) or 0) + ) + + base = source_directory + if is_editable: + filenames = locate_editable_egg_info(base) + else: + base = os.path.join(base, 'pip-egg-info') + filenames = os.listdir(base) + + if not filenames: + raise InstallationError( + "Files/directories not found in {}".format(base) + ) + + # If we have more than one match, we pick the toplevel one. This + # can easily be the case if there is a dist folder which contains + # an extracted tarball for testing purposes. + if len(filenames) > 1: + filenames.sort(key=depth_of_directory) + + return os.path.join(base, filenames[0]) + + +def generate_metadata( + build_env, # type: BuildEnvironment + setup_py_path, # type: str + source_dir, # type: str + editable, # type: bool + isolated, # type: bool + details, # type: str +): + # type: (...) -> str + """Generate metadata using setup.py-based defacto mechanisms. + + Returns the generated metadata directory. + """ + logger.debug( + 'Running setup.py (path:%s) egg_info for package %s', + setup_py_path, details, + ) + + egg_info_dir = None # type: Optional[str] + # For non-editable installs, don't put the .egg-info files at the root, + # to avoid confusion due to the source code being considered an installed + # egg. + if not editable: + egg_info_dir = os.path.join(source_dir, 'pip-egg-info') + # setuptools complains if the target directory does not exist. + ensure_dir(egg_info_dir) + + args = make_setuptools_egg_info_args( + setup_py_path, + egg_info_dir=egg_info_dir, + no_user_config=isolated, + ) + + with build_env: + call_subprocess( + args, + cwd=source_dir, + command_desc='python setup.py egg_info', + ) + + # Return the .egg-info directory. + return _find_egg_info(source_dir, editable) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/build/metadata_legacy 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/build/metadata_legacy 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..db3b88ed77df3746ebfe49bc944f802039bd633d GIT binary patch literal 4278 zcmd5sj%6kHV%a^yTJR#b6B%5lYJ!IiBgVz${|0&M_2xUPd=q8*Ie=w`~&g>lCOIJkdn%GLYm=BPjAmm_t%eU z{C8>LUtj&~R{l;9(6n!Hz;pV(WFk36t6WYpP|C1 zj_>9(l+RKzN1Zu0_bH#JVu3mfZaz!-IVu*Zv*_k?lrK?no;v4A=|!slA-l{|zD&gm zbyldjK%EPYcY*SYRIE~Gl~hTj6%8(tUZbZt>19gK(O+=>cDP7VW8jp{@PX=ZGlbw|u())%t>;kVUNkYX>O zd$%+;&U2BmS=UwVmKLz2OEaoQDYaBJ(`t#{l<4Xo`aro|?-O?25We%hSzrKdY;<(4|fIBOi^wV?pLibg(FN_!-e(iF#uBPl%3T`3BRE z8+3%eNk@w6+jQj7QInN_JVWJmvP1(|M2IQq9&<7gUrpGKX2|@J&zjEAU}j8*gg+~S zL9I_0_G_iij4$wk#o%s_+?O~nm$5yxZJKR z-5<8oy+Qx?Z}#4}*?r^I;o-g=SZjZL>&ebd{Q714H|=3Igh~bcH{RaZH1|Jbk~ARN z>Kd49SHrP;nRb^^*Dl7M7da{f8)`sf?2@Uqg|isHV+1v z3M$oJoACd^L7yxT={Z>s`IAqT?BFv7KPBOp<@)c>N$Bz#aIou<`9j9n$)g(dXLjn+ zUY8!gdj@k84{OjTknGV0u7Lk)?=n5W{lK&F=o)(#yTH7l2Tu1jPe1l(?`t65!H895 zHT<5ZJTRg(h6*p;LNnLVK}(NbX1z^8%vZvu9(|wKR8n4q6_a*SCtivoeg*y4hFY5&L0fxJ3qk0xNs*6)43@U|1Z$f`cDx=bbT;;(s<*_{@DCHx#^EN_&=Wtt%YK_sgT z@{QQ6m*v`oYs}99r{}zu(~KLjtDFtB+N(H9UM0B0G+s`V*{gg^W+2a3-&HGWQC(`T zs%vV+yQ(g!SDY{N4H;e%Qh$O0U^$SRBXPi4;R4VCj}iZGJ-aIII{Xnk+Ldhqd= zD@*q;*AC5EDx+r5;A3BvW!cP<>F7C1k&<#l;mN^{* zj#XX6RzA*AHZXEcRa=K|E-ao;to9s;rxI$&zzDy`9oIsZU6Ua%&gG22#|s(oX9VWw zag?ZsGGYpD@xgC_Of&Pd%d7LVzVg+ww}$4chFbG4s#PyxeX(NM+wY>8&(OJW3(O+c zB6y<)P^ejsQR+0vyv=3-)VUTym4)nr+~rFlf(O+PN+Q$|KBoc6THY~;M1Q+R z3Ss96C6W^Wj#+%?sR!8OgWp2g5X-gGv_gVFddC&OI+!HpU}UngA4rLc?0myjMyc+_ zsFlE#?8Iee3RJ>U9EB)l>(T^vM^B1r6jD=R6C@tGQp#}r4M$~pdW)dN1SDi9{w> zWlgU+-FZtAfxsOPg1)XLE~mOX>I>kvs!~7aETLeQlS(MrvW-!TZ7=wivWJTqE3Xf( z{G;JvBsCj@m_i>eWNI?k|=Va2&MpJTz=-ng21;v ztuj#*CkU4OK6An9MGm~)ao3S~9H(ApVz`jaYQOVM+|vh|Sl+(;4Se=+ z$fswc$(!-n)8pCZN)4$K94ik)egfDlFUXuCDx89>ukCvdtxSp{4yaKSzR6M;j^Q12 tEwoeJ840j_;M+x&j&gm6m2Eh*`re{i^j1(gjQ=6DUiMbK<;MJ5{|68_5ZV9$ literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/build/metadata_legacy.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/build/metadata_legacy.py new file mode 100644 index 0000000..b6813f8 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/build/metadata_legacy.py @@ -0,0 +1,122 @@ +"""Metadata generation logic for legacy source distributions. +""" + +import logging +import os + +from pip._internal.exceptions import InstallationError +from pip._internal.utils.misc import ensure_dir +from pip._internal.utils.setuptools_build import make_setuptools_egg_info_args +from pip._internal.utils.subprocess import call_subprocess +from pip._internal.utils.typing import MYPY_CHECK_RUNNING +from pip._internal.vcs import vcs + +if MYPY_CHECK_RUNNING: + from typing import List, Optional + + from pip._internal.build_env import BuildEnvironment + +logger = logging.getLogger(__name__) + + +def _find_egg_info(source_directory, is_editable): + # type: (str, bool) -> str + """Find an .egg-info in `source_directory`, based on `is_editable`. + """ + + def looks_like_virtual_env(path): + # type: (str) -> bool + return ( + os.path.lexists(os.path.join(path, 'bin', 'python')) or + os.path.exists(os.path.join(path, 'Scripts', 'Python.exe')) + ) + + def locate_editable_egg_info(base): + # type: (str) -> List[str] + candidates = [] # type: List[str] + for root, dirs, files in os.walk(base): + for dir_ in vcs.dirnames: + if dir_ in dirs: + dirs.remove(dir_) + # Iterate over a copy of ``dirs``, since mutating + # a list while iterating over it can cause trouble. + # (See https://github.com/pypa/pip/pull/462.) + for dir_ in list(dirs): + if looks_like_virtual_env(os.path.join(root, dir_)): + dirs.remove(dir_) + # Also don't search through tests + elif dir_ == 'test' or dir_ == 'tests': + dirs.remove(dir_) + candidates.extend(os.path.join(root, dir_) for dir_ in dirs) + return [f for f in candidates if f.endswith('.egg-info')] + + def depth_of_directory(dir_): + # type: (str) -> int + return ( + dir_.count(os.path.sep) + + (os.path.altsep and dir_.count(os.path.altsep) or 0) + ) + + base = source_directory + if is_editable: + filenames = locate_editable_egg_info(base) + else: + base = os.path.join(base, 'pip-egg-info') + filenames = os.listdir(base) + + if not filenames: + raise InstallationError( + "Files/directories not found in {}".format(base) + ) + + # If we have more than one match, we pick the toplevel one. This + # can easily be the case if there is a dist folder which contains + # an extracted tarball for testing purposes. + if len(filenames) > 1: + filenames.sort(key=depth_of_directory) + + return os.path.join(base, filenames[0]) + + +def generate_metadata( + build_env, # type: BuildEnvironment + setup_py_path, # type: str + source_dir, # type: str + editable, # type: bool + isolated, # type: bool + details, # type: str +): + # type: (...) -> str + """Generate metadata using setup.py-based defacto mechanisms. + + Returns the generated metadata directory. + """ + logger.debug( + 'Running setup.py (path:%s) egg_info for package %s', + setup_py_path, details, + ) + + egg_info_dir = None # type: Optional[str] + # For non-editable installs, don't put the .egg-info files at the root, + # to avoid confusion due to the source code being considered an installed + # egg. + if not editable: + egg_info_dir = os.path.join(source_dir, 'pip-egg-info') + # setuptools complains if the target directory does not exist. + ensure_dir(egg_info_dir) + + args = make_setuptools_egg_info_args( + setup_py_path, + egg_info_dir=egg_info_dir, + no_user_config=isolated, + ) + + with build_env: + call_subprocess( + args, + cwd=source_dir, + command_desc='python setup.py egg_info', + ) + + # Return the .egg-info directory. + return _find_egg_info(source_dir, editable) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/build/metadata_legacy.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/build/metadata_legacy.pyc new file mode 100644 index 0000000000000000000000000000000000000000..eebb87f8357ea43c265fbcb9e8a5a8d9f04bc322 GIT binary patch literal 4278 zcmd5<-Etg96+S(?8vR(ZWXrOhn4d|?p*B@m>%{q?h;ae798x4pGJ+Uy#Tn1e^sZ(# zKdb3pSptbFFcp$3E_ehkDPDj(Zg>E0c!WFv4*=gey}Od_%DvX^R`=;Mr@PPj&QCY~ zyRvlf&mVoB(B$Xg?~l>UztN>cUG$1lk8(v_4BXhGt|#LLGxQuaUmIxPh$_5!*O zN@L?Z7a3c1UDa-B2}`;(<61{)HlckRv?AWsk=f^Z9g$BHlb~z`w+*r3mE)j z#3zq)$F~N`PsdrFZk794U6q9{ZNeYQ>8L?ZNwL*WZ-eD@fnLH^+pR^u!xp;xS(yfL8Eit$H(1R< zRtArqVc9M^u~mKe`1?UGHaZP}g2x$bl4dsU<@)jFQh;B=w&pg6wvA@)qnqtL8Hhfd zhdjjr6^*v0JnrhyhvR9mr#PPN7R&5dR(dZhacQE_q1~xUJCEUZQfDJ;41?)oA#dsf zE#FwSS!Kl3quA~Uf36Q;bw?al6M2p%)(_bMT4=5_zsIOOsh^wIxBFF|>e{pi zqjtJC9Q@|3{u?)YZ`?XO+_yt(?Yp<0?A*j}P_}>B9%Un_RKS1Z&3E7FbVDXd1EQ_2 zfw^`ynz)x~_ZW5UV&Zv`bFxj`_A*Y9SJkeG@(j)aSlV%%N4ngU-Vgnu?xHcsRuU*`hxoJJ$h9z3)p(J>r>t4!4OkH zrP^x~{y#VvkOd+=C+i`9@}-g;e8%9HB>b{m|K&LeJzfJ2c0DqGlQDMks0RI+oqDv_ zqX+Pw;lk9z8uSGudvp(1z<;%OnI7PN;JNqc8haMIz@nfBPWLrWKlf!)5LmJ0Zs=7h_oH z=1svL94T_qg?Fi|$_mEL2D}UhgWDYE4@UK!H!(3T+{wZ$FtpgmF#QwhBIYo26wr^R0hKSvqM8zpg>W=KE~$tr_< zBR1=2xi;Yj^K-!IJFn$5<3{W%XG5*_Dvpv@3GOh9m$PK{Dj$;>$n({A)tXvXmzwM9 znp*R&s!Qq>=gWLUhL?oYA7B7j4&~-Z9B@{+0JOkk#Q$5*u8O;k-eE_(vMqq@WRO5E zHnQQ8YFyeA&>`qkmPx92;piaW!MP=A2IR;Nt zn|TF<`wXD=G_z&e1Z8DW)Qph_k@|jnoUztL8N2$>sf-bRq9}23mra0fND8sc=@@XV z>LRxCagMTqk!z~jI(&0s@qA*n=RiD_P(ubr_&x5p7P9P`40&-bX9PZ8$bdg1Fh7r@ zM17PIGjNL!ehXxpTby5AU!3=quU5ScG+#B;hJR75dkO1{70cd!7tMTy&V^fG7O@t= z8#RDJ&2o%Vr$Oc?Y!*PBYavuw$S%lTz7#^fqysK^Q2n4JLLK3A8j!5z9fL^p=WC=8 zc8*XYIRW69$9JB3fIU9>HIxmpTszGwBnYJUT>-3vX<`n>CMySll&HwgH(X_u>VAw` z30%oeTxO;~B`n2Jh*GvLO<;HQw3tRAH4`>P;-M?049DMaT$ZP|2wGgg{O~pNdN8eq zr3@d%$!}-~p=8T8MlH6z;9JTbE@rH}KDhFa zMu(BqYz&SQpK(cJQhUlIGZh{dIu&-cK1F%K$_R+_Dsz$N#MqO?k)$b}-90+4a}nG*{F-{!2! zL{Xd|Sn~VK1*;c1@OsP5W|5ghtYxpiAj5H-dYOsgLN=@Y&Np$-9%y2D`|>yN*~1Z^ zo{c7N#%E8DXPYZEq)u?GJPi2>V6VI&bB3sJ2C{*+A3C%$DT+9tMp5_{OJO*MchI%a rPIYG_!194_7gajW^&M8W;n3=P%WBzML*+2}htPW2TlZEQi|_p(SA7nP literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/build/wheel 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/build/wheel 2.py new file mode 100644 index 0000000..1266ce0 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/build/wheel 2.py @@ -0,0 +1,46 @@ +import logging +import os + +from pip._internal.utils.subprocess import runner_with_spinner_message +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import List, Optional + from pip._vendor.pep517.wrappers import Pep517HookCaller + +logger = logging.getLogger(__name__) + + +def build_wheel_pep517( + name, # type: str + backend, # type: Pep517HookCaller + metadata_directory, # type: str + build_options, # type: List[str] + tempd, # type: str +): + # type: (...) -> Optional[str] + """Build one InstallRequirement using the PEP 517 build process. + + Returns path to wheel if successfully built. Otherwise, returns None. + """ + assert metadata_directory is not None + if build_options: + # PEP 517 does not support --build-options + logger.error('Cannot build wheel for %s using PEP 517 when ' + '--build-option is present' % (name,)) + return None + try: + logger.debug('Destination directory: %s', tempd) + + runner = runner_with_spinner_message( + 'Building wheel for {} (PEP 517)'.format(name) + ) + with backend.subprocess_runner(runner): + wheel_name = backend.build_wheel( + tempd, + metadata_directory=metadata_directory, + ) + except Exception: + logger.error('Failed building wheel for %s', name) + return None + return os.path.join(tempd, wheel_name) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/build/wheel 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/build/wheel 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f04a1825ce52961cb67caa29ca0b0c59d8c06cd5 GIT binary patch literal 1661 zcmc&!UvC>l5T8B!oWyZj6Ql|Xf>otTM#8>C1yw?TC}~P7itAomwe-z5MB{qgAc(2uY4Xp0L<*U2|V!3`gXlD_uHA@{JCxXx!3;V_s_na!e%)1{{>BR zPD@0OfD~YSu@^8FR_{RSK-Pe90|et5kTxN6VeEoXF6h{znvk|2+k){HWZN*_uCXqp zJCLYD1gN-s1BTy^*xAM@DsVb!oHvMwunda7mZ<0&=%jJMOS&Qbg)ct9+)z* zLZ*xfV^xFp3G~g&(aYfI{_)Y*f&Xkcd@%f~$H8HfmWPQ!+@{T=5|bhi)B0GKG$U1h ze0ckQQJfrwX{z+pB_)$!_z_L>8!c-GA{S0}!0ZDG_));R0r~*YfklIfuK{KPu2DpS zfKOIW?W-n44y>DS?tnm-leTCvlwkCnxv&(8L`$X@mY1gb*9wwLx;geqUglbGzuUjdhD1*C{nWQxsoTNgBx_SMot_kizxV zt18hdQ#s1YBzY`xuH@)=Bq=9yV&SDOrj+YJyDe$>3M-u(S%x^5SjgpEsZ=I2X{ss1 zW>uQ5>`5HRM`TSe6Qe$qdUI|_-Urr_xyK0(^Sr=~r`p!6(DJ6)(0NUTUgfgiw~YFQ zEuu__g;s{Ro43i-U1c!IL$0rkD5xnGdi4pJGVi|*oddjd^23?zZR~%5+(DVbFbXjY zE{+e)yQIGtCaH>QlK(bw)AaTTV0(-s!z(1+F-B>oajbQru|=x1h-1=mYbmSbU8E*e z?9&D;hT_gb#5YJb)nt?Ppl*HKC9MrUu>7eF0FJ+#Dw_#v1c1U=7F-v*SrkcbKPD^X zAqB@>Jqf2LDvx|7fXuzNTBp=lhN!YKvXnN?+XS<212)qm3G8B)wDU@xoQ9~p(@=Y} zB8`+bUR-+7t3~|%N3+9&$>FWl>J%4C6Jen2D6y{BH8l>MY`!~UJS$7b}5RdxnR zj!M&K>J_EZwxq_hL_N!6P_Asj{*jTOwBIr3-`rq^oqf@AcEqk|iiYSq4YBWZMT>rK zI(wokT+zEqD4P?m4%OASiuXuMJO&pW1{Ef$8C=$+F4^_}z~PE6sMxo67ngn`bBX*0 z%Y30(2d7krLJw- Optional[str] + """Build one InstallRequirement using the PEP 517 build process. + + Returns path to wheel if successfully built. Otherwise, returns None. + """ + assert metadata_directory is not None + if build_options: + # PEP 517 does not support --build-options + logger.error('Cannot build wheel for %s using PEP 517 when ' + '--build-option is present' % (name,)) + return None + try: + logger.debug('Destination directory: %s', tempd) + + runner = runner_with_spinner_message( + 'Building wheel for {} (PEP 517)'.format(name) + ) + with backend.subprocess_runner(runner): + wheel_name = backend.build_wheel( + tempd, + metadata_directory=metadata_directory, + ) + except Exception: + logger.error('Failed building wheel for %s', name) + return None + return os.path.join(tempd, wheel_name) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/build/wheel.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/build/wheel.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4f24aa277a1a982bb76aa3641d4009dab5f3b9ca GIT binary patch literal 1661 zcmc&!UvC>l5TCvCIf>)6CP)<&1glDwj6{411tK9pKuBptal^H!tsgj@ee3f%_piHi zaShH3;T7>U_z=ACnfL%Ov*#x8z%%RH_0HUHXMXeN*8Ov*^Wu+BzMsH)IQ0J+O>;p@ zOpkyJV05_`FcMbpK;}U1!pH@|I2W=O@N{r(0ll0R{XdVC90|2XtWWGVv9_RKN|2ND%PR z^09r@g4lso3oaZG=yB5KZH5wzo^uaY0_GdA@>u-!CJ2@{`9$1epBF-$x8Vs{{PyXS z;uf@U3r;(re*+=J+IM4+9I)S~*x}sHyKH0CX2(rR%`X(i7j>G&vMiLmUl^ot1NFR4 zwaQh2vNmavNSrBoa(p5wCvt4zl`bcg>p`a@X#@&uT^LzKIFne)#Z0M8rc-I^3B#s! zmM!f`9LR@cO)pZT-j#ZNZb;q-){?o)366@Q#I>i!*0j{}wpr78Nrhe&a&ONv+AD1l zWlAixGQ{1yPNu$82Gb(q`pTGsnqaAyACW2Z_RG*Yz$+&|p3DB){yWGWlq-zl2&3@w z_|Uvb`nyq@skkBeZxgpoe}@3J$2c;)M$+fTD9tpEwJtTbNtKmJLOO0OWtF^()woUq z+JMDS+$&sqrmQ-|`q#OIxsiWF)NYcg*=Wx0qpfSG1iiu`OD{6+OolyG~EE>G!I$ zBYMIU{p*CXIpOM1T?4Cli?qaJaLHj%W15-4RZW_b-TV(6F6n|w0(*CH>DMxsC~#Tk z3(Yz>qdJs&&=4OibW~BWCgA(Z);Cf3py?aFib9+GFbr4-UZdrz5dVKQnAFF48P}Qm WltVXswRT09a^7>=;s#~?y8Ab|e5Wn| literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/build/wheel_legacy 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/build/wheel_legacy 2.py new file mode 100644 index 0000000..3ebd9fe --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/build/wheel_legacy 2.py @@ -0,0 +1,115 @@ +import logging +import os.path + +from pip._internal.utils.setuptools_build import ( + make_setuptools_bdist_wheel_args, +) +from pip._internal.utils.subprocess import ( + LOG_DIVIDER, + call_subprocess, + format_command_args, +) +from pip._internal.utils.typing import MYPY_CHECK_RUNNING +from pip._internal.utils.ui import open_spinner + +if MYPY_CHECK_RUNNING: + from typing import List, Optional, Text + +logger = logging.getLogger(__name__) + + +def format_command_result( + command_args, # type: List[str] + command_output, # type: Text +): + # type: (...) -> str + """Format command information for logging.""" + command_desc = format_command_args(command_args) + text = 'Command arguments: {}\n'.format(command_desc) + + if not command_output: + text += 'Command output: None' + elif logger.getEffectiveLevel() > logging.DEBUG: + text += 'Command output: [use --verbose to show]' + else: + if not command_output.endswith('\n'): + command_output += '\n' + text += 'Command output:\n{}{}'.format(command_output, LOG_DIVIDER) + + return text + + +def get_legacy_build_wheel_path( + names, # type: List[str] + temp_dir, # type: str + name, # type: str + command_args, # type: List[str] + command_output, # type: Text +): + # type: (...) -> Optional[str] + """Return the path to the wheel in the temporary build directory.""" + # Sort for determinism. + names = sorted(names) + if not names: + msg = ( + 'Legacy build of wheel for {!r} created no files.\n' + ).format(name) + msg += format_command_result(command_args, command_output) + logger.warning(msg) + return None + + if len(names) > 1: + msg = ( + 'Legacy build of wheel for {!r} created more than one file.\n' + 'Filenames (choosing first): {}\n' + ).format(name, names) + msg += format_command_result(command_args, command_output) + logger.warning(msg) + + return os.path.join(temp_dir, names[0]) + + +def build_wheel_legacy( + name, # type: str + setup_py_path, # type: str + source_dir, # type: str + global_options, # type: List[str] + build_options, # type: List[str] + tempd, # type: str +): + # type: (...) -> Optional[str] + """Build one unpacked package using the "legacy" build process. + + Returns path to wheel if successfully built. Otherwise, returns None. + """ + wheel_args = make_setuptools_bdist_wheel_args( + setup_py_path, + global_options=global_options, + build_options=build_options, + destination_dir=tempd, + ) + + spin_message = 'Building wheel for %s (setup.py)' % (name,) + with open_spinner(spin_message) as spinner: + logger.debug('Destination directory: %s', tempd) + + try: + output = call_subprocess( + wheel_args, + cwd=source_dir, + spinner=spinner, + ) + except Exception: + spinner.finish("error") + logger.error('Failed building wheel for %s', name) + return None + + names = os.listdir(tempd) + wheel_path = get_legacy_build_wheel_path( + names=names, + temp_dir=tempd, + name=name, + command_args=wheel_args, + command_output=output, + ) + return wheel_path diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/build/wheel_legacy 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/build/wheel_legacy 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..00c068654f694dfdce275ddb3475199cd2fea486 GIT binary patch literal 3376 zcmd5;TaOz>7Czm+%-FFrlZ1q23DBU8Fo@U$kRnC9XqTDEMGTYBlW_5BY4voM?RNTN zx~gaJ#@?5pl~zL9$9?31AHgfH{0II8KLEaS%9#u(h<%KcuBke8>QvP^-*-;ce(bit z|L!lJMYQ_4`1@CU`dc(H{yUTs4UhW{4PBADl-4M#)38ns>(wZ2P}Zbjld?4$u2Hs5 z!*x4Xr?f>`n}%&WZcuuPvJMS9pAEe4^0-{SAkZhnwg?Vb#M?T z+5|@vrP3fQ$GTTz%~NQ0Z{G;EZ+&!Yd&f5$7)N262D&H46=fEhAS$vf z%wuanwmOT+4?ex~X|Q#3XY2jIzqhw{Yww0VMhA1nOyz-|C3&t&yJa2HU7W?NqjP&^ zk|GaN!_vFz3lnibc);HlKK*YrhG;?Tj3t8M(A1%YE5jNs9MXMS)F^i8>as@pT{13B zYxEGy>NIW8{W_I*M5AUk-r_~mCdGBOp;I2Be|6~)e9xvDvV}utjUHOFknZ=Ie4ba) zTo-qED|dKFZvBI+c<6a)F&-!RxUVljcgyrImO2@}VjZ3iM3j=}B?)56vNXqN(C?i(BIy9@7@iGmday&l$eRn`}R0OhGTpZ73TB_fj#~& zbYi6=3ARD7d(b6m^uN#>%*y02G-_}dmV;4|#;VkV@oW%(J{|w_ozayy53amDpC6j3 zG3M&qN0T@48|Q<&gIO}WoaEX7xR?L7y`%5kW08D8k{eY5VFMts3>j^Da8M;_Jg{6y z)i{ji{n^}{#}TZLj&WWpU8OQ1@uFtO*>Iaq*E#QW-3|P`;705s_USQTzro-!U;TXR=yaW? zErvPP0qM_S?F!BB;;=rlM45YLqP$sXCJZm`i+_M^85ot#iZU$co;c5olM*R;-=$em0{D|K_dpV{(r;gf ztvt+>_IlBzC^Qg@nNpkAgkuS;)1G8ULA@?Y9Kvrw>T^=_Id2NwkHRu%xN{7dga`#V z0J3s6DzwPiHPV?DNiL~C*dhB1JJ>}5{31#$_BosSn`p#drpHeg;Gf6IK>xr}AdtYW zDg%jX#(~w=Nuqkch9;_w}bws8!_-X1@KL`@aZ4WF!+&Cfi}s?KsazK zxUMZF>jH%%hb}DF$Uq4>)}jA?P0RIF<_7jz+a+gyk#qP0i$DdW{xw>xL)%@p=;M4q zbwuDk>goT;aU9HWPUm@YxCE?mm9#{0;tksW#I$JIUJ-2B=HeG)*rxat3*(Nkqbu8; zrbP=Cq_M=*Dcb)S>p%R2jr2I2`YSZ=aS{~7-EmqRglSMn zN!6x{Gun_ol5miae@&809%QU)@6k<|JN5v~+Do96JRXo3U(?S)Y5VcQ$K<~TMZtD- z6bq47m0p;k%Cac+MXbFZf~c|e!LRr68HGM;`7dyD%$dC&1Ix!pKId4=R_?{>pc?y3 zO+=Jv=Zi?morUD1Bv16jzr-uJ{Q7@jJ*jDUbl}SVOAuJwyrK9>t{TkdfsmZjf-b5u zQtTq%!_a@3Re5t}d2Cq4)(?J5NrmI92gpSl2=M>JnoJH`0_Bn?7V$PuS1#ap+{pxB zaeEU|{T3SP)|{sNYt_2W2B=?itfcF9krXza2I`^J;I`%Vp2aGkLnzKKbe}J6qru)m zf$kp{=YD09RQFFlSD9TBeDmUOX&*mP7(1^cg|^I str + """Format command information for logging.""" + command_desc = format_command_args(command_args) + text = 'Command arguments: {}\n'.format(command_desc) + + if not command_output: + text += 'Command output: None' + elif logger.getEffectiveLevel() > logging.DEBUG: + text += 'Command output: [use --verbose to show]' + else: + if not command_output.endswith('\n'): + command_output += '\n' + text += 'Command output:\n{}{}'.format(command_output, LOG_DIVIDER) + + return text + + +def get_legacy_build_wheel_path( + names, # type: List[str] + temp_dir, # type: str + name, # type: str + command_args, # type: List[str] + command_output, # type: Text +): + # type: (...) -> Optional[str] + """Return the path to the wheel in the temporary build directory.""" + # Sort for determinism. + names = sorted(names) + if not names: + msg = ( + 'Legacy build of wheel for {!r} created no files.\n' + ).format(name) + msg += format_command_result(command_args, command_output) + logger.warning(msg) + return None + + if len(names) > 1: + msg = ( + 'Legacy build of wheel for {!r} created more than one file.\n' + 'Filenames (choosing first): {}\n' + ).format(name, names) + msg += format_command_result(command_args, command_output) + logger.warning(msg) + + return os.path.join(temp_dir, names[0]) + + +def build_wheel_legacy( + name, # type: str + setup_py_path, # type: str + source_dir, # type: str + global_options, # type: List[str] + build_options, # type: List[str] + tempd, # type: str +): + # type: (...) -> Optional[str] + """Build one unpacked package using the "legacy" build process. + + Returns path to wheel if successfully built. Otherwise, returns None. + """ + wheel_args = make_setuptools_bdist_wheel_args( + setup_py_path, + global_options=global_options, + build_options=build_options, + destination_dir=tempd, + ) + + spin_message = 'Building wheel for %s (setup.py)' % (name,) + with open_spinner(spin_message) as spinner: + logger.debug('Destination directory: %s', tempd) + + try: + output = call_subprocess( + wheel_args, + cwd=source_dir, + spinner=spinner, + ) + except Exception: + spinner.finish("error") + logger.error('Failed building wheel for %s', name) + return None + + names = os.listdir(tempd) + wheel_path = get_legacy_build_wheel_path( + names=names, + temp_dir=tempd, + name=name, + command_args=wheel_args, + command_output=output, + ) + return wheel_path diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/build/wheel_legacy.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/build/wheel_legacy.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c317b023913d8a26e5424a66de25c4c50afec308 GIT binary patch literal 3376 zcmd5;TaO#X60R9vcJ0{NB_ZLK149JDAYzk%h!g=rY&Icc*@W3}GlJ3VOxqr3E@rxC zHzqbOK}bhJI*;e^Jn$oUKL6wV3w{86RqbpR6m)oulj-fQuCDH``o5~J{n~Bc{qMWq zM6~+3`1?LS{R^5H{~bz+hDUvehOWq6N^6wWX;>$R^=gzhC~MNNN!c0=*C<=3;kuox zQ`(}eO~bYwHz++pS%-!la#Wkje~QH>rCrKS((oi@8#LUYY?FqY$?K$Wg4^0-{QGr&bnwg?Vb+8{N+60Fa zrP3fQ$GTTz%@b&LZe9t>M8t7_&Ru+-c+MI@LRFqk0f~d%{FpsSP z+3FM~KmPL8m%-MD+gl$6{-?XUH+HYvV{|ZA%v2ueS(4|fv|H98-N9MRIyyIJCMohT zH7vcY?wW`L!UO)c@aZ4X7@`HSGnNR3LsN$qt_*9ma7g!QQKQ(U%gY+&x5>CPtMA>HdW`8=?w0kL2d7t=%8kC_-CMTxlgFlt%FHTr#oH}%CH5bz zc`)%+rImN#!htIH3-nCk=}B?;wdN2!(p3B2^4_w?9`+^9d~$n6!(Be0D$NtC?i(7(F;1orrU(213f zB-jSQ?m?HN(chytn3c&vXw={!EC-_^ja8`!sE)u2Pwhcu}+CY`9IQ>zr}A?gsvzbt85W`}7E~KV$F^u!3B@{YTg~ zXwhJp0#yrukRgU~jiz;;04N;TXR=yaW?ErvPP z0qM_R?F!BB;jlikM45YLqP$sXCJZm`i+_M^85ot#iZU$co;c5olM*R;?$WF%0sKjrdmxEe>9?=JRvuT^*O2eoHqsThhdpB+&P9!LWBYw09iR3 z6LuZ$3WT1o`>(IacL(BD5<_7jz+a+gyj&t||i$DdW{xw>xL)%@p=<|F)bwuC} z>gm79aU9HWPUm@YxCE?mm9#{0;tksS!nA1GUJ-2B=HeG)*rxad3*(Nkqbu8;q(uuA zq_M=*3EKM{>p%H|jr2I2`X@9Wa1s$PR{1Q9?f~BWCmbuU5+pK*&RgG}Uom4UFOazG^8KeX%52cbpdcVHy-tQnl&g zj5eeXBpf8eB zm0p;k%Cac+Ijp@Ff~c|e!Jqf>8HGM;`TyYNh%>uA29}SHe9p0!t=x;%el_-)nusXT z_T5OyorUD1Bv16jf0J*jDUbl}SV3lLb_yrK9>t{TkdfsmZjf-b5uQtTq% z!_a?`Re5t}d2Cq4)(?J5NrmI92gpSl2=HHGO(usefpW=Xi+G#ID;MxP?sx*Qxcv}P zeF+V9Yfe-CwQ5~w1JtiMR?>C5ND7-y1NG2qaNBZwPhpkMAr$8qy3d!k(O~bOK=+S| zbH6f4s{6;EtIRG5zIpzyw2z*s@*WXD*w+pxtw-56bHr%ubCx%ZjYsKJiJ(n_x6 Tuple[PackageSet, bool] + """Converts a list of distributions into a PackageSet. + """ + # Default to using all packages installed on the system + if kwargs == {}: + kwargs = {"local_only": False, "skip": ()} + + package_set = {} + problems = False + for dist in get_installed_distributions(**kwargs): + name = canonicalize_name(dist.project_name) + try: + package_set[name] = PackageDetails(dist.version, dist.requires()) + except RequirementParseError as e: + # Don't crash on broken metadata + logger.warning("Error parsing requirements for %s: %s", name, e) + problems = True + return package_set, problems + + +def check_package_set(package_set, should_ignore=None): + # type: (PackageSet, Optional[Callable[[str], bool]]) -> CheckResult + """Check if a package set is consistent + + If should_ignore is passed, it should be a callable that takes a + package name and returns a boolean. + """ + if should_ignore is None: + def should_ignore(name): + return False + + missing = {} + conflicting = {} + + for package_name in package_set: + # Info about dependencies of package_name + missing_deps = set() # type: Set[Missing] + conflicting_deps = set() # type: Set[Conflicting] + + if should_ignore(package_name): + continue + + for req in package_set[package_name].requires: + name = canonicalize_name(req.project_name) # type: str + + # Check if it's missing + if name not in package_set: + missed = True + if req.marker is not None: + missed = req.marker.evaluate() + if missed: + missing_deps.add((name, req)) + continue + + # Check if there's a conflict + version = package_set[name].version # type: str + if not req.specifier.contains(version, prereleases=True): + conflicting_deps.add((name, version, req)) + + if missing_deps: + missing[package_name] = sorted(missing_deps, key=str) + if conflicting_deps: + conflicting[package_name] = sorted(conflicting_deps, key=str) + + return missing, conflicting + + +def check_install_conflicts(to_install): + # type: (List[InstallRequirement]) -> Tuple[PackageSet, CheckResult] + """For checking if the dependency graph would be consistent after \ + installing given requirements + """ + # Start from the current state + package_set, _ = create_package_set_from_installed() + # Install packages + would_be_installed = _simulate_installation_of(to_install, package_set) + + # Only warn about directly-dependent packages; create a whitelist of them + whitelist = _create_whitelist(would_be_installed, package_set) + + return ( + package_set, + check_package_set( + package_set, should_ignore=lambda name: name not in whitelist + ) + ) + + +def _simulate_installation_of(to_install, package_set): + # type: (List[InstallRequirement], PackageSet) -> Set[str] + """Computes the version of packages after installing to_install. + """ + + # Keep track of packages that were installed + installed = set() + + # Modify it as installing requirement_set would (assuming no errors) + for inst_req in to_install: + abstract_dist = make_distribution_for_install_requirement(inst_req) + dist = abstract_dist.get_pkg_resources_distribution() + + name = canonicalize_name(dist.key) + package_set[name] = PackageDetails(dist.version, dist.requires()) + + installed.add(name) + + return installed + + +def _create_whitelist(would_be_installed, package_set): + # type: (Set[str], PackageSet) -> Set[str] + packages_affected = set(would_be_installed) + + for package_name in package_set: + if package_name in packages_affected: + continue + + for req in package_set[package_name].requires: + if canonicalize_name(req.name) in packages_affected: + packages_affected.add(package_name) + break + + return packages_affected diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/check 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/check 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ef72c6616c8ffc29ea86fe044e0d295fca9653df GIT binary patch literal 5044 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 Tuple[PackageSet, bool] + """Converts a list of distributions into a PackageSet. + """ + # Default to using all packages installed on the system + if kwargs == {}: + kwargs = {"local_only": False, "skip": ()} + + package_set = {} + problems = False + for dist in get_installed_distributions(**kwargs): + name = canonicalize_name(dist.project_name) + try: + package_set[name] = PackageDetails(dist.version, dist.requires()) + except RequirementParseError as e: + # Don't crash on broken metadata + logger.warning("Error parsing requirements for %s: %s", name, e) + problems = True + return package_set, problems + + +def check_package_set(package_set, should_ignore=None): + # type: (PackageSet, Optional[Callable[[str], bool]]) -> CheckResult + """Check if a package set is consistent + + If should_ignore is passed, it should be a callable that takes a + package name and returns a boolean. + """ + if should_ignore is None: + def should_ignore(name): + return False + + missing = {} + conflicting = {} + + for package_name in package_set: + # Info about dependencies of package_name + missing_deps = set() # type: Set[Missing] + conflicting_deps = set() # type: Set[Conflicting] + + if should_ignore(package_name): + continue + + for req in package_set[package_name].requires: + name = canonicalize_name(req.project_name) # type: str + + # Check if it's missing + if name not in package_set: + missed = True + if req.marker is not None: + missed = req.marker.evaluate() + if missed: + missing_deps.add((name, req)) + continue + + # Check if there's a conflict + version = package_set[name].version # type: str + if not req.specifier.contains(version, prereleases=True): + conflicting_deps.add((name, version, req)) + + if missing_deps: + missing[package_name] = sorted(missing_deps, key=str) + if conflicting_deps: + conflicting[package_name] = sorted(conflicting_deps, key=str) + + return missing, conflicting + + +def check_install_conflicts(to_install): + # type: (List[InstallRequirement]) -> Tuple[PackageSet, CheckResult] + """For checking if the dependency graph would be consistent after \ + installing given requirements + """ + # Start from the current state + package_set, _ = create_package_set_from_installed() + # Install packages + would_be_installed = _simulate_installation_of(to_install, package_set) + + # Only warn about directly-dependent packages; create a whitelist of them + whitelist = _create_whitelist(would_be_installed, package_set) + + return ( + package_set, + check_package_set( + package_set, should_ignore=lambda name: name not in whitelist + ) + ) + + +def _simulate_installation_of(to_install, package_set): + # type: (List[InstallRequirement], PackageSet) -> Set[str] + """Computes the version of packages after installing to_install. + """ + + # Keep track of packages that were installed + installed = set() + + # Modify it as installing requirement_set would (assuming no errors) + for inst_req in to_install: + abstract_dist = make_distribution_for_install_requirement(inst_req) + dist = abstract_dist.get_pkg_resources_distribution() + + name = canonicalize_name(dist.key) + package_set[name] = PackageDetails(dist.version, dist.requires()) + + installed.add(name) + + return installed + + +def _create_whitelist(would_be_installed, package_set): + # type: (Set[str], PackageSet) -> Set[str] + packages_affected = set(would_be_installed) + + for package_name in package_set: + if package_name in packages_affected: + continue + + for req in package_set[package_name].requires: + if canonicalize_name(req.name) in packages_affected: + packages_affected.add(package_name) + break + + return packages_affected diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/check.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/check.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cf0edb9128d1afc31009d50394f46f3d2abbb979 GIT binary patch literal 5044 zcmd5%WIZ;_=R7=^6k;q$1>;PO~ zAK=b_5?$mWp(~F=uE{aiRJqF6obvX9)NW&*J+sr_*WFY3*IfP8 zKR)@UL*;J@|3Aj7f9nuML~TfiB9{_}+9=?uP~uWrp>~BFu1`@iMd>uPr)_x^%+X)l%ApX8C##Fq(SK%wdcrD4)xEHYSIywnVPPAPs+dP?y9?z<}P8pG^@KRBOqB-ih zbmUU|21RG-I~?duKFz2}-{A{yQ8X`&Z&7qk3U5<%UJ5N9w%J->Tf7bNRhYz4XyQEc z@~#)Dp~@nabz-HtJ`6j9u%~oA{x^ObEf|kX9U==;6`9d6QMTx;A^DHd1dR!EFVY}Z!cNz{<5XIUQ@%D)K5_Iz-h%;@%BngU>$#%*c zn9@^bJU~US&DD0$c?|mE>t|mF>py?I{(0bkxv}wN<7X#*PptNdowa5##Z(}ElI@#W z{I6sAa63_k;rl4=7-{{*khd5nGIUcJGmYNod=@h9DZay;Mbk5Tc#o6`<3trA0JBD? zR_Y#pf~q73dV)Ml_T?n?ARg*lP%3Z%7;$)6&zr!5_5c*`mi`ED3j?Wj20{$-S(s?$ zv*CO}Z3CrYk@r={2snK6x7&%%W;Y=R{3_3#C3u9snvVMW=@^J1i0+%JO$=;~?1 ztCbuHG?2ic!6JZ6s$~{~S_;euSO^@p`$UQKF2w4vi1$LHR`-4x# zEddG87GKitdp!Bo-x=9J;d0-_yuZ=m4Dym@lQ7YVNH6gvY8qc z--I_*UxJg7#v?F%4b@L^5+c37lcZ@d8yU-XreDPLI2VaBKKHVHSaaW>jQM@$EcMRG3)`cNpH|cassp?1O*W6t8QehtH8m z>i!ij;kDwF$S{ZXUpu15+`!m|w-b67s!;eyt+Y7&f!g0_okh3MdLz%2G{XSakMIHb zi!3hkAZAAz76W(`b`EMUOh#ay%n74N9FVD@M-Npe?#AUf7!pwfA&TegyfBEi6)u`W zT%5m*ivK2rII1+(>>6dmnA%MctGF&s&xRp!deTr14iN0MVc$0~!#46t@Umhd`vuUi z>}F5hVv=ew117!KC)lyR2SGCpr%{2sa_8KdQ*#?AEjrB#{^7pPLtb#Il{x2oa3 z_OV(OS?CMF?_$6yoe8@YLC|>P!I-}~;axH3soHd#m1d=afGvTVvl%|Nb-Wspr$jer zj^8jQ9=-TVP>qaE0vIAQVidwHD8RuP*hZkV(YDILkE@8)kP=eMM6yb22v{6YkzR5r zotFq^v8I2@8_3h)$RM^b@XK^~@}^PZd;;Sq7P4Wc#op4t$%0vB7zlhD7!G>4D(HMv zbd-MWMj#2Gf1PKr62;>^yLJ+=*!fp8A5J@Dbc0ON4 z{x1TVe;+&f4PMP2ovJnXICw(0>0EKoxq<=C(T_2}sVCS3)5A_B44g3xfB~3sAlb?8 zf}~&{OJ0T>Y@bKH&o>IbU;rb6mvZ<+o(Gs%5IN6w9}=D|=-@~eS`)_{_E3!$!X zo0vm-KjJF0TS#1HAUX)UUF7eGM7O#B4us_-3a3Oz{{fc%GcV6RgWQJ8=gu)_$wA3& zy@OVX(LoU9ogk1h-!V?&b&}wta4pn6t1yfyWb!Kke0!7^EB5O#dNP6unJxYxA7wlpD8!R|>_#d-ix{2*i04SwX z3JQEuYiS;h67?y^d%Xfttu~x_cb?x0%O*0OdFS3V%FY51x(K;csVy~DYfH7I{{Tw2 BuLl4C literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/freeze 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/freeze 2.py new file mode 100644 index 0000000..36a5c33 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/freeze 2.py @@ -0,0 +1,265 @@ +# The following comment should be removed at some point in the future. +# mypy: strict-optional=False +# mypy: disallow-untyped-defs=False + +from __future__ import absolute_import + +import collections +import logging +import os +import re + +from pip._vendor import six +from pip._vendor.packaging.utils import canonicalize_name +from pip._vendor.pkg_resources import RequirementParseError + +from pip._internal.exceptions import BadCommand, InstallationError +from pip._internal.req.constructors import ( + install_req_from_editable, + install_req_from_line, +) +from pip._internal.req.req_file import COMMENT_RE +from pip._internal.utils.misc import ( + dist_is_editable, + get_installed_distributions, +) +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import ( + Iterator, Optional, List, Container, Set, Dict, Tuple, Iterable, Union + ) + from pip._internal.cache import WheelCache + from pip._vendor.pkg_resources import ( + Distribution, Requirement + ) + + RequirementInfo = Tuple[Optional[Union[str, Requirement]], bool, List[str]] + + +logger = logging.getLogger(__name__) + + +def freeze( + requirement=None, # type: Optional[List[str]] + find_links=None, # type: Optional[List[str]] + local_only=None, # type: Optional[bool] + user_only=None, # type: Optional[bool] + paths=None, # type: Optional[List[str]] + skip_regex=None, # type: Optional[str] + isolated=False, # type: bool + wheel_cache=None, # type: Optional[WheelCache] + exclude_editable=False, # type: bool + skip=() # type: Container[str] +): + # type: (...) -> Iterator[str] + find_links = find_links or [] + skip_match = None + + if skip_regex: + skip_match = re.compile(skip_regex).search + + for link in find_links: + yield '-f %s' % link + installations = {} # type: Dict[str, FrozenRequirement] + for dist in get_installed_distributions(local_only=local_only, + skip=(), + user_only=user_only, + paths=paths): + try: + req = FrozenRequirement.from_dist(dist) + except RequirementParseError as exc: + # We include dist rather than dist.project_name because the + # dist string includes more information, like the version and + # location. We also include the exception message to aid + # troubleshooting. + logger.warning( + 'Could not generate requirement for distribution %r: %s', + dist, exc + ) + continue + if exclude_editable and req.editable: + continue + installations[req.canonical_name] = req + + if requirement: + # the options that don't get turned into an InstallRequirement + # should only be emitted once, even if the same option is in multiple + # requirements files, so we need to keep track of what has been emitted + # so that we don't emit it again if it's seen again + emitted_options = set() # type: Set[str] + # keep track of which files a requirement is in so that we can + # give an accurate warning if a requirement appears multiple times. + req_files = collections.defaultdict(list) # type: Dict[str, List[str]] + for req_file_path in requirement: + with open(req_file_path) as req_file: + for line in req_file: + if (not line.strip() or + line.strip().startswith('#') or + (skip_match and skip_match(line)) or + line.startswith(( + '-r', '--requirement', + '-Z', '--always-unzip', + '-f', '--find-links', + '-i', '--index-url', + '--pre', + '--trusted-host', + '--process-dependency-links', + '--extra-index-url'))): + line = line.rstrip() + if line not in emitted_options: + emitted_options.add(line) + yield line + continue + + if line.startswith('-e') or line.startswith('--editable'): + if line.startswith('-e'): + line = line[2:].strip() + else: + line = line[len('--editable'):].strip().lstrip('=') + line_req = install_req_from_editable( + line, + isolated=isolated, + wheel_cache=wheel_cache, + ) + else: + line_req = install_req_from_line( + COMMENT_RE.sub('', line).strip(), + isolated=isolated, + wheel_cache=wheel_cache, + ) + + if not line_req.name: + logger.info( + "Skipping line in requirement file [%s] because " + "it's not clear what it would install: %s", + req_file_path, line.strip(), + ) + logger.info( + " (add #egg=PackageName to the URL to avoid" + " this warning)" + ) + else: + line_req_canonical_name = canonicalize_name( + line_req.name) + if line_req_canonical_name not in installations: + # either it's not installed, or it is installed + # but has been processed already + if not req_files[line_req.name]: + logger.warning( + "Requirement file [%s] contains %s, but " + "package %r is not installed", + req_file_path, + COMMENT_RE.sub('', line).strip(), + line_req.name + ) + else: + req_files[line_req.name].append(req_file_path) + else: + yield str(installations[ + line_req_canonical_name]).rstrip() + del installations[line_req_canonical_name] + req_files[line_req.name].append(req_file_path) + + # Warn about requirements that were included multiple times (in a + # single requirements file or in different requirements files). + for name, files in six.iteritems(req_files): + if len(files) > 1: + logger.warning("Requirement %s included multiple times [%s]", + name, ', '.join(sorted(set(files)))) + + yield( + '## The following requirements were added by ' + 'pip freeze:' + ) + for installation in sorted( + installations.values(), key=lambda x: x.name.lower()): + if installation.canonical_name not in skip: + yield str(installation).rstrip() + + +def get_requirement_info(dist): + # type: (Distribution) -> RequirementInfo + """ + Compute and return values (req, editable, comments) for use in + FrozenRequirement.from_dist(). + """ + if not dist_is_editable(dist): + return (None, False, []) + + location = os.path.normcase(os.path.abspath(dist.location)) + + from pip._internal.vcs import vcs, RemoteNotFoundError + vcs_backend = vcs.get_backend_for_dir(location) + + if vcs_backend is None: + req = dist.as_requirement() + logger.debug( + 'No VCS found for editable requirement "%s" in: %r', req, + location, + ) + comments = [ + '# Editable install with no version control ({})'.format(req) + ] + return (location, True, comments) + + try: + req = vcs_backend.get_src_requirement(location, dist.project_name) + except RemoteNotFoundError: + req = dist.as_requirement() + comments = [ + '# Editable {} install with no remote ({})'.format( + type(vcs_backend).__name__, req, + ) + ] + return (location, True, comments) + + except BadCommand: + logger.warning( + 'cannot determine version of editable source in %s ' + '(%s command not found in path)', + location, + vcs_backend.name, + ) + return (None, True, []) + + except InstallationError as exc: + logger.warning( + "Error when trying to get requirement for VCS system %s, " + "falling back to uneditable format", exc + ) + else: + if req is not None: + return (req, True, []) + + logger.warning( + 'Could not determine repository location of %s', location + ) + comments = ['## !! Could not determine repository location'] + + return (None, False, comments) + + +class FrozenRequirement(object): + def __init__(self, name, req, editable, comments=()): + # type: (str, Union[str, Requirement], bool, Iterable[str]) -> None + self.name = name + self.canonical_name = canonicalize_name(name) + self.req = req + self.editable = editable + self.comments = comments + + @classmethod + def from_dist(cls, dist): + # type: (Distribution) -> FrozenRequirement + req, editable, comments = get_requirement_info(dist) + if req is None: + req = dist.as_requirement() + + return cls(dist.project_name, req, editable, comments=comments) + + def __str__(self): + req = self.req + if self.editable: + req = '-e %s' % req + return '\n'.join(list(self.comments) + [str(req)]) + '\n' diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/freeze 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/freeze 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b14ebdce6da41dec98d5d426ebe4adb4d23ea6ec GIT binary patch literal 7689 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 literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/freeze.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/freeze.py new file mode 100644 index 0000000..36a5c33 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/freeze.py @@ -0,0 +1,265 @@ +# The following comment should be removed at some point in the future. +# mypy: strict-optional=False +# mypy: disallow-untyped-defs=False + +from __future__ import absolute_import + +import collections +import logging +import os +import re + +from pip._vendor import six +from pip._vendor.packaging.utils import canonicalize_name +from pip._vendor.pkg_resources import RequirementParseError + +from pip._internal.exceptions import BadCommand, InstallationError +from pip._internal.req.constructors import ( + install_req_from_editable, + install_req_from_line, +) +from pip._internal.req.req_file import COMMENT_RE +from pip._internal.utils.misc import ( + dist_is_editable, + get_installed_distributions, +) +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import ( + Iterator, Optional, List, Container, Set, Dict, Tuple, Iterable, Union + ) + from pip._internal.cache import WheelCache + from pip._vendor.pkg_resources import ( + Distribution, Requirement + ) + + RequirementInfo = Tuple[Optional[Union[str, Requirement]], bool, List[str]] + + +logger = logging.getLogger(__name__) + + +def freeze( + requirement=None, # type: Optional[List[str]] + find_links=None, # type: Optional[List[str]] + local_only=None, # type: Optional[bool] + user_only=None, # type: Optional[bool] + paths=None, # type: Optional[List[str]] + skip_regex=None, # type: Optional[str] + isolated=False, # type: bool + wheel_cache=None, # type: Optional[WheelCache] + exclude_editable=False, # type: bool + skip=() # type: Container[str] +): + # type: (...) -> Iterator[str] + find_links = find_links or [] + skip_match = None + + if skip_regex: + skip_match = re.compile(skip_regex).search + + for link in find_links: + yield '-f %s' % link + installations = {} # type: Dict[str, FrozenRequirement] + for dist in get_installed_distributions(local_only=local_only, + skip=(), + user_only=user_only, + paths=paths): + try: + req = FrozenRequirement.from_dist(dist) + except RequirementParseError as exc: + # We include dist rather than dist.project_name because the + # dist string includes more information, like the version and + # location. We also include the exception message to aid + # troubleshooting. + logger.warning( + 'Could not generate requirement for distribution %r: %s', + dist, exc + ) + continue + if exclude_editable and req.editable: + continue + installations[req.canonical_name] = req + + if requirement: + # the options that don't get turned into an InstallRequirement + # should only be emitted once, even if the same option is in multiple + # requirements files, so we need to keep track of what has been emitted + # so that we don't emit it again if it's seen again + emitted_options = set() # type: Set[str] + # keep track of which files a requirement is in so that we can + # give an accurate warning if a requirement appears multiple times. + req_files = collections.defaultdict(list) # type: Dict[str, List[str]] + for req_file_path in requirement: + with open(req_file_path) as req_file: + for line in req_file: + if (not line.strip() or + line.strip().startswith('#') or + (skip_match and skip_match(line)) or + line.startswith(( + '-r', '--requirement', + '-Z', '--always-unzip', + '-f', '--find-links', + '-i', '--index-url', + '--pre', + '--trusted-host', + '--process-dependency-links', + '--extra-index-url'))): + line = line.rstrip() + if line not in emitted_options: + emitted_options.add(line) + yield line + continue + + if line.startswith('-e') or line.startswith('--editable'): + if line.startswith('-e'): + line = line[2:].strip() + else: + line = line[len('--editable'):].strip().lstrip('=') + line_req = install_req_from_editable( + line, + isolated=isolated, + wheel_cache=wheel_cache, + ) + else: + line_req = install_req_from_line( + COMMENT_RE.sub('', line).strip(), + isolated=isolated, + wheel_cache=wheel_cache, + ) + + if not line_req.name: + logger.info( + "Skipping line in requirement file [%s] because " + "it's not clear what it would install: %s", + req_file_path, line.strip(), + ) + logger.info( + " (add #egg=PackageName to the URL to avoid" + " this warning)" + ) + else: + line_req_canonical_name = canonicalize_name( + line_req.name) + if line_req_canonical_name not in installations: + # either it's not installed, or it is installed + # but has been processed already + if not req_files[line_req.name]: + logger.warning( + "Requirement file [%s] contains %s, but " + "package %r is not installed", + req_file_path, + COMMENT_RE.sub('', line).strip(), + line_req.name + ) + else: + req_files[line_req.name].append(req_file_path) + else: + yield str(installations[ + line_req_canonical_name]).rstrip() + del installations[line_req_canonical_name] + req_files[line_req.name].append(req_file_path) + + # Warn about requirements that were included multiple times (in a + # single requirements file or in different requirements files). + for name, files in six.iteritems(req_files): + if len(files) > 1: + logger.warning("Requirement %s included multiple times [%s]", + name, ', '.join(sorted(set(files)))) + + yield( + '## The following requirements were added by ' + 'pip freeze:' + ) + for installation in sorted( + installations.values(), key=lambda x: x.name.lower()): + if installation.canonical_name not in skip: + yield str(installation).rstrip() + + +def get_requirement_info(dist): + # type: (Distribution) -> RequirementInfo + """ + Compute and return values (req, editable, comments) for use in + FrozenRequirement.from_dist(). + """ + if not dist_is_editable(dist): + return (None, False, []) + + location = os.path.normcase(os.path.abspath(dist.location)) + + from pip._internal.vcs import vcs, RemoteNotFoundError + vcs_backend = vcs.get_backend_for_dir(location) + + if vcs_backend is None: + req = dist.as_requirement() + logger.debug( + 'No VCS found for editable requirement "%s" in: %r', req, + location, + ) + comments = [ + '# Editable install with no version control ({})'.format(req) + ] + return (location, True, comments) + + try: + req = vcs_backend.get_src_requirement(location, dist.project_name) + except RemoteNotFoundError: + req = dist.as_requirement() + comments = [ + '# Editable {} install with no remote ({})'.format( + type(vcs_backend).__name__, req, + ) + ] + return (location, True, comments) + + except BadCommand: + logger.warning( + 'cannot determine version of editable source in %s ' + '(%s command not found in path)', + location, + vcs_backend.name, + ) + return (None, True, []) + + except InstallationError as exc: + logger.warning( + "Error when trying to get requirement for VCS system %s, " + "falling back to uneditable format", exc + ) + else: + if req is not None: + return (req, True, []) + + logger.warning( + 'Could not determine repository location of %s', location + ) + comments = ['## !! Could not determine repository location'] + + return (None, False, comments) + + +class FrozenRequirement(object): + def __init__(self, name, req, editable, comments=()): + # type: (str, Union[str, Requirement], bool, Iterable[str]) -> None + self.name = name + self.canonical_name = canonicalize_name(name) + self.req = req + self.editable = editable + self.comments = comments + + @classmethod + def from_dist(cls, dist): + # type: (Distribution) -> FrozenRequirement + req, editable, comments = get_requirement_info(dist) + if req is None: + req = dist.as_requirement() + + return cls(dist.project_name, req, editable, comments=comments) + + def __str__(self): + req = self.req + if self.editable: + req = '-e %s' % req + return '\n'.join(list(self.comments) + [str(req)]) + '\n' diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/freeze.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/freeze.pyc new file mode 100644 index 0000000000000000000000000000000000000000..77e7b5d09bb3585e616ac5ae127abc1b32e993f2 GIT binary patch literal 7689 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 literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/install/__init__ 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/install/__init__ 2.py new file mode 100644 index 0000000..24d6a5d --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/install/__init__ 2.py @@ -0,0 +1,2 @@ +"""For modules related to installing packages. +""" diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/install/__init__ 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/install/__init__ 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..787be0142b5115617851a9a205a752af401e5b47 GIT binary patch literal 278 zcmYL^!A=4(5Qd8$Ae;COJ?;S*2qs>HK!P5PiE{B^Q@5oSN?Y1-%^DxhtIxv=IIEjD z$^W%8)BK$|KV1~xU-RdRbw8X78^P3gh7sqK%{O-_dG)lkYce=~u#f)X7T+A?hU22A`pO3xc{9g&4;M P2Q None + """Install a package in editable mode. Most arguments are pass-through + to setuptools. + """ + logger.info('Running setup.py develop for %s', name) + + args = make_setuptools_develop_args( + setup_py_path, + global_options=global_options, + install_options=install_options, + no_user_config=isolated, + prefix=prefix, + home=home, + use_user_site=use_user_site, + ) + + with indent_log(): + with build_env: + call_subprocess( + args, + cwd=unpacked_source_directory, + ) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/install/editable_legacy 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/install/editable_legacy 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b64480a646f9141339848d04dcc8f1820e1e0c12 GIT binary patch literal 1670 zcmd5*UvJz*5Fgw3KS^^mAOuukA&~BYoLd!%7ygF`D$=94R8S+a_1SyAP1jz>yS{SB zJOzozeh9t@uY4Xp0L-kNq&(!E_3hlw?Ck99{C?y8y*K&m&yRjepc^j!e~MH8fg%Nn zP&$yhARUNsfj~psXIwCY07h6g+L#e8z9}i;SX$*FKdX6>@HWO2w?D6iOpl9=s8o?- zf(hligYyQ?Bb@pSg#kFVU^RU>cfm0(Gy|$vWASSc)E+cLNc+&ZkPe{nARR)}!x9gE zoq+M+9N_ue;4~w6{t5;__X(sUXvXN`INu`(-~P}_Ty`-0h*#fh%kIa187EKUjDWZT zC08ld|Gv`3$D-Br0*xz<&RQRub*1WTJ@IiE~5sA_9tT1ui9%t&ZN6N0i58w?g~ z;wo4vnes{pSsA2fr`a#>ukPGl-nqNoZp^7M=7YP>*0*tFMetovit@0l-{EIp9P0;< z$YduIh2a&_HBcq5Y_I8{^9?RqkxAQ{2$mrVUqErOeLx9Pd%<+-dd}d5Z|qH+p+mOW z%eZfbC>Tps!kArC>5&ZP4YXrQ^UHMRwGmR!yM2p>dFL9ZE1EG|VGE#n^E&U##%3rdH5|;lSB-r;h#Hfpg0}@b None + """Install a package in editable mode. Most arguments are pass-through + to setuptools. + """ + logger.info('Running setup.py develop for %s', name) + + args = make_setuptools_develop_args( + setup_py_path, + global_options=global_options, + install_options=install_options, + no_user_config=isolated, + prefix=prefix, + home=home, + use_user_site=use_user_site, + ) + + with indent_log(): + with build_env: + call_subprocess( + args, + cwd=unpacked_source_directory, + ) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/install/editable_legacy.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/install/editable_legacy.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bb67ce04fb3740326c9edc96053500f28cf1d4e1 GIT binary patch literal 1670 zcmd5*Uys~05T7Lb|L%HA4}^dUB2=V(=xthx=nMbEse+2@0x5_#NVwU=oAuR+bFs7S zqVRM`JoZEIN%%~B0GM%dcje*Uan`e*@pwF*-*3FX_a-m?`t+9sy5Zvg7dZ8wC{ln3 zr30x8(t!vU`13%zkb4k$;E>(}*@L_fQNPvuAP0~SAsV*&0OSbrF+^i<_!z1`Y?L9$ z3FJEv?LfW@(JthB5bd=mMj)?2z7NqpI0XQA;A9H?H8{f@u0uM8-!ZWR%IeW+RC808^K$E_e8Z(GpUx-Z9~_IB zgOLoy6h+Dl!=%bu+YPkk@iWfsS)-KHtUJx(D$}jkK6)j1E7SF|yR+T6jvEi3eD{PM zeSQDv8y5b!SUgyKHS^GHdMJ*CHfDs2Z%axzmR5PhPitNzyp1u%?JsK~)BD9nRI11^ z!Gv<%!Fdhm5l(%I!T_9Du$n%cx!@QVngP|TvG_FzY7d$rquldBOoq8 z$yJK=f2g$av1m2DK;w#|v(|@ZU8y=-PkbCk`InWRTa$hd&Ml)iRb$*-~mlpmc1wu#sD#Sgm=*5>>23W(H^~E4~shEFx=_bF+sw^lAOHFdQp` z2tQ93vpz2D8Kg+YD|<#1D-{xjLYxp%GtCH`a7=>W4XwIMD~fGT6>)cyeK0Gxtc=at z5Sz&vGI)m6e-Dk`2BRc&odOG)&C83~POLQqy>gTaDL zTm>s7Q(oyHD}(g(B>VNF)t%eRJ9oF+jX5#K+`IdHeH%ws1V03&C=a{(9e#N4<3$vb z$xbE;!z-j~ph{lZUeiJ68=SWyleRSxEJGANhvIzufD)wkg6Y)toWU#K*qb;*hitRg zao-G4FqW!>F}tSHBN@y)XvdW17wODvBcz^p`xXsz^9rX+nlW2p3!r)TD({QNw(y#_ zukbV55;F^lE|w*oPQ4xybwZ+>c@xEd6TbjCq{mv^Gj5JsjuC?xBfc;e60JiDU?IK~ j{~NF=+fT6LYso*OR?vjuz}a=Dj{V$$bHhFG_Pu`r0_3i4 literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/install/legacy 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/install/legacy 2.py new file mode 100644 index 0000000..2d4adc4 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/install/legacy 2.py @@ -0,0 +1,129 @@ +"""Legacy installation process, i.e. `setup.py install`. +""" + +import logging +import os +from distutils.util import change_root + +from pip._internal.utils.deprecation import deprecated +from pip._internal.utils.logging import indent_log +from pip._internal.utils.misc import ensure_dir +from pip._internal.utils.setuptools_build import make_setuptools_install_args +from pip._internal.utils.subprocess import runner_with_spinner_message +from pip._internal.utils.temp_dir import TempDirectory +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import List, Optional, Sequence + + from pip._internal.models.scheme import Scheme + from pip._internal.req.req_install import InstallRequirement + + +logger = logging.getLogger(__name__) + + +def install( + install_req, # type: InstallRequirement + install_options, # type: List[str] + global_options, # type: Sequence[str] + root, # type: Optional[str] + home, # type: Optional[str] + prefix, # type: Optional[str] + use_user_site, # type: bool + pycompile, # type: bool + scheme, # type: Scheme +): + # type: (...) -> None + # Extend the list of global and install options passed on to + # the setup.py call with the ones from the requirements file. + # Options specified in requirements file override those + # specified on the command line, since the last option given + # to setup.py is the one that is used. + global_options = list(global_options) + \ + install_req.options.get('global_options', []) + install_options = list(install_options) + \ + install_req.options.get('install_options', []) + + header_dir = scheme.headers + + with TempDirectory(kind="record") as temp_dir: + record_filename = os.path.join(temp_dir.path, 'install-record.txt') + install_args = make_setuptools_install_args( + install_req.setup_py_path, + global_options=global_options, + install_options=install_options, + record_filename=record_filename, + root=root, + prefix=prefix, + header_dir=header_dir, + home=home, + use_user_site=use_user_site, + no_user_config=install_req.isolated, + pycompile=pycompile, + ) + + runner = runner_with_spinner_message( + "Running setup.py install for {}".format(install_req.name) + ) + with indent_log(), install_req.build_env: + runner( + cmd=install_args, + cwd=install_req.unpacked_source_directory, + ) + + if not os.path.exists(record_filename): + logger.debug('Record file %s not found', record_filename) + return + install_req.install_succeeded = True + + # We intentionally do not use any encoding to read the file because + # setuptools writes the file using distutils.file_util.write_file, + # which does not specify an encoding. + with open(record_filename) as f: + record_lines = f.read().splitlines() + + def prepend_root(path): + # type: (str) -> str + if root is None or not os.path.isabs(path): + return path + else: + return change_root(root, path) + + for line in record_lines: + directory = os.path.dirname(line) + if directory.endswith('.egg-info'): + egg_info_dir = prepend_root(directory) + break + else: + deprecated( + reason=( + "{} did not indicate that it installed an " + ".egg-info directory. Only setup.py projects " + "generating .egg-info directories are supported." + ).format(install_req), + replacement=( + "for maintainers: updating the setup.py of {0}. " + "For users: contact the maintainers of {0} to let " + "them know to update their setup.py.".format( + install_req.name + ) + ), + gone_in="20.2", + issue=6998, + ) + # FIXME: put the record somewhere + return + new_lines = [] + for line in record_lines: + filename = line.strip() + if os.path.isdir(filename): + filename += os.path.sep + new_lines.append( + os.path.relpath(prepend_root(filename), egg_info_dir) + ) + new_lines.sort() + ensure_dir(egg_info_dir) + inst_files_path = os.path.join(egg_info_dir, 'installed-files.txt') + with open(inst_files_path, 'w') as f: + f.write('\n'.join(new_lines) + '\n') diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/install/legacy 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/install/legacy 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a6bfb66975153d71a2f83a9bdcc333890e2457b5 GIT binary patch literal 3904 zcmd5<+j1Mn5$#=&AOV5|30@`YvW}A~RwV)@%Vkxil2lTblenzV%1X8(R3+;rW(Y2{ zH|-2W(E`d3awU1w2jwNN`Hp--K0rC$13;HB&k2Yb&ZVcPr~CAoLG53w&42v;=YQ(c z^yB0IFHy{EREnsF+9Tyt>QN63*Y>IBOS?vCjj{#mEs)1^3zRNWR;OOw^%p5!qHLLZ z%dTIiv_V;udQI0~qI89_7WG=Lzf9>WWoy)1bNvRTZOYcEx9<8)N;fF$P_ILt?ojnl zv0{bNP0F^Yw?)}D^|mS7q27*L(V}#hvOVhUx&A7pmngeTz02g~MB1a_KItp;66d>0 zYK^|fp|A0Y9~`vV5uc#Crw4KWJVnb`+>}h1mL^>HPj|bWbtwQLb&dR$9EU`s( z?uI)U{@vsIkE2h2``M>oMB!IQN1q@4=AedQyMXFmVys<8-^k#F@zvC%y80v1H-#0mr+>1`5SO(iN-$1WlS_gm;`YHqL)7HPJEg6 z-ktVoHjPEgG_292!M3UzBl9JBuQt3%lk6f5>oi=Vag!TrkyTDs2=?<<4aO991_Z`{ zbe+a4q?YKfh!q4DNi}E;nI?^)d4)*<41kC1=A|AVWiHgB*o&|_|UwnM{BQf|ZtxZ!EL z#ml2@vO813SC?qAMq?PV%i9k3xSq7>ZQXw%I>A9Z^k+=1)AKVLx9RR5@6cpp=BrCI z-VpmcG{(M{No{hs`pz4};*Lyh(*393dH6oE`=qu=ZBI`RLA66__Z?@bJyMrQLDN1= zS`hOQy~!3mkKO){d4Fs>L~>#RhjMYdO5<(W{1YFI>EJcG0|_Mbc#DSDXQKhJc_KZA z!Gb35>1*#1OMSpQ7slv$e2#yFXtAm=S-3sSJCl;K2~%H427UHjb1a@UPc zl2qq$rY$dLPLbsxlau7RWo9|mu|nR1F+}9FfGnr_$mj^AicDg)*q9e?pkL%C$-r_p zmgoHT#b%8nKHv%SEvmz^N}hp=51+-=;YpFgedcgb9;&Cq!M7iu z+`4&u>-PEiGdr}_-no5tdJ~^Pe)#aPOv)RxX#MK$XXgG_JR}9AY;^^8JS<9G$<<*F zr?Q8s+$*>>Yzx~XcBRghTo7NgO^gTfuX_u=;h1#wV1R8-iYZWHQ{?7*OuU!`DpBHM zz$oF{B(SHk4HA4E+iDfWc`(-idBBLdz8id*r{`}Xi)(F&850aNZVlLru>a?>M4KS4 zbYMnhSyZ^Zx^lze0BPJ8PB%y{Vt8aRJb(gU{xles%Bi%cSUkHji<98R%}F=-HN+X2 z5Cjx$+_yM}ep^G}L<3s{sg~I+c#;=qJRrLH;5w=1y1RA>b_{?Fz8yJLKDyccXo?Cm z(#hAjA`QcE?x-6KStIGj06Q~WHxGV@T40s(y~kQ-`O82aXgB7P&V(Gg@CsK9Hd!|; zl00M!Bn##6QF$H-N|!O5m;z4=twI4bD}ej5*vewg^pLSF*?BxlQWfd^nZ1OeQC`OV zCt5|O7*&0FBe>WKPV{rwYov(>#Xwhbc%_d=1JV4j8fm-1`#YpWX4LO%t+bM9pf;CA z1v(L4F=d+A6ah8j1t3Xih>rmD8h&Sl>@wNM*eWTf?q()pUm0DBIdREw7bTTW#SiQr z13-l=C(F(%u+#xR4g_H{BP;zhWO@ym(Lzq+aGNWRWVpi>bC7Ifqe$8eXV86g<}I|l8dy?vCMQ~IYt*so#WX* z2sxSpZ|nLD#*pzD@^b-?w)a None + # Extend the list of global and install options passed on to + # the setup.py call with the ones from the requirements file. + # Options specified in requirements file override those + # specified on the command line, since the last option given + # to setup.py is the one that is used. + global_options = list(global_options) + \ + install_req.options.get('global_options', []) + install_options = list(install_options) + \ + install_req.options.get('install_options', []) + + header_dir = scheme.headers + + with TempDirectory(kind="record") as temp_dir: + record_filename = os.path.join(temp_dir.path, 'install-record.txt') + install_args = make_setuptools_install_args( + install_req.setup_py_path, + global_options=global_options, + install_options=install_options, + record_filename=record_filename, + root=root, + prefix=prefix, + header_dir=header_dir, + home=home, + use_user_site=use_user_site, + no_user_config=install_req.isolated, + pycompile=pycompile, + ) + + runner = runner_with_spinner_message( + "Running setup.py install for {}".format(install_req.name) + ) + with indent_log(), install_req.build_env: + runner( + cmd=install_args, + cwd=install_req.unpacked_source_directory, + ) + + if not os.path.exists(record_filename): + logger.debug('Record file %s not found', record_filename) + return + install_req.install_succeeded = True + + # We intentionally do not use any encoding to read the file because + # setuptools writes the file using distutils.file_util.write_file, + # which does not specify an encoding. + with open(record_filename) as f: + record_lines = f.read().splitlines() + + def prepend_root(path): + # type: (str) -> str + if root is None or not os.path.isabs(path): + return path + else: + return change_root(root, path) + + for line in record_lines: + directory = os.path.dirname(line) + if directory.endswith('.egg-info'): + egg_info_dir = prepend_root(directory) + break + else: + deprecated( + reason=( + "{} did not indicate that it installed an " + ".egg-info directory. Only setup.py projects " + "generating .egg-info directories are supported." + ).format(install_req), + replacement=( + "for maintainers: updating the setup.py of {0}. " + "For users: contact the maintainers of {0} to let " + "them know to update their setup.py.".format( + install_req.name + ) + ), + gone_in="20.2", + issue=6998, + ) + # FIXME: put the record somewhere + return + new_lines = [] + for line in record_lines: + filename = line.strip() + if os.path.isdir(filename): + filename += os.path.sep + new_lines.append( + os.path.relpath(prepend_root(filename), egg_info_dir) + ) + new_lines.sort() + ensure_dir(egg_info_dir) + inst_files_path = os.path.join(egg_info_dir, 'installed-files.txt') + with open(inst_files_path, 'w') as f: + f.write('\n'.join(new_lines) + '\n') diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/install/legacy.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/install/legacy.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f22cc95a87ca74cee4ac5b3116e6a84e032990b1 GIT binary patch literal 3904 zcmd5<+in}l5v>_Ylt_`5L|tv!@@zH%1SF<>S=d031Oaw)S*)YojGc8%AekMpTh!2V z^K{da)+F}9izILUpgiSU@(K9>=TtRGU!puG6uZ@z>gwvMQ>UA?f3=(E|M>Zz`!xOd z`2R~3^9Ge7>Y?^X`ILIpL&LRw>iN>HQCg#HfqDz%@!SHXig~FIo6@V4U8CML@^T{W(QuFSb$W&K-5_;^ zzQ>{W`NWS7R@o8vQ9aayxPK8Oxv_DY#x^PPpsb3%Hs&Wm($(GI8>8*0?3Qz(Z@SIo z4L(N)9u(LWRQ=O9ALytm3hM@&7*x8fbU(IQy&X$(rE?pl#o+Cj&dsROkxD8zb{%W8 z_?eDmV_OudiKg~NaWybbY7bJ?D9?2joh9}(GG!v243@_O?S$G8daSeZvjmpdqPlRy z9Sr~O=~qvqPk;NXPrr!5KO7x>e)OAz8iwrxs)vcOb{UN?OLj<{O6QS&KGJ!As=AKp zNBvWsP5Z3#bLYhng4i&_N&5{9@1R^mVg2Usz@a4?`y7`s(GX!0#0`jE`Lr|fW!igx z+Naqx7A@1TMw15Hs%nhPSLD53_a;rUi!`j$aEZoEZm308Iawjt&s#MZQ`i|07z5IE z8n2LAqQ4X}koRnv)iX9B3N4sWuym@1#xk3M`@5 zKPHbiTcy`~XthbL(zr!xO*E}R#P^;c|9<~RS5IwTXJeqp-1BUQh8v{Zh!1eX({_`W zM_XjKr-HAq(&P$_VaN_|JKW`ZvP$pj{wvW54%(r=U}}xd&uF|#pZ)0pP1a|=x=Q19 zvA;uO?0b#W26wCPyfG~9$kYaX_53>z-zRpD)F!E|>FFV;wn^>0=M1$=>MAK{+Ji|8 zVm_ib*`)K>?f;bb$F@TxCnj(x7q=TU-jdDl`)EuD_vry7kkI2z8s40Z2E^ux^cV&U zn!M+4yeBO65v%p=4~VBcwC1pYTd^lFu`P~-?Kiml`lFdIKPI&=0NUi0Xz#EB=TnZu z!A*ep2$3clq{VTZMup^vu}mqmG@XrcGCf1iTh11wU{NWIUCE1 zevy^f!thZ-P)L#wf)7b9I4P>&<;2z?)6bOqf2PbXuaScUY-aEy6Xb=3^e9(-=0h&L zXamK3f{L>XURWmVXC>K@y}&a3+NwV0)+3w(QalE37B91wqk~1%a>An`*Oo7^!brc2 z?J0r^N1FK9glLd3TX3wcNiNZINN?08s|x{|BI98P5q zQ@K}gYuFaHN9;cIfpoD@@_#HPs2_n3G&2~?uQ#eh-5 zw@F}6V;dy+I=0m+i1T2s0rG$mbA31XGEXnwMi$rF5HltiXxtjG7h(U;Wr;RHTeniar(S!`u7XL`ukmh3zpC8>&Z{=#0x&?qnC{xhv2 zQ;e#X(soW0@6n|Nllk)A$-fh0vC7ZJS=mjJ9~HI!5A_=Lw+vc(e~l$tWX-xoF)+egt5$K?{9%j?4mHe@{gmCZ!$>=P~t;JIJ{95 zF-t^Icn6*E2$jP+8vh?RFdO+ZoOqP#UvR8VfU54d0LL|d4e*`+`E~C)MmB1zwSNPR C1h@$R literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/install/wheel 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/install/wheel 2.py new file mode 100644 index 0000000..aac975c --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/install/wheel 2.py @@ -0,0 +1,615 @@ +"""Support for installing and building the "wheel" binary package format. +""" + +# The following comment should be removed at some point in the future. +# mypy: strict-optional=False + +from __future__ import absolute_import + +import collections +import compileall +import csv +import logging +import os.path +import re +import shutil +import stat +import sys +import warnings +from base64 import urlsafe_b64encode +from zipfile import ZipFile + +from pip._vendor import pkg_resources +from pip._vendor.distlib.scripts import ScriptMaker +from pip._vendor.distlib.util import get_export_entry +from pip._vendor.six import StringIO + +from pip._internal.exceptions import InstallationError +from pip._internal.locations import get_major_minor_version +from pip._internal.utils.misc import captured_stdout, ensure_dir, hash_file +from pip._internal.utils.temp_dir import TempDirectory +from pip._internal.utils.typing import MYPY_CHECK_RUNNING +from pip._internal.utils.unpacking import unpack_file +from pip._internal.utils.wheel import parse_wheel + +if MYPY_CHECK_RUNNING: + from email.message import Message + from typing import ( + Dict, List, Optional, Sequence, Tuple, IO, Text, Any, + Iterable, Callable, Set, + ) + + from pip._internal.models.scheme import Scheme + + InstalledCSVRow = Tuple[str, ...] + + +logger = logging.getLogger(__name__) + + +def normpath(src, p): + # type: (str, str) -> str + return os.path.relpath(src, p).replace(os.path.sep, '/') + + +def rehash(path, blocksize=1 << 20): + # type: (str, int) -> Tuple[str, str] + """Return (encoded_digest, length) for path using hashlib.sha256()""" + h, length = hash_file(path, blocksize) + digest = 'sha256=' + urlsafe_b64encode( + h.digest() + ).decode('latin1').rstrip('=') + # unicode/str python2 issues + return (digest, str(length)) # type: ignore + + +def open_for_csv(name, mode): + # type: (str, Text) -> IO[Any] + if sys.version_info[0] < 3: + nl = {} # type: Dict[str, Any] + bin = 'b' + else: + nl = {'newline': ''} # type: Dict[str, Any] + bin = '' + return open(name, mode + bin, **nl) + + +def fix_script(path): + # type: (str) -> Optional[bool] + """Replace #!python with #!/path/to/python + Return True if file was changed. + """ + # XXX RECORD hashes will need to be updated + if os.path.isfile(path): + with open(path, 'rb') as script: + firstline = script.readline() + if not firstline.startswith(b'#!python'): + return False + exename = sys.executable.encode(sys.getfilesystemencoding()) + firstline = b'#!' + exename + os.linesep.encode("ascii") + rest = script.read() + with open(path, 'wb') as script: + script.write(firstline) + script.write(rest) + return True + return None + + +def wheel_root_is_purelib(metadata): + # type: (Message) -> bool + return metadata.get("Root-Is-Purelib", "").lower() == "true" + + +def get_entrypoints(filename): + # type: (str) -> Tuple[Dict[str, str], Dict[str, str]] + if not os.path.exists(filename): + return {}, {} + + # This is done because you can pass a string to entry_points wrappers which + # means that they may or may not be valid INI files. The attempt here is to + # strip leading and trailing whitespace in order to make them valid INI + # files. + with open(filename) as fp: + data = StringIO() + for line in fp: + data.write(line.strip()) + data.write("\n") + data.seek(0) + + # get the entry points and then the script names + entry_points = pkg_resources.EntryPoint.parse_map(data) + console = entry_points.get('console_scripts', {}) + gui = entry_points.get('gui_scripts', {}) + + def _split_ep(s): + # type: (pkg_resources.EntryPoint) -> Tuple[str, str] + """get the string representation of EntryPoint, + remove space and split on '=' + """ + split_parts = str(s).replace(" ", "").split("=") + return split_parts[0], split_parts[1] + + # convert the EntryPoint objects into strings with module:function + console = dict(_split_ep(v) for v in console.values()) + gui = dict(_split_ep(v) for v in gui.values()) + return console, gui + + +def message_about_scripts_not_on_PATH(scripts): + # type: (Sequence[str]) -> Optional[str] + """Determine if any scripts are not on PATH and format a warning. + Returns a warning message if one or more scripts are not on PATH, + otherwise None. + """ + if not scripts: + return None + + # Group scripts by the path they were installed in + grouped_by_dir = collections.defaultdict(set) # type: Dict[str, Set[str]] + for destfile in scripts: + parent_dir = os.path.dirname(destfile) + script_name = os.path.basename(destfile) + grouped_by_dir[parent_dir].add(script_name) + + # We don't want to warn for directories that are on PATH. + not_warn_dirs = [ + os.path.normcase(i).rstrip(os.sep) for i in + os.environ.get("PATH", "").split(os.pathsep) + ] + # If an executable sits with sys.executable, we don't warn for it. + # This covers the case of venv invocations without activating the venv. + not_warn_dirs.append(os.path.normcase(os.path.dirname(sys.executable))) + warn_for = { + parent_dir: scripts for parent_dir, scripts in grouped_by_dir.items() + if os.path.normcase(parent_dir) not in not_warn_dirs + } # type: Dict[str, Set[str]] + if not warn_for: + return None + + # Format a message + msg_lines = [] + for parent_dir, dir_scripts in warn_for.items(): + sorted_scripts = sorted(dir_scripts) # type: List[str] + if len(sorted_scripts) == 1: + start_text = "script {} is".format(sorted_scripts[0]) + else: + start_text = "scripts {} are".format( + ", ".join(sorted_scripts[:-1]) + " and " + sorted_scripts[-1] + ) + + msg_lines.append( + "The {} installed in '{}' which is not on PATH." + .format(start_text, parent_dir) + ) + + last_line_fmt = ( + "Consider adding {} to PATH or, if you prefer " + "to suppress this warning, use --no-warn-script-location." + ) + if len(msg_lines) == 1: + msg_lines.append(last_line_fmt.format("this directory")) + else: + msg_lines.append(last_line_fmt.format("these directories")) + + # Add a note if any directory starts with ~ + warn_for_tilde = any( + i[0] == "~" for i in os.environ.get("PATH", "").split(os.pathsep) if i + ) + if warn_for_tilde: + tilde_warning_msg = ( + "NOTE: The current PATH contains path(s) starting with `~`, " + "which may not be expanded by all applications." + ) + msg_lines.append(tilde_warning_msg) + + # Returns the formatted multiline message + return "\n".join(msg_lines) + + +def sorted_outrows(outrows): + # type: (Iterable[InstalledCSVRow]) -> List[InstalledCSVRow] + """Return the given rows of a RECORD file in sorted order. + + Each row is a 3-tuple (path, hash, size) and corresponds to a record of + a RECORD file (see PEP 376 and PEP 427 for details). For the rows + passed to this function, the size can be an integer as an int or string, + or the empty string. + """ + # Normally, there should only be one row per path, in which case the + # second and third elements don't come into play when sorting. + # However, in cases in the wild where a path might happen to occur twice, + # we don't want the sort operation to trigger an error (but still want + # determinism). Since the third element can be an int or string, we + # coerce each element to a string to avoid a TypeError in this case. + # For additional background, see-- + # https://github.com/pypa/pip/issues/5868 + return sorted(outrows, key=lambda row: tuple(str(x) for x in row)) + + +def get_csv_rows_for_installed( + old_csv_rows, # type: Iterable[List[str]] + installed, # type: Dict[str, str] + changed, # type: Set[str] + generated, # type: List[str] + lib_dir, # type: str +): + # type: (...) -> List[InstalledCSVRow] + """ + :param installed: A map from archive RECORD path to installation RECORD + path. + """ + installed_rows = [] # type: List[InstalledCSVRow] + for row in old_csv_rows: + if len(row) > 3: + logger.warning( + 'RECORD line has more than three elements: {}'.format(row) + ) + # Make a copy because we are mutating the row. + row = list(row) + old_path = row[0] + new_path = installed.pop(old_path, old_path) + row[0] = new_path + if new_path in changed: + digest, length = rehash(new_path) + row[1] = digest + row[2] = length + installed_rows.append(tuple(row)) + for f in generated: + digest, length = rehash(f) + installed_rows.append((normpath(f, lib_dir), digest, str(length))) + for f in installed: + installed_rows.append((installed[f], '', '')) + return installed_rows + + +class MissingCallableSuffix(Exception): + pass + + +def _raise_for_invalid_entrypoint(specification): + # type: (str) -> None + entry = get_export_entry(specification) + if entry is not None and entry.suffix is None: + raise MissingCallableSuffix(str(entry)) + + +class PipScriptMaker(ScriptMaker): + def make(self, specification, options=None): + # type: (str, Dict[str, Any]) -> List[str] + _raise_for_invalid_entrypoint(specification) + return super(PipScriptMaker, self).make(specification, options) + + +def install_unpacked_wheel( + name, # type: str + wheeldir, # type: str + wheel_zip, # type: ZipFile + scheme, # type: Scheme + req_description, # type: str + pycompile=True, # type: bool + warn_script_location=True # type: bool +): + # type: (...) -> None + """Install a wheel. + + :param name: Name of the project to install + :param wheeldir: Base directory of the unpacked wheel + :param wheel_zip: open ZipFile for wheel being installed + :param scheme: Distutils scheme dictating the install directories + :param req_description: String used in place of the requirement, for + logging + :param pycompile: Whether to byte-compile installed Python files + :param warn_script_location: Whether to check that scripts are installed + into a directory on PATH + :raises UnsupportedWheel: + * when the directory holds an unpacked wheel with incompatible + Wheel-Version + * when the .dist-info dir does not match the wheel + """ + # TODO: Investigate and break this up. + # TODO: Look into moving this into a dedicated class for representing an + # installation. + + source = wheeldir.rstrip(os.path.sep) + os.path.sep + + info_dir, metadata = parse_wheel(wheel_zip, name) + + if wheel_root_is_purelib(metadata): + lib_dir = scheme.purelib + else: + lib_dir = scheme.platlib + + subdirs = os.listdir(source) + data_dirs = [s for s in subdirs if s.endswith('.data')] + + # Record details of the files moved + # installed = files copied from the wheel to the destination + # changed = files changed while installing (scripts #! line typically) + # generated = files newly generated during the install (script wrappers) + installed = {} # type: Dict[str, str] + changed = set() + generated = [] # type: List[str] + + # Compile all of the pyc files that we're going to be installing + if pycompile: + with captured_stdout() as stdout: + with warnings.catch_warnings(): + warnings.filterwarnings('ignore') + compileall.compile_dir(source, force=True, quiet=True) + logger.debug(stdout.getvalue()) + + def record_installed(srcfile, destfile, modified=False): + # type: (str, str, bool) -> None + """Map archive RECORD paths to installation RECORD paths.""" + oldpath = normpath(srcfile, wheeldir) + newpath = normpath(destfile, lib_dir) + installed[oldpath] = newpath + if modified: + changed.add(destfile) + + def clobber( + source, # type: str + dest, # type: str + is_base, # type: bool + fixer=None, # type: Optional[Callable[[str], Any]] + filter=None # type: Optional[Callable[[str], bool]] + ): + # type: (...) -> None + ensure_dir(dest) # common for the 'include' path + + for dir, subdirs, files in os.walk(source): + basedir = dir[len(source):].lstrip(os.path.sep) + destdir = os.path.join(dest, basedir) + if is_base and basedir == '': + subdirs[:] = [s for s in subdirs if not s.endswith('.data')] + for f in files: + # Skip unwanted files + if filter and filter(f): + continue + srcfile = os.path.join(dir, f) + destfile = os.path.join(dest, basedir, f) + # directory creation is lazy and after the file filtering above + # to ensure we don't install empty dirs; empty dirs can't be + # uninstalled. + ensure_dir(destdir) + + # copyfile (called below) truncates the destination if it + # exists and then writes the new contents. This is fine in most + # cases, but can cause a segfault if pip has loaded a shared + # object (e.g. from pyopenssl through its vendored urllib3) + # Since the shared object is mmap'd an attempt to call a + # symbol in it will then cause a segfault. Unlinking the file + # allows writing of new contents while allowing the process to + # continue to use the old copy. + if os.path.exists(destfile): + os.unlink(destfile) + + # We use copyfile (not move, copy, or copy2) to be extra sure + # that we are not moving directories over (copyfile fails for + # directories) as well as to ensure that we are not copying + # over any metadata because we want more control over what + # metadata we actually copy over. + shutil.copyfile(srcfile, destfile) + + # Copy over the metadata for the file, currently this only + # includes the atime and mtime. + st = os.stat(srcfile) + if hasattr(os, "utime"): + os.utime(destfile, (st.st_atime, st.st_mtime)) + + # If our file is executable, then make our destination file + # executable. + if os.access(srcfile, os.X_OK): + st = os.stat(srcfile) + permissions = ( + st.st_mode | stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH + ) + os.chmod(destfile, permissions) + + changed = False + if fixer: + changed = fixer(destfile) + record_installed(srcfile, destfile, changed) + + clobber(source, lib_dir, True) + + dest_info_dir = os.path.join(lib_dir, info_dir) + + # Get the defined entry points + ep_file = os.path.join(dest_info_dir, 'entry_points.txt') + console, gui = get_entrypoints(ep_file) + + def is_entrypoint_wrapper(name): + # type: (str) -> bool + # EP, EP.exe and EP-script.py are scripts generated for + # entry point EP by setuptools + if name.lower().endswith('.exe'): + matchname = name[:-4] + elif name.lower().endswith('-script.py'): + matchname = name[:-10] + elif name.lower().endswith(".pya"): + matchname = name[:-4] + else: + matchname = name + # Ignore setuptools-generated scripts + return (matchname in console or matchname in gui) + + for datadir in data_dirs: + fixer = None + filter = None + for subdir in os.listdir(os.path.join(wheeldir, datadir)): + fixer = None + if subdir == 'scripts': + fixer = fix_script + filter = is_entrypoint_wrapper + source = os.path.join(wheeldir, datadir, subdir) + dest = getattr(scheme, subdir) + clobber(source, dest, False, fixer=fixer, filter=filter) + + maker = PipScriptMaker(None, scheme.scripts) + + # Ensure old scripts are overwritten. + # See https://github.com/pypa/pip/issues/1800 + maker.clobber = True + + # Ensure we don't generate any variants for scripts because this is almost + # never what somebody wants. + # See https://bitbucket.org/pypa/distlib/issue/35/ + maker.variants = {''} + + # This is required because otherwise distlib creates scripts that are not + # executable. + # See https://bitbucket.org/pypa/distlib/issue/32/ + maker.set_mode = True + + scripts_to_generate = [] + + # Special case pip and setuptools to generate versioned wrappers + # + # The issue is that some projects (specifically, pip and setuptools) use + # code in setup.py to create "versioned" entry points - pip2.7 on Python + # 2.7, pip3.3 on Python 3.3, etc. But these entry points are baked into + # the wheel metadata at build time, and so if the wheel is installed with + # a *different* version of Python the entry points will be wrong. The + # correct fix for this is to enhance the metadata to be able to describe + # such versioned entry points, but that won't happen till Metadata 2.0 is + # available. + # In the meantime, projects using versioned entry points will either have + # incorrect versioned entry points, or they will not be able to distribute + # "universal" wheels (i.e., they will need a wheel per Python version). + # + # Because setuptools and pip are bundled with _ensurepip and virtualenv, + # we need to use universal wheels. So, as a stopgap until Metadata 2.0, we + # override the versioned entry points in the wheel and generate the + # correct ones. This code is purely a short-term measure until Metadata 2.0 + # is available. + # + # To add the level of hack in this section of code, in order to support + # ensurepip this code will look for an ``ENSUREPIP_OPTIONS`` environment + # variable which will control which version scripts get installed. + # + # ENSUREPIP_OPTIONS=altinstall + # - Only pipX.Y and easy_install-X.Y will be generated and installed + # ENSUREPIP_OPTIONS=install + # - pipX.Y, pipX, easy_install-X.Y will be generated and installed. Note + # that this option is technically if ENSUREPIP_OPTIONS is set and is + # not altinstall + # DEFAULT + # - The default behavior is to install pip, pipX, pipX.Y, easy_install + # and easy_install-X.Y. + pip_script = console.pop('pip', None) + if pip_script: + if "ENSUREPIP_OPTIONS" not in os.environ: + scripts_to_generate.append('pip = ' + pip_script) + + if os.environ.get("ENSUREPIP_OPTIONS", "") != "altinstall": + scripts_to_generate.append( + 'pip%s = %s' % (sys.version_info[0], pip_script) + ) + + scripts_to_generate.append( + 'pip%s = %s' % (get_major_minor_version(), pip_script) + ) + # Delete any other versioned pip entry points + pip_ep = [k for k in console if re.match(r'pip(\d(\.\d)?)?$', k)] + for k in pip_ep: + del console[k] + easy_install_script = console.pop('easy_install', None) + if easy_install_script: + if "ENSUREPIP_OPTIONS" not in os.environ: + scripts_to_generate.append( + 'easy_install = ' + easy_install_script + ) + + scripts_to_generate.append( + 'easy_install-%s = %s' % ( + get_major_minor_version(), easy_install_script + ) + ) + # Delete any other versioned easy_install entry points + easy_install_ep = [ + k for k in console if re.match(r'easy_install(-\d\.\d)?$', k) + ] + for k in easy_install_ep: + del console[k] + + # Generate the console and GUI entry points specified in the wheel + scripts_to_generate.extend( + '%s = %s' % kv for kv in console.items() + ) + + gui_scripts_to_generate = [ + '%s = %s' % kv for kv in gui.items() + ] + + generated_console_scripts = [] # type: List[str] + + try: + generated_console_scripts = maker.make_multiple(scripts_to_generate) + generated.extend(generated_console_scripts) + + generated.extend( + maker.make_multiple(gui_scripts_to_generate, {'gui': True}) + ) + except MissingCallableSuffix as e: + entry = e.args[0] + raise InstallationError( + "Invalid script entry point: {} for req: {} - A callable " + "suffix is required. Cf https://packaging.python.org/" + "specifications/entry-points/#use-for-scripts for more " + "information.".format(entry, req_description) + ) + + if warn_script_location: + msg = message_about_scripts_not_on_PATH(generated_console_scripts) + if msg is not None: + logger.warning(msg) + + # Record pip as the installer + installer = os.path.join(dest_info_dir, 'INSTALLER') + temp_installer = os.path.join(dest_info_dir, 'INSTALLER.pip') + with open(temp_installer, 'wb') as installer_file: + installer_file.write(b'pip\n') + shutil.move(temp_installer, installer) + generated.append(installer) + + # Record details of all files installed + record = os.path.join(dest_info_dir, 'RECORD') + temp_record = os.path.join(dest_info_dir, 'RECORD.pip') + with open_for_csv(record, 'r') as record_in: + with open_for_csv(temp_record, 'w+') as record_out: + reader = csv.reader(record_in) + outrows = get_csv_rows_for_installed( + reader, installed=installed, changed=changed, + generated=generated, lib_dir=lib_dir, + ) + writer = csv.writer(record_out) + # Sort to simplify testing. + for row in sorted_outrows(outrows): + writer.writerow(row) + shutil.move(temp_record, record) + + +def install_wheel( + name, # type: str + wheel_path, # type: str + scheme, # type: Scheme + req_description, # type: str + pycompile=True, # type: bool + warn_script_location=True, # type: bool + _temp_dir_for_testing=None, # type: Optional[str] +): + # type: (...) -> None + with TempDirectory( + path=_temp_dir_for_testing, kind="unpacked-wheel" + ) as unpacked_dir, ZipFile(wheel_path, allowZip64=True) as z: + unpack_file(wheel_path, unpacked_dir.path) + install_unpacked_wheel( + name=name, + wheeldir=unpacked_dir.path, + wheel_zip=z, + scheme=scheme, + req_description=req_description, + pycompile=pycompile, + warn_script_location=warn_script_location, + ) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/install/wheel 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/install/wheel 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..93099e88980829369e352384e9f40c7393bd25e2 GIT binary patch literal 18924 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 EA4FB4*8l(j literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/install/wheel.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/install/wheel.py new file mode 100644 index 0000000..aac975c --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/install/wheel.py @@ -0,0 +1,615 @@ +"""Support for installing and building the "wheel" binary package format. +""" + +# The following comment should be removed at some point in the future. +# mypy: strict-optional=False + +from __future__ import absolute_import + +import collections +import compileall +import csv +import logging +import os.path +import re +import shutil +import stat +import sys +import warnings +from base64 import urlsafe_b64encode +from zipfile import ZipFile + +from pip._vendor import pkg_resources +from pip._vendor.distlib.scripts import ScriptMaker +from pip._vendor.distlib.util import get_export_entry +from pip._vendor.six import StringIO + +from pip._internal.exceptions import InstallationError +from pip._internal.locations import get_major_minor_version +from pip._internal.utils.misc import captured_stdout, ensure_dir, hash_file +from pip._internal.utils.temp_dir import TempDirectory +from pip._internal.utils.typing import MYPY_CHECK_RUNNING +from pip._internal.utils.unpacking import unpack_file +from pip._internal.utils.wheel import parse_wheel + +if MYPY_CHECK_RUNNING: + from email.message import Message + from typing import ( + Dict, List, Optional, Sequence, Tuple, IO, Text, Any, + Iterable, Callable, Set, + ) + + from pip._internal.models.scheme import Scheme + + InstalledCSVRow = Tuple[str, ...] + + +logger = logging.getLogger(__name__) + + +def normpath(src, p): + # type: (str, str) -> str + return os.path.relpath(src, p).replace(os.path.sep, '/') + + +def rehash(path, blocksize=1 << 20): + # type: (str, int) -> Tuple[str, str] + """Return (encoded_digest, length) for path using hashlib.sha256()""" + h, length = hash_file(path, blocksize) + digest = 'sha256=' + urlsafe_b64encode( + h.digest() + ).decode('latin1').rstrip('=') + # unicode/str python2 issues + return (digest, str(length)) # type: ignore + + +def open_for_csv(name, mode): + # type: (str, Text) -> IO[Any] + if sys.version_info[0] < 3: + nl = {} # type: Dict[str, Any] + bin = 'b' + else: + nl = {'newline': ''} # type: Dict[str, Any] + bin = '' + return open(name, mode + bin, **nl) + + +def fix_script(path): + # type: (str) -> Optional[bool] + """Replace #!python with #!/path/to/python + Return True if file was changed. + """ + # XXX RECORD hashes will need to be updated + if os.path.isfile(path): + with open(path, 'rb') as script: + firstline = script.readline() + if not firstline.startswith(b'#!python'): + return False + exename = sys.executable.encode(sys.getfilesystemencoding()) + firstline = b'#!' + exename + os.linesep.encode("ascii") + rest = script.read() + with open(path, 'wb') as script: + script.write(firstline) + script.write(rest) + return True + return None + + +def wheel_root_is_purelib(metadata): + # type: (Message) -> bool + return metadata.get("Root-Is-Purelib", "").lower() == "true" + + +def get_entrypoints(filename): + # type: (str) -> Tuple[Dict[str, str], Dict[str, str]] + if not os.path.exists(filename): + return {}, {} + + # This is done because you can pass a string to entry_points wrappers which + # means that they may or may not be valid INI files. The attempt here is to + # strip leading and trailing whitespace in order to make them valid INI + # files. + with open(filename) as fp: + data = StringIO() + for line in fp: + data.write(line.strip()) + data.write("\n") + data.seek(0) + + # get the entry points and then the script names + entry_points = pkg_resources.EntryPoint.parse_map(data) + console = entry_points.get('console_scripts', {}) + gui = entry_points.get('gui_scripts', {}) + + def _split_ep(s): + # type: (pkg_resources.EntryPoint) -> Tuple[str, str] + """get the string representation of EntryPoint, + remove space and split on '=' + """ + split_parts = str(s).replace(" ", "").split("=") + return split_parts[0], split_parts[1] + + # convert the EntryPoint objects into strings with module:function + console = dict(_split_ep(v) for v in console.values()) + gui = dict(_split_ep(v) for v in gui.values()) + return console, gui + + +def message_about_scripts_not_on_PATH(scripts): + # type: (Sequence[str]) -> Optional[str] + """Determine if any scripts are not on PATH and format a warning. + Returns a warning message if one or more scripts are not on PATH, + otherwise None. + """ + if not scripts: + return None + + # Group scripts by the path they were installed in + grouped_by_dir = collections.defaultdict(set) # type: Dict[str, Set[str]] + for destfile in scripts: + parent_dir = os.path.dirname(destfile) + script_name = os.path.basename(destfile) + grouped_by_dir[parent_dir].add(script_name) + + # We don't want to warn for directories that are on PATH. + not_warn_dirs = [ + os.path.normcase(i).rstrip(os.sep) for i in + os.environ.get("PATH", "").split(os.pathsep) + ] + # If an executable sits with sys.executable, we don't warn for it. + # This covers the case of venv invocations without activating the venv. + not_warn_dirs.append(os.path.normcase(os.path.dirname(sys.executable))) + warn_for = { + parent_dir: scripts for parent_dir, scripts in grouped_by_dir.items() + if os.path.normcase(parent_dir) not in not_warn_dirs + } # type: Dict[str, Set[str]] + if not warn_for: + return None + + # Format a message + msg_lines = [] + for parent_dir, dir_scripts in warn_for.items(): + sorted_scripts = sorted(dir_scripts) # type: List[str] + if len(sorted_scripts) == 1: + start_text = "script {} is".format(sorted_scripts[0]) + else: + start_text = "scripts {} are".format( + ", ".join(sorted_scripts[:-1]) + " and " + sorted_scripts[-1] + ) + + msg_lines.append( + "The {} installed in '{}' which is not on PATH." + .format(start_text, parent_dir) + ) + + last_line_fmt = ( + "Consider adding {} to PATH or, if you prefer " + "to suppress this warning, use --no-warn-script-location." + ) + if len(msg_lines) == 1: + msg_lines.append(last_line_fmt.format("this directory")) + else: + msg_lines.append(last_line_fmt.format("these directories")) + + # Add a note if any directory starts with ~ + warn_for_tilde = any( + i[0] == "~" for i in os.environ.get("PATH", "").split(os.pathsep) if i + ) + if warn_for_tilde: + tilde_warning_msg = ( + "NOTE: The current PATH contains path(s) starting with `~`, " + "which may not be expanded by all applications." + ) + msg_lines.append(tilde_warning_msg) + + # Returns the formatted multiline message + return "\n".join(msg_lines) + + +def sorted_outrows(outrows): + # type: (Iterable[InstalledCSVRow]) -> List[InstalledCSVRow] + """Return the given rows of a RECORD file in sorted order. + + Each row is a 3-tuple (path, hash, size) and corresponds to a record of + a RECORD file (see PEP 376 and PEP 427 for details). For the rows + passed to this function, the size can be an integer as an int or string, + or the empty string. + """ + # Normally, there should only be one row per path, in which case the + # second and third elements don't come into play when sorting. + # However, in cases in the wild where a path might happen to occur twice, + # we don't want the sort operation to trigger an error (but still want + # determinism). Since the third element can be an int or string, we + # coerce each element to a string to avoid a TypeError in this case. + # For additional background, see-- + # https://github.com/pypa/pip/issues/5868 + return sorted(outrows, key=lambda row: tuple(str(x) for x in row)) + + +def get_csv_rows_for_installed( + old_csv_rows, # type: Iterable[List[str]] + installed, # type: Dict[str, str] + changed, # type: Set[str] + generated, # type: List[str] + lib_dir, # type: str +): + # type: (...) -> List[InstalledCSVRow] + """ + :param installed: A map from archive RECORD path to installation RECORD + path. + """ + installed_rows = [] # type: List[InstalledCSVRow] + for row in old_csv_rows: + if len(row) > 3: + logger.warning( + 'RECORD line has more than three elements: {}'.format(row) + ) + # Make a copy because we are mutating the row. + row = list(row) + old_path = row[0] + new_path = installed.pop(old_path, old_path) + row[0] = new_path + if new_path in changed: + digest, length = rehash(new_path) + row[1] = digest + row[2] = length + installed_rows.append(tuple(row)) + for f in generated: + digest, length = rehash(f) + installed_rows.append((normpath(f, lib_dir), digest, str(length))) + for f in installed: + installed_rows.append((installed[f], '', '')) + return installed_rows + + +class MissingCallableSuffix(Exception): + pass + + +def _raise_for_invalid_entrypoint(specification): + # type: (str) -> None + entry = get_export_entry(specification) + if entry is not None and entry.suffix is None: + raise MissingCallableSuffix(str(entry)) + + +class PipScriptMaker(ScriptMaker): + def make(self, specification, options=None): + # type: (str, Dict[str, Any]) -> List[str] + _raise_for_invalid_entrypoint(specification) + return super(PipScriptMaker, self).make(specification, options) + + +def install_unpacked_wheel( + name, # type: str + wheeldir, # type: str + wheel_zip, # type: ZipFile + scheme, # type: Scheme + req_description, # type: str + pycompile=True, # type: bool + warn_script_location=True # type: bool +): + # type: (...) -> None + """Install a wheel. + + :param name: Name of the project to install + :param wheeldir: Base directory of the unpacked wheel + :param wheel_zip: open ZipFile for wheel being installed + :param scheme: Distutils scheme dictating the install directories + :param req_description: String used in place of the requirement, for + logging + :param pycompile: Whether to byte-compile installed Python files + :param warn_script_location: Whether to check that scripts are installed + into a directory on PATH + :raises UnsupportedWheel: + * when the directory holds an unpacked wheel with incompatible + Wheel-Version + * when the .dist-info dir does not match the wheel + """ + # TODO: Investigate and break this up. + # TODO: Look into moving this into a dedicated class for representing an + # installation. + + source = wheeldir.rstrip(os.path.sep) + os.path.sep + + info_dir, metadata = parse_wheel(wheel_zip, name) + + if wheel_root_is_purelib(metadata): + lib_dir = scheme.purelib + else: + lib_dir = scheme.platlib + + subdirs = os.listdir(source) + data_dirs = [s for s in subdirs if s.endswith('.data')] + + # Record details of the files moved + # installed = files copied from the wheel to the destination + # changed = files changed while installing (scripts #! line typically) + # generated = files newly generated during the install (script wrappers) + installed = {} # type: Dict[str, str] + changed = set() + generated = [] # type: List[str] + + # Compile all of the pyc files that we're going to be installing + if pycompile: + with captured_stdout() as stdout: + with warnings.catch_warnings(): + warnings.filterwarnings('ignore') + compileall.compile_dir(source, force=True, quiet=True) + logger.debug(stdout.getvalue()) + + def record_installed(srcfile, destfile, modified=False): + # type: (str, str, bool) -> None + """Map archive RECORD paths to installation RECORD paths.""" + oldpath = normpath(srcfile, wheeldir) + newpath = normpath(destfile, lib_dir) + installed[oldpath] = newpath + if modified: + changed.add(destfile) + + def clobber( + source, # type: str + dest, # type: str + is_base, # type: bool + fixer=None, # type: Optional[Callable[[str], Any]] + filter=None # type: Optional[Callable[[str], bool]] + ): + # type: (...) -> None + ensure_dir(dest) # common for the 'include' path + + for dir, subdirs, files in os.walk(source): + basedir = dir[len(source):].lstrip(os.path.sep) + destdir = os.path.join(dest, basedir) + if is_base and basedir == '': + subdirs[:] = [s for s in subdirs if not s.endswith('.data')] + for f in files: + # Skip unwanted files + if filter and filter(f): + continue + srcfile = os.path.join(dir, f) + destfile = os.path.join(dest, basedir, f) + # directory creation is lazy and after the file filtering above + # to ensure we don't install empty dirs; empty dirs can't be + # uninstalled. + ensure_dir(destdir) + + # copyfile (called below) truncates the destination if it + # exists and then writes the new contents. This is fine in most + # cases, but can cause a segfault if pip has loaded a shared + # object (e.g. from pyopenssl through its vendored urllib3) + # Since the shared object is mmap'd an attempt to call a + # symbol in it will then cause a segfault. Unlinking the file + # allows writing of new contents while allowing the process to + # continue to use the old copy. + if os.path.exists(destfile): + os.unlink(destfile) + + # We use copyfile (not move, copy, or copy2) to be extra sure + # that we are not moving directories over (copyfile fails for + # directories) as well as to ensure that we are not copying + # over any metadata because we want more control over what + # metadata we actually copy over. + shutil.copyfile(srcfile, destfile) + + # Copy over the metadata for the file, currently this only + # includes the atime and mtime. + st = os.stat(srcfile) + if hasattr(os, "utime"): + os.utime(destfile, (st.st_atime, st.st_mtime)) + + # If our file is executable, then make our destination file + # executable. + if os.access(srcfile, os.X_OK): + st = os.stat(srcfile) + permissions = ( + st.st_mode | stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH + ) + os.chmod(destfile, permissions) + + changed = False + if fixer: + changed = fixer(destfile) + record_installed(srcfile, destfile, changed) + + clobber(source, lib_dir, True) + + dest_info_dir = os.path.join(lib_dir, info_dir) + + # Get the defined entry points + ep_file = os.path.join(dest_info_dir, 'entry_points.txt') + console, gui = get_entrypoints(ep_file) + + def is_entrypoint_wrapper(name): + # type: (str) -> bool + # EP, EP.exe and EP-script.py are scripts generated for + # entry point EP by setuptools + if name.lower().endswith('.exe'): + matchname = name[:-4] + elif name.lower().endswith('-script.py'): + matchname = name[:-10] + elif name.lower().endswith(".pya"): + matchname = name[:-4] + else: + matchname = name + # Ignore setuptools-generated scripts + return (matchname in console or matchname in gui) + + for datadir in data_dirs: + fixer = None + filter = None + for subdir in os.listdir(os.path.join(wheeldir, datadir)): + fixer = None + if subdir == 'scripts': + fixer = fix_script + filter = is_entrypoint_wrapper + source = os.path.join(wheeldir, datadir, subdir) + dest = getattr(scheme, subdir) + clobber(source, dest, False, fixer=fixer, filter=filter) + + maker = PipScriptMaker(None, scheme.scripts) + + # Ensure old scripts are overwritten. + # See https://github.com/pypa/pip/issues/1800 + maker.clobber = True + + # Ensure we don't generate any variants for scripts because this is almost + # never what somebody wants. + # See https://bitbucket.org/pypa/distlib/issue/35/ + maker.variants = {''} + + # This is required because otherwise distlib creates scripts that are not + # executable. + # See https://bitbucket.org/pypa/distlib/issue/32/ + maker.set_mode = True + + scripts_to_generate = [] + + # Special case pip and setuptools to generate versioned wrappers + # + # The issue is that some projects (specifically, pip and setuptools) use + # code in setup.py to create "versioned" entry points - pip2.7 on Python + # 2.7, pip3.3 on Python 3.3, etc. But these entry points are baked into + # the wheel metadata at build time, and so if the wheel is installed with + # a *different* version of Python the entry points will be wrong. The + # correct fix for this is to enhance the metadata to be able to describe + # such versioned entry points, but that won't happen till Metadata 2.0 is + # available. + # In the meantime, projects using versioned entry points will either have + # incorrect versioned entry points, or they will not be able to distribute + # "universal" wheels (i.e., they will need a wheel per Python version). + # + # Because setuptools and pip are bundled with _ensurepip and virtualenv, + # we need to use universal wheels. So, as a stopgap until Metadata 2.0, we + # override the versioned entry points in the wheel and generate the + # correct ones. This code is purely a short-term measure until Metadata 2.0 + # is available. + # + # To add the level of hack in this section of code, in order to support + # ensurepip this code will look for an ``ENSUREPIP_OPTIONS`` environment + # variable which will control which version scripts get installed. + # + # ENSUREPIP_OPTIONS=altinstall + # - Only pipX.Y and easy_install-X.Y will be generated and installed + # ENSUREPIP_OPTIONS=install + # - pipX.Y, pipX, easy_install-X.Y will be generated and installed. Note + # that this option is technically if ENSUREPIP_OPTIONS is set and is + # not altinstall + # DEFAULT + # - The default behavior is to install pip, pipX, pipX.Y, easy_install + # and easy_install-X.Y. + pip_script = console.pop('pip', None) + if pip_script: + if "ENSUREPIP_OPTIONS" not in os.environ: + scripts_to_generate.append('pip = ' + pip_script) + + if os.environ.get("ENSUREPIP_OPTIONS", "") != "altinstall": + scripts_to_generate.append( + 'pip%s = %s' % (sys.version_info[0], pip_script) + ) + + scripts_to_generate.append( + 'pip%s = %s' % (get_major_minor_version(), pip_script) + ) + # Delete any other versioned pip entry points + pip_ep = [k for k in console if re.match(r'pip(\d(\.\d)?)?$', k)] + for k in pip_ep: + del console[k] + easy_install_script = console.pop('easy_install', None) + if easy_install_script: + if "ENSUREPIP_OPTIONS" not in os.environ: + scripts_to_generate.append( + 'easy_install = ' + easy_install_script + ) + + scripts_to_generate.append( + 'easy_install-%s = %s' % ( + get_major_minor_version(), easy_install_script + ) + ) + # Delete any other versioned easy_install entry points + easy_install_ep = [ + k for k in console if re.match(r'easy_install(-\d\.\d)?$', k) + ] + for k in easy_install_ep: + del console[k] + + # Generate the console and GUI entry points specified in the wheel + scripts_to_generate.extend( + '%s = %s' % kv for kv in console.items() + ) + + gui_scripts_to_generate = [ + '%s = %s' % kv for kv in gui.items() + ] + + generated_console_scripts = [] # type: List[str] + + try: + generated_console_scripts = maker.make_multiple(scripts_to_generate) + generated.extend(generated_console_scripts) + + generated.extend( + maker.make_multiple(gui_scripts_to_generate, {'gui': True}) + ) + except MissingCallableSuffix as e: + entry = e.args[0] + raise InstallationError( + "Invalid script entry point: {} for req: {} - A callable " + "suffix is required. Cf https://packaging.python.org/" + "specifications/entry-points/#use-for-scripts for more " + "information.".format(entry, req_description) + ) + + if warn_script_location: + msg = message_about_scripts_not_on_PATH(generated_console_scripts) + if msg is not None: + logger.warning(msg) + + # Record pip as the installer + installer = os.path.join(dest_info_dir, 'INSTALLER') + temp_installer = os.path.join(dest_info_dir, 'INSTALLER.pip') + with open(temp_installer, 'wb') as installer_file: + installer_file.write(b'pip\n') + shutil.move(temp_installer, installer) + generated.append(installer) + + # Record details of all files installed + record = os.path.join(dest_info_dir, 'RECORD') + temp_record = os.path.join(dest_info_dir, 'RECORD.pip') + with open_for_csv(record, 'r') as record_in: + with open_for_csv(temp_record, 'w+') as record_out: + reader = csv.reader(record_in) + outrows = get_csv_rows_for_installed( + reader, installed=installed, changed=changed, + generated=generated, lib_dir=lib_dir, + ) + writer = csv.writer(record_out) + # Sort to simplify testing. + for row in sorted_outrows(outrows): + writer.writerow(row) + shutil.move(temp_record, record) + + +def install_wheel( + name, # type: str + wheel_path, # type: str + scheme, # type: Scheme + req_description, # type: str + pycompile=True, # type: bool + warn_script_location=True, # type: bool + _temp_dir_for_testing=None, # type: Optional[str] +): + # type: (...) -> None + with TempDirectory( + path=_temp_dir_for_testing, kind="unpacked-wheel" + ) as unpacked_dir, ZipFile(wheel_path, allowZip64=True) as z: + unpack_file(wheel_path, unpacked_dir.path) + install_unpacked_wheel( + name=name, + wheeldir=unpacked_dir.path, + wheel_zip=z, + scheme=scheme, + req_description=req_description, + pycompile=pycompile, + warn_script_location=warn_script_location, + ) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/install/wheel.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/install/wheel.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c5ed91559658d65415dd200e0e0352aaaa52cb94 GIT binary patch literal 18924 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 AbstractDistribution + """Prepare a distribution for installation. + """ + abstract_dist = make_distribution_for_install_requirement(req) + with req_tracker.track(req): + abstract_dist.prepare_distribution_metadata(finder, build_isolation) + return abstract_dist + + +def unpack_vcs_link(link, location): + # type: (Link, str) -> None + vcs_backend = vcs.get_backend_for_scheme(link.scheme) + assert vcs_backend is not None + vcs_backend.unpack(location, url=hide_url(link.url)) + + +def _copy_file(filename, location, link): + # type: (str, str, Link) -> None + copy = True + download_location = os.path.join(location, link.filename) + if os.path.exists(download_location): + response = ask_path_exists( + 'The file {} exists. (i)gnore, (w)ipe, (b)ackup, (a)abort'.format( + display_path(download_location) + ), + ('i', 'w', 'b', 'a'), + ) + if response == 'i': + copy = False + elif response == 'w': + logger.warning('Deleting %s', display_path(download_location)) + os.remove(download_location) + elif response == 'b': + dest_file = backup_dir(download_location) + logger.warning( + 'Backing up %s to %s', + display_path(download_location), + display_path(dest_file), + ) + shutil.move(download_location, dest_file) + elif response == 'a': + sys.exit(-1) + if copy: + shutil.copy(filename, download_location) + logger.info('Saved %s', display_path(download_location)) + + +def unpack_http_url( + link, # type: Link + location, # type: str + downloader, # type: Downloader + download_dir=None, # type: Optional[str] + hashes=None, # type: Optional[Hashes] +): + # type: (...) -> str + temp_dir = TempDirectory(kind="unpack", globally_managed=True) + # If a download dir is specified, is the file already downloaded there? + already_downloaded_path = None + if download_dir: + already_downloaded_path = _check_download_dir( + link, download_dir, hashes + ) + + if already_downloaded_path: + from_path = already_downloaded_path + content_type = mimetypes.guess_type(from_path)[0] + else: + # let's download to a tmp dir + from_path, content_type = _download_http_url( + link, downloader, temp_dir.path, hashes + ) + + # unpack the archive to the build dir location. even when only + # downloading archives, they have to be unpacked to parse dependencies + unpack_file(from_path, location, content_type) + + return from_path + + +def _copy2_ignoring_special_files(src, dest): + # type: (str, str) -> None + """Copying special files is not supported, but as a convenience to users + we skip errors copying them. This supports tools that may create e.g. + socket files in the project source directory. + """ + try: + copy2_fixed(src, dest) + except shutil.SpecialFileError as e: + # SpecialFileError may be raised due to either the source or + # destination. If the destination was the cause then we would actually + # care, but since the destination directory is deleted prior to + # copy we ignore all of them assuming it is caused by the source. + logger.warning( + "Ignoring special file error '%s' encountered copying %s to %s.", + str(e), + path_to_display(src), + path_to_display(dest), + ) + + +def _copy_source_tree(source, target): + # type: (str, str) -> None + def ignore(d, names): + # type: (str, List[str]) -> List[str] + # Pulling in those directories can potentially be very slow, + # exclude the following directories if they appear in the top + # level dir (and only it). + # See discussion at https://github.com/pypa/pip/pull/6770 + return ['.tox', '.nox'] if d == source else [] + + kwargs = dict(ignore=ignore, symlinks=True) # type: CopytreeKwargs + + if not PY2: + # Python 2 does not support copy_function, so we only ignore + # errors on special file copy in Python 3. + kwargs['copy_function'] = _copy2_ignoring_special_files + + shutil.copytree(source, target, **kwargs) + + +def unpack_file_url( + link, # type: Link + location, # type: str + download_dir=None, # type: Optional[str] + hashes=None # type: Optional[Hashes] +): + # type: (...) -> Optional[str] + """Unpack link into location. + """ + link_path = link.file_path + # If it's a url to a local directory + if link.is_existing_dir(): + if os.path.isdir(location): + rmtree(location) + _copy_source_tree(link_path, location) + return None + + # If a download dir is specified, is the file already there and valid? + already_downloaded_path = None + if download_dir: + already_downloaded_path = _check_download_dir( + link, download_dir, hashes + ) + + if already_downloaded_path: + from_path = already_downloaded_path + else: + from_path = link_path + + # If --require-hashes is off, `hashes` is either empty, the + # link's embedded hash, or MissingHashes; it is required to + # match. If --require-hashes is on, we are satisfied by any + # hash in `hashes` matching: a URL-based or an option-based + # one; no internet-sourced hash will be in `hashes`. + if hashes: + hashes.check_against_path(from_path) + + content_type = mimetypes.guess_type(from_path)[0] + + # unpack the archive to the build dir location. even when only downloading + # archives, they have to be unpacked to parse dependencies + unpack_file(from_path, location, content_type) + + return from_path + + +def unpack_url( + link, # type: Link + location, # type: str + downloader, # type: Downloader + download_dir=None, # type: Optional[str] + hashes=None, # type: Optional[Hashes] +): + # type: (...) -> Optional[str] + """Unpack link into location, downloading if required. + + :param hashes: A Hashes object, one of whose embedded hashes must match, + or HashMismatch will be raised. If the Hashes is empty, no matches are + required, and unhashable types of requirements (like VCS ones, which + would ordinarily raise HashUnsupported) are allowed. + """ + # non-editable vcs urls + if link.is_vcs: + unpack_vcs_link(link, location) + return None + + # file urls + elif link.is_file: + return unpack_file_url(link, location, download_dir, hashes=hashes) + + # http urls + else: + return unpack_http_url( + link, + location, + downloader, + download_dir, + hashes=hashes, + ) + + +def _download_http_url( + link, # type: Link + downloader, # type: Downloader + temp_dir, # type: str + hashes, # type: Optional[Hashes] +): + # type: (...) -> Tuple[str, str] + """Download link url into temp_dir using provided session""" + download = downloader(link) + + file_path = os.path.join(temp_dir, download.filename) + with open(file_path, 'wb') as content_file: + for chunk in download.chunks: + content_file.write(chunk) + + if hashes: + hashes.check_against_path(file_path) + + return file_path, download.response.headers.get('content-type', '') + + +def _check_download_dir(link, download_dir, hashes): + # type: (Link, str, Optional[Hashes]) -> Optional[str] + """ Check download_dir for previously downloaded file with correct hash + If a correct file is found return its path else None + """ + download_path = os.path.join(download_dir, link.filename) + + if not os.path.exists(download_path): + return None + + # If already downloaded, does its hash match? + logger.info('File was already downloaded %s', download_path) + if hashes: + try: + hashes.check_against_path(download_path) + except HashMismatch: + logger.warning( + 'Previously-downloaded file %s has bad hash. ' + 'Re-downloading.', + download_path + ) + os.unlink(download_path) + return None + return download_path + + +class RequirementPreparer(object): + """Prepares a Requirement + """ + + def __init__( + self, + build_dir, # type: str + download_dir, # type: Optional[str] + src_dir, # type: str + wheel_download_dir, # type: Optional[str] + build_isolation, # type: bool + req_tracker, # type: RequirementTracker + downloader, # type: Downloader + finder, # type: PackageFinder + require_hashes, # type: bool + use_user_site, # type: bool + ): + # type: (...) -> None + super(RequirementPreparer, self).__init__() + + self.src_dir = src_dir + self.build_dir = build_dir + self.req_tracker = req_tracker + self.downloader = downloader + self.finder = finder + + # Where still-packed archives should be written to. If None, they are + # not saved, and are deleted immediately after unpacking. + self.download_dir = download_dir + + # Where still-packed .whl files should be written to. If None, they are + # written to the download_dir parameter. Separate to download_dir to + # permit only keeping wheel archives for pip wheel. + self.wheel_download_dir = wheel_download_dir + + # NOTE + # download_dir and wheel_download_dir overlap semantically and may + # be combined if we're willing to have non-wheel archives present in + # the wheelhouse output by 'pip wheel'. + + # Is build isolation allowed? + self.build_isolation = build_isolation + + # Should hash-checking be required? + self.require_hashes = require_hashes + + # Should install in user site-packages? + self.use_user_site = use_user_site + + @property + def _download_should_save(self): + # type: () -> bool + if not self.download_dir: + return False + + if os.path.exists(self.download_dir): + return True + + logger.critical('Could not find download directory') + raise InstallationError( + "Could not find or access download directory '{}'" + .format(self.download_dir)) + + def prepare_linked_requirement( + self, + req, # type: InstallRequirement + ): + # type: (...) -> AbstractDistribution + """Prepare a requirement that would be obtained from req.link + """ + assert req.link + link = req.link + + # TODO: Breakup into smaller functions + if link.scheme == 'file': + path = link.file_path + logger.info('Processing %s', display_path(path)) + else: + logger.info('Collecting %s', req.req or req) + + with indent_log(): + # @@ if filesystem packages are not marked + # editable in a req, a non deterministic error + # occurs when the script attempts to unpack the + # build directory + # Since source_dir is only set for editable requirements. + assert req.source_dir is None + req.ensure_has_source_dir(self.build_dir) + # If a checkout exists, it's unwise to keep going. version + # inconsistencies are logged later, but do not fail the + # installation. + # FIXME: this won't upgrade when there's an existing + # package unpacked in `req.source_dir` + if os.path.exists(os.path.join(req.source_dir, 'setup.py')): + raise PreviousBuildDirError( + "pip can't proceed with requirements '{}' due to a" + " pre-existing build directory ({}). This is " + "likely due to a previous installation that failed" + ". pip is being responsible and not assuming it " + "can delete this. Please delete it and try again." + .format(req, req.source_dir) + ) + + # Now that we have the real link, we can tell what kind of + # requirements we have and raise some more informative errors + # than otherwise. (For example, we can raise VcsHashUnsupported + # for a VCS URL rather than HashMissing.) + if self.require_hashes: + # We could check these first 2 conditions inside + # unpack_url and save repetition of conditions, but then + # we would report less-useful error messages for + # unhashable requirements, complaining that there's no + # hash provided. + if link.is_vcs: + raise VcsHashUnsupported() + elif link.is_existing_dir(): + raise DirectoryUrlHashUnsupported() + if not req.original_link and not req.is_pinned: + # Unpinned packages are asking for trouble when a new + # version is uploaded. This isn't a security check, but + # it saves users a surprising hash mismatch in the + # future. + # + # file:/// URLs aren't pinnable, so don't complain + # about them not being pinned. + raise HashUnpinned() + + hashes = req.hashes(trust_internet=not self.require_hashes) + if self.require_hashes and not hashes: + # Known-good hashes are missing for this requirement, so + # shim it with a facade object that will provoke hash + # computation and then raise a HashMissing exception + # showing the user what the hash should be. + hashes = MissingHashes() + + download_dir = self.download_dir + if link.is_wheel and self.wheel_download_dir: + # when doing 'pip wheel` we download wheels to a + # dedicated dir. + download_dir = self.wheel_download_dir + + try: + local_path = unpack_url( + link, req.source_dir, self.downloader, download_dir, + hashes=hashes, + ) + except requests.HTTPError as exc: + logger.critical( + 'Could not install requirement %s because of error %s', + req, + exc, + ) + raise InstallationError( + 'Could not install requirement {} because of HTTP ' + 'error {} for URL {}'.format(req, exc, link) + ) + + # For use in later processing, preserve the file path on the + # requirement. + if local_path: + req.local_file_path = local_path + + if link.is_wheel: + if download_dir: + # When downloading, we only unpack wheels to get + # metadata. + autodelete_unpacked = True + else: + # When installing a wheel, we use the unpacked + # wheel. + autodelete_unpacked = False + else: + # We always delete unpacked sdists after pip runs. + autodelete_unpacked = True + if autodelete_unpacked: + write_delete_marker_file(req.source_dir) + + abstract_dist = _get_prepared_distribution( + req, self.req_tracker, self.finder, self.build_isolation, + ) + + if download_dir: + if link.is_existing_dir(): + logger.info('Link is a directory, ignoring download_dir') + elif local_path and not os.path.exists( + os.path.join(download_dir, link.filename) + ): + _copy_file(local_path, download_dir, link) + + if self._download_should_save: + # Make a .zip of the source_dir we already created. + if link.is_vcs: + req.archive(self.download_dir) + return abstract_dist + + def prepare_editable_requirement( + self, + req, # type: InstallRequirement + ): + # type: (...) -> AbstractDistribution + """Prepare an editable requirement + """ + assert req.editable, "cannot prepare a non-editable req as editable" + + logger.info('Obtaining %s', req) + + with indent_log(): + if self.require_hashes: + raise InstallationError( + 'The editable requirement {} cannot be installed when ' + 'requiring hashes, because there is no single file to ' + 'hash.'.format(req) + ) + req.ensure_has_source_dir(self.src_dir) + req.update_editable(not self._download_should_save) + + abstract_dist = _get_prepared_distribution( + req, self.req_tracker, self.finder, self.build_isolation, + ) + + if self._download_should_save: + req.archive(self.download_dir) + req.check_if_exists(self.use_user_site) + + return abstract_dist + + def prepare_installed_requirement( + self, + req, # type: InstallRequirement + skip_reason # type: str + ): + # type: (...) -> AbstractDistribution + """Prepare an already-installed requirement + """ + assert req.satisfied_by, "req should have been satisfied but isn't" + assert skip_reason is not None, ( + "did not get skip reason skipped but req.satisfied_by " + "is set to {}".format(req.satisfied_by) + ) + logger.info( + 'Requirement %s: %s (%s)', + skip_reason, req, req.satisfied_by.version + ) + with indent_log(): + if self.require_hashes: + logger.debug( + 'Since it is already installed, we are trusting this ' + 'package without checking its hash. To ensure a ' + 'completely repeatable environment, install into an ' + 'empty virtualenv.' + ) + abstract_dist = InstalledDistribution(req) + + return abstract_dist diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/prepare 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/prepare 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a71f05e62596fa646dfc6cdeb44c990104c0cbd6 GIT binary patch literal 14484 zcmd5@OLH98bw1sL*MJ}af&||pTOuhAC1CiFM7S!Ch7{y>mHuU%vi%OUj>7d|$@Lyjl?nMH&bl30+AXX&_?bt~A_UydsTCFFquV zp0Oc>mGqc2j@k5tBu_|sTpGtEJt2(~l6uncBz;mEPfGffG@g?5q%=<2+Pft= zCFyBtoVMvbk~}Tx8EKrc=}AdylAe{uS(~1c+bJCcT zv@VUhr01k@PSW$zIB(lcOL9Tdi_*Ag)BAMKo|DFNHoaex=OukX8ZX%Nj3k#NeNh@O z+VlZQUXt`>X}oOH2PJt$(pRPNs!bn~o=NG-!L%r5-3R;4ywAFF6 z`uhClkz19_y-c6(){-% zJgt%UdljD63Lo^6XEeDWVNI)jDB)R++>r1Yi9V8L9O1Lfxi9i*!)LR_+ANvqEP@+( z)Cuy)c!3wjrpV)^ZV_i~Z#m1oxNV9cNdjh!$Nz($g_?sl#TbG-y3>tJVQdcAQEq&C z(I(h$8mvdn!5*9Fv03)mWaBuG(x_e7CNpSq-3}LpR|h6i8$n5N6v0(AXcbw$bt_M< z1!nbD+jKjfEH9$4m_Rx6K8Q^k6s^^M#;tZIZnsfm@Ad$?p11QHO*t%fU?a}D=B;j= zVCdYIOrzxEmU(C(JK0?*Yh|6Si_PWuZWP+g-N?l7CT_2=QB-csII`n*h=n$jY{gbR zguKl>F0esS65%Ti^7SZ3Z%Jg=JBb>BS#NfNVzn9F#eSHAJuL;T^==3In(GR&znvu5 z(rS7rt8o}LyLnQu18rPnJO$P&xRZHW2Ivf=E^_#^v0*n`D<^_zt{9{ zEi7DLc-NM3<=u7%v#^s@YT(&#v`lRX-#UwV63r4;#+>&tdCmQ>LplnQVi>tMyB(}m zn^&3K>hRcGB{l3v)|DktW6&xdAO>x~oxXu71S`=y+}hmsV+U)m+Z1=}YPQ)J61Qb(pEAjW$KaGG>q?=-iE+v;WErkZ z+-YapY4K3VPR!DSxd2ImgSl6c0?dTnuWkQst@Fs%VegsOyH}h^(kT)}&(9Ei6Bp$I8r7CV({fBK{L&}`z ztlSaj5SX*#j5rf+)tzvv&IF|B6v7GQRgm88?n8VZQd3Tgd(XA?rRz6HfQf0N05>Zu z-xv2D7!jNeDGCa|M14f^MhFV8FrUOfBKao_?}4G9J;A;zZ^I!ud~ZzJ$4ecrKGlOA zNhyf5q&TwIJBXLixtD}`vwC_}5v;OC0feae)HgwrM?tvNA1(?l_T&VY^DMO~cG&{T zA?W24A1@uz+o7LgmWDt~#%4f@B)I7czYkO@&e7p1x3A9oTH|9>-r8GYF`Pan=I!?A0s?Z_u;kWoXKe?dTWNug&t zQ7aA-m9oZ*jn~c!uW#|pda%>HfMy$ZdLwGbQM(mUMs}gyjiR{C$TRD4$BSs{7}T>J z7eEJf@8&AHEW4v@%@TyGLE)vrme;~57m*j$S1cYh8PG-1n@SrMBd?QZYp};WlXY{9 z49ck@)NlJ}<9ll1ikD+DP${Pz$jFD=?#c?W_- z;fsHb#n)M^J6PmC`N0Ah&Be|vkCUaRD(wdJ7>-(oMk6&^woT`jy+J72RpYyV2ITshgO0^=JP{vQU7Y}WMG5hwsCU?@g~cB$!gwH$T5YGG>4N40W=6jndmbAZJbMgN4k8}gpG zla!B@-ENDE;wt$)kB|9B1fU40bXuiq=iCPnd7H!rL=6dOC0+i!%0ZQS4hat;(3X+p zKtT9FZ9`Dz%c@(^t+i&Mu!mJ)4@=&qE~ft0)}?~~j+DDrEupY>u1MKJV+i2GRPjLA zDs`#lsjf##dNn7o0{DmkG(Fl4aCt$5_F$D2WihJALXAeeDq>fmx1XmWtG zVrv!{!S+OdZXWf!>rHpo3)-RAZF6Kg=sX3KoLX6f4q4;Xl6XDxKAvCX#LX<`9k*8d zoo!~_B*YBExEp5+8Qz}{?=+r&jF~B$(`nTuYgFyp#QR&ZvX`(JY2tiV|-dF*2ep{m)ynCGV4cq1F5BJe7fmB65+H)K#1YM_gNVWNWqC z^P;M++{eavc>*BHCOKna;AXzdn?!fu<&+`6)qi2DLg{o=g| zskVO%h?EHCB@*c|L}d67oUB8YDK(+@Lg>L*aYxz_Iw;+zl1eds|z`ul*BnH^xQSOs()a}y5-9%h8n=0%~-clD# z6{Ysxgs_s=I=)J~I%A))DUILF)hJ5(E*eFp=UBD}L8<4PL;$de32NamXwqrWG`Nve z;jDt#M9H%M4a%*u{V8LA!hn4}JocY5?`H@e1LFJ|)A+crh4<`pt8gUh?@)EPI##Vz zD=idLQE!vLhe+UTV9A)>B!tCn3r2H6eEHKfVz%WcvK$;0h?C|=uNHD~pQ8s%`dTng zBAi#qL(T8dQ0|u=YH0loZy)!?$ccw<#;!0RGg+x~nK4Qo zrKc9|o8wlH_yivQI|!`hNd@xg4^1!Pw@KEla>JSiE`IE1sSAOmhTIu^c3UJx(ZL-c zD=QoS201`dJi|$zA@9{RX|LSC)etIlU0hdP2h$QdQUMgskS3|BN&58KhkFIe{Lq)3 z&wJ(ub`!$k+n=}&JFiN(OV-E4{CHqQa5~6gLZKE|Y)$WG%E*+?3C$F3k*xlmPJIZm zHQdA48CMC!EFn>;qOX0D&r(yb?U($&1-peQV0rCBx{?D-=2fRS*vq#YaY!cE4AVTU zG2Ca`c6VkK0;1q3FQn`U6Zhe|RN=+pKIg6S1ip%6Y=nYxDo>P_`r2{H|Hxs}6WbAM ztZ$u`!c&Q;JH$FqDtLvMq#xY@c)i`e3V`vHtesSh@n4Pu1nclPPVt_KJ7I10;xw zWw$t6o(FnV=fN{NG-mv)Zp*BObC|T;1DB)6U%5O7yXAlAmh^*5Kwhk&4Ac3QyThSF z8K7CcJlP3WI;Z+X3+R+U>vD_FOa5ye1*eS&Ht~W^;|V*;uUYRl=nmMv3PnQjVdfE( zO3w=h%{lAUwMH8($ZV;AyMcHM?t0d%6M6JumWqDDD~LgMm{9-`;{zozXFf|3V6!r3 zj3Wbmb#Pg3{u2pYtb47XeWsvI(26jOBDzxRSnHCa%L}{etPW5wn$rt6cB#5;TPk|B zAKg1!x~hTpXq6H(4m4F937cg5oswPda)2ekPUd{jaw%f(O`#Od2V4-#q^{tJ4i7_rfZ6)hoSJX;-#GhqAded8^(p^X_qSse5D2VVXE02gT znghk(u-!xYi4^OTf>ay%3L!R`B+Bt~215wIOSrhr;}y6Y62074=NJ40_GOn({H*)# zQxjMi#BNbTk&s0#TP#zsgoyQ@arf*c0&Q?rjQTQ#?!QDWL+f3;%u>~`oQi*e!5o7+ z1BF98IR7StKSQ9HEy!D|@kV5o^v_wOo2Terl{87k&X!ut4yrfP6(pm(Eyd13x5&yz zV%EnHh5mVzKL#qB*8$*O;(0w5+yxHs`FGUYbmGY9q*JZn;~aJmyW=A>&eX^$YVhHi z(dr1VeEGY7Y|_Qm?=UWcaSJ!$(pxfv>)&ZLDk{z>a&R+;dl1$bsZ@um>N=c4{!zsE z0B6!U<{rRBa@9Gu{S=49L`pONjDVsP(HZJ$U;(Q|EYhQ8iyT_EP*G6u-@yQY8i2&V zL2wYl%M9(KjY{of`%?n|IDiU({VT?YX*|IUI-a4)&<~z+Al#$jq^c7&7*H|)2b~vy z0V?d(ey9h~l|IaXGG|f``#H6KwsXsJ=`i6>d_lGg1%7K2VjtHlt$%=c>!co zdv359WMRJ>_1t`@s-hJ28OGzIkHHqbC!Bl)Qg#mwQ_4Ha{?({miaqvXZ4TUAmXZ&* zh;R`?Ji}{A9RsnfhCMv+tO~PwKL%Cw+8fnZ@pKK@)|93wvXY|@YyCfG9?cbH=57Zs z)1qd-1M=sNEc}-&_^j8=y5{5M^6{m$ZOEAZHY-0Se0U7A>hWQ3nS-1-16Zt15E-3u zr`&OHB6!K2bf=uX$~{#)usE>oTcSKwj^Rp4hX03SK!w1oe7^>VJ2(lz#^Pi((k*wC zzzF%uShgRyCjq1!$VYP6GnT`E!|p2FwxAfa4)TY7K@)TZjD8z~sT;Gj?NWXOH z^xpV^?snt>G7JhlYg>TAHX=|W2-M&SjaiP-j#uij0eVqyL>OEB4ez48N5`eO!OLjg zspGY()<%c*e*5Oq7O5G4i1+Z&!hA8|Z#zGr;a|bWtDQDy&EKGGG3K2;a0OcR98-Pn zf!jS&AG#t8@()1?JY4$lRdH2@`6{8Zl)SaOys=_!au+!41rH@TEXAcdmyuJ;=3Hj{wIJI^q%h4@w~nNZwto0Sw7wC za_36*{z)n+>TB!=`vm-o^trlG4C>QCXMv{bnK34bEDAc8A8g8}ex|M_6rT7+sn4_4 zm&7~OvpP|ctNxS2PIY>l$32E!z4L$r|3YAV;?x~hWv7K|r6hV$v?RUMyh;cb0%7w^p|a*WUE`{Z2s7am>+AE4i@mr@iUpZ`DL^Arnq{NNnG zpSVj<1KH<8fgMg8Z>l%5e7)ZD(EA?isnmF2)l?MtU>np_^`HFztCer&ea_!M$p9Wj zDoOZ%@l?xNBd3^8`KtyI)YSX>9M%6@=3ir=rpl{~sco{v*eZh#1EO)3; literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/prepare.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/prepare.py new file mode 100644 index 0000000..0b61f20 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/prepare.py @@ -0,0 +1,591 @@ +"""Prepares a distribution for installation +""" + +# The following comment should be removed at some point in the future. +# mypy: strict-optional=False + +import logging +import mimetypes +import os +import shutil +import sys + +from pip._vendor import requests +from pip._vendor.six import PY2 + +from pip._internal.distributions import ( + make_distribution_for_install_requirement, +) +from pip._internal.distributions.installed import InstalledDistribution +from pip._internal.exceptions import ( + DirectoryUrlHashUnsupported, + HashMismatch, + HashUnpinned, + InstallationError, + PreviousBuildDirError, + VcsHashUnsupported, +) +from pip._internal.utils.filesystem import copy2_fixed +from pip._internal.utils.hashes import MissingHashes +from pip._internal.utils.logging import indent_log +from pip._internal.utils.marker_files import write_delete_marker_file +from pip._internal.utils.misc import ( + ask_path_exists, + backup_dir, + display_path, + hide_url, + path_to_display, + rmtree, +) +from pip._internal.utils.temp_dir import TempDirectory +from pip._internal.utils.typing import MYPY_CHECK_RUNNING +from pip._internal.utils.unpacking import unpack_file +from pip._internal.vcs import vcs + +if MYPY_CHECK_RUNNING: + from typing import ( + Callable, List, Optional, Tuple, + ) + + from mypy_extensions import TypedDict + + from pip._internal.distributions import AbstractDistribution + from pip._internal.index.package_finder import PackageFinder + from pip._internal.models.link import Link + from pip._internal.network.download import Downloader + from pip._internal.req.req_install import InstallRequirement + from pip._internal.req.req_tracker import RequirementTracker + from pip._internal.utils.hashes import Hashes + + if PY2: + CopytreeKwargs = TypedDict( + 'CopytreeKwargs', + { + 'ignore': Callable[[str, List[str]], List[str]], + 'symlinks': bool, + }, + total=False, + ) + else: + CopytreeKwargs = TypedDict( + 'CopytreeKwargs', + { + 'copy_function': Callable[[str, str], None], + 'ignore': Callable[[str, List[str]], List[str]], + 'ignore_dangling_symlinks': bool, + 'symlinks': bool, + }, + total=False, + ) + +logger = logging.getLogger(__name__) + + +def _get_prepared_distribution( + req, # type: InstallRequirement + req_tracker, # type: RequirementTracker + finder, # type: PackageFinder + build_isolation # type: bool +): + # type: (...) -> AbstractDistribution + """Prepare a distribution for installation. + """ + abstract_dist = make_distribution_for_install_requirement(req) + with req_tracker.track(req): + abstract_dist.prepare_distribution_metadata(finder, build_isolation) + return abstract_dist + + +def unpack_vcs_link(link, location): + # type: (Link, str) -> None + vcs_backend = vcs.get_backend_for_scheme(link.scheme) + assert vcs_backend is not None + vcs_backend.unpack(location, url=hide_url(link.url)) + + +def _copy_file(filename, location, link): + # type: (str, str, Link) -> None + copy = True + download_location = os.path.join(location, link.filename) + if os.path.exists(download_location): + response = ask_path_exists( + 'The file {} exists. (i)gnore, (w)ipe, (b)ackup, (a)abort'.format( + display_path(download_location) + ), + ('i', 'w', 'b', 'a'), + ) + if response == 'i': + copy = False + elif response == 'w': + logger.warning('Deleting %s', display_path(download_location)) + os.remove(download_location) + elif response == 'b': + dest_file = backup_dir(download_location) + logger.warning( + 'Backing up %s to %s', + display_path(download_location), + display_path(dest_file), + ) + shutil.move(download_location, dest_file) + elif response == 'a': + sys.exit(-1) + if copy: + shutil.copy(filename, download_location) + logger.info('Saved %s', display_path(download_location)) + + +def unpack_http_url( + link, # type: Link + location, # type: str + downloader, # type: Downloader + download_dir=None, # type: Optional[str] + hashes=None, # type: Optional[Hashes] +): + # type: (...) -> str + temp_dir = TempDirectory(kind="unpack", globally_managed=True) + # If a download dir is specified, is the file already downloaded there? + already_downloaded_path = None + if download_dir: + already_downloaded_path = _check_download_dir( + link, download_dir, hashes + ) + + if already_downloaded_path: + from_path = already_downloaded_path + content_type = mimetypes.guess_type(from_path)[0] + else: + # let's download to a tmp dir + from_path, content_type = _download_http_url( + link, downloader, temp_dir.path, hashes + ) + + # unpack the archive to the build dir location. even when only + # downloading archives, they have to be unpacked to parse dependencies + unpack_file(from_path, location, content_type) + + return from_path + + +def _copy2_ignoring_special_files(src, dest): + # type: (str, str) -> None + """Copying special files is not supported, but as a convenience to users + we skip errors copying them. This supports tools that may create e.g. + socket files in the project source directory. + """ + try: + copy2_fixed(src, dest) + except shutil.SpecialFileError as e: + # SpecialFileError may be raised due to either the source or + # destination. If the destination was the cause then we would actually + # care, but since the destination directory is deleted prior to + # copy we ignore all of them assuming it is caused by the source. + logger.warning( + "Ignoring special file error '%s' encountered copying %s to %s.", + str(e), + path_to_display(src), + path_to_display(dest), + ) + + +def _copy_source_tree(source, target): + # type: (str, str) -> None + def ignore(d, names): + # type: (str, List[str]) -> List[str] + # Pulling in those directories can potentially be very slow, + # exclude the following directories if they appear in the top + # level dir (and only it). + # See discussion at https://github.com/pypa/pip/pull/6770 + return ['.tox', '.nox'] if d == source else [] + + kwargs = dict(ignore=ignore, symlinks=True) # type: CopytreeKwargs + + if not PY2: + # Python 2 does not support copy_function, so we only ignore + # errors on special file copy in Python 3. + kwargs['copy_function'] = _copy2_ignoring_special_files + + shutil.copytree(source, target, **kwargs) + + +def unpack_file_url( + link, # type: Link + location, # type: str + download_dir=None, # type: Optional[str] + hashes=None # type: Optional[Hashes] +): + # type: (...) -> Optional[str] + """Unpack link into location. + """ + link_path = link.file_path + # If it's a url to a local directory + if link.is_existing_dir(): + if os.path.isdir(location): + rmtree(location) + _copy_source_tree(link_path, location) + return None + + # If a download dir is specified, is the file already there and valid? + already_downloaded_path = None + if download_dir: + already_downloaded_path = _check_download_dir( + link, download_dir, hashes + ) + + if already_downloaded_path: + from_path = already_downloaded_path + else: + from_path = link_path + + # If --require-hashes is off, `hashes` is either empty, the + # link's embedded hash, or MissingHashes; it is required to + # match. If --require-hashes is on, we are satisfied by any + # hash in `hashes` matching: a URL-based or an option-based + # one; no internet-sourced hash will be in `hashes`. + if hashes: + hashes.check_against_path(from_path) + + content_type = mimetypes.guess_type(from_path)[0] + + # unpack the archive to the build dir location. even when only downloading + # archives, they have to be unpacked to parse dependencies + unpack_file(from_path, location, content_type) + + return from_path + + +def unpack_url( + link, # type: Link + location, # type: str + downloader, # type: Downloader + download_dir=None, # type: Optional[str] + hashes=None, # type: Optional[Hashes] +): + # type: (...) -> Optional[str] + """Unpack link into location, downloading if required. + + :param hashes: A Hashes object, one of whose embedded hashes must match, + or HashMismatch will be raised. If the Hashes is empty, no matches are + required, and unhashable types of requirements (like VCS ones, which + would ordinarily raise HashUnsupported) are allowed. + """ + # non-editable vcs urls + if link.is_vcs: + unpack_vcs_link(link, location) + return None + + # file urls + elif link.is_file: + return unpack_file_url(link, location, download_dir, hashes=hashes) + + # http urls + else: + return unpack_http_url( + link, + location, + downloader, + download_dir, + hashes=hashes, + ) + + +def _download_http_url( + link, # type: Link + downloader, # type: Downloader + temp_dir, # type: str + hashes, # type: Optional[Hashes] +): + # type: (...) -> Tuple[str, str] + """Download link url into temp_dir using provided session""" + download = downloader(link) + + file_path = os.path.join(temp_dir, download.filename) + with open(file_path, 'wb') as content_file: + for chunk in download.chunks: + content_file.write(chunk) + + if hashes: + hashes.check_against_path(file_path) + + return file_path, download.response.headers.get('content-type', '') + + +def _check_download_dir(link, download_dir, hashes): + # type: (Link, str, Optional[Hashes]) -> Optional[str] + """ Check download_dir for previously downloaded file with correct hash + If a correct file is found return its path else None + """ + download_path = os.path.join(download_dir, link.filename) + + if not os.path.exists(download_path): + return None + + # If already downloaded, does its hash match? + logger.info('File was already downloaded %s', download_path) + if hashes: + try: + hashes.check_against_path(download_path) + except HashMismatch: + logger.warning( + 'Previously-downloaded file %s has bad hash. ' + 'Re-downloading.', + download_path + ) + os.unlink(download_path) + return None + return download_path + + +class RequirementPreparer(object): + """Prepares a Requirement + """ + + def __init__( + self, + build_dir, # type: str + download_dir, # type: Optional[str] + src_dir, # type: str + wheel_download_dir, # type: Optional[str] + build_isolation, # type: bool + req_tracker, # type: RequirementTracker + downloader, # type: Downloader + finder, # type: PackageFinder + require_hashes, # type: bool + use_user_site, # type: bool + ): + # type: (...) -> None + super(RequirementPreparer, self).__init__() + + self.src_dir = src_dir + self.build_dir = build_dir + self.req_tracker = req_tracker + self.downloader = downloader + self.finder = finder + + # Where still-packed archives should be written to. If None, they are + # not saved, and are deleted immediately after unpacking. + self.download_dir = download_dir + + # Where still-packed .whl files should be written to. If None, they are + # written to the download_dir parameter. Separate to download_dir to + # permit only keeping wheel archives for pip wheel. + self.wheel_download_dir = wheel_download_dir + + # NOTE + # download_dir and wheel_download_dir overlap semantically and may + # be combined if we're willing to have non-wheel archives present in + # the wheelhouse output by 'pip wheel'. + + # Is build isolation allowed? + self.build_isolation = build_isolation + + # Should hash-checking be required? + self.require_hashes = require_hashes + + # Should install in user site-packages? + self.use_user_site = use_user_site + + @property + def _download_should_save(self): + # type: () -> bool + if not self.download_dir: + return False + + if os.path.exists(self.download_dir): + return True + + logger.critical('Could not find download directory') + raise InstallationError( + "Could not find or access download directory '{}'" + .format(self.download_dir)) + + def prepare_linked_requirement( + self, + req, # type: InstallRequirement + ): + # type: (...) -> AbstractDistribution + """Prepare a requirement that would be obtained from req.link + """ + assert req.link + link = req.link + + # TODO: Breakup into smaller functions + if link.scheme == 'file': + path = link.file_path + logger.info('Processing %s', display_path(path)) + else: + logger.info('Collecting %s', req.req or req) + + with indent_log(): + # @@ if filesystem packages are not marked + # editable in a req, a non deterministic error + # occurs when the script attempts to unpack the + # build directory + # Since source_dir is only set for editable requirements. + assert req.source_dir is None + req.ensure_has_source_dir(self.build_dir) + # If a checkout exists, it's unwise to keep going. version + # inconsistencies are logged later, but do not fail the + # installation. + # FIXME: this won't upgrade when there's an existing + # package unpacked in `req.source_dir` + if os.path.exists(os.path.join(req.source_dir, 'setup.py')): + raise PreviousBuildDirError( + "pip can't proceed with requirements '{}' due to a" + " pre-existing build directory ({}). This is " + "likely due to a previous installation that failed" + ". pip is being responsible and not assuming it " + "can delete this. Please delete it and try again." + .format(req, req.source_dir) + ) + + # Now that we have the real link, we can tell what kind of + # requirements we have and raise some more informative errors + # than otherwise. (For example, we can raise VcsHashUnsupported + # for a VCS URL rather than HashMissing.) + if self.require_hashes: + # We could check these first 2 conditions inside + # unpack_url and save repetition of conditions, but then + # we would report less-useful error messages for + # unhashable requirements, complaining that there's no + # hash provided. + if link.is_vcs: + raise VcsHashUnsupported() + elif link.is_existing_dir(): + raise DirectoryUrlHashUnsupported() + if not req.original_link and not req.is_pinned: + # Unpinned packages are asking for trouble when a new + # version is uploaded. This isn't a security check, but + # it saves users a surprising hash mismatch in the + # future. + # + # file:/// URLs aren't pinnable, so don't complain + # about them not being pinned. + raise HashUnpinned() + + hashes = req.hashes(trust_internet=not self.require_hashes) + if self.require_hashes and not hashes: + # Known-good hashes are missing for this requirement, so + # shim it with a facade object that will provoke hash + # computation and then raise a HashMissing exception + # showing the user what the hash should be. + hashes = MissingHashes() + + download_dir = self.download_dir + if link.is_wheel and self.wheel_download_dir: + # when doing 'pip wheel` we download wheels to a + # dedicated dir. + download_dir = self.wheel_download_dir + + try: + local_path = unpack_url( + link, req.source_dir, self.downloader, download_dir, + hashes=hashes, + ) + except requests.HTTPError as exc: + logger.critical( + 'Could not install requirement %s because of error %s', + req, + exc, + ) + raise InstallationError( + 'Could not install requirement {} because of HTTP ' + 'error {} for URL {}'.format(req, exc, link) + ) + + # For use in later processing, preserve the file path on the + # requirement. + if local_path: + req.local_file_path = local_path + + if link.is_wheel: + if download_dir: + # When downloading, we only unpack wheels to get + # metadata. + autodelete_unpacked = True + else: + # When installing a wheel, we use the unpacked + # wheel. + autodelete_unpacked = False + else: + # We always delete unpacked sdists after pip runs. + autodelete_unpacked = True + if autodelete_unpacked: + write_delete_marker_file(req.source_dir) + + abstract_dist = _get_prepared_distribution( + req, self.req_tracker, self.finder, self.build_isolation, + ) + + if download_dir: + if link.is_existing_dir(): + logger.info('Link is a directory, ignoring download_dir') + elif local_path and not os.path.exists( + os.path.join(download_dir, link.filename) + ): + _copy_file(local_path, download_dir, link) + + if self._download_should_save: + # Make a .zip of the source_dir we already created. + if link.is_vcs: + req.archive(self.download_dir) + return abstract_dist + + def prepare_editable_requirement( + self, + req, # type: InstallRequirement + ): + # type: (...) -> AbstractDistribution + """Prepare an editable requirement + """ + assert req.editable, "cannot prepare a non-editable req as editable" + + logger.info('Obtaining %s', req) + + with indent_log(): + if self.require_hashes: + raise InstallationError( + 'The editable requirement {} cannot be installed when ' + 'requiring hashes, because there is no single file to ' + 'hash.'.format(req) + ) + req.ensure_has_source_dir(self.src_dir) + req.update_editable(not self._download_should_save) + + abstract_dist = _get_prepared_distribution( + req, self.req_tracker, self.finder, self.build_isolation, + ) + + if self._download_should_save: + req.archive(self.download_dir) + req.check_if_exists(self.use_user_site) + + return abstract_dist + + def prepare_installed_requirement( + self, + req, # type: InstallRequirement + skip_reason # type: str + ): + # type: (...) -> AbstractDistribution + """Prepare an already-installed requirement + """ + assert req.satisfied_by, "req should have been satisfied but isn't" + assert skip_reason is not None, ( + "did not get skip reason skipped but req.satisfied_by " + "is set to {}".format(req.satisfied_by) + ) + logger.info( + 'Requirement %s: %s (%s)', + skip_reason, req, req.satisfied_by.version + ) + with indent_log(): + if self.require_hashes: + logger.debug( + 'Since it is already installed, we are trusting this ' + 'package without checking its hash. To ensure a ' + 'completely repeatable environment, install into an ' + 'empty virtualenv.' + ) + abstract_dist = InstalledDistribution(req) + + return abstract_dist diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/prepare.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/operations/prepare.pyc new file mode 100644 index 0000000000000000000000000000000000000000..600aa1e28291df9231141a8352d59f4406f6d605 GIT binary patch literal 14484 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 literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/pep425tags 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/pep425tags 2.py new file mode 100644 index 0000000..a2386ee --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/pep425tags 2.py @@ -0,0 +1,167 @@ +"""Generate and work with PEP 425 Compatibility Tags.""" +from __future__ import absolute_import + +import logging +import re + +from pip._vendor.packaging.tags import ( + Tag, + compatible_tags, + cpython_tags, + generic_tags, + interpreter_name, + interpreter_version, + mac_platforms, +) + +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import List, Optional, Tuple + + from pip._vendor.packaging.tags import PythonVersion + +logger = logging.getLogger(__name__) + +_osx_arch_pat = re.compile(r'(.+)_(\d+)_(\d+)_(.+)') + + +def version_info_to_nodot(version_info): + # type: (Tuple[int, ...]) -> str + # Only use up to the first two numbers. + return ''.join(map(str, version_info[:2])) + + +def _mac_platforms(arch): + # type: (str) -> List[str] + match = _osx_arch_pat.match(arch) + if match: + name, major, minor, actual_arch = match.groups() + mac_version = (int(major), int(minor)) + arches = [ + # Since we have always only checked that the platform starts + # with "macosx", for backwards-compatibility we extract the + # actual prefix provided by the user in case they provided + # something like "macosxcustom_". It may be good to remove + # this as undocumented or deprecate it in the future. + '{}_{}'.format(name, arch[len('macosx_'):]) + for arch in mac_platforms(mac_version, actual_arch) + ] + else: + # arch pattern didn't match (?!) + arches = [arch] + return arches + + +def _custom_manylinux_platforms(arch): + # type: (str) -> List[str] + arches = [arch] + arch_prefix, arch_sep, arch_suffix = arch.partition('_') + if arch_prefix == 'manylinux2014': + # manylinux1/manylinux2010 wheels run on most manylinux2014 systems + # with the exception of wheels depending on ncurses. PEP 599 states + # manylinux1/manylinux2010 wheels should be considered + # manylinux2014 wheels: + # https://www.python.org/dev/peps/pep-0599/#backwards-compatibility-with-manylinux2010-wheels + if arch_suffix in {'i686', 'x86_64'}: + arches.append('manylinux2010' + arch_sep + arch_suffix) + arches.append('manylinux1' + arch_sep + arch_suffix) + elif arch_prefix == 'manylinux2010': + # manylinux1 wheels run on most manylinux2010 systems with the + # exception of wheels depending on ncurses. PEP 571 states + # manylinux1 wheels should be considered manylinux2010 wheels: + # https://www.python.org/dev/peps/pep-0571/#backwards-compatibility-with-manylinux1-wheels + arches.append('manylinux1' + arch_sep + arch_suffix) + return arches + + +def _get_custom_platforms(arch): + # type: (str) -> List[str] + arch_prefix, arch_sep, arch_suffix = arch.partition('_') + if arch.startswith('macosx'): + arches = _mac_platforms(arch) + elif arch_prefix in ['manylinux2014', 'manylinux2010']: + arches = _custom_manylinux_platforms(arch) + else: + arches = [arch] + return arches + + +def _get_python_version(version): + # type: (str) -> PythonVersion + if len(version) > 1: + return int(version[0]), int(version[1:]) + else: + return (int(version[0]),) + + +def _get_custom_interpreter(implementation=None, version=None): + # type: (Optional[str], Optional[str]) -> str + if implementation is None: + implementation = interpreter_name() + if version is None: + version = interpreter_version() + return "{}{}".format(implementation, version) + + +def get_supported( + version=None, # type: Optional[str] + platform=None, # type: Optional[str] + impl=None, # type: Optional[str] + abi=None # type: Optional[str] +): + # type: (...) -> List[Tag] + """Return a list of supported tags for each version specified in + `versions`. + + :param version: a string version, of the form "33" or "32", + or None. The version will be assumed to support our ABI. + :param platform: specify the exact platform you want valid + tags for, or None. If None, use the local system platform. + :param impl: specify the exact implementation you want valid + tags for, or None. If None, use the local interpreter impl. + :param abi: specify the exact abi you want valid + tags for, or None. If None, use the local interpreter abi. + """ + supported = [] # type: List[Tag] + + python_version = None # type: Optional[PythonVersion] + if version is not None: + python_version = _get_python_version(version) + + interpreter = _get_custom_interpreter(impl, version) + + abis = None # type: Optional[List[str]] + if abi is not None: + abis = [abi] + + platforms = None # type: Optional[List[str]] + if platform is not None: + platforms = _get_custom_platforms(platform) + + is_cpython = (impl or interpreter_name()) == "cp" + if is_cpython: + supported.extend( + cpython_tags( + python_version=python_version, + abis=abis, + platforms=platforms, + ) + ) + else: + supported.extend( + generic_tags( + interpreter=interpreter, + abis=abis, + platforms=platforms, + ) + ) + supported.extend( + compatible_tags( + python_version=python_version, + interpreter=interpreter, + platforms=platforms, + ) + ) + + return supported diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/pep425tags 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/pep425tags 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4ded6273092e8790b6b1ca465ac1e09507e1232d GIT binary patch literal 4771 zcmc&&OLH5?5$;`pAOV2{O_~;E+3}i5B}goRq)5|>DoIhHRgNkS!Yrv&8Kr2w#4f-E z_obZy9}!WNlyuF>hx~;6g4})0@5wn;`MP%jg0XH%g@iDe>6z*2>HhjLD*bc5_K$CW z{-R68-wb|tcZt;d29Zb9L2Hm_QfN?QQpY5N$0Z6&)G5gv`eo{rrC+9ShN22}DiqC9 zXO^Nl>daA8rB0Qi8g*(E-J;Gdit5y<=e%YpoTq4kItyg@3zYp$I8`WYP_#&$MT*{` z&N~z>QD-UNF)ODmQ)iisn8+{D;9c@p=(Rze_sB2P;5K=4GF&CEN^fwFJLJ`*^FDdE zq;r?Nx^zAuZ(ced^2PYy0=>aqKN=5nVuRk`o)!}inv2krdVuB&KlU?M`<5Gf)>)FB zSZ9Ggw)UUwTiXvlwf2%Ib#-tQgn_=W4&AL3Wm^LIH(%|4KuMx4Ch&xpi@Iss~!@&$iBvH}Kbw*ALgzAiW>NO1oir|MBNf z)c!Lj$rtB9`%uk#>Zd>hTdxJfu^y&HadhIuiI?aPF`@WER1%f2dKnI)lE0vXD-R4- z2DC6j$Dr&_+zy}@qUU8AnKUZV2%Q-Q(PfEOa;MCl9%d`l7Ykli=yHaj(9i#{Mx$KY zGju7c))m$^HhhHn7bd-YMx$AZt9)`FC(qL5?AQv5ZT4#9yc%g16-Y|dxs#)qA>i=P z&AP`996>M=xw?CdBfu+5hN%)eK~=UOpXm%kEM_}~e%xd=2THySWbm!ZyIzVqHL);vK6ks6wZp5d1#Wy&@T0K8R};{=P0|)Yq+=5FR1%xY2mSBk)FD8N~fDk#Y4N1p{@XdU^MtJE-J0h6(`Rx-@2$G?2q znigOjiyjp+U&x{UIjS9NJZD`bL+i|qwRP%-fj2pSe0Rt?mgH$qM7n1Ul`ovar0a&3 zx=`AWCJe7hz+UsV)31Bee=oxn{w?NxO$hfWc$*9$|8EZl!~9&h48OTF$BpX&PT~yK zsk}ZJzoDein7Tu|$>oc^#SK3j?N7Pc;D+OqnP|&ie#KG$4`K6f5y8Wal?g#{ZllOi38;nPsbaKb^I*g1UnIzA7F~5rR9oQk-XZF z-+D1xK|MVF%$LW#T4~ZNH$TR1d4V{NmvkLRuIo6xA%cPLI5u;a`7r7C;ksf{Jde3> z#DlGc*Fo$hSu1tBCoV5&vBTJ$d&Lk_cDc$Z@?x2A5PRdf*Ba^|R4sjxf{o1~TI^el z1qfnQey7;{E*0ZJBVR%^KNCYc@@U63ICHVcpz~?`p8-MW+wbyTt`Dy&svJ&&F2R{V z>@k*HnOb`P_xCPq;Ac_d4MYDItWSA%Rg6VWXXbWo5k~&NTs9kKqg1U_SE}z->(#kN Itz_`$-yTO=mH+?% literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/pep425tags.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/pep425tags.py new file mode 100644 index 0000000..a2386ee --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/pep425tags.py @@ -0,0 +1,167 @@ +"""Generate and work with PEP 425 Compatibility Tags.""" +from __future__ import absolute_import + +import logging +import re + +from pip._vendor.packaging.tags import ( + Tag, + compatible_tags, + cpython_tags, + generic_tags, + interpreter_name, + interpreter_version, + mac_platforms, +) + +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import List, Optional, Tuple + + from pip._vendor.packaging.tags import PythonVersion + +logger = logging.getLogger(__name__) + +_osx_arch_pat = re.compile(r'(.+)_(\d+)_(\d+)_(.+)') + + +def version_info_to_nodot(version_info): + # type: (Tuple[int, ...]) -> str + # Only use up to the first two numbers. + return ''.join(map(str, version_info[:2])) + + +def _mac_platforms(arch): + # type: (str) -> List[str] + match = _osx_arch_pat.match(arch) + if match: + name, major, minor, actual_arch = match.groups() + mac_version = (int(major), int(minor)) + arches = [ + # Since we have always only checked that the platform starts + # with "macosx", for backwards-compatibility we extract the + # actual prefix provided by the user in case they provided + # something like "macosxcustom_". It may be good to remove + # this as undocumented or deprecate it in the future. + '{}_{}'.format(name, arch[len('macosx_'):]) + for arch in mac_platforms(mac_version, actual_arch) + ] + else: + # arch pattern didn't match (?!) + arches = [arch] + return arches + + +def _custom_manylinux_platforms(arch): + # type: (str) -> List[str] + arches = [arch] + arch_prefix, arch_sep, arch_suffix = arch.partition('_') + if arch_prefix == 'manylinux2014': + # manylinux1/manylinux2010 wheels run on most manylinux2014 systems + # with the exception of wheels depending on ncurses. PEP 599 states + # manylinux1/manylinux2010 wheels should be considered + # manylinux2014 wheels: + # https://www.python.org/dev/peps/pep-0599/#backwards-compatibility-with-manylinux2010-wheels + if arch_suffix in {'i686', 'x86_64'}: + arches.append('manylinux2010' + arch_sep + arch_suffix) + arches.append('manylinux1' + arch_sep + arch_suffix) + elif arch_prefix == 'manylinux2010': + # manylinux1 wheels run on most manylinux2010 systems with the + # exception of wheels depending on ncurses. PEP 571 states + # manylinux1 wheels should be considered manylinux2010 wheels: + # https://www.python.org/dev/peps/pep-0571/#backwards-compatibility-with-manylinux1-wheels + arches.append('manylinux1' + arch_sep + arch_suffix) + return arches + + +def _get_custom_platforms(arch): + # type: (str) -> List[str] + arch_prefix, arch_sep, arch_suffix = arch.partition('_') + if arch.startswith('macosx'): + arches = _mac_platforms(arch) + elif arch_prefix in ['manylinux2014', 'manylinux2010']: + arches = _custom_manylinux_platforms(arch) + else: + arches = [arch] + return arches + + +def _get_python_version(version): + # type: (str) -> PythonVersion + if len(version) > 1: + return int(version[0]), int(version[1:]) + else: + return (int(version[0]),) + + +def _get_custom_interpreter(implementation=None, version=None): + # type: (Optional[str], Optional[str]) -> str + if implementation is None: + implementation = interpreter_name() + if version is None: + version = interpreter_version() + return "{}{}".format(implementation, version) + + +def get_supported( + version=None, # type: Optional[str] + platform=None, # type: Optional[str] + impl=None, # type: Optional[str] + abi=None # type: Optional[str] +): + # type: (...) -> List[Tag] + """Return a list of supported tags for each version specified in + `versions`. + + :param version: a string version, of the form "33" or "32", + or None. The version will be assumed to support our ABI. + :param platform: specify the exact platform you want valid + tags for, or None. If None, use the local system platform. + :param impl: specify the exact implementation you want valid + tags for, or None. If None, use the local interpreter impl. + :param abi: specify the exact abi you want valid + tags for, or None. If None, use the local interpreter abi. + """ + supported = [] # type: List[Tag] + + python_version = None # type: Optional[PythonVersion] + if version is not None: + python_version = _get_python_version(version) + + interpreter = _get_custom_interpreter(impl, version) + + abis = None # type: Optional[List[str]] + if abi is not None: + abis = [abi] + + platforms = None # type: Optional[List[str]] + if platform is not None: + platforms = _get_custom_platforms(platform) + + is_cpython = (impl or interpreter_name()) == "cp" + if is_cpython: + supported.extend( + cpython_tags( + python_version=python_version, + abis=abis, + platforms=platforms, + ) + ) + else: + supported.extend( + generic_tags( + interpreter=interpreter, + abis=abis, + platforms=platforms, + ) + ) + supported.extend( + compatible_tags( + python_version=python_version, + interpreter=interpreter, + platforms=platforms, + ) + ) + + return supported diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/pep425tags.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/pep425tags.pyc new file mode 100644 index 0000000000000000000000000000000000000000..01fa93197c4101ff88aebd8c6f92426c360160d1 GIT binary patch literal 4771 zcmc&&+j1Mn5$#=oAOVpAO_~;E+3}i5B}goRS5t~ANzq|cjw%kKEa_AkrD(mxF2Du% zrkw#V5mA+t^qMC>P_6y}KY7>n*8}5C$_nGd(@sr!S+*KNlM3-~RkX zkBYw;{O;`$srL;ckEn~*AkU=Gpva`INd}KA6jrEPkva6M)U8UtO5qGeHR{$Vnx*b6 zMRU}hqo_{ZIz8{FeAc@62jPu?x* z+#_#ZIvuK?`Sa4^O)mM)03pQV|P)`{K7*USGwJoPgbB(Yuq zJ#u?a8oIilWRc2cTLSsFUp@QE+5h#E{ogqDmz~bj&gU%_Ojpr-5h$(a(D_}e!Nv_W zW9M*`hJMa~`92dV|B#=gRzPXBKl!oKdhT7dAoN%p{ACvVdkjBx0JI?vGf10siJ?i> zYm=>dAX0QR)=*%gxsqy_;NC1_8EI5T7*H7JS zy`O|0WL_Vn>)y-Z;7>dK&5fhY?Td?3J=9u1+&(+rz~3NVKU`0P^g$3S?S|olt%tjv zuFWL*;v8rns##C{6lh@UwP85c!?Y-lPMkRL68#}26kmucq7qgw!$DN?S9EaYp~1?4 z7RKlpl>M38A@oA@yh>w}#uXZ)Gs7UdtnfftD!OI$5&JYy(t3R&MIM?DuEl`Y6;I>Qi)*^Z$fw^$8=Ic8(C_GBce=F=m02+xsT z5TkbsG`FWmZYT%Km=Rtgo{wNwzPdpW+=dX&HNX2lD2iQ|%%)K@R*lu!it(sgH+rRO zutEe2e?zCRg}?!R0&juAp2PSh1Yk>8@x-JoVf%AntI{zjHOjsb)F6_>8TQXOTCO-2<6UON=)cMPI-rvKTC+HwjL-Wux{PLtq*#;*vP~eewK`jOxVI?dd zT$}B~k31?PY{1O(s(~HBzRS%WGbX!k^EVwH9DzN_M-x902=5}AD2^-=Ak>31H2vy9oZpYf5`nj z%d@UAJ11cxpB+hg7Jyay7gjgS##jeW#15SM4-Ondlp#_~pw>VFLfL>Ebcx!W zDv-yB*UCkhfY4a_-9-hPIrbf9ldqd*BN2-IKpg;Fwy#H7Y`Ip564grjmKvp8TKk^G z6_|zU!t&kTu~lHyQmNky`T^#HxMAV%>taTI-EIisF%pj(l^Y&|H|okD9+Z^(e2hN! znRjHZZEvqxIAm>mYwf=5XQm)99^2L-)|E$}1z~6%`If8HC}IJVQd%n+W!7iEeA=EC zpo~S23z;wEQ2!j&j#bWC7s<#vb7O6tx?$i=&M)r{SxZTt_C=)o)=2rnDNK59XsHXO z{b<7Qngr}MZ#(_EH~sfAOyS>R-q(b1kAk}_uN*=T>t%?39dpCqUH=NjdVU11{ox6OyP*vln2Ng-1jIj^Ij z7b%i)z8pURy8V!MJ?4fB3HzsLBohb9DV~lu80+|1zzKFDEIJdm-#Rm4B)zAQaq2jaKwYH zjn_f!C0RRldnYb0XtTrEoO{I(Q+Bz^DDq;Na1eXrxz`@)AXIIAk%EoQAzJKPj0Ff{ zReq<~{4N#aK_g#4G(QtVJMw79H8^vz$e{CS{GS0q=-cn|Uak+XDyke#f-b?CK bool + return ( + isinstance(obj, list) and + all(isinstance(item, six.string_types) for item in obj) + ) + + +def make_pyproject_path(unpacked_source_directory): + # type: (str) -> str + path = os.path.join(unpacked_source_directory, 'pyproject.toml') + + # Python2 __file__ should not be unicode + if six.PY2 and isinstance(path, six.text_type): + path = path.encode(sys.getfilesystemencoding()) + + return path + + +BuildSystemDetails = namedtuple('BuildSystemDetails', [ + 'requires', 'backend', 'check', 'backend_path' +]) + + +def load_pyproject_toml( + use_pep517, # type: Optional[bool] + pyproject_toml, # type: str + setup_py, # type: str + req_name # type: str +): + # type: (...) -> Optional[BuildSystemDetails] + """Load the pyproject.toml file. + + Parameters: + use_pep517 - Has the user requested PEP 517 processing? None + means the user hasn't explicitly specified. + pyproject_toml - Location of the project's pyproject.toml file + setup_py - Location of the project's setup.py file + req_name - The name of the requirement we're processing (for + error reporting) + + Returns: + None if we should use the legacy code path, otherwise a tuple + ( + requirements from pyproject.toml, + name of PEP 517 backend, + requirements we should check are installed after setting + up the build environment + directory paths to import the backend from (backend-path), + relative to the project root. + ) + """ + has_pyproject = os.path.isfile(pyproject_toml) + has_setup = os.path.isfile(setup_py) + + if has_pyproject: + with io.open(pyproject_toml, encoding="utf-8") as f: + pp_toml = pytoml.load(f) + build_system = pp_toml.get("build-system") + else: + build_system = None + + # The following cases must use PEP 517 + # We check for use_pep517 being non-None and falsey because that means + # the user explicitly requested --no-use-pep517. The value 0 as + # opposed to False can occur when the value is provided via an + # environment variable or config file option (due to the quirk of + # strtobool() returning an integer in pip's configuration code). + if has_pyproject and not has_setup: + if use_pep517 is not None and not use_pep517: + raise InstallationError( + "Disabling PEP 517 processing is invalid: " + "project does not have a setup.py" + ) + use_pep517 = True + elif build_system and "build-backend" in build_system: + if use_pep517 is not None and not use_pep517: + raise InstallationError( + "Disabling PEP 517 processing is invalid: " + "project specifies a build backend of {} " + "in pyproject.toml".format( + build_system["build-backend"] + ) + ) + use_pep517 = True + + # If we haven't worked out whether to use PEP 517 yet, + # and the user hasn't explicitly stated a preference, + # we do so if the project has a pyproject.toml file. + elif use_pep517 is None: + use_pep517 = has_pyproject + + # At this point, we know whether we're going to use PEP 517. + assert use_pep517 is not None + + # If we're using the legacy code path, there is nothing further + # for us to do here. + if not use_pep517: + return None + + if build_system is None: + # Either the user has a pyproject.toml with no build-system + # section, or the user has no pyproject.toml, but has opted in + # explicitly via --use-pep517. + # In the absence of any explicit backend specification, we + # assume the setuptools backend that most closely emulates the + # traditional direct setup.py execution, and require wheel and + # a version of setuptools that supports that backend. + + build_system = { + "requires": ["setuptools>=40.8.0", "wheel"], + "build-backend": "setuptools.build_meta:__legacy__", + } + + # If we're using PEP 517, we have build system information (either + # from pyproject.toml, or defaulted by the code above). + # Note that at this point, we do not know if the user has actually + # specified a backend, though. + assert build_system is not None + + # Ensure that the build-system section in pyproject.toml conforms + # to PEP 518. + error_template = ( + "{package} has a pyproject.toml file that does not comply " + "with PEP 518: {reason}" + ) + + # Specifying the build-system table but not the requires key is invalid + if "requires" not in build_system: + raise InstallationError( + error_template.format(package=req_name, reason=( + "it has a 'build-system' table but not " + "'build-system.requires' which is mandatory in the table" + )) + ) + + # Error out if requires is not a list of strings + requires = build_system["requires"] + if not _is_list_of_str(requires): + raise InstallationError(error_template.format( + package=req_name, + reason="'build-system.requires' is not a list of strings.", + )) + + # Each requirement must be valid as per PEP 508 + for requirement in requires: + try: + Requirement(requirement) + except InvalidRequirement: + raise InstallationError( + error_template.format( + package=req_name, + reason=( + "'build-system.requires' contains an invalid " + "requirement: {!r}".format(requirement) + ), + ) + ) + + backend = build_system.get("build-backend") + backend_path = build_system.get("backend-path", []) + check = [] # type: List[str] + if backend is None: + # If the user didn't specify a backend, we assume they want to use + # the setuptools backend. But we can't be sure they have included + # a version of setuptools which supplies the backend, or wheel + # (which is needed by the backend) in their requirements. So we + # make a note to check that those requirements are present once + # we have set up the environment. + # This is quite a lot of work to check for a very specific case. But + # the problem is, that case is potentially quite common - projects that + # adopted PEP 518 early for the ability to specify requirements to + # execute setup.py, but never considered needing to mention the build + # tools themselves. The original PEP 518 code had a similar check (but + # implemented in a different way). + backend = "setuptools.build_meta:__legacy__" + check = ["setuptools>=40.8.0", "wheel"] + + return BuildSystemDetails(requires, backend, check, backend_path) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/pyproject 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/pyproject 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..58bcd445d93ec96bfa883ff3209b3b3b4ab1ffc6 GIT binary patch literal 4692 zcmc&%&2k&Z5$*v%kO09SQKEhlC0;8BQYjOZV#ijgEJd=Uid2>z>~7e-`Th z{QIrnwQ2IH;`h!SBJ&*@5&jh=M14gqMT+|+N=no!$sF2cYL%z$3biWIE>ki?{VKJp zZcl}hS?bSGYmWLgYSrB63?+5y&r@rj`VDF|+-Q}O1?n$SYti**DOsZaGPRaT>1E3Q zCMV2Ma)$aV)LNnbS!$i7{yA!$Bb7qK8vT)|wMtQ48s|w@DVnFKLD2$5ixe$Uw?ap- z;sQm>vgRV&^>qCVY>x4zb%lpr!Xw-&OlViC!=9YDR7_ zvROZ|Wi(Cv+KsQE^C;a9lQ{DAt6`k$zD}*3$MA{1lgkP`N{tPZB(!msKFISdcT+6p zs~6iZf_o1i-1{={zuwwEFVI+t96S~EN-XNP>Xp#p zsVKeW)MK<_6SG}uTl=DNgQeL#PP>5}4YYAs@j1~uX^3zf6}>rZRh&OqtU+YS!+N0_+a-MKHYTl+2$Y~Y{>CRvT^tR z1GD`#56L%(Q>$~}wK*6K@~o%ZwmBG?8jkzCt5f}Ykl#L!j$zfRBnJ8HJ5e$LzJfj+ z=G?@_Wjnq1rn!(dh)uw%1z9Hm$V?r>?xXUOD*Rc{;V~vaho1Nljs+3mN%n1-dKJna zlAWPL*RAptM$qle5(w9;(Gf9SupYsO@dq1}~6FN;&h z3)X7;#V;Jh>;YSq+NiGj9tZouC|>x(FR?PEX;#cj!u^_Jxm8-drwD! z$%c7b2N43WZL@sjpTq3?^V3V`V&kFV()>uVcMu*6iavvR0snC;!)alZ= zP8KWbY=HU4yS6RU$!)Kn^Wyt2pU`-oMvG(@>2RJmtLLx&r7Fk^dv(e$my~*!tTO_d ztS^LO+c)?=heGU0=iUZe!rc|>BJPnV7Pv9SX}DhHw43$1htGDHoQ z+hpXKfo{j0SVzr5K%sLWI&XN7v$ovdUe<9&xtnFpyvw{ojL|43kPl$W_Y06kxS|A^ zVk@i-xFEsSX8=)}ld~sDf{PCCK(FP1xB$Xi?__x)q`<)QG#4JgkZT?QcGY>nhk|)} z0)B?ki#w3(ncZxdMC=f;IMLm(J@PnPdz{xk@-lcgKZr3OdQvtO=dKqm*5HJ`#_Qx+ z|1HcuI<D0-Se0O@$DUrvzN|y9OATlWqK$frrf_VU$%|3M!>oy#SaXXxjJ)Q2y zd6qJ;rxq4Bj2I3sWu7Y@-Cmcbon`A2bvGEItEZKASa2P<4@k3 zFunf_-vUG1*|@P~YRbq6q5aLvfo_C3E#IDyV!@J$K@d->uPY*G`If8u6CB9=s;Qw z(UR-t$t{6#}VB%NcY9dlFzL0nFBsoJN{4bSm&Atg#;p^xGrRC;bO_# z5bK$Op~SiXnH`>jve8^<<_VLyjbCc%R)uc(z$Rb5o8{5!Xx&Z@F%lxu25TGjH| za&4xeYUPzmRaHujT3Icqh1r#vDn`p{Ni9|Ds)4_%TB`$Z7O>s~Y1M|qs(LN@oZ zaRt*SW|}Tskrb!V#<|@%A~B`x#p#CWTVqqdZfkktHjbrSzl+FX#n7T$Z{j5va(yn; zg}{?OSNcA4$!B^x@?Pc^^VYwK$1ww>^?!a5mN59dpGCt&-)1xoC)MQ=`>mmtOXt=3 T(lUOl>VtA^t~Os)tCjx(Oh}lK literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/pyproject.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/pyproject.py new file mode 100644 index 0000000..cf614fd --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/pyproject.py @@ -0,0 +1,196 @@ +from __future__ import absolute_import + +import io +import os +import sys +from collections import namedtuple + +from pip._vendor import pytoml, six +from pip._vendor.packaging.requirements import InvalidRequirement, Requirement + +from pip._internal.exceptions import InstallationError +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Any, Optional, List + + +def _is_list_of_str(obj): + # type: (Any) -> bool + return ( + isinstance(obj, list) and + all(isinstance(item, six.string_types) for item in obj) + ) + + +def make_pyproject_path(unpacked_source_directory): + # type: (str) -> str + path = os.path.join(unpacked_source_directory, 'pyproject.toml') + + # Python2 __file__ should not be unicode + if six.PY2 and isinstance(path, six.text_type): + path = path.encode(sys.getfilesystemencoding()) + + return path + + +BuildSystemDetails = namedtuple('BuildSystemDetails', [ + 'requires', 'backend', 'check', 'backend_path' +]) + + +def load_pyproject_toml( + use_pep517, # type: Optional[bool] + pyproject_toml, # type: str + setup_py, # type: str + req_name # type: str +): + # type: (...) -> Optional[BuildSystemDetails] + """Load the pyproject.toml file. + + Parameters: + use_pep517 - Has the user requested PEP 517 processing? None + means the user hasn't explicitly specified. + pyproject_toml - Location of the project's pyproject.toml file + setup_py - Location of the project's setup.py file + req_name - The name of the requirement we're processing (for + error reporting) + + Returns: + None if we should use the legacy code path, otherwise a tuple + ( + requirements from pyproject.toml, + name of PEP 517 backend, + requirements we should check are installed after setting + up the build environment + directory paths to import the backend from (backend-path), + relative to the project root. + ) + """ + has_pyproject = os.path.isfile(pyproject_toml) + has_setup = os.path.isfile(setup_py) + + if has_pyproject: + with io.open(pyproject_toml, encoding="utf-8") as f: + pp_toml = pytoml.load(f) + build_system = pp_toml.get("build-system") + else: + build_system = None + + # The following cases must use PEP 517 + # We check for use_pep517 being non-None and falsey because that means + # the user explicitly requested --no-use-pep517. The value 0 as + # opposed to False can occur when the value is provided via an + # environment variable or config file option (due to the quirk of + # strtobool() returning an integer in pip's configuration code). + if has_pyproject and not has_setup: + if use_pep517 is not None and not use_pep517: + raise InstallationError( + "Disabling PEP 517 processing is invalid: " + "project does not have a setup.py" + ) + use_pep517 = True + elif build_system and "build-backend" in build_system: + if use_pep517 is not None and not use_pep517: + raise InstallationError( + "Disabling PEP 517 processing is invalid: " + "project specifies a build backend of {} " + "in pyproject.toml".format( + build_system["build-backend"] + ) + ) + use_pep517 = True + + # If we haven't worked out whether to use PEP 517 yet, + # and the user hasn't explicitly stated a preference, + # we do so if the project has a pyproject.toml file. + elif use_pep517 is None: + use_pep517 = has_pyproject + + # At this point, we know whether we're going to use PEP 517. + assert use_pep517 is not None + + # If we're using the legacy code path, there is nothing further + # for us to do here. + if not use_pep517: + return None + + if build_system is None: + # Either the user has a pyproject.toml with no build-system + # section, or the user has no pyproject.toml, but has opted in + # explicitly via --use-pep517. + # In the absence of any explicit backend specification, we + # assume the setuptools backend that most closely emulates the + # traditional direct setup.py execution, and require wheel and + # a version of setuptools that supports that backend. + + build_system = { + "requires": ["setuptools>=40.8.0", "wheel"], + "build-backend": "setuptools.build_meta:__legacy__", + } + + # If we're using PEP 517, we have build system information (either + # from pyproject.toml, or defaulted by the code above). + # Note that at this point, we do not know if the user has actually + # specified a backend, though. + assert build_system is not None + + # Ensure that the build-system section in pyproject.toml conforms + # to PEP 518. + error_template = ( + "{package} has a pyproject.toml file that does not comply " + "with PEP 518: {reason}" + ) + + # Specifying the build-system table but not the requires key is invalid + if "requires" not in build_system: + raise InstallationError( + error_template.format(package=req_name, reason=( + "it has a 'build-system' table but not " + "'build-system.requires' which is mandatory in the table" + )) + ) + + # Error out if requires is not a list of strings + requires = build_system["requires"] + if not _is_list_of_str(requires): + raise InstallationError(error_template.format( + package=req_name, + reason="'build-system.requires' is not a list of strings.", + )) + + # Each requirement must be valid as per PEP 508 + for requirement in requires: + try: + Requirement(requirement) + except InvalidRequirement: + raise InstallationError( + error_template.format( + package=req_name, + reason=( + "'build-system.requires' contains an invalid " + "requirement: {!r}".format(requirement) + ), + ) + ) + + backend = build_system.get("build-backend") + backend_path = build_system.get("backend-path", []) + check = [] # type: List[str] + if backend is None: + # If the user didn't specify a backend, we assume they want to use + # the setuptools backend. But we can't be sure they have included + # a version of setuptools which supplies the backend, or wheel + # (which is needed by the backend) in their requirements. So we + # make a note to check that those requirements are present once + # we have set up the environment. + # This is quite a lot of work to check for a very specific case. But + # the problem is, that case is potentially quite common - projects that + # adopted PEP 518 early for the ability to specify requirements to + # execute setup.py, but never considered needing to mention the build + # tools themselves. The original PEP 518 code had a similar check (but + # implemented in a different way). + backend = "setuptools.build_meta:__legacy__" + check = ["setuptools>=40.8.0", "wheel"] + + return BuildSystemDetails(requires, backend, check, backend_path) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/pyproject.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/pyproject.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0474090b43aa721d4b351ca9f046b111dde041e6 GIT binary patch literal 4692 zcmc&%-EtGz5$+?&vL(wu7|c&Xva{sECbgDfcLNl)5O#qI)DlAm5*AgFsj=or9(gn) z<{a5pux{eqCr^;uJV72HSGmh`>|H9A7s%Irq_Iu0dy$Jpwnpc-Pxsef_vtDBccFgp zk2}9_)8tdd@4b6O=HF;U_*aw=^%b=gDejjjDN(B=b7+^TRi3sh)T&6kOvw!OtJJEx zJrzo3sXs@pIqKJ_Rdb^=l+>v|Ppx_CH>lNcqg6^4sJ}?9Mc1FDWQqFA)LJH`mnr|d zoG?ep8S1Z4YlZq}sdbk6=csj#R0<7i^e3X$Dn)f^oF`qSXr7`5MGF)yQnWE{X40^)BRd={Kapdba!#LM{omxAO;S+r)mlb%N8XG1_XyYt>nCDsUrdZ6c zUp;#j+<)}&{?~#3+pVp~TfbW8qvX6V(~+G+=jnhqhKa49^CUL5&9?BDm)^ez&3=Z4 zB|5}YF%H=kvT&$kC@}co2%`#cuvuHOom(u=+{5={G_dUT1sW@ngQuciiADWRy%9P* z7p1qHdW=?VVzw)7YhP4uur!;;X*aN=fi?~+KBsw2RFAFhucJ%yFg>(32YI{~TD`d! z=9`@?iF9r@yMxW>O|Sch&pX$zZD0RvG}^O0YwgX?_IIw~(@i&DY!2eVh8&+H8=v01 zvDNZM9BpB3i@!E za}yhvZTCKy=0e&aHUX;^WSsyYGj$BRkIGA`@Ml4XCzt>odg4Pk7DRw2*|%ltRVaT% zc7_gJx5`r(LAN(cAY89TN5pi&dITTFC%iF>5POU%$Hh7m0ZaozM&KKSc1Ie$EKVIS zSgU8RK6MbY7py+8LJD${SiIhL*z=ikB+ER=*dFrbZJ~C zixqV?!2I)l+m`9%wu6_v_`&O^G@hr?BH2YcoafEz<(q%03i85ko$|{irQRp&jDRNV z3!&Kd4Zbg-5PQ8lDHk) zWaOEFZpWQiN6kV&p>rTQZ+K6#w%p%d)^SF;n`O@ zE36H;Ai>rb08yHgvnNS{iw=3ay(cQ2;@;F<2oYy|_GI%%Nk1-#5QZ^Omt`{xV;Do-$>*QJg z9n3yCwR&pl)X9^4cY4t&k;l49mh?g(GARx~maqeYc>tNsK6Mi7HXMj?+nkO)o$keX zmNKxX78W;*7!EFFo+}>RUYDkwW$P1lHyEO;rb@NVAhX^71UR$Mm}@$IFc{ zz5fi~0z=!`xV2^E8eok#+#P8iW9~t0!tDe$z9&4q*Z>i!SZ^~~xG3_XOdBuFthWBBLCvNYskNRO6g(Kw1pb zDKSolDUAL&A3L5ob_<{7b;{=qFQt}%5F1YDQUk`Blz!Pjr#{z&(o1j+NOgy*P6jx` z`21=my%+gViyWk_erR#W5q)Wp?u(ZtpIPBE2Yjw}{GZ^l&NUAT2}DG3UC7qL#gexr zfP^Z@!PELmvMMfOB6#e$R>LjsMjW;H^{V4MK5(*%pbMOH$$}5$ss+1bFvRY6Jvnw-IjF#1sTB_Dn1AkSuR9V2tBIe7grmB#7VP*+(s;aSo z+0r@}^5VcC=nQcO=^*e~2Y-zpLNQswFJ|p5NszGc5^Q|-iy(~Gy=Jh7@;J+dZ0=>_ z3Z_rYG+nqNDNdt}bGvawVoKSI(+$(N#-=`KYkA`~j-_0`i^yWd(4t&#;w2YyeJ<36 zz>_{#`aW~XXL>sFUgj3_*1wI%F$1La1HTAM7<|#sqG6)%GMa{y>T-$w)= None + self.name = name + + def __repr__(self): + # type: () -> str + return "InstallationResult(name={!r})".format(self.name) + + +def install_given_reqs( + to_install, # type: List[InstallRequirement] + install_options, # type: List[str] + global_options=(), # type: Sequence[str] + *args, # type: Any + **kwargs # type: Any +): + # type: (...) -> List[InstallationResult] + """ + Install everything in the given list. + + (to be called after having downloaded and unpacked the packages) + """ + + if to_install: + logger.info( + 'Installing collected packages: %s', + ', '.join([req.name for req in to_install]), + ) + + installed = [] + + with indent_log(): + for requirement in to_install: + if requirement.should_reinstall: + logger.info('Attempting uninstall: %s', requirement.name) + with indent_log(): + uninstalled_pathset = requirement.uninstall( + auto_confirm=True + ) + try: + requirement.install( + install_options, + global_options, + *args, + **kwargs + ) + except Exception: + should_rollback = ( + requirement.should_reinstall and + not requirement.install_succeeded + ) + # if install did not succeed, rollback previous uninstall + if should_rollback: + uninstalled_pathset.rollback() + raise + else: + should_commit = ( + requirement.should_reinstall and + requirement.install_succeeded + ) + if should_commit: + uninstalled_pathset.commit() + + installed.append(InstallationResult(requirement.name)) + + return installed diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/req/__init__ 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/req/__init__ 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c77f15ca960802742d8bae82d6eecf632b2639af GIT binary patch literal 2768 zcmd58O^@3|^o^Z(lWek^ZlOg5R96C&N_5kz2vF6cEo}uA?Y4MZwT;wTUVGwo>aX>T zw+$p0wr3C*eh*h}9O1|X35gq54!rm5Y>?nwuy$tOysvrR6Z4N==ZEjFJn^Ca8u))} z3qbvZK!AS&Vt_=zNPwWT0kHuigJ~wjCL|3QH7Z&I;wB^(j4V7iA+R7`fuseaR&`#1 zxD81MMxE;1f_N2@E{wV$qy@#dthEhs50W()twFL5qjgC7FzSOy@%9b`s}OV{=s}40 z9s_B>WCP@JI7Aa)fnW{ft1uQ2tiua{Lx4x46A&DOpbsyQ<0Lt-GuS}qB3v*KxaoD= zyj_*WrIv1#1E3r{(a# zD~97N4rHN*VLlA@C*c?GjW3+vy>M|lJQ9?VZOjOo#V|d6b`vDxc3?y?#U8 zy-z4!Zj@?Sq+UG4FbrKhM%r~Z^C<^$aef_dSL6~HK81o79of4+0vLk{`Uo%)RB2Tp zw$+JUWzahk9mdK0_}*i4IvtC9BA2OSBt4H38KYh4;=DQr^dCW8#VrL38>r zl{ft&Z@~i`jh{cnX*NB@5-si>17@h80bk?I57JA} z&~13yf#P=%f|WEO`;qxO(4Dto)`sF&n6+TCO4iYI{0bZG9e7yTmHk;W&pR+fJsW~} zy9?f#1(P1=wS~=G)?)t-JgCe=`p$srR+YGQZ2am%x8;E>rg|?*Lpw@sy(ev+Gj@!l zX|uzu1D)Bs()Mx6$-wr;*n;++cR(UR_AHGvFCcsx*kzh~{!=`V9s<2ks None + self.name = name + + def __repr__(self): + # type: () -> str + return "InstallationResult(name={!r})".format(self.name) + + +def install_given_reqs( + to_install, # type: List[InstallRequirement] + install_options, # type: List[str] + global_options=(), # type: Sequence[str] + *args, # type: Any + **kwargs # type: Any +): + # type: (...) -> List[InstallationResult] + """ + Install everything in the given list. + + (to be called after having downloaded and unpacked the packages) + """ + + if to_install: + logger.info( + 'Installing collected packages: %s', + ', '.join([req.name for req in to_install]), + ) + + installed = [] + + with indent_log(): + for requirement in to_install: + if requirement.should_reinstall: + logger.info('Attempting uninstall: %s', requirement.name) + with indent_log(): + uninstalled_pathset = requirement.uninstall( + auto_confirm=True + ) + try: + requirement.install( + install_options, + global_options, + *args, + **kwargs + ) + except Exception: + should_rollback = ( + requirement.should_reinstall and + not requirement.install_succeeded + ) + # if install did not succeed, rollback previous uninstall + if should_rollback: + uninstalled_pathset.rollback() + raise + else: + should_commit = ( + requirement.should_reinstall and + requirement.install_succeeded + ) + if should_commit: + uninstalled_pathset.commit() + + installed.append(InstallationResult(requirement.name)) + + return installed diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/req/__init__.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/req/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6b3583584e2c3dbdb6e186965afce514e82d18dd GIT binary patch literal 2768 zcmd58O^@3|^o^Z(6K}Gc?m~+SsICMkmFT9Ws6|zawzL&gv?+Lt+D2+EuRZZP>#w!P z+Xj*g+cSs@|A&9T5sqAtkhpQ>zk#)~)B};=?I!rE;CI09LV)+4 z0I9)b1LP(gp^2}6zXtME7z^;%;RV1Ez~j+L@K1o>gBQqgiX7PKZ=iD_F6ax~)H-hN zZjnZ%l1>qc!DAht>2c>1=NxO*$ zn@Bb@vuo7_P7of-gp4Q@q3e5H6{d+Ti!xFkV)-NEKibB$pGH6eWgC-?5u{8D26V7@ z`Wliw+7|0333U-M6EFjCxM+6RpE`tOTH?l%W!Z;9Mq_&w(S2OiR>TMmvOGL=l^h(p z`CyzzzRZh3kPZBUN$}-5ty$kpS$>6~t3$ycK<@5RXu3R3D zY(nvJ!bHhDaial-Vc_5~RF1QiO*x2*^XqtfK`w#jQ7CB9k-h67fH9b$j{p-vl~x5} zSiFg(e@3-W?q2`uY(76%Ic*@@IL%{MRc@1dyMx>RAON|{a>qG?#?%4mQ^M-#kRy(x zs0$n?PW>{%qfP0ysb`kvGxYM4Xp?1BvIQA!h<3xHCZO7)@ZR4>%4Li;CNBQ~6sHeU zi8ElLLBRN1Pu5}Hgjo|NIy}|j;0;Rfk;d}|S>^^{(H;SO`x}VozmTe1Pkx5^3d~ku z(uDl`gv@N9H%7GjGGJ4f(GyYr$ldtfT4pH8$Ei@TjsY{j+ACn=nH?8-jQ{ z3*MOllP;*Wh0R>n;^00!tjt6DPM_+wC~-3_{OUrt!FSbqyWpyQ*D78^<{L`MI8(%2CiOrd9!16AmMV3;G#Q6^JnU2XD)JA< zdLVP2OJOoj8JMJD!kubUrz#o%#a>!QKF-owEoKMc_!5?Ske3pZOb-UncV@Z$+>>Zg zny3>?ic^%HCnd&!`z%MtcF}dV$4lclR1CUVCKI1)yiX;~eTYsh^pg)Y?4*22fe8f& zqIB1dj#1PaZXOh@bN?BG)Fn6&*~D4}8bg;LcJXAXO*|j_D19e$)m|YLzn6=EENrKt zP~$2Wmc!vcm)S+6ePu*ZmJ+GIYo~MK08~-PtI1U!l>A)=~XS!u=+P9HO)|m zO^;4h6Y{_rhmouv^*S+&%=2^4cVo63%n1Jo;QZElsIqOUMY}~B3343lMjYl8nn0?% zT=zEBwoQ3v>2!C39mW-B6W=n2488nBaxAV@FVBZm$ovDPr**WR=+VO65N9xL9erIt G+5HPc5s$+F literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/req/constructors 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/req/constructors 2.py new file mode 100644 index 0000000..1f3cd8a --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/req/constructors 2.py @@ -0,0 +1,436 @@ +"""Backing implementation for InstallRequirement's various constructors + +The idea here is that these formed a major chunk of InstallRequirement's size +so, moving them and support code dedicated to them outside of that class +helps creates for better understandability for the rest of the code. + +These are meant to be used elsewhere within pip to create instances of +InstallRequirement. +""" + +# The following comment should be removed at some point in the future. +# mypy: strict-optional=False + +import logging +import os +import re + +from pip._vendor.packaging.markers import Marker +from pip._vendor.packaging.requirements import InvalidRequirement, Requirement +from pip._vendor.packaging.specifiers import Specifier +from pip._vendor.pkg_resources import RequirementParseError, parse_requirements + +from pip._internal.exceptions import InstallationError +from pip._internal.models.index import PyPI, TestPyPI +from pip._internal.models.link import Link +from pip._internal.models.wheel import Wheel +from pip._internal.pyproject import make_pyproject_path +from pip._internal.req.req_install import InstallRequirement +from pip._internal.utils.filetypes import ARCHIVE_EXTENSIONS +from pip._internal.utils.misc import is_installable_dir, splitext +from pip._internal.utils.typing import MYPY_CHECK_RUNNING +from pip._internal.utils.urls import path_to_url +from pip._internal.vcs import is_url, vcs + +if MYPY_CHECK_RUNNING: + from typing import ( + Any, Dict, Optional, Set, Tuple, Union, + ) + from pip._internal.cache import WheelCache + + +__all__ = [ + "install_req_from_editable", "install_req_from_line", + "parse_editable" +] + +logger = logging.getLogger(__name__) +operators = Specifier._operators.keys() + + +def is_archive_file(name): + # type: (str) -> bool + """Return True if `name` is a considered as an archive file.""" + ext = splitext(name)[1].lower() + if ext in ARCHIVE_EXTENSIONS: + return True + return False + + +def _strip_extras(path): + # type: (str) -> Tuple[str, Optional[str]] + m = re.match(r'^(.+)(\[[^\]]+\])$', path) + extras = None + if m: + path_no_extras = m.group(1) + extras = m.group(2) + else: + path_no_extras = path + + return path_no_extras, extras + + +def convert_extras(extras): + # type: (Optional[str]) -> Set[str] + if not extras: + return set() + return Requirement("placeholder" + extras.lower()).extras + + +def parse_editable(editable_req): + # type: (str) -> Tuple[Optional[str], str, Optional[Set[str]]] + """Parses an editable requirement into: + - a requirement name + - an URL + - extras + - editable options + Accepted requirements: + svn+http://blahblah@rev#egg=Foobar[baz]&subdirectory=version_subdir + .[some_extra] + """ + + url = editable_req + + # If a file path is specified with extras, strip off the extras. + url_no_extras, extras = _strip_extras(url) + + if os.path.isdir(url_no_extras): + if not os.path.exists(os.path.join(url_no_extras, 'setup.py')): + msg = ( + 'File "setup.py" not found. Directory cannot be installed ' + 'in editable mode: {}'.format(os.path.abspath(url_no_extras)) + ) + pyproject_path = make_pyproject_path(url_no_extras) + if os.path.isfile(pyproject_path): + msg += ( + '\n(A "pyproject.toml" file was found, but editable ' + 'mode currently requires a setup.py based build.)' + ) + raise InstallationError(msg) + + # Treating it as code that has already been checked out + url_no_extras = path_to_url(url_no_extras) + + if url_no_extras.lower().startswith('file:'): + package_name = Link(url_no_extras).egg_fragment + if extras: + return ( + package_name, + url_no_extras, + Requirement("placeholder" + extras.lower()).extras, + ) + else: + return package_name, url_no_extras, None + + for version_control in vcs: + if url.lower().startswith('%s:' % version_control): + url = '%s+%s' % (version_control, url) + break + + if '+' not in url: + raise InstallationError( + '{} is not a valid editable requirement. ' + 'It should either be a path to a local project or a VCS URL ' + '(beginning with svn+, git+, hg+, or bzr+).'.format(editable_req) + ) + + vc_type = url.split('+', 1)[0].lower() + + if not vcs.get_backend(vc_type): + error_message = 'For --editable=%s only ' % editable_req + \ + ', '.join([backend.name + '+URL' for backend in vcs.backends]) + \ + ' is currently supported' + raise InstallationError(error_message) + + package_name = Link(url).egg_fragment + if not package_name: + raise InstallationError( + "Could not detect requirement name for '%s', please specify one " + "with #egg=your_package_name" % editable_req + ) + return package_name, url, None + + +def deduce_helpful_msg(req): + # type: (str) -> str + """Returns helpful msg in case requirements file does not exist, + or cannot be parsed. + + :params req: Requirements file path + """ + msg = "" + if os.path.exists(req): + msg = " It does exist." + # Try to parse and check if it is a requirements file. + try: + with open(req, 'r') as fp: + # parse first line only + next(parse_requirements(fp.read())) + msg += " The argument you provided " + \ + "(%s) appears to be a" % (req) + \ + " requirements file. If that is the" + \ + " case, use the '-r' flag to install" + \ + " the packages specified within it." + except RequirementParseError: + logger.debug("Cannot parse '%s' as requirements \ + file" % (req), exc_info=True) + else: + msg += " File '%s' does not exist." % (req) + return msg + + +class RequirementParts(object): + def __init__( + self, + requirement, # type: Optional[Requirement] + link, # type: Optional[Link] + markers, # type: Optional[Marker] + extras, # type: Set[str] + ): + self.requirement = requirement + self.link = link + self.markers = markers + self.extras = extras + + +def parse_req_from_editable(editable_req): + # type: (str) -> RequirementParts + name, url, extras_override = parse_editable(editable_req) + + if name is not None: + try: + req = Requirement(name) + except InvalidRequirement: + raise InstallationError("Invalid requirement: '%s'" % name) + else: + req = None + + link = Link(url) + + return RequirementParts(req, link, None, extras_override) + + +# ---- The actual constructors follow ---- + + +def install_req_from_editable( + editable_req, # type: str + comes_from=None, # type: Optional[str] + use_pep517=None, # type: Optional[bool] + isolated=False, # type: bool + options=None, # type: Optional[Dict[str, Any]] + wheel_cache=None, # type: Optional[WheelCache] + constraint=False # type: bool +): + # type: (...) -> InstallRequirement + + parts = parse_req_from_editable(editable_req) + + source_dir = parts.link.file_path if parts.link.scheme == 'file' else None + + return InstallRequirement( + parts.requirement, comes_from, source_dir=source_dir, + editable=True, + link=parts.link, + constraint=constraint, + use_pep517=use_pep517, + isolated=isolated, + options=options if options else {}, + wheel_cache=wheel_cache, + extras=parts.extras, + ) + + +def _looks_like_path(name): + # type: (str) -> bool + """Checks whether the string "looks like" a path on the filesystem. + + This does not check whether the target actually exists, only judge from the + appearance. + + Returns true if any of the following conditions is true: + * a path separator is found (either os.path.sep or os.path.altsep); + * a dot is found (which represents the current directory). + """ + if os.path.sep in name: + return True + if os.path.altsep is not None and os.path.altsep in name: + return True + if name.startswith("."): + return True + return False + + +def _get_url_from_path(path, name): + # type: (str, str) -> str + """ + First, it checks whether a provided path is an installable directory + (e.g. it has a setup.py). If it is, returns the path. + + If false, check if the path is an archive file (such as a .whl). + The function checks if the path is a file. If false, if the path has + an @, it will treat it as a PEP 440 URL requirement and return the path. + """ + if _looks_like_path(name) and os.path.isdir(path): + if is_installable_dir(path): + return path_to_url(path) + raise InstallationError( + "Directory %r is not installable. Neither 'setup.py' " + "nor 'pyproject.toml' found." % name + ) + if not is_archive_file(path): + return None + if os.path.isfile(path): + return path_to_url(path) + urlreq_parts = name.split('@', 1) + if len(urlreq_parts) >= 2 and not _looks_like_path(urlreq_parts[0]): + # If the path contains '@' and the part before it does not look + # like a path, try to treat it as a PEP 440 URL req instead. + return None + logger.warning( + 'Requirement %r looks like a filename, but the ' + 'file does not exist', + name + ) + return path_to_url(path) + + +def parse_req_from_line(name, line_source): + # type: (str, Optional[str]) -> RequirementParts + if is_url(name): + marker_sep = '; ' + else: + marker_sep = ';' + if marker_sep in name: + name, markers_as_string = name.split(marker_sep, 1) + markers_as_string = markers_as_string.strip() + if not markers_as_string: + markers = None + else: + markers = Marker(markers_as_string) + else: + markers = None + name = name.strip() + req_as_string = None + path = os.path.normpath(os.path.abspath(name)) + link = None + extras_as_string = None + + if is_url(name): + link = Link(name) + else: + p, extras_as_string = _strip_extras(path) + url = _get_url_from_path(p, name) + if url is not None: + link = Link(url) + + # it's a local file, dir, or url + if link: + # Handle relative file URLs + if link.scheme == 'file' and re.search(r'\.\./', link.url): + link = Link( + path_to_url(os.path.normpath(os.path.abspath(link.path)))) + # wheel file + if link.is_wheel: + wheel = Wheel(link.filename) # can raise InvalidWheelFilename + req_as_string = "%s==%s" % (wheel.name, wheel.version) + else: + # set the req to the egg fragment. when it's not there, this + # will become an 'unnamed' requirement + req_as_string = link.egg_fragment + + # a requirement specifier + else: + req_as_string = name + + extras = convert_extras(extras_as_string) + + def with_source(text): + # type: (str) -> str + if not line_source: + return text + return '{} (from {})'.format(text, line_source) + + if req_as_string is not None: + try: + req = Requirement(req_as_string) + except InvalidRequirement: + if os.path.sep in req_as_string: + add_msg = "It looks like a path." + add_msg += deduce_helpful_msg(req_as_string) + elif ('=' in req_as_string and + not any(op in req_as_string for op in operators)): + add_msg = "= is not a valid operator. Did you mean == ?" + else: + add_msg = '' + msg = with_source( + 'Invalid requirement: {!r}'.format(req_as_string) + ) + if add_msg: + msg += '\nHint: {}'.format(add_msg) + raise InstallationError(msg) + else: + req = None + + return RequirementParts(req, link, markers, extras) + + +def install_req_from_line( + name, # type: str + comes_from=None, # type: Optional[Union[str, InstallRequirement]] + use_pep517=None, # type: Optional[bool] + isolated=False, # type: bool + options=None, # type: Optional[Dict[str, Any]] + wheel_cache=None, # type: Optional[WheelCache] + constraint=False, # type: bool + line_source=None, # type: Optional[str] +): + # type: (...) -> InstallRequirement + """Creates an InstallRequirement from a name, which might be a + requirement, directory containing 'setup.py', filename, or URL. + + :param line_source: An optional string describing where the line is from, + for logging purposes in case of an error. + """ + parts = parse_req_from_line(name, line_source) + + return InstallRequirement( + parts.requirement, comes_from, link=parts.link, markers=parts.markers, + use_pep517=use_pep517, isolated=isolated, + options=options if options else {}, + wheel_cache=wheel_cache, + constraint=constraint, + extras=parts.extras, + ) + + +def install_req_from_req_string( + req_string, # type: str + comes_from=None, # type: Optional[InstallRequirement] + isolated=False, # type: bool + wheel_cache=None, # type: Optional[WheelCache] + use_pep517=None # type: Optional[bool] +): + # type: (...) -> InstallRequirement + try: + req = Requirement(req_string) + except InvalidRequirement: + raise InstallationError("Invalid requirement: '%s'" % req_string) + + domains_not_allowed = [ + PyPI.file_storage_domain, + TestPyPI.file_storage_domain, + ] + if (req.url and comes_from and comes_from.link and + comes_from.link.netloc in domains_not_allowed): + # Explicitly disallow pypi packages that depend on external urls + raise InstallationError( + "Packages installed from PyPI cannot depend on packages " + "which are not also hosted on PyPI.\n" + "%s depends on %s " % (comes_from.name, req) + ) + + return InstallRequirement( + req, comes_from, isolated=isolated, wheel_cache=wheel_cache, + use_pep517=use_pep517 + ) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/req/constructors 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/req/constructors 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..11332c90f5a7f892ad6884e3a56981c0a8b4fb03 GIT binary patch literal 13459 zcmc&)OLN>-c0TClt0_{HD2bG8S%zL#OQM?g*dEQumPaxz*-C7V29!r~TXGw0fZZU0 zMhh2BnYNguB3JCGnyFN37I{>vl2sOY?via5sj138$R@uc*<_V`-?``qM|NdNlDNDt z+{d}+@tt!~{;%2TfB)C(pEafUnZo}YcuZIl2}J5h9SKSjJ5oo+=1Wp9_48$^mo;CO zcubOUsgH}peq$0(NHQt)NlB)pK4ojiC9X&^E%j+zo{;!}Br{T7I zUXc0=wmd8Gi;|p_`bk?pDDg{@oRaz}NnV!v%eHn-Vpo#WQa^3Wha^5D$yuqNwdKPS zpOfUg)Xz)uiqu~bCp<0L?<)=FCB7g@Rq9nqE=v8PB$uRqNs`M_zbwg;)R!c=BK0eF zq$3j7Bw3dFvN##j%>ar;Sb~)j^cF*r)BdE*?d!;;go(T!J>SP z%vA}FYvxB1oY2gVC3rzI*CcpRGjB<7Qo^@o1BdhyYcRqm_3ILx(&l$~-1rM`jAUMx zuP3B_Qvz4}yeq+J&8$dpMlEtb7d?xV2}%;GBFtCiUB_T&tcZyZxRc@~+?9 ziaISfO1g2Fgq_^aqqO60q?voCV{$)^z3_1_%Czl*aku>}N_)m_rfAK2%{4yX`PT&bWEo&yj>CzV`E9^cd)J0T@T%!!SrEl!Y8`tCsE#x zI&L@WvfWPUMxF3E=n~we$KdV)ogX9xPKJv4zFsnihNIs9`PG{SXqhRC+ z@&l+IDcg4|s9fuY&1fU)zkY0Qzq@{B!dqDe8gk$+i;Zk}w8jo}7;VKul@as}yPh#L z-QBr+C#Sl)2Qsl>-(u5;QD@7R#!%qNSt7~_Dy1F(bPGlNN;5hczp_$>_i+cUcCKkOC{b4YW;@JJpja%Pr_k8Q(xd^d&bgJGXZKud z9CgC{AX@C%^*cAoJY*O?D|pN$B)P~_=oly)M^0=y)Hb`0Jar^5$<~BquW&v8 z`7z${!n~Jt+#-tm+0a|*Ms(hl*;D90#wAPvoSv<=~o;;=e@EZTmyqQ18mk_imZHAG1myFbu>W2eu5N zFOTZ5T6ZVs;&JrF-WuH7>!>nhcquP9GtQW!8GDPeDvt@!$%j- zDYYY>wsymTie#3!iJv#yO7GPa%))bMWofT#J91F6d(PuZRNsK=nQscNf*^F#hOOH7 zvmoa*U}2(ev7)z8VaWbcns+AfJLk-oCQ5o9+|b}W&Y=K;npvL8Gw4O^*PhHKPC#T4 zr-0+IjK8Y-v>W@)u&pd+NyWiTn0utHcZvyxN+sFmP})~kB_Y7R+hLX$^tpo?Lro>6 z31`ysDHR;6R`8g4Y=(>m9e@l}f+G*Xs`x7lNCe`5Dquj=XaCf%8S7`p*#t6zyV1e? zHQ9M{qTf1Myojb3*q|d@lag&Y*g;SsDL`Ai zHP{LV1(uwWV46e=4nPmL6`|K<0UTdkPbiSM_NE6EG?>3GDaXl ziV#$}_e~4H&;a@Y%jD^`X}9>f;`)19smDhfJMPEcha(kMtBh6@w$4q}gc@zS*=&Yg z!n%=(&2Un)-MQS(^X|3f<@MNa^SP0Q+h@a8>-z09UH7w3*ZnUay<&Rn00RITX|{76 zB4S{L8@6(=g4(AhO+qU>kF-|RJcPd2g)J~2fh@OS0NgYEsxxjU&4Ckv9c%7;{qfzV z-(fuvVPSKyd;q}#4HE#?YwlOOW*s9=S8uv!1~{mer%8N9ZK(SMc2&n-a@TwL-q+n` zFUtVU+kH~btG zM~}$Q^GRg=bwfIO)YRG*86KX;ZXUt7S|128$ddb6Zb(Isa6g|x0?r3?^jqAGHCD7! z-YZOqyLB-Nh}F)u!o0DLErgvw;cJmM-f8r$>Kb&^LNs~qFt*1^GtRtIcBad7<+;)^0F#MQ8RZwshf1@~3FnYAg&t+p&XrG==1Q-@ zJkOQT3w32@w$$vy7vjtn&hU>&U~8?Z2C#%}w$>&4OWIx3@7yJTMkW-lF&HID`vKr!HH7ojT{?%3 zUsL6mnHSk|58l3?wR)-vAl+18+i-FaYdDJb>Und~^}F2=o^s*x`{oQ^d~O%ekVV)* zBOjqT%WmB962kvB(4 z9R6BHvR!C+8x6IGjRv4q4}qVCcfY^<{bnuC!%F^{8{qLySTBsWoJXLiy^9R}FICSE z%hcu81*4i4*{VqPKz0sMR!{@|4L|ArN5g-_99L!cpvP=D%vUF5->Gt7d(9ODEIA8dNaJ?sKp6%;2 z(l|zRz&IEaFT&FtlPqJ3ae$9uuX&!Z%oqwDWT~>I%6nBMT=l-9MZi_)w|-Ex52W=F zRD5jk%LgRYBJ5P78+PA(?W&rM$fPj??5a!(7fm4~qTONKXflXtRfjUer=W%%n#^v{ zh_D`8xE>AnT1Fzev-Z3n@V8gPu7DA3-Efm5#{eEf+ z*bg-fYM>w3Mb$+1GyCc!j6@kDn=MSX(hi$j#>JVb+eW0pkQ$t^GjW=tC62bjGj8F_ z;o65icw}bB5hVCA_+Q7i2{_;%-p77!G zvt3$1>cTuxx} z8C2+?Ga6Y`g$yssp@Oz6(sMLel<4W+j&NJJ>6BL(U2iWrX9VM zajT{W?$udpPug+8ruQgQy-rgvd5gXL_CTrubV0>@qaCnr-3WGhLkaREierc)u2{J( zo$v0gyY3rrys8195rnGuxOQ`cm0RI4#0SHW+IbaWdW9o|thuX&G+*dPzAnIX%-jom z<7x1+G(@Ma-i_g92}~zA^d^!K`0iq=p(ezEQ27yK+9;fAAi7Kg?Wb+CcPgk#duz%&!WJwhU6%5gE8ISoJ zsE`4Q%JAKVqG3W=y_obnwSuykg z9&;SqA6QD{7q|`?ry1Rx>}LSER0;4!Mb5Zo;F##p2kzN#1n|aoLu==4jm7H?2NyP_ zouPy5P^dv?gi|cOFFAa-q6@>j7!w=(a|bCd2&k|CA0IjhxNRQPunp?x802APg?Aj^ zv0(H;%t!UEO}Q!^dGoMjzjEO7a{MDYDRd=N9zJC`s_8M_IWB+@kN-*+u|T5OTS-!9 zkw}xYI3V8u(7{cals^JFX5`y}%krxdU6$jlVb58(EWa*|;g*{LrC*d7P_jgRfn9i@ zhf9FAy9gy6l>Eiwy{jm9@C{9+-)W_kpOkMLophR$<}b;6c7HS3N(px=d;_O5qeFpu zAlj*7G%jS0<7Z!%p3d{>6DZyMFux=Bh zNvrDCz2&NIc`E|vi}#RxOoo0~dstgG6Ud!6*AcL8vY8J#oxxZQ!F-GV8dX~ZuWu?p zp$ey4+(#NhWCZ4`3Yoszy;#**-bAhD6y*;;Z(tCB9|kmx;(gT-`*eHGr7&n!Eaf5A zt<>OsxD((J~q@*^yrFeP2aF;pg_%D zaTDO_rzguClP74y3^dl>&-gBd2mXLMlYN>PkK$l0ECVi84a(^z4d3CUHUQQD_ReXJ zi+I?O6KwE{{9yf74pBrc2Hc{Y*|kv((#&q@65oL(5RGc+R{S7f1kt;JT4gciNRNy0 zzCf}+9EWS<=VBey6_?0+JVZg1qXOxiagO7GzlzHVmL{B2co6r%HN`xjKK_>{O6OqN zuaqh%pBS4NV^m~rq8}xphkFG5UefUxIGu17oFn``V+!+-fw-6zJUX*Aq_it)EkS6Q zN|rKz`L(gAmr!HbKf*t-_+N;z$N&#^!bvg)z&LrU$O28hFu!sd3vNd;wN-Yhmdq>1VRFw z;)-(5-32`EfwI2l-s}|D-?%<49P=PF%`95ypkOzAb4U!zm(($Z8*T4MG{%qd8F^>l zZZGSm26rj_s}}gr*sk87S&Xf0Zn^$*5azoAD>fcO3+BPni#Lqc++*=$Cggsltd00> zu;wUG)!m^yW!<}kR}i-kBY;Z6>^{28hq1+Zw)NxkvTO^t?Hgu z-b#?CEUDZ$nA~b=Y9Kqd!7X;)K(GoQDF*w^n}EOH@wMl0Lw`!PCI8Bl4M`s@LrIs8 zL&@U)xU^6%JI9>r`)F5N)BydOxFR8K3+-T?RJGVIp%x!Q)*9P5<1|B9j2|>WgVg#r zM(7~|+)jZSO{oWVs*A)0H*?494ByQQWf~^)p@fN-sy;8Kdj0~n~KY$qh zWV42=OjvV90M+#8ywTj-gWuZ3rWWDr?k_wNK$&PbK+*gk$xn@8Fny_l$7ljRkGQNPB6C51%b$q}ZtR6(b%+*&~|w7MPGK9w+d4vKDjf zAyQNC3P|9BKOuMEPwH9(6F$_dWA6b6(1-}ZTVsIq)ZN(%cZ~N3>~WTfB2fj5q@;z3 zR43^=KQ7mcDNipXUSYG#gd%3+HC^VuVM3Aeeu-qL05rExV2$eTZF{5njv|*fDkjEf zV5MeChk&N=6#ow)&tKNDcEYKZkBkAomFIxeDwWD?WwP=+m6HnxD+~O@#Qx44s~oMI Osd)V||IaMi(*FTUMXs{| literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/req/constructors.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/req/constructors.py new file mode 100644 index 0000000..1f3cd8a --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/req/constructors.py @@ -0,0 +1,436 @@ +"""Backing implementation for InstallRequirement's various constructors + +The idea here is that these formed a major chunk of InstallRequirement's size +so, moving them and support code dedicated to them outside of that class +helps creates for better understandability for the rest of the code. + +These are meant to be used elsewhere within pip to create instances of +InstallRequirement. +""" + +# The following comment should be removed at some point in the future. +# mypy: strict-optional=False + +import logging +import os +import re + +from pip._vendor.packaging.markers import Marker +from pip._vendor.packaging.requirements import InvalidRequirement, Requirement +from pip._vendor.packaging.specifiers import Specifier +from pip._vendor.pkg_resources import RequirementParseError, parse_requirements + +from pip._internal.exceptions import InstallationError +from pip._internal.models.index import PyPI, TestPyPI +from pip._internal.models.link import Link +from pip._internal.models.wheel import Wheel +from pip._internal.pyproject import make_pyproject_path +from pip._internal.req.req_install import InstallRequirement +from pip._internal.utils.filetypes import ARCHIVE_EXTENSIONS +from pip._internal.utils.misc import is_installable_dir, splitext +from pip._internal.utils.typing import MYPY_CHECK_RUNNING +from pip._internal.utils.urls import path_to_url +from pip._internal.vcs import is_url, vcs + +if MYPY_CHECK_RUNNING: + from typing import ( + Any, Dict, Optional, Set, Tuple, Union, + ) + from pip._internal.cache import WheelCache + + +__all__ = [ + "install_req_from_editable", "install_req_from_line", + "parse_editable" +] + +logger = logging.getLogger(__name__) +operators = Specifier._operators.keys() + + +def is_archive_file(name): + # type: (str) -> bool + """Return True if `name` is a considered as an archive file.""" + ext = splitext(name)[1].lower() + if ext in ARCHIVE_EXTENSIONS: + return True + return False + + +def _strip_extras(path): + # type: (str) -> Tuple[str, Optional[str]] + m = re.match(r'^(.+)(\[[^\]]+\])$', path) + extras = None + if m: + path_no_extras = m.group(1) + extras = m.group(2) + else: + path_no_extras = path + + return path_no_extras, extras + + +def convert_extras(extras): + # type: (Optional[str]) -> Set[str] + if not extras: + return set() + return Requirement("placeholder" + extras.lower()).extras + + +def parse_editable(editable_req): + # type: (str) -> Tuple[Optional[str], str, Optional[Set[str]]] + """Parses an editable requirement into: + - a requirement name + - an URL + - extras + - editable options + Accepted requirements: + svn+http://blahblah@rev#egg=Foobar[baz]&subdirectory=version_subdir + .[some_extra] + """ + + url = editable_req + + # If a file path is specified with extras, strip off the extras. + url_no_extras, extras = _strip_extras(url) + + if os.path.isdir(url_no_extras): + if not os.path.exists(os.path.join(url_no_extras, 'setup.py')): + msg = ( + 'File "setup.py" not found. Directory cannot be installed ' + 'in editable mode: {}'.format(os.path.abspath(url_no_extras)) + ) + pyproject_path = make_pyproject_path(url_no_extras) + if os.path.isfile(pyproject_path): + msg += ( + '\n(A "pyproject.toml" file was found, but editable ' + 'mode currently requires a setup.py based build.)' + ) + raise InstallationError(msg) + + # Treating it as code that has already been checked out + url_no_extras = path_to_url(url_no_extras) + + if url_no_extras.lower().startswith('file:'): + package_name = Link(url_no_extras).egg_fragment + if extras: + return ( + package_name, + url_no_extras, + Requirement("placeholder" + extras.lower()).extras, + ) + else: + return package_name, url_no_extras, None + + for version_control in vcs: + if url.lower().startswith('%s:' % version_control): + url = '%s+%s' % (version_control, url) + break + + if '+' not in url: + raise InstallationError( + '{} is not a valid editable requirement. ' + 'It should either be a path to a local project or a VCS URL ' + '(beginning with svn+, git+, hg+, or bzr+).'.format(editable_req) + ) + + vc_type = url.split('+', 1)[0].lower() + + if not vcs.get_backend(vc_type): + error_message = 'For --editable=%s only ' % editable_req + \ + ', '.join([backend.name + '+URL' for backend in vcs.backends]) + \ + ' is currently supported' + raise InstallationError(error_message) + + package_name = Link(url).egg_fragment + if not package_name: + raise InstallationError( + "Could not detect requirement name for '%s', please specify one " + "with #egg=your_package_name" % editable_req + ) + return package_name, url, None + + +def deduce_helpful_msg(req): + # type: (str) -> str + """Returns helpful msg in case requirements file does not exist, + or cannot be parsed. + + :params req: Requirements file path + """ + msg = "" + if os.path.exists(req): + msg = " It does exist." + # Try to parse and check if it is a requirements file. + try: + with open(req, 'r') as fp: + # parse first line only + next(parse_requirements(fp.read())) + msg += " The argument you provided " + \ + "(%s) appears to be a" % (req) + \ + " requirements file. If that is the" + \ + " case, use the '-r' flag to install" + \ + " the packages specified within it." + except RequirementParseError: + logger.debug("Cannot parse '%s' as requirements \ + file" % (req), exc_info=True) + else: + msg += " File '%s' does not exist." % (req) + return msg + + +class RequirementParts(object): + def __init__( + self, + requirement, # type: Optional[Requirement] + link, # type: Optional[Link] + markers, # type: Optional[Marker] + extras, # type: Set[str] + ): + self.requirement = requirement + self.link = link + self.markers = markers + self.extras = extras + + +def parse_req_from_editable(editable_req): + # type: (str) -> RequirementParts + name, url, extras_override = parse_editable(editable_req) + + if name is not None: + try: + req = Requirement(name) + except InvalidRequirement: + raise InstallationError("Invalid requirement: '%s'" % name) + else: + req = None + + link = Link(url) + + return RequirementParts(req, link, None, extras_override) + + +# ---- The actual constructors follow ---- + + +def install_req_from_editable( + editable_req, # type: str + comes_from=None, # type: Optional[str] + use_pep517=None, # type: Optional[bool] + isolated=False, # type: bool + options=None, # type: Optional[Dict[str, Any]] + wheel_cache=None, # type: Optional[WheelCache] + constraint=False # type: bool +): + # type: (...) -> InstallRequirement + + parts = parse_req_from_editable(editable_req) + + source_dir = parts.link.file_path if parts.link.scheme == 'file' else None + + return InstallRequirement( + parts.requirement, comes_from, source_dir=source_dir, + editable=True, + link=parts.link, + constraint=constraint, + use_pep517=use_pep517, + isolated=isolated, + options=options if options else {}, + wheel_cache=wheel_cache, + extras=parts.extras, + ) + + +def _looks_like_path(name): + # type: (str) -> bool + """Checks whether the string "looks like" a path on the filesystem. + + This does not check whether the target actually exists, only judge from the + appearance. + + Returns true if any of the following conditions is true: + * a path separator is found (either os.path.sep or os.path.altsep); + * a dot is found (which represents the current directory). + """ + if os.path.sep in name: + return True + if os.path.altsep is not None and os.path.altsep in name: + return True + if name.startswith("."): + return True + return False + + +def _get_url_from_path(path, name): + # type: (str, str) -> str + """ + First, it checks whether a provided path is an installable directory + (e.g. it has a setup.py). If it is, returns the path. + + If false, check if the path is an archive file (such as a .whl). + The function checks if the path is a file. If false, if the path has + an @, it will treat it as a PEP 440 URL requirement and return the path. + """ + if _looks_like_path(name) and os.path.isdir(path): + if is_installable_dir(path): + return path_to_url(path) + raise InstallationError( + "Directory %r is not installable. Neither 'setup.py' " + "nor 'pyproject.toml' found." % name + ) + if not is_archive_file(path): + return None + if os.path.isfile(path): + return path_to_url(path) + urlreq_parts = name.split('@', 1) + if len(urlreq_parts) >= 2 and not _looks_like_path(urlreq_parts[0]): + # If the path contains '@' and the part before it does not look + # like a path, try to treat it as a PEP 440 URL req instead. + return None + logger.warning( + 'Requirement %r looks like a filename, but the ' + 'file does not exist', + name + ) + return path_to_url(path) + + +def parse_req_from_line(name, line_source): + # type: (str, Optional[str]) -> RequirementParts + if is_url(name): + marker_sep = '; ' + else: + marker_sep = ';' + if marker_sep in name: + name, markers_as_string = name.split(marker_sep, 1) + markers_as_string = markers_as_string.strip() + if not markers_as_string: + markers = None + else: + markers = Marker(markers_as_string) + else: + markers = None + name = name.strip() + req_as_string = None + path = os.path.normpath(os.path.abspath(name)) + link = None + extras_as_string = None + + if is_url(name): + link = Link(name) + else: + p, extras_as_string = _strip_extras(path) + url = _get_url_from_path(p, name) + if url is not None: + link = Link(url) + + # it's a local file, dir, or url + if link: + # Handle relative file URLs + if link.scheme == 'file' and re.search(r'\.\./', link.url): + link = Link( + path_to_url(os.path.normpath(os.path.abspath(link.path)))) + # wheel file + if link.is_wheel: + wheel = Wheel(link.filename) # can raise InvalidWheelFilename + req_as_string = "%s==%s" % (wheel.name, wheel.version) + else: + # set the req to the egg fragment. when it's not there, this + # will become an 'unnamed' requirement + req_as_string = link.egg_fragment + + # a requirement specifier + else: + req_as_string = name + + extras = convert_extras(extras_as_string) + + def with_source(text): + # type: (str) -> str + if not line_source: + return text + return '{} (from {})'.format(text, line_source) + + if req_as_string is not None: + try: + req = Requirement(req_as_string) + except InvalidRequirement: + if os.path.sep in req_as_string: + add_msg = "It looks like a path." + add_msg += deduce_helpful_msg(req_as_string) + elif ('=' in req_as_string and + not any(op in req_as_string for op in operators)): + add_msg = "= is not a valid operator. Did you mean == ?" + else: + add_msg = '' + msg = with_source( + 'Invalid requirement: {!r}'.format(req_as_string) + ) + if add_msg: + msg += '\nHint: {}'.format(add_msg) + raise InstallationError(msg) + else: + req = None + + return RequirementParts(req, link, markers, extras) + + +def install_req_from_line( + name, # type: str + comes_from=None, # type: Optional[Union[str, InstallRequirement]] + use_pep517=None, # type: Optional[bool] + isolated=False, # type: bool + options=None, # type: Optional[Dict[str, Any]] + wheel_cache=None, # type: Optional[WheelCache] + constraint=False, # type: bool + line_source=None, # type: Optional[str] +): + # type: (...) -> InstallRequirement + """Creates an InstallRequirement from a name, which might be a + requirement, directory containing 'setup.py', filename, or URL. + + :param line_source: An optional string describing where the line is from, + for logging purposes in case of an error. + """ + parts = parse_req_from_line(name, line_source) + + return InstallRequirement( + parts.requirement, comes_from, link=parts.link, markers=parts.markers, + use_pep517=use_pep517, isolated=isolated, + options=options if options else {}, + wheel_cache=wheel_cache, + constraint=constraint, + extras=parts.extras, + ) + + +def install_req_from_req_string( + req_string, # type: str + comes_from=None, # type: Optional[InstallRequirement] + isolated=False, # type: bool + wheel_cache=None, # type: Optional[WheelCache] + use_pep517=None # type: Optional[bool] +): + # type: (...) -> InstallRequirement + try: + req = Requirement(req_string) + except InvalidRequirement: + raise InstallationError("Invalid requirement: '%s'" % req_string) + + domains_not_allowed = [ + PyPI.file_storage_domain, + TestPyPI.file_storage_domain, + ] + if (req.url and comes_from and comes_from.link and + comes_from.link.netloc in domains_not_allowed): + # Explicitly disallow pypi packages that depend on external urls + raise InstallationError( + "Packages installed from PyPI cannot depend on packages " + "which are not also hosted on PyPI.\n" + "%s depends on %s " % (comes_from.name, req) + ) + + return InstallRequirement( + req, comes_from, isolated=isolated, wheel_cache=wheel_cache, + use_pep517=use_pep517 + ) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/req/constructors.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/req/constructors.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f4afc3fd494aedba4eebf1fb7c967fc5556e35dc GIT binary patch literal 13459 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 M*Dv$`%%Uy*A67%DiU0rr literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/req/req_file 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/req/req_file 2.py new file mode 100644 index 0000000..8c78104 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/req/req_file 2.py @@ -0,0 +1,546 @@ +""" +Requirements file parsing +""" + +# The following comment should be removed at some point in the future. +# mypy: strict-optional=False + +from __future__ import absolute_import + +import optparse +import os +import re +import shlex +import sys + +from pip._vendor.six.moves import filterfalse +from pip._vendor.six.moves.urllib import parse as urllib_parse + +from pip._internal.cli import cmdoptions +from pip._internal.exceptions import ( + InstallationError, + RequirementsFileParseError, +) +from pip._internal.models.search_scope import SearchScope +from pip._internal.req.constructors import ( + install_req_from_editable, + install_req_from_line, +) +from pip._internal.utils.encoding import auto_decode +from pip._internal.utils.typing import MYPY_CHECK_RUNNING +from pip._internal.utils.urls import get_url_scheme + +if MYPY_CHECK_RUNNING: + from optparse import Values + from typing import ( + Any, Callable, Iterator, List, NoReturn, Optional, Text, Tuple, + ) + + from pip._internal.req import InstallRequirement + from pip._internal.cache import WheelCache + from pip._internal.index.package_finder import PackageFinder + from pip._internal.network.session import PipSession + + ReqFileLines = Iterator[Tuple[int, Text]] + + LineParser = Callable[[Text], Tuple[str, Values]] + + +__all__ = ['parse_requirements'] + +SCHEME_RE = re.compile(r'^(http|https|file):', re.I) +COMMENT_RE = re.compile(r'(^|\s+)#.*$') + +# Matches environment variable-style values in '${MY_VARIABLE_1}' with the +# variable name consisting of only uppercase letters, digits or the '_' +# (underscore). This follows the POSIX standard defined in IEEE Std 1003.1, +# 2013 Edition. +ENV_VAR_RE = re.compile(r'(?P\$\{(?P[A-Z0-9_]+)\})') + +SUPPORTED_OPTIONS = [ + cmdoptions.index_url, + cmdoptions.extra_index_url, + cmdoptions.no_index, + cmdoptions.constraints, + cmdoptions.requirements, + cmdoptions.editable, + cmdoptions.find_links, + cmdoptions.no_binary, + cmdoptions.only_binary, + cmdoptions.require_hashes, + cmdoptions.pre, + cmdoptions.trusted_host, + cmdoptions.always_unzip, # Deprecated +] # type: List[Callable[..., optparse.Option]] + +# options to be passed to requirements +SUPPORTED_OPTIONS_REQ = [ + cmdoptions.install_options, + cmdoptions.global_options, + cmdoptions.hash, +] # type: List[Callable[..., optparse.Option]] + +# the 'dest' string values +SUPPORTED_OPTIONS_REQ_DEST = [str(o().dest) for o in SUPPORTED_OPTIONS_REQ] + + +class ParsedLine(object): + def __init__( + self, + filename, # type: str + lineno, # type: int + comes_from, # type: str + args, # type: str + opts, # type: Values + constraint, # type: bool + ): + # type: (...) -> None + self.filename = filename + self.lineno = lineno + self.comes_from = comes_from + self.args = args + self.opts = opts + self.constraint = constraint + + +def parse_requirements( + filename, # type: str + session, # type: PipSession + finder=None, # type: Optional[PackageFinder] + comes_from=None, # type: Optional[str] + options=None, # type: Optional[optparse.Values] + constraint=False, # type: bool + wheel_cache=None, # type: Optional[WheelCache] + use_pep517=None # type: Optional[bool] +): + # type: (...) -> Iterator[InstallRequirement] + """Parse a requirements file and yield InstallRequirement instances. + + :param filename: Path or url of requirements file. + :param session: PipSession instance. + :param finder: Instance of pip.index.PackageFinder. + :param comes_from: Origin description of requirements. + :param options: cli options. + :param constraint: If true, parsing a constraint file rather than + requirements file. + :param wheel_cache: Instance of pip.wheel.WheelCache + :param use_pep517: Value of the --use-pep517 option. + """ + skip_requirements_regex = ( + options.skip_requirements_regex if options else None + ) + line_parser = get_line_parser(finder) + parser = RequirementsFileParser( + session, line_parser, comes_from, skip_requirements_regex + ) + + for parsed_line in parser.parse(filename, constraint): + req = handle_line( + parsed_line, finder, options, session, wheel_cache, use_pep517 + ) + if req is not None: + yield req + + +def preprocess(content, skip_requirements_regex): + # type: (Text, Optional[str]) -> ReqFileLines + """Split, filter, and join lines, and return a line iterator + + :param content: the content of the requirements file + :param options: cli options + """ + lines_enum = enumerate(content.splitlines(), start=1) # type: ReqFileLines + lines_enum = join_lines(lines_enum) + lines_enum = ignore_comments(lines_enum) + if skip_requirements_regex: + lines_enum = skip_regex(lines_enum, skip_requirements_regex) + lines_enum = expand_env_variables(lines_enum) + return lines_enum + + +def handle_line( + line, # type: ParsedLine + finder=None, # type: Optional[PackageFinder] + options=None, # type: Optional[optparse.Values] + session=None, # type: Optional[PipSession] + wheel_cache=None, # type: Optional[WheelCache] + use_pep517=None, # type: Optional[bool] +): + # type: (...) -> Optional[InstallRequirement] + """Handle a single parsed requirements line; This can result in + creating/yielding requirements, or updating the finder. + + For lines that contain requirements, the only options that have an effect + are from SUPPORTED_OPTIONS_REQ, and they are scoped to the + requirement. Other options from SUPPORTED_OPTIONS may be present, but are + ignored. + + For lines that do not contain requirements, the only options that have an + effect are from SUPPORTED_OPTIONS. Options from SUPPORTED_OPTIONS_REQ may + be present, but are ignored. These lines may contain multiple options + (although our docs imply only one is supported), and all our parsed and + affect the finder. + """ + + # preserve for the nested code path + line_comes_from = '%s %s (line %s)' % ( + '-c' if line.constraint else '-r', line.filename, line.lineno, + ) + + # return a line requirement + if line.args: + isolated = options.isolated_mode if options else False + if options: + cmdoptions.check_install_build_global(options, line.opts) + # get the options that apply to requirements + req_options = {} + for dest in SUPPORTED_OPTIONS_REQ_DEST: + if dest in line.opts.__dict__ and line.opts.__dict__[dest]: + req_options[dest] = line.opts.__dict__[dest] + line_source = 'line {} of {}'.format(line.lineno, line.filename) + return install_req_from_line( + line.args, + comes_from=line_comes_from, + use_pep517=use_pep517, + isolated=isolated, + options=req_options, + wheel_cache=wheel_cache, + constraint=line.constraint, + line_source=line_source, + ) + + # return an editable requirement + elif line.opts.editables: + isolated = options.isolated_mode if options else False + return install_req_from_editable( + line.opts.editables[0], comes_from=line_comes_from, + use_pep517=use_pep517, + constraint=line.constraint, isolated=isolated, + wheel_cache=wheel_cache + ) + + # percolate hash-checking option upward + elif line.opts.require_hashes: + options.require_hashes = line.opts.require_hashes + + # set finder options + elif finder: + find_links = finder.find_links + index_urls = finder.index_urls + if line.opts.index_url: + index_urls = [line.opts.index_url] + if line.opts.no_index is True: + index_urls = [] + if line.opts.extra_index_urls: + index_urls.extend(line.opts.extra_index_urls) + if line.opts.find_links: + # FIXME: it would be nice to keep track of the source + # of the find_links: support a find-links local path + # relative to a requirements file. + value = line.opts.find_links[0] + req_dir = os.path.dirname(os.path.abspath(line.filename)) + relative_to_reqs_file = os.path.join(req_dir, value) + if os.path.exists(relative_to_reqs_file): + value = relative_to_reqs_file + find_links.append(value) + + search_scope = SearchScope( + find_links=find_links, + index_urls=index_urls, + ) + finder.search_scope = search_scope + + if line.opts.pre: + finder.set_allow_all_prereleases() + + if session: + for host in line.opts.trusted_hosts or []: + source = 'line {} of {}'.format(line.lineno, line.filename) + session.add_trusted_host(host, source=source) + + return None + + +class RequirementsFileParser(object): + def __init__( + self, + session, # type: PipSession + line_parser, # type: LineParser + comes_from, # type: str + skip_requirements_regex, # type: Optional[str] + ): + # type: (...) -> None + self._session = session + self._line_parser = line_parser + self._comes_from = comes_from + self._skip_requirements_regex = skip_requirements_regex + + def parse(self, filename, constraint): + # type: (str, bool) -> Iterator[ParsedLine] + """Parse a given file, yielding parsed lines. + """ + for line in self._parse_and_recurse(filename, constraint): + yield line + + def _parse_and_recurse(self, filename, constraint): + # type: (str, bool) -> Iterator[ParsedLine] + for line in self._parse_file(filename, constraint): + if ( + not line.args and + not line.opts.editables and + (line.opts.requirements or line.opts.constraints) + ): + # parse a nested requirements file + if line.opts.requirements: + req_path = line.opts.requirements[0] + nested_constraint = False + else: + req_path = line.opts.constraints[0] + nested_constraint = True + + # original file is over http + if SCHEME_RE.search(filename): + # do a url join so relative paths work + req_path = urllib_parse.urljoin(filename, req_path) + # original file and nested file are paths + elif not SCHEME_RE.search(req_path): + # do a join so relative paths work + req_path = os.path.join( + os.path.dirname(filename), req_path, + ) + + for inner_line in self._parse_and_recurse( + req_path, nested_constraint, + ): + yield inner_line + else: + yield line + + def _parse_file(self, filename, constraint): + # type: (str, bool) -> Iterator[ParsedLine] + _, content = get_file_content( + filename, self._session, comes_from=self._comes_from + ) + + lines_enum = preprocess(content, self._skip_requirements_regex) + + for line_number, line in lines_enum: + try: + args_str, opts = self._line_parser(line) + except OptionParsingError as e: + # add offending line + msg = 'Invalid requirement: %s\n%s' % (line, e.msg) + raise RequirementsFileParseError(msg) + + yield ParsedLine( + filename, + line_number, + self._comes_from, + args_str, + opts, + constraint, + ) + + +def get_line_parser(finder): + # type: (Optional[PackageFinder]) -> LineParser + def parse_line(line): + # type: (Text) -> Tuple[str, Values] + # Build new parser for each line since it accumulates appendable + # options. + parser = build_parser() + defaults = parser.get_default_values() + defaults.index_url = None + if finder: + defaults.format_control = finder.format_control + + args_str, options_str = break_args_options(line) + # Prior to 2.7.3, shlex cannot deal with unicode entries + if sys.version_info < (2, 7, 3): + # https://github.com/python/mypy/issues/1174 + options_str = options_str.encode('utf8') # type: ignore + + # https://github.com/python/mypy/issues/1174 + opts, _ = parser.parse_args( + shlex.split(options_str), defaults) # type: ignore + + return args_str, opts + + return parse_line + + +def break_args_options(line): + # type: (Text) -> Tuple[str, Text] + """Break up the line into an args and options string. We only want to shlex + (and then optparse) the options, not the args. args can contain markers + which are corrupted by shlex. + """ + tokens = line.split(' ') + args = [] + options = tokens[:] + for token in tokens: + if token.startswith('-') or token.startswith('--'): + break + else: + args.append(token) + options.pop(0) + return ' '.join(args), ' '.join(options) # type: ignore + + +class OptionParsingError(Exception): + def __init__(self, msg): + # type: (str) -> None + self.msg = msg + + +def build_parser(): + # type: () -> optparse.OptionParser + """ + Return a parser for parsing requirement lines + """ + parser = optparse.OptionParser(add_help_option=False) + + option_factories = SUPPORTED_OPTIONS + SUPPORTED_OPTIONS_REQ + for option_factory in option_factories: + option = option_factory() + parser.add_option(option) + + # By default optparse sys.exits on parsing errors. We want to wrap + # that in our own exception. + def parser_exit(self, msg): + # type: (Any, str) -> NoReturn + raise OptionParsingError(msg) + # NOTE: mypy disallows assigning to a method + # https://github.com/python/mypy/issues/2427 + parser.exit = parser_exit # type: ignore + + return parser + + +def join_lines(lines_enum): + # type: (ReqFileLines) -> ReqFileLines + """Joins a line ending in '\' with the previous line (except when following + comments). The joined line takes on the index of the first line. + """ + primary_line_number = None + new_line = [] # type: List[Text] + for line_number, line in lines_enum: + if not line.endswith('\\') or COMMENT_RE.match(line): + if COMMENT_RE.match(line): + # this ensures comments are always matched later + line = ' ' + line + if new_line: + new_line.append(line) + yield primary_line_number, ''.join(new_line) + new_line = [] + else: + yield line_number, line + else: + if not new_line: + primary_line_number = line_number + new_line.append(line.strip('\\')) + + # last line contains \ + if new_line: + yield primary_line_number, ''.join(new_line) + + # TODO: handle space after '\'. + + +def ignore_comments(lines_enum): + # type: (ReqFileLines) -> ReqFileLines + """ + Strips comments and filter empty lines. + """ + for line_number, line in lines_enum: + line = COMMENT_RE.sub('', line) + line = line.strip() + if line: + yield line_number, line + + +def skip_regex(lines_enum, pattern): + # type: (ReqFileLines, str) -> ReqFileLines + """ + Skip lines that match the provided pattern + + Note: the regex pattern is only built once + """ + matcher = re.compile(pattern) + lines_enum = filterfalse(lambda e: matcher.search(e[1]), lines_enum) + return lines_enum + + +def expand_env_variables(lines_enum): + # type: (ReqFileLines) -> ReqFileLines + """Replace all environment variables that can be retrieved via `os.getenv`. + + The only allowed format for environment variables defined in the + requirement file is `${MY_VARIABLE_1}` to ensure two things: + + 1. Strings that contain a `$` aren't accidentally (partially) expanded. + 2. Ensure consistency across platforms for requirement files. + + These points are the result of a discussion on the `github pull + request #3514 `_. + + Valid characters in variable names follow the `POSIX standard + `_ and are limited + to uppercase letter, digits and the `_` (underscore). + """ + for line_number, line in lines_enum: + for env_var, var_name in ENV_VAR_RE.findall(line): + value = os.getenv(var_name) + if not value: + continue + + line = line.replace(env_var, value) + + yield line_number, line + + +def get_file_content(url, session, comes_from=None): + # type: (str, PipSession, Optional[str]) -> Tuple[str, Text] + """Gets the content of a file; it may be a filename, file: URL, or + http: URL. Returns (location, content). Content is unicode. + Respects # -*- coding: declarations on the retrieved files. + + :param url: File path or url. + :param session: PipSession instance. + :param comes_from: Origin description of requirements. + """ + scheme = get_url_scheme(url) + + if scheme in ['http', 'https']: + # FIXME: catch some errors + resp = session.get(url) + resp.raise_for_status() + return resp.url, resp.text + + elif scheme == 'file': + if comes_from and comes_from.startswith('http'): + raise InstallationError( + 'Requirements file %s references URL %s, which is local' + % (comes_from, url)) + + path = url.split(':', 1)[1] + path = path.replace('\\', '/') + match = _url_slash_drive_re.match(path) + if match: + path = match.group(1) + ':' + path.split('|', 1)[1] + path = urllib_parse.unquote(path) + if path.startswith('/'): + path = '/' + path.lstrip('/') + url = path + + try: + with open(url, 'rb') as f: + content = auto_decode(f.read()) + except IOError as exc: + raise InstallationError( + 'Could not open requirements file: %s' % str(exc) + ) + return url, content + + +_url_slash_drive_re = re.compile(r'/*([a-z])\|', re.I) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/req/req_file 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/req/req_file 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4aa2aac21b89aa7e0bb32c31ed0573b694003a3f GIT binary patch literal 16636 zcmd5@No*bWdH?1;ZjT~Gin1ut+D4m2%3Q3-jw9KTsfDsBOB6knCF@!8XgD(@A31N) z%sh#-$p(nrBn^rNNiRWKpgU4DMNtGrmqUP}w_JMcA%`AvEqW*nw8!@M`~EY0q@)II z4`xa6um8S&`}a-pi{9>^|NYlL@g@7|#s8C&B8gWN2}H_BEeQ$|SyC-XxgZwHMTv@1 zE@~U{ZBlN_^X*b@&+{Ep?#T0l4wAxd!@YBluHu5B-MRV-Y3;TDG!?3Zi)6w^?;NQnDQ=( zhNSwklwUUG9*GW0^^lYgi50#q@lW-1y*yp@u#^v*Ub`haBGsc(J}OmP%C=OGN%@#m zk4yQuR8L6xgj7#T`J_}&N%@piUy<@FW@Mj4r=>b9+TH10}!o%9a*78@RhPT?w#_~A{ z+hzH630~678}bxS_tm^|pFBmMH}m447QZIpZdpFB=><*S()4Xjzpm*;P2bUUQqxPC zUe@%ArdKtclEq#rU(@`%n!cy$v@8N{uFIlGcwMeOz{|WZArA7sJQZ2K!L58!kVjsj zd{ct`63)m1!0mv1F6?lxe2cJW{)Hdp`62lnkmgA6GW(V1^7_1Ia8N!6Sl*W4P(I_~ z%^5$G;D`>pBf(M4+?4>={E@DFY_s1z365)XS%MRq`B;LJnz=8*Da|~P;1$h$qFXpE zpW~w4{Gx|7V;a8mD*x=1v zGmhNEU&7^?`VQ3J@uFs!40j=$f|SXn+FHuO6`quvVPP8g<)t`q8wxinNvgFobtg=l zaZL-i^tQZ6yW9>})0DS*yV;1gY%sgQEmvkX!W+N46o%0i58E?!q_DG|zv3;1*DAFj zj9Xo2D~-7@N$?CQkF8I~Yup5kWG|{e8D2`$#yXQ^oscqeA>q{xf3ki*d3EH(_?eT* z36|fPefzN&U%Y?v{%6eBylQyy<4a@Z*T&Af4_+O)zcG?>gZi++4LpO7lKv3bE>8k9 z2_7L(3OFbV*adOsbi;lpn)pXBx-yBr7m!)EWL?BXrl1)Vi<&{PO*1IAYX-#*&4617 zP=RaC4D;#q-gz+YIAslCq*mA6`t@psDgwcXS zG;V&2vwdUc=8~ZQ}MsqtY155Mb=m)v09mLssdZi!Ft5&5I`Rr2KPv#_@)M zOBcPZiG(_OOi-(fbli>(2P)Yj-x~C44V7$58{w++{Ir) zpy;rC;uztb|NE1u{}wU;gt(9CvPexuh>b2u0U!lZ|BVvym2gy2*y)m|ZL-lVtJAXH zEz1f-fFLlms}J6gja>qKT;HYehBgcXP<6`F4%z6D^&ScwDfJ3Hn@dDnBZ1i zS*+CTAWZzYqQvgmt!^8eaSyYyA64wEVp}I4{KeoP`b{s`Y1|A)bB2biZnc|>1`%Eg zV>?~)YI-BQyXT%`+X_!eRb8KC^}=)K*T(S{;oW-6%_MXiVdIUnZ(?i8BzRmbZ;y?k zZOpV~r!q@sRB1n8H(9APwozmh7QqzAKW6H+P&qVN5-FCe1Uya$(dcZU;+xzwc8Dh_ zi8oFj0Fjj$5@VEFr6gb(SSTGdudeh<+p@b?3Z~O+xfZ1mtkW3!@5x&XA=^ST_3W#i_)wC<1JD6a#P+Fmx&OZbA{lk0xI}FzG=WaoC9KAlk|Iv6F-Xq;wvz zdhpv}4IuT25tOp}@uwj59{@6d5kX2M9w0oCYpGZRAY*+&7K$>sq2kPPQQ|fWfD=y= ze88~K8xOP5$znV&K;&i3b0oMMG-?1FgnV$p)psQ=fw8?qHb@4jU6#9Lr9sQE2g0=Ju`chv737tkoYh1Q3F(b!SivK**tp%z`D{U@z1SA-0s$nR z1&LsJFz>87F&`ou+%NG`VKdL;Z1hUHUzQKZ@=%_6S$pGZ_20(sy#Ao9<1TuYl=S75 zhh)8vJ>!oG$Y3@uwo8@|Yfnp|AUz^MFKYvg?*RcTZ1l@I{#oK4&9`Pt{Cj#Q$4KFH z&w#lv3ajtsJ&sG`Zwff`)dy!~V~@NT76vF@EuWBebikDlkV;yQ{ansfDwq~iyh!?%#;ar+i( z4X8&;eAa4JuHQ zq4;wLFm`D@1w6_ry6JEgmKt-bUZa6&95QWiHV`W{NWmBctW^mXNS9KIOdyj3gz8V2 zx~PrADD)s(>%BuiN$}L}684hlroA9=x7IqZV3J`926{LGfb%L!20G3#ry!!>L*P>o zX(?LH*Ey81gZp$d2~MYi;*~lVIYH}cX<~Xz1D0L_N8nP_e1>ga~tr2dx7T;Y+B=e@j+p zTMzmatwGfFX=$L?p%#!HNM-}b^`Nb%t=~F^ek}K6HuNZzpbGRNKZIEi7aShl=feD< z9DI2aTOk%dW66S4_c?4^kcA4Gf!I^jOgoKSyiT7F!9T*ON`ssn+!&IM z#(L$Gc<~PSzdwmqqSC4nXUt_n%c41Fmux_)F49i3cdL=+9Qx1F`fPjlB4EF!MuSmf znxQC>@dTnAtTCkj{K+iiR2|JdyHr}@&~MTr&K;RsRJ)+f;>SpK^a2THgS(z}n zw9!U2Wuskc5Rmf$Ko@Q3WCH+t8A7}YzVVL*43O#u5Ti|{UT8h%@;<1sB>4pi^m4B( zLrOLo2%S2-H3TO+tuibmUZ~@ll@DM6Ev18C@vm|hpwR*mA{p;&M!B$xt4d?D_g322 zvh%)&p2{UMmS*%@;vU46%wCl^S5S6tuqzqd9NZ2!ryv*_Ca&y7=Ky1mD)VL`rP8P% zhjMOl{4A3>CLb_?EG}w|ei6heZ6J+TPDha&U`%e*+Lg)|m0B%~m2B)NjPfjp38N>G zk-|`+8zlWevB&BMDekvAihYHBg}y?`I#?u$?kOk?ljM;qC=CA{GPKed?HMMTT#bHO zu|uWX*x*LF*M#?9QRF2YLv^XJ?x0x(3!Q`TTA0w2L z;(@pshaA_eCX0^Jey%#q3w;KfQoM?|4*f9BTS!`>Doii)VXX8`p^aV>7Z7iRMh*)d zJjl)xza?zo9Rik(j1-F2k>WsMFC>B?s}KM8qlUj7nyPKfIf0H2;ZXe_YE4yKb2wKE zOEmZ8Tbxu9>EemHupLM$y`|35ai7;sqQ$@BBw8s|ejDyvMTBp`Q~?;wJrpzAJ?8*> z+5P+Ij>meMcQlqx*en4+w44;>JCHKZF{Qf%HK4{A0wlpGgCqvS)Di_V%?kQ25Zhpn zg0TR7fPWZ*U4Y1Ev|a0o3Bm*^+qup;sgo?I+M?JL*CQP>4+F!BtAL$L*W5y~ zmgpLf;lP7m6>7*r-6#dHFQ7*LlYXeY!pHIy2W5Oc65dwLxto4B67OU{}nW8 z)dB1oeGvpYk8|K;hUK!WVdOi`fsbP=-{y62Pf}2-{S1$7J=YGAG<}nA<(ou|0k=wM zBJ}B%-$MphNhG)E^m_{V4>j<@w8?&uhSigX8XQsz!FE-hFajJ>QQ1;FSEGO-7<@jJ z3Nt6*n^;0|$pi}7o>4(#8;nV_<FkWmHF)7%o_smcpo!8G?M?cm6jwi3gzF3}*o3 zfXYBReHL;En1)gxLvF`qH)Vl_fxEEIr9aBw2S7w=K$&Jvx|AQ^Qp58swfb09E{#Nc z&UC3ZujguMr&kI@E1jW%Dr#_PLwJ-^^Ab&~yWsf<^Qu6vqWG|_a!m=8sd9b`tt}AW z0gCh~Ht?IgJ#Jpw2UNQ%S$o<_?WKZ`28DI9LVpsyeu)ft(PapVBf!uMcZ+|xy@=38WqkWH`40}u?rq6J=>W7WgMqmWYMs-?%F-9>l_i&GZVZwi* zE_|>;W!9;;5+?9R=!|O9&OP%Bl{iVYli`&K-{ijYZKR~%2w@|@tGudEk4-9zRCv8| z>*md=ncFlckYvI1?i=2zJk!XWkOmqCh*gK9a)4m8su!;rlcCY&bnaUCMC+W#T$0Ro zM`8D?*uWnXc5P&&oyOU{)=?;Ly~y=iFTp;r8)n*)^)kdwpZ7+Zy$Q=VQCPiZ;P;}! zFC;mHYUHGx5C^><0IKpC$+qTWX!YQ*aKaN9A9V`;-31(HwE8Tj)%Tv`&B8aC1vaP* zW#J; ze(Y%Ut7tQ~n&;FYr`tn#Eh=|Fwp0XtJMyaYfp_truv-Nw1sz;D-9WlYKx2a*96b)} zjpc?kB)dz4(rkBrAIT2zq_1Jwf5Zlo4rHXW4{jEHD;7z{{7JM?B3X?L_69BNh3b_7 zobrpS56-tZ(^gId^Byb-$#sF~)nXQEUNA^ck!(AfZwcf432x2_8xWJdsbr8ryc%qGqekpJ-HXE*P;cP=^8moDF!a?fr&q^bwysEKHU^a_oklEy?*sV|6A{6OJ`6D|tuQ-cn>eiy(FOE}d}Z98 zGRx4g3>Rux^AY6W$Mqz!ad#(yxnL<(dMN<4zo|3d*kfu_S+i9eqmz5bQ=dgOf=RSo{5^qmy+-%V#FSvmr(yjD5I~ zZG2Fmv48=BX?ZtBU$-B+5AES5qx|8Lj>8f25;Mx*RU(+0xkF%}L_nNp3<2Iwod_zI z8mQDZgsu_5jpcJY_tEw&98U=kfL;T|9e62sRwy`+4g7+{V>dFgXRmb#-d%_Wg+b#O zAj={lxiX19pzkCXWJ2KmzdNug%5_vpSx~$0vlB&B|6mV6bg?LFL38iYZJBI8#$p*LKyZX*!;7cwS=H{P6I8U`}{Ec!R@ys{|i?$h#qcnMj^FE+_?iO3U6tP%C4DNK8!) zu}_0y!Sp|LZZM`x5uO;XHITE7zRaMUy070Gjpj2`3cq5!BNPytwF>RC249>oX&`zl zu}|1zXT~ssa{mQ{tosq@fPT%ClbaS@r@tkqTUl&ATy!RGo#gNu+9{Ic0s3aCtmpqK z79TV#bKGP0|7keADy+O3mHL$mYL#xAlC-lWV%%^K1T)3q0wP!V)d8;Wjbt8DpF}O1+5>8yH_kBDj_0gM{L4=)^K6hM#aZe~x7M zCFW@ER(Tk-NxfV6*akuM;2W@hdnqDmis*s6*7KyWr8|%_#i5|D#zW^%IRh0N^W|2A z$Ranu2R9+S^Um+Ekz$3?Wv9v_Nn^A2s0o2msUl*k_^kqG~0FoW^*;qC`|HCV z%6eC>ix|AkPl^_r`1XyT6mcErdrZ`&{fEqblgY0kQNs+sHE|J-5!B=Hq_R3*tv`mV zh8LF}Lh{1qapO2QzB+weO8MF~|2}FQaqTALjd3vBn~XZo?-va`5m3@&&vj$`T$GG& z4F@wpVvGjZJ|kouNFDV5H)$g>k#8m>q_t}k) zkcV9wTcI%}n&8WA0euXVbbi1=JW}2H1gSH{G6_z7ei^Jxzmzjh%`0qXh@uGv7-5c- z#yQOdOy2~eOsO3UfUgE{hjv0o*#wn;hbo#wQOhBnaQ+%ei&|;!%hwx?25i1iyhxUi zd>2VaJ4sgdi+GWK{0$1OotFNOEHlr8+_Nb+)r|nd6aL|MZ gFzq>78pumM-rxtNgQbDNj?#hBkx~zS5A}@x7gtZb`~Uy| literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/req/req_file.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/req/req_file.py new file mode 100644 index 0000000..8c78104 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/req/req_file.py @@ -0,0 +1,546 @@ +""" +Requirements file parsing +""" + +# The following comment should be removed at some point in the future. +# mypy: strict-optional=False + +from __future__ import absolute_import + +import optparse +import os +import re +import shlex +import sys + +from pip._vendor.six.moves import filterfalse +from pip._vendor.six.moves.urllib import parse as urllib_parse + +from pip._internal.cli import cmdoptions +from pip._internal.exceptions import ( + InstallationError, + RequirementsFileParseError, +) +from pip._internal.models.search_scope import SearchScope +from pip._internal.req.constructors import ( + install_req_from_editable, + install_req_from_line, +) +from pip._internal.utils.encoding import auto_decode +from pip._internal.utils.typing import MYPY_CHECK_RUNNING +from pip._internal.utils.urls import get_url_scheme + +if MYPY_CHECK_RUNNING: + from optparse import Values + from typing import ( + Any, Callable, Iterator, List, NoReturn, Optional, Text, Tuple, + ) + + from pip._internal.req import InstallRequirement + from pip._internal.cache import WheelCache + from pip._internal.index.package_finder import PackageFinder + from pip._internal.network.session import PipSession + + ReqFileLines = Iterator[Tuple[int, Text]] + + LineParser = Callable[[Text], Tuple[str, Values]] + + +__all__ = ['parse_requirements'] + +SCHEME_RE = re.compile(r'^(http|https|file):', re.I) +COMMENT_RE = re.compile(r'(^|\s+)#.*$') + +# Matches environment variable-style values in '${MY_VARIABLE_1}' with the +# variable name consisting of only uppercase letters, digits or the '_' +# (underscore). This follows the POSIX standard defined in IEEE Std 1003.1, +# 2013 Edition. +ENV_VAR_RE = re.compile(r'(?P\$\{(?P[A-Z0-9_]+)\})') + +SUPPORTED_OPTIONS = [ + cmdoptions.index_url, + cmdoptions.extra_index_url, + cmdoptions.no_index, + cmdoptions.constraints, + cmdoptions.requirements, + cmdoptions.editable, + cmdoptions.find_links, + cmdoptions.no_binary, + cmdoptions.only_binary, + cmdoptions.require_hashes, + cmdoptions.pre, + cmdoptions.trusted_host, + cmdoptions.always_unzip, # Deprecated +] # type: List[Callable[..., optparse.Option]] + +# options to be passed to requirements +SUPPORTED_OPTIONS_REQ = [ + cmdoptions.install_options, + cmdoptions.global_options, + cmdoptions.hash, +] # type: List[Callable[..., optparse.Option]] + +# the 'dest' string values +SUPPORTED_OPTIONS_REQ_DEST = [str(o().dest) for o in SUPPORTED_OPTIONS_REQ] + + +class ParsedLine(object): + def __init__( + self, + filename, # type: str + lineno, # type: int + comes_from, # type: str + args, # type: str + opts, # type: Values + constraint, # type: bool + ): + # type: (...) -> None + self.filename = filename + self.lineno = lineno + self.comes_from = comes_from + self.args = args + self.opts = opts + self.constraint = constraint + + +def parse_requirements( + filename, # type: str + session, # type: PipSession + finder=None, # type: Optional[PackageFinder] + comes_from=None, # type: Optional[str] + options=None, # type: Optional[optparse.Values] + constraint=False, # type: bool + wheel_cache=None, # type: Optional[WheelCache] + use_pep517=None # type: Optional[bool] +): + # type: (...) -> Iterator[InstallRequirement] + """Parse a requirements file and yield InstallRequirement instances. + + :param filename: Path or url of requirements file. + :param session: PipSession instance. + :param finder: Instance of pip.index.PackageFinder. + :param comes_from: Origin description of requirements. + :param options: cli options. + :param constraint: If true, parsing a constraint file rather than + requirements file. + :param wheel_cache: Instance of pip.wheel.WheelCache + :param use_pep517: Value of the --use-pep517 option. + """ + skip_requirements_regex = ( + options.skip_requirements_regex if options else None + ) + line_parser = get_line_parser(finder) + parser = RequirementsFileParser( + session, line_parser, comes_from, skip_requirements_regex + ) + + for parsed_line in parser.parse(filename, constraint): + req = handle_line( + parsed_line, finder, options, session, wheel_cache, use_pep517 + ) + if req is not None: + yield req + + +def preprocess(content, skip_requirements_regex): + # type: (Text, Optional[str]) -> ReqFileLines + """Split, filter, and join lines, and return a line iterator + + :param content: the content of the requirements file + :param options: cli options + """ + lines_enum = enumerate(content.splitlines(), start=1) # type: ReqFileLines + lines_enum = join_lines(lines_enum) + lines_enum = ignore_comments(lines_enum) + if skip_requirements_regex: + lines_enum = skip_regex(lines_enum, skip_requirements_regex) + lines_enum = expand_env_variables(lines_enum) + return lines_enum + + +def handle_line( + line, # type: ParsedLine + finder=None, # type: Optional[PackageFinder] + options=None, # type: Optional[optparse.Values] + session=None, # type: Optional[PipSession] + wheel_cache=None, # type: Optional[WheelCache] + use_pep517=None, # type: Optional[bool] +): + # type: (...) -> Optional[InstallRequirement] + """Handle a single parsed requirements line; This can result in + creating/yielding requirements, or updating the finder. + + For lines that contain requirements, the only options that have an effect + are from SUPPORTED_OPTIONS_REQ, and they are scoped to the + requirement. Other options from SUPPORTED_OPTIONS may be present, but are + ignored. + + For lines that do not contain requirements, the only options that have an + effect are from SUPPORTED_OPTIONS. Options from SUPPORTED_OPTIONS_REQ may + be present, but are ignored. These lines may contain multiple options + (although our docs imply only one is supported), and all our parsed and + affect the finder. + """ + + # preserve for the nested code path + line_comes_from = '%s %s (line %s)' % ( + '-c' if line.constraint else '-r', line.filename, line.lineno, + ) + + # return a line requirement + if line.args: + isolated = options.isolated_mode if options else False + if options: + cmdoptions.check_install_build_global(options, line.opts) + # get the options that apply to requirements + req_options = {} + for dest in SUPPORTED_OPTIONS_REQ_DEST: + if dest in line.opts.__dict__ and line.opts.__dict__[dest]: + req_options[dest] = line.opts.__dict__[dest] + line_source = 'line {} of {}'.format(line.lineno, line.filename) + return install_req_from_line( + line.args, + comes_from=line_comes_from, + use_pep517=use_pep517, + isolated=isolated, + options=req_options, + wheel_cache=wheel_cache, + constraint=line.constraint, + line_source=line_source, + ) + + # return an editable requirement + elif line.opts.editables: + isolated = options.isolated_mode if options else False + return install_req_from_editable( + line.opts.editables[0], comes_from=line_comes_from, + use_pep517=use_pep517, + constraint=line.constraint, isolated=isolated, + wheel_cache=wheel_cache + ) + + # percolate hash-checking option upward + elif line.opts.require_hashes: + options.require_hashes = line.opts.require_hashes + + # set finder options + elif finder: + find_links = finder.find_links + index_urls = finder.index_urls + if line.opts.index_url: + index_urls = [line.opts.index_url] + if line.opts.no_index is True: + index_urls = [] + if line.opts.extra_index_urls: + index_urls.extend(line.opts.extra_index_urls) + if line.opts.find_links: + # FIXME: it would be nice to keep track of the source + # of the find_links: support a find-links local path + # relative to a requirements file. + value = line.opts.find_links[0] + req_dir = os.path.dirname(os.path.abspath(line.filename)) + relative_to_reqs_file = os.path.join(req_dir, value) + if os.path.exists(relative_to_reqs_file): + value = relative_to_reqs_file + find_links.append(value) + + search_scope = SearchScope( + find_links=find_links, + index_urls=index_urls, + ) + finder.search_scope = search_scope + + if line.opts.pre: + finder.set_allow_all_prereleases() + + if session: + for host in line.opts.trusted_hosts or []: + source = 'line {} of {}'.format(line.lineno, line.filename) + session.add_trusted_host(host, source=source) + + return None + + +class RequirementsFileParser(object): + def __init__( + self, + session, # type: PipSession + line_parser, # type: LineParser + comes_from, # type: str + skip_requirements_regex, # type: Optional[str] + ): + # type: (...) -> None + self._session = session + self._line_parser = line_parser + self._comes_from = comes_from + self._skip_requirements_regex = skip_requirements_regex + + def parse(self, filename, constraint): + # type: (str, bool) -> Iterator[ParsedLine] + """Parse a given file, yielding parsed lines. + """ + for line in self._parse_and_recurse(filename, constraint): + yield line + + def _parse_and_recurse(self, filename, constraint): + # type: (str, bool) -> Iterator[ParsedLine] + for line in self._parse_file(filename, constraint): + if ( + not line.args and + not line.opts.editables and + (line.opts.requirements or line.opts.constraints) + ): + # parse a nested requirements file + if line.opts.requirements: + req_path = line.opts.requirements[0] + nested_constraint = False + else: + req_path = line.opts.constraints[0] + nested_constraint = True + + # original file is over http + if SCHEME_RE.search(filename): + # do a url join so relative paths work + req_path = urllib_parse.urljoin(filename, req_path) + # original file and nested file are paths + elif not SCHEME_RE.search(req_path): + # do a join so relative paths work + req_path = os.path.join( + os.path.dirname(filename), req_path, + ) + + for inner_line in self._parse_and_recurse( + req_path, nested_constraint, + ): + yield inner_line + else: + yield line + + def _parse_file(self, filename, constraint): + # type: (str, bool) -> Iterator[ParsedLine] + _, content = get_file_content( + filename, self._session, comes_from=self._comes_from + ) + + lines_enum = preprocess(content, self._skip_requirements_regex) + + for line_number, line in lines_enum: + try: + args_str, opts = self._line_parser(line) + except OptionParsingError as e: + # add offending line + msg = 'Invalid requirement: %s\n%s' % (line, e.msg) + raise RequirementsFileParseError(msg) + + yield ParsedLine( + filename, + line_number, + self._comes_from, + args_str, + opts, + constraint, + ) + + +def get_line_parser(finder): + # type: (Optional[PackageFinder]) -> LineParser + def parse_line(line): + # type: (Text) -> Tuple[str, Values] + # Build new parser for each line since it accumulates appendable + # options. + parser = build_parser() + defaults = parser.get_default_values() + defaults.index_url = None + if finder: + defaults.format_control = finder.format_control + + args_str, options_str = break_args_options(line) + # Prior to 2.7.3, shlex cannot deal with unicode entries + if sys.version_info < (2, 7, 3): + # https://github.com/python/mypy/issues/1174 + options_str = options_str.encode('utf8') # type: ignore + + # https://github.com/python/mypy/issues/1174 + opts, _ = parser.parse_args( + shlex.split(options_str), defaults) # type: ignore + + return args_str, opts + + return parse_line + + +def break_args_options(line): + # type: (Text) -> Tuple[str, Text] + """Break up the line into an args and options string. We only want to shlex + (and then optparse) the options, not the args. args can contain markers + which are corrupted by shlex. + """ + tokens = line.split(' ') + args = [] + options = tokens[:] + for token in tokens: + if token.startswith('-') or token.startswith('--'): + break + else: + args.append(token) + options.pop(0) + return ' '.join(args), ' '.join(options) # type: ignore + + +class OptionParsingError(Exception): + def __init__(self, msg): + # type: (str) -> None + self.msg = msg + + +def build_parser(): + # type: () -> optparse.OptionParser + """ + Return a parser for parsing requirement lines + """ + parser = optparse.OptionParser(add_help_option=False) + + option_factories = SUPPORTED_OPTIONS + SUPPORTED_OPTIONS_REQ + for option_factory in option_factories: + option = option_factory() + parser.add_option(option) + + # By default optparse sys.exits on parsing errors. We want to wrap + # that in our own exception. + def parser_exit(self, msg): + # type: (Any, str) -> NoReturn + raise OptionParsingError(msg) + # NOTE: mypy disallows assigning to a method + # https://github.com/python/mypy/issues/2427 + parser.exit = parser_exit # type: ignore + + return parser + + +def join_lines(lines_enum): + # type: (ReqFileLines) -> ReqFileLines + """Joins a line ending in '\' with the previous line (except when following + comments). The joined line takes on the index of the first line. + """ + primary_line_number = None + new_line = [] # type: List[Text] + for line_number, line in lines_enum: + if not line.endswith('\\') or COMMENT_RE.match(line): + if COMMENT_RE.match(line): + # this ensures comments are always matched later + line = ' ' + line + if new_line: + new_line.append(line) + yield primary_line_number, ''.join(new_line) + new_line = [] + else: + yield line_number, line + else: + if not new_line: + primary_line_number = line_number + new_line.append(line.strip('\\')) + + # last line contains \ + if new_line: + yield primary_line_number, ''.join(new_line) + + # TODO: handle space after '\'. + + +def ignore_comments(lines_enum): + # type: (ReqFileLines) -> ReqFileLines + """ + Strips comments and filter empty lines. + """ + for line_number, line in lines_enum: + line = COMMENT_RE.sub('', line) + line = line.strip() + if line: + yield line_number, line + + +def skip_regex(lines_enum, pattern): + # type: (ReqFileLines, str) -> ReqFileLines + """ + Skip lines that match the provided pattern + + Note: the regex pattern is only built once + """ + matcher = re.compile(pattern) + lines_enum = filterfalse(lambda e: matcher.search(e[1]), lines_enum) + return lines_enum + + +def expand_env_variables(lines_enum): + # type: (ReqFileLines) -> ReqFileLines + """Replace all environment variables that can be retrieved via `os.getenv`. + + The only allowed format for environment variables defined in the + requirement file is `${MY_VARIABLE_1}` to ensure two things: + + 1. Strings that contain a `$` aren't accidentally (partially) expanded. + 2. Ensure consistency across platforms for requirement files. + + These points are the result of a discussion on the `github pull + request #3514 `_. + + Valid characters in variable names follow the `POSIX standard + `_ and are limited + to uppercase letter, digits and the `_` (underscore). + """ + for line_number, line in lines_enum: + for env_var, var_name in ENV_VAR_RE.findall(line): + value = os.getenv(var_name) + if not value: + continue + + line = line.replace(env_var, value) + + yield line_number, line + + +def get_file_content(url, session, comes_from=None): + # type: (str, PipSession, Optional[str]) -> Tuple[str, Text] + """Gets the content of a file; it may be a filename, file: URL, or + http: URL. Returns (location, content). Content is unicode. + Respects # -*- coding: declarations on the retrieved files. + + :param url: File path or url. + :param session: PipSession instance. + :param comes_from: Origin description of requirements. + """ + scheme = get_url_scheme(url) + + if scheme in ['http', 'https']: + # FIXME: catch some errors + resp = session.get(url) + resp.raise_for_status() + return resp.url, resp.text + + elif scheme == 'file': + if comes_from and comes_from.startswith('http'): + raise InstallationError( + 'Requirements file %s references URL %s, which is local' + % (comes_from, url)) + + path = url.split(':', 1)[1] + path = path.replace('\\', '/') + match = _url_slash_drive_re.match(path) + if match: + path = match.group(1) + ':' + path.split('|', 1)[1] + path = urllib_parse.unquote(path) + if path.startswith('/'): + path = '/' + path.lstrip('/') + url = path + + try: + with open(url, 'rb') as f: + content = auto_decode(f.read()) + except IOError as exc: + raise InstallationError( + 'Could not open requirements file: %s' % str(exc) + ) + return url, content + + +_url_slash_drive_re = re.compile(r'/*([a-z])\|', re.I) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/req/req_file.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/req/req_file.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9dc90215bdcd85ab4e92e6a605c616c7223a7a46 GIT binary patch literal 16636 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 bO!v#DhR Distribution + """Return a pkg_resources.Distribution for the provided + metadata directory. + """ + dist_dir = metadata_directory.rstrip(os.sep) + + # Determine the correct Distribution object type. + if dist_dir.endswith(".egg-info"): + dist_cls = pkg_resources.Distribution + else: + assert dist_dir.endswith(".dist-info") + dist_cls = pkg_resources.DistInfoDistribution + + # Build a PathMetadata object, from path to metadata. :wink: + base_dir, dist_dir_name = os.path.split(dist_dir) + dist_name = os.path.splitext(dist_dir_name)[0] + metadata = pkg_resources.PathMetadata(base_dir, dist_dir) + + return dist_cls( + base_dir, + project_name=dist_name, + metadata=metadata, + ) + + +class InstallRequirement(object): + """ + Represents something that may be installed later on, may have information + about where to fetch the relevant requirement and also contains logic for + installing the said requirement. + """ + + def __init__( + self, + req, # type: Optional[Requirement] + comes_from, # type: Optional[Union[str, InstallRequirement]] + source_dir=None, # type: Optional[str] + editable=False, # type: bool + link=None, # type: Optional[Link] + markers=None, # type: Optional[Marker] + use_pep517=None, # type: Optional[bool] + isolated=False, # type: bool + options=None, # type: Optional[Dict[str, Any]] + wheel_cache=None, # type: Optional[WheelCache] + constraint=False, # type: bool + extras=() # type: Iterable[str] + ): + # type: (...) -> None + assert req is None or isinstance(req, Requirement), req + self.req = req + self.comes_from = comes_from + self.constraint = constraint + if source_dir is None: + self.source_dir = None # type: Optional[str] + else: + self.source_dir = os.path.normpath(os.path.abspath(source_dir)) + self.editable = editable + + self._wheel_cache = wheel_cache + if link is None and req and req.url: + # PEP 508 URL requirement + link = Link(req.url) + self.link = self.original_link = link + # Path to any downloaded or already-existing package. + self.local_file_path = None # type: Optional[str] + if self.link and self.link.is_file: + self.local_file_path = self.link.file_path + + if extras: + self.extras = extras + elif req: + self.extras = { + pkg_resources.safe_extra(extra) for extra in req.extras + } + else: + self.extras = set() + if markers is None and req: + markers = req.marker + self.markers = markers + + # This holds the pkg_resources.Distribution object if this requirement + # is already available: + self.satisfied_by = None # type: Optional[Distribution] + # Whether the installation process should try to uninstall an existing + # distribution before installing this requirement. + self.should_reinstall = False + # Temporary build location + self._temp_build_dir = None # type: Optional[TempDirectory] + # Set to True after successful installation + self.install_succeeded = None # type: Optional[bool] + self.options = options if options else {} + # Set to True after successful preparation of this requirement + self.prepared = False + self.is_direct = False + + self.isolated = isolated + self.build_env = NoOpBuildEnvironment() # type: BuildEnvironment + + # For PEP 517, the directory where we request the project metadata + # gets stored. We need this to pass to build_wheel, so the backend + # can ensure that the wheel matches the metadata (see the PEP for + # details). + self.metadata_directory = None # type: Optional[str] + + # The static build requirements (from pyproject.toml) + self.pyproject_requires = None # type: Optional[List[str]] + + # Build requirements that we will check are available + self.requirements_to_check = [] # type: List[str] + + # The PEP 517 backend we should use to build the project + self.pep517_backend = None # type: Optional[Pep517HookCaller] + + # Are we using PEP 517 for this requirement? + # After pyproject.toml has been loaded, the only valid values are True + # and False. Before loading, None is valid (meaning "use the default"). + # Setting an explicit value before loading pyproject.toml is supported, + # but after loading this flag should be treated as read only. + self.use_pep517 = use_pep517 + + def __str__(self): + # type: () -> str + if self.req: + s = str(self.req) + if self.link: + s += ' from %s' % redact_auth_from_url(self.link.url) + elif self.link: + s = redact_auth_from_url(self.link.url) + else: + s = '' + if self.satisfied_by is not None: + s += ' in %s' % display_path(self.satisfied_by.location) + if self.comes_from: + if isinstance(self.comes_from, six.string_types): + comes_from = self.comes_from # type: Optional[str] + else: + comes_from = self.comes_from.from_path() + if comes_from: + s += ' (from %s)' % comes_from + return s + + def __repr__(self): + # type: () -> str + return '<%s object: %s editable=%r>' % ( + self.__class__.__name__, str(self), self.editable) + + def format_debug(self): + # type: () -> str + """An un-tested helper for getting state, for debugging. + """ + attributes = vars(self) + names = sorted(attributes) + + state = ( + "{}={!r}".format(attr, attributes[attr]) for attr in sorted(names) + ) + return '<{name} object: {{{state}}}>'.format( + name=self.__class__.__name__, + state=", ".join(state), + ) + + def populate_link(self, finder, upgrade, require_hashes): + # type: (PackageFinder, bool, bool) -> None + """Ensure that if a link can be found for this, that it is found. + + Note that self.link may still be None - if Upgrade is False and the + requirement is already installed. + + If require_hashes is True, don't use the wheel cache, because cached + wheels, always built locally, have different hashes than the files + downloaded from the index server and thus throw false hash mismatches. + Furthermore, cached wheels at present have undeterministic contents due + to file modification times. + """ + if self.link is None: + self.link = finder.find_requirement(self, upgrade) + if self._wheel_cache is not None and not require_hashes: + old_link = self.link + supported_tags = pep425tags.get_supported() + self.link = self._wheel_cache.get( + link=self.link, + package_name=self.name, + supported_tags=supported_tags, + ) + if old_link != self.link: + logger.debug('Using cached wheel link: %s', self.link) + + # Things that are valid for all kinds of requirements? + @property + def name(self): + # type: () -> Optional[str] + if self.req is None: + return None + return six.ensure_str(pkg_resources.safe_name(self.req.name)) + + @property + def specifier(self): + # type: () -> SpecifierSet + return self.req.specifier + + @property + def is_pinned(self): + # type: () -> bool + """Return whether I am pinned to an exact version. + + For example, some-package==1.2 is pinned; some-package>1.2 is not. + """ + specifiers = self.specifier + return (len(specifiers) == 1 and + next(iter(specifiers)).operator in {'==', '==='}) + + @property + def installed_version(self): + # type: () -> Optional[str] + return get_installed_version(self.name) + + def match_markers(self, extras_requested=None): + # type: (Optional[Iterable[str]]) -> bool + if not extras_requested: + # Provide an extra to safely evaluate the markers + # without matching any extra + extras_requested = ('',) + if self.markers is not None: + return any( + self.markers.evaluate({'extra': extra}) + for extra in extras_requested) + else: + return True + + @property + def has_hash_options(self): + # type: () -> bool + """Return whether any known-good hashes are specified as options. + + These activate --require-hashes mode; hashes specified as part of a + URL do not. + + """ + return bool(self.options.get('hashes', {})) + + def hashes(self, trust_internet=True): + # type: (bool) -> Hashes + """Return a hash-comparer that considers my option- and URL-based + hashes to be known-good. + + Hashes in URLs--ones embedded in the requirements file, not ones + downloaded from an index server--are almost peers with ones from + flags. They satisfy --require-hashes (whether it was implicitly or + explicitly activated) but do not activate it. md5 and sha224 are not + allowed in flags, which should nudge people toward good algos. We + always OR all hashes together, even ones from URLs. + + :param trust_internet: Whether to trust URL-based (#md5=...) hashes + downloaded from the internet, as by populate_link() + + """ + good_hashes = self.options.get('hashes', {}).copy() + link = self.link if trust_internet else self.original_link + if link and link.hash: + good_hashes.setdefault(link.hash_name, []).append(link.hash) + return Hashes(good_hashes) + + def from_path(self): + # type: () -> Optional[str] + """Format a nice indicator to show where this "comes from" + """ + if self.req is None: + return None + s = str(self.req) + if self.comes_from: + if isinstance(self.comes_from, six.string_types): + comes_from = self.comes_from + else: + comes_from = self.comes_from.from_path() + if comes_from: + s += '->' + comes_from + return s + + def ensure_build_location(self, build_dir): + # type: (str) -> str + assert build_dir is not None + if self._temp_build_dir is not None: + assert self._temp_build_dir.path + return self._temp_build_dir.path + if self.req is None: + # Some systems have /tmp as a symlink which confuses custom + # builds (such as numpy). Thus, we ensure that the real path + # is returned. + self._temp_build_dir = TempDirectory(kind="req-build") + + return self._temp_build_dir.path + if self.editable: + name = self.name.lower() + else: + name = self.name + # FIXME: Is there a better place to create the build_dir? (hg and bzr + # need this) + if not os.path.exists(build_dir): + logger.debug('Creating directory %s', build_dir) + os.makedirs(build_dir) + write_delete_marker_file(build_dir) + return os.path.join(build_dir, name) + + def _set_requirement(self): + # type: () -> None + """Set requirement after generating metadata. + """ + assert self.req is None + assert self.metadata is not None + assert self.source_dir is not None + + # Construct a Requirement object from the generated metadata + if isinstance(parse_version(self.metadata["Version"]), Version): + op = "==" + else: + op = "===" + + self.req = Requirement( + "".join([ + self.metadata["Name"], + op, + self.metadata["Version"], + ]) + ) + + def warn_on_mismatching_name(self): + # type: () -> None + metadata_name = canonicalize_name(self.metadata["Name"]) + if canonicalize_name(self.req.name) == metadata_name: + # Everything is fine. + return + + # If we're here, there's a mismatch. Log a warning about it. + logger.warning( + 'Generating metadata for package %s ' + 'produced metadata for project name %s. Fix your ' + '#egg=%s fragments.', + self.name, metadata_name, self.name + ) + self.req = Requirement(metadata_name) + + def remove_temporary_source(self): + # type: () -> None + """Remove the source files from this requirement, if they are marked + for deletion""" + if self.source_dir and has_delete_marker_file(self.source_dir): + logger.debug('Removing source in %s', self.source_dir) + rmtree(self.source_dir) + self.source_dir = None + if self._temp_build_dir: + self._temp_build_dir.cleanup() + self._temp_build_dir = None + self.build_env.cleanup() + + def check_if_exists(self, use_user_site): + # type: (bool) -> None + """Find an installed distribution that satisfies or conflicts + with this requirement, and set self.satisfied_by or + self.should_reinstall appropriately. + """ + if self.req is None: + return + # get_distribution() will resolve the entire list of requirements + # anyway, and we've already determined that we need the requirement + # in question, so strip the marker so that we don't try to + # evaluate it. + no_marker = Requirement(str(self.req)) + no_marker.marker = None + try: + self.satisfied_by = pkg_resources.get_distribution(str(no_marker)) + except pkg_resources.DistributionNotFound: + return + except pkg_resources.VersionConflict: + existing_dist = pkg_resources.get_distribution( + self.req.name + ) + if use_user_site: + if dist_in_usersite(existing_dist): + self.should_reinstall = True + elif (running_under_virtualenv() and + dist_in_site_packages(existing_dist)): + raise InstallationError( + "Will not install to the user site because it will " + "lack sys.path precedence to %s in %s" % + (existing_dist.project_name, existing_dist.location) + ) + else: + self.should_reinstall = True + else: + if self.editable and self.satisfied_by: + self.should_reinstall = True + # when installing editables, nothing pre-existing should ever + # satisfy + self.satisfied_by = None + + # Things valid for wheels + @property + def is_wheel(self): + # type: () -> bool + if not self.link: + return False + return self.link.is_wheel + + # Things valid for sdists + @property + def unpacked_source_directory(self): + # type: () -> str + return os.path.join( + self.source_dir, + self.link and self.link.subdirectory_fragment or '') + + @property + def setup_py_path(self): + # type: () -> str + assert self.source_dir, "No source dir for %s" % self + setup_py = os.path.join(self.unpacked_source_directory, 'setup.py') + + # Python2 __file__ should not be unicode + if six.PY2 and isinstance(setup_py, six.text_type): + setup_py = setup_py.encode(sys.getfilesystemencoding()) + + return setup_py + + @property + def pyproject_toml_path(self): + # type: () -> str + assert self.source_dir, "No source dir for %s" % self + return make_pyproject_path(self.unpacked_source_directory) + + def load_pyproject_toml(self): + # type: () -> None + """Load the pyproject.toml file. + + After calling this routine, all of the attributes related to PEP 517 + processing for this requirement have been set. In particular, the + use_pep517 attribute can be used to determine whether we should + follow the PEP 517 or legacy (setup.py) code path. + """ + pyproject_toml_data = load_pyproject_toml( + self.use_pep517, + self.pyproject_toml_path, + self.setup_py_path, + str(self) + ) + + if pyproject_toml_data is None: + self.use_pep517 = False + return + + self.use_pep517 = True + requires, backend, check, backend_path = pyproject_toml_data + self.requirements_to_check = check + self.pyproject_requires = requires + self.pep517_backend = Pep517HookCaller( + self.unpacked_source_directory, backend, backend_path=backend_path, + ) + + def _generate_metadata(self): + # type: () -> str + """Invokes metadata generator functions, with the required arguments. + """ + if not self.use_pep517: + assert self.unpacked_source_directory + + return generate_metadata_legacy( + build_env=self.build_env, + setup_py_path=self.setup_py_path, + source_dir=self.unpacked_source_directory, + editable=self.editable, + isolated=self.isolated, + details=self.name or "from {}".format(self.link) + ) + + assert self.pep517_backend is not None + + return generate_metadata( + build_env=self.build_env, + backend=self.pep517_backend, + ) + + def prepare_metadata(self): + # type: () -> None + """Ensure that project metadata is available. + + Under PEP 517, call the backend hook to prepare the metadata. + Under legacy processing, call setup.py egg-info. + """ + assert self.source_dir + + with indent_log(): + self.metadata_directory = self._generate_metadata() + + # Act on the newly generated metadata, based on the name and version. + if not self.name: + self._set_requirement() + else: + self.warn_on_mismatching_name() + + self.assert_source_matches_version() + + @property + def metadata(self): + # type: () -> Any + if not hasattr(self, '_metadata'): + self._metadata = get_metadata(self.get_dist()) + + return self._metadata + + def get_dist(self): + # type: () -> Distribution + return _get_dist(self.metadata_directory) + + def assert_source_matches_version(self): + # type: () -> None + assert self.source_dir + version = self.metadata['version'] + if self.req.specifier and version not in self.req.specifier: + logger.warning( + 'Requested %s, but installing version %s', + self, + version, + ) + else: + logger.debug( + 'Source in %s has version %s, which satisfies requirement %s', + display_path(self.source_dir), + version, + self, + ) + + # For both source distributions and editables + def ensure_has_source_dir(self, parent_dir): + # type: (str) -> None + """Ensure that a source_dir is set. + + This will create a temporary build dir if the name of the requirement + isn't known yet. + + :param parent_dir: The ideal pip parent_dir for the source_dir. + Generally src_dir for editables and build_dir for sdists. + :return: self.source_dir + """ + if self.source_dir is None: + self.source_dir = self.ensure_build_location(parent_dir) + + # For editable installations + def update_editable(self, obtain=True): + # type: (bool) -> None + if not self.link: + logger.debug( + "Cannot update repository at %s; repository location is " + "unknown", + self.source_dir, + ) + return + assert self.editable + assert self.source_dir + if self.link.scheme == 'file': + # Static paths don't get updated + return + assert '+' in self.link.url, "bad url: %r" % self.link.url + vc_type, url = self.link.url.split('+', 1) + vcs_backend = vcs.get_backend(vc_type) + if vcs_backend: + if not self.link.is_vcs: + reason = ( + "This form of VCS requirement is being deprecated: {}." + ).format( + self.link.url + ) + replacement = None + if self.link.url.startswith("git+git@"): + replacement = ( + "git+https://git@example.com/..., " + "git+ssh://git@example.com/..., " + "or the insecure git+git://git@example.com/..." + ) + deprecated(reason, replacement, gone_in="21.0", issue=7554) + hidden_url = hide_url(self.link.url) + if obtain: + vcs_backend.obtain(self.source_dir, url=hidden_url) + else: + vcs_backend.export(self.source_dir, url=hidden_url) + else: + assert 0, ( + 'Unexpected version control type (in %s): %s' + % (self.link, vc_type)) + + # Top-level Actions + def uninstall(self, auto_confirm=False, verbose=False): + # type: (bool, bool) -> Optional[UninstallPathSet] + """ + Uninstall the distribution currently satisfying this requirement. + + Prompts before removing or modifying files unless + ``auto_confirm`` is True. + + Refuses to delete or modify files outside of ``sys.prefix`` - + thus uninstallation within a virtual environment can only + modify that virtual environment, even if the virtualenv is + linked to global site-packages. + + """ + assert self.req + try: + dist = pkg_resources.get_distribution(self.req.name) + except pkg_resources.DistributionNotFound: + logger.warning("Skipping %s as it is not installed.", self.name) + return None + else: + logger.info('Found existing installation: %s', dist) + + uninstalled_pathset = UninstallPathSet.from_dist(dist) + uninstalled_pathset.remove(auto_confirm, verbose) + return uninstalled_pathset + + def _get_archive_name(self, path, parentdir, rootdir): + # type: (str, str, str) -> str + + def _clean_zip_name(name, prefix): + # type: (str, str) -> str + assert name.startswith(prefix + os.path.sep), ( + "name %r doesn't start with prefix %r" % (name, prefix) + ) + name = name[len(prefix) + 1:] + name = name.replace(os.path.sep, '/') + return name + + path = os.path.join(parentdir, path) + name = _clean_zip_name(path, rootdir) + return self.name + '/' + name + + def archive(self, build_dir): + # type: (str) -> None + """Saves archive to provided build_dir. + + Used for saving downloaded VCS requirements as part of `pip download`. + """ + assert self.source_dir + + create_archive = True + archive_name = '%s-%s.zip' % (self.name, self.metadata["version"]) + archive_path = os.path.join(build_dir, archive_name) + + if os.path.exists(archive_path): + response = ask_path_exists( + 'The file %s exists. (i)gnore, (w)ipe, (b)ackup, (a)bort ' % + display_path(archive_path), ('i', 'w', 'b', 'a')) + if response == 'i': + create_archive = False + elif response == 'w': + logger.warning('Deleting %s', display_path(archive_path)) + os.remove(archive_path) + elif response == 'b': + dest_file = backup_dir(archive_path) + logger.warning( + 'Backing up %s to %s', + display_path(archive_path), + display_path(dest_file), + ) + shutil.move(archive_path, dest_file) + elif response == 'a': + sys.exit(-1) + + if not create_archive: + return + + zip_output = zipfile.ZipFile( + archive_path, 'w', zipfile.ZIP_DEFLATED, allowZip64=True, + ) + with zip_output: + dir = os.path.normcase( + os.path.abspath(self.unpacked_source_directory) + ) + for dirpath, dirnames, filenames in os.walk(dir): + if 'pip-egg-info' in dirnames: + dirnames.remove('pip-egg-info') + for dirname in dirnames: + dir_arcname = self._get_archive_name( + dirname, parentdir=dirpath, rootdir=dir, + ) + zipdir = zipfile.ZipInfo(dir_arcname + '/') + zipdir.external_attr = 0x1ED << 16 # 0o755 + zip_output.writestr(zipdir, '') + for filename in filenames: + if filename == PIP_DELETE_MARKER_FILENAME: + continue + file_arcname = self._get_archive_name( + filename, parentdir=dirpath, rootdir=dir, + ) + filename = os.path.join(dirpath, filename) + zip_output.write(filename, file_arcname) + + logger.info('Saved %s', display_path(archive_path)) + + def install( + self, + install_options, # type: List[str] + global_options=None, # type: Optional[Sequence[str]] + root=None, # type: Optional[str] + home=None, # type: Optional[str] + prefix=None, # type: Optional[str] + warn_script_location=True, # type: bool + use_user_site=False, # type: bool + pycompile=True # type: bool + ): + # type: (...) -> None + scheme = get_scheme( + self.name, + user=use_user_site, + home=home, + root=root, + isolated=self.isolated, + prefix=prefix, + ) + + global_options = global_options if global_options is not None else [] + if self.editable: + install_editable_legacy( + install_options, + global_options, + prefix=prefix, + home=home, + use_user_site=use_user_site, + name=self.name, + setup_py_path=self.setup_py_path, + isolated=self.isolated, + build_env=self.build_env, + unpacked_source_directory=self.unpacked_source_directory, + ) + self.install_succeeded = True + return + + if self.is_wheel: + assert self.local_file_path + install_wheel( + self.name, + self.local_file_path, + scheme=scheme, + req_description=str(self.req), + pycompile=pycompile, + warn_script_location=warn_script_location, + ) + self.install_succeeded = True + return + + install_legacy( + self, + install_options=install_options, + global_options=global_options, + root=root, + home=home, + prefix=prefix, + use_user_site=use_user_site, + pycompile=pycompile, + scheme=scheme, + ) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/req/req_install.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/req/req_install.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0dce7f0329f9d02c62e62f4336371e62b18c33b9 GIT binary patch literal 27612 zcmd6QYm6LMcHZsonIU^PTxE}?M_strwf4EnK1*+N;eOYebd^asl&)3x4m zmA5QC<-$v@^(9yNlBFMW;oGit*;OvPLhzQ0e!oacdfbKYxYnGj%(>RPuJW#HU2&Bw zuJxX)yysfJtN5-p?<(`Ib=6g_T1y8tm)Bh7nx#D#zVBMsUFEu^54rFI*ZR;^KD6{< z7gk*B$6V#dEd7KFKXR>)UFBm-A93NAU90LURaa;`7Zlyf4HwkhJrMkYYaDf-I#;Q? z#*;2+xW$5NJjI-Q&V5)3xEAK8r?Fs~Ts+eS1j#sp+Ctn3dr44jwz{1tnVT-MWIKZH z>QXfd;!ZEB2XVr+7B}zMgWHhsgPXl(6tseNVwsO1vtDa=+Rb_`Y$tWEDqQG3dVd{7Xq~DYm@b$eZiD z+kKz2Px0+F>y|EjY+HrzLY6)I=A&NQ!jV%R9HLfqC-`3a=8oS(VuUd-VuoSd| zsD=?~1xc+@OKMicJ~pl0YS3sVwS{ot>(Uad%F)ZJ-d+xZ&<1rEvcpcTQSGjEqs~fD zPpV0$6(-DY)mDRn{BA8-?!We0J8kU>vgdN{usw=ekBiPqZxO@ z+M22*dn_ZVHrv&hjdxMGwgj5vkfW+fdNJuI2~?evm<~zMsNOQlO17f zNTQ%o!ywms=*(i&X{mri6t$8lNN11zVS5{An^Sl-Xm!tn#Op~XTC?$;K=wNyUiq+k z?yU>w-md!B=H@QVy=i3}ov7EwTrE|581twK%1nB-FlgVh8XW#x^>~`gK?~|^do3XW zo^RF@b^lTV(gR^B_cA_Rx$kyK$hA<3d91sjT@MnjAy7uPq&Qd)UJ;yt>m%g1d`21aN`LXvX0qSBBks(X}7Xic~Xx!zCl`s|8iq!U}9;t6M3v z8lL^A=+;YaeJINxb$5rD-zd4s^

&D|}jHmZ)eyG14&L+&o*{II(_g4)ITX?8b$ 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 bO!v#DhR None + """Create a RequirementSet. + """ + + self.requirements = OrderedDict() # type: Dict[str, InstallRequirement] # noqa: E501 + self.check_supported_wheels = check_supported_wheels + + self.unnamed_requirements = [] # type: List[InstallRequirement] + self.successfully_downloaded = [] # type: List[InstallRequirement] + self.reqs_to_cleanup = [] # type: List[InstallRequirement] + + def __str__(self): + # type: () -> str + requirements = sorted( + (req for req in self.requirements.values() if not req.comes_from), + key=lambda req: canonicalize_name(req.name), + ) + return ' '.join(str(req.req) for req in requirements) + + def __repr__(self): + # type: () -> str + requirements = sorted( + self.requirements.values(), + key=lambda req: canonicalize_name(req.name), + ) + + format_string = '<{classname} object; {count} requirement(s): {reqs}>' + return format_string.format( + classname=self.__class__.__name__, + count=len(requirements), + reqs=', '.join(str(req.req) for req in requirements), + ) + + def add_unnamed_requirement(self, install_req): + # type: (InstallRequirement) -> None + assert not install_req.name + self.unnamed_requirements.append(install_req) + + def add_named_requirement(self, install_req): + # type: (InstallRequirement) -> None + assert install_req.name + + project_name = canonicalize_name(install_req.name) + self.requirements[project_name] = install_req + + def add_requirement( + self, + install_req, # type: InstallRequirement + parent_req_name=None, # type: Optional[str] + extras_requested=None # type: Optional[Iterable[str]] + ): + # type: (...) -> Tuple[List[InstallRequirement], Optional[InstallRequirement]] # noqa: E501 + """Add install_req as a requirement to install. + + :param parent_req_name: The name of the requirement that needed this + added. The name is used because when multiple unnamed requirements + resolve to the same name, we could otherwise end up with dependency + links that point outside the Requirements set. parent_req must + already be added. Note that None implies that this is a user + supplied requirement, vs an inferred one. + :param extras_requested: an iterable of extras used to evaluate the + environment markers. + :return: Additional requirements to scan. That is either [] if + the requirement is not applicable, or [install_req] if the + requirement is applicable and has just been added. + """ + # If the markers do not match, ignore this requirement. + if not install_req.match_markers(extras_requested): + logger.info( + "Ignoring %s: markers '%s' don't match your environment", + install_req.name, install_req.markers, + ) + return [], None + + # If the wheel is not supported, raise an error. + # Should check this after filtering out based on environment markers to + # allow specifying different wheels based on the environment/OS, in a + # single requirements file. + if install_req.link and install_req.link.is_wheel: + wheel = Wheel(install_req.link.filename) + tags = pep425tags.get_supported() + if (self.check_supported_wheels and not wheel.supported(tags)): + raise InstallationError( + "%s is not a supported wheel on this platform." % + wheel.filename + ) + + # This next bit is really a sanity check. + assert install_req.is_direct == (parent_req_name is None), ( + "a direct req shouldn't have a parent and also, " + "a non direct req should have a parent" + ) + + # Unnamed requirements are scanned again and the requirement won't be + # added as a dependency until after scanning. + if not install_req.name: + self.add_unnamed_requirement(install_req) + return [install_req], None + + try: + existing_req = self.get_requirement(install_req.name) + except KeyError: + existing_req = None + + has_conflicting_requirement = ( + parent_req_name is None and + existing_req and + not existing_req.constraint and + existing_req.extras == install_req.extras and + existing_req.req.specifier != install_req.req.specifier + ) + if has_conflicting_requirement: + raise InstallationError( + "Double requirement given: %s (already in %s, name=%r)" + % (install_req, existing_req, install_req.name) + ) + + # When no existing requirement exists, add the requirement as a + # dependency and it will be scanned again after. + if not existing_req: + self.add_named_requirement(install_req) + # We'd want to rescan this requirement later + return [install_req], install_req + + # Assume there's no need to scan, and that we've already + # encountered this for scanning. + if install_req.constraint or not existing_req.constraint: + return [], existing_req + + does_not_satisfy_constraint = ( + install_req.link and + not ( + existing_req.link and + install_req.link.path == existing_req.link.path + ) + ) + if does_not_satisfy_constraint: + self.reqs_to_cleanup.append(install_req) + raise InstallationError( + "Could not satisfy constraints for '%s': " + "installation from path or url cannot be " + "constrained to a version" % install_req.name, + ) + # If we're now installing a constraint, mark the existing + # object for real installation. + existing_req.constraint = False + existing_req.extras = tuple(sorted( + set(existing_req.extras) | set(install_req.extras) + )) + logger.debug( + "Setting %s extras to: %s", + existing_req, existing_req.extras, + ) + # Return the existing requirement for addition to the parent and + # scanning again. + return [existing_req], existing_req + + def has_requirement(self, name): + # type: (str) -> bool + project_name = canonicalize_name(name) + + return ( + project_name in self.requirements and + not self.requirements[project_name].constraint + ) + + def get_requirement(self, name): + # type: (str) -> InstallRequirement + project_name = canonicalize_name(name) + + if project_name in self.requirements: + return self.requirements[project_name] + + raise KeyError("No project with the name %r" % name) + + def cleanup_files(self): + # type: () -> None + """Clean up files, remove builds.""" + logger.debug('Cleaning up...') + with indent_log(): + for req in self.reqs_to_cleanup: + req.remove_temporary_source() diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/req/req_set 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/req/req_set 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2129684ba29fb3ebf05333d5ba4895cc7df1d356 GIT binary patch literal 7973 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 literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/req/req_set.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/req/req_set.py new file mode 100644 index 0000000..087ac59 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/req/req_set.py @@ -0,0 +1,209 @@ +# The following comment should be removed at some point in the future. +# mypy: strict-optional=False + +from __future__ import absolute_import + +import logging +from collections import OrderedDict + +from pip._vendor.packaging.utils import canonicalize_name + +from pip._internal import pep425tags +from pip._internal.exceptions import InstallationError +from pip._internal.models.wheel import Wheel +from pip._internal.utils.logging import indent_log +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Dict, Iterable, List, Optional, Tuple + from pip._internal.req.req_install import InstallRequirement + + +logger = logging.getLogger(__name__) + + +class RequirementSet(object): + + def __init__(self, check_supported_wheels=True): + # type: (bool) -> None + """Create a RequirementSet. + """ + + self.requirements = OrderedDict() # type: Dict[str, InstallRequirement] # noqa: E501 + self.check_supported_wheels = check_supported_wheels + + self.unnamed_requirements = [] # type: List[InstallRequirement] + self.successfully_downloaded = [] # type: List[InstallRequirement] + self.reqs_to_cleanup = [] # type: List[InstallRequirement] + + def __str__(self): + # type: () -> str + requirements = sorted( + (req for req in self.requirements.values() if not req.comes_from), + key=lambda req: canonicalize_name(req.name), + ) + return ' '.join(str(req.req) for req in requirements) + + def __repr__(self): + # type: () -> str + requirements = sorted( + self.requirements.values(), + key=lambda req: canonicalize_name(req.name), + ) + + format_string = '<{classname} object; {count} requirement(s): {reqs}>' + return format_string.format( + classname=self.__class__.__name__, + count=len(requirements), + reqs=', '.join(str(req.req) for req in requirements), + ) + + def add_unnamed_requirement(self, install_req): + # type: (InstallRequirement) -> None + assert not install_req.name + self.unnamed_requirements.append(install_req) + + def add_named_requirement(self, install_req): + # type: (InstallRequirement) -> None + assert install_req.name + + project_name = canonicalize_name(install_req.name) + self.requirements[project_name] = install_req + + def add_requirement( + self, + install_req, # type: InstallRequirement + parent_req_name=None, # type: Optional[str] + extras_requested=None # type: Optional[Iterable[str]] + ): + # type: (...) -> Tuple[List[InstallRequirement], Optional[InstallRequirement]] # noqa: E501 + """Add install_req as a requirement to install. + + :param parent_req_name: The name of the requirement that needed this + added. The name is used because when multiple unnamed requirements + resolve to the same name, we could otherwise end up with dependency + links that point outside the Requirements set. parent_req must + already be added. Note that None implies that this is a user + supplied requirement, vs an inferred one. + :param extras_requested: an iterable of extras used to evaluate the + environment markers. + :return: Additional requirements to scan. That is either [] if + the requirement is not applicable, or [install_req] if the + requirement is applicable and has just been added. + """ + # If the markers do not match, ignore this requirement. + if not install_req.match_markers(extras_requested): + logger.info( + "Ignoring %s: markers '%s' don't match your environment", + install_req.name, install_req.markers, + ) + return [], None + + # If the wheel is not supported, raise an error. + # Should check this after filtering out based on environment markers to + # allow specifying different wheels based on the environment/OS, in a + # single requirements file. + if install_req.link and install_req.link.is_wheel: + wheel = Wheel(install_req.link.filename) + tags = pep425tags.get_supported() + if (self.check_supported_wheels and not wheel.supported(tags)): + raise InstallationError( + "%s is not a supported wheel on this platform." % + wheel.filename + ) + + # This next bit is really a sanity check. + assert install_req.is_direct == (parent_req_name is None), ( + "a direct req shouldn't have a parent and also, " + "a non direct req should have a parent" + ) + + # Unnamed requirements are scanned again and the requirement won't be + # added as a dependency until after scanning. + if not install_req.name: + self.add_unnamed_requirement(install_req) + return [install_req], None + + try: + existing_req = self.get_requirement(install_req.name) + except KeyError: + existing_req = None + + has_conflicting_requirement = ( + parent_req_name is None and + existing_req and + not existing_req.constraint and + existing_req.extras == install_req.extras and + existing_req.req.specifier != install_req.req.specifier + ) + if has_conflicting_requirement: + raise InstallationError( + "Double requirement given: %s (already in %s, name=%r)" + % (install_req, existing_req, install_req.name) + ) + + # When no existing requirement exists, add the requirement as a + # dependency and it will be scanned again after. + if not existing_req: + self.add_named_requirement(install_req) + # We'd want to rescan this requirement later + return [install_req], install_req + + # Assume there's no need to scan, and that we've already + # encountered this for scanning. + if install_req.constraint or not existing_req.constraint: + return [], existing_req + + does_not_satisfy_constraint = ( + install_req.link and + not ( + existing_req.link and + install_req.link.path == existing_req.link.path + ) + ) + if does_not_satisfy_constraint: + self.reqs_to_cleanup.append(install_req) + raise InstallationError( + "Could not satisfy constraints for '%s': " + "installation from path or url cannot be " + "constrained to a version" % install_req.name, + ) + # If we're now installing a constraint, mark the existing + # object for real installation. + existing_req.constraint = False + existing_req.extras = tuple(sorted( + set(existing_req.extras) | set(install_req.extras) + )) + logger.debug( + "Setting %s extras to: %s", + existing_req, existing_req.extras, + ) + # Return the existing requirement for addition to the parent and + # scanning again. + return [existing_req], existing_req + + def has_requirement(self, name): + # type: (str) -> bool + project_name = canonicalize_name(name) + + return ( + project_name in self.requirements and + not self.requirements[project_name].constraint + ) + + def get_requirement(self, name): + # type: (str) -> InstallRequirement + project_name = canonicalize_name(name) + + if project_name in self.requirements: + return self.requirements[project_name] + + raise KeyError("No project with the name %r" % name) + + def cleanup_files(self): + # type: () -> None + """Clean up files, remove builds.""" + logger.debug('Cleaning up...') + with indent_log(): + for req in self.reqs_to_cleanup: + req.remove_temporary_source() diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/req/req_set.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/req/req_set.pyc new file mode 100644 index 0000000000000000000000000000000000000000..047c8fab5ec1c7582139f8df3c42bd7ffa394a6f GIT binary patch literal 7973 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 literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/req/req_tracker 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/req/req_tracker 2.py new file mode 100644 index 0000000..84e0c04 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/req/req_tracker 2.py @@ -0,0 +1,150 @@ +# The following comment should be removed at some point in the future. +# mypy: strict-optional=False + +from __future__ import absolute_import + +import contextlib +import errno +import hashlib +import logging +import os + +from pip._vendor import contextlib2 + +from pip._internal.utils.temp_dir import TempDirectory +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from types import TracebackType + from typing import Dict, Iterator, Optional, Set, Type, Union + from pip._internal.req.req_install import InstallRequirement + from pip._internal.models.link import Link + +logger = logging.getLogger(__name__) + + +@contextlib.contextmanager +def update_env_context_manager(**changes): + # type: (str) -> Iterator[None] + target = os.environ + + # Save values from the target and change them. + non_existent_marker = object() + saved_values = {} # type: Dict[str, Union[object, str]] + for name, new_value in changes.items(): + try: + saved_values[name] = target[name] + except KeyError: + saved_values[name] = non_existent_marker + target[name] = new_value + + try: + yield + finally: + # Restore original values in the target. + for name, original_value in saved_values.items(): + if original_value is non_existent_marker: + del target[name] + else: + assert isinstance(original_value, str) # for mypy + target[name] = original_value + + +@contextlib.contextmanager +def get_requirement_tracker(): + # type: () -> Iterator[RequirementTracker] + root = os.environ.get('PIP_REQ_TRACKER') + with contextlib2.ExitStack() as ctx: + if root is None: + root = ctx.enter_context( + TempDirectory(kind='req-tracker') + ).path + ctx.enter_context(update_env_context_manager(PIP_REQ_TRACKER=root)) + logger.debug("Initialized build tracking at %s", root) + + with RequirementTracker(root) as tracker: + yield tracker + + +class RequirementTracker(object): + + def __init__(self, root): + # type: (str) -> None + self._root = root + self._entries = set() # type: Set[InstallRequirement] + logger.debug("Created build tracker: %s", self._root) + + def __enter__(self): + # type: () -> RequirementTracker + logger.debug("Entered build tracker: %s", self._root) + return self + + def __exit__( + self, + exc_type, # type: Optional[Type[BaseException]] + exc_val, # type: Optional[BaseException] + exc_tb # type: Optional[TracebackType] + ): + # type: (...) -> None + self.cleanup() + + def _entry_path(self, link): + # type: (Link) -> str + hashed = hashlib.sha224(link.url_without_fragment.encode()).hexdigest() + return os.path.join(self._root, hashed) + + def add(self, req): + # type: (InstallRequirement) -> None + """Add an InstallRequirement to build tracking. + """ + + # Get the file to write information about this requirement. + entry_path = self._entry_path(req.link) + + # Try reading from the file. If it exists and can be read from, a build + # is already in progress, so a LookupError is raised. + try: + with open(entry_path) as fp: + contents = fp.read() + except IOError as e: + # if the error is anything other than "file does not exist", raise. + if e.errno != errno.ENOENT: + raise + else: + message = '%s is already being built: %s' % (req.link, contents) + raise LookupError(message) + + # If we're here, req should really not be building already. + assert req not in self._entries + + # Start tracking this requirement. + with open(entry_path, 'w') as fp: + fp.write(str(req)) + self._entries.add(req) + + logger.debug('Added %s to build tracker %r', req, self._root) + + def remove(self, req): + # type: (InstallRequirement) -> None + """Remove an InstallRequirement from build tracking. + """ + + # Delete the created file and the corresponding entries. + os.unlink(self._entry_path(req.link)) + self._entries.remove(req) + + logger.debug('Removed %s from build tracker %r', req, self._root) + + def cleanup(self): + # type: () -> None + for req in set(self._entries): + self.remove(req) + + logger.debug("Removed build tracker: %r", self._root) + + @contextlib.contextmanager + def track(self, req): + # type: (InstallRequirement) -> Iterator[None] + self.add(req) + yield + self.remove(req) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/req/req_tracker 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/req/req_tracker 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3b0daa284f859083bf2595c1f3a07e450aefbc2a GIT binary patch literal 5697 zcmd5=OLH5?5$@RqKmvS<)FYH+8;Q*X6-T5bD@m10c9D^2nATRAi;f(jk?LDu*2M7xE{PYp(tax#yBUkgt0HQc~hG1!9Ih@0qW^>F$C1pQ+kE z|MAK1+cf;R_`kA3R9sg?A-;-YqC`avLu|q9K+912saz}EBTBVU(rdD|*SEyAH z*`;`ll5uK{+qp^`jM6<}%@_)t_Ex}}?;#kXuA*Z_#-Zm# z#|}es?9$;T9ihqP%DdluM!$3DxJ1Wg8qCp=qN5Tm9J&1O_Evg@O4!+6jq-0vDRtz~ zuqjpa_^3SWe|vwCww_g)C10y8nhgQ?JS zhl;NQePiN zg@H2sB*^zLcoOwRaG*o~Ac*@I!}>{sM4KuL`l+p#<+42LM9{yjYM`AYD|(QYdwFya z7`=QD9*IPbXd8T<%4^YjV0c zzP5UIt$6T=t0egmSe|3W1Ns^(l!!b2DR_`K~EjQR@%%fl{AmEya6j2dvG#PoZ) z&-?@%p8;+mx8{k~_M$W_*f;>FYeS#}g7q{qQ4mMZ zbXec+M{!t})+p`N15;lt8f-i~$(U6_F>uBcJH)W89Y$uu0C`!bnWfrrZ_r5RBj7zI zx3u>Hv+G^u5|ca5I#7p@JJj3#j$xDZidERO8f~x&WO$xsMz+v4hr;IJQO=rgm#{&g z;sf20MH|uamuM>ZT;$HF84#4wb9_w&0>Ma=Nk9yHTLNIW2O#MQk3hT=&gXcVRMITY4S)H z-Uldni^ya~QF5W<9q(scg>;ryL^cXL6B*zC99t=vv*c8v#5VJv(+Pr10c#nCV8Kb@ z`U1sQ!CK>M@qfYMiB8e*K15O6gSW&I(pe(G7u{!_;ZFNsp-_}~N6x%zv%rbL5Gt{m zz^R!ms0~lu9QUv;DAqyR?=^Us98V~r58J-sfI(a!3UE4NC8S~dtRb*ufQtkfJZ!w+ z8$e@nl~{KtM7V{5B?23G#C;N&u+@R+c;*f9eD#4o>!uk-t{TqVi8{=(VvO|MK4yhPg zxXpPE6Hfv-1czI=qwt>ThbQ4+ND2|7LI~I`4;8fMQvQOzBiesKX`LR!_SzK?O71vx z@mTyi!a6L$@tv4Yxc0plPGgZC+Cw~-0QvK|P@q~eK%$m{oQ zu*$pEd7frMwYBE`wdN*pK**nEd;Okt@~)xmG0(+uJk1gGdK{mM*AK$*O%usfuta7` z!~aT5j4kArJQ7#$^u)qQ7?>J+I%{VVT@(lj&zSKZdzWvK1aYd&m0W}h7uAe2hd6Xz zO}ZBlJS?bLN9fO%hY=R~-+?eRHz1IuDClN6#GEQIqeq+)v%?N*L{{MxTOWq6_!ya| zlk7nM0IhcNEcroVNkD0b3uE5wESzaJ*usfn5+3wZwmzpM5(Y>MUWVAnn+oT{i^9Dx zAf2`1?qd&sK(e7hMO4Ihhj+<{ii-Gx9DcxBVtt5a?tTNCWOX1aV>7TnOI!9O!3sjp zvP2N!>k-5V-&cZl3Ab{2p?e(2*-OM*d%MBAfgSz{X&6^sROe3l%>cGn(DptA1_Qa} zH1PPE!zuuIS~K#V!VbPo9v@#~%D09rV$tNm@@MSL9@?E!W!2z^whfDYeqQ^&7%|^Z zvalbc=q>Y!u5-p#-(HrJQ+kY}j5z(}N8aSa;_%h$JwUh9`y$eryv{v-_N*Zl>^>?^ zwNfott4QxvC#qwOpP+Jh{++(*=X`!t;qAg1n>+7U$i%hq0}_tQS`&69_;p~(KhSBI z<@SksbyPX}xnQYpqPSSXZz(-LjB@)lHVeQtQEB_zBo?9X7lal=ok*SkUc8aoy9C=B5_@yh&CUd`S^ zl Iterator[None] + target = os.environ + + # Save values from the target and change them. + non_existent_marker = object() + saved_values = {} # type: Dict[str, Union[object, str]] + for name, new_value in changes.items(): + try: + saved_values[name] = target[name] + except KeyError: + saved_values[name] = non_existent_marker + target[name] = new_value + + try: + yield + finally: + # Restore original values in the target. + for name, original_value in saved_values.items(): + if original_value is non_existent_marker: + del target[name] + else: + assert isinstance(original_value, str) # for mypy + target[name] = original_value + + +@contextlib.contextmanager +def get_requirement_tracker(): + # type: () -> Iterator[RequirementTracker] + root = os.environ.get('PIP_REQ_TRACKER') + with contextlib2.ExitStack() as ctx: + if root is None: + root = ctx.enter_context( + TempDirectory(kind='req-tracker') + ).path + ctx.enter_context(update_env_context_manager(PIP_REQ_TRACKER=root)) + logger.debug("Initialized build tracking at %s", root) + + with RequirementTracker(root) as tracker: + yield tracker + + +class RequirementTracker(object): + + def __init__(self, root): + # type: (str) -> None + self._root = root + self._entries = set() # type: Set[InstallRequirement] + logger.debug("Created build tracker: %s", self._root) + + def __enter__(self): + # type: () -> RequirementTracker + logger.debug("Entered build tracker: %s", self._root) + return self + + def __exit__( + self, + exc_type, # type: Optional[Type[BaseException]] + exc_val, # type: Optional[BaseException] + exc_tb # type: Optional[TracebackType] + ): + # type: (...) -> None + self.cleanup() + + def _entry_path(self, link): + # type: (Link) -> str + hashed = hashlib.sha224(link.url_without_fragment.encode()).hexdigest() + return os.path.join(self._root, hashed) + + def add(self, req): + # type: (InstallRequirement) -> None + """Add an InstallRequirement to build tracking. + """ + + # Get the file to write information about this requirement. + entry_path = self._entry_path(req.link) + + # Try reading from the file. If it exists and can be read from, a build + # is already in progress, so a LookupError is raised. + try: + with open(entry_path) as fp: + contents = fp.read() + except IOError as e: + # if the error is anything other than "file does not exist", raise. + if e.errno != errno.ENOENT: + raise + else: + message = '%s is already being built: %s' % (req.link, contents) + raise LookupError(message) + + # If we're here, req should really not be building already. + assert req not in self._entries + + # Start tracking this requirement. + with open(entry_path, 'w') as fp: + fp.write(str(req)) + self._entries.add(req) + + logger.debug('Added %s to build tracker %r', req, self._root) + + def remove(self, req): + # type: (InstallRequirement) -> None + """Remove an InstallRequirement from build tracking. + """ + + # Delete the created file and the corresponding entries. + os.unlink(self._entry_path(req.link)) + self._entries.remove(req) + + logger.debug('Removed %s from build tracker %r', req, self._root) + + def cleanup(self): + # type: () -> None + for req in set(self._entries): + self.remove(req) + + logger.debug("Removed build tracker: %r", self._root) + + @contextlib.contextmanager + def track(self, req): + # type: (InstallRequirement) -> Iterator[None] + self.add(req) + yield + self.remove(req) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/req/req_tracker.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/req/req_tracker.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7a3f79489f7e95c2f2b0ebdfc8f4c94443175da0 GIT binary patch literal 5697 zcmd5=+j1Mn5$)LpKmxpq)FqT;8;Q*X6-T5bD|VGjc2SWSnATRAi;f(nBgQsyz51zmT6u5`ovTD~m695@YPMXac!H8iYE6>Tla&7;qbd|nQ8G=fY1?az;u%V2sWnT< zIclAwWR6;Ml+06Wo|5y_I#0<3YF)6s$0@!@$t7xCvgInpKci%US_`C7B3-8LWztvZ zIgWUhv_svuD6G*7lA5SUr$0J$RHCCY4d&=j(P4=e4qg6tdo#U4CG2dsM)|j-lsa^1 z*pw=Id{`d#zrD9eo6oAulCRY!@`DH5Z?wdn(GnFp#MhzSamxQO9Q(=MUkGPLgQ?JS zhl+oa8Kdv84|J8?+(wVh$C!0pPTg!Um^c$rR-h}mlkP`3l*o{0TV3c(K#Yt|3IY4R z9<1g$kguUfR74DC+SY=7VRFNCxlMNs#Yi@FePsU|)y+eh~LDhV_#Mi8fUh^ix|e%Vl}giJ*U5)j&H*R`eh(_wr~z zFnW1E$d|XXIMjKu-03Zcd)>~nTiZ9TZ{7G{FxWR;W6Vb%Jl(mDPbXd8Snfr=YjV0c zzIOAY51TEIt0egmSe|3W1Ns^(l!!b2DR_`K~EjQSpeDBvHEaUSWQc82&}nyq!V=E{`mim5BDkRF-!?lOLxBAH6@b28bzv_wBcB3>b*f;>FYeS#}g0(auBcJH)W89zHv*TUm5|ca5I#7p@JJehKj$xDZidERK8f~x&WO$xsMz+v42g2szQO=rgm#{&g z;sf20MH|uaw`eN(T;$HF84#4wcg;-&0>Ma=Nk9y6nk|3F;j;rDa!Sa^;W>#u(`vvG8 z?>!W}MPxFgD7nz_w)ZQpLOM$;A{&LBiHz@mhOHFLS#qjSVw?HT=@>z#fVB)mu;8R{ zeSzYuV6F1C_`hKBL?>u?@1rR0!CPVp=`4}pi|(_|aHst*Q7B5hBWGTVKA2$k4O z;M7bO)P^T+j(b=a6zd@E_ZmD*jwh7R2W{VQz#uLV1vnkC64J1B)(}`Sz(s-#9yVU^ z4WKc(O02tMBHTj35`hgo;ywvX*y@XmfC0yyfKTX-2~6W`&%u;YFu+g?1Uo^ogBVUA zD0YIIH*cBqXzS;(|1>f?S>O2EdC=kL$-uTi?=Xzv8YEyJ&0kw z!$EyZv&ZKEz_96t2OxS{T(wKUUZMBt8FgM?%p0@l;C;&3ZDhi+tOr6esd!=`^4bF% ztn#jPo~M~mZMFGewYdQt5b|f)Zoem;ylW_X%yV%ZPjdvl9>=HR^@A{c-9$1KERmVg z@V^ohV+*+@kHpp6J+Uwn2ByZI&f1wo7X?DXGiJQU-sM{)L7XacB^RN>MK$BhAr75a zlkNos4-0D65&E;`VT6VLcOeYT4G3f@3c6ViF{et*=n<#H?689xkySXw)`#IMK1Sy0 zB-__NL96XNOMa4A5>VRV!kE`P3ul@Qws2yYga`eUt;axJKq9VQ^2k)_#SRbO9d*8q&SsjSV*bMB=(x!b$u!7LD zED=O_I)WJC`%17b;Z`m$bdLi$dx>~!Z#H;0u*1J14dbed>f8yx8Nl`m+TMl0U?8`g z1|DB?SOp+YYDV5u*ul5SioR-ABc# zR;uM{73rPoM0Kq33serzzuhn0Ve+J`?8-7Zi?gs5^>{QI7FofsCEAtC^HG7Xx zviEy~B|fP4YtCjkV~pPfWecruTOxnTz!j|DS!WWDDEV_{omn`xikekRNO%{!b64hO F{|n;t6wm+w literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/req/req_uninstall 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/req/req_uninstall 2.py new file mode 100644 index 0000000..5971b13 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/req/req_uninstall 2.py @@ -0,0 +1,644 @@ +from __future__ import absolute_import + +import csv +import functools +import logging +import os +import sys +import sysconfig + +from pip._vendor import pkg_resources + +from pip._internal.exceptions import UninstallationError +from pip._internal.locations import bin_py, bin_user +from pip._internal.utils.compat import WINDOWS, cache_from_source, uses_pycache +from pip._internal.utils.logging import indent_log +from pip._internal.utils.misc import ( + FakeFile, + ask, + dist_in_usersite, + dist_is_local, + egg_link_path, + is_local, + normalize_path, + renames, + rmtree, +) +from pip._internal.utils.temp_dir import AdjacentTempDirectory, TempDirectory +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import ( + Any, Callable, Dict, Iterable, Iterator, List, Optional, Set, Tuple, + ) + from pip._vendor.pkg_resources import Distribution + +logger = logging.getLogger(__name__) + + +def _script_names(dist, script_name, is_gui): + # type: (Distribution, str, bool) -> List[str] + """Create the fully qualified name of the files created by + {console,gui}_scripts for the given ``dist``. + Returns the list of file names + """ + if dist_in_usersite(dist): + bin_dir = bin_user + else: + bin_dir = bin_py + exe_name = os.path.join(bin_dir, script_name) + paths_to_remove = [exe_name] + if WINDOWS: + paths_to_remove.append(exe_name + '.exe') + paths_to_remove.append(exe_name + '.exe.manifest') + if is_gui: + paths_to_remove.append(exe_name + '-script.pyw') + else: + paths_to_remove.append(exe_name + '-script.py') + return paths_to_remove + + +def _unique(fn): + # type: (Callable[..., Iterator[Any]]) -> Callable[..., Iterator[Any]] + @functools.wraps(fn) + def unique(*args, **kw): + # type: (Any, Any) -> Iterator[Any] + seen = set() # type: Set[Any] + for item in fn(*args, **kw): + if item not in seen: + seen.add(item) + yield item + return unique + + +@_unique +def uninstallation_paths(dist): + # type: (Distribution) -> Iterator[str] + """ + Yield all the uninstallation paths for dist based on RECORD-without-.py[co] + + Yield paths to all the files in RECORD. For each .py file in RECORD, add + the .pyc and .pyo in the same directory. + + UninstallPathSet.add() takes care of the __pycache__ .py[co]. + """ + r = csv.reader(FakeFile(dist.get_metadata_lines('RECORD'))) + for row in r: + path = os.path.join(dist.location, row[0]) + yield path + if path.endswith('.py'): + dn, fn = os.path.split(path) + base = fn[:-3] + path = os.path.join(dn, base + '.pyc') + yield path + path = os.path.join(dn, base + '.pyo') + yield path + + +def compact(paths): + # type: (Iterable[str]) -> Set[str] + """Compact a path set to contain the minimal number of paths + necessary to contain all paths in the set. If /a/path/ and + /a/path/to/a/file.txt are both in the set, leave only the + shorter path.""" + + sep = os.path.sep + short_paths = set() # type: Set[str] + for path in sorted(paths, key=len): + should_skip = any( + path.startswith(shortpath.rstrip("*")) and + path[len(shortpath.rstrip("*").rstrip(sep))] == sep + for shortpath in short_paths + ) + if not should_skip: + short_paths.add(path) + return short_paths + + +def compress_for_rename(paths): + # type: (Iterable[str]) -> Set[str] + """Returns a set containing the paths that need to be renamed. + + This set may include directories when the original sequence of paths + included every file on disk. + """ + case_map = dict((os.path.normcase(p), p) for p in paths) + remaining = set(case_map) + unchecked = sorted(set(os.path.split(p)[0] + for p in case_map.values()), key=len) + wildcards = set() # type: Set[str] + + def norm_join(*a): + # type: (str) -> str + return os.path.normcase(os.path.join(*a)) + + for root in unchecked: + if any(os.path.normcase(root).startswith(w) + for w in wildcards): + # This directory has already been handled. + continue + + all_files = set() # type: Set[str] + all_subdirs = set() # type: Set[str] + for dirname, subdirs, files in os.walk(root): + all_subdirs.update(norm_join(root, dirname, d) + for d in subdirs) + all_files.update(norm_join(root, dirname, f) + for f in files) + # If all the files we found are in our remaining set of files to + # remove, then remove them from the latter set and add a wildcard + # for the directory. + if not (all_files - remaining): + remaining.difference_update(all_files) + wildcards.add(root + os.sep) + + return set(map(case_map.__getitem__, remaining)) | wildcards + + +def compress_for_output_listing(paths): + # type: (Iterable[str]) -> Tuple[Set[str], Set[str]] + """Returns a tuple of 2 sets of which paths to display to user + + The first set contains paths that would be deleted. Files of a package + are not added and the top-level directory of the package has a '*' added + at the end - to signify that all it's contents are removed. + + The second set contains files that would have been skipped in the above + folders. + """ + + will_remove = set(paths) + will_skip = set() + + # Determine folders and files + folders = set() + files = set() + for path in will_remove: + if path.endswith(".pyc"): + continue + if path.endswith("__init__.py") or ".dist-info" in path: + folders.add(os.path.dirname(path)) + files.add(path) + + # probably this one https://github.com/python/mypy/issues/390 + _normcased_files = set(map(os.path.normcase, files)) # type: ignore + + folders = compact(folders) + + # This walks the tree using os.walk to not miss extra folders + # that might get added. + for folder in folders: + for dirpath, _, dirfiles in os.walk(folder): + for fname in dirfiles: + if fname.endswith(".pyc"): + continue + + file_ = os.path.join(dirpath, fname) + if (os.path.isfile(file_) and + os.path.normcase(file_) not in _normcased_files): + # We are skipping this file. Add it to the set. + will_skip.add(file_) + + will_remove = files | { + os.path.join(folder, "*") for folder in folders + } + + return will_remove, will_skip + + +class StashedUninstallPathSet(object): + """A set of file rename operations to stash files while + tentatively uninstalling them.""" + def __init__(self): + # type: () -> None + # Mapping from source file root to [Adjacent]TempDirectory + # for files under that directory. + self._save_dirs = {} # type: Dict[str, TempDirectory] + # (old path, new path) tuples for each move that may need + # to be undone. + self._moves = [] # type: List[Tuple[str, str]] + + def _get_directory_stash(self, path): + # type: (str) -> str + """Stashes a directory. + + Directories are stashed adjacent to their original location if + possible, or else moved/copied into the user's temp dir.""" + + try: + save_dir = AdjacentTempDirectory(path) # type: TempDirectory + except OSError: + save_dir = TempDirectory(kind="uninstall") + self._save_dirs[os.path.normcase(path)] = save_dir + + return save_dir.path + + def _get_file_stash(self, path): + # type: (str) -> str + """Stashes a file. + + If no root has been provided, one will be created for the directory + in the user's temp directory.""" + path = os.path.normcase(path) + head, old_head = os.path.dirname(path), None + save_dir = None + + while head != old_head: + try: + save_dir = self._save_dirs[head] + break + except KeyError: + pass + head, old_head = os.path.dirname(head), head + else: + # Did not find any suitable root + head = os.path.dirname(path) + save_dir = TempDirectory(kind='uninstall') + self._save_dirs[head] = save_dir + + relpath = os.path.relpath(path, head) + if relpath and relpath != os.path.curdir: + return os.path.join(save_dir.path, relpath) + return save_dir.path + + def stash(self, path): + # type: (str) -> str + """Stashes the directory or file and returns its new location. + Handle symlinks as files to avoid modifying the symlink targets. + """ + path_is_dir = os.path.isdir(path) and not os.path.islink(path) + if path_is_dir: + new_path = self._get_directory_stash(path) + else: + new_path = self._get_file_stash(path) + + self._moves.append((path, new_path)) + if (path_is_dir and os.path.isdir(new_path)): + # If we're moving a directory, we need to + # remove the destination first or else it will be + # moved to inside the existing directory. + # We just created new_path ourselves, so it will + # be removable. + os.rmdir(new_path) + renames(path, new_path) + return new_path + + def commit(self): + # type: () -> None + """Commits the uninstall by removing stashed files.""" + for _, save_dir in self._save_dirs.items(): + save_dir.cleanup() + self._moves = [] + self._save_dirs = {} + + def rollback(self): + # type: () -> None + """Undoes the uninstall by moving stashed files back.""" + for p in self._moves: + logger.info("Moving to %s\n from %s", *p) + + for new_path, path in self._moves: + try: + logger.debug('Replacing %s from %s', new_path, path) + if os.path.isfile(new_path) or os.path.islink(new_path): + os.unlink(new_path) + elif os.path.isdir(new_path): + rmtree(new_path) + renames(path, new_path) + except OSError as ex: + logger.error("Failed to restore %s", new_path) + logger.debug("Exception: %s", ex) + + self.commit() + + @property + def can_rollback(self): + # type: () -> bool + return bool(self._moves) + + +class UninstallPathSet(object): + """A set of file paths to be removed in the uninstallation of a + requirement.""" + def __init__(self, dist): + # type: (Distribution) -> None + self.paths = set() # type: Set[str] + self._refuse = set() # type: Set[str] + self.pth = {} # type: Dict[str, UninstallPthEntries] + self.dist = dist + self._moved_paths = StashedUninstallPathSet() + + def _permitted(self, path): + # type: (str) -> bool + """ + Return True if the given path is one we are permitted to + remove/modify, False otherwise. + + """ + return is_local(path) + + def add(self, path): + # type: (str) -> None + head, tail = os.path.split(path) + + # we normalize the head to resolve parent directory symlinks, but not + # the tail, since we only want to uninstall symlinks, not their targets + path = os.path.join(normalize_path(head), os.path.normcase(tail)) + + if not os.path.exists(path): + return + if self._permitted(path): + self.paths.add(path) + else: + self._refuse.add(path) + + # __pycache__ files can show up after 'installed-files.txt' is created, + # due to imports + if os.path.splitext(path)[1] == '.py' and uses_pycache: + self.add(cache_from_source(path)) + + def add_pth(self, pth_file, entry): + # type: (str, str) -> None + pth_file = normalize_path(pth_file) + if self._permitted(pth_file): + if pth_file not in self.pth: + self.pth[pth_file] = UninstallPthEntries(pth_file) + self.pth[pth_file].add(entry) + else: + self._refuse.add(pth_file) + + def remove(self, auto_confirm=False, verbose=False): + # type: (bool, bool) -> None + """Remove paths in ``self.paths`` with confirmation (unless + ``auto_confirm`` is True).""" + + if not self.paths: + logger.info( + "Can't uninstall '%s'. No files were found to uninstall.", + self.dist.project_name, + ) + return + + dist_name_version = ( + self.dist.project_name + "-" + self.dist.version + ) + logger.info('Uninstalling %s:', dist_name_version) + + with indent_log(): + if auto_confirm or self._allowed_to_proceed(verbose): + moved = self._moved_paths + + for_rename = compress_for_rename(self.paths) + + for path in sorted(compact(for_rename)): + moved.stash(path) + logger.debug('Removing file or directory %s', path) + + for pth in self.pth.values(): + pth.remove() + + logger.info('Successfully uninstalled %s', dist_name_version) + + def _allowed_to_proceed(self, verbose): + # type: (bool) -> bool + """Display which files would be deleted and prompt for confirmation + """ + + def _display(msg, paths): + # type: (str, Iterable[str]) -> None + if not paths: + return + + logger.info(msg) + with indent_log(): + for path in sorted(compact(paths)): + logger.info(path) + + if not verbose: + will_remove, will_skip = compress_for_output_listing(self.paths) + else: + # In verbose mode, display all the files that are going to be + # deleted. + will_remove = set(self.paths) + will_skip = set() + + _display('Would remove:', will_remove) + _display('Would not remove (might be manually added):', will_skip) + _display('Would not remove (outside of prefix):', self._refuse) + if verbose: + _display('Will actually move:', compress_for_rename(self.paths)) + + return ask('Proceed (y/n)? ', ('y', 'n')) == 'y' + + def rollback(self): + # type: () -> None + """Rollback the changes previously made by remove().""" + if not self._moved_paths.can_rollback: + logger.error( + "Can't roll back %s; was not uninstalled", + self.dist.project_name, + ) + return + logger.info('Rolling back uninstall of %s', self.dist.project_name) + self._moved_paths.rollback() + for pth in self.pth.values(): + pth.rollback() + + def commit(self): + # type: () -> None + """Remove temporary save dir: rollback will no longer be possible.""" + self._moved_paths.commit() + + @classmethod + def from_dist(cls, dist): + # type: (Distribution) -> UninstallPathSet + dist_path = normalize_path(dist.location) + if not dist_is_local(dist): + logger.info( + "Not uninstalling %s at %s, outside environment %s", + dist.key, + dist_path, + sys.prefix, + ) + return cls(dist) + + if dist_path in {p for p in {sysconfig.get_path("stdlib"), + sysconfig.get_path("platstdlib")} + if p}: + logger.info( + "Not uninstalling %s at %s, as it is in the standard library.", + dist.key, + dist_path, + ) + return cls(dist) + + paths_to_remove = cls(dist) + develop_egg_link = egg_link_path(dist) + develop_egg_link_egg_info = '{}.egg-info'.format( + pkg_resources.to_filename(dist.project_name)) + egg_info_exists = dist.egg_info and os.path.exists(dist.egg_info) + # Special case for distutils installed package + distutils_egg_info = getattr(dist._provider, 'path', None) + + # Uninstall cases order do matter as in the case of 2 installs of the + # same package, pip needs to uninstall the currently detected version + if (egg_info_exists and dist.egg_info.endswith('.egg-info') and + not dist.egg_info.endswith(develop_egg_link_egg_info)): + # if dist.egg_info.endswith(develop_egg_link_egg_info), we + # are in fact in the develop_egg_link case + paths_to_remove.add(dist.egg_info) + if dist.has_metadata('installed-files.txt'): + for installed_file in dist.get_metadata( + 'installed-files.txt').splitlines(): + path = os.path.normpath( + os.path.join(dist.egg_info, installed_file) + ) + paths_to_remove.add(path) + # FIXME: need a test for this elif block + # occurs with --single-version-externally-managed/--record outside + # of pip + elif dist.has_metadata('top_level.txt'): + if dist.has_metadata('namespace_packages.txt'): + namespaces = dist.get_metadata('namespace_packages.txt') + else: + namespaces = [] + for top_level_pkg in [ + p for p + in dist.get_metadata('top_level.txt').splitlines() + if p and p not in namespaces]: + path = os.path.join(dist.location, top_level_pkg) + paths_to_remove.add(path) + paths_to_remove.add(path + '.py') + paths_to_remove.add(path + '.pyc') + paths_to_remove.add(path + '.pyo') + + elif distutils_egg_info: + raise UninstallationError( + "Cannot uninstall {!r}. It is a distutils installed project " + "and thus we cannot accurately determine which files belong " + "to it which would lead to only a partial uninstall.".format( + dist.project_name, + ) + ) + + elif dist.location.endswith('.egg'): + # package installed by easy_install + # We cannot match on dist.egg_name because it can slightly vary + # i.e. setuptools-0.6c11-py2.6.egg vs setuptools-0.6rc11-py2.6.egg + paths_to_remove.add(dist.location) + easy_install_egg = os.path.split(dist.location)[1] + easy_install_pth = os.path.join(os.path.dirname(dist.location), + 'easy-install.pth') + paths_to_remove.add_pth(easy_install_pth, './' + easy_install_egg) + + elif egg_info_exists and dist.egg_info.endswith('.dist-info'): + for path in uninstallation_paths(dist): + paths_to_remove.add(path) + + elif develop_egg_link: + # develop egg + with open(develop_egg_link, 'r') as fh: + link_pointer = os.path.normcase(fh.readline().strip()) + assert (link_pointer == dist.location), ( + 'Egg-link %s does not match installed location of %s ' + '(at %s)' % (link_pointer, dist.project_name, dist.location) + ) + paths_to_remove.add(develop_egg_link) + easy_install_pth = os.path.join(os.path.dirname(develop_egg_link), + 'easy-install.pth') + paths_to_remove.add_pth(easy_install_pth, dist.location) + + else: + logger.debug( + 'Not sure how to uninstall: %s - Check: %s', + dist, dist.location, + ) + + # find distutils scripts= scripts + if dist.has_metadata('scripts') and dist.metadata_isdir('scripts'): + for script in dist.metadata_listdir('scripts'): + if dist_in_usersite(dist): + bin_dir = bin_user + else: + bin_dir = bin_py + paths_to_remove.add(os.path.join(bin_dir, script)) + if WINDOWS: + paths_to_remove.add(os.path.join(bin_dir, script) + '.bat') + + # find console_scripts + _scripts_to_remove = [] + console_scripts = dist.get_entry_map(group='console_scripts') + for name in console_scripts.keys(): + _scripts_to_remove.extend(_script_names(dist, name, False)) + # find gui_scripts + gui_scripts = dist.get_entry_map(group='gui_scripts') + for name in gui_scripts.keys(): + _scripts_to_remove.extend(_script_names(dist, name, True)) + + for s in _scripts_to_remove: + paths_to_remove.add(s) + + return paths_to_remove + + +class UninstallPthEntries(object): + def __init__(self, pth_file): + # type: (str) -> None + if not os.path.isfile(pth_file): + raise UninstallationError( + "Cannot remove entries from nonexistent file %s" % pth_file + ) + self.file = pth_file + self.entries = set() # type: Set[str] + self._saved_lines = None # type: Optional[List[bytes]] + + def add(self, entry): + # type: (str) -> None + entry = os.path.normcase(entry) + # On Windows, os.path.normcase converts the entry to use + # backslashes. This is correct for entries that describe absolute + # paths outside of site-packages, but all the others use forward + # slashes. + # os.path.splitdrive is used instead of os.path.isabs because isabs + # treats non-absolute paths with drive letter markings like c:foo\bar + # as absolute paths. It also does not recognize UNC paths if they don't + # have more than "\\sever\share". Valid examples: "\\server\share\" or + # "\\server\share\folder". Python 2.7.8+ support UNC in splitdrive. + if WINDOWS and not os.path.splitdrive(entry)[0]: + entry = entry.replace('\\', '/') + self.entries.add(entry) + + def remove(self): + # type: () -> None + logger.debug('Removing pth entries from %s:', self.file) + with open(self.file, 'rb') as fh: + # windows uses '\r\n' with py3k, but uses '\n' with py2.x + lines = fh.readlines() + self._saved_lines = lines + if any(b'\r\n' in line for line in lines): + endline = '\r\n' + else: + endline = '\n' + # handle missing trailing newline + if lines and not lines[-1].endswith(endline.encode("utf-8")): + lines[-1] = lines[-1] + endline.encode("utf-8") + for entry in self.entries: + try: + logger.debug('Removing entry: %s', entry) + lines.remove((entry + endline).encode("utf-8")) + except ValueError: + pass + with open(self.file, 'wb') as fh: + fh.writelines(lines) + + def rollback(self): + # type: () -> bool + if self._saved_lines is None: + logger.error( + 'Cannot roll back changes to %s, none were made', self.file + ) + return False + logger.debug('Rolling %s back to previous state', self.file) + with open(self.file, 'wb') as fh: + fh.writelines(self._saved_lines) + return True diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/req/req_uninstall.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/req/req_uninstall.py new file mode 100644 index 0000000..5971b13 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/req/req_uninstall.py @@ -0,0 +1,644 @@ +from __future__ import absolute_import + +import csv +import functools +import logging +import os +import sys +import sysconfig + +from pip._vendor import pkg_resources + +from pip._internal.exceptions import UninstallationError +from pip._internal.locations import bin_py, bin_user +from pip._internal.utils.compat import WINDOWS, cache_from_source, uses_pycache +from pip._internal.utils.logging import indent_log +from pip._internal.utils.misc import ( + FakeFile, + ask, + dist_in_usersite, + dist_is_local, + egg_link_path, + is_local, + normalize_path, + renames, + rmtree, +) +from pip._internal.utils.temp_dir import AdjacentTempDirectory, TempDirectory +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import ( + Any, Callable, Dict, Iterable, Iterator, List, Optional, Set, Tuple, + ) + from pip._vendor.pkg_resources import Distribution + +logger = logging.getLogger(__name__) + + +def _script_names(dist, script_name, is_gui): + # type: (Distribution, str, bool) -> List[str] + """Create the fully qualified name of the files created by + {console,gui}_scripts for the given ``dist``. + Returns the list of file names + """ + if dist_in_usersite(dist): + bin_dir = bin_user + else: + bin_dir = bin_py + exe_name = os.path.join(bin_dir, script_name) + paths_to_remove = [exe_name] + if WINDOWS: + paths_to_remove.append(exe_name + '.exe') + paths_to_remove.append(exe_name + '.exe.manifest') + if is_gui: + paths_to_remove.append(exe_name + '-script.pyw') + else: + paths_to_remove.append(exe_name + '-script.py') + return paths_to_remove + + +def _unique(fn): + # type: (Callable[..., Iterator[Any]]) -> Callable[..., Iterator[Any]] + @functools.wraps(fn) + def unique(*args, **kw): + # type: (Any, Any) -> Iterator[Any] + seen = set() # type: Set[Any] + for item in fn(*args, **kw): + if item not in seen: + seen.add(item) + yield item + return unique + + +@_unique +def uninstallation_paths(dist): + # type: (Distribution) -> Iterator[str] + """ + Yield all the uninstallation paths for dist based on RECORD-without-.py[co] + + Yield paths to all the files in RECORD. For each .py file in RECORD, add + the .pyc and .pyo in the same directory. + + UninstallPathSet.add() takes care of the __pycache__ .py[co]. + """ + r = csv.reader(FakeFile(dist.get_metadata_lines('RECORD'))) + for row in r: + path = os.path.join(dist.location, row[0]) + yield path + if path.endswith('.py'): + dn, fn = os.path.split(path) + base = fn[:-3] + path = os.path.join(dn, base + '.pyc') + yield path + path = os.path.join(dn, base + '.pyo') + yield path + + +def compact(paths): + # type: (Iterable[str]) -> Set[str] + """Compact a path set to contain the minimal number of paths + necessary to contain all paths in the set. If /a/path/ and + /a/path/to/a/file.txt are both in the set, leave only the + shorter path.""" + + sep = os.path.sep + short_paths = set() # type: Set[str] + for path in sorted(paths, key=len): + should_skip = any( + path.startswith(shortpath.rstrip("*")) and + path[len(shortpath.rstrip("*").rstrip(sep))] == sep + for shortpath in short_paths + ) + if not should_skip: + short_paths.add(path) + return short_paths + + +def compress_for_rename(paths): + # type: (Iterable[str]) -> Set[str] + """Returns a set containing the paths that need to be renamed. + + This set may include directories when the original sequence of paths + included every file on disk. + """ + case_map = dict((os.path.normcase(p), p) for p in paths) + remaining = set(case_map) + unchecked = sorted(set(os.path.split(p)[0] + for p in case_map.values()), key=len) + wildcards = set() # type: Set[str] + + def norm_join(*a): + # type: (str) -> str + return os.path.normcase(os.path.join(*a)) + + for root in unchecked: + if any(os.path.normcase(root).startswith(w) + for w in wildcards): + # This directory has already been handled. + continue + + all_files = set() # type: Set[str] + all_subdirs = set() # type: Set[str] + for dirname, subdirs, files in os.walk(root): + all_subdirs.update(norm_join(root, dirname, d) + for d in subdirs) + all_files.update(norm_join(root, dirname, f) + for f in files) + # If all the files we found are in our remaining set of files to + # remove, then remove them from the latter set and add a wildcard + # for the directory. + if not (all_files - remaining): + remaining.difference_update(all_files) + wildcards.add(root + os.sep) + + return set(map(case_map.__getitem__, remaining)) | wildcards + + +def compress_for_output_listing(paths): + # type: (Iterable[str]) -> Tuple[Set[str], Set[str]] + """Returns a tuple of 2 sets of which paths to display to user + + The first set contains paths that would be deleted. Files of a package + are not added and the top-level directory of the package has a '*' added + at the end - to signify that all it's contents are removed. + + The second set contains files that would have been skipped in the above + folders. + """ + + will_remove = set(paths) + will_skip = set() + + # Determine folders and files + folders = set() + files = set() + for path in will_remove: + if path.endswith(".pyc"): + continue + if path.endswith("__init__.py") or ".dist-info" in path: + folders.add(os.path.dirname(path)) + files.add(path) + + # probably this one https://github.com/python/mypy/issues/390 + _normcased_files = set(map(os.path.normcase, files)) # type: ignore + + folders = compact(folders) + + # This walks the tree using os.walk to not miss extra folders + # that might get added. + for folder in folders: + for dirpath, _, dirfiles in os.walk(folder): + for fname in dirfiles: + if fname.endswith(".pyc"): + continue + + file_ = os.path.join(dirpath, fname) + if (os.path.isfile(file_) and + os.path.normcase(file_) not in _normcased_files): + # We are skipping this file. Add it to the set. + will_skip.add(file_) + + will_remove = files | { + os.path.join(folder, "*") for folder in folders + } + + return will_remove, will_skip + + +class StashedUninstallPathSet(object): + """A set of file rename operations to stash files while + tentatively uninstalling them.""" + def __init__(self): + # type: () -> None + # Mapping from source file root to [Adjacent]TempDirectory + # for files under that directory. + self._save_dirs = {} # type: Dict[str, TempDirectory] + # (old path, new path) tuples for each move that may need + # to be undone. + self._moves = [] # type: List[Tuple[str, str]] + + def _get_directory_stash(self, path): + # type: (str) -> str + """Stashes a directory. + + Directories are stashed adjacent to their original location if + possible, or else moved/copied into the user's temp dir.""" + + try: + save_dir = AdjacentTempDirectory(path) # type: TempDirectory + except OSError: + save_dir = TempDirectory(kind="uninstall") + self._save_dirs[os.path.normcase(path)] = save_dir + + return save_dir.path + + def _get_file_stash(self, path): + # type: (str) -> str + """Stashes a file. + + If no root has been provided, one will be created for the directory + in the user's temp directory.""" + path = os.path.normcase(path) + head, old_head = os.path.dirname(path), None + save_dir = None + + while head != old_head: + try: + save_dir = self._save_dirs[head] + break + except KeyError: + pass + head, old_head = os.path.dirname(head), head + else: + # Did not find any suitable root + head = os.path.dirname(path) + save_dir = TempDirectory(kind='uninstall') + self._save_dirs[head] = save_dir + + relpath = os.path.relpath(path, head) + if relpath and relpath != os.path.curdir: + return os.path.join(save_dir.path, relpath) + return save_dir.path + + def stash(self, path): + # type: (str) -> str + """Stashes the directory or file and returns its new location. + Handle symlinks as files to avoid modifying the symlink targets. + """ + path_is_dir = os.path.isdir(path) and not os.path.islink(path) + if path_is_dir: + new_path = self._get_directory_stash(path) + else: + new_path = self._get_file_stash(path) + + self._moves.append((path, new_path)) + if (path_is_dir and os.path.isdir(new_path)): + # If we're moving a directory, we need to + # remove the destination first or else it will be + # moved to inside the existing directory. + # We just created new_path ourselves, so it will + # be removable. + os.rmdir(new_path) + renames(path, new_path) + return new_path + + def commit(self): + # type: () -> None + """Commits the uninstall by removing stashed files.""" + for _, save_dir in self._save_dirs.items(): + save_dir.cleanup() + self._moves = [] + self._save_dirs = {} + + def rollback(self): + # type: () -> None + """Undoes the uninstall by moving stashed files back.""" + for p in self._moves: + logger.info("Moving to %s\n from %s", *p) + + for new_path, path in self._moves: + try: + logger.debug('Replacing %s from %s', new_path, path) + if os.path.isfile(new_path) or os.path.islink(new_path): + os.unlink(new_path) + elif os.path.isdir(new_path): + rmtree(new_path) + renames(path, new_path) + except OSError as ex: + logger.error("Failed to restore %s", new_path) + logger.debug("Exception: %s", ex) + + self.commit() + + @property + def can_rollback(self): + # type: () -> bool + return bool(self._moves) + + +class UninstallPathSet(object): + """A set of file paths to be removed in the uninstallation of a + requirement.""" + def __init__(self, dist): + # type: (Distribution) -> None + self.paths = set() # type: Set[str] + self._refuse = set() # type: Set[str] + self.pth = {} # type: Dict[str, UninstallPthEntries] + self.dist = dist + self._moved_paths = StashedUninstallPathSet() + + def _permitted(self, path): + # type: (str) -> bool + """ + Return True if the given path is one we are permitted to + remove/modify, False otherwise. + + """ + return is_local(path) + + def add(self, path): + # type: (str) -> None + head, tail = os.path.split(path) + + # we normalize the head to resolve parent directory symlinks, but not + # the tail, since we only want to uninstall symlinks, not their targets + path = os.path.join(normalize_path(head), os.path.normcase(tail)) + + if not os.path.exists(path): + return + if self._permitted(path): + self.paths.add(path) + else: + self._refuse.add(path) + + # __pycache__ files can show up after 'installed-files.txt' is created, + # due to imports + if os.path.splitext(path)[1] == '.py' and uses_pycache: + self.add(cache_from_source(path)) + + def add_pth(self, pth_file, entry): + # type: (str, str) -> None + pth_file = normalize_path(pth_file) + if self._permitted(pth_file): + if pth_file not in self.pth: + self.pth[pth_file] = UninstallPthEntries(pth_file) + self.pth[pth_file].add(entry) + else: + self._refuse.add(pth_file) + + def remove(self, auto_confirm=False, verbose=False): + # type: (bool, bool) -> None + """Remove paths in ``self.paths`` with confirmation (unless + ``auto_confirm`` is True).""" + + if not self.paths: + logger.info( + "Can't uninstall '%s'. No files were found to uninstall.", + self.dist.project_name, + ) + return + + dist_name_version = ( + self.dist.project_name + "-" + self.dist.version + ) + logger.info('Uninstalling %s:', dist_name_version) + + with indent_log(): + if auto_confirm or self._allowed_to_proceed(verbose): + moved = self._moved_paths + + for_rename = compress_for_rename(self.paths) + + for path in sorted(compact(for_rename)): + moved.stash(path) + logger.debug('Removing file or directory %s', path) + + for pth in self.pth.values(): + pth.remove() + + logger.info('Successfully uninstalled %s', dist_name_version) + + def _allowed_to_proceed(self, verbose): + # type: (bool) -> bool + """Display which files would be deleted and prompt for confirmation + """ + + def _display(msg, paths): + # type: (str, Iterable[str]) -> None + if not paths: + return + + logger.info(msg) + with indent_log(): + for path in sorted(compact(paths)): + logger.info(path) + + if not verbose: + will_remove, will_skip = compress_for_output_listing(self.paths) + else: + # In verbose mode, display all the files that are going to be + # deleted. + will_remove = set(self.paths) + will_skip = set() + + _display('Would remove:', will_remove) + _display('Would not remove (might be manually added):', will_skip) + _display('Would not remove (outside of prefix):', self._refuse) + if verbose: + _display('Will actually move:', compress_for_rename(self.paths)) + + return ask('Proceed (y/n)? ', ('y', 'n')) == 'y' + + def rollback(self): + # type: () -> None + """Rollback the changes previously made by remove().""" + if not self._moved_paths.can_rollback: + logger.error( + "Can't roll back %s; was not uninstalled", + self.dist.project_name, + ) + return + logger.info('Rolling back uninstall of %s', self.dist.project_name) + self._moved_paths.rollback() + for pth in self.pth.values(): + pth.rollback() + + def commit(self): + # type: () -> None + """Remove temporary save dir: rollback will no longer be possible.""" + self._moved_paths.commit() + + @classmethod + def from_dist(cls, dist): + # type: (Distribution) -> UninstallPathSet + dist_path = normalize_path(dist.location) + if not dist_is_local(dist): + logger.info( + "Not uninstalling %s at %s, outside environment %s", + dist.key, + dist_path, + sys.prefix, + ) + return cls(dist) + + if dist_path in {p for p in {sysconfig.get_path("stdlib"), + sysconfig.get_path("platstdlib")} + if p}: + logger.info( + "Not uninstalling %s at %s, as it is in the standard library.", + dist.key, + dist_path, + ) + return cls(dist) + + paths_to_remove = cls(dist) + develop_egg_link = egg_link_path(dist) + develop_egg_link_egg_info = '{}.egg-info'.format( + pkg_resources.to_filename(dist.project_name)) + egg_info_exists = dist.egg_info and os.path.exists(dist.egg_info) + # Special case for distutils installed package + distutils_egg_info = getattr(dist._provider, 'path', None) + + # Uninstall cases order do matter as in the case of 2 installs of the + # same package, pip needs to uninstall the currently detected version + if (egg_info_exists and dist.egg_info.endswith('.egg-info') and + not dist.egg_info.endswith(develop_egg_link_egg_info)): + # if dist.egg_info.endswith(develop_egg_link_egg_info), we + # are in fact in the develop_egg_link case + paths_to_remove.add(dist.egg_info) + if dist.has_metadata('installed-files.txt'): + for installed_file in dist.get_metadata( + 'installed-files.txt').splitlines(): + path = os.path.normpath( + os.path.join(dist.egg_info, installed_file) + ) + paths_to_remove.add(path) + # FIXME: need a test for this elif block + # occurs with --single-version-externally-managed/--record outside + # of pip + elif dist.has_metadata('top_level.txt'): + if dist.has_metadata('namespace_packages.txt'): + namespaces = dist.get_metadata('namespace_packages.txt') + else: + namespaces = [] + for top_level_pkg in [ + p for p + in dist.get_metadata('top_level.txt').splitlines() + if p and p not in namespaces]: + path = os.path.join(dist.location, top_level_pkg) + paths_to_remove.add(path) + paths_to_remove.add(path + '.py') + paths_to_remove.add(path + '.pyc') + paths_to_remove.add(path + '.pyo') + + elif distutils_egg_info: + raise UninstallationError( + "Cannot uninstall {!r}. It is a distutils installed project " + "and thus we cannot accurately determine which files belong " + "to it which would lead to only a partial uninstall.".format( + dist.project_name, + ) + ) + + elif dist.location.endswith('.egg'): + # package installed by easy_install + # We cannot match on dist.egg_name because it can slightly vary + # i.e. setuptools-0.6c11-py2.6.egg vs setuptools-0.6rc11-py2.6.egg + paths_to_remove.add(dist.location) + easy_install_egg = os.path.split(dist.location)[1] + easy_install_pth = os.path.join(os.path.dirname(dist.location), + 'easy-install.pth') + paths_to_remove.add_pth(easy_install_pth, './' + easy_install_egg) + + elif egg_info_exists and dist.egg_info.endswith('.dist-info'): + for path in uninstallation_paths(dist): + paths_to_remove.add(path) + + elif develop_egg_link: + # develop egg + with open(develop_egg_link, 'r') as fh: + link_pointer = os.path.normcase(fh.readline().strip()) + assert (link_pointer == dist.location), ( + 'Egg-link %s does not match installed location of %s ' + '(at %s)' % (link_pointer, dist.project_name, dist.location) + ) + paths_to_remove.add(develop_egg_link) + easy_install_pth = os.path.join(os.path.dirname(develop_egg_link), + 'easy-install.pth') + paths_to_remove.add_pth(easy_install_pth, dist.location) + + else: + logger.debug( + 'Not sure how to uninstall: %s - Check: %s', + dist, dist.location, + ) + + # find distutils scripts= scripts + if dist.has_metadata('scripts') and dist.metadata_isdir('scripts'): + for script in dist.metadata_listdir('scripts'): + if dist_in_usersite(dist): + bin_dir = bin_user + else: + bin_dir = bin_py + paths_to_remove.add(os.path.join(bin_dir, script)) + if WINDOWS: + paths_to_remove.add(os.path.join(bin_dir, script) + '.bat') + + # find console_scripts + _scripts_to_remove = [] + console_scripts = dist.get_entry_map(group='console_scripts') + for name in console_scripts.keys(): + _scripts_to_remove.extend(_script_names(dist, name, False)) + # find gui_scripts + gui_scripts = dist.get_entry_map(group='gui_scripts') + for name in gui_scripts.keys(): + _scripts_to_remove.extend(_script_names(dist, name, True)) + + for s in _scripts_to_remove: + paths_to_remove.add(s) + + return paths_to_remove + + +class UninstallPthEntries(object): + def __init__(self, pth_file): + # type: (str) -> None + if not os.path.isfile(pth_file): + raise UninstallationError( + "Cannot remove entries from nonexistent file %s" % pth_file + ) + self.file = pth_file + self.entries = set() # type: Set[str] + self._saved_lines = None # type: Optional[List[bytes]] + + def add(self, entry): + # type: (str) -> None + entry = os.path.normcase(entry) + # On Windows, os.path.normcase converts the entry to use + # backslashes. This is correct for entries that describe absolute + # paths outside of site-packages, but all the others use forward + # slashes. + # os.path.splitdrive is used instead of os.path.isabs because isabs + # treats non-absolute paths with drive letter markings like c:foo\bar + # as absolute paths. It also does not recognize UNC paths if they don't + # have more than "\\sever\share". Valid examples: "\\server\share\" or + # "\\server\share\folder". Python 2.7.8+ support UNC in splitdrive. + if WINDOWS and not os.path.splitdrive(entry)[0]: + entry = entry.replace('\\', '/') + self.entries.add(entry) + + def remove(self): + # type: () -> None + logger.debug('Removing pth entries from %s:', self.file) + with open(self.file, 'rb') as fh: + # windows uses '\r\n' with py3k, but uses '\n' with py2.x + lines = fh.readlines() + self._saved_lines = lines + if any(b'\r\n' in line for line in lines): + endline = '\r\n' + else: + endline = '\n' + # handle missing trailing newline + if lines and not lines[-1].endswith(endline.encode("utf-8")): + lines[-1] = lines[-1] + endline.encode("utf-8") + for entry in self.entries: + try: + logger.debug('Removing entry: %s', entry) + lines.remove((entry + endline).encode("utf-8")) + except ValueError: + pass + with open(self.file, 'wb') as fh: + fh.writelines(lines) + + def rollback(self): + # type: () -> bool + if self._saved_lines is None: + logger.error( + 'Cannot roll back changes to %s, none were made', self.file + ) + return False + logger.debug('Rolling %s back to previous state', self.file) + with open(self.file, 'wb') as fh: + fh.writelines(self._saved_lines) + return True diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/req/req_uninstall.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/req/req_uninstall.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a96e3fbe1a194d0b62dc88838e5dadc94b017957 GIT binary patch literal 23716 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 HCjWl{L;Stg literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/self_outdated_check 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/self_outdated_check 2.py new file mode 100644 index 0000000..8fc3c59 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/self_outdated_check 2.py @@ -0,0 +1,242 @@ +# The following comment should be removed at some point in the future. +# mypy: disallow-untyped-defs=False + +from __future__ import absolute_import + +import datetime +import hashlib +import json +import logging +import os.path +import sys + +from pip._vendor import pkg_resources +from pip._vendor.packaging import version as packaging_version +from pip._vendor.six import ensure_binary + +from pip._internal.index.collector import LinkCollector +from pip._internal.index.package_finder import PackageFinder +from pip._internal.models.search_scope import SearchScope +from pip._internal.models.selection_prefs import SelectionPreferences +from pip._internal.utils.filesystem import ( + adjacent_tmp_file, + check_path_owner, + replace, +) +from pip._internal.utils.misc import ( + ensure_dir, + get_installed_version, + redact_auth_from_url, +) +from pip._internal.utils.packaging import get_installer +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + import optparse + from optparse import Values + from typing import Any, Dict, Text, Union + + from pip._internal.network.session import PipSession + + +SELFCHECK_DATE_FMT = "%Y-%m-%dT%H:%M:%SZ" + + +logger = logging.getLogger(__name__) + + +def make_link_collector( + session, # type: PipSession + options, # type: Values + suppress_no_index=False, # type: bool +): + # type: (...) -> LinkCollector + """ + :param session: The Session to use to make requests. + :param suppress_no_index: Whether to ignore the --no-index option + when constructing the SearchScope object. + """ + index_urls = [options.index_url] + options.extra_index_urls + if options.no_index and not suppress_no_index: + logger.debug( + 'Ignoring indexes: %s', + ','.join(redact_auth_from_url(url) for url in index_urls), + ) + index_urls = [] + + # Make sure find_links is a list before passing to create(). + find_links = options.find_links or [] + + search_scope = SearchScope.create( + find_links=find_links, index_urls=index_urls, + ) + + link_collector = LinkCollector(session=session, search_scope=search_scope) + + return link_collector + + +def _get_statefile_name(key): + # type: (Union[str, Text]) -> str + key_bytes = ensure_binary(key) + name = hashlib.sha224(key_bytes).hexdigest() + return name + + +class SelfCheckState(object): + def __init__(self, cache_dir): + # type: (str) -> None + self.state = {} # type: Dict[str, Any] + self.statefile_path = None + + # Try to load the existing state + if cache_dir: + self.statefile_path = os.path.join( + cache_dir, "selfcheck", _get_statefile_name(self.key) + ) + try: + with open(self.statefile_path) as statefile: + self.state = json.load(statefile) + except (IOError, ValueError, KeyError): + # Explicitly suppressing exceptions, since we don't want to + # error out if the cache file is invalid. + pass + + @property + def key(self): + return sys.prefix + + def save(self, pypi_version, current_time): + # type: (str, datetime.datetime) -> None + # If we do not have a path to cache in, don't bother saving. + if not self.statefile_path: + return + + # Check to make sure that we own the directory + if not check_path_owner(os.path.dirname(self.statefile_path)): + return + + # Now that we've ensured the directory is owned by this user, we'll go + # ahead and make sure that all our directories are created. + ensure_dir(os.path.dirname(self.statefile_path)) + + state = { + # Include the key so it's easy to tell which pip wrote the + # file. + "key": self.key, + "last_check": current_time.strftime(SELFCHECK_DATE_FMT), + "pypi_version": pypi_version, + } + + text = json.dumps(state, sort_keys=True, separators=(",", ":")) + + with adjacent_tmp_file(self.statefile_path) as f: + f.write(ensure_binary(text)) + + try: + # Since we have a prefix-specific state file, we can just + # overwrite whatever is there, no need to check. + replace(f.name, self.statefile_path) + except OSError: + # Best effort. + pass + + +def was_installed_by_pip(pkg): + # type: (str) -> bool + """Checks whether pkg was installed by pip + + This is used not to display the upgrade message when pip is in fact + installed by system package manager, such as dnf on Fedora. + """ + try: + dist = pkg_resources.get_distribution(pkg) + return "pip" == get_installer(dist) + except pkg_resources.DistributionNotFound: + return False + + +def pip_self_version_check(session, options): + # type: (PipSession, optparse.Values) -> None + """Check for an update for pip. + + Limit the frequency of checks to once per week. State is stored either in + the active virtualenv or in the user's USER_CACHE_DIR keyed off the prefix + of the pip script path. + """ + installed_version = get_installed_version("pip") + if not installed_version: + return + + pip_version = packaging_version.parse(installed_version) + pypi_version = None + + try: + state = SelfCheckState(cache_dir=options.cache_dir) + + current_time = datetime.datetime.utcnow() + # Determine if we need to refresh the state + if "last_check" in state.state and "pypi_version" in state.state: + last_check = datetime.datetime.strptime( + state.state["last_check"], + SELFCHECK_DATE_FMT + ) + if (current_time - last_check).total_seconds() < 7 * 24 * 60 * 60: + pypi_version = state.state["pypi_version"] + + # Refresh the version if we need to or just see if we need to warn + if pypi_version is None: + # Lets use PackageFinder to see what the latest pip version is + link_collector = make_link_collector( + session, + options=options, + suppress_no_index=True, + ) + + # Pass allow_yanked=False so we don't suggest upgrading to a + # yanked version. + selection_prefs = SelectionPreferences( + allow_yanked=False, + allow_all_prereleases=False, # Explicitly set to False + ) + + finder = PackageFinder.create( + link_collector=link_collector, + selection_prefs=selection_prefs, + ) + best_candidate = finder.find_best_candidate("pip").best_candidate + if best_candidate is None: + return + pypi_version = str(best_candidate.version) + + # save that we've performed a check + state.save(pypi_version, current_time) + + remote_version = packaging_version.parse(pypi_version) + + local_version_is_older = ( + pip_version < remote_version and + pip_version.base_version != remote_version.base_version and + was_installed_by_pip('pip') + ) + + # Determine if our pypi_version is older + if not local_version_is_older: + return + + # We cannot tell how the current pip is available in the current + # command context, so be pragmatic here and suggest the command + # that's always available. This does not accommodate spaces in + # `sys.executable`. + pip_cmd = "{} -m pip".format(sys.executable) + logger.warning( + "You are using pip version %s; however, version %s is " + "available.\nYou should consider upgrading via the " + "'%s install --upgrade pip' command.", + pip_version, pypi_version, pip_cmd + ) + except Exception: + logger.debug( + "There was an error checking the latest version of pip", + exc_info=True, + ) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/self_outdated_check 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/self_outdated_check 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bd91ae2bd9eb783af9a6c82fa5c68aca608dd3bf GIT binary patch literal 7358 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 LinkCollector + """ + :param session: The Session to use to make requests. + :param suppress_no_index: Whether to ignore the --no-index option + when constructing the SearchScope object. + """ + index_urls = [options.index_url] + options.extra_index_urls + if options.no_index and not suppress_no_index: + logger.debug( + 'Ignoring indexes: %s', + ','.join(redact_auth_from_url(url) for url in index_urls), + ) + index_urls = [] + + # Make sure find_links is a list before passing to create(). + find_links = options.find_links or [] + + search_scope = SearchScope.create( + find_links=find_links, index_urls=index_urls, + ) + + link_collector = LinkCollector(session=session, search_scope=search_scope) + + return link_collector + + +def _get_statefile_name(key): + # type: (Union[str, Text]) -> str + key_bytes = ensure_binary(key) + name = hashlib.sha224(key_bytes).hexdigest() + return name + + +class SelfCheckState(object): + def __init__(self, cache_dir): + # type: (str) -> None + self.state = {} # type: Dict[str, Any] + self.statefile_path = None + + # Try to load the existing state + if cache_dir: + self.statefile_path = os.path.join( + cache_dir, "selfcheck", _get_statefile_name(self.key) + ) + try: + with open(self.statefile_path) as statefile: + self.state = json.load(statefile) + except (IOError, ValueError, KeyError): + # Explicitly suppressing exceptions, since we don't want to + # error out if the cache file is invalid. + pass + + @property + def key(self): + return sys.prefix + + def save(self, pypi_version, current_time): + # type: (str, datetime.datetime) -> None + # If we do not have a path to cache in, don't bother saving. + if not self.statefile_path: + return + + # Check to make sure that we own the directory + if not check_path_owner(os.path.dirname(self.statefile_path)): + return + + # Now that we've ensured the directory is owned by this user, we'll go + # ahead and make sure that all our directories are created. + ensure_dir(os.path.dirname(self.statefile_path)) + + state = { + # Include the key so it's easy to tell which pip wrote the + # file. + "key": self.key, + "last_check": current_time.strftime(SELFCHECK_DATE_FMT), + "pypi_version": pypi_version, + } + + text = json.dumps(state, sort_keys=True, separators=(",", ":")) + + with adjacent_tmp_file(self.statefile_path) as f: + f.write(ensure_binary(text)) + + try: + # Since we have a prefix-specific state file, we can just + # overwrite whatever is there, no need to check. + replace(f.name, self.statefile_path) + except OSError: + # Best effort. + pass + + +def was_installed_by_pip(pkg): + # type: (str) -> bool + """Checks whether pkg was installed by pip + + This is used not to display the upgrade message when pip is in fact + installed by system package manager, such as dnf on Fedora. + """ + try: + dist = pkg_resources.get_distribution(pkg) + return "pip" == get_installer(dist) + except pkg_resources.DistributionNotFound: + return False + + +def pip_self_version_check(session, options): + # type: (PipSession, optparse.Values) -> None + """Check for an update for pip. + + Limit the frequency of checks to once per week. State is stored either in + the active virtualenv or in the user's USER_CACHE_DIR keyed off the prefix + of the pip script path. + """ + installed_version = get_installed_version("pip") + if not installed_version: + return + + pip_version = packaging_version.parse(installed_version) + pypi_version = None + + try: + state = SelfCheckState(cache_dir=options.cache_dir) + + current_time = datetime.datetime.utcnow() + # Determine if we need to refresh the state + if "last_check" in state.state and "pypi_version" in state.state: + last_check = datetime.datetime.strptime( + state.state["last_check"], + SELFCHECK_DATE_FMT + ) + if (current_time - last_check).total_seconds() < 7 * 24 * 60 * 60: + pypi_version = state.state["pypi_version"] + + # Refresh the version if we need to or just see if we need to warn + if pypi_version is None: + # Lets use PackageFinder to see what the latest pip version is + link_collector = make_link_collector( + session, + options=options, + suppress_no_index=True, + ) + + # Pass allow_yanked=False so we don't suggest upgrading to a + # yanked version. + selection_prefs = SelectionPreferences( + allow_yanked=False, + allow_all_prereleases=False, # Explicitly set to False + ) + + finder = PackageFinder.create( + link_collector=link_collector, + selection_prefs=selection_prefs, + ) + best_candidate = finder.find_best_candidate("pip").best_candidate + if best_candidate is None: + return + pypi_version = str(best_candidate.version) + + # save that we've performed a check + state.save(pypi_version, current_time) + + remote_version = packaging_version.parse(pypi_version) + + local_version_is_older = ( + pip_version < remote_version and + pip_version.base_version != remote_version.base_version and + was_installed_by_pip('pip') + ) + + # Determine if our pypi_version is older + if not local_version_is_older: + return + + # We cannot tell how the current pip is available in the current + # command context, so be pragmatic here and suggest the command + # that's always available. This does not accommodate spaces in + # `sys.executable`. + pip_cmd = "{} -m pip".format(sys.executable) + logger.warning( + "You are using pip version %s; however, version %s is " + "available.\nYou should consider upgrading via the " + "'%s install --upgrade pip' command.", + pip_version, pypi_version, pip_cmd + ) + except Exception: + logger.debug( + "There was an error checking the latest version of pip", + exc_info=True, + ) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/self_outdated_check.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/self_outdated_check.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b79caa11fd701fbb32c4a38c1fef3c5b556ee40a GIT binary patch literal 7358 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 CY2%~- literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/__init__ 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/__init__ 2.py new file mode 100644 index 0000000..e69de29 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/__init__ 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/__init__ 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4c4cd0a9cad278191c1056b440fcf4493edef00c GIT binary patch literal 198 zcmZSn%*%E1fNfkd0~9aGq1QL zF(*gY(Z#hmAQU77#_^eXC81 literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/__init__.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/__init__.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e3c93cb0c9541cc5de106a43f432cc5e46649e2f GIT binary patch literal 198 zcmZSn%*$1A&^9ia0SXv_v;z str + return _appdirs.user_cache_dir(appname, appauthor=False) + + +def user_config_dir(appname, roaming=True): + # type: (str, bool) -> str + return _appdirs.user_config_dir(appname, appauthor=False, roaming=roaming) + + +def user_data_dir(appname, roaming=False): + # type: (str, bool) -> str + return _appdirs.user_data_dir(appname, appauthor=False, roaming=roaming) + + +def site_config_dirs(appname): + # type: (str) -> List[str] + dirval = _appdirs.site_config_dir(appname, appauthor=False, multipath=True) + if _appdirs.system not in ["win32", "darwin"]: + return dirval.split(os.pathsep) + return [dirval] diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/appdirs 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/appdirs 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fbf1ddc33bd5b39cd5f3687af8fd7716cd57f245 GIT binary patch literal 2033 zcmd5-OOG2x5Uv@oA3NF2nuJ6G4)lS84~ZvXBO##>ZL|pw0ai4-ImAeedZ*jtcIK7t z8n2APDY@idapm`L;zm`EL)dWSu-NLJ?y8!quCKnX>HV=E{r=lmKWDK0h4ef+0&s6= zp#bJI2cSYI0w_b6hY;|-2SpF&J+Iq=Vh74T%meTyww1TT__`% zM-WuxbO^7>`xVf8phoaIfcZY?tDtuM`T$hq4aOYnWO9X0qJ?rw$K7=;c9PTHMX`AYgx3~32Akd)ny~moRQh0w%#aft<@EZ z#xz}oGwJj+qL5mc3Q1+^N>F(6YxTJ`sKwiNS|@YzoLi|{SrnUF;Qw z>D;YIR!V3(F?u_pY~7Fzd6f&)R?y30>x_;mvZbtYt)`KoeQ4? zZE@CVhOFr@=mghD@Z+;5&(h;>A0L08CQoOx?`Ge0x*gK}U>s)blm`orj|k}Nv_ODW z055&{F@#q^a57(`J(lDC7+qjx&QW;|C9xdn7)h z#d}E5U3eJ~9^r}4eU>n6$jIATmQ-;sPB>*>sSb*|T9}-%NZ8UNnJ{Vzqj|X?M0A3W zY5Zppx?GqLUH1F5^4Tki^8cAT_mxlokvm_53j}ybf`1bLdrW{|1FzZv)raRpuwODU zR(-$$tcGL&C$!J$F=0M!iNf_R+X4-BpQXPT=cYRRoZg|UCM|6`axi!aU!{qs$=`Hx z)OFJABAt*acxqeiy||4-U3%B9DGbu>1*n~;CUl8KBQ?7 Sj>A0~<8TmM@9p;Y=>Hc_0qsZt literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/appdirs.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/appdirs.py new file mode 100644 index 0000000..251c5fd --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/appdirs.py @@ -0,0 +1,41 @@ +""" +This code wraps the vendored appdirs module to so the return values are +compatible for the current pip code base. + +The intention is to rewrite current usages gradually, keeping the tests pass, +and eventually drop this after all usages are changed. +""" + +from __future__ import absolute_import + +import os + +from pip._vendor import appdirs as _appdirs + +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import List + + +def user_cache_dir(appname): + # type: (str) -> str + return _appdirs.user_cache_dir(appname, appauthor=False) + + +def user_config_dir(appname, roaming=True): + # type: (str, bool) -> str + return _appdirs.user_config_dir(appname, appauthor=False, roaming=roaming) + + +def user_data_dir(appname, roaming=False): + # type: (str, bool) -> str + return _appdirs.user_data_dir(appname, appauthor=False, roaming=roaming) + + +def site_config_dirs(appname): + # type: (str) -> List[str] + dirval = _appdirs.site_config_dir(appname, appauthor=False, multipath=True) + if _appdirs.system not in ["win32", "darwin"]: + return dirval.split(os.pathsep) + return [dirval] diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/appdirs.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/appdirs.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8f3c9f0ea604f1177c9c0070ab186c03cfef67f6 GIT binary patch literal 2033 zcmd5-OOG2x5Uv@oA3NF28WNBK2l~Llhs2X)5s{*R7Ofy4z(TXjAx2`w>*Za{Qe}46Q2HRgq&!Zy%_lgz@ zU`}%YDug0{GK6^u0q=WI^kClex*aHXpzOnZ(CPY6451vsd<20Wf&I-}4WQVCGJ<&o zK}Al7@RGb=0lf!m1TO=a?}NSyYS*t1Kt8m$P}oB0o~DovmaMw`d9%Z_hbxHpzfOeni7@W)Nol;K6c_#0^@! zhXmb)X93|6p7`8n3B!hrysc$P75CzVQ}&hWps1^b$r+1;Ej^M6qn0q5mkUBfC-{WM ze+Hq;g$dDRzfUWly^<*ZpSg2i`RpIL^EJ3YfNx0fZvtSC3Gh7dsvS^$csvAqpNX;R z0}fy{Bm+31eNK-F^Jz;Iu6NlMXsG)v{lz#p)!|)whpw8mwCTvf;3a&OCY~mL)5%fS zNwbS|LZ;xUZMFB}HV$>^UAv|*NVgZDcAlaf)am9O|GK!wQfItW7UGx=`Ce}BbCz-X z5PljQ1mj@x0j+%^X{zchO_9l)ri+%^yH3-DZ4=+VxU$p%rfK(aNVu{cEt%_H^R_Qc zeP5X3hWmBGXn9n&d(UUCPQph_IH1472}ejirs*AUesu|r%s1c%-B<5xZZPgTO@nY8 Q?$H>BgWy_kx4%dKH_FQEivR!s literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/compat 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/compat 2.py new file mode 100644 index 0000000..6efa52a --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/compat 2.py @@ -0,0 +1,269 @@ +"""Stuff that differs in different Python versions and platform +distributions.""" + +# The following comment should be removed at some point in the future. +# mypy: disallow-untyped-defs=False + +from __future__ import absolute_import, division + +import codecs +import locale +import logging +import os +import shutil +import sys + +from pip._vendor.six import PY2, text_type + +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Optional, Text, Tuple, Union + +try: + import ipaddress +except ImportError: + try: + from pip._vendor import ipaddress # type: ignore + except ImportError: + import ipaddr as ipaddress # type: ignore + ipaddress.ip_address = ipaddress.IPAddress # type: ignore + ipaddress.ip_network = ipaddress.IPNetwork # type: ignore + + +__all__ = [ + "ipaddress", "uses_pycache", "console_to_str", + "get_path_uid", "stdlib_pkgs", "WINDOWS", "samefile", "get_terminal_size", +] + + +logger = logging.getLogger(__name__) + +if PY2: + import imp + + try: + cache_from_source = imp.cache_from_source # type: ignore + except AttributeError: + # does not use __pycache__ + cache_from_source = None + + uses_pycache = cache_from_source is not None +else: + uses_pycache = True + from importlib.util import cache_from_source + + +if PY2: + # In Python 2.7, backslashreplace exists + # but does not support use for decoding. + # We implement our own replace handler for this + # situation, so that we can consistently use + # backslash replacement for all versions. + def backslashreplace_decode_fn(err): + raw_bytes = (err.object[i] for i in range(err.start, err.end)) + # Python 2 gave us characters - convert to numeric bytes + raw_bytes = (ord(b) for b in raw_bytes) + return u"".join(u"\\x%x" % c for c in raw_bytes), err.end + codecs.register_error( + "backslashreplace_decode", + backslashreplace_decode_fn, + ) + backslashreplace_decode = "backslashreplace_decode" +else: + backslashreplace_decode = "backslashreplace" + + +def has_tls(): + # type: () -> bool + try: + import _ssl # noqa: F401 # ignore unused + return True + except ImportError: + pass + + from pip._vendor.urllib3.util import IS_PYOPENSSL + return IS_PYOPENSSL + + +def str_to_display(data, desc=None): + # type: (Union[bytes, Text], Optional[str]) -> Text + """ + For display or logging purposes, convert a bytes object (or text) to + text (e.g. unicode in Python 2) safe for output. + + :param desc: An optional phrase describing the input data, for use in + the log message if a warning is logged. Defaults to "Bytes object". + + This function should never error out and so can take a best effort + approach. It is okay to be lossy if needed since the return value is + just for display. + + We assume the data is in the locale preferred encoding. If it won't + decode properly, we warn the user but decode as best we can. + + We also ensure that the output can be safely written to standard output + without encoding errors. + """ + if isinstance(data, text_type): + return data + + # Otherwise, data is a bytes object (str in Python 2). + # First, get the encoding we assume. This is the preferred + # encoding for the locale, unless that is not found, or + # it is ASCII, in which case assume UTF-8 + encoding = locale.getpreferredencoding() + if (not encoding) or codecs.lookup(encoding).name == "ascii": + encoding = "utf-8" + + # Now try to decode the data - if we fail, warn the user and + # decode with replacement. + try: + decoded_data = data.decode(encoding) + except UnicodeDecodeError: + if desc is None: + desc = 'Bytes object' + msg_format = '{} does not appear to be encoded as %s'.format(desc) + logger.warning(msg_format, encoding) + decoded_data = data.decode(encoding, errors=backslashreplace_decode) + + # Make sure we can print the output, by encoding it to the output + # encoding with replacement of unencodable characters, and then + # decoding again. + # We use stderr's encoding because it's less likely to be + # redirected and if we don't find an encoding we skip this + # step (on the assumption that output is wrapped by something + # that won't fail). + # The double getattr is to deal with the possibility that we're + # being called in a situation where sys.__stderr__ doesn't exist, + # or doesn't have an encoding attribute. Neither of these cases + # should occur in normal pip use, but there's no harm in checking + # in case people use pip in (unsupported) unusual situations. + output_encoding = getattr(getattr(sys, "__stderr__", None), + "encoding", None) + + if output_encoding: + output_encoded = decoded_data.encode( + output_encoding, + errors="backslashreplace" + ) + decoded_data = output_encoded.decode(output_encoding) + + return decoded_data + + +def console_to_str(data): + # type: (bytes) -> Text + """Return a string, safe for output, of subprocess output. + """ + return str_to_display(data, desc='Subprocess output') + + +def get_path_uid(path): + # type: (str) -> int + """ + Return path's uid. + + Does not follow symlinks: + https://github.com/pypa/pip/pull/935#discussion_r5307003 + + Placed this function in compat due to differences on AIX and + Jython, that should eventually go away. + + :raises OSError: When path is a symlink or can't be read. + """ + if hasattr(os, 'O_NOFOLLOW'): + fd = os.open(path, os.O_RDONLY | os.O_NOFOLLOW) + file_uid = os.fstat(fd).st_uid + os.close(fd) + else: # AIX and Jython + # WARNING: time of check vulnerability, but best we can do w/o NOFOLLOW + if not os.path.islink(path): + # older versions of Jython don't have `os.fstat` + file_uid = os.stat(path).st_uid + else: + # raise OSError for parity with os.O_NOFOLLOW above + raise OSError( + "%s is a symlink; Will not return uid for symlinks" % path + ) + return file_uid + + +def expanduser(path): + # type: (str) -> str + """ + Expand ~ and ~user constructions. + + Includes a workaround for https://bugs.python.org/issue14768 + """ + expanded = os.path.expanduser(path) + if path.startswith('~/') and expanded.startswith('//'): + expanded = expanded[1:] + return expanded + + +# packages in the stdlib that may have installation metadata, but should not be +# considered 'installed'. this theoretically could be determined based on +# dist.location (py27:`sysconfig.get_paths()['stdlib']`, +# py26:sysconfig.get_config_vars('LIBDEST')), but fear platform variation may +# make this ineffective, so hard-coding +stdlib_pkgs = {"python", "wsgiref", "argparse"} + + +# windows detection, covers cpython and ironpython +WINDOWS = (sys.platform.startswith("win") or + (sys.platform == 'cli' and os.name == 'nt')) + + +def samefile(file1, file2): + # type: (str, str) -> bool + """Provide an alternative for os.path.samefile on Windows/Python2""" + if hasattr(os.path, 'samefile'): + return os.path.samefile(file1, file2) + else: + path1 = os.path.normcase(os.path.abspath(file1)) + path2 = os.path.normcase(os.path.abspath(file2)) + return path1 == path2 + + +if hasattr(shutil, 'get_terminal_size'): + def get_terminal_size(): + # type: () -> Tuple[int, int] + """ + Returns a tuple (x, y) representing the width(x) and the height(y) + in characters of the terminal window. + """ + return tuple(shutil.get_terminal_size()) # type: ignore +else: + def get_terminal_size(): + # type: () -> Tuple[int, int] + """ + Returns a tuple (x, y) representing the width(x) and the height(y) + in characters of the terminal window. + """ + def ioctl_GWINSZ(fd): + try: + import fcntl + import termios + import struct + cr = struct.unpack_from( + 'hh', + fcntl.ioctl(fd, termios.TIOCGWINSZ, '12345678') + ) + except Exception: + return None + if cr == (0, 0): + return None + return cr + cr = ioctl_GWINSZ(0) or ioctl_GWINSZ(1) or ioctl_GWINSZ(2) + if not cr: + if sys.platform != "win32": + try: + fd = os.open(os.ctermid(), os.O_RDONLY) + cr = ioctl_GWINSZ(fd) + os.close(fd) + except Exception: + pass + if not cr: + cr = (os.environ.get('LINES', 25), os.environ.get('COLUMNS', 80)) + return int(cr[1]), int(cr[0]) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/compat 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/compat 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4811080d4a5b11a1e4f1a84a61ff3e43fe1d2436 GIT binary patch literal 8539 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 bool + try: + import _ssl # noqa: F401 # ignore unused + return True + except ImportError: + pass + + from pip._vendor.urllib3.util import IS_PYOPENSSL + return IS_PYOPENSSL + + +def str_to_display(data, desc=None): + # type: (Union[bytes, Text], Optional[str]) -> Text + """ + For display or logging purposes, convert a bytes object (or text) to + text (e.g. unicode in Python 2) safe for output. + + :param desc: An optional phrase describing the input data, for use in + the log message if a warning is logged. Defaults to "Bytes object". + + This function should never error out and so can take a best effort + approach. It is okay to be lossy if needed since the return value is + just for display. + + We assume the data is in the locale preferred encoding. If it won't + decode properly, we warn the user but decode as best we can. + + We also ensure that the output can be safely written to standard output + without encoding errors. + """ + if isinstance(data, text_type): + return data + + # Otherwise, data is a bytes object (str in Python 2). + # First, get the encoding we assume. This is the preferred + # encoding for the locale, unless that is not found, or + # it is ASCII, in which case assume UTF-8 + encoding = locale.getpreferredencoding() + if (not encoding) or codecs.lookup(encoding).name == "ascii": + encoding = "utf-8" + + # Now try to decode the data - if we fail, warn the user and + # decode with replacement. + try: + decoded_data = data.decode(encoding) + except UnicodeDecodeError: + if desc is None: + desc = 'Bytes object' + msg_format = '{} does not appear to be encoded as %s'.format(desc) + logger.warning(msg_format, encoding) + decoded_data = data.decode(encoding, errors=backslashreplace_decode) + + # Make sure we can print the output, by encoding it to the output + # encoding with replacement of unencodable characters, and then + # decoding again. + # We use stderr's encoding because it's less likely to be + # redirected and if we don't find an encoding we skip this + # step (on the assumption that output is wrapped by something + # that won't fail). + # The double getattr is to deal with the possibility that we're + # being called in a situation where sys.__stderr__ doesn't exist, + # or doesn't have an encoding attribute. Neither of these cases + # should occur in normal pip use, but there's no harm in checking + # in case people use pip in (unsupported) unusual situations. + output_encoding = getattr(getattr(sys, "__stderr__", None), + "encoding", None) + + if output_encoding: + output_encoded = decoded_data.encode( + output_encoding, + errors="backslashreplace" + ) + decoded_data = output_encoded.decode(output_encoding) + + return decoded_data + + +def console_to_str(data): + # type: (bytes) -> Text + """Return a string, safe for output, of subprocess output. + """ + return str_to_display(data, desc='Subprocess output') + + +def get_path_uid(path): + # type: (str) -> int + """ + Return path's uid. + + Does not follow symlinks: + https://github.com/pypa/pip/pull/935#discussion_r5307003 + + Placed this function in compat due to differences on AIX and + Jython, that should eventually go away. + + :raises OSError: When path is a symlink or can't be read. + """ + if hasattr(os, 'O_NOFOLLOW'): + fd = os.open(path, os.O_RDONLY | os.O_NOFOLLOW) + file_uid = os.fstat(fd).st_uid + os.close(fd) + else: # AIX and Jython + # WARNING: time of check vulnerability, but best we can do w/o NOFOLLOW + if not os.path.islink(path): + # older versions of Jython don't have `os.fstat` + file_uid = os.stat(path).st_uid + else: + # raise OSError for parity with os.O_NOFOLLOW above + raise OSError( + "%s is a symlink; Will not return uid for symlinks" % path + ) + return file_uid + + +def expanduser(path): + # type: (str) -> str + """ + Expand ~ and ~user constructions. + + Includes a workaround for https://bugs.python.org/issue14768 + """ + expanded = os.path.expanduser(path) + if path.startswith('~/') and expanded.startswith('//'): + expanded = expanded[1:] + return expanded + + +# packages in the stdlib that may have installation metadata, but should not be +# considered 'installed'. this theoretically could be determined based on +# dist.location (py27:`sysconfig.get_paths()['stdlib']`, +# py26:sysconfig.get_config_vars('LIBDEST')), but fear platform variation may +# make this ineffective, so hard-coding +stdlib_pkgs = {"python", "wsgiref", "argparse"} + + +# windows detection, covers cpython and ironpython +WINDOWS = (sys.platform.startswith("win") or + (sys.platform == 'cli' and os.name == 'nt')) + + +def samefile(file1, file2): + # type: (str, str) -> bool + """Provide an alternative for os.path.samefile on Windows/Python2""" + if hasattr(os.path, 'samefile'): + return os.path.samefile(file1, file2) + else: + path1 = os.path.normcase(os.path.abspath(file1)) + path2 = os.path.normcase(os.path.abspath(file2)) + return path1 == path2 + + +if hasattr(shutil, 'get_terminal_size'): + def get_terminal_size(): + # type: () -> Tuple[int, int] + """ + Returns a tuple (x, y) representing the width(x) and the height(y) + in characters of the terminal window. + """ + return tuple(shutil.get_terminal_size()) # type: ignore +else: + def get_terminal_size(): + # type: () -> Tuple[int, int] + """ + Returns a tuple (x, y) representing the width(x) and the height(y) + in characters of the terminal window. + """ + def ioctl_GWINSZ(fd): + try: + import fcntl + import termios + import struct + cr = struct.unpack_from( + 'hh', + fcntl.ioctl(fd, termios.TIOCGWINSZ, '12345678') + ) + except Exception: + return None + if cr == (0, 0): + return None + return cr + cr = ioctl_GWINSZ(0) or ioctl_GWINSZ(1) or ioctl_GWINSZ(2) + if not cr: + if sys.platform != "win32": + try: + fd = os.open(os.ctermid(), os.O_RDONLY) + cr = ioctl_GWINSZ(fd) + os.close(fd) + except Exception: + pass + if not cr: + cr = (os.environ.get('LINES', 25), os.environ.get('COLUMNS', 80)) + return int(cr[1]), int(cr[0]) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/compat.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/compat.pyc new file mode 100644 index 0000000000000000000000000000000000000000..93786652c3400be9050a1919d118cb5d01a797ee GIT binary patch literal 8539 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 literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/deprecation 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/deprecation 2.py new file mode 100644 index 0000000..2f20cfd --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/deprecation 2.py @@ -0,0 +1,104 @@ +""" +A module that implements tooling to enable easy warnings about deprecations. +""" + +# The following comment should be removed at some point in the future. +# mypy: disallow-untyped-defs=False + +from __future__ import absolute_import + +import logging +import warnings + +from pip._vendor.packaging.version import parse + +from pip import __version__ as current_version +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Any, Optional + + +DEPRECATION_MSG_PREFIX = "DEPRECATION: " + + +class PipDeprecationWarning(Warning): + pass + + +_original_showwarning = None # type: Any + + +# Warnings <-> Logging Integration +def _showwarning(message, category, filename, lineno, file=None, line=None): + if file is not None: + if _original_showwarning is not None: + _original_showwarning( + message, category, filename, lineno, file, line, + ) + elif issubclass(category, PipDeprecationWarning): + # We use a specially named logger which will handle all of the + # deprecation messages for pip. + logger = logging.getLogger("pip._internal.deprecations") + logger.warning(message) + else: + _original_showwarning( + message, category, filename, lineno, file, line, + ) + + +def install_warning_logger(): + # type: () -> None + # Enable our Deprecation Warnings + warnings.simplefilter("default", PipDeprecationWarning, append=True) + + global _original_showwarning + + if _original_showwarning is None: + _original_showwarning = warnings.showwarning + warnings.showwarning = _showwarning + + +def deprecated(reason, replacement, gone_in, issue=None): + # type: (str, Optional[str], Optional[str], Optional[int]) -> None + """Helper to deprecate existing functionality. + + reason: + Textual reason shown to the user about why this functionality has + been deprecated. + replacement: + Textual suggestion shown to the user about what alternative + functionality they can use. + gone_in: + The version of pip does this functionality should get removed in. + Raises errors if pip's current version is greater than or equal to + this. + issue: + Issue number on the tracker that would serve as a useful place for + users to find related discussion and provide feedback. + + Always pass replacement, gone_in and issue as keyword arguments for clarity + at the call site. + """ + + # Construct a nice message. + # This is eagerly formatted as we want it to get logged as if someone + # typed this entire message out. + sentences = [ + (reason, DEPRECATION_MSG_PREFIX + "{}"), + (gone_in, "pip {} will remove support for this functionality."), + (replacement, "A possible replacement is {}."), + (issue, ( + "You can find discussion regarding this at " + "https://github.com/pypa/pip/issues/{}." + )), + ] + message = " ".join( + template.format(val) for val, template in sentences if val is not None + ) + + # Raise as an error if it has to be removed. + if gone_in is not None and parse(current_version) >= parse(gone_in): + raise PipDeprecationWarning(message) + + warnings.warn(message, category=PipDeprecationWarning, stacklevel=2) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/deprecation 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/deprecation 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3e91558c6e96ebbea6c0e36651d2e3d83eaa8276 GIT binary patch literal 3728 zcmc&%-EJGl6+X*9Ta;uee-0cZz!V5lUeu(M6bRs^hE&^ij5dt0a+;cGvKa0Tsg;(y z>zP@~jHO&eeuunHZi=AK(--J>&e9YEx4jjq9iEw;nRCu}e%1WH9!1E?$O&T@j9q1N~T0*xdYtyVlqfWiAP1!Y?U8m7T zJ?~J~rP(HpHYqThWY6W)HOjVVwoRjLn%$t$4GMCw#i<=iHpuMK1T4GslIViy>F5pS zuixU4|2F9*1bds3E#5JDM;5o~Wk92wOds}cKo>W}(A`(FBB?T?{E_x5ot2rHncO?& ziy}+&DSnm7^%y&hb_;c?ZH{H9^th+v25WHl z%SG4$+go@X1Jem&o?lx&_xG^=BPM5XM52=ovY(NM+tlX3oHv8s9K<6Dg>(DVq_+J3uy!F2?1G__kbLifKFi@<&QmVhE zj_a}D;6gMkawF!83Y$(-Xdk(w;&kbGVu{qbY8+?UIl;j5*{qmi^VDyEo*MsGOpTQ{ z%ab(+-a0eRY3yMO!+FiLu(dx;(hSZ%GoF!z`tmvD4fMb{oxL<@g+d;vRnh;fapn6)<&!vziz@2%s!G%5`xX?C6kg z5x~Ums6(8L*sdIkLxDIk6J2FqpwVS%@}$S$3c{~ahREt9#Q;zEb!|H~`4d~2kV7nF z>v_%zYbFnGVtxs=P*;UFi?R&XXsKAlo@eYQEHo=k&6};QU?YfGGj=3?1n-|fAZ7p} z@P2oK2oubikP^ZK@^_0sOj~pgBecaj9Zuwk&<6-N4#2jY>`GLB&o+a-unqz@f;efD z#X7bjqyzdfV3WZ($JclzfgLek=UQ?RGy+tT!=7ONPb88rOja7pdH+>-BK1E{o#$#W zsq(l^xv5|DyIqBkMPVrNyF&B)iFxiToh{cD8#3qX{E<n>zqZd8BdXy zkh|8HLZM~hQpH3ex2dEsD4nls1rVw%QOG%fWme2hqSCy+mLUsu>Tu9lTUe)3x$C!1 z#g(-v#w#WOYYMa>I(R^|!YcEOq4vc}3uazl%t_K*O8c0nDz9c^90xvZ4sUgQQs3s) zsfY*z&5hD1@T~cy%9OyZCWT$`U@LNmpeAXaK%opGB`Qf>Tsbb|N@KaS#XL=nni!Le z!Di_#``M{pI8`Ed^+>x+S|HWE;_W_RWtFnML-1)4@sbGT_=Y4m8 z9Z!o&JVa1f)83k?wuv-P>_{fOHq-DRLmo1 zR({+bo;x6rHopCc{?VXwgnykc>Ow9dj|`3sf=K^c@C*rrb2HyEl*(J@R8B%rcc#6h zZDf0*{vBitqB){Lvb90`2UA|A+AGSkj;p}uQM_q>4s|Hj`Qpi1(9N-M!W8|c; z)rn53)0#&}{aZRO(kjXW2b#1Y4#8{k*tn3};VXw#fLkT?B454}+aX?_I2mYEhIF@u~x!RKBukh(kUXa`#cA#StUT-5j;Qu>BI|(cF*qml?8# zoZSuELbh4>5eENyS17G+-!Dp>4*7t9znpVT4H@O|Lw>{E+&6V!Uz?6Sr|u-!7eW>* yyp7=!e4(z$u_eqtum6j Logging Integration +def _showwarning(message, category, filename, lineno, file=None, line=None): + if file is not None: + if _original_showwarning is not None: + _original_showwarning( + message, category, filename, lineno, file, line, + ) + elif issubclass(category, PipDeprecationWarning): + # We use a specially named logger which will handle all of the + # deprecation messages for pip. + logger = logging.getLogger("pip._internal.deprecations") + logger.warning(message) + else: + _original_showwarning( + message, category, filename, lineno, file, line, + ) + + +def install_warning_logger(): + # type: () -> None + # Enable our Deprecation Warnings + warnings.simplefilter("default", PipDeprecationWarning, append=True) + + global _original_showwarning + + if _original_showwarning is None: + _original_showwarning = warnings.showwarning + warnings.showwarning = _showwarning + + +def deprecated(reason, replacement, gone_in, issue=None): + # type: (str, Optional[str], Optional[str], Optional[int]) -> None + """Helper to deprecate existing functionality. + + reason: + Textual reason shown to the user about why this functionality has + been deprecated. + replacement: + Textual suggestion shown to the user about what alternative + functionality they can use. + gone_in: + The version of pip does this functionality should get removed in. + Raises errors if pip's current version is greater than or equal to + this. + issue: + Issue number on the tracker that would serve as a useful place for + users to find related discussion and provide feedback. + + Always pass replacement, gone_in and issue as keyword arguments for clarity + at the call site. + """ + + # Construct a nice message. + # This is eagerly formatted as we want it to get logged as if someone + # typed this entire message out. + sentences = [ + (reason, DEPRECATION_MSG_PREFIX + "{}"), + (gone_in, "pip {} will remove support for this functionality."), + (replacement, "A possible replacement is {}."), + (issue, ( + "You can find discussion regarding this at " + "https://github.com/pypa/pip/issues/{}." + )), + ] + message = " ".join( + template.format(val) for val, template in sentences if val is not None + ) + + # Raise as an error if it has to be removed. + if gone_in is not None and parse(current_version) >= parse(gone_in): + raise PipDeprecationWarning(message) + + warnings.warn(message, category=PipDeprecationWarning, stacklevel=2) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/deprecation.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/deprecation.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ed892bc8d07c0c80d4d58a446a3188ff02b21cd3 GIT binary patch literal 3728 zcmc&%-EJGl6+X*9Ta;ueP2#{o3QU0@wu|BJkXmWE zyPlb)%vj1rCXJf%4s?q~EumYKwQ1I&QK#P5rtAvMuF`0u zo_8qg(rlAPn-rK$vS)JY3T0a~+osVr&92et8U;Dn;?xc$8)SBA0+wBRNpw#1bo3VU z*KhO4f1C6Yg1tk@7Vj9nD~sFoGN93QrVo18po<$~=u^UD)r-Hu;@3|fKaK8v`QYAHQTVsv@X_#LuYqOH2HDRS z{wjXIDVej*+%_inA3P2p+}nTh=$qjk<=@51g;Q=qt;zoL}q#2)@YxsDQ$Q z9%!l=@p2U9dS;@?cV$vz1u13MYH$|hptR{+do!48JD3z%0+j~Sa*#YbntuO>$tSnQ zpM17h%>9w~{`O}lhqv&V=7T4LGA(bWx$`>9Zhm_EkHb;OOY%f%?u~_lgUY9w8?3?I zFBf44Y;WLk3`{48d46U2+}p$YkC>do5s8jB$lfLox2fqLm_Ef@j14+%^0w19ox@F^ z{XqFc@>mTR?ehj%L%u~vZT8LcfX+H}+My$i@V@}QdE?hF1G@u(bLifOFi@<&QmVhE zj_a}D;6gMkawF!83Y$(-Xdk)5;$-Q0Vu{qbY8+?UIl;j5*{qmi^VDyEo*MsGOpTQ{ z%ab(+-a0eRY3yMO!+FiLu(dx;(hSZ%GoF!z`v_%zYbFn`V}1d(P?v=_i?R&XXsKAlo@eZ*EHo=k&FihLU?YfGGj=3?1n-|fAZ7p} z@P2QC2oubikP^ZK@^_0sOj~pYBecaj9Zuwk(EA8C4#2jY>`GLB&o+a-unqz@f;euI z#X7bjqyzdfV3WZ(M^|_yfgLek-BK1E{o#$#W zsq(l^xv5|DyIqBkMPVrNJ3{mPiFxiToh{cD8#3qX{Gm~m!_{@^I5}KkDRr;ksSdSU z-842PzmOv7FWHruj-^Vy$-bE7m0JZnCwG9_@UNnuw!*oxdCs7ab9P$+{)iAquzSB}fL(pWBSF;5etCdMRV zuvvP`es-c4PL;^rIJq+A$7%_$oE6boh-0%jDQu#&omO>U0yz{izlHyaJTN9}5~F%5 zm-?lxq$0jJa~zaxmltR1B*l&zeC4W=I}%pv7p&EHzs0eARTj{OJD)W<6>RY0tnVIU z$J3$`4-pjBw6|ueZ6eJRdjcdp^uBa=27_tp536xME@p#rQEI92qN^L=QdDFj74yiM zl^?f<=N1U0jemYb|7g$|!oSWJbs?9KM+Qd*L8SjZc!mVRxtVVnO69F{DkmYRJJVj$ zHnKfY{}wU^(Hzkr+1jA}gDEdk?ImSd$5r6-smaar(%#jW)Ey3myP%~5K)VzlXJ&4) zlr;EF|N_>9+**fjr2AZ|TZetgXS|_;C?4X6{w07Rw*!mgX>cG_i literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/distutils_args 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/distutils_args 2.py new file mode 100644 index 0000000..e38e402 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/distutils_args 2.py @@ -0,0 +1,48 @@ +from distutils.errors import DistutilsArgError +from distutils.fancy_getopt import FancyGetopt + +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Dict, List + + +_options = [ + ("exec-prefix=", None, ""), + ("home=", None, ""), + ("install-base=", None, ""), + ("install-data=", None, ""), + ("install-headers=", None, ""), + ("install-lib=", None, ""), + ("install-platlib=", None, ""), + ("install-purelib=", None, ""), + ("install-scripts=", None, ""), + ("prefix=", None, ""), + ("root=", None, ""), + ("user", None, ""), +] + + +# typeshed doesn't permit Tuple[str, None, str], see python/typeshed#3469. +_distutils_getopt = FancyGetopt(_options) # type: ignore + + +def parse_distutils_args(args): + # type: (List[str]) -> Dict[str, str] + """Parse provided arguments, returning an object that has the + matched arguments. + + Any unknown arguments are ignored. + """ + result = {} + for arg in args: + try: + _, match = _distutils_getopt.getopt(args=[arg]) + except DistutilsArgError: + # We don't care about any other options, which here may be + # considered unrecognized since our option list is not + # exhaustive. + pass + else: + result.update(match.__dict__) + return result diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/distutils_args 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/distutils_args 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c7d5153918ec451328d85886b268a42db6f51ff1 GIT binary patch literal 1711 zcmc&!-Ez}L6h14-NoryyKuQY*qKjVmqOoA;OmFH=Ga&`0;HC-;#Z%BI+KntDt;Fss z#GQm2c!EArZ~Htv0GzY7iKv@vP z00n~~14g_9xdVj@LwCx%kb6+HVAujCTA+Tjw>-#~pjd|CG88K?TmdHW?mF-0lyCX2Jj6?S7F!&;eu$x8}xb(_(gaNFkA(G3HG`^hLyd?ugj1! z7jV0iX;Ygl*IO#xQL0o^)j3rC63b+ASD3OgQ{hDvK76|SG}^wmv;AunJ{}D25AJpy zvgKJ@iLt~3G^$roB926|St)Ul9rX?Jpj)_&%0l#Y2dPYI6X*Hneysl^;jxMPdaZG0 zBw{X8UD@&7!bYVnL`Al~o4qEu)iJj5a(~mZop>sI^cDm5QQX!nKV{ zKgTTtIAL(~I~-#PpWTNO2PPYUDUKO+{n&w&!5d(II&k8`i3d;Q1@MdmFWR7XfHC&6 z1AiPd7`t%n!PujIk?aY|_H0S@YxJ`lD=qv=m4_J@+>cdS7eX5Sov(zcmCR)7$I>tN z$09Ml8O6pQ#Tp6G_VFuXlZ=}8dTlG;k`up{FJ$>jp4vo8_*p7TC3w#svqeCkx=RJH zc!~HNFi~ouVW=)sGDHe2Usu>aVOEfj@J3>y$eIYL*7k%Fy3UPpkw*uHiX0j8VngmC z0d~_hQbDD%Lo^s1#ws`{bHYK8RsnxGPXGG;;MUFkTel~ZLo+tU{BZl#=q7%t3?2nl zR&CCqvUO)i?>;7xT~Q{DP%_Q~3;*CWFG{#qP0TuauBiTvoJn^B=pWgD#H zdCoc;bSa$$;15E|YpNs4!oMk8n1r*Gb|{+4|C^7do@Q{KKMg=r*StHQnltsY0Xj=R zpQWb0F;-16RlrVILl_c{70ya%-zxGp?Yt{V#dGegd literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/distutils_args.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/distutils_args.py new file mode 100644 index 0000000..e38e402 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/distutils_args.py @@ -0,0 +1,48 @@ +from distutils.errors import DistutilsArgError +from distutils.fancy_getopt import FancyGetopt + +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Dict, List + + +_options = [ + ("exec-prefix=", None, ""), + ("home=", None, ""), + ("install-base=", None, ""), + ("install-data=", None, ""), + ("install-headers=", None, ""), + ("install-lib=", None, ""), + ("install-platlib=", None, ""), + ("install-purelib=", None, ""), + ("install-scripts=", None, ""), + ("prefix=", None, ""), + ("root=", None, ""), + ("user", None, ""), +] + + +# typeshed doesn't permit Tuple[str, None, str], see python/typeshed#3469. +_distutils_getopt = FancyGetopt(_options) # type: ignore + + +def parse_distutils_args(args): + # type: (List[str]) -> Dict[str, str] + """Parse provided arguments, returning an object that has the + matched arguments. + + Any unknown arguments are ignored. + """ + result = {} + for arg in args: + try: + _, match = _distutils_getopt.getopt(args=[arg]) + except DistutilsArgError: + # We don't care about any other options, which here may be + # considered unrecognized since our option list is not + # exhaustive. + pass + else: + result.update(match.__dict__) + return result diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/distutils_args.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/distutils_args.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c7d2faa82c298b1698d9a9a0a97a418518873d65 GIT binary patch literal 1711 zcmc&!-Ez}L6h14-NowLwpeY3kL>ImAMPuXK(s^gv}hFVMwXFQVs{l{ zCgFxY0dK@J@c`{PYnup6t}ACZ=V$l)erMf}o%a5R{)+@=-?#Yx7B2lBH;#V{a)5%t zkO3p!f!u+@g`qp;UC2EsS}<$@6D?4W>@5%SB`B6*xD3S#3|D|jyt@wkd*G*m{{Z|9 z@Uy_r0sj&BdEgg-Uj)7Z=_(A{AY2e_c!yq306zu)01Q`we+N&yK8BV3i(i)^WlrMu zYo<+YvRvO*>9$g(nyOBq>P{?^$z5T}%1ni)Q26lq5Q+o&u=Uw4qoq&9J$Z|=nU3ki=++}CT3Gb0gm zp>*FGo?pzfozG8Id2AMiwGs1rW z8NeZf{U>mMCH(sy96B)B08DYrsOtv~qzv8x`^$kt7Y;pmCQpKA9C+CVwGE81R~`8C zfWg>>0}sX?^^0WBQ1;Z8RKG<(k7K2UU#W60F2yGVfD zbd6L{sca7o279pzcFUY_5TsSWUyai@*LE*o+PQpnGTAd@W6X`KuSb{gOJ(qTP-WHT z94c3CTptWW64@1H(g-EvJh1Q&j`E^}d)36Oqvwk1-^iJC7g27J3Cl~Y!(6t(I-cjO zvq6{ASpfbZq`am&qAdKI!i7mVPHBgtsr=e}H1#xt^ZaQ5n!4uQ`P3Y%pAFD)`uQw1 z^^LJ=im3v2!WzPmFf`+-7=~i|)R3N_cS%ptb^0^SE Text + """Check a bytes string for a BOM to correctly detect the encoding + + Fallback to locale.getpreferredencoding(False) like open() on Python3""" + for bom, encoding in BOMS: + if data.startswith(bom): + return data[len(bom):].decode(encoding) + # Lets check the first two lines as in PEP263 + for line in data.split(b'\n')[:2]: + if line[0:1] == b'#' and ENCODING_RE.search(line): + encoding = ENCODING_RE.search(line).groups()[0].decode('ascii') + return data.decode(encoding) + return data.decode( + locale.getpreferredencoding(False) or sys.getdefaultencoding(), + ) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/encoding 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/encoding 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..89545ac59d7d4dc27455cbb16237cab514efa20d GIT binary patch literal 1649 zcmc&z-E!MR6h4ytAE#;3zoDI>0&bLcY&AC1b~==SCN40fZmJ}cshi-DwQF0-T2i&g zNz5cy<%*}`7A|-J9)kyfvm4uWJKVGK9)IWTx4Y+Wt-qHmzyJ31rvRp-ME~E=lz)+6 z^fN#JbmrKAjxn>F&@pG&f{vxJ2_grhJaqD4@H}K(TP+X;7!{#Ygi#4PB^Z^VQwAdj z-~dqtSPuH8#!JBRGh78$nBiq$#TmW=tTe+bz{)dx6<9^#0o}9;+=OTi*b=-Wude~C z!Y>rcbrsXDvrO@Y|IlbV20>gS@#6K)>+a_Ft<4|1-hR9NL;E|&QfoO9+o43v6WAN4 zf@{+rKSQZZW9-)+%fb|GJe1`*to8V!CitAzY|Iy$jYS%1M7v2x1PKe{!J8*fj}GNM z=S}VKw0?AdJy8BCm(<*(DgPvK_5=`M>!<;TCR`YBVZu3O)_`+E#h(?Gie%L4-N=G- zQ!VViEyBT>(Bzy-4cV9p_SVq>To8$>O1~U@MpZdBA$tXsg{Ytw)Uh9`Q4!uzt61;} zolm7B#?+7Z*S&%R<(LInf~X8wQLOY2z$J*PYCEaBPEp16s|s+)gJavbdlTf+mY7jS z?0%Aw>DkK{HYRqEWEl@oOl-!HfQ>_L^Y}7(m5NQ{xi3V|r*nudlE4?dKH!*Uyw7Pb zn~@#jNxp82@R-|4%428UPGWm!g2N14cLwOqF5G_&#k5RP>CSwprxTqVe~d}@GHrLr1*x7arpS3ry;@u+g oz8?QyQA*^;SEGcD1^-&LlKhlJ)zF`L)hrlyt*NGMYu1YOFS1Q{jsO4v literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/encoding.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/encoding.py new file mode 100644 index 0000000..ab4d4b9 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/encoding.py @@ -0,0 +1,42 @@ +# The following comment should be removed at some point in the future. +# mypy: strict-optional=False + +import codecs +import locale +import re +import sys + +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import List, Tuple, Text + +BOMS = [ + (codecs.BOM_UTF8, 'utf-8'), + (codecs.BOM_UTF16, 'utf-16'), + (codecs.BOM_UTF16_BE, 'utf-16-be'), + (codecs.BOM_UTF16_LE, 'utf-16-le'), + (codecs.BOM_UTF32, 'utf-32'), + (codecs.BOM_UTF32_BE, 'utf-32-be'), + (codecs.BOM_UTF32_LE, 'utf-32-le'), +] # type: List[Tuple[bytes, Text]] + +ENCODING_RE = re.compile(br'coding[:=]\s*([-\w.]+)') + + +def auto_decode(data): + # type: (bytes) -> Text + """Check a bytes string for a BOM to correctly detect the encoding + + Fallback to locale.getpreferredencoding(False) like open() on Python3""" + for bom, encoding in BOMS: + if data.startswith(bom): + return data[len(bom):].decode(encoding) + # Lets check the first two lines as in PEP263 + for line in data.split(b'\n')[:2]: + if line[0:1] == b'#' and ENCODING_RE.search(line): + encoding = ENCODING_RE.search(line).groups()[0].decode('ascii') + return data.decode(encoding) + return data.decode( + locale.getpreferredencoding(False) or sys.getdefaultencoding(), + ) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/encoding.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/encoding.pyc new file mode 100644 index 0000000000000000000000000000000000000000..52d19651c8ab64deb5480d53ac1bd209a74c2c8d GIT binary patch literal 1649 zcmc&z-E!MR6h4ytAE#;30z*4P1>7ifY&ABMb~=<{nz+D_x~-BI^47J9)IWTx4Y+Wt-n@l=f6FA6T*B{=>I#K@=p?s zeg+5te}N6~jofa6Z|2wn-_qCwQGiJi{2~~<2pQK_3q%PfW$?=|seoUBNfrDm7%>0` z7}tOmU|?#z0<4(hI=qogX?oKlQwq-R_Uw?;T666-eww60u0&V44c9 zO$YoOr7}%%(0CwAbF{TBs|(oZ^JPu&1+Cp$EVNt8G}4InF&z;mEQ*J(A3i!hl3zKm z8%Jl&jW}<_=By2Z{5CfB?J4EjTja(tt}7E-14GTo@|;tgKWdqgL;XEx0h% z!v5Pb9G(kJE~wOyjhSHY9v{Lbk*KQlE5PSel@k-P7eHAUm(+qf_TTEb4DYB_Eclep zr_vE)?#KJyxC&TPtn_!l6&Tmmc2f79vWn|h72t@6Cw5@>XUL^3F{6yw zgCrx<<7ZE8OzbepG9IFs*^DCr8%Nyc@m2C_HJiqhK!|=o=MY^aVIX*O$T7|MfYV-< zlO5tozG;i-gxg8VV`tM&V*B|FM@ih4D(|((BpK0!NcW8rU+TsPWEe%duXJ~icl#6^ zg@Hka@+`s;TBHgdqiPk#$wRJp%2Y&1@dI?aJI{8h?|NQGlOzwaaHQcdOQxyR@G1nn zNgMtv41J~!MPDdqQg=5|86N~wfs1%m2We+nfPp6WlL^&@UgbQ0dR0U*cgP4@$b^ua zX3=SY+&v94caR9iGwBXfm%SYifBt%~b+5nGp3P2ijEMK!XQO*GhOv9#rcv66V# int + """Central wrapper for all old entrypoints. + + Historically pip has had several entrypoints defined. Because of issues + arising from PATH, sys.path, multiple Pythons, their interactions, and most + of them having a pip installed, users suffer every time an entrypoint gets + moved. + + To alleviate this pain, and provide a mechanism for warning users and + directing them to an appropriate place for help, we now define all of + our old entrypoints as wrappers for the current one. + """ + sys.stderr.write( + "WARNING: pip is being invoked by an old script wrapper. This will " + "fail in a future version of pip.\n" + "Please see https://github.com/pypa/pip/issues/5599 for advice on " + "fixing the underlying issue.\n" + "To avoid this problem you can invoke Python with '-m pip' instead of " + "running pip directly.\n" + ) + return main(args) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/entrypoints 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/entrypoints 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7ab16307141a819db0de8e95f48d56c8033ad32a GIT binary patch literal 1535 zcmc&!(T?0S6m@21cj<^q6%R-t9`0M`VK!-1s;U*OSeA-Kg<&+^3U!cJc@k&h#fgot zlOc#V_%L4i9rysa*9mmt2e2j{C$`T$_nd1_|F}K>?boN@=3;CU`u~_7{D!)Meu*$b zY=`kgm_*bQv7Ly7=cd9;MLiSSnMl-3_!n`uA6)#~%rXA5Q*-lFa+7qo4p ziQB%=7;*;ThnJkwgYQ!pgt$(`^@KzIoQNb$#ZQ7qFC!HGPCL$36TCEV@X|Tup|l>P zFj^n}F$j4%99vmi0QP6+JlZppr;W0jN5~FgLb9p-SDTB85*>E?ZP!OVEg| z!iXikM&0b8^tOie+2zF&u*cNNP%WWuP0-FLSofi_4K5*6N_!wK6es8O>6>f{s4a$w zN9eSsCORF%%E(VQ7>KMYmOu?TGu3_N8S_RHtQ7 z6htF9@@k0hyzO*BFi@+!l8weXig=K|VID(RVj4*n+ACsD-y_#RzzvY{-Z~%AosqeU z0F^Rs2?qs@J&alo&XhyCt^cn{KxT|SVuYX=khk8GD_|Ry#*O#^+5Yv}hD++nAQHk( zF(=)0_B&O;u4h_Y0+@U4!r!PVTypXUO$Aa)ZD<4KUACe13P@2TTi9i)jC8&>N|NcQ z6jUKNe3E5*9jbPh=C;mU?_@^nvY{ffhYue=9*VE%G$}wprT$?Q3fiVn-t>_pS5P`< zOFFBI(GG8ShP>}>3pr6A5*dq!_=XDZp4QCkF3n+3RIV;7Y&8Mf}7adg?N=v!iOsI_a~Llq7Moy~~R4ulGNG zSl++4yZ@l?yKo&sc=X^<-J`Z|vP+iabS&D_vrnJn`c+hkmAZ<>PscuMgEpAmIBTiv zM{^~9tC-y8p)kHON=J5qnccTALI ueCPXS!&1eoXhlV~;S1`G8gcZ0O7c-{i`J-T%p6&Vw int + """Central wrapper for all old entrypoints. + + Historically pip has had several entrypoints defined. Because of issues + arising from PATH, sys.path, multiple Pythons, their interactions, and most + of them having a pip installed, users suffer every time an entrypoint gets + moved. + + To alleviate this pain, and provide a mechanism for warning users and + directing them to an appropriate place for help, we now define all of + our old entrypoints as wrappers for the current one. + """ + sys.stderr.write( + "WARNING: pip is being invoked by an old script wrapper. This will " + "fail in a future version of pip.\n" + "Please see https://github.com/pypa/pip/issues/5599 for advice on " + "fixing the underlying issue.\n" + "To avoid this problem you can invoke Python with '-m pip' instead of " + "running pip directly.\n" + ) + return main(args) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/entrypoints.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/entrypoints.pyc new file mode 100644 index 0000000000000000000000000000000000000000..21b00449398fe17453ac7c209c8a83d1b1d8a0c6 GIT binary patch literal 1535 zcmc&!(T?0S6m@21cj<^q6%R-t9`0M`VK!+gZPf}8WrbK&7*^9osDs4HlQb~}}NsQ5eWI8zpbG_ViSdljH|0i-eD zOa(kOc&9DKd_D(i=M>8YUDApHy!Oz@NKXY(^@?F`Y=KJE+NvstPgNmUX^9!RSnI4sb z2GPf-MX}S^blbdiZQ%zm3tCr<6;V8V_~gl0d{wVW0RpP^tAkL`*-8a7B#vA``J653 zovsdc1h+Nh{opz%iTaqxp?HWdHgNZ}WnOn_E~286C7z+P$s?}h(HS%3^93J9IxBRF zhKPJpBU1Q)M>O0AjcQE;@%rG(u#1cIiMtr6E6C2Cs-@^ZsD8ZO{q#Y7 z|K9fggJJ0L8WA5q*f;m6?QC($lAIoj_VoS7k5-#?Qi+wiO2tpdzUWY!Sll>kxgXNS zaCNYM&ODg8xP2=-Ia%=gI;HhCjR-9N2P`j*&iU#|Ng>}G|DI35avVIVzveq8Npg7S t`)18jrK@N~MYiS(>a`ka^nXh7Ve6{SsE?U>WF6j|+{x}tj BinaryIO + pass + + +def check_path_owner(path): + # type: (str) -> bool + # If we don't have a way to check the effective uid of this process, then + # we'll just assume that we own the directory. + if sys.platform == "win32" or not hasattr(os, "geteuid"): + return True + + assert os.path.isabs(path) + + previous = None + while path != previous: + if os.path.lexists(path): + # Check if path is writable by current user. + if os.geteuid() == 0: + # Special handling for root user in order to handle properly + # cases where users use sudo without -H flag. + try: + path_uid = get_path_uid(path) + except OSError: + return False + return path_uid == 0 + else: + return os.access(path, os.W_OK) + else: + previous, path = path, os.path.dirname(path) + return False # assume we don't own the path + + +def copy2_fixed(src, dest): + # type: (str, str) -> None + """Wrap shutil.copy2() but map errors copying socket files to + SpecialFileError as expected. + + See also https://bugs.python.org/issue37700. + """ + try: + shutil.copy2(src, dest) + except (OSError, IOError): + for f in [src, dest]: + try: + is_socket_file = is_socket(f) + except OSError: + # An error has already occurred. Another error here is not + # a problem and we can ignore it. + pass + else: + if is_socket_file: + raise shutil.SpecialFileError("`%s` is a socket" % f) + + raise + + +def is_socket(path): + # type: (str) -> bool + return stat.S_ISSOCK(os.lstat(path).st_mode) + + +@contextmanager +def adjacent_tmp_file(path): + # type: (str) -> Iterator[NamedTemporaryFileResult] + """Given a path to a file, open a temp file next to it securely and ensure + it is written to disk after the context reaches its end. + """ + with NamedTemporaryFile( + delete=False, + dir=os.path.dirname(path), + prefix=os.path.basename(path), + suffix='.tmp', + ) as f: + result = cast('NamedTemporaryFileResult', f) + try: + yield result + finally: + result.file.flush() + os.fsync(result.file.fileno()) + + +_replace_retry = retry(stop_max_delay=1000, wait_fixed=250) + +if PY2: + @_replace_retry + def replace(src, dest): + # type: (str, str) -> None + try: + os.rename(src, dest) + except OSError: + os.remove(dest) + os.rename(src, dest) + +else: + replace = _replace_retry(os.replace) + + +# test_writable_dir and _test_writable_dir_win are copied from Flit, +# with the author's agreement to also place them under pip's license. +def test_writable_dir(path): + # type: (str) -> bool + """Check if a directory is writable. + + Uses os.access() on POSIX, tries creating files on Windows. + """ + # If the directory doesn't exist, find the closest parent that does. + while not os.path.isdir(path): + parent = os.path.dirname(path) + if parent == path: + break # Should never get here, but infinite loops are bad + path = parent + + if os.name == 'posix': + return os.access(path, os.W_OK) + + return _test_writable_dir_win(path) + + +def _test_writable_dir_win(path): + # type: (str) -> bool + # os.access doesn't work on Windows: http://bugs.python.org/issue2528 + # and we can't use tempfile: http://bugs.python.org/issue22107 + basename = 'accesstest_deleteme_fishfingers_custard_' + alphabet = 'abcdefghijklmnopqrstuvwxyz0123456789' + for i in range(10): + name = basename + ''.join(random.choice(alphabet) for _ in range(6)) + file = os.path.join(path, name) + try: + fd = os.open(file, os.O_RDWR | os.O_CREAT | os.O_EXCL) + except OSError as e: + if e.errno == errno.EEXIST: + continue + if e.errno == errno.EPERM: + # This could be because there's a directory with the same name. + # But it's highly unlikely there's a directory called that, + # so we'll assume it's because the parent dir is not writable. + return False + raise + else: + os.close(fd) + os.unlink(file) + return True + + # This should never be reached + raise EnvironmentError( + 'Unexpected condition testing for writable directory' + ) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/filesystem 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/filesystem 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c52712229ee45ebb0c969a802155fb1558b09a7b GIT binary patch literal 5760 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 F`Cl5qH%b5i literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/filesystem.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/filesystem.py new file mode 100644 index 0000000..6f1537e --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/filesystem.py @@ -0,0 +1,171 @@ +import errno +import os +import os.path +import random +import shutil +import stat +import sys +from contextlib import contextmanager +from tempfile import NamedTemporaryFile + +# NOTE: retrying is not annotated in typeshed as on 2017-07-17, which is +# why we ignore the type on this import. +from pip._vendor.retrying import retry # type: ignore +from pip._vendor.six import PY2 + +from pip._internal.utils.compat import get_path_uid +from pip._internal.utils.typing import MYPY_CHECK_RUNNING, cast + +if MYPY_CHECK_RUNNING: + from typing import BinaryIO, Iterator + + class NamedTemporaryFileResult(BinaryIO): + @property + def file(self): + # type: () -> BinaryIO + pass + + +def check_path_owner(path): + # type: (str) -> bool + # If we don't have a way to check the effective uid of this process, then + # we'll just assume that we own the directory. + if sys.platform == "win32" or not hasattr(os, "geteuid"): + return True + + assert os.path.isabs(path) + + previous = None + while path != previous: + if os.path.lexists(path): + # Check if path is writable by current user. + if os.geteuid() == 0: + # Special handling for root user in order to handle properly + # cases where users use sudo without -H flag. + try: + path_uid = get_path_uid(path) + except OSError: + return False + return path_uid == 0 + else: + return os.access(path, os.W_OK) + else: + previous, path = path, os.path.dirname(path) + return False # assume we don't own the path + + +def copy2_fixed(src, dest): + # type: (str, str) -> None + """Wrap shutil.copy2() but map errors copying socket files to + SpecialFileError as expected. + + See also https://bugs.python.org/issue37700. + """ + try: + shutil.copy2(src, dest) + except (OSError, IOError): + for f in [src, dest]: + try: + is_socket_file = is_socket(f) + except OSError: + # An error has already occurred. Another error here is not + # a problem and we can ignore it. + pass + else: + if is_socket_file: + raise shutil.SpecialFileError("`%s` is a socket" % f) + + raise + + +def is_socket(path): + # type: (str) -> bool + return stat.S_ISSOCK(os.lstat(path).st_mode) + + +@contextmanager +def adjacent_tmp_file(path): + # type: (str) -> Iterator[NamedTemporaryFileResult] + """Given a path to a file, open a temp file next to it securely and ensure + it is written to disk after the context reaches its end. + """ + with NamedTemporaryFile( + delete=False, + dir=os.path.dirname(path), + prefix=os.path.basename(path), + suffix='.tmp', + ) as f: + result = cast('NamedTemporaryFileResult', f) + try: + yield result + finally: + result.file.flush() + os.fsync(result.file.fileno()) + + +_replace_retry = retry(stop_max_delay=1000, wait_fixed=250) + +if PY2: + @_replace_retry + def replace(src, dest): + # type: (str, str) -> None + try: + os.rename(src, dest) + except OSError: + os.remove(dest) + os.rename(src, dest) + +else: + replace = _replace_retry(os.replace) + + +# test_writable_dir and _test_writable_dir_win are copied from Flit, +# with the author's agreement to also place them under pip's license. +def test_writable_dir(path): + # type: (str) -> bool + """Check if a directory is writable. + + Uses os.access() on POSIX, tries creating files on Windows. + """ + # If the directory doesn't exist, find the closest parent that does. + while not os.path.isdir(path): + parent = os.path.dirname(path) + if parent == path: + break # Should never get here, but infinite loops are bad + path = parent + + if os.name == 'posix': + return os.access(path, os.W_OK) + + return _test_writable_dir_win(path) + + +def _test_writable_dir_win(path): + # type: (str) -> bool + # os.access doesn't work on Windows: http://bugs.python.org/issue2528 + # and we can't use tempfile: http://bugs.python.org/issue22107 + basename = 'accesstest_deleteme_fishfingers_custard_' + alphabet = 'abcdefghijklmnopqrstuvwxyz0123456789' + for i in range(10): + name = basename + ''.join(random.choice(alphabet) for _ in range(6)) + file = os.path.join(path, name) + try: + fd = os.open(file, os.O_RDWR | os.O_CREAT | os.O_EXCL) + except OSError as e: + if e.errno == errno.EEXIST: + continue + if e.errno == errno.EPERM: + # This could be because there's a directory with the same name. + # But it's highly unlikely there's a directory called that, + # so we'll assume it's because the parent dir is not writable. + return False + raise + else: + os.close(fd) + os.unlink(file) + return True + + # This should never be reached + raise EnvironmentError( + 'Unexpected condition testing for writable directory' + ) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/filesystem.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/filesystem.pyc new file mode 100644 index 0000000000000000000000000000000000000000..850662dba6d193c5b1ea4d2d326e7a092d54cd45 GIT binary patch literal 5760 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 E3k?M`*8l(j literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/filetypes 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/filetypes 2.py new file mode 100644 index 0000000..daa0ca7 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/filetypes 2.py @@ -0,0 +1,16 @@ +"""Filetype information. +""" +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Tuple + +WHEEL_EXTENSION = '.whl' +BZ2_EXTENSIONS = ('.tar.bz2', '.tbz') # type: Tuple[str, ...] +XZ_EXTENSIONS = ('.tar.xz', '.txz', '.tlz', + '.tar.lz', '.tar.lzma') # type: Tuple[str, ...] +ZIP_EXTENSIONS = ('.zip', WHEEL_EXTENSION) # type: Tuple[str, ...] +TAR_EXTENSIONS = ('.tar.gz', '.tgz', '.tar') # type: Tuple[str, ...] +ARCHIVE_EXTENSIONS = ( + ZIP_EXTENSIONS + BZ2_EXTENSIONS + TAR_EXTENSIONS + XZ_EXTENSIONS +) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/filetypes 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/filetypes 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e276f85204b67ff488b6c06a837ae64f34d5399d GIT binary patch literal 826 zcmaJ=u7QBkhlOM1VbXgL`e#*4_Hoj?QXSx;N7Iezm6-v zhaUj5PT~ZF7-?p|{bpuocXnz&cRN46KmT$CD{0{R5>+rX1i(Y90nveL5bNOSpiv!i zyJTy?YY^ALtAmzcAfg74``{Ts_Q7ic*#X*s5c66<4!~;zZ2>jlkhW2qaOib_?7`T4 zph`YO^M-LM7a4ubk}%EVK(aKkI_wvUsi9x)qxo<-y!3m0r}xeuoxAS9eY^Cj%THz* zr=pI?y1nM2rGN}_Yg(KxSvf64bIpD$R%8YEmKSk*9m$J0SjHAC+Z+(B52!$pyQYp= z|1NE+J8sgevK9DWeY5sQa#gYdL2ll`5UJkh`y{>cefbD+#xl!iiKKZFaBC(R7Z!Gz zCD91IAPr@f`?AURaR0gQIPZPuV&b^t!ADo#Medb%x?#q07pV(xn^8gDVE8vR>5jH3 z^@rV2uRr+YY|$pNurVUTt)1m;9!P4>gWL{NPG~OdD6`4eo2Ymao*Yk4&K8Tgypd8q zJ-fX=Mu`%8V&jXCSR!P=`BC?^BZlXSDz$2aT{glFS0g8^Y$4UWJd0B@kxYxh*1Sv0bxoDY)DZ z$<{#BU{VKC2Q9`xL=B+3Kn$RJK$<|efHfe*ycW=XAZ=hRUWtYbv?OE$lLn zBM-eG4P_SlvdNEd|F!QpAAIL>XK|SDu@g&{-#Ff-X^8~ z@Z9V52Va~G+C&!CCQor|rx~9GlG(E$v%^GCmgRPo+VuNvR6GxlkH*I*^Z88PN-0lI z?rx4yqSzkU_~Jtz=Q0rDuzUK#C7z;6tr}sMjj+Sz$mLc#mug#}DF6Tf literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/glibc 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/glibc 2.py new file mode 100644 index 0000000..3610424 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/glibc 2.py @@ -0,0 +1,98 @@ +# The following comment should be removed at some point in the future. +# mypy: strict-optional=False + +from __future__ import absolute_import + +import os +import sys + +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Optional, Tuple + + +def glibc_version_string(): + # type: () -> Optional[str] + "Returns glibc version string, or None if not using glibc." + return glibc_version_string_confstr() or glibc_version_string_ctypes() + + +def glibc_version_string_confstr(): + # type: () -> Optional[str] + "Primary implementation of glibc_version_string using os.confstr." + # os.confstr is quite a bit faster than ctypes.DLL. It's also less likely + # to be broken or missing. This strategy is used in the standard library + # platform module: + # https://github.com/python/cpython/blob/fcf1d003bf4f0100c9d0921ff3d70e1127ca1b71/Lib/platform.py#L175-L183 + if sys.platform == "win32": + return None + try: + # os.confstr("CS_GNU_LIBC_VERSION") returns a string like "glibc 2.17": + _, version = os.confstr("CS_GNU_LIBC_VERSION").split() + except (AttributeError, OSError, ValueError): + # os.confstr() or CS_GNU_LIBC_VERSION not available (or a bad value)... + return None + return version + + +def glibc_version_string_ctypes(): + # type: () -> Optional[str] + "Fallback implementation of glibc_version_string using ctypes." + + try: + import ctypes + except ImportError: + return None + + # ctypes.CDLL(None) internally calls dlopen(NULL), and as the dlopen + # manpage says, "If filename is NULL, then the returned handle is for the + # main program". This way we can let the linker do the work to figure out + # which libc our process is actually using. + process_namespace = ctypes.CDLL(None) + try: + gnu_get_libc_version = process_namespace.gnu_get_libc_version + except AttributeError: + # Symbol doesn't exist -> therefore, we are not linked to + # glibc. + return None + + # Call gnu_get_libc_version, which returns a string like "2.5" + gnu_get_libc_version.restype = ctypes.c_char_p + version_str = gnu_get_libc_version() + # py2 / py3 compatibility: + if not isinstance(version_str, str): + version_str = version_str.decode("ascii") + + return version_str + + +# platform.libc_ver regularly returns completely nonsensical glibc +# versions. E.g. on my computer, platform says: +# +# ~$ python2.7 -c 'import platform; print(platform.libc_ver())' +# ('glibc', '2.7') +# ~$ python3.5 -c 'import platform; print(platform.libc_ver())' +# ('glibc', '2.9') +# +# But the truth is: +# +# ~$ ldd --version +# ldd (Debian GLIBC 2.22-11) 2.22 +# +# This is unfortunate, because it means that the linehaul data on libc +# versions that was generated by pip 8.1.2 and earlier is useless and +# misleading. Solution: instead of using platform, use our code that actually +# works. +def libc_ver(): + # type: () -> Tuple[str, str] + """Try to determine the glibc version + + Returns a tuple of strings (lib, version) which default to empty strings + in case the lookup fails. + """ + glibc_version = glibc_version_string() + if glibc_version is None: + return ("", "") + else: + return ("glibc", glibc_version) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/glibc 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/glibc 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6405539f3c04775178f822054be8115cdbbf8a8d GIT binary patch literal 2413 zcmc&$-)|d55T3pB?>Z!;fG9=kNg!dQ)=nEFghWw_8%jiQqI1%;7V7D8w|36CU)-(} z871N&Jo13VKg2745B~t)?Aa|v>H{z2lpD|P?9R>3_swkVzgAj*{_*fdK#Rx1@75NP z`WZ@yKS423B4{K?@Ytf*qLF26&}|yoMz<-hP*SB)m4vKPab#vI6xS%J)2L2KgGLP! zDSTAv7ot&LMywnj8dKJPyR#`mL(u6K8xgnD@qo%ve!&itY`&f*Y3^(J{Q{Bb(@>9g_u zjpO^9^ZA*cYOO!tJU`jMGf8^~y*$eAMXAz$9N&BNcw6ls@|1bKDAlq+rg}3S#c;>R z?dEg+&Ku%mOcdvtY?D$}>v&B{51=5WQ^7PkwWzpBp-sd29nv;UD-80LplOwJ{ewl9 zM3;h&(%V$gHPUs)Zfw(Oi;6uGLh#;a7Xq+U;8<-z>=#ku7jp+}h-D&E?K99$HZHUO zuWT=X$y9fd_O2nsd6aHG&^O_(KlGjq4!zx-ulwH9ZFjh{Hy9WeB3^uPt_+*<*w^E% zNHmARxNAOjrVugF5>RHE%Hv4ux1c@JV9GIgyImBZEic>~mU;{NQ$L=Srjjm9O3$oX z(B>clng>;#GVQs;`QQu&q1dJ*z4V>{0H8i!As`D*Tw03_RkPvnwGB18u*j>k1Z6I5X2=C(ldddMzp_3>H?f&k zu%g#sWECn(o6kR=b%FZi>e46;y~ zVsIHC{We5iWPw!5OZ`Nu+z+JtKASj}f3%+KB2{d$CRRkXwkmA=uGm$( zEt=Md&47+$+*`vWLFbGJWHmJBoVTFd^5~ju=7dMKIDZt;c;Q;+XXHF>5 z*^&rdTA#?*`*^G6;90hK-_d+Sa1$w;v~oHC?C!Gbf9jl{M8OFhj{RAz*|$t`JzuUi z&Z5)_d{urc&a%^4?u>nO)UL7O3^)i!Xd3LmRK4q9Y(zO^hz*CzJ8osUdP$sX#L&=n zN#Y{}rWz1bZ;H04SRD@45ZCj@Gu)ff^IW#OZ5Dj1>klAs>2zOSI9+q$bisMtoi3wp zIKCJ&16=OGuE`1)mCNaKKZ1Cb2&4V~mm?qk%OneDvHXfdQ~dwPn$;FOTXwV7 ITyJjt4cMquLI3~& literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/glibc.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/glibc.py new file mode 100644 index 0000000..3610424 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/glibc.py @@ -0,0 +1,98 @@ +# The following comment should be removed at some point in the future. +# mypy: strict-optional=False + +from __future__ import absolute_import + +import os +import sys + +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Optional, Tuple + + +def glibc_version_string(): + # type: () -> Optional[str] + "Returns glibc version string, or None if not using glibc." + return glibc_version_string_confstr() or glibc_version_string_ctypes() + + +def glibc_version_string_confstr(): + # type: () -> Optional[str] + "Primary implementation of glibc_version_string using os.confstr." + # os.confstr is quite a bit faster than ctypes.DLL. It's also less likely + # to be broken or missing. This strategy is used in the standard library + # platform module: + # https://github.com/python/cpython/blob/fcf1d003bf4f0100c9d0921ff3d70e1127ca1b71/Lib/platform.py#L175-L183 + if sys.platform == "win32": + return None + try: + # os.confstr("CS_GNU_LIBC_VERSION") returns a string like "glibc 2.17": + _, version = os.confstr("CS_GNU_LIBC_VERSION").split() + except (AttributeError, OSError, ValueError): + # os.confstr() or CS_GNU_LIBC_VERSION not available (or a bad value)... + return None + return version + + +def glibc_version_string_ctypes(): + # type: () -> Optional[str] + "Fallback implementation of glibc_version_string using ctypes." + + try: + import ctypes + except ImportError: + return None + + # ctypes.CDLL(None) internally calls dlopen(NULL), and as the dlopen + # manpage says, "If filename is NULL, then the returned handle is for the + # main program". This way we can let the linker do the work to figure out + # which libc our process is actually using. + process_namespace = ctypes.CDLL(None) + try: + gnu_get_libc_version = process_namespace.gnu_get_libc_version + except AttributeError: + # Symbol doesn't exist -> therefore, we are not linked to + # glibc. + return None + + # Call gnu_get_libc_version, which returns a string like "2.5" + gnu_get_libc_version.restype = ctypes.c_char_p + version_str = gnu_get_libc_version() + # py2 / py3 compatibility: + if not isinstance(version_str, str): + version_str = version_str.decode("ascii") + + return version_str + + +# platform.libc_ver regularly returns completely nonsensical glibc +# versions. E.g. on my computer, platform says: +# +# ~$ python2.7 -c 'import platform; print(platform.libc_ver())' +# ('glibc', '2.7') +# ~$ python3.5 -c 'import platform; print(platform.libc_ver())' +# ('glibc', '2.9') +# +# But the truth is: +# +# ~$ ldd --version +# ldd (Debian GLIBC 2.22-11) 2.22 +# +# This is unfortunate, because it means that the linehaul data on libc +# versions that was generated by pip 8.1.2 and earlier is useless and +# misleading. Solution: instead of using platform, use our code that actually +# works. +def libc_ver(): + # type: () -> Tuple[str, str] + """Try to determine the glibc version + + Returns a tuple of strings (lib, version) which default to empty strings + in case the lookup fails. + """ + glibc_version = glibc_version_string() + if glibc_version is None: + return ("", "") + else: + return ("glibc", glibc_version) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/glibc.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/glibc.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6db8a923751fb948ede9d464ea21f0ea3b9ff407 GIT binary patch literal 2413 zcmc&$ZEqVz5T3pBdmR!|K$If&B#OLWu}YbxxYrs(QNIt(|l3joWpC zQ6fHsk92rC*f2_)zccJK5krKRIs!tkLik52i)UJTQIcnc9+Z}KSblu^ z=&9HLe!KsJ=N=3OJA;QEK8$Wa?BzPjQa{#J4EASvEMFX$J@>b8;58_k=#nU3B`sJP z8t>{0SX`-RMXH=h932JDsVo#6I!YH&I=Ss+g)_)f=|p2E&9pO9m@Suf%OF043$xW* zZ1u{mUXZ0@sQTt>7wCB|RR?BzDHJfFUS33}zLvdHzvzv#I7CprN!|;8nofTCY-(E$#~XMiX>Y%mNBNy7Roai^JNNE?J{Y+?WnM2zwJeaS-b_a^-0^X{ z`CPyAn)nzK#d#*%q?FYle9Cw6Dn1C+S4BnG)-Ca#RTTzuw)1HXLd6h8mq)rFgFV{k9SO4GRV5d&e`dI zySrOfP&)G_QhQugOK!ScLWWm?7aaSAmmA;dz#wVtcw6LaMgyo#G5Rcx^)Rz$V7Ds23&*j2kN zn%1gVw+y?u6u7($yLemKqrodM2uPnasJKC4g@)h~rp6!_H;Rraz(28JAN@gRPAJjY zk_cT|AIn$!c&p{$S+;oJ(R@R26DgataykI)_Ok1L>YN=%!7&_;{aLKpw@h+9U#>RJ zqSOg|RemeZvXfcvjD2*}uCd|_I0#2*8tlMSz3X6XL^))L4Ts7*Ze_W8Nt`Rh(9m^B z;zI None + """ + :param hashes: A dict of algorithm names pointing to lists of allowed + hex digests + """ + self._allowed = {} if hashes is None else hashes + + @property + def digest_count(self): + # type: () -> int + return sum(len(digests) for digests in self._allowed.values()) + + def is_hash_allowed( + self, + hash_name, # type: str + hex_digest, # type: str + ): + # type: (...) -> bool + """Return whether the given hex digest is allowed.""" + return hex_digest in self._allowed.get(hash_name, []) + + def check_against_chunks(self, chunks): + # type: (Iterator[bytes]) -> None + """Check good hashes against ones built from iterable of chunks of + data. + + Raise HashMismatch if none match. + + """ + gots = {} + for hash_name in iterkeys(self._allowed): + try: + gots[hash_name] = hashlib.new(hash_name) + except (ValueError, TypeError): + raise InstallationError('Unknown hash name: %s' % hash_name) + + for chunk in chunks: + for hash in itervalues(gots): + hash.update(chunk) + + for hash_name, got in iteritems(gots): + if got.hexdigest() in self._allowed[hash_name]: + return + self._raise(gots) + + def _raise(self, gots): + # type: (Dict[str, _Hash]) -> NoReturn + raise HashMismatch(self._allowed, gots) + + def check_against_file(self, file): + # type: (BinaryIO) -> None + """Check good hashes against a file-like object + + Raise HashMismatch if none match. + + """ + return self.check_against_chunks(read_chunks(file)) + + def check_against_path(self, path): + # type: (str) -> None + with open(path, 'rb') as file: + return self.check_against_file(file) + + def __nonzero__(self): + # type: () -> bool + """Return whether I know any known-good hashes.""" + return bool(self._allowed) + + def __bool__(self): + # type: () -> bool + return self.__nonzero__() + + +class MissingHashes(Hashes): + """A workalike for Hashes used when we're missing a hash for a requirement + + It computes the actual hash of the requirement and raises a HashMissing + exception showing it to the user. + + """ + def __init__(self): + # type: () -> None + """Don't offer the ``hashes`` kwarg.""" + # Pass our favorite hash in to generate a "gotten hash". With the + # empty list, it will never match, so an error will always raise. + super(MissingHashes, self).__init__(hashes={FAVORITE_HASH: []}) + + def _raise(self, gots): + # type: (Dict[str, _Hash]) -> NoReturn + raise HashMissing(gots[FAVORITE_HASH].hexdigest()) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/hashes 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/hashes 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bed446eb1530cb3470697df513902c1d4093cfb8 GIT binary patch literal 5873 zcmd5=-F6hm5w6)k?FtDb1Oge749Cgw+9yc-89Rg!0U}5z@j^y`U}7?ic6xV5nxEBl zFOrCK5%7H;!Y|_6oV-KM@iX`Z@>TV&B;w>I7ZH0jt?r)wsjm9!tLiELFggDB?|$>= zHVuDe{9jxo(jPlS5&j%Xh*F1qha7H~C@GO&l6PfF%9K{fuTWYgze;J1{F)tCp=6BG zI{9@<8{{`A9VdU>zN=Dlg3<}{Cv3Y$$t0yG$v;VsI!VPpW%V&iPEk5V{uHIt#?Mc`l;~ ziYBRBCV!5ilcYYPjziHY`iAHo(F^|qMN_0MNbmGP??u+dYV$M{7PIo2P#Bq0D8hA} zCj+B`IPK?!X*F4?rhy_hs=$+KQy;cA)vh+h&*gjH;hsy(U$jsB{}cg;%zS1h`h%K#pnvj#E&?#yQ{UUxH8ny5`EEYO>5~)Hjbo&d@)<*Zu zjn368>sPPu?!Gn~#+WazZ}+a?*Uc85EcE04WmYHlyL@-)fqwjyyW|OQCRJo%vM?}l zq8IGO^Zi{bAzsHO2tLK`npH=&HoGc6j9gLsPf#(!cEAo)z2VSCiM@Xbpu(S3dP^qq z8az=i;<8WQLzfWb105ecEe0*br`hsL1wO^Z4F&+v*i3# z@Q9)3P}wVqiN(sWR~O7tqRraST6zIPEZ4c)Jq1^0_g8K=eyy@2e&NP&eGC41v8h!L z@77gD6eqe7;%7((?1IAeaIU~ge5{J&SQYC)WE-C3Cc3Qd#)O*~pZtjKzUT2o`z6|W zE?5^00`5yMAJTrAcF&P1(FW+M%uc{+F4OI`ty!voG)$E`Q1dtyUz6iFz!69e17B6UC!2DXl<*9Nndb$9gX{x zzAmvm`!(9D(Z)FYvGr+eHwQx(-%9M>`j*zX|HN>nBLSTasNeFLnaf?_Y|AJkMhD%4 zN;w)Bw^QV)%V9lSM??VQ+K`Ld0c}R13Fj@}GqZYOtd+YAK#W4W8+Y6cYq}EXj||mk zA;!~8f`^d1u=p+a7rNDC)O*Y#7IthTmNJRg4WA%W+XA&`oKi??AUJ%o+qW%`!?DLB z#i0j%NU1z_Xp2|1V*x5}gMwvl@*Wn_JlP&pqCqz|+PlPaIr_^B>1TmN8VopAq@NM7 zV9sC|l!uwoZ_%$mLP7PKGwYO{bIy!&zBGyQY-!G!bL!4Ph-O`h8wd*?APRh6V*DOq zd$9^Lj+n-B1GA*}OBBbc2k$cou!hIFcLbnqq z>T(iq!VlIrRNMSdn78V>0y#X!+oARZQM|=*YS3^NElJ)1l31iaq4y|lGFI3}1TUO; z*vtTg2eAC@3{&Wkkc8S+*MOcsJ{Jfvcv_%QWbo^9csY08SDAMWok!vdBdi~qp2q?2 z15*mih2xNBA*poQX*0F(!zUB9OrpYS83mCc$k<2zE&8rV`i%T~_h=q%IoXC@(b0OI zC)VS5pX1L<_!LUvdnmJr{tgB1p?R?x3bl6fLXrn$AOo!; zPEj*=TYXX>eXx7Fq0JR|Wat)ZYY-PIRoRe_SB%@v(>}gW$UW5!+h!0Zb_((rPIZsW zkz1{Ve`LF(tc6b|>5bZHt3H2xaCI-==6hvq_-e_EK)Pa>%N#gArw4*}Rv?_8gN$U~ zxNLzOV@bx5G2DEI6!9<{yM)n8dG-lkX*+4RQ+*G=KO?-68B4o=Ipf;LHX@_ zIR|6KWA%EATyV@e44ofF;_+9=G^7mq>g3&GNq^17Z7!G-BttoVA7|8PemIENYBi@Z z)|5{K%+o>88Q@D8c+EqLJi#*GrSLssKENe0%8Pj&??^UnQ*^eDVSLJv(dUZ!1NYG$ z!`9l5xBL%d<$CJ8hb2#L59|>hbGOIR zdsAF2q7VXGed0Z8JrqZIuqrFrq)zxx-0IlPBmv~M4KjC_TJ=v+OqC`|7fTnbQ_fVW V<}}MwPR*Gq%~WgEQ{~x5{{pUId%gew literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/hashes.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/hashes.py new file mode 100644 index 0000000..4c41551 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/hashes.py @@ -0,0 +1,131 @@ +from __future__ import absolute_import + +import hashlib + +from pip._vendor.six import iteritems, iterkeys, itervalues + +from pip._internal.exceptions import ( + HashMismatch, + HashMissing, + InstallationError, +) +from pip._internal.utils.misc import read_chunks +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import ( + Dict, List, BinaryIO, NoReturn, Iterator + ) + from pip._vendor.six import PY3 + if PY3: + from hashlib import _Hash + else: + from hashlib import _hash as _Hash + + +# The recommended hash algo of the moment. Change this whenever the state of +# the art changes; it won't hurt backward compatibility. +FAVORITE_HASH = 'sha256' + + +# Names of hashlib algorithms allowed by the --hash option and ``pip hash`` +# Currently, those are the ones at least as collision-resistant as sha256. +STRONG_HASHES = ['sha256', 'sha384', 'sha512'] + + +class Hashes(object): + """A wrapper that builds multiple hashes at once and checks them against + known-good values + + """ + def __init__(self, hashes=None): + # type: (Dict[str, List[str]]) -> None + """ + :param hashes: A dict of algorithm names pointing to lists of allowed + hex digests + """ + self._allowed = {} if hashes is None else hashes + + @property + def digest_count(self): + # type: () -> int + return sum(len(digests) for digests in self._allowed.values()) + + def is_hash_allowed( + self, + hash_name, # type: str + hex_digest, # type: str + ): + # type: (...) -> bool + """Return whether the given hex digest is allowed.""" + return hex_digest in self._allowed.get(hash_name, []) + + def check_against_chunks(self, chunks): + # type: (Iterator[bytes]) -> None + """Check good hashes against ones built from iterable of chunks of + data. + + Raise HashMismatch if none match. + + """ + gots = {} + for hash_name in iterkeys(self._allowed): + try: + gots[hash_name] = hashlib.new(hash_name) + except (ValueError, TypeError): + raise InstallationError('Unknown hash name: %s' % hash_name) + + for chunk in chunks: + for hash in itervalues(gots): + hash.update(chunk) + + for hash_name, got in iteritems(gots): + if got.hexdigest() in self._allowed[hash_name]: + return + self._raise(gots) + + def _raise(self, gots): + # type: (Dict[str, _Hash]) -> NoReturn + raise HashMismatch(self._allowed, gots) + + def check_against_file(self, file): + # type: (BinaryIO) -> None + """Check good hashes against a file-like object + + Raise HashMismatch if none match. + + """ + return self.check_against_chunks(read_chunks(file)) + + def check_against_path(self, path): + # type: (str) -> None + with open(path, 'rb') as file: + return self.check_against_file(file) + + def __nonzero__(self): + # type: () -> bool + """Return whether I know any known-good hashes.""" + return bool(self._allowed) + + def __bool__(self): + # type: () -> bool + return self.__nonzero__() + + +class MissingHashes(Hashes): + """A workalike for Hashes used when we're missing a hash for a requirement + + It computes the actual hash of the requirement and raises a HashMissing + exception showing it to the user. + + """ + def __init__(self): + # type: () -> None + """Don't offer the ``hashes`` kwarg.""" + # Pass our favorite hash in to generate a "gotten hash". With the + # empty list, it will never match, so an error will always raise. + super(MissingHashes, self).__init__(hashes={FAVORITE_HASH: []}) + + def _raise(self, gots): + # type: (Dict[str, _Hash]) -> NoReturn + raise HashMissing(gots[FAVORITE_HASH].hexdigest()) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/hashes.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/hashes.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7eafd9caed8e5fb38cc1f4d296174598a2ef5d47 GIT binary patch literal 5873 zcmd5=+j11i5zU^PW`u-pNT3DVO{^U|yI~}53u}zAxEU1o4(k?+puM+)`wq2uSlG4-UpC(70rsD6i`WPislunaBP3a8zGnCGf zKTGKx`E!(>A^(h>T^A|l$)CsUc`E)Uvl}dDxjR;p>Bh>a@nq}tSntu3{u&G@kKI!p#i+u;-FdmQTCm$6Pm)9#s5M;$uO zx@HFL)l8c(NkS9n*~6m93o8T7=*weqi>v%`7K~sAys8d zu(8mrQB>x-KSohSDs_sgQfW|BlM3dJNd=~_O9cRENM(||wI-`ihbZp4J4M*nZ&)Uijv&e1tRC`NfxJuoy8^*BDxQpLbmhWVjx_KVC z*2v@1-R1+1p8G4<_9y7r$0;4!s#7t`(8|i(vk$dO|5}qL=p2Qt!OP$3heenU1-j+l zbt4$l%{y+GbaNoCm%3S)Le_pBX9nnTP3|VJv$lhhd`CrxtMQ6GwTnf%3PTS2Te7oY zq?Kn%kPrZVJo)IAR!K)}Y1Pw&oFs)#QCsd8@$1m2<=0`c+{u$j6?(bbUyimnyKk;{ zu3X-@a&2$#wb?Yr+`P8ayNq8qTYkFSkNcNco!IZv)tfh3zQ|W~8o(6SS-=@SH?tR#Uvl(q%J-e?v8&q@pyF)9tRx z)Na4Ha~%!QRE;bb$!Q0vw}2O7+96S~3ca%^PEvNmOlfr(wDUn`uAprVU2e1F{8aFW zp%+ovFNul8%CJ`#%u%AP+R$2h8AB}BxjQ`tS7!HDZa03dvSWVX#&CTL{w1-gRS)mh zRYnvix)I`MNCxbJ!u4>jz)F0gisM)n>p)~1p5z9)tnS8yn;4(`i0=NufAG~}-2W8qjOQuAdpsO-F0js%8x7W89r~=Y3Rq8;^<5YY@j^hAFAUO$_LkhaSBAj1DTady(KGSV%URqk}5#S820O`xWkTw*N%y+dWLW$?#!70b0gP)yE^3Fg8HFZXvV70X>V>gZ?qdLA6x!Xm<7QaXl|X-NsGf%y zUuP0LgxrP2Z@E9yttO-1V-~TnV}0@O_E#dyMVH zD$F=y8p{pLlHSizoTMJS&mh1$9_!+zAD(RvFWDtvN;s#)GWeMdW0Dg6cc%#5PMoMq zNxTI=*w|EU^FLwUs_Qc3@EC7L+7m?a7AL7e!&$T>d51`1k^X?*^ zP#>~Lt9crYVXnd%B^`6?kOm7HWGC7b;cRkdIf5+s@NIzE8+K)eYNb5GHmC@)u5ZkIj)= zt%QGMyQ8dyPbTS&+HI>oe|&ItFW=#NWo-Cr$%{a`VwlSuIzOief_GLRoS%b?WZ$@K zfgEE=#*s1Hc!w16C>y(o(GT+M6TZ@RhUxgLSC#-?y>hp9!lJw6ox`YBlL<%C5Iq2} zygO)Gw6RrwbNAU3Z}sWJ;PKtH#~+4QiEwWqoAsvZ4`VXtCrp&MUplmCucZjeZ{N!~ z7%LvD*IVI&W6n|N{4f%aKSQP=Wyn`2?-on?OD=A6!JHr&%E|jUqek_|e~e None + # Only relevant on macOS + if sys.platform != "darwin": + return + + try: + import ssl + except ImportError: + return + + # Checks for OpenSSL 1.0.1 + if ssl.OPENSSL_VERSION_NUMBER >= 0x1000100f: + return + + try: + from pip._vendor.urllib3.contrib import securetransport + except (ImportError, OSError): + return + + securetransport.inject_into_urllib3() + + +inject_securetransport() diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/inject_securetransport 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/inject_securetransport 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4de5adf32cb16d375c412838d6f2ad73b9a638d4 GIT binary patch literal 1162 zcmd6n&2AGh5XZ;6Nk0~!Z%zDfCcasfZ#?NSKRqs0&qkJOq5L1u_`8lQ9H;j<#Ncn*3gu7Cz_qhT$P44ULtiGbCVBrXSNB&vrG#X+iUzMaTshm;IY)$kSAIi9cfqiq{tk(?Lj| z4aRr){ifh@gyCBylWBTFxj{}9Da;0W2MC8XIXg+G`}HUFi2ugc^o4gt zU%~#`74ka{7GQ|QCNK&?Z#f;(dCjSSmI&Yq;6mPkiVa~Dfj$I6h&%J)3;I=@NTVv~ zw+p{*?^gj)h4Bhp5g-@xzW24O&*W!?lI97%;9POw&5HBG)r6Jv85}K`lnT z!EWMUys-AKu<^Rv2;Iiq*fso?BDX!I$BRWH>@8e8_R=@B#s_d0=dII56N{F;Z?x0n zRx@j!zkAha+lS7dm-TGQWTA9@qJ`j{gL+pFiTQu8T3jbxhZq=$krZIXVO6qm#P=cm2>z0Ur@d_J{9Ywh8|Y_Nx| zFO#zb(RR5s7GL4+(VK=jJ$FmKyX%>jxkx6K3zICNZd9vY&VBm--rYbp^T4r&o1_wi zq((MKb!l&tEm93)S7}rdAj=BX&9b)7G{S}JB>$I8*O2Pj;^*+f*~Y!BmEd-`e(w(! C@jmGQ literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/inject_securetransport.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/inject_securetransport.py new file mode 100644 index 0000000..5b93b1d --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/inject_securetransport.py @@ -0,0 +1,36 @@ +"""A helper module that injects SecureTransport, on import. + +The import should be done as early as possible, to ensure all requests and +sessions (or whatever) are created after injecting SecureTransport. + +Note that we only do the injection on macOS, when the linked OpenSSL is too +old to handle TLSv1.2. +""" + +import sys + + +def inject_securetransport(): + # type: () -> None + # Only relevant on macOS + if sys.platform != "darwin": + return + + try: + import ssl + except ImportError: + return + + # Checks for OpenSSL 1.0.1 + if ssl.OPENSSL_VERSION_NUMBER >= 0x1000100f: + return + + try: + from pip._vendor.urllib3.contrib import securetransport + except (ImportError, OSError): + return + + securetransport.inject_into_urllib3() + + +inject_securetransport() diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/inject_securetransport.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/inject_securetransport.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c7590458ef28a7e25063428280b4f916ac73f126 GIT binary patch literal 1162 zcmd6nOK%e~5XZ;6NgoSUBU%B1i%)2g+H4<)UI6h>4izOq+3-*gtTtIEapKrp+erwb zCphr6_)L5N7&}3gDn0;~>>WR5{G0h(8~)mgKL33BsRyeT;P*Lp^8kke;2cK+MF4`p zIT|5+$Hf3x0N(%zZlrO=o!=(_FX)hol4&|o#Z)kAhqhp3Rsnl&(*;5WIU_?jsDF6SJv?44W_Dz)Jvp8a53mhn z(n%0)pG#x$749FMJZ_%1-IDL_dZuMAlBwmwBrB+E)vA{ZpZ>phw~)=;bFASusRSXZ zku6eP*}G(iRD;-68kGddvO@K;tnD+6aN#P+|0UB6q Incompatible types in assignment (expression has type "None", + # variable has type Module) + # TODO: eliminate the need to use "import as" once mypy addresses some + # of its issues with conditional imports. Here is an umbrella issue: + # https://github.com/python/mypy/issues/1297 + from pip._vendor import colorama as _colorama +# Lots of different errors can come from this, including SystemError and +# ImportError. +except Exception: + colorama = None +else: + # Import Fore explicitly rather than accessing below as colorama.Fore + # to avoid the following error running mypy: + # > Module has no attribute "Fore" + # TODO: eliminate the need to import Fore once mypy addresses some of its + # issues with conditional imports. This particular case could be an + # instance of the following issue (but also see the umbrella issue above): + # https://github.com/python/mypy/issues/3500 + from pip._vendor.colorama import Fore + + colorama = _colorama + + +_log_state = threading.local() +_log_state.indentation = 0 +subprocess_logger = getLogger('pip.subprocessor') + + +class BrokenStdoutLoggingError(Exception): + """ + Raised if BrokenPipeError occurs for the stdout stream while logging. + """ + pass + + +# BrokenPipeError does not exist in Python 2 and, in addition, manifests +# differently in Windows and non-Windows. +if WINDOWS: + # In Windows, a broken pipe can show up as EINVAL rather than EPIPE: + # https://bugs.python.org/issue19612 + # https://bugs.python.org/issue30418 + if PY2: + def _is_broken_pipe_error(exc_class, exc): + """See the docstring for non-Windows Python 3 below.""" + return (exc_class is IOError and + exc.errno in (errno.EINVAL, errno.EPIPE)) + else: + # In Windows, a broken pipe IOError became OSError in Python 3. + def _is_broken_pipe_error(exc_class, exc): + """See the docstring for non-Windows Python 3 below.""" + return ((exc_class is BrokenPipeError) or # noqa: F821 + (exc_class is OSError and + exc.errno in (errno.EINVAL, errno.EPIPE))) +elif PY2: + def _is_broken_pipe_error(exc_class, exc): + """See the docstring for non-Windows Python 3 below.""" + return (exc_class is IOError and exc.errno == errno.EPIPE) +else: + # Then we are in the non-Windows Python 3 case. + def _is_broken_pipe_error(exc_class, exc): + """ + Return whether an exception is a broken pipe error. + + Args: + exc_class: an exception class. + exc: an exception instance. + """ + return (exc_class is BrokenPipeError) # noqa: F821 + + +@contextlib.contextmanager +def indent_log(num=2): + """ + A context manager which will cause the log output to be indented for any + log messages emitted inside it. + """ + _log_state.indentation += num + try: + yield + finally: + _log_state.indentation -= num + + +def get_indentation(): + return getattr(_log_state, 'indentation', 0) + + +class IndentingFormatter(logging.Formatter): + + def __init__(self, *args, **kwargs): + """ + A logging.Formatter that obeys the indent_log() context manager. + + :param add_timestamp: A bool indicating output lines should be prefixed + with their record's timestamp. + """ + self.add_timestamp = kwargs.pop("add_timestamp", False) + super(IndentingFormatter, self).__init__(*args, **kwargs) + + def get_message_start(self, formatted, levelno): + """ + Return the start of the formatted log message (not counting the + prefix to add to each line). + """ + if levelno < logging.WARNING: + return '' + if formatted.startswith(DEPRECATION_MSG_PREFIX): + # Then the message already has a prefix. We don't want it to + # look like "WARNING: DEPRECATION: ...." + return '' + if levelno < logging.ERROR: + return 'WARNING: ' + + return 'ERROR: ' + + def format(self, record): + """ + Calls the standard formatter, but will indent all of the log message + lines by our current indentation level. + """ + formatted = super(IndentingFormatter, self).format(record) + message_start = self.get_message_start(formatted, record.levelno) + formatted = message_start + formatted + + prefix = '' + if self.add_timestamp: + # TODO: Use Formatter.default_time_format after dropping PY2. + t = self.formatTime(record, "%Y-%m-%dT%H:%M:%S") + prefix = '%s,%03d ' % (t, record.msecs) + prefix += " " * get_indentation() + formatted = "".join([ + prefix + line + for line in formatted.splitlines(True) + ]) + return formatted + + +def _color_wrap(*colors): + def wrapped(inp): + return "".join(list(colors) + [inp, colorama.Style.RESET_ALL]) + return wrapped + + +class ColorizedStreamHandler(logging.StreamHandler): + + # Don't build up a list of colors if we don't have colorama + if colorama: + COLORS = [ + # This needs to be in order from highest logging level to lowest. + (logging.ERROR, _color_wrap(Fore.RED)), + (logging.WARNING, _color_wrap(Fore.YELLOW)), + ] + else: + COLORS = [] + + def __init__(self, stream=None, no_color=None): + logging.StreamHandler.__init__(self, stream) + self._no_color = no_color + + if WINDOWS and colorama: + self.stream = colorama.AnsiToWin32(self.stream) + + def _using_stdout(self): + """ + Return whether the handler is using sys.stdout. + """ + if WINDOWS and colorama: + # Then self.stream is an AnsiToWin32 object. + return self.stream.wrapped is sys.stdout + + return self.stream is sys.stdout + + def should_color(self): + # Don't colorize things if we do not have colorama or if told not to + if not colorama or self._no_color: + return False + + real_stream = ( + self.stream if not isinstance(self.stream, colorama.AnsiToWin32) + else self.stream.wrapped + ) + + # If the stream is a tty we should color it + if hasattr(real_stream, "isatty") and real_stream.isatty(): + return True + + # If we have an ANSI term we should color it + if os.environ.get("TERM") == "ANSI": + return True + + # If anything else we should not color it + return False + + def format(self, record): + msg = logging.StreamHandler.format(self, record) + + if self.should_color(): + for level, color in self.COLORS: + if record.levelno >= level: + msg = color(msg) + break + + return msg + + # The logging module says handleError() can be customized. + def handleError(self, record): + exc_class, exc = sys.exc_info()[:2] + # If a broken pipe occurred while calling write() or flush() on the + # stdout stream in logging's Handler.emit(), then raise our special + # exception so we can handle it in main() instead of logging the + # broken pipe error and continuing. + if (exc_class and self._using_stdout() and + _is_broken_pipe_error(exc_class, exc)): + raise BrokenStdoutLoggingError() + + return super(ColorizedStreamHandler, self).handleError(record) + + +class BetterRotatingFileHandler(logging.handlers.RotatingFileHandler): + + def _open(self): + ensure_dir(os.path.dirname(self.baseFilename)) + return logging.handlers.RotatingFileHandler._open(self) + + +class MaxLevelFilter(Filter): + + def __init__(self, level): + self.level = level + + def filter(self, record): + return record.levelno < self.level + + +class ExcludeLoggerFilter(Filter): + + """ + A logging Filter that excludes records from a logger (or its children). + """ + + def filter(self, record): + # The base Filter class allows only records from a logger (or its + # children). + return not super(ExcludeLoggerFilter, self).filter(record) + + +def setup_logging(verbosity, no_color, user_log_file): + """Configures and sets up all of the logging + + Returns the requested logging level, as its integer value. + """ + + # Determine the level to be logging at. + if verbosity >= 1: + level = "DEBUG" + elif verbosity == -1: + level = "WARNING" + elif verbosity == -2: + level = "ERROR" + elif verbosity <= -3: + level = "CRITICAL" + else: + level = "INFO" + + level_number = getattr(logging, level) + + # The "root" logger should match the "console" level *unless* we also need + # to log to a user log file. + include_user_log = user_log_file is not None + if include_user_log: + additional_log_file = user_log_file + root_level = "DEBUG" + else: + additional_log_file = "/dev/null" + root_level = level + + # Disable any logging besides WARNING unless we have DEBUG level logging + # enabled for vendored libraries. + vendored_log_level = "WARNING" if level in ["INFO", "ERROR"] else "DEBUG" + + # Shorthands for clarity + log_streams = { + "stdout": "ext://sys.stdout", + "stderr": "ext://sys.stderr", + } + handler_classes = { + "stream": "pip._internal.utils.logging.ColorizedStreamHandler", + "file": "pip._internal.utils.logging.BetterRotatingFileHandler", + } + handlers = ["console", "console_errors", "console_subprocess"] + ( + ["user_log"] if include_user_log else [] + ) + + logging.config.dictConfig({ + "version": 1, + "disable_existing_loggers": False, + "filters": { + "exclude_warnings": { + "()": "pip._internal.utils.logging.MaxLevelFilter", + "level": logging.WARNING, + }, + "restrict_to_subprocess": { + "()": "logging.Filter", + "name": subprocess_logger.name, + }, + "exclude_subprocess": { + "()": "pip._internal.utils.logging.ExcludeLoggerFilter", + "name": subprocess_logger.name, + }, + }, + "formatters": { + "indent": { + "()": IndentingFormatter, + "format": "%(message)s", + }, + "indent_with_timestamp": { + "()": IndentingFormatter, + "format": "%(message)s", + "add_timestamp": True, + }, + }, + "handlers": { + "console": { + "level": level, + "class": handler_classes["stream"], + "no_color": no_color, + "stream": log_streams["stdout"], + "filters": ["exclude_subprocess", "exclude_warnings"], + "formatter": "indent", + }, + "console_errors": { + "level": "WARNING", + "class": handler_classes["stream"], + "no_color": no_color, + "stream": log_streams["stderr"], + "filters": ["exclude_subprocess"], + "formatter": "indent", + }, + # A handler responsible for logging to the console messages + # from the "subprocessor" logger. + "console_subprocess": { + "level": level, + "class": handler_classes["stream"], + "no_color": no_color, + "stream": log_streams["stderr"], + "filters": ["restrict_to_subprocess"], + "formatter": "indent", + }, + "user_log": { + "level": "DEBUG", + "class": handler_classes["file"], + "filename": additional_log_file, + "delay": True, + "formatter": "indent_with_timestamp", + }, + }, + "root": { + "level": root_level, + "handlers": handlers, + }, + "loggers": { + "pip._vendor": { + "level": vendored_log_level + } + }, + }) + + return level_number diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/logging 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/logging 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..01a621f289d46f6952890be80f0a23aa8fe7cc68 GIT binary patch literal 12804 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 literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/logging.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/logging.py new file mode 100644 index 0000000..7767111 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/logging.py @@ -0,0 +1,398 @@ +# The following comment should be removed at some point in the future. +# mypy: disallow-untyped-defs=False + +from __future__ import absolute_import + +import contextlib +import errno +import logging +import logging.handlers +import os +import sys +from logging import Filter, getLogger + +from pip._vendor.six import PY2 + +from pip._internal.utils.compat import WINDOWS +from pip._internal.utils.deprecation import DEPRECATION_MSG_PREFIX +from pip._internal.utils.misc import ensure_dir + +try: + import threading +except ImportError: + import dummy_threading as threading # type: ignore + + +try: + # Use "import as" and set colorama in the else clause to avoid mypy + # errors and get the following correct revealed type for colorama: + # `Union[_importlib_modulespec.ModuleType, None]` + # Otherwise, we get an error like the following in the except block: + # > Incompatible types in assignment (expression has type "None", + # variable has type Module) + # TODO: eliminate the need to use "import as" once mypy addresses some + # of its issues with conditional imports. Here is an umbrella issue: + # https://github.com/python/mypy/issues/1297 + from pip._vendor import colorama as _colorama +# Lots of different errors can come from this, including SystemError and +# ImportError. +except Exception: + colorama = None +else: + # Import Fore explicitly rather than accessing below as colorama.Fore + # to avoid the following error running mypy: + # > Module has no attribute "Fore" + # TODO: eliminate the need to import Fore once mypy addresses some of its + # issues with conditional imports. This particular case could be an + # instance of the following issue (but also see the umbrella issue above): + # https://github.com/python/mypy/issues/3500 + from pip._vendor.colorama import Fore + + colorama = _colorama + + +_log_state = threading.local() +_log_state.indentation = 0 +subprocess_logger = getLogger('pip.subprocessor') + + +class BrokenStdoutLoggingError(Exception): + """ + Raised if BrokenPipeError occurs for the stdout stream while logging. + """ + pass + + +# BrokenPipeError does not exist in Python 2 and, in addition, manifests +# differently in Windows and non-Windows. +if WINDOWS: + # In Windows, a broken pipe can show up as EINVAL rather than EPIPE: + # https://bugs.python.org/issue19612 + # https://bugs.python.org/issue30418 + if PY2: + def _is_broken_pipe_error(exc_class, exc): + """See the docstring for non-Windows Python 3 below.""" + return (exc_class is IOError and + exc.errno in (errno.EINVAL, errno.EPIPE)) + else: + # In Windows, a broken pipe IOError became OSError in Python 3. + def _is_broken_pipe_error(exc_class, exc): + """See the docstring for non-Windows Python 3 below.""" + return ((exc_class is BrokenPipeError) or # noqa: F821 + (exc_class is OSError and + exc.errno in (errno.EINVAL, errno.EPIPE))) +elif PY2: + def _is_broken_pipe_error(exc_class, exc): + """See the docstring for non-Windows Python 3 below.""" + return (exc_class is IOError and exc.errno == errno.EPIPE) +else: + # Then we are in the non-Windows Python 3 case. + def _is_broken_pipe_error(exc_class, exc): + """ + Return whether an exception is a broken pipe error. + + Args: + exc_class: an exception class. + exc: an exception instance. + """ + return (exc_class is BrokenPipeError) # noqa: F821 + + +@contextlib.contextmanager +def indent_log(num=2): + """ + A context manager which will cause the log output to be indented for any + log messages emitted inside it. + """ + _log_state.indentation += num + try: + yield + finally: + _log_state.indentation -= num + + +def get_indentation(): + return getattr(_log_state, 'indentation', 0) + + +class IndentingFormatter(logging.Formatter): + + def __init__(self, *args, **kwargs): + """ + A logging.Formatter that obeys the indent_log() context manager. + + :param add_timestamp: A bool indicating output lines should be prefixed + with their record's timestamp. + """ + self.add_timestamp = kwargs.pop("add_timestamp", False) + super(IndentingFormatter, self).__init__(*args, **kwargs) + + def get_message_start(self, formatted, levelno): + """ + Return the start of the formatted log message (not counting the + prefix to add to each line). + """ + if levelno < logging.WARNING: + return '' + if formatted.startswith(DEPRECATION_MSG_PREFIX): + # Then the message already has a prefix. We don't want it to + # look like "WARNING: DEPRECATION: ...." + return '' + if levelno < logging.ERROR: + return 'WARNING: ' + + return 'ERROR: ' + + def format(self, record): + """ + Calls the standard formatter, but will indent all of the log message + lines by our current indentation level. + """ + formatted = super(IndentingFormatter, self).format(record) + message_start = self.get_message_start(formatted, record.levelno) + formatted = message_start + formatted + + prefix = '' + if self.add_timestamp: + # TODO: Use Formatter.default_time_format after dropping PY2. + t = self.formatTime(record, "%Y-%m-%dT%H:%M:%S") + prefix = '%s,%03d ' % (t, record.msecs) + prefix += " " * get_indentation() + formatted = "".join([ + prefix + line + for line in formatted.splitlines(True) + ]) + return formatted + + +def _color_wrap(*colors): + def wrapped(inp): + return "".join(list(colors) + [inp, colorama.Style.RESET_ALL]) + return wrapped + + +class ColorizedStreamHandler(logging.StreamHandler): + + # Don't build up a list of colors if we don't have colorama + if colorama: + COLORS = [ + # This needs to be in order from highest logging level to lowest. + (logging.ERROR, _color_wrap(Fore.RED)), + (logging.WARNING, _color_wrap(Fore.YELLOW)), + ] + else: + COLORS = [] + + def __init__(self, stream=None, no_color=None): + logging.StreamHandler.__init__(self, stream) + self._no_color = no_color + + if WINDOWS and colorama: + self.stream = colorama.AnsiToWin32(self.stream) + + def _using_stdout(self): + """ + Return whether the handler is using sys.stdout. + """ + if WINDOWS and colorama: + # Then self.stream is an AnsiToWin32 object. + return self.stream.wrapped is sys.stdout + + return self.stream is sys.stdout + + def should_color(self): + # Don't colorize things if we do not have colorama or if told not to + if not colorama or self._no_color: + return False + + real_stream = ( + self.stream if not isinstance(self.stream, colorama.AnsiToWin32) + else self.stream.wrapped + ) + + # If the stream is a tty we should color it + if hasattr(real_stream, "isatty") and real_stream.isatty(): + return True + + # If we have an ANSI term we should color it + if os.environ.get("TERM") == "ANSI": + return True + + # If anything else we should not color it + return False + + def format(self, record): + msg = logging.StreamHandler.format(self, record) + + if self.should_color(): + for level, color in self.COLORS: + if record.levelno >= level: + msg = color(msg) + break + + return msg + + # The logging module says handleError() can be customized. + def handleError(self, record): + exc_class, exc = sys.exc_info()[:2] + # If a broken pipe occurred while calling write() or flush() on the + # stdout stream in logging's Handler.emit(), then raise our special + # exception so we can handle it in main() instead of logging the + # broken pipe error and continuing. + if (exc_class and self._using_stdout() and + _is_broken_pipe_error(exc_class, exc)): + raise BrokenStdoutLoggingError() + + return super(ColorizedStreamHandler, self).handleError(record) + + +class BetterRotatingFileHandler(logging.handlers.RotatingFileHandler): + + def _open(self): + ensure_dir(os.path.dirname(self.baseFilename)) + return logging.handlers.RotatingFileHandler._open(self) + + +class MaxLevelFilter(Filter): + + def __init__(self, level): + self.level = level + + def filter(self, record): + return record.levelno < self.level + + +class ExcludeLoggerFilter(Filter): + + """ + A logging Filter that excludes records from a logger (or its children). + """ + + def filter(self, record): + # The base Filter class allows only records from a logger (or its + # children). + return not super(ExcludeLoggerFilter, self).filter(record) + + +def setup_logging(verbosity, no_color, user_log_file): + """Configures and sets up all of the logging + + Returns the requested logging level, as its integer value. + """ + + # Determine the level to be logging at. + if verbosity >= 1: + level = "DEBUG" + elif verbosity == -1: + level = "WARNING" + elif verbosity == -2: + level = "ERROR" + elif verbosity <= -3: + level = "CRITICAL" + else: + level = "INFO" + + level_number = getattr(logging, level) + + # The "root" logger should match the "console" level *unless* we also need + # to log to a user log file. + include_user_log = user_log_file is not None + if include_user_log: + additional_log_file = user_log_file + root_level = "DEBUG" + else: + additional_log_file = "/dev/null" + root_level = level + + # Disable any logging besides WARNING unless we have DEBUG level logging + # enabled for vendored libraries. + vendored_log_level = "WARNING" if level in ["INFO", "ERROR"] else "DEBUG" + + # Shorthands for clarity + log_streams = { + "stdout": "ext://sys.stdout", + "stderr": "ext://sys.stderr", + } + handler_classes = { + "stream": "pip._internal.utils.logging.ColorizedStreamHandler", + "file": "pip._internal.utils.logging.BetterRotatingFileHandler", + } + handlers = ["console", "console_errors", "console_subprocess"] + ( + ["user_log"] if include_user_log else [] + ) + + logging.config.dictConfig({ + "version": 1, + "disable_existing_loggers": False, + "filters": { + "exclude_warnings": { + "()": "pip._internal.utils.logging.MaxLevelFilter", + "level": logging.WARNING, + }, + "restrict_to_subprocess": { + "()": "logging.Filter", + "name": subprocess_logger.name, + }, + "exclude_subprocess": { + "()": "pip._internal.utils.logging.ExcludeLoggerFilter", + "name": subprocess_logger.name, + }, + }, + "formatters": { + "indent": { + "()": IndentingFormatter, + "format": "%(message)s", + }, + "indent_with_timestamp": { + "()": IndentingFormatter, + "format": "%(message)s", + "add_timestamp": True, + }, + }, + "handlers": { + "console": { + "level": level, + "class": handler_classes["stream"], + "no_color": no_color, + "stream": log_streams["stdout"], + "filters": ["exclude_subprocess", "exclude_warnings"], + "formatter": "indent", + }, + "console_errors": { + "level": "WARNING", + "class": handler_classes["stream"], + "no_color": no_color, + "stream": log_streams["stderr"], + "filters": ["exclude_subprocess"], + "formatter": "indent", + }, + # A handler responsible for logging to the console messages + # from the "subprocessor" logger. + "console_subprocess": { + "level": level, + "class": handler_classes["stream"], + "no_color": no_color, + "stream": log_streams["stderr"], + "filters": ["restrict_to_subprocess"], + "formatter": "indent", + }, + "user_log": { + "level": "DEBUG", + "class": handler_classes["file"], + "filename": additional_log_file, + "delay": True, + "formatter": "indent_with_timestamp", + }, + }, + "root": { + "level": root_level, + "handlers": handlers, + }, + "loggers": { + "pip._vendor": { + "level": vendored_log_level + } + }, + }) + + return level_number diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/logging.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/logging.pyc new file mode 100644 index 0000000000000000000000000000000000000000..73033a0ff05d04cafade4e1a5bb0ec66d1e7d959 GIT binary patch literal 12804 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 literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/marker_files 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/marker_files 2.py new file mode 100644 index 0000000..42ea814 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/marker_files 2.py @@ -0,0 +1,25 @@ +import os.path + +DELETE_MARKER_MESSAGE = '''\ +This file is placed here by pip to indicate the source was put +here by pip. + +Once this package is successfully installed this source code will be +deleted (unless you remove this file). +''' +PIP_DELETE_MARKER_FILENAME = 'pip-delete-this-directory.txt' + + +def has_delete_marker_file(directory): + # type: (str) -> bool + return os.path.exists(os.path.join(directory, PIP_DELETE_MARKER_FILENAME)) + + +def write_delete_marker_file(directory): + # type: (str) -> None + """ + Write the pip delete marker file into this directory. + """ + filepath = os.path.join(directory, PIP_DELETE_MARKER_FILENAME) + with open(filepath, 'w') as marker_fp: + marker_fp.write(DELETE_MARKER_MESSAGE) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/marker_files 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/marker_files 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3d0b10cc5034f74a52be2ae9ad17cb0008944068 GIT binary patch literal 1281 zcmd5*!EVz)5MA3zX)SuGC_+exJ%&T#Rz>Os3K2D^q7B697`XOcW;o|xn&2(@Q_;Z+M?8srl zWk)U(9y{`wXt2*1Y%tNZPLp8$)&d?;KXLTTS9A|X%J6~GlH*$FB$a}XWGVS^%?nj< z$hpddN)wPAMv|MnDpSd)38E|TZ$LY~|0csNpo~S5o+Lw?)KqCIjTuy0*O<#dqBUM( zVe@QhE-}4=BcUJM;+fh!0NHW_6*;qd~KmhnL=LH z9XNy3K?GR??FE{7h!Ze2cG%dxay)j9!3Mi@*(LEq2YRh0A&KVP;2vI-zzB#sd8Q1^ zV&hz8a35p)JNxl=xEmgX@m@E29Y*oXo!zk4-3x6tSVGKoWi9+*b}|ONpeWS@$qgn+ z84PkQWNCt75r~iD;it!g^|j;mjk=z|7yvdmrlU0+!z?%m=;?Dd+uiNZ?7yRswHWJ? zWtQlm0;NrGnv^H9jEOkYDQdWj_l^=1&zOsEY%k-Ep=UGKvge^kueR)Mp>xe1k>(L; z7Y?y^j=ks5=a)O|!e!?!8#fsehLk#o*p+YJP1u_u94n)X_^aEZ`ZM1hFXM@ULt>B&^rC4*-S#j*Y9EhD9702G4k>q2*@)Hp>BDH_N c>)-YyG5_Q=7nPPt<8 literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/marker_files.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/marker_files.py new file mode 100644 index 0000000..42ea814 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/marker_files.py @@ -0,0 +1,25 @@ +import os.path + +DELETE_MARKER_MESSAGE = '''\ +This file is placed here by pip to indicate the source was put +here by pip. + +Once this package is successfully installed this source code will be +deleted (unless you remove this file). +''' +PIP_DELETE_MARKER_FILENAME = 'pip-delete-this-directory.txt' + + +def has_delete_marker_file(directory): + # type: (str) -> bool + return os.path.exists(os.path.join(directory, PIP_DELETE_MARKER_FILENAME)) + + +def write_delete_marker_file(directory): + # type: (str) -> None + """ + Write the pip delete marker file into this directory. + """ + filepath = os.path.join(directory, PIP_DELETE_MARKER_FILENAME) + with open(filepath, 'w') as marker_fp: + marker_fp.write(DELETE_MARKER_MESSAGE) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/marker_files.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/marker_files.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ca70aa0210fa24ad577a88a62def46ea61775cc4 GIT binary patch literal 1281 zcmd5*!EVz)5MA3zX)SuGC_+exJ%&T#mR9rvg$fL+XhU%-73F~CdN;|YTibZYNsZc5 zx$`|7`6fO9W;SUl5_ec-cE_`CXJ_A=ct4i?v+vJ7rffc3TwkD>4o(7p4%3YF9VT4X zcbV{5-(#Y|zF@GyMAJG=g7sPpctrig(KX-DJsc^+2TDthYoU`=3Oj{hjU~6MKTEj8Sg2RBGK4-K2cm7FCvU8V>n+ypa{4Jd5)9MaU7Lu-c{6TvugOPnt4lR z*nYNAuIcO8lRzp>yRBQeL})CcKt$;ylFMqA7cv79a!U8WDtdpav>*0*J8wc;Rb&-k zL=4en#RX@ str + pip_pkg_dir = os.path.join(os.path.dirname(__file__), "..", "..") + pip_pkg_dir = os.path.abspath(pip_pkg_dir) + + return ( + 'pip {} from {} (python {})'.format( + __version__, pip_pkg_dir, get_major_minor_version(), + ) + ) + + +def normalize_version_info(py_version_info): + # type: (Tuple[int, ...]) -> Tuple[int, int, int] + """ + Convert a tuple of ints representing a Python version to one of length + three. + + :param py_version_info: a tuple of ints representing a Python version, + or None to specify no version. The tuple can have any length. + + :return: a tuple of length three if `py_version_info` is non-None. + Otherwise, return `py_version_info` unchanged (i.e. None). + """ + if len(py_version_info) < 3: + py_version_info += (3 - len(py_version_info)) * (0,) + elif len(py_version_info) > 3: + py_version_info = py_version_info[:3] + + return cast('VersionInfo', py_version_info) + + +def ensure_dir(path): + # type: (AnyStr) -> None + """os.path.makedirs without EEXIST.""" + try: + os.makedirs(path) + except OSError as e: + # Windows can raise spurious ENOTEMPTY errors. See #6426. + if e.errno != errno.EEXIST and e.errno != errno.ENOTEMPTY: + raise + + +def get_prog(): + # type: () -> str + try: + prog = os.path.basename(sys.argv[0]) + if prog in ('__main__.py', '-c'): + return "%s -m pip" % sys.executable + else: + return prog + except (AttributeError, TypeError, IndexError): + pass + return 'pip' + + +# Retry every half second for up to 3 seconds +@retry(stop_max_delay=3000, wait_fixed=500) +def rmtree(dir, ignore_errors=False): + # type: (str, bool) -> None + shutil.rmtree(dir, ignore_errors=ignore_errors, + onerror=rmtree_errorhandler) + + +def rmtree_errorhandler(func, path, exc_info): + """On Windows, the files in .svn are read-only, so when rmtree() tries to + remove them, an exception is thrown. We catch that here, remove the + read-only attribute, and hopefully continue without problems.""" + try: + has_attr_readonly = not (os.stat(path).st_mode & stat.S_IWRITE) + except (IOError, OSError): + # it's equivalent to os.path.exists + return + + if has_attr_readonly: + # convert to read/write + os.chmod(path, stat.S_IWRITE) + # use the original function to repeat the operation + func(path) + return + else: + raise + + +def path_to_display(path): + # type: (Optional[Union[str, Text]]) -> Optional[Text] + """ + Convert a bytes (or text) path to text (unicode in Python 2) for display + and logging purposes. + + This function should never error out. Also, this function is mainly needed + for Python 2 since in Python 3 str paths are already text. + """ + if path is None: + return None + if isinstance(path, text_type): + return path + # Otherwise, path is a bytes object (str in Python 2). + try: + display_path = path.decode(sys.getfilesystemencoding(), 'strict') + except UnicodeDecodeError: + # Include the full bytes to make troubleshooting easier, even though + # it may not be very human readable. + if PY2: + # Convert the bytes to a readable str representation using + # repr(), and then convert the str to unicode. + # Also, we add the prefix "b" to the repr() return value both + # to make the Python 2 output look like the Python 3 output, and + # to signal to the user that this is a bytes representation. + display_path = str_to_display('b{!r}'.format(path)) + else: + # Silence the "F821 undefined name 'ascii'" flake8 error since + # in Python 3 ascii() is a built-in. + display_path = ascii(path) # noqa: F821 + + return display_path + + +def display_path(path): + # type: (Union[str, Text]) -> str + """Gives the display value for a given path, making it relative to cwd + if possible.""" + path = os.path.normcase(os.path.abspath(path)) + if sys.version_info[0] == 2: + path = path.decode(sys.getfilesystemencoding(), 'replace') + path = path.encode(sys.getdefaultencoding(), 'replace') + if path.startswith(os.getcwd() + os.path.sep): + path = '.' + path[len(os.getcwd()):] + return path + + +def backup_dir(dir, ext='.bak'): + # type: (str, str) -> str + """Figure out the name of a directory to back up the given dir to + (adding .bak, .bak2, etc)""" + n = 1 + extension = ext + while os.path.exists(dir + extension): + n += 1 + extension = ext + str(n) + return dir + extension + + +def ask_path_exists(message, options): + # type: (str, Iterable[str]) -> str + for action in os.environ.get('PIP_EXISTS_ACTION', '').split(): + if action in options: + return action + return ask(message, options) + + +def _check_no_input(message): + # type: (str) -> None + """Raise an error if no input is allowed.""" + if os.environ.get('PIP_NO_INPUT'): + raise Exception( + 'No input was expected ($PIP_NO_INPUT set); question: %s' % + message + ) + + +def ask(message, options): + # type: (str, Iterable[str]) -> str + """Ask the message interactively, with the given possible responses""" + while 1: + _check_no_input(message) + response = input(message) + response = response.strip().lower() + if response not in options: + print( + 'Your response (%r) was not one of the expected responses: ' + '%s' % (response, ', '.join(options)) + ) + else: + return response + + +def ask_input(message): + # type: (str) -> str + """Ask for input interactively.""" + _check_no_input(message) + return input(message) + + +def ask_password(message): + # type: (str) -> str + """Ask for a password interactively.""" + _check_no_input(message) + return getpass.getpass(message) + + +def format_size(bytes): + # type: (float) -> str + if bytes > 1000 * 1000: + return '%.1f MB' % (bytes / 1000.0 / 1000) + elif bytes > 10 * 1000: + return '%i kB' % (bytes / 1000) + elif bytes > 1000: + return '%.1f kB' % (bytes / 1000.0) + else: + return '%i bytes' % bytes + + +def is_installable_dir(path): + # type: (str) -> bool + """Is path is a directory containing setup.py or pyproject.toml? + """ + if not os.path.isdir(path): + return False + setup_py = os.path.join(path, 'setup.py') + if os.path.isfile(setup_py): + return True + pyproject_toml = os.path.join(path, 'pyproject.toml') + if os.path.isfile(pyproject_toml): + return True + return False + + +def read_chunks(file, size=io.DEFAULT_BUFFER_SIZE): + """Yield pieces of data from a file-like object until EOF.""" + while True: + chunk = file.read(size) + if not chunk: + break + yield chunk + + +def normalize_path(path, resolve_symlinks=True): + # type: (str, bool) -> str + """ + Convert a path to its canonical, case-normalized, absolute version. + + """ + path = expanduser(path) + if resolve_symlinks: + path = os.path.realpath(path) + else: + path = os.path.abspath(path) + return os.path.normcase(path) + + +def splitext(path): + # type: (str) -> Tuple[str, str] + """Like os.path.splitext, but take off .tar too""" + base, ext = posixpath.splitext(path) + if base.lower().endswith('.tar'): + ext = base[-4:] + ext + base = base[:-4] + return base, ext + + +def renames(old, new): + # type: (str, str) -> None + """Like os.renames(), but handles renaming across devices.""" + # Implementation borrowed from os.renames(). + head, tail = os.path.split(new) + if head and tail and not os.path.exists(head): + os.makedirs(head) + + shutil.move(old, new) + + head, tail = os.path.split(old) + if head and tail: + try: + os.removedirs(head) + except OSError: + pass + + +def is_local(path): + # type: (str) -> bool + """ + Return True if path is within sys.prefix, if we're running in a virtualenv. + + If we're not in a virtualenv, all paths are considered "local." + + Caution: this function assumes the head of path has been normalized + with normalize_path. + """ + if not running_under_virtualenv(): + return True + return path.startswith(normalize_path(sys.prefix)) + + +def dist_is_local(dist): + # type: (Distribution) -> bool + """ + Return True if given Distribution object is installed locally + (i.e. within current virtualenv). + + Always True if we're not in a virtualenv. + + """ + return is_local(dist_location(dist)) + + +def dist_in_usersite(dist): + # type: (Distribution) -> bool + """ + Return True if given Distribution is installed in user site. + """ + return dist_location(dist).startswith(normalize_path(user_site)) + + +def dist_in_site_packages(dist): + # type: (Distribution) -> bool + """ + Return True if given Distribution is installed in + sysconfig.get_python_lib(). + """ + return dist_location(dist).startswith(normalize_path(site_packages)) + + +def dist_is_editable(dist): + # type: (Distribution) -> bool + """ + Return True if given Distribution is an editable install. + """ + for path_item in sys.path: + egg_link = os.path.join(path_item, dist.project_name + '.egg-link') + if os.path.isfile(egg_link): + return True + return False + + +def get_installed_distributions( + local_only=True, # type: bool + skip=stdlib_pkgs, # type: Container[str] + include_editables=True, # type: bool + editables_only=False, # type: bool + user_only=False, # type: bool + paths=None # type: Optional[List[str]] +): + # type: (...) -> List[Distribution] + """ + Return a list of installed Distribution objects. + + If ``local_only`` is True (default), only return installations + local to the current virtualenv, if in a virtualenv. + + ``skip`` argument is an iterable of lower-case project names to + ignore; defaults to stdlib_pkgs + + If ``include_editables`` is False, don't report editables. + + If ``editables_only`` is True , only report editables. + + If ``user_only`` is True , only report installations in the user + site directory. + + If ``paths`` is set, only report the distributions present at the + specified list of locations. + """ + if paths: + working_set = pkg_resources.WorkingSet(paths) + else: + working_set = pkg_resources.working_set + + if local_only: + local_test = dist_is_local + else: + def local_test(d): + return True + + if include_editables: + def editable_test(d): + return True + else: + def editable_test(d): + return not dist_is_editable(d) + + if editables_only: + def editables_only_test(d): + return dist_is_editable(d) + else: + def editables_only_test(d): + return True + + if user_only: + user_test = dist_in_usersite + else: + def user_test(d): + return True + + return [d for d in working_set + if local_test(d) and + d.key not in skip and + editable_test(d) and + editables_only_test(d) and + user_test(d) + ] + + +def egg_link_path(dist): + # type: (Distribution) -> Optional[str] + """ + Return the path for the .egg-link file if it exists, otherwise, None. + + There's 3 scenarios: + 1) not in a virtualenv + try to find in site.USER_SITE, then site_packages + 2) in a no-global virtualenv + try to find in site_packages + 3) in a yes-global virtualenv + try to find in site_packages, then site.USER_SITE + (don't look in global location) + + For #1 and #3, there could be odd cases, where there's an egg-link in 2 + locations. + + This method will just return the first one found. + """ + sites = [] + if running_under_virtualenv(): + sites.append(site_packages) + if not virtualenv_no_global() and user_site: + sites.append(user_site) + else: + if user_site: + sites.append(user_site) + sites.append(site_packages) + + for site in sites: + egglink = os.path.join(site, dist.project_name) + '.egg-link' + if os.path.isfile(egglink): + return egglink + return None + + +def dist_location(dist): + # type: (Distribution) -> str + """ + Get the site-packages location of this distribution. Generally + this is dist.location, except in the case of develop-installed + packages, where dist.location is the source code location, and we + want to know where the egg-link file is. + + The returned location is normalized (in particular, with symlinks removed). + """ + egg_link = egg_link_path(dist) + if egg_link: + return normalize_path(egg_link) + return normalize_path(dist.location) + + +def write_output(msg, *args): + # type: (str, str) -> None + logger.info(msg, *args) + + +class FakeFile(object): + """Wrap a list of lines in an object with readline() to make + ConfigParser happy.""" + def __init__(self, lines): + self._gen = (l for l in lines) + + def readline(self): + try: + try: + return next(self._gen) + except NameError: + return self._gen.next() + except StopIteration: + return '' + + def __iter__(self): + return self._gen + + +class StreamWrapper(StringIO): + + @classmethod + def from_stream(cls, orig_stream): + cls.orig_stream = orig_stream + return cls() + + # compileall.compile_dir() needs stdout.encoding to print to stdout + @property + def encoding(self): + return self.orig_stream.encoding + + +@contextlib.contextmanager +def captured_output(stream_name): + """Return a context manager used by captured_stdout/stdin/stderr + that temporarily replaces the sys stream *stream_name* with a StringIO. + + Taken from Lib/support/__init__.py in the CPython repo. + """ + orig_stdout = getattr(sys, stream_name) + setattr(sys, stream_name, StreamWrapper.from_stream(orig_stdout)) + try: + yield getattr(sys, stream_name) + finally: + setattr(sys, stream_name, orig_stdout) + + +def captured_stdout(): + """Capture the output of sys.stdout: + + with captured_stdout() as stdout: + print('hello') + self.assertEqual(stdout.getvalue(), 'hello\n') + + Taken from Lib/support/__init__.py in the CPython repo. + """ + return captured_output('stdout') + + +def captured_stderr(): + """ + See captured_stdout(). + """ + return captured_output('stderr') + + +class cached_property(object): + """A property that is only computed once per instance and then replaces + itself with an ordinary attribute. Deleting the attribute resets the + property. + + Source: https://github.com/bottlepy/bottle/blob/0.11.5/bottle.py#L175 + """ + + def __init__(self, func): + self.__doc__ = getattr(func, '__doc__') + self.func = func + + def __get__(self, obj, cls): + if obj is None: + # We're being accessed from the class itself, not from an object + return self + value = obj.__dict__[self.func.__name__] = self.func(obj) + return value + + +def get_installed_version(dist_name, working_set=None): + """Get the installed version of dist_name avoiding pkg_resources cache""" + # Create a requirement that we'll look for inside of setuptools. + req = pkg_resources.Requirement.parse(dist_name) + + if working_set is None: + # We want to avoid having this cached, so we need to construct a new + # working set each time. + working_set = pkg_resources.WorkingSet() + + # Get the installed distribution from our working set + dist = working_set.find(req) + + # Check to see if we got an installed distribution or not, if we did + # we want to return it's version. + return dist.version if dist else None + + +def consume(iterator): + """Consume an iterable at C speed.""" + deque(iterator, maxlen=0) + + +# Simulates an enum +def enum(*sequential, **named): + enums = dict(zip(sequential, range(len(sequential))), **named) + reverse = {value: key for key, value in enums.items()} + enums['reverse_mapping'] = reverse + return type('Enum', (), enums) + + +def build_netloc(host, port): + # type: (str, Optional[int]) -> str + """ + Build a netloc from a host-port pair + """ + if port is None: + return host + if ':' in host: + # Only wrap host with square brackets when it is IPv6 + host = '[{}]'.format(host) + return '{}:{}'.format(host, port) + + +def build_url_from_netloc(netloc, scheme='https'): + # type: (str, str) -> str + """ + Build a full URL from a netloc. + """ + if netloc.count(':') >= 2 and '@' not in netloc and '[' not in netloc: + # It must be a bare IPv6 address, so wrap it with brackets. + netloc = '[{}]'.format(netloc) + return '{}://{}'.format(scheme, netloc) + + +def parse_netloc(netloc): + # type: (str) -> Tuple[str, Optional[int]] + """ + Return the host-port pair from a netloc. + """ + url = build_url_from_netloc(netloc) + parsed = urllib_parse.urlparse(url) + return parsed.hostname, parsed.port + + +def split_auth_from_netloc(netloc): + """ + Parse out and remove the auth information from a netloc. + + Returns: (netloc, (username, password)). + """ + if '@' not in netloc: + return netloc, (None, None) + + # Split from the right because that's how urllib.parse.urlsplit() + # behaves if more than one @ is present (which can be checked using + # the password attribute of urlsplit()'s return value). + auth, netloc = netloc.rsplit('@', 1) + if ':' in auth: + # Split from the left because that's how urllib.parse.urlsplit() + # behaves if more than one : is present (which again can be checked + # using the password attribute of the return value) + user_pass = auth.split(':', 1) + else: + user_pass = auth, None + + user_pass = tuple( + None if x is None else urllib_unquote(x) for x in user_pass + ) + + return netloc, user_pass + + +def redact_netloc(netloc): + # type: (str) -> str + """ + Replace the sensitive data in a netloc with "****", if it exists. + + For example: + - "user:pass@example.com" returns "user:****@example.com" + - "accesstoken@example.com" returns "****@example.com" + """ + netloc, (user, password) = split_auth_from_netloc(netloc) + if user is None: + return netloc + if password is None: + user = '****' + password = '' + else: + user = urllib_parse.quote(user) + password = ':****' + return '{user}{password}@{netloc}'.format(user=user, + password=password, + netloc=netloc) + + +def _transform_url(url, transform_netloc): + """Transform and replace netloc in a url. + + transform_netloc is a function taking the netloc and returning a + tuple. The first element of this tuple is the new netloc. The + entire tuple is returned. + + Returns a tuple containing the transformed url as item 0 and the + original tuple returned by transform_netloc as item 1. + """ + purl = urllib_parse.urlsplit(url) + netloc_tuple = transform_netloc(purl.netloc) + # stripped url + url_pieces = ( + purl.scheme, netloc_tuple[0], purl.path, purl.query, purl.fragment + ) + surl = urllib_parse.urlunsplit(url_pieces) + return surl, netloc_tuple + + +def _get_netloc(netloc): + return split_auth_from_netloc(netloc) + + +def _redact_netloc(netloc): + return (redact_netloc(netloc),) + + +def split_auth_netloc_from_url(url): + # type: (str) -> Tuple[str, str, Tuple[str, str]] + """ + Parse a url into separate netloc, auth, and url with no auth. + + Returns: (url_without_auth, netloc, (username, password)) + """ + url_without_auth, (netloc, auth) = _transform_url(url, _get_netloc) + return url_without_auth, netloc, auth + + +def remove_auth_from_url(url): + # type: (str) -> str + """Return a copy of url with 'username:password@' removed.""" + # username/pass params are passed to subversion through flags + # and are not recognized in the url. + return _transform_url(url, _get_netloc)[0] + + +def redact_auth_from_url(url): + # type: (str) -> str + """Replace the password in a given url with ****.""" + return _transform_url(url, _redact_netloc)[0] + + +class HiddenText(object): + def __init__( + self, + secret, # type: str + redacted, # type: str + ): + # type: (...) -> None + self.secret = secret + self.redacted = redacted + + def __repr__(self): + # type: (...) -> str + return ''.format(str(self)) + + def __str__(self): + # type: (...) -> str + return self.redacted + + # This is useful for testing. + def __eq__(self, other): + # type: (Any) -> bool + if type(self) != type(other): + return False + + # The string being used for redaction doesn't also have to match, + # just the raw, original string. + return (self.secret == other.secret) + + # We need to provide an explicit __ne__ implementation for Python 2. + # TODO: remove this when we drop PY2 support. + def __ne__(self, other): + # type: (Any) -> bool + return not self == other + + +def hide_value(value): + # type: (str) -> HiddenText + return HiddenText(value, redacted='****') + + +def hide_url(url): + # type: (str) -> HiddenText + redacted = redact_auth_from_url(url) + return HiddenText(url, redacted=redacted) + + +def protect_pip_from_modification_on_windows(modifying_pip): + # type: (bool) -> None + """Protection of pip.exe from modification on Windows + + On Windows, any operation modifying pip should be run as: + python -m pip ... + """ + pip_names = [ + "pip.exe", + "pip{}.exe".format(sys.version_info[0]), + "pip{}.{}.exe".format(*sys.version_info[:2]) + ] + + # See https://github.com/pypa/pip/issues/1299 for more discussion + should_show_use_python_msg = ( + modifying_pip and + WINDOWS and + os.path.basename(sys.argv[0]) in pip_names + ) + + if should_show_use_python_msg: + new_command = [ + sys.executable, "-m", "pip" + ] + sys.argv[1:] + raise CommandError( + 'To modify pip, please run the following command:\n{}' + .format(" ".join(new_command)) + ) + + +def is_console_interactive(): + # type: () -> bool + """Is this console interactive? + """ + return sys.stdin is not None and sys.stdin.isatty() + + +def hash_file(path, blocksize=1 << 20): + # type: (str, int) -> Tuple[Any, int] + """Return (hash, length) for path using hashlib.sha256() + """ + + h = hashlib.sha256() + length = 0 + with open(path, 'rb') as f: + for block in read_chunks(f, size=blocksize): + length += len(block) + h.update(block) + return h, length + + +def is_wheel_installed(): + """ + Return whether the wheel package is installed. + """ + try: + import wheel # noqa: F401 + except ImportError: + return False + + return True diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/misc 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/misc 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f1f12e0d76f3b3886f735712817dce90be24a8d9 GIT binary patch literal 33223 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 literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/misc.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/misc.py new file mode 100644 index 0000000..4a58160 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/misc.py @@ -0,0 +1,886 @@ +# The following comment should be removed at some point in the future. +# mypy: strict-optional=False +# mypy: disallow-untyped-defs=False + +from __future__ import absolute_import + +import contextlib +import errno +import getpass +import hashlib +import io +import logging +import os +import posixpath +import shutil +import stat +import sys +from collections import deque + +from pip._vendor import pkg_resources +# NOTE: retrying is not annotated in typeshed as on 2017-07-17, which is +# why we ignore the type on this import. +from pip._vendor.retrying import retry # type: ignore +from pip._vendor.six import PY2, text_type +from pip._vendor.six.moves import input +from pip._vendor.six.moves.urllib import parse as urllib_parse +from pip._vendor.six.moves.urllib.parse import unquote as urllib_unquote + +from pip import __version__ +from pip._internal.exceptions import CommandError +from pip._internal.locations import ( + get_major_minor_version, + site_packages, + user_site, +) +from pip._internal.utils.compat import ( + WINDOWS, + expanduser, + stdlib_pkgs, + str_to_display, +) +from pip._internal.utils.typing import MYPY_CHECK_RUNNING, cast +from pip._internal.utils.virtualenv import ( + running_under_virtualenv, + virtualenv_no_global, +) + +if PY2: + from io import BytesIO as StringIO +else: + from io import StringIO + +if MYPY_CHECK_RUNNING: + from typing import ( + Any, AnyStr, Container, Iterable, List, Optional, Text, + Tuple, Union, + ) + from pip._vendor.pkg_resources import Distribution + + VersionInfo = Tuple[int, int, int] + + +__all__ = ['rmtree', 'display_path', 'backup_dir', + 'ask', 'splitext', + 'format_size', 'is_installable_dir', + 'normalize_path', + 'renames', 'get_prog', + 'captured_stdout', 'ensure_dir', + 'get_installed_version', 'remove_auth_from_url'] + + +logger = logging.getLogger(__name__) + + +def get_pip_version(): + # type: () -> str + pip_pkg_dir = os.path.join(os.path.dirname(__file__), "..", "..") + pip_pkg_dir = os.path.abspath(pip_pkg_dir) + + return ( + 'pip {} from {} (python {})'.format( + __version__, pip_pkg_dir, get_major_minor_version(), + ) + ) + + +def normalize_version_info(py_version_info): + # type: (Tuple[int, ...]) -> Tuple[int, int, int] + """ + Convert a tuple of ints representing a Python version to one of length + three. + + :param py_version_info: a tuple of ints representing a Python version, + or None to specify no version. The tuple can have any length. + + :return: a tuple of length three if `py_version_info` is non-None. + Otherwise, return `py_version_info` unchanged (i.e. None). + """ + if len(py_version_info) < 3: + py_version_info += (3 - len(py_version_info)) * (0,) + elif len(py_version_info) > 3: + py_version_info = py_version_info[:3] + + return cast('VersionInfo', py_version_info) + + +def ensure_dir(path): + # type: (AnyStr) -> None + """os.path.makedirs without EEXIST.""" + try: + os.makedirs(path) + except OSError as e: + # Windows can raise spurious ENOTEMPTY errors. See #6426. + if e.errno != errno.EEXIST and e.errno != errno.ENOTEMPTY: + raise + + +def get_prog(): + # type: () -> str + try: + prog = os.path.basename(sys.argv[0]) + if prog in ('__main__.py', '-c'): + return "%s -m pip" % sys.executable + else: + return prog + except (AttributeError, TypeError, IndexError): + pass + return 'pip' + + +# Retry every half second for up to 3 seconds +@retry(stop_max_delay=3000, wait_fixed=500) +def rmtree(dir, ignore_errors=False): + # type: (str, bool) -> None + shutil.rmtree(dir, ignore_errors=ignore_errors, + onerror=rmtree_errorhandler) + + +def rmtree_errorhandler(func, path, exc_info): + """On Windows, the files in .svn are read-only, so when rmtree() tries to + remove them, an exception is thrown. We catch that here, remove the + read-only attribute, and hopefully continue without problems.""" + try: + has_attr_readonly = not (os.stat(path).st_mode & stat.S_IWRITE) + except (IOError, OSError): + # it's equivalent to os.path.exists + return + + if has_attr_readonly: + # convert to read/write + os.chmod(path, stat.S_IWRITE) + # use the original function to repeat the operation + func(path) + return + else: + raise + + +def path_to_display(path): + # type: (Optional[Union[str, Text]]) -> Optional[Text] + """ + Convert a bytes (or text) path to text (unicode in Python 2) for display + and logging purposes. + + This function should never error out. Also, this function is mainly needed + for Python 2 since in Python 3 str paths are already text. + """ + if path is None: + return None + if isinstance(path, text_type): + return path + # Otherwise, path is a bytes object (str in Python 2). + try: + display_path = path.decode(sys.getfilesystemencoding(), 'strict') + except UnicodeDecodeError: + # Include the full bytes to make troubleshooting easier, even though + # it may not be very human readable. + if PY2: + # Convert the bytes to a readable str representation using + # repr(), and then convert the str to unicode. + # Also, we add the prefix "b" to the repr() return value both + # to make the Python 2 output look like the Python 3 output, and + # to signal to the user that this is a bytes representation. + display_path = str_to_display('b{!r}'.format(path)) + else: + # Silence the "F821 undefined name 'ascii'" flake8 error since + # in Python 3 ascii() is a built-in. + display_path = ascii(path) # noqa: F821 + + return display_path + + +def display_path(path): + # type: (Union[str, Text]) -> str + """Gives the display value for a given path, making it relative to cwd + if possible.""" + path = os.path.normcase(os.path.abspath(path)) + if sys.version_info[0] == 2: + path = path.decode(sys.getfilesystemencoding(), 'replace') + path = path.encode(sys.getdefaultencoding(), 'replace') + if path.startswith(os.getcwd() + os.path.sep): + path = '.' + path[len(os.getcwd()):] + return path + + +def backup_dir(dir, ext='.bak'): + # type: (str, str) -> str + """Figure out the name of a directory to back up the given dir to + (adding .bak, .bak2, etc)""" + n = 1 + extension = ext + while os.path.exists(dir + extension): + n += 1 + extension = ext + str(n) + return dir + extension + + +def ask_path_exists(message, options): + # type: (str, Iterable[str]) -> str + for action in os.environ.get('PIP_EXISTS_ACTION', '').split(): + if action in options: + return action + return ask(message, options) + + +def _check_no_input(message): + # type: (str) -> None + """Raise an error if no input is allowed.""" + if os.environ.get('PIP_NO_INPUT'): + raise Exception( + 'No input was expected ($PIP_NO_INPUT set); question: %s' % + message + ) + + +def ask(message, options): + # type: (str, Iterable[str]) -> str + """Ask the message interactively, with the given possible responses""" + while 1: + _check_no_input(message) + response = input(message) + response = response.strip().lower() + if response not in options: + print( + 'Your response (%r) was not one of the expected responses: ' + '%s' % (response, ', '.join(options)) + ) + else: + return response + + +def ask_input(message): + # type: (str) -> str + """Ask for input interactively.""" + _check_no_input(message) + return input(message) + + +def ask_password(message): + # type: (str) -> str + """Ask for a password interactively.""" + _check_no_input(message) + return getpass.getpass(message) + + +def format_size(bytes): + # type: (float) -> str + if bytes > 1000 * 1000: + return '%.1f MB' % (bytes / 1000.0 / 1000) + elif bytes > 10 * 1000: + return '%i kB' % (bytes / 1000) + elif bytes > 1000: + return '%.1f kB' % (bytes / 1000.0) + else: + return '%i bytes' % bytes + + +def is_installable_dir(path): + # type: (str) -> bool + """Is path is a directory containing setup.py or pyproject.toml? + """ + if not os.path.isdir(path): + return False + setup_py = os.path.join(path, 'setup.py') + if os.path.isfile(setup_py): + return True + pyproject_toml = os.path.join(path, 'pyproject.toml') + if os.path.isfile(pyproject_toml): + return True + return False + + +def read_chunks(file, size=io.DEFAULT_BUFFER_SIZE): + """Yield pieces of data from a file-like object until EOF.""" + while True: + chunk = file.read(size) + if not chunk: + break + yield chunk + + +def normalize_path(path, resolve_symlinks=True): + # type: (str, bool) -> str + """ + Convert a path to its canonical, case-normalized, absolute version. + + """ + path = expanduser(path) + if resolve_symlinks: + path = os.path.realpath(path) + else: + path = os.path.abspath(path) + return os.path.normcase(path) + + +def splitext(path): + # type: (str) -> Tuple[str, str] + """Like os.path.splitext, but take off .tar too""" + base, ext = posixpath.splitext(path) + if base.lower().endswith('.tar'): + ext = base[-4:] + ext + base = base[:-4] + return base, ext + + +def renames(old, new): + # type: (str, str) -> None + """Like os.renames(), but handles renaming across devices.""" + # Implementation borrowed from os.renames(). + head, tail = os.path.split(new) + if head and tail and not os.path.exists(head): + os.makedirs(head) + + shutil.move(old, new) + + head, tail = os.path.split(old) + if head and tail: + try: + os.removedirs(head) + except OSError: + pass + + +def is_local(path): + # type: (str) -> bool + """ + Return True if path is within sys.prefix, if we're running in a virtualenv. + + If we're not in a virtualenv, all paths are considered "local." + + Caution: this function assumes the head of path has been normalized + with normalize_path. + """ + if not running_under_virtualenv(): + return True + return path.startswith(normalize_path(sys.prefix)) + + +def dist_is_local(dist): + # type: (Distribution) -> bool + """ + Return True if given Distribution object is installed locally + (i.e. within current virtualenv). + + Always True if we're not in a virtualenv. + + """ + return is_local(dist_location(dist)) + + +def dist_in_usersite(dist): + # type: (Distribution) -> bool + """ + Return True if given Distribution is installed in user site. + """ + return dist_location(dist).startswith(normalize_path(user_site)) + + +def dist_in_site_packages(dist): + # type: (Distribution) -> bool + """ + Return True if given Distribution is installed in + sysconfig.get_python_lib(). + """ + return dist_location(dist).startswith(normalize_path(site_packages)) + + +def dist_is_editable(dist): + # type: (Distribution) -> bool + """ + Return True if given Distribution is an editable install. + """ + for path_item in sys.path: + egg_link = os.path.join(path_item, dist.project_name + '.egg-link') + if os.path.isfile(egg_link): + return True + return False + + +def get_installed_distributions( + local_only=True, # type: bool + skip=stdlib_pkgs, # type: Container[str] + include_editables=True, # type: bool + editables_only=False, # type: bool + user_only=False, # type: bool + paths=None # type: Optional[List[str]] +): + # type: (...) -> List[Distribution] + """ + Return a list of installed Distribution objects. + + If ``local_only`` is True (default), only return installations + local to the current virtualenv, if in a virtualenv. + + ``skip`` argument is an iterable of lower-case project names to + ignore; defaults to stdlib_pkgs + + If ``include_editables`` is False, don't report editables. + + If ``editables_only`` is True , only report editables. + + If ``user_only`` is True , only report installations in the user + site directory. + + If ``paths`` is set, only report the distributions present at the + specified list of locations. + """ + if paths: + working_set = pkg_resources.WorkingSet(paths) + else: + working_set = pkg_resources.working_set + + if local_only: + local_test = dist_is_local + else: + def local_test(d): + return True + + if include_editables: + def editable_test(d): + return True + else: + def editable_test(d): + return not dist_is_editable(d) + + if editables_only: + def editables_only_test(d): + return dist_is_editable(d) + else: + def editables_only_test(d): + return True + + if user_only: + user_test = dist_in_usersite + else: + def user_test(d): + return True + + return [d for d in working_set + if local_test(d) and + d.key not in skip and + editable_test(d) and + editables_only_test(d) and + user_test(d) + ] + + +def egg_link_path(dist): + # type: (Distribution) -> Optional[str] + """ + Return the path for the .egg-link file if it exists, otherwise, None. + + There's 3 scenarios: + 1) not in a virtualenv + try to find in site.USER_SITE, then site_packages + 2) in a no-global virtualenv + try to find in site_packages + 3) in a yes-global virtualenv + try to find in site_packages, then site.USER_SITE + (don't look in global location) + + For #1 and #3, there could be odd cases, where there's an egg-link in 2 + locations. + + This method will just return the first one found. + """ + sites = [] + if running_under_virtualenv(): + sites.append(site_packages) + if not virtualenv_no_global() and user_site: + sites.append(user_site) + else: + if user_site: + sites.append(user_site) + sites.append(site_packages) + + for site in sites: + egglink = os.path.join(site, dist.project_name) + '.egg-link' + if os.path.isfile(egglink): + return egglink + return None + + +def dist_location(dist): + # type: (Distribution) -> str + """ + Get the site-packages location of this distribution. Generally + this is dist.location, except in the case of develop-installed + packages, where dist.location is the source code location, and we + want to know where the egg-link file is. + + The returned location is normalized (in particular, with symlinks removed). + """ + egg_link = egg_link_path(dist) + if egg_link: + return normalize_path(egg_link) + return normalize_path(dist.location) + + +def write_output(msg, *args): + # type: (str, str) -> None + logger.info(msg, *args) + + +class FakeFile(object): + """Wrap a list of lines in an object with readline() to make + ConfigParser happy.""" + def __init__(self, lines): + self._gen = (l for l in lines) + + def readline(self): + try: + try: + return next(self._gen) + except NameError: + return self._gen.next() + except StopIteration: + return '' + + def __iter__(self): + return self._gen + + +class StreamWrapper(StringIO): + + @classmethod + def from_stream(cls, orig_stream): + cls.orig_stream = orig_stream + return cls() + + # compileall.compile_dir() needs stdout.encoding to print to stdout + @property + def encoding(self): + return self.orig_stream.encoding + + +@contextlib.contextmanager +def captured_output(stream_name): + """Return a context manager used by captured_stdout/stdin/stderr + that temporarily replaces the sys stream *stream_name* with a StringIO. + + Taken from Lib/support/__init__.py in the CPython repo. + """ + orig_stdout = getattr(sys, stream_name) + setattr(sys, stream_name, StreamWrapper.from_stream(orig_stdout)) + try: + yield getattr(sys, stream_name) + finally: + setattr(sys, stream_name, orig_stdout) + + +def captured_stdout(): + """Capture the output of sys.stdout: + + with captured_stdout() as stdout: + print('hello') + self.assertEqual(stdout.getvalue(), 'hello\n') + + Taken from Lib/support/__init__.py in the CPython repo. + """ + return captured_output('stdout') + + +def captured_stderr(): + """ + See captured_stdout(). + """ + return captured_output('stderr') + + +class cached_property(object): + """A property that is only computed once per instance and then replaces + itself with an ordinary attribute. Deleting the attribute resets the + property. + + Source: https://github.com/bottlepy/bottle/blob/0.11.5/bottle.py#L175 + """ + + def __init__(self, func): + self.__doc__ = getattr(func, '__doc__') + self.func = func + + def __get__(self, obj, cls): + if obj is None: + # We're being accessed from the class itself, not from an object + return self + value = obj.__dict__[self.func.__name__] = self.func(obj) + return value + + +def get_installed_version(dist_name, working_set=None): + """Get the installed version of dist_name avoiding pkg_resources cache""" + # Create a requirement that we'll look for inside of setuptools. + req = pkg_resources.Requirement.parse(dist_name) + + if working_set is None: + # We want to avoid having this cached, so we need to construct a new + # working set each time. + working_set = pkg_resources.WorkingSet() + + # Get the installed distribution from our working set + dist = working_set.find(req) + + # Check to see if we got an installed distribution or not, if we did + # we want to return it's version. + return dist.version if dist else None + + +def consume(iterator): + """Consume an iterable at C speed.""" + deque(iterator, maxlen=0) + + +# Simulates an enum +def enum(*sequential, **named): + enums = dict(zip(sequential, range(len(sequential))), **named) + reverse = {value: key for key, value in enums.items()} + enums['reverse_mapping'] = reverse + return type('Enum', (), enums) + + +def build_netloc(host, port): + # type: (str, Optional[int]) -> str + """ + Build a netloc from a host-port pair + """ + if port is None: + return host + if ':' in host: + # Only wrap host with square brackets when it is IPv6 + host = '[{}]'.format(host) + return '{}:{}'.format(host, port) + + +def build_url_from_netloc(netloc, scheme='https'): + # type: (str, str) -> str + """ + Build a full URL from a netloc. + """ + if netloc.count(':') >= 2 and '@' not in netloc and '[' not in netloc: + # It must be a bare IPv6 address, so wrap it with brackets. + netloc = '[{}]'.format(netloc) + return '{}://{}'.format(scheme, netloc) + + +def parse_netloc(netloc): + # type: (str) -> Tuple[str, Optional[int]] + """ + Return the host-port pair from a netloc. + """ + url = build_url_from_netloc(netloc) + parsed = urllib_parse.urlparse(url) + return parsed.hostname, parsed.port + + +def split_auth_from_netloc(netloc): + """ + Parse out and remove the auth information from a netloc. + + Returns: (netloc, (username, password)). + """ + if '@' not in netloc: + return netloc, (None, None) + + # Split from the right because that's how urllib.parse.urlsplit() + # behaves if more than one @ is present (which can be checked using + # the password attribute of urlsplit()'s return value). + auth, netloc = netloc.rsplit('@', 1) + if ':' in auth: + # Split from the left because that's how urllib.parse.urlsplit() + # behaves if more than one : is present (which again can be checked + # using the password attribute of the return value) + user_pass = auth.split(':', 1) + else: + user_pass = auth, None + + user_pass = tuple( + None if x is None else urllib_unquote(x) for x in user_pass + ) + + return netloc, user_pass + + +def redact_netloc(netloc): + # type: (str) -> str + """ + Replace the sensitive data in a netloc with "****", if it exists. + + For example: + - "user:pass@example.com" returns "user:****@example.com" + - "accesstoken@example.com" returns "****@example.com" + """ + netloc, (user, password) = split_auth_from_netloc(netloc) + if user is None: + return netloc + if password is None: + user = '****' + password = '' + else: + user = urllib_parse.quote(user) + password = ':****' + return '{user}{password}@{netloc}'.format(user=user, + password=password, + netloc=netloc) + + +def _transform_url(url, transform_netloc): + """Transform and replace netloc in a url. + + transform_netloc is a function taking the netloc and returning a + tuple. The first element of this tuple is the new netloc. The + entire tuple is returned. + + Returns a tuple containing the transformed url as item 0 and the + original tuple returned by transform_netloc as item 1. + """ + purl = urllib_parse.urlsplit(url) + netloc_tuple = transform_netloc(purl.netloc) + # stripped url + url_pieces = ( + purl.scheme, netloc_tuple[0], purl.path, purl.query, purl.fragment + ) + surl = urllib_parse.urlunsplit(url_pieces) + return surl, netloc_tuple + + +def _get_netloc(netloc): + return split_auth_from_netloc(netloc) + + +def _redact_netloc(netloc): + return (redact_netloc(netloc),) + + +def split_auth_netloc_from_url(url): + # type: (str) -> Tuple[str, str, Tuple[str, str]] + """ + Parse a url into separate netloc, auth, and url with no auth. + + Returns: (url_without_auth, netloc, (username, password)) + """ + url_without_auth, (netloc, auth) = _transform_url(url, _get_netloc) + return url_without_auth, netloc, auth + + +def remove_auth_from_url(url): + # type: (str) -> str + """Return a copy of url with 'username:password@' removed.""" + # username/pass params are passed to subversion through flags + # and are not recognized in the url. + return _transform_url(url, _get_netloc)[0] + + +def redact_auth_from_url(url): + # type: (str) -> str + """Replace the password in a given url with ****.""" + return _transform_url(url, _redact_netloc)[0] + + +class HiddenText(object): + def __init__( + self, + secret, # type: str + redacted, # type: str + ): + # type: (...) -> None + self.secret = secret + self.redacted = redacted + + def __repr__(self): + # type: (...) -> str + return ''.format(str(self)) + + def __str__(self): + # type: (...) -> str + return self.redacted + + # This is useful for testing. + def __eq__(self, other): + # type: (Any) -> bool + if type(self) != type(other): + return False + + # The string being used for redaction doesn't also have to match, + # just the raw, original string. + return (self.secret == other.secret) + + # We need to provide an explicit __ne__ implementation for Python 2. + # TODO: remove this when we drop PY2 support. + def __ne__(self, other): + # type: (Any) -> bool + return not self == other + + +def hide_value(value): + # type: (str) -> HiddenText + return HiddenText(value, redacted='****') + + +def hide_url(url): + # type: (str) -> HiddenText + redacted = redact_auth_from_url(url) + return HiddenText(url, redacted=redacted) + + +def protect_pip_from_modification_on_windows(modifying_pip): + # type: (bool) -> None + """Protection of pip.exe from modification on Windows + + On Windows, any operation modifying pip should be run as: + python -m pip ... + """ + pip_names = [ + "pip.exe", + "pip{}.exe".format(sys.version_info[0]), + "pip{}.{}.exe".format(*sys.version_info[:2]) + ] + + # See https://github.com/pypa/pip/issues/1299 for more discussion + should_show_use_python_msg = ( + modifying_pip and + WINDOWS and + os.path.basename(sys.argv[0]) in pip_names + ) + + if should_show_use_python_msg: + new_command = [ + sys.executable, "-m", "pip" + ] + sys.argv[1:] + raise CommandError( + 'To modify pip, please run the following command:\n{}' + .format(" ".join(new_command)) + ) + + +def is_console_interactive(): + # type: () -> bool + """Is this console interactive? + """ + return sys.stdin is not None and sys.stdin.isatty() + + +def hash_file(path, blocksize=1 << 20): + # type: (str, int) -> Tuple[Any, int] + """Return (hash, length) for path using hashlib.sha256() + """ + + h = hashlib.sha256() + length = 0 + with open(path, 'rb') as f: + for block in read_chunks(f, size=blocksize): + length += len(block) + h.update(block) + return h, length + + +def is_wheel_installed(): + """ + Return whether the wheel package is installed. + """ + try: + import wheel # noqa: F401 + except ImportError: + return False + + return True diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/misc.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/misc.pyc new file mode 100644 index 0000000000000000000000000000000000000000..794def926f53e7dac26d3e1c3a40033f89aa194b GIT binary patch literal 33223 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 K{vFk->y_X3j;yW# literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/models.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/models.py new file mode 100644 index 0000000..29e1441 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/models.py @@ -0,0 +1,42 @@ +"""Utilities for defining models +""" +# The following comment should be removed at some point in the future. +# mypy: disallow-untyped-defs=False + +import operator + + +class KeyBasedCompareMixin(object): + """Provides comparison capabilities that is based on a key + """ + + def __init__(self, key, defining_class): + self._compare_key = key + self._defining_class = defining_class + + def __hash__(self): + return hash(self._compare_key) + + def __lt__(self, other): + return self._compare(other, operator.__lt__) + + def __le__(self, other): + return self._compare(other, operator.__le__) + + def __gt__(self, other): + return self._compare(other, operator.__gt__) + + def __ge__(self, other): + return self._compare(other, operator.__ge__) + + def __eq__(self, other): + return self._compare(other, operator.__eq__) + + def __ne__(self, other): + return self._compare(other, operator.__ne__) + + def _compare(self, other, method): + if not isinstance(other, self._defining_class): + return NotImplemented + + return method(self._compare_key, other._compare_key) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/models.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/models.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0dad3cc797c52c8600bc2a02751710f4e83c2b83 GIT binary patch literal 2949 zcmd5;O>fgc5M4WInxy3$frJFIgoJ`baZ3@s6oi@+LPTf_2XbKLcsI!g$9BEj(4gMR zALBRi17O}dX#-ax(v4<3-Vg7*ncX+3{JhdU`SJ2|%x0}Z&(|d82`R}~m$b*E&k~Py z$*3^pvpyMB_MNda#y)i`7(Q&RVbudtAFWQb)yf3@tO%s)>r|(MV4O*nn5OLWA++4=5Z5o z5*gFNcWsrFQAyw84KuIO^RJ22!&*>gOe)L^J&CLeCs7ghvqY-Ggo8YkN29^F=lz}S z-p=lHIIN=CiZDQ zwRPH2(6F{bT!9O4n0XB^23*K_XfSLkD2$CfcIMIfS%?Uh4I?w;=yL-ch#joeVuM#g z+#qKRpfE4S0|E!zB<2<=z;da#9vk`W4ELkNhiPS;W*K)cS+0u6W`(WMun-Bw&z%hi z+u~+rcBqO~27qsn7r3?m0Gu~yJ;!C6167MaIc~yAG2&F-C0QoM!5_(7Jw|ZGy=7y( zWO)RG-d{3Cb#%GT>UF{wEE!{Z$?^!IeYk)T>^YY<`X7@*8F57xmBdHYwZyk&xgAw7 zMtXsQQC%!ZNE=t-(pYgYxT~g}%)S}ti5e>^ax&exl*nImp&pf zs2R+==~ev}2y|A3(`Zb|bU1~e5`CQDb)6;%A+uNrj&-~a1#0KuJ`Qr=xIG-lizEJy zv@ei4>;M0^;N%GdWP=)1^J{*i+Ndo4TF5I0dtX$TtT$4zb!%6Sz~yDX%)~34H}~(T IR^6=p22ziyI{*Lx literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/packaging 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/packaging 2.py new file mode 100644 index 0000000..68aa86e --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/packaging 2.py @@ -0,0 +1,94 @@ +from __future__ import absolute_import + +import logging +from email.parser import FeedParser + +from pip._vendor import pkg_resources +from pip._vendor.packaging import specifiers, version + +from pip._internal.exceptions import NoneMetadataError +from pip._internal.utils.misc import display_path +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Optional, Tuple + from email.message import Message + from pip._vendor.pkg_resources import Distribution + + +logger = logging.getLogger(__name__) + + +def check_requires_python(requires_python, version_info): + # type: (Optional[str], Tuple[int, ...]) -> bool + """ + Check if the given Python version matches a "Requires-Python" specifier. + + :param version_info: A 3-tuple of ints representing a Python + major-minor-micro version to check (e.g. `sys.version_info[:3]`). + + :return: `True` if the given Python version satisfies the requirement. + Otherwise, return `False`. + + :raises InvalidSpecifier: If `requires_python` has an invalid format. + """ + if requires_python is None: + # The package provides no information + return True + requires_python_specifier = specifiers.SpecifierSet(requires_python) + + python_version = version.parse('.'.join(map(str, version_info))) + return python_version in requires_python_specifier + + +def get_metadata(dist): + # type: (Distribution) -> Message + """ + :raises NoneMetadataError: if the distribution reports `has_metadata()` + True but `get_metadata()` returns None. + """ + metadata_name = 'METADATA' + if (isinstance(dist, pkg_resources.DistInfoDistribution) and + dist.has_metadata(metadata_name)): + metadata = dist.get_metadata(metadata_name) + elif dist.has_metadata('PKG-INFO'): + metadata_name = 'PKG-INFO' + metadata = dist.get_metadata(metadata_name) + else: + logger.warning("No metadata found in %s", display_path(dist.location)) + metadata = '' + + if metadata is None: + raise NoneMetadataError(dist, metadata_name) + + feed_parser = FeedParser() + # The following line errors out if with a "NoneType" TypeError if + # passed metadata=None. + feed_parser.feed(metadata) + return feed_parser.close() + + +def get_requires_python(dist): + # type: (pkg_resources.Distribution) -> Optional[str] + """ + Return the "Requires-Python" metadata for a distribution, or None + if not present. + """ + pkg_info_dict = get_metadata(dist) + requires_python = pkg_info_dict.get('Requires-Python') + + if requires_python is not None: + # Convert to a str to satisfy the type checker, since requires_python + # can be a Header object. + requires_python = str(requires_python) + + return requires_python + + +def get_installer(dist): + # type: (Distribution) -> str + if dist.has_metadata('INSTALLER'): + for line in dist.get_metadata_lines('INSTALLER'): + if line.strip(): + return line.strip() + return '' diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/packaging 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/packaging 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..449a21a48a6f365874d41b64765f3a46d0860d16 GIT binary patch literal 3518 zcmc&$U2hvj7e2dA+&FdWq%DC$p#uWRpvEpL0ujNhhBhgI){QnnfDx>>-m$aJesyM? zl2>r?zU4=7!%sniOMVYGT=JZmwJ}uUwoZ0-KF*#wbIy65GqvB>R)72D!*7OE{d~M{ z-6GO|pcCWYqm(G~sPB=-W1mu=`o3MOQCg#HiTX=!ZHdxl%IegwyYVum=O|mD{t9Ic z>NnhMozhjx&Qt%q8=s@JN!c3p*W7r8(hHQesNW(_wn+VI_i9kOPT2PE{fka^ zmC{R;U8eqJH$G44bChjTf0MkNNcuE+p5zPk1P8c6ag%-^>c2?wn(e$q@dewtN^#3} zUgiTHw%2j^1P`@6G^T|ndZ>$ZYGjyXWuZ*Zt*l~YPs;cpQd%lEw}!d$WE?7~i>Vq) z-Dam67S*L3CZj|uZO&nMicV7G?z0U{^om^GmnMoM6YVNhR2rLDiW6O?(OFnV=Gc93 z5wrKdJoqxa{qgSYPs8A|UT?p5*KM|fwFjkv@+dXS7#vN@RJ!kY=lfFYXk1OO`a6j> zDtS2NPljyo5+45W_AQwG2|C}|;Ge9JS|{Vtp@DB}JPY4`?~_@g$ug(Qq)s@TS)uPd zdgAjc3qTV8KAqIz-Wt^DAK}_nf#2<8IXn@`NSI?O#>uJ7#le|5E^<-%M`V#19!o7E z@me4sO%r%_%Za=u<}U55T5a29q@ry0X_(}rVq5Hpn_GrGAc~Pla-)TkCA7%gB>5P6 zoi?k0P0FH4p|-Llx9w0BGkwAo0;a&;w(N{MVxZ4-r!v#-_0{&xuLp0=Y*EroRlY3- zM`|hu|9VCpnM5Nsv~`1W$IM`0XKvL4I7mHCw7d@US+N-GMX8p9`F0T&wb;*3qcn*R zXUVoL_D5n+snlUj19adV53I#vA-4I`*POsg-3xRcsX*+z7fa7O4Yvx-V zN)xc0%{4?oODjDo;B1!8qSC&RWNj2;M$!TO{_cT)7QIW=gTX$S`<42S6f8QCsedFQVH_y&a&BPe<-p$9yH}D(h-J@=q zlv_!zO_ZivJ9l>V!Dl>W9|YM*1ypqbl~i}jXm}EhkwhJs@*Fm`*#YdkG_9Py$tE!Y z&|1@9@>>3@-jH3)uHeUl>}PaBHRtIGRZyNZ zSs0sn!1ZK}7Y^HXoIw8%jYFbx>G%|>ZO?!JPMebsBNDu-#Q=F3W)%sx-yF=-pHokO zp~PS;&7wqw1}%7}DuI~*@9!S%+}SzW(L6Z#^zPPvZ|{MA9)n&XW;-D7r+Ew%h&MF+ zjF^(qcT8$}<1sNaaYHfTux~ zyfy>@6nVhaBVghUI6*9mMkp{ASi`i?(&2}*hTUgaes-2HkI-dxvl)bph`&eOuoVi! zXNZvC6>NVUkG{%=)a%|wuVo+f{3~AFZ{ppktvPrwbFkwrJhstsz~Fj<Y}_fNWDv-8kd}m4dgJFbk?OqG&Y|C$Ddqro-Qdf=P@OUNGxXQb%7~PGphwPD=&=W50e zuRd$%GJM(Os@zER1ty$Z{g$`sHN6e5&8V@26o#WI3cn1)08>ojj#WSn90lvUPpdAl=e!gEkBv3C2UFTWQiU+ zV&m}GedaoxggGmj{MdR+jMbQlE3j7%_KG`8<}RuM7f*X1_?z8}x9otAYV!mByyvKv zHHMZI;jwEN1Z=bgV(=FCx@i7N0o!{vR|mHAgRF?Bsr(P4NDDOUpu=^4-P^>2KfjKI QSobc~TD8Vz bool + """ + Check if the given Python version matches a "Requires-Python" specifier. + + :param version_info: A 3-tuple of ints representing a Python + major-minor-micro version to check (e.g. `sys.version_info[:3]`). + + :return: `True` if the given Python version satisfies the requirement. + Otherwise, return `False`. + + :raises InvalidSpecifier: If `requires_python` has an invalid format. + """ + if requires_python is None: + # The package provides no information + return True + requires_python_specifier = specifiers.SpecifierSet(requires_python) + + python_version = version.parse('.'.join(map(str, version_info))) + return python_version in requires_python_specifier + + +def get_metadata(dist): + # type: (Distribution) -> Message + """ + :raises NoneMetadataError: if the distribution reports `has_metadata()` + True but `get_metadata()` returns None. + """ + metadata_name = 'METADATA' + if (isinstance(dist, pkg_resources.DistInfoDistribution) and + dist.has_metadata(metadata_name)): + metadata = dist.get_metadata(metadata_name) + elif dist.has_metadata('PKG-INFO'): + metadata_name = 'PKG-INFO' + metadata = dist.get_metadata(metadata_name) + else: + logger.warning("No metadata found in %s", display_path(dist.location)) + metadata = '' + + if metadata is None: + raise NoneMetadataError(dist, metadata_name) + + feed_parser = FeedParser() + # The following line errors out if with a "NoneType" TypeError if + # passed metadata=None. + feed_parser.feed(metadata) + return feed_parser.close() + + +def get_requires_python(dist): + # type: (pkg_resources.Distribution) -> Optional[str] + """ + Return the "Requires-Python" metadata for a distribution, or None + if not present. + """ + pkg_info_dict = get_metadata(dist) + requires_python = pkg_info_dict.get('Requires-Python') + + if requires_python is not None: + # Convert to a str to satisfy the type checker, since requires_python + # can be a Header object. + requires_python = str(requires_python) + + return requires_python + + +def get_installer(dist): + # type: (Distribution) -> str + if dist.has_metadata('INSTALLER'): + for line in dist.get_metadata_lines('INSTALLER'): + if line.strip(): + return line.strip() + return '' diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/packaging.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/packaging.pyc new file mode 100644 index 0000000000000000000000000000000000000000..11c8c75071123514e3d8d038c66221512034aa50 GIT binary patch literal 3518 zcmc&$O>-MX5ba&risi_WodiQ5kb#0Kg^Hy>C@5S&#UybsBuZ*+3L*+t8|_G5dA~9< za$*V&5Pk#~ehLSE6BmxWo>>V&s<=k>&dx_~PfvHh*Him*ZS~0?AAdKb>gVHq{W_8U z3!NDM9;HN?M}3bx9{ZH~)c5ULjnW!rOVnR-YfF?aQ&y*b-Hn$iJw@3H^;alsP`}}3 z>y)licAEO9-S`xxP0H4&zvjj(l%AoiMg10evPJ3-yH|tKb;>rVzd_kq>YsJ8tCXIj z>^$|)yYXpCU!ZK0`kUnCMAE0pizHv7r#Qd`iktKcQU7I%*KFq%iqF{2MT%Rt^C};3 zzrBvbCwQpsp)oBq(L-INQzOG9D+^_MZerx|ph=)NOXE zVNqSmVKPdj(&iL~$LJ(Q?mpYVM6bx@U1_2?GSMxiib`V>OL3yhG&%{($Q-&4&SLiN zgZmG{8=u{}@kJPX+3W4~ZoAD^uy(IBP#&db8H0mqnM(H^?|fHk9gV9AR(~_mMkNoY z{K=5*UBbg3-nb64KS$>W8~mdcQtM0KG+*^Y>{VQC%D)75;D2GQP83}VJ#W*>ZxwwB~4vSn={t;PZhKEv%NW2lq zN7DqJ-Etyth`CEUt5(}~8L23neHteDsMr=e;@XyB4~SwUlH6#aWC<-YH%UH*UZ>3} zV3V?FQmCyg$!$AS#Y~?tg@7rrw=Fy4ju_|@-Kos9dwsKg?c2fSnJr41smiy-;6P2~ z;D67kBa>*PhPG}{?wA=2?98pY2M4LgiI!JjJ}VZ3-6+*^FyAi1q85Akag-+U{w&$H z#okB^DwR4ct#b$BFoH*OxWh_|QK8^xw;SS1)akVwcpQwr5^($sXU%+zeQ5%g zv$=){XlbP<1)R;&Syb9LlB{jz7*hYS$ZA~lrMd8|P&kjbIfGSqmT(3n%ut&fU83oh zDmjjf>>fv|J1Wu`aO;lCZv1F6{{FquJ69jRbM55h*i4KuA6$EUcon~K-aY7+Nx7Be z+C*u(_3j7n_xb@(*#|*3QUO(6Kqb}PG8!I5V?gQ*wlbo z40`yhMX^g9AK){tF+_QF#p2Tkc`h-C0nm7v7~{V&VL`%y_-Bv6rsgy~r3%WECJSRT z54fJJ@xp$)juYsg&^RP2myXYn+V%_x;IujEFe1ULS`3hvVOEh~`|@C({+xOO3?&9* zX%;0aG-$y)RSC=lc=y)9&dr^J9nFLLU)>+RmtFJjOu#B2xT{WOn(0`ZoH-?7%_ z#IkgqXqyH3PzIL5&trj!au1}kNSHQr7tOX4i&h$TO(Fg^`0&AESS~~o2*0B2w%g@dd<`KHAZZ?CE5%Kq^8@57W_#6=u zyoT+s;L#V^kb2!a>$U8Io`1os`%SzXwKWG1W)60|g~v8J4j5cdklcWW$AICXOI?(g z2C4T6RO6D9v4I@slFqtxh{onq;P{g(&a)+D<~*iE5sAety&^EhX=b&cX61zuRV8tm zrm+n zrX8o%n_#qNt>q6nWjSE;pzUJ7JY$&+fl{B+ldE=S7P_0?UYtb}e1f8I$wt=p_a9xN zuMj|cC*uJ23|FMR-u}VPojbRJ;AM=Q|6WDU@Qr8@bzz$1Qd{US(UkUX#pAPAyF0gQ|$x%I*sJOEZ~S!RyE;Lus#++VYcmR>GFVPL}AQBQ_3? z-Dj@DNtlz8$&anK#8{1)xB`3SV6V8dWbUFGaPhSFfq&V(c*_p>s5U>~&pVE4Sz~Bf z5gxmQLBK{^AO>%9uZ!lN6tKPLb9G=#Kgx=Dn#xZYMOvU)2OX~a>)s|F{P}ex#JYE` N)~Yo&8?Q7r{su+XaAW`g literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/pkg_resources 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/pkg_resources 2.py new file mode 100644 index 0000000..0bc129a --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/pkg_resources 2.py @@ -0,0 +1,44 @@ +from pip._vendor.pkg_resources import yield_lines +from pip._vendor.six import ensure_str + +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Dict, Iterable, List + + +class DictMetadata(object): + """IMetadataProvider that reads metadata files from a dictionary. + """ + def __init__(self, metadata): + # type: (Dict[str, bytes]) -> None + self._metadata = metadata + + def has_metadata(self, name): + # type: (str) -> bool + return name in self._metadata + + def get_metadata(self, name): + # type: (str) -> str + try: + return ensure_str(self._metadata[name]) + except UnicodeDecodeError as e: + # Mirrors handling done in pkg_resources.NullProvider. + e.reason += " in {} file".format(name) + raise + + def get_metadata_lines(self, name): + # type: (str) -> Iterable[str] + return yield_lines(self.get_metadata(name)) + + def metadata_isdir(self, name): + # type: (str) -> bool + return False + + def metadata_listdir(self, name): + # type: (str) -> List[str] + return [] + + def run_script(self, script_name, namespace): + # type: (str, str) -> None + pass diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/pkg_resources 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/pkg_resources 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0e4ce631901e0149b85ec49c53d70c8978ccba06 GIT binary patch literal 2758 zcmd5-OLH4V5boJsNtQy0fw(Hk0k$|$DypJQDpchHsRY{z2CQ;zaDjDTYP~y>N8VRv zS_%T^Lil01=J(_WK=&N)-u6N$P`R?}=7LQN=AJecEiH!aP z?n53x(SSh%gld2}c5elcH=$_3pasPi47Q+X!=MeKq!SvT zIxrNFHQ^tC*8nGjYml|zd3TGxssE*?D@em@BxYLWnap*m?A+KPqblvhC~48mZJ(0u z@Z{)3?*6d9`;&~1`~8Fdvo2%7fW)3o5&7@~R3aZ)64^ks zGL-(DsWz!{d2*NEb5vNB4;?|PC0cEYNJsdWiQ5~Kff8? zzju27!E83gF(N*E@bc^)J)<)EC8~9OSCY4LL(k_isGAPULg7-eeV}SGK6~u9i-f=)ey-k{;a`Xec`9iV7XWXBX=0k>ZZc>ZhIg8)4^?||6{@yY{n;XyE_{1h+_ zcpq(h=t&>`1}Fvm=5m6$>|3s|P?zCfuUwXO`D-z!i=z#>u8vEcR+-vUEccD63^vJ3 zIclrYsl&(O?5aP$= z+p=3pZ8L4YB+Gl@jV|HQ)=iAt_ByDX?k9rv)fz0$PaapIw$|fm2`&rKU7$8Kx<<)8 z54roZV(TQ`h}z^bG?P-!o&1_+ivV_cWpM+r$5J9&q%5jzlJk`Nx|CU!N*VJ~%-z)0 zW6aqf-((rRW^p6xLiK Wd^->QBhG!-zqiG None + self._metadata = metadata + + def has_metadata(self, name): + # type: (str) -> bool + return name in self._metadata + + def get_metadata(self, name): + # type: (str) -> str + try: + return ensure_str(self._metadata[name]) + except UnicodeDecodeError as e: + # Mirrors handling done in pkg_resources.NullProvider. + e.reason += " in {} file".format(name) + raise + + def get_metadata_lines(self, name): + # type: (str) -> Iterable[str] + return yield_lines(self.get_metadata(name)) + + def metadata_isdir(self, name): + # type: (str) -> bool + return False + + def metadata_listdir(self, name): + # type: (str) -> List[str] + return [] + + def run_script(self, script_name, namespace): + # type: (str, str) -> None + pass diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/pkg_resources.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/pkg_resources.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e7ea3dd76d5f699344d035ccfd8bc7be276fbb43 GIT binary patch literal 2758 zcmd5-OLH4V5boJsNtQy0fw(H+09za=6;;tDgu<63Md27QU{z{^D|in~t#?QA$opcZ zB_ePxgg?e_;s-$Y=wX>duF=ZV?&+DG?eFWy`2XDOz5M&}FBvQ!pZo%bD`gkP9vM|-r$$MOW?_4uY{#e1 zPUXROhX+5%_+&Ud8h+bnEEte@sxw4B{0Nmv&kE(NKWdBk&T{!!VVb9yu8Cj|zNTT1 zNho0a1V8bZ5ptX06BVokko!()K^{1z%@}#9v&2aF2_IX!5HDcb13LC-_0?ylp6Ohf z5YJN#jY@MHmP?PqkuH=CN2V^rG|UN#uB+6{2fdJ<%%gKwgU_@#Nn8rJ1dv2F5UmVl zxL~SFs$8Ai=l2{HRuv;h(0YkhpwGf0iKsDpmZFMgsfk8)L9W_p+(h}Wlkx9gj2_%S zd+=~RpWy@%_aFXtexIIk75x-7y1Az-i)m5Z`+Wb)VG^^+4XG=NMwJ%P6m?;v=3*?3 zvh~zt$_|>j^GDJyjZ!iw%kF~rCd3nfi}p3dafjYbFfSh~hsa?n8 zJ(_QV^l9Fr;llboDf2y`Xi#J)6kh>%UkiBtq8dPe9$fUm9D;b|fw=S_m{5KSm;}6! zw(Wb;hd%)-0YAH(U@nK2D=gGi_{S@kWqtly%<1B2L$0fnN@sPho+_4y#?%JeWTqUo zb>-AiZORl~wK6kjY+_ z5|bCxfS5yem0b?`He?nDZWHsOfqq2R&HQ2*943c2AcYXGAhI1f9ll8mtF{p0yX4!d zTS;wmZ9XB(8{v(w;L+A?jN9%esDkb%g7xVJEY43J*P^!3<7o-53ejDlHZ!_G$vqFb z`?F%3G~0^WwH@9l>54rd7Via^HR*+)YW6m z*&p9#!L=UWA#qidZ@1^i+&kG_%b{+2ZP5+r*L5-&_8A1;B|*33K+aT^*Jg0-W^{cA zZ~bqJ)h}J&#t&ButJ`(pZr1_M8(ocKE_v6qmvc_0m`gwAT6Zh;*+gaN9NiYyTp~PL Ug#HQVzU$w+V%OUx20!-y18H8H1ONa4 literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/setuptools_build 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/setuptools_build 2.py new file mode 100644 index 0000000..4147a65 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/setuptools_build 2.py @@ -0,0 +1,181 @@ +import sys + +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import List, Optional, Sequence + +# Shim to wrap setup.py invocation with setuptools +# +# We set sys.argv[0] to the path to the underlying setup.py file so +# setuptools / distutils don't take the path to the setup.py to be "-c" when +# invoking via the shim. This avoids e.g. the following manifest_maker +# warning: "warning: manifest_maker: standard file '-c' not found". +_SETUPTOOLS_SHIM = ( + "import sys, setuptools, tokenize; sys.argv[0] = {0!r}; __file__={0!r};" + "f=getattr(tokenize, 'open', open)(__file__);" + "code=f.read().replace('\\r\\n', '\\n');" + "f.close();" + "exec(compile(code, __file__, 'exec'))" +) + + +def make_setuptools_shim_args( + setup_py_path, # type: str + global_options=None, # type: Sequence[str] + no_user_config=False, # type: bool + unbuffered_output=False # type: bool +): + # type: (...) -> List[str] + """ + Get setuptools command arguments with shim wrapped setup file invocation. + + :param setup_py_path: The path to setup.py to be wrapped. + :param global_options: Additional global options. + :param no_user_config: If True, disables personal user configuration. + :param unbuffered_output: If True, adds the unbuffered switch to the + argument list. + """ + args = [sys.executable] + if unbuffered_output: + args += ["-u"] + args += ["-c", _SETUPTOOLS_SHIM.format(setup_py_path)] + if global_options: + args += global_options + if no_user_config: + args += ["--no-user-cfg"] + return args + + +def make_setuptools_bdist_wheel_args( + setup_py_path, # type: str + global_options, # type: Sequence[str] + build_options, # type: Sequence[str] + destination_dir, # type: str +): + # type: (...) -> List[str] + # NOTE: Eventually, we'd want to also -S to the flags here, when we're + # isolating. Currently, it breaks Python in virtualenvs, because it + # relies on site.py to find parts of the standard library outside the + # virtualenv. + args = make_setuptools_shim_args( + setup_py_path, + global_options=global_options, + unbuffered_output=True + ) + args += ["bdist_wheel", "-d", destination_dir] + args += build_options + return args + + +def make_setuptools_clean_args( + setup_py_path, # type: str + global_options, # type: Sequence[str] +): + # type: (...) -> List[str] + args = make_setuptools_shim_args( + setup_py_path, + global_options=global_options, + unbuffered_output=True + ) + args += ["clean", "--all"] + return args + + +def make_setuptools_develop_args( + setup_py_path, # type: str + global_options, # type: Sequence[str] + install_options, # type: Sequence[str] + no_user_config, # type: bool + prefix, # type: Optional[str] + home, # type: Optional[str] + use_user_site, # type: bool +): + # type: (...) -> List[str] + assert not (use_user_site and prefix) + + args = make_setuptools_shim_args( + setup_py_path, + global_options=global_options, + no_user_config=no_user_config, + ) + + args += ["develop", "--no-deps"] + + args += install_options + + if prefix: + args += ["--prefix", prefix] + if home is not None: + args += ["--home", home] + + if use_user_site: + args += ["--user", "--prefix="] + + return args + + +def make_setuptools_egg_info_args( + setup_py_path, # type: str + egg_info_dir, # type: Optional[str] + no_user_config, # type: bool +): + # type: (...) -> List[str] + args = make_setuptools_shim_args(setup_py_path) + if no_user_config: + args += ["--no-user-cfg"] + + args += ["egg_info"] + + if egg_info_dir: + args += ["--egg-base", egg_info_dir] + + return args + + +def make_setuptools_install_args( + setup_py_path, # type: str + global_options, # type: Sequence[str] + install_options, # type: Sequence[str] + record_filename, # type: str + root, # type: Optional[str] + prefix, # type: Optional[str] + header_dir, # type: Optional[str] + home, # type: Optional[str] + use_user_site, # type: bool + no_user_config, # type: bool + pycompile # type: bool +): + # type: (...) -> List[str] + assert not (use_user_site and prefix) + assert not (use_user_site and root) + + args = make_setuptools_shim_args( + setup_py_path, + global_options=global_options, + no_user_config=no_user_config, + unbuffered_output=True + ) + args += ["install", "--record", record_filename] + args += ["--single-version-externally-managed"] + + if root is not None: + args += ["--root", root] + if prefix is not None: + args += ["--prefix", prefix] + if home is not None: + args += ["--home", home] + if use_user_site: + args += ["--user", "--prefix="] + + if pycompile: + args += ["--compile"] + else: + args += ["--no-compile"] + + if header_dir: + args += ["--install-headers", header_dir] + + args += install_options + + return args diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/setuptools_build 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/setuptools_build 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5600e287eb93a8388ac62a26f1393668995d9e96 GIT binary patch literal 4191 zcmd5r5FSbP+Pi*WFz-hpo|dbuUGu1-h%rSfgd|09Qfudcd8lM*c2|j35;L=Q z4EBX^p!fkCIPy#2z=6NOub_$_0AKfL*P8$bPI${2^-Rx|F7gad;yg^-LQx58*~-va*PC?(E7hMzTnx{so$B zSe457`dDxHTAER1$})#+$~&^izLZ;}YR9U7_{rvH{a~-+ z)G}D#l6PeiB;~Ne=kQMD#^l?WOxm^e^@I*Pi-+Eq@aO>=BgAb-^c`_JBThV_UKA%Y zMKL>g)Sf6=gKi zQbkEw^s@d1|60%AQzJwm&2)T_OYK)uY04{~=HaL`Z=`DT$r-ivqvBxH>q#Zks2rJU zWTrNY(^UHg=Q*3?YxpSP!$H9ZnfTAok<`{q?ZWZl$i5Q2M7^*mF(Or%^!gkaLufz_ zn-<=bFC#;?n-z4U-OGEoZtmTGYesR11<(s|NHV>3w7m@hXaj@*FF=Ms z2-8=+cDz(W9&dDgvRCf_$=Oh9?OnEQ@Qzz#@ypB1VvQ8{`aDT&T zx~ophNyr_P+LIt`p!3f`aLL^^2+VKX|GVEQ4oNQKLX#ARNUJlacgdA}vz$5nJh}2| znD?M7`7rFnE6{2RyqFz3am7jI(5LK~xbO#bP8y3Cr{D2K8Zi683)cFMLb87RvxYAER{xU5vE z&hWNV7BXO{aYLVDbk+PbMqHN-qc7T>8LRYZ1}8pjZxo#wd7iT8Ss46a_SBx`{J90a zrb(i;>ed;jB7~&MLj#gy2ZE0KJ(PuS2kqL}_t~8Ur;1su1K%U4?jDg`n@+ zngUZ$d0gcwEOTm%XW2?)=kFICmvyq=2kZArO(6(Fbi;!fH565f97nzm8NG&}FrLq( zNNdhhK%Rp=4+dmnFx^jwm|$tK!S|E9WMe>=2c3?xlwyK7J!Xd*HgM=bX_0-8=Q0U!_!ciG%qtr~c@ ztAA!S7--JI->T<@`i&L%w_#yg(Gu!+RxFMUDVDguH131Y)Z-4Bzf9ydWfF|0YnTtR z8xX-yv5UQniDGJq*QBCkQmRzH1VtF?tmx-5JOrPBGD3OR79IIq&H(!R&$f|Cu5N zQ4xa4-Y(TgTs7LQ87Fkjbf2MyiH>NnI<5^mPx$#KLK{;x!RK2Tt~b$$wA~k-9*iin}@M^gM)y-Y List[str] + """ + Get setuptools command arguments with shim wrapped setup file invocation. + + :param setup_py_path: The path to setup.py to be wrapped. + :param global_options: Additional global options. + :param no_user_config: If True, disables personal user configuration. + :param unbuffered_output: If True, adds the unbuffered switch to the + argument list. + """ + args = [sys.executable] + if unbuffered_output: + args += ["-u"] + args += ["-c", _SETUPTOOLS_SHIM.format(setup_py_path)] + if global_options: + args += global_options + if no_user_config: + args += ["--no-user-cfg"] + return args + + +def make_setuptools_bdist_wheel_args( + setup_py_path, # type: str + global_options, # type: Sequence[str] + build_options, # type: Sequence[str] + destination_dir, # type: str +): + # type: (...) -> List[str] + # NOTE: Eventually, we'd want to also -S to the flags here, when we're + # isolating. Currently, it breaks Python in virtualenvs, because it + # relies on site.py to find parts of the standard library outside the + # virtualenv. + args = make_setuptools_shim_args( + setup_py_path, + global_options=global_options, + unbuffered_output=True + ) + args += ["bdist_wheel", "-d", destination_dir] + args += build_options + return args + + +def make_setuptools_clean_args( + setup_py_path, # type: str + global_options, # type: Sequence[str] +): + # type: (...) -> List[str] + args = make_setuptools_shim_args( + setup_py_path, + global_options=global_options, + unbuffered_output=True + ) + args += ["clean", "--all"] + return args + + +def make_setuptools_develop_args( + setup_py_path, # type: str + global_options, # type: Sequence[str] + install_options, # type: Sequence[str] + no_user_config, # type: bool + prefix, # type: Optional[str] + home, # type: Optional[str] + use_user_site, # type: bool +): + # type: (...) -> List[str] + assert not (use_user_site and prefix) + + args = make_setuptools_shim_args( + setup_py_path, + global_options=global_options, + no_user_config=no_user_config, + ) + + args += ["develop", "--no-deps"] + + args += install_options + + if prefix: + args += ["--prefix", prefix] + if home is not None: + args += ["--home", home] + + if use_user_site: + args += ["--user", "--prefix="] + + return args + + +def make_setuptools_egg_info_args( + setup_py_path, # type: str + egg_info_dir, # type: Optional[str] + no_user_config, # type: bool +): + # type: (...) -> List[str] + args = make_setuptools_shim_args(setup_py_path) + if no_user_config: + args += ["--no-user-cfg"] + + args += ["egg_info"] + + if egg_info_dir: + args += ["--egg-base", egg_info_dir] + + return args + + +def make_setuptools_install_args( + setup_py_path, # type: str + global_options, # type: Sequence[str] + install_options, # type: Sequence[str] + record_filename, # type: str + root, # type: Optional[str] + prefix, # type: Optional[str] + header_dir, # type: Optional[str] + home, # type: Optional[str] + use_user_site, # type: bool + no_user_config, # type: bool + pycompile # type: bool +): + # type: (...) -> List[str] + assert not (use_user_site and prefix) + assert not (use_user_site and root) + + args = make_setuptools_shim_args( + setup_py_path, + global_options=global_options, + no_user_config=no_user_config, + unbuffered_output=True + ) + args += ["install", "--record", record_filename] + args += ["--single-version-externally-managed"] + + if root is not None: + args += ["--root", root] + if prefix is not None: + args += ["--prefix", prefix] + if home is not None: + args += ["--home", home] + if use_user_site: + args += ["--user", "--prefix="] + + if pycompile: + args += ["--compile"] + else: + args += ["--no-compile"] + + if header_dir: + args += ["--install-headers", header_dir] + + args += install_options + + return args diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/setuptools_build.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/setuptools_build.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bc53fa806a2e639f8de30cfe880bbd5793408b54 GIT binary patch literal 4191 zcmd5<&2rqv5gq{KlDqsdWBMmfoHA@DAy`H1(m!QY#4r_=N|scXS1yn`nEpY5!0aw0 zECA2UlA=RiA|FzDfE;qnoA}_D@KdD94`6@YgI%s<`{0wgMGShTX9hjp{e9E)zFX@& z{(ArOR5ZT@y#J0z{~Jw)KSvZo99h{Fg(JqUIC6y}U7>F93{MoE7%zyU1u9muv0@Ek2a2v%TD z{yl#Ez=3F)T_mXtwmwy#((Em? z+k1m6 zcU!`pGf(=keVmk;4;N0xvNYO1&CSTyqkQb2s-&)EW~ck)Q9mzFsx+Z!bvwM>^*T|> z*iMP-v$#&o=(>M6l0Hd@lT~%=Gm?+xbkpwq>S0kGCq-Ow8tCi(jV#M;M)+2RC{bTO zwW_S*iIyr(t8$PJulsig{-K&60$Hw;<3eh`mP%7z`7{qlrFj$8m`~1Vte=#}lfghL znZ?z_)DtteS(0ViH#pDbBwxcvDIX3BKFG{}eu1R6W@;CX4=47O>NV;HR{2R{WbY(Vy+KuEaB6Q@_p&b@4!?YN z@Ye3}Tko8motTHlm}~Exj&|`Imc7GXo!4PrYLgU2`1ZB;`bQBB@e}8zkqVLNO-x?s z-ep3@$CJFskS^vGe0!WclJT69(lRC+Uxrc>zle=hr{!!oub^FHX@)lP7NhMi5P&v7 z2=D@A2viQ>XZzMC6qb@f)w^Xz}T$iEf^QE|c2iCFf+E5N~6SrmPby z9^Bt@+U};)aZ+*zrS>ccJLvp$5L|M%4FdBU_kZknibGn+q|_vZA=2v7=@Ge-ZwJB>?^(OiApAO~nd}sx>@;2O#+j2IYRcDjlZc1>ZT7cfni}xT{NTRg3K#hSK0#yidrl~?a zu0qgvZB2nGs66iQ6qY$Prn79N(f{#9$7P)y4#E0^N>d2J5Z&-NK@CNfBFB-hLq@M5 zC`{)wDbkv&6p%l_o@WCxGnnqD6HKtQ*y8)iU9&Nu%Y#lwS;{f^BhG)m%$Q!B!!!-O zYGMB8pMg0_b&ra}CysZqBF<5#<0=E5n|sU-wQS(ffzl%T3D0E`;P9<*kY~XEAFG#V zz_)7P-LC$c)nK3{3xBI#7V2A8;NOOoc|}L4|FdFsYDl@p{k3Tygr;6{$ozF8w>gtw zG+o1dkb{5-evV!2T}%|yK)fLpCDTe}`b{XpQ0L{akl_jV1e6iV$F}Gw&O+3@$xvnu zQd3;j91};r|JkVUzqNs5s~O+KQ-{2`DS(?yldW%M4}@ z#Q)Ef35bdiO!h`pA92-aw`QEsH52`w8YViT!TPK*=qlmorwDCI)dZh^!En8cMyzjw zx-6yH+G5QGp%JO^L&S#iuYp&`4XAF8$VY~JfqJt$t2Mh^Yj(|9jkJiM6 CommandArgs + """ + Create a CommandArgs object. + """ + command_args = [] # type: CommandArgs + for arg in args: + # Check for list instead of CommandArgs since CommandArgs is + # only known during type-checking. + if isinstance(arg, list): + command_args.extend(arg) + else: + # Otherwise, arg is str or HiddenText. + command_args.append(arg) + + return command_args + + +def format_command_args(args): + # type: (Union[List[str], CommandArgs]) -> str + """ + Format command arguments for display. + """ + # For HiddenText arguments, display the redacted form by calling str(). + # Also, we don't apply str() to arguments that aren't HiddenText since + # this can trigger a UnicodeDecodeError in Python 2 if the argument + # has type unicode and includes a non-ascii character. (The type + # checker doesn't ensure the annotations are correct in all cases.) + return ' '.join( + shlex_quote(str(arg)) if isinstance(arg, HiddenText) + else shlex_quote(arg) for arg in args + ) + + +def reveal_command_args(args): + # type: (Union[List[str], CommandArgs]) -> List[str] + """ + Return the arguments in their raw, unredacted form. + """ + return [ + arg.secret if isinstance(arg, HiddenText) else arg for arg in args + ] + + +def make_subprocess_output_error( + cmd_args, # type: Union[List[str], CommandArgs] + cwd, # type: Optional[str] + lines, # type: List[Text] + exit_status, # type: int +): + # type: (...) -> Text + """ + Create and return the error message to use to log a subprocess error + with command output. + + :param lines: A list of lines, each ending with a newline. + """ + command = format_command_args(cmd_args) + # Convert `command` and `cwd` to text (unicode in Python 2) so we can use + # them as arguments in the unicode format string below. This avoids + # "UnicodeDecodeError: 'ascii' codec can't decode byte ..." in Python 2 + # if either contains a non-ascii character. + command_display = str_to_display(command, desc='command bytes') + cwd_display = path_to_display(cwd) + + # We know the joined output value ends in a newline. + output = ''.join(lines) + msg = ( + # Use a unicode string to avoid "UnicodeEncodeError: 'ascii' + # codec can't encode character ..." in Python 2 when a format + # argument (e.g. `output`) has a non-ascii character. + u'Command errored out with exit status {exit_status}:\n' + ' command: {command_display}\n' + ' cwd: {cwd_display}\n' + 'Complete output ({line_count} lines):\n{output}{divider}' + ).format( + exit_status=exit_status, + command_display=command_display, + cwd_display=cwd_display, + line_count=len(lines), + output=output, + divider=LOG_DIVIDER, + ) + return msg + + +def call_subprocess( + cmd, # type: Union[List[str], CommandArgs] + show_stdout=False, # type: bool + cwd=None, # type: Optional[str] + on_returncode='raise', # type: str + extra_ok_returncodes=None, # type: Optional[Iterable[int]] + command_desc=None, # type: Optional[str] + extra_environ=None, # type: Optional[Mapping[str, Any]] + unset_environ=None, # type: Optional[Iterable[str]] + spinner=None, # type: Optional[SpinnerInterface] + log_failed_cmd=True # type: Optional[bool] +): + # type: (...) -> Text + """ + Args: + show_stdout: if true, use INFO to log the subprocess's stderr and + stdout streams. Otherwise, use DEBUG. Defaults to False. + extra_ok_returncodes: an iterable of integer return codes that are + acceptable, in addition to 0. Defaults to None, which means []. + unset_environ: an iterable of environment variable names to unset + prior to calling subprocess.Popen(). + log_failed_cmd: if false, failed commands are not logged, only raised. + """ + if extra_ok_returncodes is None: + extra_ok_returncodes = [] + if unset_environ is None: + unset_environ = [] + # Most places in pip use show_stdout=False. What this means is-- + # + # - We connect the child's output (combined stderr and stdout) to a + # single pipe, which we read. + # - We log this output to stderr at DEBUG level as it is received. + # - If DEBUG logging isn't enabled (e.g. if --verbose logging wasn't + # requested), then we show a spinner so the user can still see the + # subprocess is in progress. + # - If the subprocess exits with an error, we log the output to stderr + # at ERROR level if it hasn't already been displayed to the console + # (e.g. if --verbose logging wasn't enabled). This way we don't log + # the output to the console twice. + # + # If show_stdout=True, then the above is still done, but with DEBUG + # replaced by INFO. + if show_stdout: + # Then log the subprocess output at INFO level. + log_subprocess = subprocess_logger.info + used_level = logging.INFO + else: + # Then log the subprocess output using DEBUG. This also ensures + # it will be logged to the log file (aka user_log), if enabled. + log_subprocess = subprocess_logger.debug + used_level = logging.DEBUG + + # Whether the subprocess will be visible in the console. + showing_subprocess = subprocess_logger.getEffectiveLevel() <= used_level + + # Only use the spinner if we're not showing the subprocess output + # and we have a spinner. + use_spinner = not showing_subprocess and spinner is not None + + if command_desc is None: + command_desc = format_command_args(cmd) + + log_subprocess("Running command %s", command_desc) + env = os.environ.copy() + if extra_environ: + env.update(extra_environ) + for name in unset_environ: + env.pop(name, None) + try: + proc = subprocess.Popen( + # Convert HiddenText objects to the underlying str. + reveal_command_args(cmd), + stderr=subprocess.STDOUT, stdin=subprocess.PIPE, + stdout=subprocess.PIPE, cwd=cwd, env=env, + ) + proc.stdin.close() + except Exception as exc: + if log_failed_cmd: + subprocess_logger.critical( + "Error %s while executing command %s", exc, command_desc, + ) + raise + all_output = [] + while True: + # The "line" value is a unicode string in Python 2. + line = console_to_str(proc.stdout.readline()) + if not line: + break + line = line.rstrip() + all_output.append(line + '\n') + + # Show the line immediately. + log_subprocess(line) + # Update the spinner. + if use_spinner: + spinner.spin() + try: + proc.wait() + finally: + if proc.stdout: + proc.stdout.close() + proc_had_error = ( + proc.returncode and proc.returncode not in extra_ok_returncodes + ) + if use_spinner: + if proc_had_error: + spinner.finish("error") + else: + spinner.finish("done") + if proc_had_error: + if on_returncode == 'raise': + if not showing_subprocess and log_failed_cmd: + # Then the subprocess streams haven't been logged to the + # console yet. + msg = make_subprocess_output_error( + cmd_args=cmd, + cwd=cwd, + lines=all_output, + exit_status=proc.returncode, + ) + subprocess_logger.error(msg) + exc_msg = ( + 'Command errored out with exit status {}: {} ' + 'Check the logs for full command output.' + ).format(proc.returncode, command_desc) + raise InstallationError(exc_msg) + elif on_returncode == 'warn': + subprocess_logger.warning( + 'Command "%s" had error code %s in %s', + command_desc, proc.returncode, cwd, + ) + elif on_returncode == 'ignore': + pass + else: + raise ValueError('Invalid value: on_returncode=%s' % + repr(on_returncode)) + return ''.join(all_output) + + +def runner_with_spinner_message(message): + # type: (str) -> Callable[..., None] + """Provide a subprocess_runner that shows a spinner message. + + Intended for use with for pep517's Pep517HookCaller. Thus, the runner has + an API that matches what's expected by Pep517HookCaller.subprocess_runner. + """ + + def runner( + cmd, # type: List[str] + cwd=None, # type: Optional[str] + extra_environ=None # type: Optional[Mapping[str, Any]] + ): + # type: (...) -> None + with open_spinner(message) as spinner: + call_subprocess( + cmd, + cwd=cwd, + extra_environ=extra_environ, + spinner=spinner, + ) + + return runner diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/subprocess 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/subprocess 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c3079c127ac56ae9bebe55ead1ba0b32bbb83664 GIT binary patch literal 7173 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 CommandArgs + """ + Create a CommandArgs object. + """ + command_args = [] # type: CommandArgs + for arg in args: + # Check for list instead of CommandArgs since CommandArgs is + # only known during type-checking. + if isinstance(arg, list): + command_args.extend(arg) + else: + # Otherwise, arg is str or HiddenText. + command_args.append(arg) + + return command_args + + +def format_command_args(args): + # type: (Union[List[str], CommandArgs]) -> str + """ + Format command arguments for display. + """ + # For HiddenText arguments, display the redacted form by calling str(). + # Also, we don't apply str() to arguments that aren't HiddenText since + # this can trigger a UnicodeDecodeError in Python 2 if the argument + # has type unicode and includes a non-ascii character. (The type + # checker doesn't ensure the annotations are correct in all cases.) + return ' '.join( + shlex_quote(str(arg)) if isinstance(arg, HiddenText) + else shlex_quote(arg) for arg in args + ) + + +def reveal_command_args(args): + # type: (Union[List[str], CommandArgs]) -> List[str] + """ + Return the arguments in their raw, unredacted form. + """ + return [ + arg.secret if isinstance(arg, HiddenText) else arg for arg in args + ] + + +def make_subprocess_output_error( + cmd_args, # type: Union[List[str], CommandArgs] + cwd, # type: Optional[str] + lines, # type: List[Text] + exit_status, # type: int +): + # type: (...) -> Text + """ + Create and return the error message to use to log a subprocess error + with command output. + + :param lines: A list of lines, each ending with a newline. + """ + command = format_command_args(cmd_args) + # Convert `command` and `cwd` to text (unicode in Python 2) so we can use + # them as arguments in the unicode format string below. This avoids + # "UnicodeDecodeError: 'ascii' codec can't decode byte ..." in Python 2 + # if either contains a non-ascii character. + command_display = str_to_display(command, desc='command bytes') + cwd_display = path_to_display(cwd) + + # We know the joined output value ends in a newline. + output = ''.join(lines) + msg = ( + # Use a unicode string to avoid "UnicodeEncodeError: 'ascii' + # codec can't encode character ..." in Python 2 when a format + # argument (e.g. `output`) has a non-ascii character. + u'Command errored out with exit status {exit_status}:\n' + ' command: {command_display}\n' + ' cwd: {cwd_display}\n' + 'Complete output ({line_count} lines):\n{output}{divider}' + ).format( + exit_status=exit_status, + command_display=command_display, + cwd_display=cwd_display, + line_count=len(lines), + output=output, + divider=LOG_DIVIDER, + ) + return msg + + +def call_subprocess( + cmd, # type: Union[List[str], CommandArgs] + show_stdout=False, # type: bool + cwd=None, # type: Optional[str] + on_returncode='raise', # type: str + extra_ok_returncodes=None, # type: Optional[Iterable[int]] + command_desc=None, # type: Optional[str] + extra_environ=None, # type: Optional[Mapping[str, Any]] + unset_environ=None, # type: Optional[Iterable[str]] + spinner=None, # type: Optional[SpinnerInterface] + log_failed_cmd=True # type: Optional[bool] +): + # type: (...) -> Text + """ + Args: + show_stdout: if true, use INFO to log the subprocess's stderr and + stdout streams. Otherwise, use DEBUG. Defaults to False. + extra_ok_returncodes: an iterable of integer return codes that are + acceptable, in addition to 0. Defaults to None, which means []. + unset_environ: an iterable of environment variable names to unset + prior to calling subprocess.Popen(). + log_failed_cmd: if false, failed commands are not logged, only raised. + """ + if extra_ok_returncodes is None: + extra_ok_returncodes = [] + if unset_environ is None: + unset_environ = [] + # Most places in pip use show_stdout=False. What this means is-- + # + # - We connect the child's output (combined stderr and stdout) to a + # single pipe, which we read. + # - We log this output to stderr at DEBUG level as it is received. + # - If DEBUG logging isn't enabled (e.g. if --verbose logging wasn't + # requested), then we show a spinner so the user can still see the + # subprocess is in progress. + # - If the subprocess exits with an error, we log the output to stderr + # at ERROR level if it hasn't already been displayed to the console + # (e.g. if --verbose logging wasn't enabled). This way we don't log + # the output to the console twice. + # + # If show_stdout=True, then the above is still done, but with DEBUG + # replaced by INFO. + if show_stdout: + # Then log the subprocess output at INFO level. + log_subprocess = subprocess_logger.info + used_level = logging.INFO + else: + # Then log the subprocess output using DEBUG. This also ensures + # it will be logged to the log file (aka user_log), if enabled. + log_subprocess = subprocess_logger.debug + used_level = logging.DEBUG + + # Whether the subprocess will be visible in the console. + showing_subprocess = subprocess_logger.getEffectiveLevel() <= used_level + + # Only use the spinner if we're not showing the subprocess output + # and we have a spinner. + use_spinner = not showing_subprocess and spinner is not None + + if command_desc is None: + command_desc = format_command_args(cmd) + + log_subprocess("Running command %s", command_desc) + env = os.environ.copy() + if extra_environ: + env.update(extra_environ) + for name in unset_environ: + env.pop(name, None) + try: + proc = subprocess.Popen( + # Convert HiddenText objects to the underlying str. + reveal_command_args(cmd), + stderr=subprocess.STDOUT, stdin=subprocess.PIPE, + stdout=subprocess.PIPE, cwd=cwd, env=env, + ) + proc.stdin.close() + except Exception as exc: + if log_failed_cmd: + subprocess_logger.critical( + "Error %s while executing command %s", exc, command_desc, + ) + raise + all_output = [] + while True: + # The "line" value is a unicode string in Python 2. + line = console_to_str(proc.stdout.readline()) + if not line: + break + line = line.rstrip() + all_output.append(line + '\n') + + # Show the line immediately. + log_subprocess(line) + # Update the spinner. + if use_spinner: + spinner.spin() + try: + proc.wait() + finally: + if proc.stdout: + proc.stdout.close() + proc_had_error = ( + proc.returncode and proc.returncode not in extra_ok_returncodes + ) + if use_spinner: + if proc_had_error: + spinner.finish("error") + else: + spinner.finish("done") + if proc_had_error: + if on_returncode == 'raise': + if not showing_subprocess and log_failed_cmd: + # Then the subprocess streams haven't been logged to the + # console yet. + msg = make_subprocess_output_error( + cmd_args=cmd, + cwd=cwd, + lines=all_output, + exit_status=proc.returncode, + ) + subprocess_logger.error(msg) + exc_msg = ( + 'Command errored out with exit status {}: {} ' + 'Check the logs for full command output.' + ).format(proc.returncode, command_desc) + raise InstallationError(exc_msg) + elif on_returncode == 'warn': + subprocess_logger.warning( + 'Command "%s" had error code %s in %s', + command_desc, proc.returncode, cwd, + ) + elif on_returncode == 'ignore': + pass + else: + raise ValueError('Invalid value: on_returncode=%s' % + repr(on_returncode)) + return ''.join(all_output) + + +def runner_with_spinner_message(message): + # type: (str) -> Callable[..., None] + """Provide a subprocess_runner that shows a spinner message. + + Intended for use with for pep517's Pep517HookCaller. Thus, the runner has + an API that matches what's expected by Pep517HookCaller.subprocess_runner. + """ + + def runner( + cmd, # type: List[str] + cwd=None, # type: Optional[str] + extra_environ=None # type: Optional[Mapping[str, Any]] + ): + # type: (...) -> None + with open_spinner(message) as spinner: + call_subprocess( + cmd, + cwd=cwd, + extra_environ=extra_environ, + spinner=spinner, + ) + + return runner diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/subprocess.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/subprocess.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d18bda6288ef6f43bab1e6dfad7fa9866f8e04ac GIT binary patch literal 7173 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 Iterator[None] + global _tempdir_manager + with ExitStack() as stack: + old_tempdir_manager, _tempdir_manager = _tempdir_manager, stack + try: + yield + finally: + _tempdir_manager = old_tempdir_manager + + +class TempDirectoryTypeRegistry(object): + """Manages temp directory behavior + """ + + def __init__(self): + # type: () -> None + self._should_delete = {} # type: Dict[str, bool] + + def set_delete(self, kind, value): + # type: (str, bool) -> None + """Indicate whether a TempDirectory of the given kind should be + auto-deleted. + """ + self._should_delete[kind] = value + + def get_delete(self, kind): + # type: (str) -> bool + """Get configured auto-delete flag for a given TempDirectory type, + default True. + """ + return self._should_delete.get(kind, True) + + +_tempdir_registry = None # type: Optional[TempDirectoryTypeRegistry] + + +@contextmanager +def tempdir_registry(): + # type: () -> Iterator[TempDirectoryTypeRegistry] + """Provides a scoped global tempdir registry that can be used to dictate + whether directories should be deleted. + """ + global _tempdir_registry + old_tempdir_registry = _tempdir_registry + _tempdir_registry = TempDirectoryTypeRegistry() + try: + yield _tempdir_registry + finally: + _tempdir_registry = old_tempdir_registry + + +class TempDirectory(object): + """Helper class that owns and cleans up a temporary directory. + + This class can be used as a context manager or as an OO representation of a + temporary directory. + + Attributes: + path + Location to the created temporary directory + delete + Whether the directory should be deleted when exiting + (when used as a contextmanager) + + Methods: + cleanup() + Deletes the temporary directory + + When used as a context manager, if the delete attribute is True, on + exiting the context the temporary directory is deleted. + """ + + def __init__( + self, + path=None, # type: Optional[str] + delete=None, # type: Optional[bool] + kind="temp", # type: str + globally_managed=False, # type: bool + ): + super(TempDirectory, self).__init__() + + # If we were given an explicit directory, resolve delete option now. + # Otherwise we wait until cleanup and see what tempdir_registry says. + if path is not None and delete is None: + delete = False + + if path is None: + path = self._create(kind) + + self._path = path + self._deleted = False + self.delete = delete + self.kind = kind + + if globally_managed: + assert _tempdir_manager is not None + _tempdir_manager.enter_context(self) + + @property + def path(self): + # type: () -> str + assert not self._deleted, ( + "Attempted to access deleted path: {}".format(self._path) + ) + return self._path + + def __repr__(self): + # type: () -> str + return "<{} {!r}>".format(self.__class__.__name__, self.path) + + def __enter__(self): + # type: (_T) -> _T + return self + + def __exit__(self, exc, value, tb): + # type: (Any, Any, Any) -> None + if self.delete is not None: + delete = self.delete + elif _tempdir_registry: + delete = _tempdir_registry.get_delete(self.kind) + else: + delete = True + + if delete: + self.cleanup() + + def _create(self, kind): + # type: (str) -> str + """Create a temporary directory and store its path in self.path + """ + # We realpath here because some systems have their default tmpdir + # symlinked to another directory. This tends to confuse build + # scripts, so we canonicalize the path by traversing potential + # symlinks here. + path = os.path.realpath( + tempfile.mkdtemp(prefix="pip-{}-".format(kind)) + ) + logger.debug("Created temporary directory: {}".format(path)) + return path + + def cleanup(self): + # type: () -> None + """Remove the temporary directory created and reset state + """ + self._deleted = True + if os.path.exists(self._path): + rmtree(self._path) + + +class AdjacentTempDirectory(TempDirectory): + """Helper class that creates a temporary directory adjacent to a real one. + + Attributes: + original + The original directory to create a temp directory for. + path + After calling create() or entering, contains the full + path to the temporary directory. + delete + Whether the directory should be deleted when exiting + (when used as a contextmanager) + + """ + # The characters that may be used to name the temp directory + # We always prepend a ~ and then rotate through these until + # a usable name is found. + # pkg_resources raises a different error for .dist-info folder + # with leading '-' and invalid metadata + LEADING_CHARS = "-~.=%0123456789" + + def __init__(self, original, delete=None): + # type: (str, Optional[bool]) -> None + self.original = original.rstrip('/\\') + super(AdjacentTempDirectory, self).__init__(delete=delete) + + @classmethod + def _generate_names(cls, name): + # type: (str) -> Iterator[str] + """Generates a series of temporary names. + + The algorithm replaces the leading characters in the name + with ones that are valid filesystem characters, but are not + valid package names (for both Python and pip definitions of + package). + """ + for i in range(1, len(name)): + for candidate in itertools.combinations_with_replacement( + cls.LEADING_CHARS, i - 1): + new_name = '~' + ''.join(candidate) + name[i:] + if new_name != name: + yield new_name + + # If we make it this far, we will have to make a longer name + for i in range(len(cls.LEADING_CHARS)): + for candidate in itertools.combinations_with_replacement( + cls.LEADING_CHARS, i): + new_name = '~' + ''.join(candidate) + name + if new_name != name: + yield new_name + + def _create(self, kind): + # type: (str) -> str + root, name = os.path.split(self.original) + for candidate in self._generate_names(name): + path = os.path.join(root, candidate) + try: + os.mkdir(path) + except OSError as ex: + # Continue if the name exists already + if ex.errno != errno.EEXIST: + raise + else: + path = os.path.realpath(path) + break + else: + # Final fallback on the default behavior. + path = os.path.realpath( + tempfile.mkdtemp(prefix="pip-{}-".format(kind)) + ) + + logger.debug("Created temporary directory: {}".format(path)) + return path diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/temp_dir 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/temp_dir 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f93b12967529572181a2d20d3f483c2f75d4f117 GIT binary patch literal 9096 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 literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/temp_dir.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/temp_dir.py new file mode 100644 index 0000000..65e41bc --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/temp_dir.py @@ -0,0 +1,250 @@ +from __future__ import absolute_import + +import errno +import itertools +import logging +import os.path +import tempfile +from contextlib import contextmanager + +from pip._vendor.contextlib2 import ExitStack + +from pip._internal.utils.misc import rmtree +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Any, Dict, Iterator, Optional, TypeVar + + _T = TypeVar('_T', bound='TempDirectory') + + +logger = logging.getLogger(__name__) + + +_tempdir_manager = None # type: Optional[ExitStack] + + +@contextmanager +def global_tempdir_manager(): + # type: () -> Iterator[None] + global _tempdir_manager + with ExitStack() as stack: + old_tempdir_manager, _tempdir_manager = _tempdir_manager, stack + try: + yield + finally: + _tempdir_manager = old_tempdir_manager + + +class TempDirectoryTypeRegistry(object): + """Manages temp directory behavior + """ + + def __init__(self): + # type: () -> None + self._should_delete = {} # type: Dict[str, bool] + + def set_delete(self, kind, value): + # type: (str, bool) -> None + """Indicate whether a TempDirectory of the given kind should be + auto-deleted. + """ + self._should_delete[kind] = value + + def get_delete(self, kind): + # type: (str) -> bool + """Get configured auto-delete flag for a given TempDirectory type, + default True. + """ + return self._should_delete.get(kind, True) + + +_tempdir_registry = None # type: Optional[TempDirectoryTypeRegistry] + + +@contextmanager +def tempdir_registry(): + # type: () -> Iterator[TempDirectoryTypeRegistry] + """Provides a scoped global tempdir registry that can be used to dictate + whether directories should be deleted. + """ + global _tempdir_registry + old_tempdir_registry = _tempdir_registry + _tempdir_registry = TempDirectoryTypeRegistry() + try: + yield _tempdir_registry + finally: + _tempdir_registry = old_tempdir_registry + + +class TempDirectory(object): + """Helper class that owns and cleans up a temporary directory. + + This class can be used as a context manager or as an OO representation of a + temporary directory. + + Attributes: + path + Location to the created temporary directory + delete + Whether the directory should be deleted when exiting + (when used as a contextmanager) + + Methods: + cleanup() + Deletes the temporary directory + + When used as a context manager, if the delete attribute is True, on + exiting the context the temporary directory is deleted. + """ + + def __init__( + self, + path=None, # type: Optional[str] + delete=None, # type: Optional[bool] + kind="temp", # type: str + globally_managed=False, # type: bool + ): + super(TempDirectory, self).__init__() + + # If we were given an explicit directory, resolve delete option now. + # Otherwise we wait until cleanup and see what tempdir_registry says. + if path is not None and delete is None: + delete = False + + if path is None: + path = self._create(kind) + + self._path = path + self._deleted = False + self.delete = delete + self.kind = kind + + if globally_managed: + assert _tempdir_manager is not None + _tempdir_manager.enter_context(self) + + @property + def path(self): + # type: () -> str + assert not self._deleted, ( + "Attempted to access deleted path: {}".format(self._path) + ) + return self._path + + def __repr__(self): + # type: () -> str + return "<{} {!r}>".format(self.__class__.__name__, self.path) + + def __enter__(self): + # type: (_T) -> _T + return self + + def __exit__(self, exc, value, tb): + # type: (Any, Any, Any) -> None + if self.delete is not None: + delete = self.delete + elif _tempdir_registry: + delete = _tempdir_registry.get_delete(self.kind) + else: + delete = True + + if delete: + self.cleanup() + + def _create(self, kind): + # type: (str) -> str + """Create a temporary directory and store its path in self.path + """ + # We realpath here because some systems have their default tmpdir + # symlinked to another directory. This tends to confuse build + # scripts, so we canonicalize the path by traversing potential + # symlinks here. + path = os.path.realpath( + tempfile.mkdtemp(prefix="pip-{}-".format(kind)) + ) + logger.debug("Created temporary directory: {}".format(path)) + return path + + def cleanup(self): + # type: () -> None + """Remove the temporary directory created and reset state + """ + self._deleted = True + if os.path.exists(self._path): + rmtree(self._path) + + +class AdjacentTempDirectory(TempDirectory): + """Helper class that creates a temporary directory adjacent to a real one. + + Attributes: + original + The original directory to create a temp directory for. + path + After calling create() or entering, contains the full + path to the temporary directory. + delete + Whether the directory should be deleted when exiting + (when used as a contextmanager) + + """ + # The characters that may be used to name the temp directory + # We always prepend a ~ and then rotate through these until + # a usable name is found. + # pkg_resources raises a different error for .dist-info folder + # with leading '-' and invalid metadata + LEADING_CHARS = "-~.=%0123456789" + + def __init__(self, original, delete=None): + # type: (str, Optional[bool]) -> None + self.original = original.rstrip('/\\') + super(AdjacentTempDirectory, self).__init__(delete=delete) + + @classmethod + def _generate_names(cls, name): + # type: (str) -> Iterator[str] + """Generates a series of temporary names. + + The algorithm replaces the leading characters in the name + with ones that are valid filesystem characters, but are not + valid package names (for both Python and pip definitions of + package). + """ + for i in range(1, len(name)): + for candidate in itertools.combinations_with_replacement( + cls.LEADING_CHARS, i - 1): + new_name = '~' + ''.join(candidate) + name[i:] + if new_name != name: + yield new_name + + # If we make it this far, we will have to make a longer name + for i in range(len(cls.LEADING_CHARS)): + for candidate in itertools.combinations_with_replacement( + cls.LEADING_CHARS, i): + new_name = '~' + ''.join(candidate) + name + if new_name != name: + yield new_name + + def _create(self, kind): + # type: (str) -> str + root, name = os.path.split(self.original) + for candidate in self._generate_names(name): + path = os.path.join(root, candidate) + try: + os.mkdir(path) + except OSError as ex: + # Continue if the name exists already + if ex.errno != errno.EEXIST: + raise + else: + path = os.path.realpath(path) + break + else: + # Final fallback on the default behavior. + path = os.path.realpath( + tempfile.mkdtemp(prefix="pip-{}-".format(kind)) + ) + + logger.debug("Created temporary directory: {}".format(path)) + return path diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/temp_dir.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/temp_dir.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5635bd32f05f0bf55731abe76ba6d86680a437b7 GIT binary patch literal 9096 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 literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/typing 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/typing 2.py new file mode 100644 index 0000000..8505a29 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/typing 2.py @@ -0,0 +1,38 @@ +"""For neatly implementing static typing in pip. + +`mypy` - the static type analysis tool we use - uses the `typing` module, which +provides core functionality fundamental to mypy's functioning. + +Generally, `typing` would be imported at runtime and used in that fashion - +it acts as a no-op at runtime and does not have any run-time overhead by +design. + +As it turns out, `typing` is not vendorable - it uses separate sources for +Python 2/Python 3. Thus, this codebase can not expect it to be present. +To work around this, mypy allows the typing import to be behind a False-y +optional to prevent it from running at runtime and type-comments can be used +to remove the need for the types to be accessible directly during runtime. + +This module provides the False-y guard in a nicely named fashion so that a +curious maintainer can reach here to read this. + +In pip, all static-typing related imports should be guarded as follows: + + from pip._internal.utils.typing import MYPY_CHECK_RUNNING + + if MYPY_CHECK_RUNNING: + from typing import ... + +Ref: https://github.com/python/mypy/issues/3216 +""" + +MYPY_CHECK_RUNNING = False + + +if MYPY_CHECK_RUNNING: + from typing import cast +else: + # typing's cast() is needed at runtime, but we don't want to import typing. + # Thus, we use a dummy no-op version, which we tell mypy to ignore. + def cast(type_, value): # type: ignore + return value diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/typing 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/typing 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..44f07b5c9ef13de402204ada1cc7b6ac07a3b4ff GIT binary patch literal 1627 zcmcgsO_Lin5S6`V2~))dj$Cv}u?Npgc9(*xtw0erAEYQ;Tg&EZo`ZI8l?G)Nko zp*Zrxa?S7I2f%BMv-!HCvSf|adj0x!O9%gan!S4Y?XQ*Cw<-R=M-L|$v=G-q&_rBM z1x5447X@_pOk-3aDy=6mES=9`|1R0%c3}_hE3%>$#rk5XdIwS9QaEs=A#;*O7{F^xU~T-@OeU(ylR?Z{>H=3 z^^KM*;((lwq@{||_lT=yo|;K%4k^~ySgTOOrOY!ErK)0(3O{LG?z;C6Y6qs)MOmvY zLk$d@CtSBBUz390AwxW7W5Mo0kN}Onw?Vo-zQqwjG0v8(c3!O-)(WOcu0WmgDneh^ z`wAY{&Sw`xtikf6+)qvmc~$pejv#O zCY5)PH=Uj*X(d#2yD?d>v!3*0?SZhO+Tehak5v;WA2QdCsp5UWBb4NC?On^VSgxD* zga%s^~kUtEKG=5o_3p9%nJHWdNGqR!xPUkbs&F{rDo0=DacrVPr^pw<#=PpYbA zO(@w!9BJn?!1vR1QRXb>{(9tlF+DZNDcmMegADcSGEH=_gSuP0l!UV^lW0jwzIRJ_ zCy#4U^wBh-csD;kKfidsJpb|0`A^HsXN$$t#gp;4S<4T%&Jyx1`nyO)fe zf`^A!7DpJw5gSB)h&aQ`G~24Cr*W4}LW`m7yxBs!a;tm^fi(G0Zn{$c{$lgzSL@?@ ztK-vQ*v1zz#&1q{^*ywWEw4%_mm7at9y5W-D-euR! zPD~c*rHmhAzFcZoEk~ZIlHzAr{ZQd}h~*J5p}h$w&Hn$G;vEpWKVFFMzQ8>2!r}Dr J;BfN!>_2GZ0sQ~~ literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/typing.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/typing.py new file mode 100644 index 0000000..8505a29 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/typing.py @@ -0,0 +1,38 @@ +"""For neatly implementing static typing in pip. + +`mypy` - the static type analysis tool we use - uses the `typing` module, which +provides core functionality fundamental to mypy's functioning. + +Generally, `typing` would be imported at runtime and used in that fashion - +it acts as a no-op at runtime and does not have any run-time overhead by +design. + +As it turns out, `typing` is not vendorable - it uses separate sources for +Python 2/Python 3. Thus, this codebase can not expect it to be present. +To work around this, mypy allows the typing import to be behind a False-y +optional to prevent it from running at runtime and type-comments can be used +to remove the need for the types to be accessible directly during runtime. + +This module provides the False-y guard in a nicely named fashion so that a +curious maintainer can reach here to read this. + +In pip, all static-typing related imports should be guarded as follows: + + from pip._internal.utils.typing import MYPY_CHECK_RUNNING + + if MYPY_CHECK_RUNNING: + from typing import ... + +Ref: https://github.com/python/mypy/issues/3216 +""" + +MYPY_CHECK_RUNNING = False + + +if MYPY_CHECK_RUNNING: + from typing import cast +else: + # typing's cast() is needed at runtime, but we don't want to import typing. + # Thus, we use a dummy no-op version, which we tell mypy to ignore. + def cast(type_, value): # type: ignore + return value diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/typing.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/typing.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a76b5059395df257a1ecd2c4e8d001af7496306a GIT binary patch literal 1627 zcmcgsO^+ir5Op$PfR?zxk&7=Y=8#VB%%ELqv>;%_E-OT|8ivEpfsA8U(q6jl#&##$ zh$DZD-^34qSMKcW*BvW%+;;iZt5;|M#4IO`3Cp+6MisH5%y5UxqGS&2k4N2uxGejF@^1hLKl6@qYVZ;(_Z%3qC*?QAA zG?)9@>bmHH-&q42?E}e8?{u;rP&N(xWfb#K4NxU}{vzJlfEM^XAxA+q%`kuMVek9K z$Te|5J|r?yB^i3e)iO`Rqzs3YYHVy&tl?6Yg-ufF6s5vXI$!$k-Gj!1sq;zJYR6Cm z!?mV_i>IOfTg{mwSwYWxeQD%JJKn8_bf#hC_>3aaqZ>ahu@?M z9`feX^DM1|ihe&P>s8jXeylwZ)>K;@Q1Y>AB9%koyD?R~4|s%<{cVD8Sr*52^N#Sq zrBeHrlM2${3SiDg0gON`M9jtF2nj;e`GXH}S+T9s&?8#b%h-SjQMRTJ?COwUsD90g zjAaI5hx+0gJTRBrUWHr$NVC-h42L>{$3rPZ567Uc3Jq-E15H_!p+&7_)`66+WlbpA zOdM(FG{E=Md{O2s=HYsj2QdRR$SK@rQKO9Yt1``Wu!FkW_?(1`qL64=O1^h1c&C7C zvFMX+;^OW6{Pg_U^VQ`K-(UW?y830ge7bxx9=99${?#19c?c$H^6)$}y(vPo<)R9&z;NLTGts34G`5UXuhncrV*|M+rqdVhU- zJ`B6`BBk{3d|%&3+q&wyf^wyGc*vTjJbUn%RlT zGQX7RL(EqzY~ HKAZgq3N`^7 literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/ui 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/ui 2.py new file mode 100644 index 0000000..87782aa --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/ui 2.py @@ -0,0 +1,428 @@ +# The following comment should be removed at some point in the future. +# mypy: strict-optional=False +# mypy: disallow-untyped-defs=False + +from __future__ import absolute_import, division + +import contextlib +import itertools +import logging +import sys +import time +from signal import SIGINT, default_int_handler, signal + +from pip._vendor import six +from pip._vendor.progress import HIDE_CURSOR, SHOW_CURSOR +from pip._vendor.progress.bar import Bar, FillingCirclesBar, IncrementalBar +from pip._vendor.progress.spinner import Spinner + +from pip._internal.utils.compat import WINDOWS +from pip._internal.utils.logging import get_indentation +from pip._internal.utils.misc import format_size +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Any, Iterator, IO + +try: + from pip._vendor import colorama +# Lots of different errors can come from this, including SystemError and +# ImportError. +except Exception: + colorama = None + +logger = logging.getLogger(__name__) + + +def _select_progress_class(preferred, fallback): + encoding = getattr(preferred.file, "encoding", None) + + # If we don't know what encoding this file is in, then we'll just assume + # that it doesn't support unicode and use the ASCII bar. + if not encoding: + return fallback + + # Collect all of the possible characters we want to use with the preferred + # bar. + characters = [ + getattr(preferred, "empty_fill", six.text_type()), + getattr(preferred, "fill", six.text_type()), + ] + characters += list(getattr(preferred, "phases", [])) + + # Try to decode the characters we're using for the bar using the encoding + # of the given file, if this works then we'll assume that we can use the + # fancier bar and if not we'll fall back to the plaintext bar. + try: + six.text_type().join(characters).encode(encoding) + except UnicodeEncodeError: + return fallback + else: + return preferred + + +_BaseBar = _select_progress_class(IncrementalBar, Bar) # type: Any + + +class InterruptibleMixin(object): + """ + Helper to ensure that self.finish() gets called on keyboard interrupt. + + This allows downloads to be interrupted without leaving temporary state + (like hidden cursors) behind. + + This class is similar to the progress library's existing SigIntMixin + helper, but as of version 1.2, that helper has the following problems: + + 1. It calls sys.exit(). + 2. It discards the existing SIGINT handler completely. + 3. It leaves its own handler in place even after an uninterrupted finish, + which will have unexpected delayed effects if the user triggers an + unrelated keyboard interrupt some time after a progress-displaying + download has already completed, for example. + """ + + def __init__(self, *args, **kwargs): + """ + Save the original SIGINT handler for later. + """ + super(InterruptibleMixin, self).__init__(*args, **kwargs) + + self.original_handler = signal(SIGINT, self.handle_sigint) + + # If signal() returns None, the previous handler was not installed from + # Python, and we cannot restore it. This probably should not happen, + # but if it does, we must restore something sensible instead, at least. + # The least bad option should be Python's default SIGINT handler, which + # just raises KeyboardInterrupt. + if self.original_handler is None: + self.original_handler = default_int_handler + + def finish(self): + """ + Restore the original SIGINT handler after finishing. + + This should happen regardless of whether the progress display finishes + normally, or gets interrupted. + """ + super(InterruptibleMixin, self).finish() + signal(SIGINT, self.original_handler) + + def handle_sigint(self, signum, frame): + """ + Call self.finish() before delegating to the original SIGINT handler. + + This handler should only be in place while the progress display is + active. + """ + self.finish() + self.original_handler(signum, frame) + + +class SilentBar(Bar): + + def update(self): + pass + + +class BlueEmojiBar(IncrementalBar): + + suffix = "%(percent)d%%" + bar_prefix = " " + bar_suffix = " " + phases = (u"\U0001F539", u"\U0001F537", u"\U0001F535") # type: Any + + +class DownloadProgressMixin(object): + + def __init__(self, *args, **kwargs): + super(DownloadProgressMixin, self).__init__(*args, **kwargs) + self.message = (" " * (get_indentation() + 2)) + self.message + + @property + def downloaded(self): + return format_size(self.index) + + @property + def download_speed(self): + # Avoid zero division errors... + if self.avg == 0.0: + return "..." + return format_size(1 / self.avg) + "/s" + + @property + def pretty_eta(self): + if self.eta: + return "eta %s" % self.eta_td + return "" + + def iter(self, it): + for x in it: + yield x + self.next(len(x)) + self.finish() + + +class WindowsMixin(object): + + def __init__(self, *args, **kwargs): + # The Windows terminal does not support the hide/show cursor ANSI codes + # even with colorama. So we'll ensure that hide_cursor is False on + # Windows. + # This call needs to go before the super() call, so that hide_cursor + # is set in time. The base progress bar class writes the "hide cursor" + # code to the terminal in its init, so if we don't set this soon + # enough, we get a "hide" with no corresponding "show"... + if WINDOWS and self.hide_cursor: + self.hide_cursor = False + + super(WindowsMixin, self).__init__(*args, **kwargs) + + # Check if we are running on Windows and we have the colorama module, + # if we do then wrap our file with it. + if WINDOWS and colorama: + self.file = colorama.AnsiToWin32(self.file) + # The progress code expects to be able to call self.file.isatty() + # but the colorama.AnsiToWin32() object doesn't have that, so we'll + # add it. + self.file.isatty = lambda: self.file.wrapped.isatty() + # The progress code expects to be able to call self.file.flush() + # but the colorama.AnsiToWin32() object doesn't have that, so we'll + # add it. + self.file.flush = lambda: self.file.wrapped.flush() + + +class BaseDownloadProgressBar(WindowsMixin, InterruptibleMixin, + DownloadProgressMixin): + + file = sys.stdout + message = "%(percent)d%%" + suffix = "%(downloaded)s %(download_speed)s %(pretty_eta)s" + +# NOTE: The "type: ignore" comments on the following classes are there to +# work around https://github.com/python/typing/issues/241 + + +class DefaultDownloadProgressBar(BaseDownloadProgressBar, + _BaseBar): + pass + + +class DownloadSilentBar(BaseDownloadProgressBar, SilentBar): # type: ignore + pass + + +class DownloadBar(BaseDownloadProgressBar, # type: ignore + Bar): + pass + + +class DownloadFillingCirclesBar(BaseDownloadProgressBar, # type: ignore + FillingCirclesBar): + pass + + +class DownloadBlueEmojiProgressBar(BaseDownloadProgressBar, # type: ignore + BlueEmojiBar): + pass + + +class DownloadProgressSpinner(WindowsMixin, InterruptibleMixin, + DownloadProgressMixin, Spinner): + + file = sys.stdout + suffix = "%(downloaded)s %(download_speed)s" + + def next_phase(self): + if not hasattr(self, "_phaser"): + self._phaser = itertools.cycle(self.phases) + return next(self._phaser) + + def update(self): + message = self.message % self + phase = self.next_phase() + suffix = self.suffix % self + line = ''.join([ + message, + " " if message else "", + phase, + " " if suffix else "", + suffix, + ]) + + self.writeln(line) + + +BAR_TYPES = { + "off": (DownloadSilentBar, DownloadSilentBar), + "on": (DefaultDownloadProgressBar, DownloadProgressSpinner), + "ascii": (DownloadBar, DownloadProgressSpinner), + "pretty": (DownloadFillingCirclesBar, DownloadProgressSpinner), + "emoji": (DownloadBlueEmojiProgressBar, DownloadProgressSpinner) +} + + +def DownloadProgressProvider(progress_bar, max=None): + if max is None or max == 0: + return BAR_TYPES[progress_bar][1]().iter + else: + return BAR_TYPES[progress_bar][0](max=max).iter + + +################################################################ +# Generic "something is happening" spinners +# +# We don't even try using progress.spinner.Spinner here because it's actually +# simpler to reimplement from scratch than to coerce their code into doing +# what we need. +################################################################ + +@contextlib.contextmanager +def hidden_cursor(file): + # type: (IO[Any]) -> Iterator[None] + # The Windows terminal does not support the hide/show cursor ANSI codes, + # even via colorama. So don't even try. + if WINDOWS: + yield + # We don't want to clutter the output with control characters if we're + # writing to a file, or if the user is running with --quiet. + # See https://github.com/pypa/pip/issues/3418 + elif not file.isatty() or logger.getEffectiveLevel() > logging.INFO: + yield + else: + file.write(HIDE_CURSOR) + try: + yield + finally: + file.write(SHOW_CURSOR) + + +class RateLimiter(object): + def __init__(self, min_update_interval_seconds): + # type: (float) -> None + self._min_update_interval_seconds = min_update_interval_seconds + self._last_update = 0 # type: float + + def ready(self): + # type: () -> bool + now = time.time() + delta = now - self._last_update + return delta >= self._min_update_interval_seconds + + def reset(self): + # type: () -> None + self._last_update = time.time() + + +class SpinnerInterface(object): + def spin(self): + # type: () -> None + raise NotImplementedError() + + def finish(self, final_status): + # type: (str) -> None + raise NotImplementedError() + + +class InteractiveSpinner(SpinnerInterface): + def __init__(self, message, file=None, spin_chars="-\\|/", + # Empirically, 8 updates/second looks nice + min_update_interval_seconds=0.125): + self._message = message + if file is None: + file = sys.stdout + self._file = file + self._rate_limiter = RateLimiter(min_update_interval_seconds) + self._finished = False + + self._spin_cycle = itertools.cycle(spin_chars) + + self._file.write(" " * get_indentation() + self._message + " ... ") + self._width = 0 + + def _write(self, status): + assert not self._finished + # Erase what we wrote before by backspacing to the beginning, writing + # spaces to overwrite the old text, and then backspacing again + backup = "\b" * self._width + self._file.write(backup + " " * self._width + backup) + # Now we have a blank slate to add our status + self._file.write(status) + self._width = len(status) + self._file.flush() + self._rate_limiter.reset() + + def spin(self): + # type: () -> None + if self._finished: + return + if not self._rate_limiter.ready(): + return + self._write(next(self._spin_cycle)) + + def finish(self, final_status): + # type: (str) -> None + if self._finished: + return + self._write(final_status) + self._file.write("\n") + self._file.flush() + self._finished = True + + +# Used for dumb terminals, non-interactive installs (no tty), etc. +# We still print updates occasionally (once every 60 seconds by default) to +# act as a keep-alive for systems like Travis-CI that take lack-of-output as +# an indication that a task has frozen. +class NonInteractiveSpinner(SpinnerInterface): + def __init__(self, message, min_update_interval_seconds=60): + # type: (str, float) -> None + self._message = message + self._finished = False + self._rate_limiter = RateLimiter(min_update_interval_seconds) + self._update("started") + + def _update(self, status): + assert not self._finished + self._rate_limiter.reset() + logger.info("%s: %s", self._message, status) + + def spin(self): + # type: () -> None + if self._finished: + return + if not self._rate_limiter.ready(): + return + self._update("still running...") + + def finish(self, final_status): + # type: (str) -> None + if self._finished: + return + self._update("finished with status '%s'" % (final_status,)) + self._finished = True + + +@contextlib.contextmanager +def open_spinner(message): + # type: (str) -> Iterator[SpinnerInterface] + # Interactive spinner goes directly to sys.stdout rather than being routed + # through the logging system, but it acts like it has level INFO, + # i.e. it's only displayed if we're at level INFO or better. + # Non-interactive spinner goes through the logging system, so it is always + # in sync with logging configuration. + if sys.stdout.isatty() and logger.getEffectiveLevel() <= logging.INFO: + spinner = InteractiveSpinner(message) # type: SpinnerInterface + else: + spinner = NonInteractiveSpinner(message) + try: + with hidden_cursor(sys.stdout): + yield spinner + except KeyboardInterrupt: + spinner.finish("canceled") + raise + except Exception: + spinner.finish("error") + raise + else: + spinner.finish("done") diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/ui 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/ui 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d632166b6f37095ffd46bbcb1db5a296c233d58f GIT binary patch literal 17186 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 Iterator[None] + # The Windows terminal does not support the hide/show cursor ANSI codes, + # even via colorama. So don't even try. + if WINDOWS: + yield + # We don't want to clutter the output with control characters if we're + # writing to a file, or if the user is running with --quiet. + # See https://github.com/pypa/pip/issues/3418 + elif not file.isatty() or logger.getEffectiveLevel() > logging.INFO: + yield + else: + file.write(HIDE_CURSOR) + try: + yield + finally: + file.write(SHOW_CURSOR) + + +class RateLimiter(object): + def __init__(self, min_update_interval_seconds): + # type: (float) -> None + self._min_update_interval_seconds = min_update_interval_seconds + self._last_update = 0 # type: float + + def ready(self): + # type: () -> bool + now = time.time() + delta = now - self._last_update + return delta >= self._min_update_interval_seconds + + def reset(self): + # type: () -> None + self._last_update = time.time() + + +class SpinnerInterface(object): + def spin(self): + # type: () -> None + raise NotImplementedError() + + def finish(self, final_status): + # type: (str) -> None + raise NotImplementedError() + + +class InteractiveSpinner(SpinnerInterface): + def __init__(self, message, file=None, spin_chars="-\\|/", + # Empirically, 8 updates/second looks nice + min_update_interval_seconds=0.125): + self._message = message + if file is None: + file = sys.stdout + self._file = file + self._rate_limiter = RateLimiter(min_update_interval_seconds) + self._finished = False + + self._spin_cycle = itertools.cycle(spin_chars) + + self._file.write(" " * get_indentation() + self._message + " ... ") + self._width = 0 + + def _write(self, status): + assert not self._finished + # Erase what we wrote before by backspacing to the beginning, writing + # spaces to overwrite the old text, and then backspacing again + backup = "\b" * self._width + self._file.write(backup + " " * self._width + backup) + # Now we have a blank slate to add our status + self._file.write(status) + self._width = len(status) + self._file.flush() + self._rate_limiter.reset() + + def spin(self): + # type: () -> None + if self._finished: + return + if not self._rate_limiter.ready(): + return + self._write(next(self._spin_cycle)) + + def finish(self, final_status): + # type: (str) -> None + if self._finished: + return + self._write(final_status) + self._file.write("\n") + self._file.flush() + self._finished = True + + +# Used for dumb terminals, non-interactive installs (no tty), etc. +# We still print updates occasionally (once every 60 seconds by default) to +# act as a keep-alive for systems like Travis-CI that take lack-of-output as +# an indication that a task has frozen. +class NonInteractiveSpinner(SpinnerInterface): + def __init__(self, message, min_update_interval_seconds=60): + # type: (str, float) -> None + self._message = message + self._finished = False + self._rate_limiter = RateLimiter(min_update_interval_seconds) + self._update("started") + + def _update(self, status): + assert not self._finished + self._rate_limiter.reset() + logger.info("%s: %s", self._message, status) + + def spin(self): + # type: () -> None + if self._finished: + return + if not self._rate_limiter.ready(): + return + self._update("still running...") + + def finish(self, final_status): + # type: (str) -> None + if self._finished: + return + self._update("finished with status '%s'" % (final_status,)) + self._finished = True + + +@contextlib.contextmanager +def open_spinner(message): + # type: (str) -> Iterator[SpinnerInterface] + # Interactive spinner goes directly to sys.stdout rather than being routed + # through the logging system, but it acts like it has level INFO, + # i.e. it's only displayed if we're at level INFO or better. + # Non-interactive spinner goes through the logging system, so it is always + # in sync with logging configuration. + if sys.stdout.isatty() and logger.getEffectiveLevel() <= logging.INFO: + spinner = InteractiveSpinner(message) # type: SpinnerInterface + else: + spinner = NonInteractiveSpinner(message) + try: + with hidden_cursor(sys.stdout): + yield spinner + except KeyboardInterrupt: + spinner.finish("canceled") + raise + except Exception: + spinner.finish("error") + raise + else: + spinner.finish("done") diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/ui.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/ui.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1dcc97b584f98c3a0fe91c79f189123f8537ac89 GIT binary patch literal 17186 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 literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/unpacking 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/unpacking 2.py new file mode 100644 index 0000000..7252dc2 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/unpacking 2.py @@ -0,0 +1,272 @@ +"""Utilities related archives. +""" + +# The following comment should be removed at some point in the future. +# mypy: strict-optional=False +# mypy: disallow-untyped-defs=False + +from __future__ import absolute_import + +import logging +import os +import shutil +import stat +import tarfile +import zipfile + +from pip._internal.exceptions import InstallationError +from pip._internal.utils.filetypes import ( + BZ2_EXTENSIONS, + TAR_EXTENSIONS, + XZ_EXTENSIONS, + ZIP_EXTENSIONS, +) +from pip._internal.utils.misc import ensure_dir +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Iterable, List, Optional, Text, Union + + +logger = logging.getLogger(__name__) + + +SUPPORTED_EXTENSIONS = ZIP_EXTENSIONS + TAR_EXTENSIONS + +try: + import bz2 # noqa + SUPPORTED_EXTENSIONS += BZ2_EXTENSIONS +except ImportError: + logger.debug('bz2 module is not available') + +try: + # Only for Python 3.3+ + import lzma # noqa + SUPPORTED_EXTENSIONS += XZ_EXTENSIONS +except ImportError: + logger.debug('lzma module is not available') + + +def current_umask(): + """Get the current umask which involves having to set it temporarily.""" + mask = os.umask(0) + os.umask(mask) + return mask + + +def split_leading_dir(path): + # type: (Union[str, Text]) -> List[Union[str, Text]] + path = path.lstrip('/').lstrip('\\') + if ( + '/' in path and ( + ('\\' in path and path.find('/') < path.find('\\')) or + '\\' not in path + ) + ): + return path.split('/', 1) + elif '\\' in path: + return path.split('\\', 1) + else: + return [path, ''] + + +def has_leading_dir(paths): + # type: (Iterable[Union[str, Text]]) -> bool + """Returns true if all the paths have the same leading path name + (i.e., everything is in one subdirectory in an archive)""" + common_prefix = None + for path in paths: + prefix, rest = split_leading_dir(path) + if not prefix: + return False + elif common_prefix is None: + common_prefix = prefix + elif prefix != common_prefix: + return False + return True + + +def is_within_directory(directory, target): + # type: ((Union[str, Text]), (Union[str, Text])) -> bool + """ + Return true if the absolute path of target is within the directory + """ + abs_directory = os.path.abspath(directory) + abs_target = os.path.abspath(target) + + prefix = os.path.commonprefix([abs_directory, abs_target]) + return prefix == abs_directory + + +def unzip_file(filename, location, flatten=True): + # type: (str, str, bool) -> None + """ + Unzip the file (with path `filename`) to the destination `location`. All + files are written based on system defaults and umask (i.e. permissions are + not preserved), except that regular file members with any execute + permissions (user, group, or world) have "chmod +x" applied after being + written. Note that for windows, any execute changes using os.chmod are + no-ops per the python docs. + """ + ensure_dir(location) + zipfp = open(filename, 'rb') + try: + zip = zipfile.ZipFile(zipfp, allowZip64=True) + leading = has_leading_dir(zip.namelist()) and flatten + for info in zip.infolist(): + name = info.filename + fn = name + if leading: + fn = split_leading_dir(name)[1] + fn = os.path.join(location, fn) + dir = os.path.dirname(fn) + if not is_within_directory(location, fn): + message = ( + 'The zip file ({}) has a file ({}) trying to install ' + 'outside target directory ({})' + ) + raise InstallationError(message.format(filename, fn, location)) + if fn.endswith('/') or fn.endswith('\\'): + # A directory + ensure_dir(fn) + else: + ensure_dir(dir) + # Don't use read() to avoid allocating an arbitrarily large + # chunk of memory for the file's content + fp = zip.open(name) + try: + with open(fn, 'wb') as destfp: + shutil.copyfileobj(fp, destfp) + finally: + fp.close() + mode = info.external_attr >> 16 + # if mode and regular file and any execute permissions for + # user/group/world? + if mode and stat.S_ISREG(mode) and mode & 0o111: + # make dest file have execute for user/group/world + # (chmod +x) no-op on windows per python docs + os.chmod(fn, (0o777 - current_umask() | 0o111)) + finally: + zipfp.close() + + +def untar_file(filename, location): + # type: (str, str) -> None + """ + Untar the file (with path `filename`) to the destination `location`. + All files are written based on system defaults and umask (i.e. permissions + are not preserved), except that regular file members with any execute + permissions (user, group, or world) have "chmod +x" applied after being + written. Note that for windows, any execute changes using os.chmod are + no-ops per the python docs. + """ + ensure_dir(location) + if filename.lower().endswith('.gz') or filename.lower().endswith('.tgz'): + mode = 'r:gz' + elif filename.lower().endswith(BZ2_EXTENSIONS): + mode = 'r:bz2' + elif filename.lower().endswith(XZ_EXTENSIONS): + mode = 'r:xz' + elif filename.lower().endswith('.tar'): + mode = 'r' + else: + logger.warning( + 'Cannot determine compression type for file %s', filename, + ) + mode = 'r:*' + tar = tarfile.open(filename, mode) + try: + leading = has_leading_dir([ + member.name for member in tar.getmembers() + ]) + for member in tar.getmembers(): + fn = member.name + if leading: + # https://github.com/python/mypy/issues/1174 + fn = split_leading_dir(fn)[1] # type: ignore + path = os.path.join(location, fn) + if not is_within_directory(location, path): + message = ( + 'The tar file ({}) has a file ({}) trying to install ' + 'outside target directory ({})' + ) + raise InstallationError( + message.format(filename, path, location) + ) + if member.isdir(): + ensure_dir(path) + elif member.issym(): + try: + # https://github.com/python/typeshed/issues/2673 + tar._extract_member(member, path) # type: ignore + except Exception as exc: + # Some corrupt tar files seem to produce this + # (specifically bad symlinks) + logger.warning( + 'In the tar file %s the member %s is invalid: %s', + filename, member.name, exc, + ) + continue + else: + try: + fp = tar.extractfile(member) + except (KeyError, AttributeError) as exc: + # Some corrupt tar files seem to produce this + # (specifically bad symlinks) + logger.warning( + 'In the tar file %s the member %s is invalid: %s', + filename, member.name, exc, + ) + continue + ensure_dir(os.path.dirname(path)) + with open(path, 'wb') as destfp: + shutil.copyfileobj(fp, destfp) + fp.close() + # Update the timestamp (useful for cython compiled files) + # https://github.com/python/typeshed/issues/2673 + tar.utime(member, path) # type: ignore + # member have any execute permissions for user/group/world? + if member.mode & 0o111: + # make dest file have execute for user/group/world + # no-op on windows per python docs + os.chmod(path, (0o777 - current_umask() | 0o111)) + finally: + tar.close() + + +def unpack_file( + filename, # type: str + location, # type: str + content_type=None, # type: Optional[str] +): + # type: (...) -> None + filename = os.path.realpath(filename) + if ( + content_type == 'application/zip' or + filename.lower().endswith(ZIP_EXTENSIONS) or + zipfile.is_zipfile(filename) + ): + unzip_file( + filename, + location, + flatten=not filename.endswith('.whl') + ) + elif ( + content_type == 'application/x-gzip' or + tarfile.is_tarfile(filename) or + filename.lower().endswith( + TAR_EXTENSIONS + BZ2_EXTENSIONS + XZ_EXTENSIONS + ) + ): + untar_file(filename, location) + else: + # FIXME: handle? + # FIXME: magic signatures? + logger.critical( + 'Cannot unpack file %s (downloaded from %s, content-type: %s); ' + 'cannot detect archive format', + filename, location, content_type, + ) + raise InstallationError( + 'Cannot determine archive format of {}'.format(location) + ) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/unpacking 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/unpacking 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9bfceb4e7e4beae92c87b81a1fd33a990985001d GIT binary patch literal 7639 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 ZIff{G-19L`YyR})^c;R0jqB5o{{tuR659X( literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/unpacking.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/unpacking.py new file mode 100644 index 0000000..7252dc2 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/unpacking.py @@ -0,0 +1,272 @@ +"""Utilities related archives. +""" + +# The following comment should be removed at some point in the future. +# mypy: strict-optional=False +# mypy: disallow-untyped-defs=False + +from __future__ import absolute_import + +import logging +import os +import shutil +import stat +import tarfile +import zipfile + +from pip._internal.exceptions import InstallationError +from pip._internal.utils.filetypes import ( + BZ2_EXTENSIONS, + TAR_EXTENSIONS, + XZ_EXTENSIONS, + ZIP_EXTENSIONS, +) +from pip._internal.utils.misc import ensure_dir +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Iterable, List, Optional, Text, Union + + +logger = logging.getLogger(__name__) + + +SUPPORTED_EXTENSIONS = ZIP_EXTENSIONS + TAR_EXTENSIONS + +try: + import bz2 # noqa + SUPPORTED_EXTENSIONS += BZ2_EXTENSIONS +except ImportError: + logger.debug('bz2 module is not available') + +try: + # Only for Python 3.3+ + import lzma # noqa + SUPPORTED_EXTENSIONS += XZ_EXTENSIONS +except ImportError: + logger.debug('lzma module is not available') + + +def current_umask(): + """Get the current umask which involves having to set it temporarily.""" + mask = os.umask(0) + os.umask(mask) + return mask + + +def split_leading_dir(path): + # type: (Union[str, Text]) -> List[Union[str, Text]] + path = path.lstrip('/').lstrip('\\') + if ( + '/' in path and ( + ('\\' in path and path.find('/') < path.find('\\')) or + '\\' not in path + ) + ): + return path.split('/', 1) + elif '\\' in path: + return path.split('\\', 1) + else: + return [path, ''] + + +def has_leading_dir(paths): + # type: (Iterable[Union[str, Text]]) -> bool + """Returns true if all the paths have the same leading path name + (i.e., everything is in one subdirectory in an archive)""" + common_prefix = None + for path in paths: + prefix, rest = split_leading_dir(path) + if not prefix: + return False + elif common_prefix is None: + common_prefix = prefix + elif prefix != common_prefix: + return False + return True + + +def is_within_directory(directory, target): + # type: ((Union[str, Text]), (Union[str, Text])) -> bool + """ + Return true if the absolute path of target is within the directory + """ + abs_directory = os.path.abspath(directory) + abs_target = os.path.abspath(target) + + prefix = os.path.commonprefix([abs_directory, abs_target]) + return prefix == abs_directory + + +def unzip_file(filename, location, flatten=True): + # type: (str, str, bool) -> None + """ + Unzip the file (with path `filename`) to the destination `location`. All + files are written based on system defaults and umask (i.e. permissions are + not preserved), except that regular file members with any execute + permissions (user, group, or world) have "chmod +x" applied after being + written. Note that for windows, any execute changes using os.chmod are + no-ops per the python docs. + """ + ensure_dir(location) + zipfp = open(filename, 'rb') + try: + zip = zipfile.ZipFile(zipfp, allowZip64=True) + leading = has_leading_dir(zip.namelist()) and flatten + for info in zip.infolist(): + name = info.filename + fn = name + if leading: + fn = split_leading_dir(name)[1] + fn = os.path.join(location, fn) + dir = os.path.dirname(fn) + if not is_within_directory(location, fn): + message = ( + 'The zip file ({}) has a file ({}) trying to install ' + 'outside target directory ({})' + ) + raise InstallationError(message.format(filename, fn, location)) + if fn.endswith('/') or fn.endswith('\\'): + # A directory + ensure_dir(fn) + else: + ensure_dir(dir) + # Don't use read() to avoid allocating an arbitrarily large + # chunk of memory for the file's content + fp = zip.open(name) + try: + with open(fn, 'wb') as destfp: + shutil.copyfileobj(fp, destfp) + finally: + fp.close() + mode = info.external_attr >> 16 + # if mode and regular file and any execute permissions for + # user/group/world? + if mode and stat.S_ISREG(mode) and mode & 0o111: + # make dest file have execute for user/group/world + # (chmod +x) no-op on windows per python docs + os.chmod(fn, (0o777 - current_umask() | 0o111)) + finally: + zipfp.close() + + +def untar_file(filename, location): + # type: (str, str) -> None + """ + Untar the file (with path `filename`) to the destination `location`. + All files are written based on system defaults and umask (i.e. permissions + are not preserved), except that regular file members with any execute + permissions (user, group, or world) have "chmod +x" applied after being + written. Note that for windows, any execute changes using os.chmod are + no-ops per the python docs. + """ + ensure_dir(location) + if filename.lower().endswith('.gz') or filename.lower().endswith('.tgz'): + mode = 'r:gz' + elif filename.lower().endswith(BZ2_EXTENSIONS): + mode = 'r:bz2' + elif filename.lower().endswith(XZ_EXTENSIONS): + mode = 'r:xz' + elif filename.lower().endswith('.tar'): + mode = 'r' + else: + logger.warning( + 'Cannot determine compression type for file %s', filename, + ) + mode = 'r:*' + tar = tarfile.open(filename, mode) + try: + leading = has_leading_dir([ + member.name for member in tar.getmembers() + ]) + for member in tar.getmembers(): + fn = member.name + if leading: + # https://github.com/python/mypy/issues/1174 + fn = split_leading_dir(fn)[1] # type: ignore + path = os.path.join(location, fn) + if not is_within_directory(location, path): + message = ( + 'The tar file ({}) has a file ({}) trying to install ' + 'outside target directory ({})' + ) + raise InstallationError( + message.format(filename, path, location) + ) + if member.isdir(): + ensure_dir(path) + elif member.issym(): + try: + # https://github.com/python/typeshed/issues/2673 + tar._extract_member(member, path) # type: ignore + except Exception as exc: + # Some corrupt tar files seem to produce this + # (specifically bad symlinks) + logger.warning( + 'In the tar file %s the member %s is invalid: %s', + filename, member.name, exc, + ) + continue + else: + try: + fp = tar.extractfile(member) + except (KeyError, AttributeError) as exc: + # Some corrupt tar files seem to produce this + # (specifically bad symlinks) + logger.warning( + 'In the tar file %s the member %s is invalid: %s', + filename, member.name, exc, + ) + continue + ensure_dir(os.path.dirname(path)) + with open(path, 'wb') as destfp: + shutil.copyfileobj(fp, destfp) + fp.close() + # Update the timestamp (useful for cython compiled files) + # https://github.com/python/typeshed/issues/2673 + tar.utime(member, path) # type: ignore + # member have any execute permissions for user/group/world? + if member.mode & 0o111: + # make dest file have execute for user/group/world + # no-op on windows per python docs + os.chmod(path, (0o777 - current_umask() | 0o111)) + finally: + tar.close() + + +def unpack_file( + filename, # type: str + location, # type: str + content_type=None, # type: Optional[str] +): + # type: (...) -> None + filename = os.path.realpath(filename) + if ( + content_type == 'application/zip' or + filename.lower().endswith(ZIP_EXTENSIONS) or + zipfile.is_zipfile(filename) + ): + unzip_file( + filename, + location, + flatten=not filename.endswith('.whl') + ) + elif ( + content_type == 'application/x-gzip' or + tarfile.is_tarfile(filename) or + filename.lower().endswith( + TAR_EXTENSIONS + BZ2_EXTENSIONS + XZ_EXTENSIONS + ) + ): + untar_file(filename, location) + else: + # FIXME: handle? + # FIXME: magic signatures? + logger.critical( + 'Cannot unpack file %s (downloaded from %s, content-type: %s); ' + 'cannot detect archive format', + filename, location, content_type, + ) + raise InstallationError( + 'Cannot determine archive format of {}'.format(location) + ) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/unpacking.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/unpacking.pyc new file mode 100644 index 0000000000000000000000000000000000000000..af8d28d7cb643d5b3d23509d8349f0c0e4926cec GIT binary patch literal 7639 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 Optional[Text] + if ':' not in url: + return None + return url.split(':', 1)[0].lower() + + +def path_to_url(path): + # type: (Union[str, Text]) -> str + """ + Convert a path to a file: URL. The path will be made absolute and have + quoted path parts. + """ + path = os.path.normpath(os.path.abspath(path)) + url = urllib_parse.urljoin('file:', urllib_request.pathname2url(path)) + return url + + +def url_to_path(url): + # type: (str) -> str + """ + Convert a file: URL to a path. + """ + assert url.startswith('file:'), ( + "You can only turn file: urls into filenames (not %r)" % url) + + _, netloc, path, _, _ = urllib_parse.urlsplit(url) + + if not netloc or netloc == 'localhost': + # According to RFC 8089, same as empty authority. + netloc = '' + elif sys.platform == 'win32': + # If we have a UNC path, prepend UNC share notation. + netloc = '\\\\' + netloc + else: + raise ValueError( + 'non-local file URIs are not supported on this platform: %r' + % url + ) + + path = urllib_request.url2pathname(netloc + path) + return path diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/urls 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/urls 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e1ad26a4abb91d4cf66fb705e3bf5acdbc1e837a GIT binary patch literal 2077 zcmc&!?{3^g5Fgw3FPBSuY7qsB8uOvjQIWegse}|!L=_^afDpL}Qch7%PHvO)W$ksm z>q`$cUnn1W1RjR3JP!{5zZu^Z)CZuJJ)W7}o!R}(ZzuR`t^Ma8PhOnT;_>nS3ZMNA zVvN@#O*DL?do=XK@00c^4QN;+kLLwq*J;?O>>BANr7aq^$WtvUQdw0ey+Uc5hHXk$ zX}C&hhlU;UGDK+5ugJ7UHP{^PsvqL>?DbRb~@rp)N~h zUFEn1#}7yQN28r@cXz%UMTdKP&-T9Q1-!Ne@nh~1lf~NAU>vBIP9h#=aGr7k{&?~Z zKKlRyyLd%((WIiwXL$}|3M}yY^x9_xKAb|sNRLDAIgYTMuuSk#m0E^OrX-uqbyDTk z=1LXS#yM$O=$@=$VJ{#Cd6CRwrv|gQ7@QeBR)rm$=Y#R(^!(??XOAA9JldMiXKw18 z`+Vza@(|B?HaHmMNxqR}*2P+HJpFpt?jN#CzEP4nRRDuQ=@M-R$ZGrf+}%LFbLB>` zNA`50Qnkk0Xh4wP@oJs`#8lza2tZGuH~|D0ER=xpdhPLhjnNuS>kOA`(6qT6^646| za(y|Roj|lhJUb?vsltVEn8$7sIs@%2(P}$9jK1%O;lV^zBUg#m;fV^99+_>l6t*Xow zW}u|Xze8c#%Vj`W?K*+w;6I%2!~O-;^=Y~+{BfPDdyN_gqM*_~b?iR>a9u8ZDvoGe z;~Cj!OM=wJUvfXdv^zZ3WzL{2{3lD3rY#m`;!Y_f#j4FEQKg3o zKc$b2Pyw7kIUGQ!`;J+QtukqOx9fbw4D_ znFXSS&A3N=cOs@j#1}2%>lJ+h@h^6w{qOy~g*|+cnsKSsmwZCYC+v6~zw34VuHW$1 JgO%pW>ObgS>L36B literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/urls.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/urls.py new file mode 100644 index 0000000..9ad40fe --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/urls.py @@ -0,0 +1,54 @@ +import os +import sys + +from pip._vendor.six.moves.urllib import parse as urllib_parse +from pip._vendor.six.moves.urllib import request as urllib_request + +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Optional, Text, Union + + +def get_url_scheme(url): + # type: (Union[str, Text]) -> Optional[Text] + if ':' not in url: + return None + return url.split(':', 1)[0].lower() + + +def path_to_url(path): + # type: (Union[str, Text]) -> str + """ + Convert a path to a file: URL. The path will be made absolute and have + quoted path parts. + """ + path = os.path.normpath(os.path.abspath(path)) + url = urllib_parse.urljoin('file:', urllib_request.pathname2url(path)) + return url + + +def url_to_path(url): + # type: (str) -> str + """ + Convert a file: URL to a path. + """ + assert url.startswith('file:'), ( + "You can only turn file: urls into filenames (not %r)" % url) + + _, netloc, path, _, _ = urllib_parse.urlsplit(url) + + if not netloc or netloc == 'localhost': + # According to RFC 8089, same as empty authority. + netloc = '' + elif sys.platform == 'win32': + # If we have a UNC path, prepend UNC share notation. + netloc = '\\\\' + netloc + else: + raise ValueError( + 'non-local file URIs are not supported on this platform: %r' + % url + ) + + path = urllib_request.url2pathname(netloc + path) + return path diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/urls.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/urls.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e1d37ac6a7335eb94684de41534aed6ad3d8a2d8 GIT binary patch literal 2077 zcmc&!?`|7K5TCpAzc@~7wTJ>m&G7-rpvG>Kib@ehps0chFx53diWSwmpbGqbxhyTAGE1b=O`ul{`U@`RR;kN?;B?C%f> zUXL`<=#B2t$P>R$+NUg_QH?yF7l>V_QKPbJq??qrXw)K4wW!QwRh{%2Wo;U@DO;z} zI%ORib;!#Rp+UbP(*`9?QEpJu66Gdu;ze%_8%qDiGwgX#T^*u`ORFlg3A0oeGi6=n zxCO_LhtChkd*40X`+gi942RE#-}VAt+k*J1aH+{-?P@Ug)s>To2RWQ4oPa-`yob+z z4uM^~B06tU+2ymmfH4IYczt^9GXft@p<$%QA%~75?4~SJd{m{DA(Jb~W(%EGd9}Gz zWwmimIxBTg*08YW5QCyj=dn|Rd0Y-ojZRc)2WQ0~xtN~)^62#8gX4!gi^becopXMJt_15;|FNULtUGk07+^G^63}!CXc7Uw5Uo6}W7mdCZRLXPE)OR!-MFDei-ggR5fy$Y8@V{FpCov#>dv^nS+ui z;Uu0biFGkEP9@cJFvi)wxGghCV)mF1jyGVe(1CLbNpe$WVlcfBUGxrgK%>*+u@KPl zARJQzJQ=&?;F6Ax=kvlm&eS%>JLd>{6&sIE`bRpF27T-|HbI1mMu_Nil^^AFeM+^6!8k{Zv* z@2?0_7ypd=0jAyIu`Y84ZQ(yznlx?k_^W{KFu#y80ExJemH~Z>L~p25F^Q}3HVNz_ zEITx_@FdPdlj}w3W@Wx49l)_6s%ymNLfWvG8y9|Be&)C{X>$_m3FrgvgG-FqWt#77 zTV~bKk=?~FH~E&#lOQ1SGaJUG3OSCQ6@@98rX~;FB(-6oV|NPr?IMRXKgVRjJqCd< zQ}C0S_Kmf;C1_bs%hHrl7cSu~?^k+Dz-ty(oU4cu=;v6^RJDpbrH~Y>wpT=z9wz*h zJ~l=La02CU0HN+XW-YeLq~+ai@)19Pp!zLu!@uX>_Sd|d{)QiTf!7Xhdp(9F;#(Nq zg>WB3pau5FbCoBi?A!FJpP9L`eMH5rjxbJwWyH-p5_~>dEn4-=zVyt#TNG)27IB#c zqNUBaM|^i8rb5IQE#m7HeFE_>cB1|7{k?@fe3_YKrqx$`Ldz%Ycpbm%b^Wg2@HT_B H=Gyu{-)HEo literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/virtualenv 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/virtualenv 2.py new file mode 100644 index 0000000..d81e6ac --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/virtualenv 2.py @@ -0,0 +1,115 @@ +from __future__ import absolute_import + +import logging +import os +import re +import site +import sys + +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import List, Optional + +logger = logging.getLogger(__name__) +_INCLUDE_SYSTEM_SITE_PACKAGES_REGEX = re.compile( + r"include-system-site-packages\s*=\s*(?Ptrue|false)" +) + + +def _running_under_venv(): + # type: () -> bool + """Checks if sys.base_prefix and sys.prefix match. + + This handles PEP 405 compliant virtual environments. + """ + return sys.prefix != getattr(sys, "base_prefix", sys.prefix) + + +def _running_under_regular_virtualenv(): + # type: () -> bool + """Checks if sys.real_prefix is set. + + This handles virtual environments created with pypa's virtualenv. + """ + # pypa/virtualenv case + return hasattr(sys, 'real_prefix') + + +def running_under_virtualenv(): + # type: () -> bool + """Return True if we're running inside a virtualenv, False otherwise. + """ + return _running_under_venv() or _running_under_regular_virtualenv() + + +def _get_pyvenv_cfg_lines(): + # type: () -> Optional[List[str]] + """Reads {sys.prefix}/pyvenv.cfg and returns its contents as list of lines + + Returns None, if it could not read/access the file. + """ + pyvenv_cfg_file = os.path.join(sys.prefix, 'pyvenv.cfg') + try: + with open(pyvenv_cfg_file) as f: + return f.read().splitlines() # avoids trailing newlines + except IOError: + return None + + +def _no_global_under_venv(): + # type: () -> bool + """Check `{sys.prefix}/pyvenv.cfg` for system site-packages inclusion + + PEP 405 specifies that when system site-packages are not supposed to be + visible from a virtual environment, `pyvenv.cfg` must contain the following + line: + + include-system-site-packages = false + + Additionally, log a warning if accessing the file fails. + """ + cfg_lines = _get_pyvenv_cfg_lines() + if cfg_lines is None: + # We're not in a "sane" venv, so assume there is no system + # site-packages access (since that's PEP 405's default state). + logger.warning( + "Could not access 'pyvenv.cfg' despite a virtual environment " + "being active. Assuming global site-packages is not accessible " + "in this environment." + ) + return True + + for line in cfg_lines: + match = _INCLUDE_SYSTEM_SITE_PACKAGES_REGEX.match(line) + if match is not None and match.group('value') == 'false': + return True + return False + + +def _no_global_under_regular_virtualenv(): + # type: () -> bool + """Check if "no-global-site-packages.txt" exists beside site.py + + This mirrors logic in pypa/virtualenv for determining whether system + site-packages are visible in the virtual environment. + """ + site_mod_dir = os.path.dirname(os.path.abspath(site.__file__)) + no_global_site_packages_file = os.path.join( + site_mod_dir, 'no-global-site-packages.txt', + ) + return os.path.exists(no_global_site_packages_file) + + +def virtualenv_no_global(): + # type: () -> bool + """Returns a boolean, whether running in venv with no system site-packages. + """ + + if _running_under_regular_virtualenv(): + return _no_global_under_regular_virtualenv() + + if _running_under_venv(): + return _no_global_under_venv() + + return False diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/virtualenv 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/virtualenv 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c358cc7cae88e1a01eb7be0d8838852c51df3a4a GIT binary patch literal 4425 zcmd5QL`*A@&Lo|7GInZJW?WBfMJ462&1nlm#F7LB z0x)(dnT`FV_O<;>ed$C0L;pqpK+e6(57|}oYEvS3u?t{#&z^JdLGi!qwSWKf)}MPc z`xNkd`!qjskGdXtd|sfqK;44$Audw4IFC!zEzRQ<>aNV=GIh%m7b&jL zc$K=VLAQo8RChN_z1m z)H`NstRC-}$m*Re=p6?GZT@I}aSPx2Zx3#s1o1?FW%G%C(Z`+o)5T7#;30dru@fI4 zutXz|Y=Hx8i90IW>K~iCB_DEyt8|!Wey&4lYIRsu{y_IG$%HSO>?#i zETWN3?K>FN&nHO|B?EtwU_k!_U02a;7)&ZJc7c~8yTEh-?ABxa&zL|0`4&GuD+8BwTJa1Oz3^)+iurFN+E)5vHCsX*9X<{|$$>4nm{8<4ogp{<4`(Sw@Xse;^4bm+e75vIYqS zf<)?2fl)CMrb_$xO|)@I$nB(2`)Q)Lc`qZ2TPAU+lGG~DJ!}TOo;F5d>r_9AXIp1# zn8|Y3{W_l`O%kO>l5-Z=p#-BeN<vjW|$FYaDKk!I}MVam1#-Ry7z4>&rt~Y z8lIWc8dnN8q>q*QJQ*;PsJ|r68`9gmn1zo_>z|vRtfqkuvxWne-}8#zhWEa=?g@2x zJNYYWOA$D=fh%B1SfXQ;=}#EZ5z0Jh1Q!4}I?sQ{{dfNKC36Ur0*AmP^u8?63z!4k zSfzZ2V-O3(L05=!Rp3T`z_T5C1cG(y%v%F<;j*ZD`hN)ZRQ1!GOBjl&dZm~`=%};? zmDf>eUcyYKdr?0^QM1Fqs?(uPF1|lN(qNXENtUGs>DQ*}NK3LkiA;19gK&8|R*Ot> zz7}q)r%U=hRpSY$&0G(n#8EYkq|Td$~*Q@;He7y0-0_wGNu)ABn{I)|+Xe&^m{%RkuN`)2oUtK+v@cUzBT1aUkP z4f1r7NhHOku2 z$4&56tJ|>8?MF&KN6I(gk(6X63~ZQVw%E^c#CaB#Ass|LCJdXObEZwiA8J@S5Ra(` zHFFK030k!EDh*lGbM?-oc!A}b>EowZ$q&rGF4lkzVEZy-$Yv{y;4a5nV!Spi$_&p! zUIu(A48Gsyav@Z9Ah;UBxtK5Y$7$%}S@r`oEcaNt=5Gt~pf}D!5!-Tx&Nct9n`8H3 z7%!?^_rS_Rk7NFDi4-3G903@0hPt~s_jD*Qe6HBAAn0(3a6az=uAaMtKpmxNtb=5G zL4c*(Q|vvQbxzU?GyTl%aq1DH*Zw6(vbi5~q;Oc`EYTY(JuG^pBN1Tv-9}(V|8jH83hP*8`>@?$> zc*lgfvva<`UF1eim+%?)U2Jn}xFXlfs5q_Nt|7wOXrIs+X%DRxf`K;&Y@L literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/virtualenv.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/virtualenv.py new file mode 100644 index 0000000..d81e6ac --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/virtualenv.py @@ -0,0 +1,115 @@ +from __future__ import absolute_import + +import logging +import os +import re +import site +import sys + +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import List, Optional + +logger = logging.getLogger(__name__) +_INCLUDE_SYSTEM_SITE_PACKAGES_REGEX = re.compile( + r"include-system-site-packages\s*=\s*(?Ptrue|false)" +) + + +def _running_under_venv(): + # type: () -> bool + """Checks if sys.base_prefix and sys.prefix match. + + This handles PEP 405 compliant virtual environments. + """ + return sys.prefix != getattr(sys, "base_prefix", sys.prefix) + + +def _running_under_regular_virtualenv(): + # type: () -> bool + """Checks if sys.real_prefix is set. + + This handles virtual environments created with pypa's virtualenv. + """ + # pypa/virtualenv case + return hasattr(sys, 'real_prefix') + + +def running_under_virtualenv(): + # type: () -> bool + """Return True if we're running inside a virtualenv, False otherwise. + """ + return _running_under_venv() or _running_under_regular_virtualenv() + + +def _get_pyvenv_cfg_lines(): + # type: () -> Optional[List[str]] + """Reads {sys.prefix}/pyvenv.cfg and returns its contents as list of lines + + Returns None, if it could not read/access the file. + """ + pyvenv_cfg_file = os.path.join(sys.prefix, 'pyvenv.cfg') + try: + with open(pyvenv_cfg_file) as f: + return f.read().splitlines() # avoids trailing newlines + except IOError: + return None + + +def _no_global_under_venv(): + # type: () -> bool + """Check `{sys.prefix}/pyvenv.cfg` for system site-packages inclusion + + PEP 405 specifies that when system site-packages are not supposed to be + visible from a virtual environment, `pyvenv.cfg` must contain the following + line: + + include-system-site-packages = false + + Additionally, log a warning if accessing the file fails. + """ + cfg_lines = _get_pyvenv_cfg_lines() + if cfg_lines is None: + # We're not in a "sane" venv, so assume there is no system + # site-packages access (since that's PEP 405's default state). + logger.warning( + "Could not access 'pyvenv.cfg' despite a virtual environment " + "being active. Assuming global site-packages is not accessible " + "in this environment." + ) + return True + + for line in cfg_lines: + match = _INCLUDE_SYSTEM_SITE_PACKAGES_REGEX.match(line) + if match is not None and match.group('value') == 'false': + return True + return False + + +def _no_global_under_regular_virtualenv(): + # type: () -> bool + """Check if "no-global-site-packages.txt" exists beside site.py + + This mirrors logic in pypa/virtualenv for determining whether system + site-packages are visible in the virtual environment. + """ + site_mod_dir = os.path.dirname(os.path.abspath(site.__file__)) + no_global_site_packages_file = os.path.join( + site_mod_dir, 'no-global-site-packages.txt', + ) + return os.path.exists(no_global_site_packages_file) + + +def virtualenv_no_global(): + # type: () -> bool + """Returns a boolean, whether running in venv with no system site-packages. + """ + + if _running_under_regular_virtualenv(): + return _no_global_under_regular_virtualenv() + + if _running_under_venv(): + return _no_global_under_venv() + + return False diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/virtualenv.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/virtualenv.pyc new file mode 100644 index 0000000000000000000000000000000000000000..444dfe6007d91dfd323391973bac04f8bbb3c523 GIT binary patch literal 4425 zcmd5QL`*A@PLnpBjGfw57}pbk?e!MRaN#SYU)N)jS;RCJw=&N#lvtel*U~ z+_qfL74$rKvj4>2`$Kc@8^8Uq)w8f`K-FGQYTmZ|!&cH;;pOqQA8HL_hE2PW|y>Csy!~z1!G{_Yhd3 zkw><`0k*`Qo)zh+h?Ve63^1d;q3#_S74;QHtse$P`&q90(WwfOP}*jvrp@Y!ha*U$Q&+&KK? z)9Lisj;ytxe|j>!fzKdm95k{h+l>-qgE-#()#txyb=%w|Uq4E$&aoGbiH%~@n5_bf zsAp6A7Dn~+Ns>g#z@H=-&_71kRWut0lgf)-;N{3JFkJw<^%(y%CXm2B=Khyp&vg*b zVF$8C+lzp{2v*g@y;g_nB(g)5O|xLz%<<=$FHt`?hT|baJPZs&+-Bk|A(rSh;d~u4 zc?IWO4<>N{ydABute@c`hk9j!IxA98-$DS?&%mWk#vVaORB7&_r>*TIPt*a_!=yja z+qqV=eN|va6lxWmLvTlZ%^Fjw9qRlfGTK2Z5VlwOflTQ)1G{%HlUFFZfNUFm4ziL! z#!OtKi!M%Fei$KL6lsK&<*jze1qp;6y)rg1ud(a5GOqk6ADkc5-V_8=cwgM

zB6X<1s2B-TrG5M++PEa-cG9R;n&=(g%gExENgS#qwF-0(8$qw9jZxS-)sN!Y)|oZT zWI1fB#^*?rM5&SFoCS6$!6=Oqkw%*{lQg9nX2cnspKtk2gQRC=T9UNxecQ})6av16 zXXdoVmBJ0_W2HV%2FxVtFNyP-^!7Gp;Um-f=cXsCsiVWJ<3QziyrQ@1z3XjwLLJ^t z{)*aC1Ws+>3Rn`B=m=%{BSv(DG7lQT1ptoD>F>G!t3Q9i90H}lAutKOFADS=<^VTV zDc|K7!~${96{1`fxRD?5Y?mH^V4WKC*1%l2EUKRVA3{A<{WRwihGME-Dy9%RDy>1~ zbyS*{Fq7$C)Q?cq>@cwEWT=yi?+=hPm}O>?WvM~>wW&JPl5CG76CK7NT%L~AB9ol2 zg*)o$l73IscmirO*Mlf=R88YJJwct3=kaEI;ik!@_lG=!x~0SrxU27kVdTt3Jl#=o z3W2GUAm;+cYH`}&les)_GwPnpZ{{Do!3#CbgtWb!_qGbP$>2~fUL(-pM+ZF{9qYQf zW6WgC4TCs6gfn<$H;jNen-PO2NT3oTHOw7E9h4yw?<0|{v{kF3v3-pXS8)&vfu#;~ zE^3^uSJcQU-+qXT{Clmv`wzcr`kg18gXROjbMK((@88+`=FZ(_$8R_9HXq9f;&>z) zF+0OZ(R$TeFP6PZsZ`j2y03ey zPTiaci};GVzecbu3}PrDYQQ-XTg~EKTmU(X(S*@qfxC+Y<-x4A0+9n zo8Ze@l&ki2j*WBYrqDueVH+2vlT{gmt!q4UK#jZUR57!8tTJnsWMtUfS~Z!r36#?T_#yPRPEC2yaaF#oJO{-j?cin(B85IWvO3&vL-f{7g{=ze2(qwb|b<&2^iZ?{d6gE?cmJwl@QK uUdl~qauVw=dHIIPx>Z>BW`BjPLfQLCVbd#n)l#)uU8`2Am#gnrFaH-mX`zAu literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/wheel 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/wheel 2.py new file mode 100644 index 0000000..837e0af --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/wheel 2.py @@ -0,0 +1,225 @@ +"""Support functions for working with wheel files. +""" + +from __future__ import absolute_import + +import logging +from email.parser import Parser +from zipfile import ZipFile + +from pip._vendor.packaging.utils import canonicalize_name +from pip._vendor.pkg_resources import DistInfoDistribution +from pip._vendor.six import PY2, ensure_str + +from pip._internal.exceptions import UnsupportedWheel +from pip._internal.utils.pkg_resources import DictMetadata +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from email.message import Message + from typing import Dict, Tuple + + from pip._vendor.pkg_resources import Distribution + +if PY2: + from zipfile import BadZipfile as BadZipFile +else: + from zipfile import BadZipFile + + +VERSION_COMPATIBLE = (1, 0) + + +logger = logging.getLogger(__name__) + + +class WheelMetadata(DictMetadata): + """Metadata provider that maps metadata decoding exceptions to our + internal exception type. + """ + def __init__(self, metadata, wheel_name): + # type: (Dict[str, bytes], str) -> None + super(WheelMetadata, self).__init__(metadata) + self._wheel_name = wheel_name + + def get_metadata(self, name): + # type: (str) -> str + try: + return super(WheelMetadata, self).get_metadata(name) + except UnicodeDecodeError as e: + # Augment the default error with the origin of the file. + raise UnsupportedWheel( + "Error decoding metadata for {}: {}".format( + self._wheel_name, e + ) + ) + + +def pkg_resources_distribution_for_wheel(wheel_zip, name, location): + # type: (ZipFile, str, str) -> Distribution + """Get a pkg_resources distribution given a wheel. + + :raises UnsupportedWheel: on any errors + """ + info_dir, _ = parse_wheel(wheel_zip, name) + + metadata_files = [ + p for p in wheel_zip.namelist() if p.startswith("{}/".format(info_dir)) + ] + + metadata_text = {} # type: Dict[str, bytes] + for path in metadata_files: + # If a flag is set, namelist entries may be unicode in Python 2. + # We coerce them to native str type to match the types used in the rest + # of the code. This cannot fail because unicode can always be encoded + # with UTF-8. + full_path = ensure_str(path) + _, metadata_name = full_path.split("/", 1) + + try: + metadata_text[metadata_name] = read_wheel_metadata_file( + wheel_zip, full_path + ) + except UnsupportedWheel as e: + raise UnsupportedWheel( + "{} has an invalid wheel, {}".format(name, str(e)) + ) + + metadata = WheelMetadata(metadata_text, location) + + return DistInfoDistribution( + location=location, metadata=metadata, project_name=name + ) + + +def parse_wheel(wheel_zip, name): + # type: (ZipFile, str) -> Tuple[str, Message] + """Extract information from the provided wheel, ensuring it meets basic + standards. + + Returns the name of the .dist-info directory and the parsed WHEEL metadata. + """ + try: + info_dir = wheel_dist_info_dir(wheel_zip, name) + metadata = wheel_metadata(wheel_zip, info_dir) + version = wheel_version(metadata) + except UnsupportedWheel as e: + raise UnsupportedWheel( + "{} has an invalid wheel, {}".format(name, str(e)) + ) + + check_compatibility(version, name) + + return info_dir, metadata + + +def wheel_dist_info_dir(source, name): + # type: (ZipFile, str) -> str + """Returns the name of the contained .dist-info directory. + + Raises AssertionError or UnsupportedWheel if not found, >1 found, or + it doesn't match the provided name. + """ + # Zip file path separators must be / + subdirs = list(set(p.split("/")[0] for p in source.namelist())) + + info_dirs = [s for s in subdirs if s.endswith('.dist-info')] + + if not info_dirs: + raise UnsupportedWheel(".dist-info directory not found") + + if len(info_dirs) > 1: + raise UnsupportedWheel( + "multiple .dist-info directories found: {}".format( + ", ".join(info_dirs) + ) + ) + + info_dir = info_dirs[0] + + info_dir_name = canonicalize_name(info_dir) + canonical_name = canonicalize_name(name) + if not info_dir_name.startswith(canonical_name): + raise UnsupportedWheel( + ".dist-info directory {!r} does not start with {!r}".format( + info_dir, canonical_name + ) + ) + + # Zip file paths can be unicode or str depending on the zip entry flags, + # so normalize it. + return ensure_str(info_dir) + + +def read_wheel_metadata_file(source, path): + # type: (ZipFile, str) -> bytes + try: + return source.read(path) + # BadZipFile for general corruption, KeyError for missing entry, + # and RuntimeError for password-protected files + except (BadZipFile, KeyError, RuntimeError) as e: + raise UnsupportedWheel( + "could not read {!r} file: {!r}".format(path, e) + ) + + +def wheel_metadata(source, dist_info_dir): + # type: (ZipFile, str) -> Message + """Return the WHEEL metadata of an extracted wheel, if possible. + Otherwise, raise UnsupportedWheel. + """ + path = "{}/WHEEL".format(dist_info_dir) + # Zip file path separators must be / + wheel_contents = read_wheel_metadata_file(source, path) + + try: + wheel_text = ensure_str(wheel_contents) + except UnicodeDecodeError as e: + raise UnsupportedWheel("error decoding {!r}: {!r}".format(path, e)) + + # FeedParser (used by Parser) does not raise any exceptions. The returned + # message may have .defects populated, but for backwards-compatibility we + # currently ignore them. + return Parser().parsestr(wheel_text) + + +def wheel_version(wheel_data): + # type: (Message) -> Tuple[int, ...] + """Given WHEEL metadata, return the parsed Wheel-Version. + Otherwise, raise UnsupportedWheel. + """ + version_text = wheel_data["Wheel-Version"] + if version_text is None: + raise UnsupportedWheel("WHEEL is missing Wheel-Version") + + version = version_text.strip() + + try: + return tuple(map(int, version.split('.'))) + except ValueError: + raise UnsupportedWheel("invalid Wheel-Version: {!r}".format(version)) + + +def check_compatibility(version, name): + # type: (Tuple[int, ...], str) -> None + """Raises errors or warns if called with an incompatible Wheel-Version. + + Pip should refuse to install a Wheel-Version that's a major series + ahead of what it's compatible with (e.g 2.0 > 1.1); and warn when + installing a version only minor version ahead (e.g 1.2 > 1.1). + + version: a 2-tuple representing a Wheel-Version (Major, Minor) + name: name of wheel or package to raise exception about + + :raises UnsupportedWheel: when an incompatible Wheel-Version is given + """ + if version[0] > VERSION_COMPATIBLE[0]: + raise UnsupportedWheel( + "%s's Wheel-Version (%s) is not compatible with this version " + "of pip" % (name, '.'.join(map(str, version))) + ) + elif version > VERSION_COMPATIBLE: + logger.warning( + 'Installing from a newer Wheel-Version (%s)', + '.'.join(map(str, version)), + ) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/wheel 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/wheel 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2cf2379f5605e90797c92bdb385950da20e94285 GIT binary patch literal 7853 zcmc&(O?MQ>6@5J;jXsbp0YV5&;x-rSgU4lXy(p<5C~D zed7{Wq&*?^3Hx4=cv9L^QlGN#6B18Ld!N+z+4o6_XQVwV^;v1ZCH1##>y*TE(w>+4 zynUaRc)zp{Nd16)-zV`wX)j29L7Z?wvVZ7aW+Xl&?M10C+EKF-AC~r#)R&}vMCwOu z>sz{mqf$RAP9hS{N@hFebn9vP z7KCz8el7Bi$m9CE5-jkgeq4e>S~(%XqE_CM;ILLsO0cArQxY7}%4rFXYNbj6uUC&j z7x{S<>)lQ#&5YaXCQTEiN$$4N%zd6_PoiYgeIA)D_xV;B#%?Q$!@M>f;Tx$!fnw%R z_#1f|cTL!c+MH(1_EgYw&(HEOv+omluScDqV+z}_9}P`ENt3AQ$I(||Bk|is*8;k3 zM7g<@v{L@gqKz&$RxP2!5JUGKUog}79VU4<3mX_>C!I&z1GMRZ!r&3NZF^?Wb0cb+ zJE8Fd-}tum09x-nzW2Cs{gc(}pEbM(YiqaGZrVQX_)eJT{$^+w9xJ9W}<_9=4#b&46ZKE6_9XE?{y3fJRhQ`9~YgeHp7nKm=0|-!-2pno3_EFNx zn0V_|iY50^4CZk=S^6vr!pt>WzH!@rCwJS$>D?e~rUBI(zG#LWt96sQX*Zj8@e?H` z%o0D|?RHJC6V|k|$)yI*^{ZI+1R4zfJF)|amSnpmI}QQt?4Tynz*d1X6~bDTa#R^Y zPhsX!XJ!&bqY)*MX*A3}z9{4@D7cp4S9ut>bm-t53W7Z&F-EE^@)*T(CySo>CR~2z zXUnZLhAi^s&CYW0bbIrwi>;OO8!I35de6+ZG3LV$o^PGU&t|fGf4LKN&P7RX{5U@M z@r~8|-UBx2gFRZ&ECZ5pzO0MaIz5k2;?g-cDy2oINwjk7go}#lE-JmF-!7^3M@db_ z0PZK#l6@*pAFdE*hN`#6DZ=fFK$eg#r1~pI5=TB)k#do>{5ZQrS7`%%Q9}RqCJs8Mg|M(H0wxb{ceJzVeKXMvyie4OOMb zxpvR;h7LsAcn?ob=~v1XXKGxnk4}R-R#^QT6<8lYLZd6mFH6!dOMgr@wQ(Db@O@vr zCw(AkoW@C1m1U<)FyVi8ob6wh0`ipLSg+^z#35*Z^4*uz@bid_USeT$j123 z@jNnE2~#NM`!fQ41=v1T#Tqjbpo`}!uU98=e06*`L*x2x=gDRx3v+m~W|+Idp77yr zM$f_oL#)kCt24Wl`B9F6uSShaZi=Bv&kbo-xsJ_g%`f}Q3iM@l-}&3x@)glpaoo5s2~x;yoG9mY%R`1Cs>HO2uHtMEpd$r+8k zBly50BCHqf#E~&ec+EmTDE#KYq#F!A)_}Qr1SvIrk4~ye6hX`))`NZ(b-bf^^IW!5 ztPuimBZx9Ra6`+Ec?%sQ)8~d04Vz5(!l+N^_-0F|Z*}9ip>HDtc|4EuQ@QNg+V}3e z4NYtWH#qceJa545S+QQixcrAGq;jbIAUP%?uMU7O=}6p zPXa#+zy|f*3r#lzapXKytDCm8UZWflN?R!`F$3b$tOq*@?1F@Q;6D0fb@ld;nOKVP zU1p_`%rFjF=yDlE<^rumsBIsBQW0vKo`D3=7U@2%C7ni1=W1?+%_og!+6GpmjR

oNQ{@Z=2OGEsKs@NXVZ*?FftTWS&jv}anqhKzrr zVhNk&k|Y>F62gRy2=w$NjUOe1fVUY>08PXUxPA0xXZXs1afWdQpvxPK5sV0yo?v=F zbd0a?^-snm`;87j_^Hr^Z^M6UF9r-hK@0r)5rCaxVVoTZN38201SLeIZH)`)%KxS_ zPAWCRViS9e0n1MpGptwX;qpJA_-`m}rit;R1X%nwybd64larg~)~NB(dJ39NIz`Q?1`r>vd#-e&_ITYT?6H>XxEZ-z3A{ z1^2A*^4+Yjx>9{=0Jhg*c2qTN)1ov)tCB+Foj`-e&M*mVw5FrbOKTh^>TonTZl_V= z@gtAHN29qi8RglQy{N}gVw!h1;68H=z`2Ihfv?Lwo?G49ph-!EM(N@8+VTtxd_&6i zC}Q{R_o$B;bTT`O^oEtv>OMiU$Q4xRZh+Xlu*gavZ!SCdQ5ky zaz6`uYX3^+yl!Hm_MW?vYS~_pKEfAXjm4Xe5vQ<;-{MjG;@xO}c?sfIVUKW?7=uVO z29kcAsPyJv;VSPBxymmJt^!YvG=P#DI`R>gf_HnL)c{arE@+C@KdV0+B?Y7tVAmj) zq%ZK(8p>h6Ew_{Ad9)E1KJzXJNcJ3r{;aFK{x#=Z&fkovQY`wv?r62og}@rbb*Vk1WFw&P+;4qhL^^kIF7@qaAgD&P$ccK=5g>_iag&yaZ@jNqu2owl$?%G zPUZ#AJ+w^FLgN2L4sS4z_I|Db$}Slp!4?6I;LIaK)Nj|6(+)0(BmEX>Yf4l!IIN{f zacQHNc@ydARnIW#sIdguJpGMql!kVN&_h4&7H)``Ru8lXTTFYZ!zyTNL&5eFj>Pk( zLc>KY{YN}Ga~(21%|K9^0pMI`)_N!Mf?+6N6e-|_Dp5yr`LhCShz$S|U}n*UffiA? z1}zq#S>fmSl%I8oKY~xG>+7H4V`lJy=mKPa2mC!t1Z`fxWv1Nc)d#)^iR_rpi5YWE z1`MteU?d|7FDT``sN?2a8i2B})y+c}DcBc$Ty79jpItH?WPLMbDKIL3LLUGIHlqm|mcKdD;K1YK7_378_4VU-1hpXQDt-EWD z>v!+m`}qE?YqwWz=(&tOZ;i!i6v`XpbaNB86B-MZi*=Opd$e(7lW)?{e~eB11&=lK z*#(e~vU3v5uY%vYPbKoo$*W|w9{HL2uSTQQMS=l&S`SU42jp3CKy_$g+mGU!hTzQ8 zkW3LEpQYI^`VT|;1zpq{NC5_EhQS0BCa7s1U#YmE*BlwNHg3d+ NsZ&!kQwvl3{{zlTf&l;k literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/wheel.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/wheel.py new file mode 100644 index 0000000..837e0af --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/wheel.py @@ -0,0 +1,225 @@ +"""Support functions for working with wheel files. +""" + +from __future__ import absolute_import + +import logging +from email.parser import Parser +from zipfile import ZipFile + +from pip._vendor.packaging.utils import canonicalize_name +from pip._vendor.pkg_resources import DistInfoDistribution +from pip._vendor.six import PY2, ensure_str + +from pip._internal.exceptions import UnsupportedWheel +from pip._internal.utils.pkg_resources import DictMetadata +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from email.message import Message + from typing import Dict, Tuple + + from pip._vendor.pkg_resources import Distribution + +if PY2: + from zipfile import BadZipfile as BadZipFile +else: + from zipfile import BadZipFile + + +VERSION_COMPATIBLE = (1, 0) + + +logger = logging.getLogger(__name__) + + +class WheelMetadata(DictMetadata): + """Metadata provider that maps metadata decoding exceptions to our + internal exception type. + """ + def __init__(self, metadata, wheel_name): + # type: (Dict[str, bytes], str) -> None + super(WheelMetadata, self).__init__(metadata) + self._wheel_name = wheel_name + + def get_metadata(self, name): + # type: (str) -> str + try: + return super(WheelMetadata, self).get_metadata(name) + except UnicodeDecodeError as e: + # Augment the default error with the origin of the file. + raise UnsupportedWheel( + "Error decoding metadata for {}: {}".format( + self._wheel_name, e + ) + ) + + +def pkg_resources_distribution_for_wheel(wheel_zip, name, location): + # type: (ZipFile, str, str) -> Distribution + """Get a pkg_resources distribution given a wheel. + + :raises UnsupportedWheel: on any errors + """ + info_dir, _ = parse_wheel(wheel_zip, name) + + metadata_files = [ + p for p in wheel_zip.namelist() if p.startswith("{}/".format(info_dir)) + ] + + metadata_text = {} # type: Dict[str, bytes] + for path in metadata_files: + # If a flag is set, namelist entries may be unicode in Python 2. + # We coerce them to native str type to match the types used in the rest + # of the code. This cannot fail because unicode can always be encoded + # with UTF-8. + full_path = ensure_str(path) + _, metadata_name = full_path.split("/", 1) + + try: + metadata_text[metadata_name] = read_wheel_metadata_file( + wheel_zip, full_path + ) + except UnsupportedWheel as e: + raise UnsupportedWheel( + "{} has an invalid wheel, {}".format(name, str(e)) + ) + + metadata = WheelMetadata(metadata_text, location) + + return DistInfoDistribution( + location=location, metadata=metadata, project_name=name + ) + + +def parse_wheel(wheel_zip, name): + # type: (ZipFile, str) -> Tuple[str, Message] + """Extract information from the provided wheel, ensuring it meets basic + standards. + + Returns the name of the .dist-info directory and the parsed WHEEL metadata. + """ + try: + info_dir = wheel_dist_info_dir(wheel_zip, name) + metadata = wheel_metadata(wheel_zip, info_dir) + version = wheel_version(metadata) + except UnsupportedWheel as e: + raise UnsupportedWheel( + "{} has an invalid wheel, {}".format(name, str(e)) + ) + + check_compatibility(version, name) + + return info_dir, metadata + + +def wheel_dist_info_dir(source, name): + # type: (ZipFile, str) -> str + """Returns the name of the contained .dist-info directory. + + Raises AssertionError or UnsupportedWheel if not found, >1 found, or + it doesn't match the provided name. + """ + # Zip file path separators must be / + subdirs = list(set(p.split("/")[0] for p in source.namelist())) + + info_dirs = [s for s in subdirs if s.endswith('.dist-info')] + + if not info_dirs: + raise UnsupportedWheel(".dist-info directory not found") + + if len(info_dirs) > 1: + raise UnsupportedWheel( + "multiple .dist-info directories found: {}".format( + ", ".join(info_dirs) + ) + ) + + info_dir = info_dirs[0] + + info_dir_name = canonicalize_name(info_dir) + canonical_name = canonicalize_name(name) + if not info_dir_name.startswith(canonical_name): + raise UnsupportedWheel( + ".dist-info directory {!r} does not start with {!r}".format( + info_dir, canonical_name + ) + ) + + # Zip file paths can be unicode or str depending on the zip entry flags, + # so normalize it. + return ensure_str(info_dir) + + +def read_wheel_metadata_file(source, path): + # type: (ZipFile, str) -> bytes + try: + return source.read(path) + # BadZipFile for general corruption, KeyError for missing entry, + # and RuntimeError for password-protected files + except (BadZipFile, KeyError, RuntimeError) as e: + raise UnsupportedWheel( + "could not read {!r} file: {!r}".format(path, e) + ) + + +def wheel_metadata(source, dist_info_dir): + # type: (ZipFile, str) -> Message + """Return the WHEEL metadata of an extracted wheel, if possible. + Otherwise, raise UnsupportedWheel. + """ + path = "{}/WHEEL".format(dist_info_dir) + # Zip file path separators must be / + wheel_contents = read_wheel_metadata_file(source, path) + + try: + wheel_text = ensure_str(wheel_contents) + except UnicodeDecodeError as e: + raise UnsupportedWheel("error decoding {!r}: {!r}".format(path, e)) + + # FeedParser (used by Parser) does not raise any exceptions. The returned + # message may have .defects populated, but for backwards-compatibility we + # currently ignore them. + return Parser().parsestr(wheel_text) + + +def wheel_version(wheel_data): + # type: (Message) -> Tuple[int, ...] + """Given WHEEL metadata, return the parsed Wheel-Version. + Otherwise, raise UnsupportedWheel. + """ + version_text = wheel_data["Wheel-Version"] + if version_text is None: + raise UnsupportedWheel("WHEEL is missing Wheel-Version") + + version = version_text.strip() + + try: + return tuple(map(int, version.split('.'))) + except ValueError: + raise UnsupportedWheel("invalid Wheel-Version: {!r}".format(version)) + + +def check_compatibility(version, name): + # type: (Tuple[int, ...], str) -> None + """Raises errors or warns if called with an incompatible Wheel-Version. + + Pip should refuse to install a Wheel-Version that's a major series + ahead of what it's compatible with (e.g 2.0 > 1.1); and warn when + installing a version only minor version ahead (e.g 1.2 > 1.1). + + version: a 2-tuple representing a Wheel-Version (Major, Minor) + name: name of wheel or package to raise exception about + + :raises UnsupportedWheel: when an incompatible Wheel-Version is given + """ + if version[0] > VERSION_COMPATIBLE[0]: + raise UnsupportedWheel( + "%s's Wheel-Version (%s) is not compatible with this version " + "of pip" % (name, '.'.join(map(str, version))) + ) + elif version > VERSION_COMPATIBLE: + logger.warning( + 'Installing from a newer Wheel-Version (%s)', + '.'.join(map(str, version)), + ) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/wheel.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/utils/wheel.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4122ad5815b936b582a00b7fcb6f424e24a212c8 GIT binary patch literal 7853 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 Lr)H)WrVjiE^DKTv literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/vcs/__init__ 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/vcs/__init__ 2.py new file mode 100644 index 0000000..2a4eb13 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/vcs/__init__ 2.py @@ -0,0 +1,15 @@ +# Expose a limited set of classes and functions so callers outside of +# the vcs package don't need to import deeper than `pip._internal.vcs`. +# (The test directory and imports protected by MYPY_CHECK_RUNNING may +# still need to import from a vcs sub-package.) +# Import all vcs modules to register each VCS in the VcsSupport object. +import pip._internal.vcs.bazaar +import pip._internal.vcs.git +import pip._internal.vcs.mercurial +import pip._internal.vcs.subversion # noqa: F401 +from pip._internal.vcs.versioncontrol import ( # noqa: F401 + RemoteNotFoundError, + is_url, + make_vcs_requirement_url, + vcs, +) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/vcs/__init__ 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/vcs/__init__ 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b2fc65cceae1b46825508a627b3b623e47c451eb GIT binary patch literal 553 zcmZut$xg#C5OvzpO>ja;NO0iTOXF5W;sOXH%CSOWIpjd(CT?)CK3kTaD~V{qUt29 z6V)JLgQzA6n?$up*diXbd+b!PwfI3Bb!rIV5JSL~20qeouZt`h8lw%=oz6yuk#LMq zv3DMov5gF$6~b`EGgy+YAJ#i<%u8i1az7FoaFa3VBju0Tf-wV5i6k7Y@;^~308Vx? zikrAFf=M{t$=hOFa$|+g;B2R0&BiD&S_Y^gf#-soci^7YLEj2i;gRM>lngj6nV}Oc z6TE|_IZbBMba6iE_s0Ffd|tv704@d}Z#}d$qfZq7*cF)tCS~{bZfGB#U1{lmbD=mF d8sSku6#4lant0=-(n%rtwHv*4g?(?eegVsMlfwW2 literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/vcs/__init__.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/vcs/__init__.py new file mode 100644 index 0000000..2a4eb13 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/vcs/__init__.py @@ -0,0 +1,15 @@ +# Expose a limited set of classes and functions so callers outside of +# the vcs package don't need to import deeper than `pip._internal.vcs`. +# (The test directory and imports protected by MYPY_CHECK_RUNNING may +# still need to import from a vcs sub-package.) +# Import all vcs modules to register each VCS in the VcsSupport object. +import pip._internal.vcs.bazaar +import pip._internal.vcs.git +import pip._internal.vcs.mercurial +import pip._internal.vcs.subversion # noqa: F401 +from pip._internal.vcs.versioncontrol import ( # noqa: F401 + RemoteNotFoundError, + is_url, + make_vcs_requirement_url, + vcs, +) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/vcs/__init__.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/vcs/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2553b56e26730d1f7a3e7166ba2fbf06073b4b61 GIT binary patch literal 553 zcmZutJx{|h5OvzpFTsS6kYHfU(zvCFE`V5I><|z`1|m0cgNq%f_9f8%JAM;C0M7kD z73$e{_k8c^Y+wERsQdYK`@_?u&iJC;U zNYo;#O`X~hhkYMJ64 zG%IL2pJmId>7YLu3>S+EW&ki6e!TV3vYb9s{9{k#7MPU1%hB~X3SDXCe{-QY7aHSH aKpY3f0@`@vjnZi;`JEfRb%jH3y?y} None + """ + Export the Bazaar repository at the url to the destination location + """ + # Remove the location to make sure Bazaar can export it correctly + if os.path.exists(location): + rmtree(location) + + url, rev_options = self.get_url_rev_options(url) + self.run_command( + make_command('export', location, url, rev_options.to_args()), + show_stdout=False, + ) + + def fetch_new(self, dest, url, rev_options): + # type: (str, HiddenText, RevOptions) -> None + rev_display = rev_options.to_display() + logger.info( + 'Checking out %s%s to %s', + url, + rev_display, + display_path(dest), + ) + cmd_args = ( + make_command('branch', '-q', rev_options.to_args(), url, dest) + ) + self.run_command(cmd_args) + + def switch(self, dest, url, rev_options): + # type: (str, HiddenText, RevOptions) -> None + self.run_command(make_command('switch', url), cwd=dest) + + def update(self, dest, url, rev_options): + # type: (str, HiddenText, RevOptions) -> None + cmd_args = make_command('pull', '-q', rev_options.to_args()) + self.run_command(cmd_args, cwd=dest) + + @classmethod + def get_url_rev_and_auth(cls, url): + # type: (str) -> Tuple[str, Optional[str], AuthInfo] + # hotfix the URL scheme after removing bzr+ from bzr+ssh:// readd it + url, rev, user_pass = super(Bazaar, cls).get_url_rev_and_auth(url) + if url.startswith('ssh://'): + url = 'bzr+' + url + return url, rev, user_pass + + @classmethod + def get_remote_url(cls, location): + urls = cls.run_command(['info'], show_stdout=False, cwd=location) + for line in urls.splitlines(): + line = line.strip() + for x in ('checkout of branch: ', + 'parent branch: '): + if line.startswith(x): + repo = line.split(x)[1] + if cls._is_local_repository(repo): + return path_to_url(repo) + return repo + return None + + @classmethod + def get_revision(cls, location): + revision = cls.run_command( + ['revno'], show_stdout=False, cwd=location, + ) + return revision.splitlines()[-1] + + @classmethod + def is_commit_id_equal(cls, dest, name): + """Always assume the versions don't match""" + return False + + +vcs.register(Bazaar) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/vcs/bazaar 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/vcs/bazaar 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..113facefd1e598f511efad54547842dd1ee42590 GIT binary patch literal 5464 zcmc&&U2hx56}?MRlqgH0B-^r;I1Y=(4O`cu-J}f~)P)^O`DhwCSlcyBG}*4WLu%z+ zF1<6cRsX)c_}9PO z{t z^cEyMV@{7{D=-*h>bvLB9;pKBW!zJlmlKistE=w>HF%{Y06!Vt6!ol8_ zWJ%1L3<61(<@X}5M4t4nh*_8Ycf?%bpaAE7&|ZOZQYxwq<%nydh<9y~O`M6+d|Z^S z>wD(VGmcAZ+7%95LXo6)oW;k{ICgukj)pRKr7?ay2juZn6ZMNck4K4bT}SIzPriN< z-TQp!-j`AMsN4Ob`x|3vAa_zXv#hn;aczLAcsi?i&;-R&Lw^&>XvgA+JY0>T{tyR)kp+!`N;H0<~Br~xF{ ztgZ)Y02+Z>xpxPBL@_iB?GNeEZ0}l@H%h;C^=uxqGzVvQ7)Qm!Jkf4!O@ysPRPK+^ zsGF5apIfAvXdFG+?@$4>_Jb*?z*^irtg2Kl!Yd5Iso(KtsVQ!R?c z7ga*;6#xn}R*0KdK@cQW=!+}bM<^Cs)6dQkd9UU6Ov}?jt2E=nrmiTDTe0r|wpy;x zF^RD*9mV9JR#x=2ax&KxX`IlJ;Ot&;7+IGT6A&vsQPEvk1>OmfnxoV@8&V$i{2qqhT8fRc^c7>blUqCV2qcR3&^)ta9)0xi>BH>kR zZwrrQ^pN^`uw1zq)PuK!{tOo<*m#Tqw5rComo@San1==j|3I991O^YFTo@hJ<_mL# z0S5s?bMkUd(NdQeX!rSmheX$2!V35HO#f**8n$4s)-`+0(&*Q0xQagSW6#>89StQ= z{4^x0)w5zaG^H9gMYIX&l4_;!8f)*NX!AJUGCUxW6jJ@+4^f=hWi}~|*UuBR?%5g1 z5w!#3`g_sH9NvatsST+t!BSQIE?2Ks)M7joANA%ID)da84Dmn>g>V7Gs5iqKPh$Yp zVh>ZSp&;!aCQ56nGgaX!q{AB+d#bdv(@S^@8~KtOr=dY-JUD&uL;)QLpfenuhXxdZ zK)|;ufG-uJz$Hq_Zc}~m<*p}(NtR6^7ybmT8o1uX6W3Eby`h$nYoDEN)E_3}1Yz?& zHljI-R4xa7s)|P>(7mW>FCPLWITY#tv-=pq$7E(b>aK9d^a&&_C6Wz$ zmI=d8v5$v%EV)8z-wT?-vezV!Q11i`x^l!z>hAra*idKE;`qcJ%WkOV@vzuDEO z3dB|^Bf=hiCCNNGb`-nl0D@~I&~kf9vR+K;viSzZmVaQF@^t$Ee;z#BmdDSo%j1Op z&wY2pAEON4WkIA{8mCVtCJPsXmd|QGZdqPeklrClJZVdr?I>IPSFdR-_Wbe#OyJEv z&Qh19Bd{|4%DOTghd*PlitKgVT9n#|L6z}&mM4VNb;uCnIsPMx@1sy(M%48YpR+^r zB1hWJ_s`HvnNrgUN|P73|6!Nkpv7*WkjmBIe6R$1Uj(Mk<5`5H{!1S_K^86dpOJL} ztE48I586~^R~3qsa8#UHJ^cqhp5)%cn2=@(e~!Ypohp=&!MiE%h-augrYv50ek;5y z_`JPR4=(%cma3w)mFmcQj+keQUdSh zYnosbR0xgY+?=5nc)^D|@Y0VvS(-%V*(A0SLRnw)Aj;kE?zqysRx$N{ZNCn_B zxQLc0%8O)@K@4{|fSFp7;+~ZoWo)`zq!N29C?+>nFI{?n1ns-DkFk42625~GnxBR@ zS!1vdKSZHfT0eu$rUOaA;awKnEIvhXY7edb->;GM>$mV&=GS$kY4}zos8<{F&03?` zSZUN6bInF`r8(c`kg4(p6E`WTJT!UbF{MQ|9JbiNz=sR$R&;=CbWv{E^k^$D4vgIb zap2+|64xQg!(E;Yo!xV{CN9nFR-W3v&x`39j%(|TZw#}O-Emp;jkW%k!?XOWaqf7` z-H}rM?UJNkC1= None + """ + Export the Bazaar repository at the url to the destination location + """ + # Remove the location to make sure Bazaar can export it correctly + if os.path.exists(location): + rmtree(location) + + url, rev_options = self.get_url_rev_options(url) + self.run_command( + make_command('export', location, url, rev_options.to_args()), + show_stdout=False, + ) + + def fetch_new(self, dest, url, rev_options): + # type: (str, HiddenText, RevOptions) -> None + rev_display = rev_options.to_display() + logger.info( + 'Checking out %s%s to %s', + url, + rev_display, + display_path(dest), + ) + cmd_args = ( + make_command('branch', '-q', rev_options.to_args(), url, dest) + ) + self.run_command(cmd_args) + + def switch(self, dest, url, rev_options): + # type: (str, HiddenText, RevOptions) -> None + self.run_command(make_command('switch', url), cwd=dest) + + def update(self, dest, url, rev_options): + # type: (str, HiddenText, RevOptions) -> None + cmd_args = make_command('pull', '-q', rev_options.to_args()) + self.run_command(cmd_args, cwd=dest) + + @classmethod + def get_url_rev_and_auth(cls, url): + # type: (str) -> Tuple[str, Optional[str], AuthInfo] + # hotfix the URL scheme after removing bzr+ from bzr+ssh:// readd it + url, rev, user_pass = super(Bazaar, cls).get_url_rev_and_auth(url) + if url.startswith('ssh://'): + url = 'bzr+' + url + return url, rev, user_pass + + @classmethod + def get_remote_url(cls, location): + urls = cls.run_command(['info'], show_stdout=False, cwd=location) + for line in urls.splitlines(): + line = line.strip() + for x in ('checkout of branch: ', + 'parent branch: '): + if line.startswith(x): + repo = line.split(x)[1] + if cls._is_local_repository(repo): + return path_to_url(repo) + return repo + return None + + @classmethod + def get_revision(cls, location): + revision = cls.run_command( + ['revno'], show_stdout=False, cwd=location, + ) + return revision.splitlines()[-1] + + @classmethod + def is_commit_id_equal(cls, dest, name): + """Always assume the versions don't match""" + return False + + +vcs.register(Bazaar) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/vcs/bazaar.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/vcs/bazaar.pyc new file mode 100644 index 0000000000000000000000000000000000000000..99ae410f2e91143b9c77213227b1018d3ef99eae GIT binary patch literal 5464 zcmc&&?QR>#6}?MRlqgH0B-^r;I1Y=(4O`cuoun}u)P)_}`DhxtSUWXLG}*4WLvrO^ zF1<6>7DU%U9uI)SEaY=E$KK)+OJN-iG9x(%Y24tV;Pe zU9lnAS;@~y@0{f4rFY)Hv8?NENpH)`XLN=O(z_t}Md@9XU@T%PvbQbfEqR55y)DU# zm<<^OlB~)fL|%zJ>0J`DDSPjTxx_&M&i$~x2IZtwR2#|>*F+KT+9I1e6Q%j2C|%e0 zETCr+m)5i^9JqoaN$n(ykD^KJMy`&AGIymhemn={@lzA^i#(6ViErIR>(@_y^CY_a z#r?ZqMd3Hy?w8%qecu`MajM7_(X`C`I^5rHO=;6&e76|8vdA3mx!gs zIqvb%bdt@sunh5wG)c_(kvViH1|-= zFQ^zHWPliA1zHA5fSZ~mXQj6wNrQ?8R?MO#%c^vYS(4<8wl`=J4p^R<1b9i-v<0SG zm83a;WlhEPx!6>3V=k_%xH%U$Bz)LDhs~*4cAuBF24M#kJW?Tc`-KO2H)d>fC&R!a#iiMCL3raE{7fr zPY+maV}NL3pQ6^8l<9u#OlLnXJA)!ifX>cv(n+4}4WEBBxN&{=#)n5o`)k6D`i(>si#;$fa>H?}6iRw63*Cur2o zN~O;&(o8gtp6vIi09t#&3{+sP@?9bw03(9|I5_oQjc9}XyNbNT58Y^7ppmH-#o~)9 zA@>RZ1sW^F&8r{?k}CAY740`DmRqyW{X_Cz%Z*IS(?P2=lftI1D34mP?*O)1uFx@w zu`V6QW#(2?Nms5pqMONuFom7b{RF02CYm`KfGYMl+K5O)>@)rJ*S zYlX6%)!EAFc+RgO&!H{=`cwpy4L^%BFgClwZT2srnD0>;1GD;>V2|0%rw5VnGPbva z$1-|IeKT0CoDb^3+d+Shi(_m&#sFGXW82Fb`3KBHgM)t{&Ori$2T(4I4r}v;1;T)X zfT0C>xu9sN%L}yoe85AZYcF7hyCc(onvRDp*sFELUa>U#6&tRj&->W3Hfcvg2^2pI ziE8z%7!FOThD{M|Lb{|{DZIkkdnnpGj<*aCNF;?+fB0h*$99=dO5^qOM6G*zMsh^$ zz_|V>8k>V#5G=JJl@(a3s^8V><%(L2hvK8&+(Lz(iIX87sG$%pU>Nmgc;iV7pjzxf ziZv9Z{ewhlO?9R!Jb`q04P#G~c6xdVZ(t)|apN>J=!^%a4<0L^0|9h~qw~;!A`l4p zRt4~-VidSUDcNnN55C;>VA7CSz zqe$gq(5I?+L^7R%>zBCAww`LH!fNlnaIo}UR?wq%)(G&U2 zC!LP2%uL1uh}`NE2}au2Sr!><6eCYm$41O99q~BQ*E}XO>rr=!JEl({X(^Fx*waiH zeujNK!ehx5Qu{&B3|76C=~Bn!`DX~;6`@3AVGM~VXV9x4iXKkLk$@x+dhgp^jjBLw zl`N%4IY>dT0_KH_tBXkO${ z+xh+}dMQ(CIzegj0{1`c@>{gnEfi9@9GneSK<~@I)LA^skko(aW5>v%<^D6Wj$xJ5 zWcy*8s_d#lkrIxJ6RW5Hz{iu^dl(baEaA^l__h;;5;Ax<rkghU;$>Ud2P zjDiZGah#h|)B-Q~a0g!caVJZY$UK|IS;-S>SgdNg6w+~(qy9Iy(l(c!T?VNDTn3lX z5=D8DOf!h#eGXuzmZZ36nm=JeK)&9cdcA6$$Fq#$vP9Xg1aw zwZ=lT(OhdTwmD>`yus8>ODYddUU^Jukqw6}HZbtv0=pCK;~HI*J2pMs$%}nscR(Dt zc!$JwNb+zO=R@cB+?}aQGrN~wch7JXx_zvb{O|7x5&ns9fd zlz+P bool + _, rev_options = self.get_url_rev_options(hide_url(url)) + if not rev_options.rev: + return False + if not self.is_commit_id_equal(dest, rev_options.rev): + # the current commit is different from rev, + # which means rev was something else than a commit hash + return False + # return False in the rare case rev is both a commit hash + # and a tag or a branch; we don't want to cache in that case + # because that branch/tag could point to something else in the future + is_tag_or_branch = bool( + self.get_revision_sha(dest, rev_options.rev)[0] + ) + return not is_tag_or_branch + + def get_git_version(self): + VERSION_PFX = 'git version ' + version = self.run_command(['version'], show_stdout=False) + if version.startswith(VERSION_PFX): + version = version[len(VERSION_PFX):].split()[0] + else: + version = '' + # get first 3 positions of the git version because + # on windows it is x.y.z.windows.t, and this parses as + # LegacyVersion which always smaller than a Version. + version = '.'.join(version.split('.')[:3]) + return parse_version(version) + + @classmethod + def get_current_branch(cls, location): + """ + Return the current branch, or None if HEAD isn't at a branch + (e.g. detached HEAD). + """ + # git-symbolic-ref exits with empty stdout if "HEAD" is a detached + # HEAD rather than a symbolic ref. In addition, the -q causes the + # command to exit with status code 1 instead of 128 in this case + # and to suppress the message to stderr. + args = ['symbolic-ref', '-q', 'HEAD'] + output = cls.run_command( + args, extra_ok_returncodes=(1, ), show_stdout=False, cwd=location, + ) + ref = output.strip() + + if ref.startswith('refs/heads/'): + return ref[len('refs/heads/'):] + + return None + + def export(self, location, url): + # type: (str, HiddenText) -> None + """Export the Git repository at the url to the destination location""" + if not location.endswith('/'): + location = location + '/' + + with TempDirectory(kind="export") as temp_dir: + self.unpack(temp_dir.path, url=url) + self.run_command( + ['checkout-index', '-a', '-f', '--prefix', location], + show_stdout=False, cwd=temp_dir.path + ) + + @classmethod + def get_revision_sha(cls, dest, rev): + """ + Return (sha_or_none, is_branch), where sha_or_none is a commit hash + if the revision names a remote branch or tag, otherwise None. + + Args: + dest: the repository directory. + rev: the revision name. + """ + # Pass rev to pre-filter the list. + output = cls.run_command(['show-ref', rev], cwd=dest, + show_stdout=False, on_returncode='ignore') + refs = {} + for line in output.strip().splitlines(): + try: + sha, ref = line.split() + except ValueError: + # Include the offending line to simplify troubleshooting if + # this error ever occurs. + raise ValueError('unexpected show-ref line: {!r}'.format(line)) + + refs[ref] = sha + + branch_ref = 'refs/remotes/origin/{}'.format(rev) + tag_ref = 'refs/tags/{}'.format(rev) + + sha = refs.get(branch_ref) + if sha is not None: + return (sha, True) + + sha = refs.get(tag_ref) + + return (sha, False) + + @classmethod + def resolve_revision(cls, dest, url, rev_options): + # type: (str, HiddenText, RevOptions) -> RevOptions + """ + Resolve a revision to a new RevOptions object with the SHA1 of the + branch, tag, or ref if found. + + Args: + rev_options: a RevOptions object. + """ + rev = rev_options.arg_rev + # The arg_rev property's implementation for Git ensures that the + # rev return value is always non-None. + assert rev is not None + + sha, is_branch = cls.get_revision_sha(dest, rev) + + if sha is not None: + rev_options = rev_options.make_new(sha) + rev_options.branch_name = rev if is_branch else None + + return rev_options + + # Do not show a warning for the common case of something that has + # the form of a Git commit hash. + if not looks_like_hash(rev): + logger.warning( + "Did not find branch or tag '%s', assuming revision or ref.", + rev, + ) + + if not rev.startswith('refs/'): + return rev_options + + # If it looks like a ref, we have to fetch it explicitly. + cls.run_command( + make_command('fetch', '-q', url, rev_options.to_args()), + cwd=dest, + ) + # Change the revision to the SHA of the ref we fetched + sha = cls.get_revision(dest, rev='FETCH_HEAD') + rev_options = rev_options.make_new(sha) + + return rev_options + + @classmethod + def is_commit_id_equal(cls, dest, name): + """ + Return whether the current commit hash equals the given name. + + Args: + dest: the repository directory. + name: a string name. + """ + if not name: + # Then avoid an unnecessary subprocess call. + return False + + return cls.get_revision(dest) == name + + def fetch_new(self, dest, url, rev_options): + # type: (str, HiddenText, RevOptions) -> None + rev_display = rev_options.to_display() + logger.info('Cloning %s%s to %s', url, rev_display, display_path(dest)) + self.run_command(make_command('clone', '-q', url, dest)) + + if rev_options.rev: + # Then a specific revision was requested. + rev_options = self.resolve_revision(dest, url, rev_options) + branch_name = getattr(rev_options, 'branch_name', None) + if branch_name is None: + # Only do a checkout if the current commit id doesn't match + # the requested revision. + if not self.is_commit_id_equal(dest, rev_options.rev): + cmd_args = make_command( + 'checkout', '-q', rev_options.to_args(), + ) + self.run_command(cmd_args, cwd=dest) + elif self.get_current_branch(dest) != branch_name: + # Then a specific branch was requested, and that branch + # is not yet checked out. + track_branch = 'origin/{}'.format(branch_name) + cmd_args = [ + 'checkout', '-b', branch_name, '--track', track_branch, + ] + self.run_command(cmd_args, cwd=dest) + + #: repo may contain submodules + self.update_submodules(dest) + + def switch(self, dest, url, rev_options): + # type: (str, HiddenText, RevOptions) -> None + self.run_command( + make_command('config', 'remote.origin.url', url), + cwd=dest, + ) + cmd_args = make_command('checkout', '-q', rev_options.to_args()) + self.run_command(cmd_args, cwd=dest) + + self.update_submodules(dest) + + def update(self, dest, url, rev_options): + # type: (str, HiddenText, RevOptions) -> None + # First fetch changes from the default remote + if self.get_git_version() >= parse_version('1.9.0'): + # fetch tags in addition to everything else + self.run_command(['fetch', '-q', '--tags'], cwd=dest) + else: + self.run_command(['fetch', '-q'], cwd=dest) + # Then reset to wanted revision (maybe even origin/master) + rev_options = self.resolve_revision(dest, url, rev_options) + cmd_args = make_command('reset', '--hard', '-q', rev_options.to_args()) + self.run_command(cmd_args, cwd=dest) + #: update submodules + self.update_submodules(dest) + + @classmethod + def get_remote_url(cls, location): + """ + Return URL of the first remote encountered. + + Raises RemoteNotFoundError if the repository does not have a remote + url configured. + """ + # We need to pass 1 for extra_ok_returncodes since the command + # exits with return code 1 if there are no matching lines. + stdout = cls.run_command( + ['config', '--get-regexp', r'remote\..*\.url'], + extra_ok_returncodes=(1, ), show_stdout=False, cwd=location, + ) + remotes = stdout.splitlines() + try: + found_remote = remotes[0] + except IndexError: + raise RemoteNotFoundError + + for remote in remotes: + if remote.startswith('remote.origin.url '): + found_remote = remote + break + url = found_remote.split(' ')[1] + return url.strip() + + @classmethod + def get_revision(cls, location, rev=None): + if rev is None: + rev = 'HEAD' + current_rev = cls.run_command( + ['rev-parse', rev], show_stdout=False, cwd=location, + ) + return current_rev.strip() + + @classmethod + def get_subdirectory(cls, location): + """ + Return the path to setup.py, relative to the repo root. + Return None if setup.py is in the repo root. + """ + # find the repo root + git_dir = cls.run_command( + ['rev-parse', '--git-dir'], + show_stdout=False, cwd=location).strip() + if not os.path.isabs(git_dir): + git_dir = os.path.join(location, git_dir) + repo_root = os.path.abspath(os.path.join(git_dir, '..')) + return find_path_to_setup_from_repo_root(location, repo_root) + + @classmethod + def get_url_rev_and_auth(cls, url): + # type: (str) -> Tuple[str, Optional[str], AuthInfo] + """ + Prefixes stub URLs like 'user@hostname:user/repo.git' with 'ssh://'. + That's required because although they use SSH they sometimes don't + work with a ssh:// scheme (e.g. GitHub). But we need a scheme for + parsing. Hence we remove it again afterwards and return it as a stub. + """ + # Works around an apparent Git bug + # (see https://article.gmane.org/gmane.comp.version-control.git/146500) + scheme, netloc, path, query, fragment = urlsplit(url) + if scheme.endswith('file'): + initial_slashes = path[:-len(path.lstrip('/'))] + newpath = ( + initial_slashes + + urllib_request.url2pathname(path) + .replace('\\', '/').lstrip('/') + ) + url = urlunsplit((scheme, netloc, newpath, query, fragment)) + after_plus = scheme.find('+') + 1 + url = scheme[:after_plus] + urlunsplit( + (scheme[after_plus:], netloc, newpath, query, fragment), + ) + + if '://' not in url: + assert 'file:' not in url + url = url.replace('git+', 'git+ssh://') + url, rev, user_pass = super(Git, cls).get_url_rev_and_auth(url) + url = url.replace('ssh://', '') + else: + url, rev, user_pass = super(Git, cls).get_url_rev_and_auth(url) + + return url, rev, user_pass + + @classmethod + def update_submodules(cls, location): + if not os.path.exists(os.path.join(location, '.gitmodules')): + return + cls.run_command( + ['submodule', 'update', '--init', '--recursive', '-q'], + cwd=location, + ) + + @classmethod + def controls_location(cls, location): + if super(Git, cls).controls_location(location): + return True + try: + r = cls.run_command(['rev-parse'], + cwd=location, + show_stdout=False, + on_returncode='ignore', + log_failed_cmd=False) + return not r + except BadCommand: + logger.debug("could not determine if %s is under git control " + "because git is not available", location) + return False + + +vcs.register(Git) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/vcs/git 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/vcs/git 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b7c23067144e9cb0b47de5290e108ea18566b216 GIT binary patch literal 12814 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 literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/vcs/git.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/vcs/git.py new file mode 100644 index 0000000..7483303 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/vcs/git.py @@ -0,0 +1,389 @@ +# The following comment should be removed at some point in the future. +# mypy: disallow-untyped-defs=False + +from __future__ import absolute_import + +import logging +import os.path +import re + +from pip._vendor.packaging.version import parse as parse_version +from pip._vendor.six.moves.urllib import parse as urllib_parse +from pip._vendor.six.moves.urllib import request as urllib_request + +from pip._internal.exceptions import BadCommand +from pip._internal.utils.misc import display_path, hide_url +from pip._internal.utils.subprocess import make_command +from pip._internal.utils.temp_dir import TempDirectory +from pip._internal.utils.typing import MYPY_CHECK_RUNNING +from pip._internal.vcs.versioncontrol import ( + RemoteNotFoundError, + VersionControl, + find_path_to_setup_from_repo_root, + vcs, +) + +if MYPY_CHECK_RUNNING: + from typing import Optional, Tuple + from pip._internal.utils.misc import HiddenText + from pip._internal.vcs.versioncontrol import AuthInfo, RevOptions + + +urlsplit = urllib_parse.urlsplit +urlunsplit = urllib_parse.urlunsplit + + +logger = logging.getLogger(__name__) + + +HASH_REGEX = re.compile('^[a-fA-F0-9]{40}$') + + +def looks_like_hash(sha): + return bool(HASH_REGEX.match(sha)) + + +class Git(VersionControl): + name = 'git' + dirname = '.git' + repo_name = 'clone' + schemes = ( + 'git', 'git+http', 'git+https', 'git+ssh', 'git+git', 'git+file', + ) + # Prevent the user's environment variables from interfering with pip: + # https://github.com/pypa/pip/issues/1130 + unset_environ = ('GIT_DIR', 'GIT_WORK_TREE') + default_arg_rev = 'HEAD' + + @staticmethod + def get_base_rev_args(rev): + return [rev] + + def is_immutable_rev_checkout(self, url, dest): + # type: (str, str) -> bool + _, rev_options = self.get_url_rev_options(hide_url(url)) + if not rev_options.rev: + return False + if not self.is_commit_id_equal(dest, rev_options.rev): + # the current commit is different from rev, + # which means rev was something else than a commit hash + return False + # return False in the rare case rev is both a commit hash + # and a tag or a branch; we don't want to cache in that case + # because that branch/tag could point to something else in the future + is_tag_or_branch = bool( + self.get_revision_sha(dest, rev_options.rev)[0] + ) + return not is_tag_or_branch + + def get_git_version(self): + VERSION_PFX = 'git version ' + version = self.run_command(['version'], show_stdout=False) + if version.startswith(VERSION_PFX): + version = version[len(VERSION_PFX):].split()[0] + else: + version = '' + # get first 3 positions of the git version because + # on windows it is x.y.z.windows.t, and this parses as + # LegacyVersion which always smaller than a Version. + version = '.'.join(version.split('.')[:3]) + return parse_version(version) + + @classmethod + def get_current_branch(cls, location): + """ + Return the current branch, or None if HEAD isn't at a branch + (e.g. detached HEAD). + """ + # git-symbolic-ref exits with empty stdout if "HEAD" is a detached + # HEAD rather than a symbolic ref. In addition, the -q causes the + # command to exit with status code 1 instead of 128 in this case + # and to suppress the message to stderr. + args = ['symbolic-ref', '-q', 'HEAD'] + output = cls.run_command( + args, extra_ok_returncodes=(1, ), show_stdout=False, cwd=location, + ) + ref = output.strip() + + if ref.startswith('refs/heads/'): + return ref[len('refs/heads/'):] + + return None + + def export(self, location, url): + # type: (str, HiddenText) -> None + """Export the Git repository at the url to the destination location""" + if not location.endswith('/'): + location = location + '/' + + with TempDirectory(kind="export") as temp_dir: + self.unpack(temp_dir.path, url=url) + self.run_command( + ['checkout-index', '-a', '-f', '--prefix', location], + show_stdout=False, cwd=temp_dir.path + ) + + @classmethod + def get_revision_sha(cls, dest, rev): + """ + Return (sha_or_none, is_branch), where sha_or_none is a commit hash + if the revision names a remote branch or tag, otherwise None. + + Args: + dest: the repository directory. + rev: the revision name. + """ + # Pass rev to pre-filter the list. + output = cls.run_command(['show-ref', rev], cwd=dest, + show_stdout=False, on_returncode='ignore') + refs = {} + for line in output.strip().splitlines(): + try: + sha, ref = line.split() + except ValueError: + # Include the offending line to simplify troubleshooting if + # this error ever occurs. + raise ValueError('unexpected show-ref line: {!r}'.format(line)) + + refs[ref] = sha + + branch_ref = 'refs/remotes/origin/{}'.format(rev) + tag_ref = 'refs/tags/{}'.format(rev) + + sha = refs.get(branch_ref) + if sha is not None: + return (sha, True) + + sha = refs.get(tag_ref) + + return (sha, False) + + @classmethod + def resolve_revision(cls, dest, url, rev_options): + # type: (str, HiddenText, RevOptions) -> RevOptions + """ + Resolve a revision to a new RevOptions object with the SHA1 of the + branch, tag, or ref if found. + + Args: + rev_options: a RevOptions object. + """ + rev = rev_options.arg_rev + # The arg_rev property's implementation for Git ensures that the + # rev return value is always non-None. + assert rev is not None + + sha, is_branch = cls.get_revision_sha(dest, rev) + + if sha is not None: + rev_options = rev_options.make_new(sha) + rev_options.branch_name = rev if is_branch else None + + return rev_options + + # Do not show a warning for the common case of something that has + # the form of a Git commit hash. + if not looks_like_hash(rev): + logger.warning( + "Did not find branch or tag '%s', assuming revision or ref.", + rev, + ) + + if not rev.startswith('refs/'): + return rev_options + + # If it looks like a ref, we have to fetch it explicitly. + cls.run_command( + make_command('fetch', '-q', url, rev_options.to_args()), + cwd=dest, + ) + # Change the revision to the SHA of the ref we fetched + sha = cls.get_revision(dest, rev='FETCH_HEAD') + rev_options = rev_options.make_new(sha) + + return rev_options + + @classmethod + def is_commit_id_equal(cls, dest, name): + """ + Return whether the current commit hash equals the given name. + + Args: + dest: the repository directory. + name: a string name. + """ + if not name: + # Then avoid an unnecessary subprocess call. + return False + + return cls.get_revision(dest) == name + + def fetch_new(self, dest, url, rev_options): + # type: (str, HiddenText, RevOptions) -> None + rev_display = rev_options.to_display() + logger.info('Cloning %s%s to %s', url, rev_display, display_path(dest)) + self.run_command(make_command('clone', '-q', url, dest)) + + if rev_options.rev: + # Then a specific revision was requested. + rev_options = self.resolve_revision(dest, url, rev_options) + branch_name = getattr(rev_options, 'branch_name', None) + if branch_name is None: + # Only do a checkout if the current commit id doesn't match + # the requested revision. + if not self.is_commit_id_equal(dest, rev_options.rev): + cmd_args = make_command( + 'checkout', '-q', rev_options.to_args(), + ) + self.run_command(cmd_args, cwd=dest) + elif self.get_current_branch(dest) != branch_name: + # Then a specific branch was requested, and that branch + # is not yet checked out. + track_branch = 'origin/{}'.format(branch_name) + cmd_args = [ + 'checkout', '-b', branch_name, '--track', track_branch, + ] + self.run_command(cmd_args, cwd=dest) + + #: repo may contain submodules + self.update_submodules(dest) + + def switch(self, dest, url, rev_options): + # type: (str, HiddenText, RevOptions) -> None + self.run_command( + make_command('config', 'remote.origin.url', url), + cwd=dest, + ) + cmd_args = make_command('checkout', '-q', rev_options.to_args()) + self.run_command(cmd_args, cwd=dest) + + self.update_submodules(dest) + + def update(self, dest, url, rev_options): + # type: (str, HiddenText, RevOptions) -> None + # First fetch changes from the default remote + if self.get_git_version() >= parse_version('1.9.0'): + # fetch tags in addition to everything else + self.run_command(['fetch', '-q', '--tags'], cwd=dest) + else: + self.run_command(['fetch', '-q'], cwd=dest) + # Then reset to wanted revision (maybe even origin/master) + rev_options = self.resolve_revision(dest, url, rev_options) + cmd_args = make_command('reset', '--hard', '-q', rev_options.to_args()) + self.run_command(cmd_args, cwd=dest) + #: update submodules + self.update_submodules(dest) + + @classmethod + def get_remote_url(cls, location): + """ + Return URL of the first remote encountered. + + Raises RemoteNotFoundError if the repository does not have a remote + url configured. + """ + # We need to pass 1 for extra_ok_returncodes since the command + # exits with return code 1 if there are no matching lines. + stdout = cls.run_command( + ['config', '--get-regexp', r'remote\..*\.url'], + extra_ok_returncodes=(1, ), show_stdout=False, cwd=location, + ) + remotes = stdout.splitlines() + try: + found_remote = remotes[0] + except IndexError: + raise RemoteNotFoundError + + for remote in remotes: + if remote.startswith('remote.origin.url '): + found_remote = remote + break + url = found_remote.split(' ')[1] + return url.strip() + + @classmethod + def get_revision(cls, location, rev=None): + if rev is None: + rev = 'HEAD' + current_rev = cls.run_command( + ['rev-parse', rev], show_stdout=False, cwd=location, + ) + return current_rev.strip() + + @classmethod + def get_subdirectory(cls, location): + """ + Return the path to setup.py, relative to the repo root. + Return None if setup.py is in the repo root. + """ + # find the repo root + git_dir = cls.run_command( + ['rev-parse', '--git-dir'], + show_stdout=False, cwd=location).strip() + if not os.path.isabs(git_dir): + git_dir = os.path.join(location, git_dir) + repo_root = os.path.abspath(os.path.join(git_dir, '..')) + return find_path_to_setup_from_repo_root(location, repo_root) + + @classmethod + def get_url_rev_and_auth(cls, url): + # type: (str) -> Tuple[str, Optional[str], AuthInfo] + """ + Prefixes stub URLs like 'user@hostname:user/repo.git' with 'ssh://'. + That's required because although they use SSH they sometimes don't + work with a ssh:// scheme (e.g. GitHub). But we need a scheme for + parsing. Hence we remove it again afterwards and return it as a stub. + """ + # Works around an apparent Git bug + # (see https://article.gmane.org/gmane.comp.version-control.git/146500) + scheme, netloc, path, query, fragment = urlsplit(url) + if scheme.endswith('file'): + initial_slashes = path[:-len(path.lstrip('/'))] + newpath = ( + initial_slashes + + urllib_request.url2pathname(path) + .replace('\\', '/').lstrip('/') + ) + url = urlunsplit((scheme, netloc, newpath, query, fragment)) + after_plus = scheme.find('+') + 1 + url = scheme[:after_plus] + urlunsplit( + (scheme[after_plus:], netloc, newpath, query, fragment), + ) + + if '://' not in url: + assert 'file:' not in url + url = url.replace('git+', 'git+ssh://') + url, rev, user_pass = super(Git, cls).get_url_rev_and_auth(url) + url = url.replace('ssh://', '') + else: + url, rev, user_pass = super(Git, cls).get_url_rev_and_auth(url) + + return url, rev, user_pass + + @classmethod + def update_submodules(cls, location): + if not os.path.exists(os.path.join(location, '.gitmodules')): + return + cls.run_command( + ['submodule', 'update', '--init', '--recursive', '-q'], + cwd=location, + ) + + @classmethod + def controls_location(cls, location): + if super(Git, cls).controls_location(location): + return True + try: + r = cls.run_command(['rev-parse'], + cwd=location, + show_stdout=False, + on_returncode='ignore', + log_failed_cmd=False) + return not r + except BadCommand: + logger.debug("could not determine if %s is under git control " + "because git is not available", location) + return False + + +vcs.register(Git) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/vcs/git.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/vcs/git.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dded2ee7b1f92f0b4630de016d4fdcd2d5be5b70 GIT binary patch literal 12814 zcmdT~O>^AFc5TdzNDe~!L&ep3cKBv0pRpY#^PpWucbr)1)L3J;v z#s$?~REH!?pDpdD@a{EUE4l z)wrUZL@7O~w%<~Xx1?}YHLfaMQrp**ep?-4$(EHqp|)!(JSo-dDx6i{DAjmJg{PFh zpjwU!PqXDvsV^Egl)k98Zz_F*y&bIdX6+2b5m7WXh(qPGxCC1!jr+Owqi!$F@(p|E z1n%^L%xGI3M>W$g`r72SVG<4Zg7ALY?FLC$E1{ZC;}S-u7YF-(FUULj1R6R~sQrEx z+hOd|4R*BOEC$LnX3+XrcY6<_OgHm1+qa!L*>~)+%Vu z&*I|gZkp?jH2)~=C*fL_VfrW0{<+RflqUDnB+t?~UqVwWN8kmvG{r^m05Th;uH*<9;tLmV#ft9)+P!9_zh))ctIcY0eIw z-nHY6IgRR9Uj{3!yDJ~vTKVw#*FU;-aJ9+r<}Y7+{|@YfAC%+AQQIZ;3L}xtf4S$qeOb4aaUKZ^JxnA83vei}^ zhghW5c5gL&vEBZIAGO}Swe{}%`}@23cAn=Sy#KOu3;){5>f_a3)LV%XlLv9U^4jHn{Yk#&9;8Y8N>m-)sw$ioLzqsX(Xi}YKginVHX5z&m71I% z^^MCZ9|L{k$83w;y%NbmU7nTHL0KJC)T;`O(bOo2P4+_*j8j?7LBTK1704)4O$BX?N3ikUWDk};3SxkjfVL6HjB-B;eE@L~ zdu+~6;lk(Ob0dPDPs`^wiU^I4TcSjGjWmP+a6pVwem;dO7pZu&JSj4M9<=>5^S81f z0idAIabU;-UW>Uz-EKb*wqh&IW=A)7(tiFk+%)`dRa$haPQ{rkS1M)aVo8*hG9Joz z7Zph2z$v5*G=buVWy0*C;~YSk@UOUv=(FEv73*cImm%&$jIXE#bWDIeClm_dnA(O^ zF%GyiMtBLwl}lM;tSAA>n>8BShM~WM>AAbsCAngDMMWfFI_XQ_ zoA5cCH44FiysAmJ_~(I0WQm)1wA<`w85ZBQc5~BBGj{_p?M5w^IO;|wS|_cY|H17R{HTvF6?~s~sJLW>u(yblVWP@ai1las-#v4>PiIQ|7;KBx!f;#v5mQ-QR$E8n1Na|A|oC4IIq1CF?OJkz_%chI^9*b1f>>OHGtf&J4G-mtRLgCL_l zQ7Z2P46%A6I-rwKFvt_IqWt?wFKF(_I~fU#v`g5#AdmNZ=qEFfXXN1jei&uPq$}P% z%;p7tt!9*Gote@Z=N$B7&Jo@~tr&vMzo9~@ie>;{+E4@WBG$DKZ%#mCh%rEQpvzu! z1UAqOK+c2bpO78wpCduAp5_^N$Cx@8S5K0+RRyZCGpVv~6f}rx0=EP2!pHLGH_$*w zJ$;2H=-IgX$%{Mc36#sy5Og>IL7q5LtqN}e_zA+{Js1iF+^MSUpIFYTs)Y!VE$59I7r^`nE<0*Ll?sOs{K;4nr2ZuN>;x<5a^d%_-2EK4Uxgfmb~A^SW5%w@A**Uy*p_8 zJc#?+2F0|$&%HB0z$UnWG;vzjb1u5_a-W>0dg2{`m zyTjMFgxQchqI_I7dMhgnp4iS|Z=7j6g}0sE)5f)I*L+MZckhQl7kO6d>ARMw#3B|g%<@e)Fs9#)k~Xbd!XqLG=2AE0F({Z-p*t;&?8$&x(Ye_WjF9)y+T;7{ zJ~`Y*jh<5U96SelzH6A!dM7x9?f2mB2L?F45cEz z46+21wX~~_29K&~4J(ykR#I$7!#xQPypiS7p?k}`hz-+N0qhb?*|#5)X-aenK%{B{M20?Si%X2VXal>WwCifSE; z7Tv<=p&%&;1V}OQ4HOAsm0&1<4X{;EW6~QT((EBOaNFTCfS>cyNuoC126;kohX@`l zT97aV0HQ?_Ehz6ysO%pEtHG=BPI(BEHFLtE@Fu(;jZ=c07ziX5eoj7wGS$a%Ud%Z! z?2D%d8U;F5=4?o^0I(L~!RGNqOa)gktZ~x%|KW-A0_=Fz$>NFJEU>g{!!T00kGvi= z;+nYz#Y^$mV;*DxOHWW1Oc`)>At93b8&L+D#>$pt{Z>{G7dCfl464OfBlBHk=e?(F ztKbqLVePSCSp{Wik>fdg5R`y6pbeQooygy7u+z_Z`Iw!Ub?f&+q?Uct-|D7eKh{Rl zAC~3|qqxfM#3cbj0Kjl6qtEJwBaD-&A9E6lxG9do2Y~-GDwb9Nr7j}bR4vUpXPjvu zQyG}GfF#sx34hB%E9hPLD=0-nw!s1eM*KjF;n|_Qg(ZOBqt!ZbXr^Q&sM7G*P#0kX zqpoZkSdi5q3T;DtNi$7aQCoH#ESs!b&8QRIN2$Hjby+sxvgK)A!egb;0Kcavc*$5nD3OV<8>mSx{ zc^*oIj09(4$l(7XKOrk{qdG6{bb>6j9N>2_%6p#|5h?9g=)?a9xmx%bgWo8k@A=Z@ z(gF-@k&-2*5sBzz#Gw8f1uI!=O%Ng_2r+;ie=Er+wpJwh%4#3ji=Gq6=vEMApGTBk zmMHtVMA?-=SiQH*eh;2sF8m4-zJPbAPo@d=82srAt?=`NOdZ0XHp(!H zVn%3E;>ErLJT7ccDR-1`w7x;K)Wsd|5ia7O9x?Z12{f_S@?gfZ66hYGy38C2;Mv5v z_$m8dBMe!>4A4w|xb(9{Nj4o9ex1aeEpz9rxbHJZeZPoiH9024cN(tbq%(u)bVefA z3FoZMJ<&lA>D3)n06(FnI&<_W+@7!|G4L)#EpQ}U;Y3JjN{mL~TtJ_wm_(Zm$sr4Y zfJ0u94T4d6&$}K3e1rGAjHmg%Lhhoenke$7C~`(awGyo07d)wkq+WK&;bJr&MK4? zEt`^dH%wOyZL~feW!5dS z+Z5k3=ye5<8W14LSCA$fse?GAdR?*x-%V^BBjZLBsu2P}yOc@Iz`8?N^PDA$dgJH}5RjJt*=Je&qc-=<^gE z5s8Wdsb{iV2&uzc6p1428A8Kojw<_miG_q5z$k612klcX^1p~9z|N_1k|Uynv0dB78@Hj4%!)4 z**gq(@I5G-e_<-&H+VGSIm`%8hf9R+J4A2rde{@HNJ$mnk1vPTPpSjlvO{n@17Vj8 zNtXUkqh2A1n^G<2t7Jcfq8OUXr%2#Ld+>H9?{B$qsRoJF9qlgnk&L<1Nlh-XHfzYP z_EMgpShjhqWt@$;y}G(QvYp4BAYV4HvKM`%hmlUw%>W}^902O1{kEjK_FcAYZm!ek z?z<-K>O5keI!v*ZcrjcL6`_R?) zL85l}Bw{i`!n(T-VxZZVo(vd(^m)(@VAMeiWC4kz5Xo{R!7{re$=l4Hb74lG2%X|d zs91YYR%Ni1>X|s_8{*AP84Xwz$&InwZ8>*>MY|z*Dg{|KA)ofkyqg$QV-j3qQ@AzR zd-m?5#cmzaabd3z`-yTm3q9g!3(i>%lZm@V(|be+N=py{!is~Y7E*wl{baPC%~YTF z8DB>iX8JvydFNT>Rw(@|`ZK}gV>SE$N3uk3Y=-PA`$-%jD=o!D=h!D3VHakV?aQaM zvY_3?maZIVijpXgg4j1PHZ8EHK$AyQ$XUxQMGSr~?i=e5$zP~f0#M&c5t@{Zn)@% zy;s0S!7dEE-yj>pB&`ipF)wB1$9e0$$mG`fh?}wrwIN$ME>ScwwH=DW5|bsIT9KVa zE;r4N&G+x%{vHbWBA8_XrvPp1FfNi-Z0^4=yaj8FEo95~a0S)Fk`ERh+(Ufo`?}XZXdPF|d-4P+=LR%W}kfn9bkG>FjYrho$B|^X1 z4GmQVp-XHN@;J?)GbG;S{KGY{591>7k8~@<&gg^ZGKUDuHgsUf671rMJn&M+1gM(gw&WG>@isxrlQhN>OKn~vUWgE0#*0KJU$V5%3-QjQrFmTG zk*Oa8^ipZ5n1-iktboUGa0#W-Y^8d-Ix{ci2#Cfci$Ul_*uaMJ_#Opk5jLjsn^pe3h*%Gkjn;JV&x>f#t9P4Rnr;E-Ev z>fOjRZPJ-`no}cQe~|44pU}(FrZ&dzgAFG;e4*_(I5}cZpHSPs?`ipd4{P8}@QvM8aoM8_@<>00F%%CXX*(??+HhgV<$iJw?l_*n&$5=B0Rh#LP(ryTsp b^&J1={}seVEH9LSV&z% None + """Export the Hg repository at the url to the destination location""" + with TempDirectory(kind="export") as temp_dir: + self.unpack(temp_dir.path, url=url) + + self.run_command( + ['archive', location], show_stdout=False, cwd=temp_dir.path + ) + + def fetch_new(self, dest, url, rev_options): + # type: (str, HiddenText, RevOptions) -> None + rev_display = rev_options.to_display() + logger.info( + 'Cloning hg %s%s to %s', + url, + rev_display, + display_path(dest), + ) + self.run_command(make_command('clone', '--noupdate', '-q', url, dest)) + self.run_command( + make_command('update', '-q', rev_options.to_args()), + cwd=dest, + ) + + def switch(self, dest, url, rev_options): + # type: (str, HiddenText, RevOptions) -> None + repo_config = os.path.join(dest, self.dirname, 'hgrc') + config = configparser.RawConfigParser() + try: + config.read(repo_config) + config.set('paths', 'default', url.secret) + with open(repo_config, 'w') as config_file: + config.write(config_file) + except (OSError, configparser.NoSectionError) as exc: + logger.warning( + 'Could not switch Mercurial repository to %s: %s', url, exc, + ) + else: + cmd_args = make_command('update', '-q', rev_options.to_args()) + self.run_command(cmd_args, cwd=dest) + + def update(self, dest, url, rev_options): + # type: (str, HiddenText, RevOptions) -> None + self.run_command(['pull', '-q'], cwd=dest) + cmd_args = make_command('update', '-q', rev_options.to_args()) + self.run_command(cmd_args, cwd=dest) + + @classmethod + def get_remote_url(cls, location): + url = cls.run_command( + ['showconfig', 'paths.default'], + show_stdout=False, cwd=location).strip() + if cls._is_local_repository(url): + url = path_to_url(url) + return url.strip() + + @classmethod + def get_revision(cls, location): + """ + Return the repository-local changeset revision number, as an integer. + """ + current_revision = cls.run_command( + ['parents', '--template={rev}'], + show_stdout=False, cwd=location).strip() + return current_revision + + @classmethod + def get_requirement_revision(cls, location): + """ + Return the changeset identification hash, as a 40-character + hexadecimal string + """ + current_rev_hash = cls.run_command( + ['parents', '--template={node}'], + show_stdout=False, cwd=location).strip() + return current_rev_hash + + @classmethod + def is_commit_id_equal(cls, dest, name): + """Always assume the versions don't match""" + return False + + @classmethod + def get_subdirectory(cls, location): + """ + Return the path to setup.py, relative to the repo root. + Return None if setup.py is in the repo root. + """ + # find the repo root + repo_root = cls.run_command( + ['root'], show_stdout=False, cwd=location).strip() + if not os.path.isabs(repo_root): + repo_root = os.path.abspath(os.path.join(location, repo_root)) + return find_path_to_setup_from_repo_root(location, repo_root) + + @classmethod + def controls_location(cls, location): + if super(Mercurial, cls).controls_location(location): + return True + try: + cls.run_command( + ['identify'], + cwd=location, + show_stdout=False, + on_returncode='raise', + log_failed_cmd=False) + return True + except (BadCommand, InstallationError): + return False + + +vcs.register(Mercurial) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/vcs/mercurial 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/vcs/mercurial 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9080733e031f7235098f7d6af8f9758601ff611a GIT binary patch literal 6747 zcmc&&U2`186}_`7t-dW;wq*kbCKL{;0!gMIm8w(#gY94f2s1L+Y^pLfp6T5kc|O+D zy^@v4c~Rc-z@Nx#{zG2#o_~;^kUx-fZtt!XoK&SMR7ujd`fGZ7`kZ_2z1{xj%HrSt z`oV8g8UM8L|JE%L`%)m1;V+Ovqzt4RNWgYWik5U+I)-{%x^1nurI?X&R=Tr(-i#C- zDd(g+C*{0!=Y8+26bn)=N_Ww>J5nr3xh&mf-=33VMam1(z2MvPQmjh3CfzmPUXbFV zlZ$MY$lIw zU5uQG^Kw`>Zr6`2V#|I$%w0tDv&y=pC=!>~)!nA4 zo73mB+zyN6C>|zmaN1iYPfVQp6@2dsmU&>x;hnrOsjHhK-@T6RFTcD0U3~lA-P@nX z(KoxhpY49?$Cfb0Wn)*zqo&v-{O$sZZ%t#dliPLWn!0d5L02!YGTj3wTjNHUs$-bv639%gg$^&=E}n>=Ux5sJIdXrZASnDAadB!6vAdkGWY2}=lF zt>c-oF0a%o!=g^Lg0B#H0&8#t%jjateLUv~NYbQ({J=O`mmSoHv2|HJ^7fG)X1kl@ zM8t=6g;6z3(kHqqZBZXEf z1RawwHmkZ!D)?c{z!+BTP{2Cck~x^1yDxF7v7%4*KB@d&3g+8#Y?Q zh$S7jwyJtG%wQ}^)~%-=F71h~VS+BDY7R*p%e2lZ>VDre3RPb9>WD8My~2X8uOz_} zGzHIvSJ}%+vH-wDotT^*ZX; zJmwU7(p@qCJ1VemSTjr+xQuNW0JVh_n2~)TD)M|*j=qrNS>gyT(D$+dnOFP){{B3l z39uWC1M`!Xe1BP;$7$}#ZALk|J^*N+}nJ2C^);_}PVYsr&EY5pw1^EoWABKsF8 z9wgM9u35b!kKoq997qSbv^M6_^LgFyMLC9>LH!J`_?Ekh;-KH8YPPgzt8izgmy8Mr zf{Ps59UewKDzdPuU1$$;9A!9lg=Zy6DftW1GQ=}u9(wZ8v8%VKZS*qhB+z~hEhfVu z0aa3(h+n7yN|YSJog)&tuaSt(ZcLJ?bito1aji)kRJl?;G?l)@VUs(fYksw-p@~Ka zyY(KTj7hW-y}_^H_Z}t4ENFevPf>WaV+i5HB;CchO3M3c zOsA*&D7f)@lJ3K$Kldza^h4CdhXpfkD~@@ z?$T6X>re*_At<7j=*-DEQvK<ogwQ(xVI0K~nV%6bia{kTWd_t5NybH1C9o z4U;Nl^a*#nJzY(O2niPi%v!qhtu2N{$ga!>zsDla&)`Q4PVtLAM$;S1Z4M9_#}$yI za5;vsx`p#aija7u{B9rt<4|kXP~H9sy6lOu57+EHoLY7TtDZo{mu-g04?AfnKW zFrqA-Ve}0y#uXVIobRzPfPp~r5+iqUp2gxF})-j99Z zsoo=2KsJCt(#yQm%>sUvkPQGwmDA6c7_ZpZ(MA8iF3Y;pwiM%?C3G#SAUB|1T-C!xlZsJ zVyZX22VywD*HIIBf(lFoTmU-&sZTB7;G63NeDCO{(gtA@E((-302;JmI*Cq{AO;i3 znSj$DR@aa%plfcDD)a>DBWCP9(r`<2NDV~C0(hj+fI@_H0?~5?S3#eaLclaCXp$Uc zxqvZbhjA}KM4QD3WA$D_XV}ruG!bX$wF!a`UcUJVf|0f|;XyMpXZ#gUA);F7&0;il zTIY&m^er~@Cw#^c@iiQ48*%UgKKz{v=7USYCIh*Mcc(wX)!61GtfPR$F_kTjH7}3j zvd%^Yn$fTMZA`p0dsV`7qS}Z}2T*0}=vV!H8wLh-7Ez+~G9%)FMjx^WQE1wd77*a^ z#5)}Ml*MN(K4)>C1&`ts46U6*rlPER9b2(9d5=P;)oHKJEG#apE?ivbtS+oBt}d<4 zuC8pVD$umzxHkfad3tF1{Ek-}%R literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/vcs/mercurial.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/vcs/mercurial.py new file mode 100644 index 0000000..d9b58cf --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/vcs/mercurial.py @@ -0,0 +1,155 @@ +# The following comment should be removed at some point in the future. +# mypy: disallow-untyped-defs=False + +from __future__ import absolute_import + +import logging +import os + +from pip._vendor.six.moves import configparser + +from pip._internal.exceptions import BadCommand, InstallationError +from pip._internal.utils.misc import display_path +from pip._internal.utils.subprocess import make_command +from pip._internal.utils.temp_dir import TempDirectory +from pip._internal.utils.typing import MYPY_CHECK_RUNNING +from pip._internal.utils.urls import path_to_url +from pip._internal.vcs.versioncontrol import ( + VersionControl, + find_path_to_setup_from_repo_root, + vcs, +) + +if MYPY_CHECK_RUNNING: + from pip._internal.utils.misc import HiddenText + from pip._internal.vcs.versioncontrol import RevOptions + + +logger = logging.getLogger(__name__) + + +class Mercurial(VersionControl): + name = 'hg' + dirname = '.hg' + repo_name = 'clone' + schemes = ( + 'hg', 'hg+file', 'hg+http', 'hg+https', 'hg+ssh', 'hg+static-http', + ) + + @staticmethod + def get_base_rev_args(rev): + return [rev] + + def export(self, location, url): + # type: (str, HiddenText) -> None + """Export the Hg repository at the url to the destination location""" + with TempDirectory(kind="export") as temp_dir: + self.unpack(temp_dir.path, url=url) + + self.run_command( + ['archive', location], show_stdout=False, cwd=temp_dir.path + ) + + def fetch_new(self, dest, url, rev_options): + # type: (str, HiddenText, RevOptions) -> None + rev_display = rev_options.to_display() + logger.info( + 'Cloning hg %s%s to %s', + url, + rev_display, + display_path(dest), + ) + self.run_command(make_command('clone', '--noupdate', '-q', url, dest)) + self.run_command( + make_command('update', '-q', rev_options.to_args()), + cwd=dest, + ) + + def switch(self, dest, url, rev_options): + # type: (str, HiddenText, RevOptions) -> None + repo_config = os.path.join(dest, self.dirname, 'hgrc') + config = configparser.RawConfigParser() + try: + config.read(repo_config) + config.set('paths', 'default', url.secret) + with open(repo_config, 'w') as config_file: + config.write(config_file) + except (OSError, configparser.NoSectionError) as exc: + logger.warning( + 'Could not switch Mercurial repository to %s: %s', url, exc, + ) + else: + cmd_args = make_command('update', '-q', rev_options.to_args()) + self.run_command(cmd_args, cwd=dest) + + def update(self, dest, url, rev_options): + # type: (str, HiddenText, RevOptions) -> None + self.run_command(['pull', '-q'], cwd=dest) + cmd_args = make_command('update', '-q', rev_options.to_args()) + self.run_command(cmd_args, cwd=dest) + + @classmethod + def get_remote_url(cls, location): + url = cls.run_command( + ['showconfig', 'paths.default'], + show_stdout=False, cwd=location).strip() + if cls._is_local_repository(url): + url = path_to_url(url) + return url.strip() + + @classmethod + def get_revision(cls, location): + """ + Return the repository-local changeset revision number, as an integer. + """ + current_revision = cls.run_command( + ['parents', '--template={rev}'], + show_stdout=False, cwd=location).strip() + return current_revision + + @classmethod + def get_requirement_revision(cls, location): + """ + Return the changeset identification hash, as a 40-character + hexadecimal string + """ + current_rev_hash = cls.run_command( + ['parents', '--template={node}'], + show_stdout=False, cwd=location).strip() + return current_rev_hash + + @classmethod + def is_commit_id_equal(cls, dest, name): + """Always assume the versions don't match""" + return False + + @classmethod + def get_subdirectory(cls, location): + """ + Return the path to setup.py, relative to the repo root. + Return None if setup.py is in the repo root. + """ + # find the repo root + repo_root = cls.run_command( + ['root'], show_stdout=False, cwd=location).strip() + if not os.path.isabs(repo_root): + repo_root = os.path.abspath(os.path.join(location, repo_root)) + return find_path_to_setup_from_repo_root(location, repo_root) + + @classmethod + def controls_location(cls, location): + if super(Mercurial, cls).controls_location(location): + return True + try: + cls.run_command( + ['identify'], + cwd=location, + show_stdout=False, + on_returncode='raise', + log_failed_cmd=False) + return True + except (BadCommand, InstallationError): + return False + + +vcs.register(Mercurial) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/vcs/mercurial.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/vcs/mercurial.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e0884bcd8fe77babf17d58447a178051a0551173 GIT binary patch literal 6747 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 AzyJUM literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/vcs/subversion 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/vcs/subversion 2.py new file mode 100644 index 0000000..6c76d1a --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/vcs/subversion 2.py @@ -0,0 +1,333 @@ +# The following comment should be removed at some point in the future. +# mypy: disallow-untyped-defs=False + +from __future__ import absolute_import + +import logging +import os +import re + +from pip._internal.utils.logging import indent_log +from pip._internal.utils.misc import ( + display_path, + is_console_interactive, + rmtree, + split_auth_from_netloc, +) +from pip._internal.utils.subprocess import make_command +from pip._internal.utils.typing import MYPY_CHECK_RUNNING +from pip._internal.vcs.versioncontrol import VersionControl, vcs + +_svn_xml_url_re = re.compile('url="([^"]+)"') +_svn_rev_re = re.compile(r'committed-rev="(\d+)"') +_svn_info_xml_rev_re = re.compile(r'\s*revision="(\d+)"') +_svn_info_xml_url_re = re.compile(r'(.*)') + + +if MYPY_CHECK_RUNNING: + from typing import Optional, Tuple + from pip._internal.utils.subprocess import CommandArgs + from pip._internal.utils.misc import HiddenText + from pip._internal.vcs.versioncontrol import AuthInfo, RevOptions + + +logger = logging.getLogger(__name__) + + +class Subversion(VersionControl): + name = 'svn' + dirname = '.svn' + repo_name = 'checkout' + schemes = ('svn', 'svn+ssh', 'svn+http', 'svn+https', 'svn+svn') + + @classmethod + def should_add_vcs_url_prefix(cls, remote_url): + return True + + @staticmethod + def get_base_rev_args(rev): + return ['-r', rev] + + @classmethod + def get_revision(cls, location): + """ + Return the maximum revision for all files under a given location + """ + # Note: taken from setuptools.command.egg_info + revision = 0 + + for base, dirs, files in os.walk(location): + if cls.dirname not in dirs: + dirs[:] = [] + continue # no sense walking uncontrolled subdirs + dirs.remove(cls.dirname) + entries_fn = os.path.join(base, cls.dirname, 'entries') + if not os.path.exists(entries_fn): + # FIXME: should we warn? + continue + + dirurl, localrev = cls._get_svn_url_rev(base) + + if base == location: + base = dirurl + '/' # save the root url + elif not dirurl or not dirurl.startswith(base): + dirs[:] = [] + continue # not part of the same svn tree, skip it + revision = max(revision, localrev) + return revision + + @classmethod + def get_netloc_and_auth(cls, netloc, scheme): + """ + This override allows the auth information to be passed to svn via the + --username and --password options instead of via the URL. + """ + if scheme == 'ssh': + # The --username and --password options can't be used for + # svn+ssh URLs, so keep the auth information in the URL. + return super(Subversion, cls).get_netloc_and_auth(netloc, scheme) + + return split_auth_from_netloc(netloc) + + @classmethod + def get_url_rev_and_auth(cls, url): + # type: (str) -> Tuple[str, Optional[str], AuthInfo] + # hotfix the URL scheme after removing svn+ from svn+ssh:// readd it + url, rev, user_pass = super(Subversion, cls).get_url_rev_and_auth(url) + if url.startswith('ssh://'): + url = 'svn+' + url + return url, rev, user_pass + + @staticmethod + def make_rev_args(username, password): + # type: (Optional[str], Optional[HiddenText]) -> CommandArgs + extra_args = [] # type: CommandArgs + if username: + extra_args += ['--username', username] + if password: + extra_args += ['--password', password] + + return extra_args + + @classmethod + def get_remote_url(cls, location): + # In cases where the source is in a subdirectory, not alongside + # setup.py we have to look up in the location until we find a real + # setup.py + orig_location = location + while not os.path.exists(os.path.join(location, 'setup.py')): + last_location = location + location = os.path.dirname(location) + if location == last_location: + # We've traversed up to the root of the filesystem without + # finding setup.py + logger.warning( + "Could not find setup.py for directory %s (tried all " + "parent directories)", + orig_location, + ) + return None + + return cls._get_svn_url_rev(location)[0] + + @classmethod + def _get_svn_url_rev(cls, location): + from pip._internal.exceptions import InstallationError + + entries_path = os.path.join(location, cls.dirname, 'entries') + if os.path.exists(entries_path): + with open(entries_path) as f: + data = f.read() + else: # subversion >= 1.7 does not have the 'entries' file + data = '' + + if (data.startswith('8') or + data.startswith('9') or + data.startswith('10')): + data = list(map(str.splitlines, data.split('\n\x0c\n'))) + del data[0][0] # get rid of the '8' + url = data[0][3] + revs = [int(d[9]) for d in data if len(d) > 9 and d[9]] + [0] + elif data.startswith('= 1.7 + # Note that using get_remote_call_options is not necessary here + # because `svn info` is being run against a local directory. + # We don't need to worry about making sure interactive mode + # is being used to prompt for passwords, because passwords + # are only potentially needed for remote server requests. + xml = cls.run_command( + ['info', '--xml', location], + show_stdout=False, + ) + url = _svn_info_xml_url_re.search(xml).group(1) + revs = [ + int(m.group(1)) for m in _svn_info_xml_rev_re.finditer(xml) + ] + except InstallationError: + url, revs = None, [] + + if revs: + rev = max(revs) + else: + rev = 0 + + return url, rev + + @classmethod + def is_commit_id_equal(cls, dest, name): + """Always assume the versions don't match""" + return False + + def __init__(self, use_interactive=None): + # type: (bool) -> None + if use_interactive is None: + use_interactive = is_console_interactive() + self.use_interactive = use_interactive + + # This member is used to cache the fetched version of the current + # ``svn`` client. + # Special value definitions: + # None: Not evaluated yet. + # Empty tuple: Could not parse version. + self._vcs_version = None # type: Optional[Tuple[int, ...]] + + super(Subversion, self).__init__() + + def call_vcs_version(self): + # type: () -> Tuple[int, ...] + """Query the version of the currently installed Subversion client. + + :return: A tuple containing the parts of the version information or + ``()`` if the version returned from ``svn`` could not be parsed. + :raises: BadCommand: If ``svn`` is not installed. + """ + # Example versions: + # svn, version 1.10.3 (r1842928) + # compiled Feb 25 2019, 14:20:39 on x86_64-apple-darwin17.0.0 + # svn, version 1.7.14 (r1542130) + # compiled Mar 28 2018, 08:49:13 on x86_64-pc-linux-gnu + version_prefix = 'svn, version ' + version = self.run_command(['--version'], show_stdout=False) + if not version.startswith(version_prefix): + return () + + version = version[len(version_prefix):].split()[0] + version_list = version.split('.') + try: + parsed_version = tuple(map(int, version_list)) + except ValueError: + return () + + return parsed_version + + def get_vcs_version(self): + # type: () -> Tuple[int, ...] + """Return the version of the currently installed Subversion client. + + If the version of the Subversion client has already been queried, + a cached value will be used. + + :return: A tuple containing the parts of the version information or + ``()`` if the version returned from ``svn`` could not be parsed. + :raises: BadCommand: If ``svn`` is not installed. + """ + if self._vcs_version is not None: + # Use cached version, if available. + # If parsing the version failed previously (empty tuple), + # do not attempt to parse it again. + return self._vcs_version + + vcs_version = self.call_vcs_version() + self._vcs_version = vcs_version + return vcs_version + + def get_remote_call_options(self): + # type: () -> CommandArgs + """Return options to be used on calls to Subversion that contact the server. + + These options are applicable for the following ``svn`` subcommands used + in this class. + + - checkout + - export + - switch + - update + + :return: A list of command line arguments to pass to ``svn``. + """ + if not self.use_interactive: + # --non-interactive switch is available since Subversion 0.14.4. + # Subversion < 1.8 runs in interactive mode by default. + return ['--non-interactive'] + + svn_version = self.get_vcs_version() + # By default, Subversion >= 1.8 runs in non-interactive mode if + # stdin is not a TTY. Since that is how pip invokes SVN, in + # call_subprocess(), pip must pass --force-interactive to ensure + # the user can be prompted for a password, if required. + # SVN added the --force-interactive option in SVN 1.8. Since + # e.g. RHEL/CentOS 7, which is supported until 2024, ships with + # SVN 1.7, pip should continue to support SVN 1.7. Therefore, pip + # can't safely add the option if the SVN version is < 1.8 (or unknown). + if svn_version >= (1, 8): + return ['--force-interactive'] + + return [] + + def export(self, location, url): + # type: (str, HiddenText) -> None + """Export the svn repository at the url to the destination location""" + url, rev_options = self.get_url_rev_options(url) + + logger.info('Exporting svn repository %s to %s', url, location) + with indent_log(): + if os.path.exists(location): + # Subversion doesn't like to check out over an existing + # directory --force fixes this, but was only added in svn 1.5 + rmtree(location) + cmd_args = make_command( + 'export', self.get_remote_call_options(), + rev_options.to_args(), url, location, + ) + self.run_command(cmd_args, show_stdout=False) + + def fetch_new(self, dest, url, rev_options): + # type: (str, HiddenText, RevOptions) -> None + rev_display = rev_options.to_display() + logger.info( + 'Checking out %s%s to %s', + url, + rev_display, + display_path(dest), + ) + cmd_args = make_command( + 'checkout', '-q', self.get_remote_call_options(), + rev_options.to_args(), url, dest, + ) + self.run_command(cmd_args) + + def switch(self, dest, url, rev_options): + # type: (str, HiddenText, RevOptions) -> None + cmd_args = make_command( + 'switch', self.get_remote_call_options(), rev_options.to_args(), + url, dest, + ) + self.run_command(cmd_args) + + def update(self, dest, url, rev_options): + # type: (str, HiddenText, RevOptions) -> None + cmd_args = make_command( + 'update', self.get_remote_call_options(), rev_options.to_args(), + dest, + ) + self.run_command(cmd_args) + + +vcs.register(Subversion) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/vcs/subversion 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/vcs/subversion 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fce26fc83830b82601d9fdba461915759e0bccef GIT binary patch literal 10957 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 literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/vcs/subversion.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/vcs/subversion.py new file mode 100644 index 0000000..6c76d1a --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/vcs/subversion.py @@ -0,0 +1,333 @@ +# The following comment should be removed at some point in the future. +# mypy: disallow-untyped-defs=False + +from __future__ import absolute_import + +import logging +import os +import re + +from pip._internal.utils.logging import indent_log +from pip._internal.utils.misc import ( + display_path, + is_console_interactive, + rmtree, + split_auth_from_netloc, +) +from pip._internal.utils.subprocess import make_command +from pip._internal.utils.typing import MYPY_CHECK_RUNNING +from pip._internal.vcs.versioncontrol import VersionControl, vcs + +_svn_xml_url_re = re.compile('url="([^"]+)"') +_svn_rev_re = re.compile(r'committed-rev="(\d+)"') +_svn_info_xml_rev_re = re.compile(r'\s*revision="(\d+)"') +_svn_info_xml_url_re = re.compile(r'(.*)') + + +if MYPY_CHECK_RUNNING: + from typing import Optional, Tuple + from pip._internal.utils.subprocess import CommandArgs + from pip._internal.utils.misc import HiddenText + from pip._internal.vcs.versioncontrol import AuthInfo, RevOptions + + +logger = logging.getLogger(__name__) + + +class Subversion(VersionControl): + name = 'svn' + dirname = '.svn' + repo_name = 'checkout' + schemes = ('svn', 'svn+ssh', 'svn+http', 'svn+https', 'svn+svn') + + @classmethod + def should_add_vcs_url_prefix(cls, remote_url): + return True + + @staticmethod + def get_base_rev_args(rev): + return ['-r', rev] + + @classmethod + def get_revision(cls, location): + """ + Return the maximum revision for all files under a given location + """ + # Note: taken from setuptools.command.egg_info + revision = 0 + + for base, dirs, files in os.walk(location): + if cls.dirname not in dirs: + dirs[:] = [] + continue # no sense walking uncontrolled subdirs + dirs.remove(cls.dirname) + entries_fn = os.path.join(base, cls.dirname, 'entries') + if not os.path.exists(entries_fn): + # FIXME: should we warn? + continue + + dirurl, localrev = cls._get_svn_url_rev(base) + + if base == location: + base = dirurl + '/' # save the root url + elif not dirurl or not dirurl.startswith(base): + dirs[:] = [] + continue # not part of the same svn tree, skip it + revision = max(revision, localrev) + return revision + + @classmethod + def get_netloc_and_auth(cls, netloc, scheme): + """ + This override allows the auth information to be passed to svn via the + --username and --password options instead of via the URL. + """ + if scheme == 'ssh': + # The --username and --password options can't be used for + # svn+ssh URLs, so keep the auth information in the URL. + return super(Subversion, cls).get_netloc_and_auth(netloc, scheme) + + return split_auth_from_netloc(netloc) + + @classmethod + def get_url_rev_and_auth(cls, url): + # type: (str) -> Tuple[str, Optional[str], AuthInfo] + # hotfix the URL scheme after removing svn+ from svn+ssh:// readd it + url, rev, user_pass = super(Subversion, cls).get_url_rev_and_auth(url) + if url.startswith('ssh://'): + url = 'svn+' + url + return url, rev, user_pass + + @staticmethod + def make_rev_args(username, password): + # type: (Optional[str], Optional[HiddenText]) -> CommandArgs + extra_args = [] # type: CommandArgs + if username: + extra_args += ['--username', username] + if password: + extra_args += ['--password', password] + + return extra_args + + @classmethod + def get_remote_url(cls, location): + # In cases where the source is in a subdirectory, not alongside + # setup.py we have to look up in the location until we find a real + # setup.py + orig_location = location + while not os.path.exists(os.path.join(location, 'setup.py')): + last_location = location + location = os.path.dirname(location) + if location == last_location: + # We've traversed up to the root of the filesystem without + # finding setup.py + logger.warning( + "Could not find setup.py for directory %s (tried all " + "parent directories)", + orig_location, + ) + return None + + return cls._get_svn_url_rev(location)[0] + + @classmethod + def _get_svn_url_rev(cls, location): + from pip._internal.exceptions import InstallationError + + entries_path = os.path.join(location, cls.dirname, 'entries') + if os.path.exists(entries_path): + with open(entries_path) as f: + data = f.read() + else: # subversion >= 1.7 does not have the 'entries' file + data = '' + + if (data.startswith('8') or + data.startswith('9') or + data.startswith('10')): + data = list(map(str.splitlines, data.split('\n\x0c\n'))) + del data[0][0] # get rid of the '8' + url = data[0][3] + revs = [int(d[9]) for d in data if len(d) > 9 and d[9]] + [0] + elif data.startswith('= 1.7 + # Note that using get_remote_call_options is not necessary here + # because `svn info` is being run against a local directory. + # We don't need to worry about making sure interactive mode + # is being used to prompt for passwords, because passwords + # are only potentially needed for remote server requests. + xml = cls.run_command( + ['info', '--xml', location], + show_stdout=False, + ) + url = _svn_info_xml_url_re.search(xml).group(1) + revs = [ + int(m.group(1)) for m in _svn_info_xml_rev_re.finditer(xml) + ] + except InstallationError: + url, revs = None, [] + + if revs: + rev = max(revs) + else: + rev = 0 + + return url, rev + + @classmethod + def is_commit_id_equal(cls, dest, name): + """Always assume the versions don't match""" + return False + + def __init__(self, use_interactive=None): + # type: (bool) -> None + if use_interactive is None: + use_interactive = is_console_interactive() + self.use_interactive = use_interactive + + # This member is used to cache the fetched version of the current + # ``svn`` client. + # Special value definitions: + # None: Not evaluated yet. + # Empty tuple: Could not parse version. + self._vcs_version = None # type: Optional[Tuple[int, ...]] + + super(Subversion, self).__init__() + + def call_vcs_version(self): + # type: () -> Tuple[int, ...] + """Query the version of the currently installed Subversion client. + + :return: A tuple containing the parts of the version information or + ``()`` if the version returned from ``svn`` could not be parsed. + :raises: BadCommand: If ``svn`` is not installed. + """ + # Example versions: + # svn, version 1.10.3 (r1842928) + # compiled Feb 25 2019, 14:20:39 on x86_64-apple-darwin17.0.0 + # svn, version 1.7.14 (r1542130) + # compiled Mar 28 2018, 08:49:13 on x86_64-pc-linux-gnu + version_prefix = 'svn, version ' + version = self.run_command(['--version'], show_stdout=False) + if not version.startswith(version_prefix): + return () + + version = version[len(version_prefix):].split()[0] + version_list = version.split('.') + try: + parsed_version = tuple(map(int, version_list)) + except ValueError: + return () + + return parsed_version + + def get_vcs_version(self): + # type: () -> Tuple[int, ...] + """Return the version of the currently installed Subversion client. + + If the version of the Subversion client has already been queried, + a cached value will be used. + + :return: A tuple containing the parts of the version information or + ``()`` if the version returned from ``svn`` could not be parsed. + :raises: BadCommand: If ``svn`` is not installed. + """ + if self._vcs_version is not None: + # Use cached version, if available. + # If parsing the version failed previously (empty tuple), + # do not attempt to parse it again. + return self._vcs_version + + vcs_version = self.call_vcs_version() + self._vcs_version = vcs_version + return vcs_version + + def get_remote_call_options(self): + # type: () -> CommandArgs + """Return options to be used on calls to Subversion that contact the server. + + These options are applicable for the following ``svn`` subcommands used + in this class. + + - checkout + - export + - switch + - update + + :return: A list of command line arguments to pass to ``svn``. + """ + if not self.use_interactive: + # --non-interactive switch is available since Subversion 0.14.4. + # Subversion < 1.8 runs in interactive mode by default. + return ['--non-interactive'] + + svn_version = self.get_vcs_version() + # By default, Subversion >= 1.8 runs in non-interactive mode if + # stdin is not a TTY. Since that is how pip invokes SVN, in + # call_subprocess(), pip must pass --force-interactive to ensure + # the user can be prompted for a password, if required. + # SVN added the --force-interactive option in SVN 1.8. Since + # e.g. RHEL/CentOS 7, which is supported until 2024, ships with + # SVN 1.7, pip should continue to support SVN 1.7. Therefore, pip + # can't safely add the option if the SVN version is < 1.8 (or unknown). + if svn_version >= (1, 8): + return ['--force-interactive'] + + return [] + + def export(self, location, url): + # type: (str, HiddenText) -> None + """Export the svn repository at the url to the destination location""" + url, rev_options = self.get_url_rev_options(url) + + logger.info('Exporting svn repository %s to %s', url, location) + with indent_log(): + if os.path.exists(location): + # Subversion doesn't like to check out over an existing + # directory --force fixes this, but was only added in svn 1.5 + rmtree(location) + cmd_args = make_command( + 'export', self.get_remote_call_options(), + rev_options.to_args(), url, location, + ) + self.run_command(cmd_args, show_stdout=False) + + def fetch_new(self, dest, url, rev_options): + # type: (str, HiddenText, RevOptions) -> None + rev_display = rev_options.to_display() + logger.info( + 'Checking out %s%s to %s', + url, + rev_display, + display_path(dest), + ) + cmd_args = make_command( + 'checkout', '-q', self.get_remote_call_options(), + rev_options.to_args(), url, dest, + ) + self.run_command(cmd_args) + + def switch(self, dest, url, rev_options): + # type: (str, HiddenText, RevOptions) -> None + cmd_args = make_command( + 'switch', self.get_remote_call_options(), rev_options.to_args(), + url, dest, + ) + self.run_command(cmd_args) + + def update(self, dest, url, rev_options): + # type: (str, HiddenText, RevOptions) -> None + cmd_args = make_command( + 'update', self.get_remote_call_options(), rev_options.to_args(), + dest, + ) + self.run_command(cmd_args) + + +vcs.register(Subversion) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/vcs/subversion.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/vcs/subversion.pyc new file mode 100644 index 0000000000000000000000000000000000000000..07233402bde2f5652f4476364dcd802091474186 GIT binary patch literal 10957 zcmds7&vzTwb-n|T06~HRMVXXn$<|1=TF4Ga*-q+Ml^rRvlc-6Vcqm6QA{!cE2E>p9 z3^Z@RA3aigPUN0$(vx#~vPl1pZo28F%bqT}O4seCyKdTL7wz}mHv>Sj-P5j^Rul&B z*SvY}zVF`q-8(4%`|{$^-@gBOSMq;leBZn&V!DneLT$RCsv=?MhlXgu8i_%_{!IHF>?1*`Z>oQoD_Oh*4 zBt9jBhO`^DUX^%72B)QcS_Z4qUKJ;tlf5$%EXXsg?Ip>pHLb1{)kUqY7u6-Lo|Uj6 zX-jugm-w6vHl)2FgO{cKvVGdJuI9Y7&)fPbUH=7XU$FItuI3eKzaoQIrTwZnLy@o~ zdlw~i^%<8WSds9w^c)FJ%NHWgL_Td_mT*<}UX$=L2RV@CPIDCkk0|^m1TI+v7ypq- z;&B#sqQNLhvu)e6h@NN|gu|>8C%er#j;`YpL}nEG$DNU%^|N&jGM#QR#1xodn1!j| z&7y-atDq|#WN8@cDBKif9e{wys1`sY6ap#&RX8W@c?l~LR22f~s!F&(&=L`-*0i@) zR2Q|nSX7s^x>Qu_dT+g`E^F^{Q9Y&AQ$@9*)kaZWkzj+6`~nYM%^}%_`mAyQ)F(Kj zg*6FY(!#m~Yg#xf!MYaCNpMyR8{+LWU&glegw4Uw5Q>{9WE5n#A9nYXab~Khpz%#( z`i31W_p@wdYO|H;u!CWjN6HU1;r313!kIIHmarw)1Ge2w$DuttqO2R+b4tTO0<8f$ znrIchm;|M*Q5qfiS-5rJr(3-w4se=VyQ8h(@!swqeY5x0wMTEgb9{V|?PXc^?mLJ5 zYxuW2+`79pibkzyXfi*JTW`Pnd)sY~P5QCA1=wu?dDv7I-QB;UfZaVU$jFEA(q1_qK`Y96(1e?cR%qWd%v8}wpsONJDtwChLh>na zOO@l%_@E?DtMYU~Z+B$BB$^QCUr%V8QT4 zn6AXf+(Ugwt+es5?L{~L=Y`og9lBXRbO-)XG#C%u!rZyNBy|Bbw-?2samO(BsJpwc z-a{A0*{7YGOr%aDqn5!Xq)})xVq>dG2xSy~VlwK=p&#$-upml@{vdY*P!;$D_N(7u zVK0HZpqB`bB9obH1;q{z7@Dj2#X8jwlS#i!g ztEEb5tyFiGowM3@#_3W}#Yc64iUNp09SFHA#3~LDzz2eeeUt%XU?DUqu|>!3MsR59Kw;x%iTfyYN4_y(zzPo4J&1e`p3K&2jZLT^ zapCpdR*S^|1ysnk@8D?-e(@pLjpooXlW-g6Ug&Ld7@ZQJ8wfQbzAi`B|#b z!6TG^cpTQGa4dodK|4gzXy8!>;mIDocMWU$F+PTilS;k3QBrS3z2VCBNdEwZFCQaq z46KowJs1?6CCnF&9qsA+WD00Gi*A}WJ#^TmUKzH7^KR<{;X5@&g6X%lL*+WtL2JyJwhayB6zO@jK)RI#2dd>M^g%1d z7;CMLveZ|Xce29E$gh>G>(RpngN}-!t&(yD2I&kxQ?wGXD$PR_06041&vIuBy94~f zE7QS((E_BfL2#U*jw~0wbF88rs3l~}YQky)dk$YqM62aufVK0u22Y4N;W_mdxYZ5o z7Pl=cggYF8GnwymU8GFzFv;KnVSnH%v`_sa+(FpQlJwZUV%#PjUZB2m5b7KBl|VXD6I&`*caa93T^b}|e-n)RvbcvpB2C7q84I?t!a>7_(7-l_G!GuR>G1PvUuQ;y*3ad^Xuqc9IvkJ*-~k+qXN{wrCpRL&0v>D^2$piG)E7w8mVbGMT#jT7qzFnoFZY0l zkM9qG5XCxATYQo+VpWc8;PZY_ ztjPvAAi3i_2aXKzvz`&VVz%S%@U&W7z47-tbkKgA(sAO8Q#Kaj40VV+rDi#Xd4geZxY1>7(e+U+ydm|r=^rrQFWjWs90l+xr&R;nrod3Pys?5Ru(2e|=(2Z1O z=RPRGPLpyq7aS0RaR^GsY)CGAhL)^$$0>;&jC-DdgK?iGV%=^Wp?7m}5_w*SsY7Dr zx_iq7Ym6}g^3Xm`Zn&%SfhT4NmF?ukvt|S2B%RE~RL#SO&8rU|y3zAD*oR;#%$Z{h z!Z8f$PI#+^*eOEnX-IrM^&=CS>n>bXo{qlm-sw$lMgUL7JK5#*PEDQT3E!B=MsugF zR)N#+L5k{L)n0B+(P+u)@_xv+pYXDSOOt@{IHM-?^T*_Q zOXbOVlUnzpTiqO)Cq#^$ck=e>YEC2vyMhIEkr0_x?7v5w;VTkZt~lpln&(O{<63q$ z5O2;~y`drENA*UNG@!hyJ^M9D!P~UD!!O`mtrAoO)sEV%JW2ECfc8wLFBeGxzyB?^ zftIh(kS}S2+xOuzkSOzmVm#2MxCf*T?qP&%BQOh#2*gfC z{Xf*DZR;VyVsmdWLP;&U#XD&s^Yp(R;B8-(8CwcSiXij)#$I0L4;{m_Jy1R|n!*B^oZcKt^%(#&`h+IT60)Fo|oVN>x& zg_HqFLS(|RfC)GwCeL9sy9m6^%yVe8TW<0CX)@e4hev#q`a&a9*xmjMjpGsMY50}8 zKto3r&e!FV!Mk|r0g5(+Z-HQ#A>wzwi5XMQ(5KZJCPTbWn!JM0W&um);ib5|fM2+Z-xB;X!#IOatBvs0&PW#G70cdC{W)A^9dD3bpI z1&d@Rlk966yjoGl0>cYzqn+HOj06Re4*#I|ou+xc7?DfX`yrqqE=EP-~J%FA~1F zXuazg;(f#mRCzXL<-F`d4v@U( zTXpoE+?!T!jHh3~W(}hZDX*2zIE&6|c^N*vj^M1zJ#)+4?CqNv_Yei1yZ#~r92LxI z3MW(x!uxDa(FC{v2Sg0WuDw$uj2tn@hiK%%w~5MzZREkHZW}7WZN3fX0VCCb^DNHQ z<8n3pX+2ghtl>OPBmXhS%t?}qOi#@_WR=IIHd}p{*JT?|$~(fv#`rj{VyaY zNnbYfLKs`T`#Eg!yk6ph;Kh)N)W79Y8B8ocFy zjtX&#{iRa=_T1)7)Y990?nDD-WI5rzFUZn6dD(eSvHu$s8U2JnOlwZv0-LMmN5%9u z3STQGNDVnxq+=n$ual8=eE&CP^vBrzhtJEXR0^epP;txP|9 zEncqiLKf$}$IEwkxy(z*%MD)oypX*r1yEbAX3)doilW7%IHnq}rIU!k^zGyoti`;6 z3*SZQU#T&NzYC4!My;{bSZlo9n6Ec#=WA=VOSRLrMs1<_I)>-c?u`-EQ`%^nFUldHIz6 zG-CPmq)Z-Nw8uP_r@2^0;~s+uwY*?rKhjrS-k-2tS;7iC`MfmT1+5M9pBJIw1l bool + """ + Return true if the name looks like a URL. + """ + scheme = get_url_scheme(name) + if scheme is None: + return False + return scheme in ['http', 'https', 'file', 'ftp'] + vcs.all_schemes + + +def make_vcs_requirement_url(repo_url, rev, project_name, subdir=None): + # type: (str, str, str, Optional[str]) -> str + """ + Return the URL for a VCS requirement. + + Args: + repo_url: the remote VCS url, with any needed VCS prefix (e.g. "git+"). + project_name: the (unescaped) project name. + """ + egg_project_name = pkg_resources.to_filename(project_name) + req = '{}@{}#egg={}'.format(repo_url, rev, egg_project_name) + if subdir: + req += '&subdirectory={}'.format(subdir) + + return req + + +def find_path_to_setup_from_repo_root(location, repo_root): + # type: (str, str) -> Optional[str] + """ + Find the path to `setup.py` by searching up the filesystem from `location`. + Return the path to `setup.py` relative to `repo_root`. + Return None if `setup.py` is in `repo_root` or cannot be found. + """ + # find setup.py + orig_location = location + while not os.path.exists(os.path.join(location, 'setup.py')): + last_location = location + location = os.path.dirname(location) + if location == last_location: + # We've traversed up to the root of the filesystem without + # finding setup.py + logger.warning( + "Could not find setup.py for directory %s (tried all " + "parent directories)", + orig_location, + ) + return None + + if samefile(repo_root, location): + return None + + return os.path.relpath(location, repo_root) + + +class RemoteNotFoundError(Exception): + pass + + +class RevOptions(object): + + """ + Encapsulates a VCS-specific revision to install, along with any VCS + install options. + + Instances of this class should be treated as if immutable. + """ + + def __init__( + self, + vc_class, # type: Type[VersionControl] + rev=None, # type: Optional[str] + extra_args=None, # type: Optional[CommandArgs] + ): + # type: (...) -> None + """ + Args: + vc_class: a VersionControl subclass. + rev: the name of the revision to install. + extra_args: a list of extra options. + """ + if extra_args is None: + extra_args = [] + + self.extra_args = extra_args + self.rev = rev + self.vc_class = vc_class + self.branch_name = None # type: Optional[str] + + def __repr__(self): + # type: () -> str + return ''.format(self.vc_class.name, self.rev) + + @property + def arg_rev(self): + # type: () -> Optional[str] + if self.rev is None: + return self.vc_class.default_arg_rev + + return self.rev + + def to_args(self): + # type: () -> CommandArgs + """ + Return the VCS-specific command arguments. + """ + args = [] # type: CommandArgs + rev = self.arg_rev + if rev is not None: + args += self.vc_class.get_base_rev_args(rev) + args += self.extra_args + + return args + + def to_display(self): + # type: () -> str + if not self.rev: + return '' + + return ' (to revision {})'.format(self.rev) + + def make_new(self, rev): + # type: (str) -> RevOptions + """ + Make a copy of the current instance, but with a new rev. + + Args: + rev: the name of the revision for the new object. + """ + return self.vc_class.make_rev_options(rev, extra_args=self.extra_args) + + +class VcsSupport(object): + _registry = {} # type: Dict[str, VersionControl] + schemes = ['ssh', 'git', 'hg', 'bzr', 'sftp', 'svn'] + + def __init__(self): + # type: () -> None + # Register more schemes with urlparse for various version control + # systems + urllib_parse.uses_netloc.extend(self.schemes) + # Python >= 2.7.4, 3.3 doesn't have uses_fragment + if getattr(urllib_parse, 'uses_fragment', None): + urllib_parse.uses_fragment.extend(self.schemes) + super(VcsSupport, self).__init__() + + def __iter__(self): + # type: () -> Iterator[str] + return self._registry.__iter__() + + @property + def backends(self): + # type: () -> List[VersionControl] + return list(self._registry.values()) + + @property + def dirnames(self): + # type: () -> List[str] + return [backend.dirname for backend in self.backends] + + @property + def all_schemes(self): + # type: () -> List[str] + schemes = [] # type: List[str] + for backend in self.backends: + schemes.extend(backend.schemes) + return schemes + + def register(self, cls): + # type: (Type[VersionControl]) -> None + if not hasattr(cls, 'name'): + logger.warning('Cannot register VCS %s', cls.__name__) + return + if cls.name not in self._registry: + self._registry[cls.name] = cls() + logger.debug('Registered VCS backend: %s', cls.name) + + def unregister(self, name): + # type: (str) -> None + if name in self._registry: + del self._registry[name] + + def get_backend_for_dir(self, location): + # type: (str) -> Optional[VersionControl] + """ + Return a VersionControl object if a repository of that type is found + at the given directory. + """ + for vcs_backend in self._registry.values(): + if vcs_backend.controls_location(location): + logger.debug('Determine that %s uses VCS: %s', + location, vcs_backend.name) + return vcs_backend + return None + + def get_backend_for_scheme(self, scheme): + # type: (str) -> Optional[VersionControl] + """ + Return a VersionControl object or None. + """ + for vcs_backend in self._registry.values(): + if scheme in vcs_backend.schemes: + return vcs_backend + return None + + def get_backend(self, name): + # type: (str) -> Optional[VersionControl] + """ + Return a VersionControl object or None. + """ + name = name.lower() + return self._registry.get(name) + + +vcs = VcsSupport() + + +class VersionControl(object): + name = '' + dirname = '' + repo_name = '' + # List of supported schemes for this Version Control + schemes = () # type: Tuple[str, ...] + # Iterable of environment variable names to pass to call_subprocess(). + unset_environ = () # type: Tuple[str, ...] + default_arg_rev = None # type: Optional[str] + + @classmethod + def should_add_vcs_url_prefix(cls, remote_url): + # type: (str) -> bool + """ + Return whether the vcs prefix (e.g. "git+") should be added to a + repository's remote url when used in a requirement. + """ + return not remote_url.lower().startswith('{}:'.format(cls.name)) + + @classmethod + def get_subdirectory(cls, location): + # type: (str) -> Optional[str] + """ + Return the path to setup.py, relative to the repo root. + Return None if setup.py is in the repo root. + """ + return None + + @classmethod + def get_requirement_revision(cls, repo_dir): + # type: (str) -> str + """ + Return the revision string that should be used in a requirement. + """ + return cls.get_revision(repo_dir) + + @classmethod + def get_src_requirement(cls, repo_dir, project_name): + # type: (str, str) -> Optional[str] + """ + Return the requirement string to use to redownload the files + currently at the given repository directory. + + Args: + project_name: the (unescaped) project name. + + The return value has a form similar to the following: + + {repository_url}@{revision}#egg={project_name} + """ + repo_url = cls.get_remote_url(repo_dir) + if repo_url is None: + return None + + if cls.should_add_vcs_url_prefix(repo_url): + repo_url = '{}+{}'.format(cls.name, repo_url) + + revision = cls.get_requirement_revision(repo_dir) + subdir = cls.get_subdirectory(repo_dir) + req = make_vcs_requirement_url(repo_url, revision, project_name, + subdir=subdir) + + return req + + @staticmethod + def get_base_rev_args(rev): + # type: (str) -> List[str] + """ + Return the base revision arguments for a vcs command. + + Args: + rev: the name of a revision to install. Cannot be None. + """ + raise NotImplementedError + + def is_immutable_rev_checkout(self, url, dest): + # type: (str, str) -> bool + """ + Return true if the commit hash checked out at dest matches + the revision in url. + + Always return False, if the VCS does not support immutable commit + hashes. + + This method does not check if there are local uncommitted changes + in dest after checkout, as pip currently has no use case for that. + """ + return False + + @classmethod + def make_rev_options(cls, rev=None, extra_args=None): + # type: (Optional[str], Optional[CommandArgs]) -> RevOptions + """ + Return a RevOptions object. + + Args: + rev: the name of a revision to install. + extra_args: a list of extra options. + """ + return RevOptions(cls, rev, extra_args=extra_args) + + @classmethod + def _is_local_repository(cls, repo): + # type: (str) -> bool + """ + posix absolute paths start with os.path.sep, + win32 ones start with drive (like c:\\folder) + """ + drive, tail = os.path.splitdrive(repo) + return repo.startswith(os.path.sep) or bool(drive) + + def export(self, location, url): + # type: (str, HiddenText) -> None + """ + Export the repository at the url to the destination location + i.e. only download the files, without vcs informations + + :param url: the repository URL starting with a vcs prefix. + """ + raise NotImplementedError + + @classmethod + def get_netloc_and_auth(cls, netloc, scheme): + # type: (str, str) -> Tuple[str, Tuple[Optional[str], Optional[str]]] + """ + Parse the repository URL's netloc, and return the new netloc to use + along with auth information. + + Args: + netloc: the original repository URL netloc. + scheme: the repository URL's scheme without the vcs prefix. + + This is mainly for the Subversion class to override, so that auth + information can be provided via the --username and --password options + instead of through the URL. For other subclasses like Git without + such an option, auth information must stay in the URL. + + Returns: (netloc, (username, password)). + """ + return netloc, (None, None) + + @classmethod + def get_url_rev_and_auth(cls, url): + # type: (str) -> Tuple[str, Optional[str], AuthInfo] + """ + Parse the repository URL to use, and return the URL, revision, + and auth info to use. + + Returns: (url, rev, (username, password)). + """ + scheme, netloc, path, query, frag = urllib_parse.urlsplit(url) + if '+' not in scheme: + raise ValueError( + "Sorry, {!r} is a malformed VCS url. " + "The format is +://, " + "e.g. svn+http://myrepo/svn/MyApp#egg=MyApp".format(url) + ) + # Remove the vcs prefix. + scheme = scheme.split('+', 1)[1] + netloc, user_pass = cls.get_netloc_and_auth(netloc, scheme) + rev = None + if '@' in path: + path, rev = path.rsplit('@', 1) + url = urllib_parse.urlunsplit((scheme, netloc, path, query, '')) + return url, rev, user_pass + + @staticmethod + def make_rev_args(username, password): + # type: (Optional[str], Optional[HiddenText]) -> CommandArgs + """ + Return the RevOptions "extra arguments" to use in obtain(). + """ + return [] + + def get_url_rev_options(self, url): + # type: (HiddenText) -> Tuple[HiddenText, RevOptions] + """ + Return the URL and RevOptions object to use in obtain() and in + some cases export(), as a tuple (url, rev_options). + """ + secret_url, rev, user_pass = self.get_url_rev_and_auth(url.secret) + username, secret_password = user_pass + password = None # type: Optional[HiddenText] + if secret_password is not None: + password = hide_value(secret_password) + extra_args = self.make_rev_args(username, password) + rev_options = self.make_rev_options(rev, extra_args=extra_args) + + return hide_url(secret_url), rev_options + + @staticmethod + def normalize_url(url): + # type: (str) -> str + """ + Normalize a URL for comparison by unquoting it and removing any + trailing slash. + """ + return urllib_parse.unquote(url).rstrip('/') + + @classmethod + def compare_urls(cls, url1, url2): + # type: (str, str) -> bool + """ + Compare two repo URLs for identity, ignoring incidental differences. + """ + return (cls.normalize_url(url1) == cls.normalize_url(url2)) + + def fetch_new(self, dest, url, rev_options): + # type: (str, HiddenText, RevOptions) -> None + """ + Fetch a revision from a repository, in the case that this is the + first fetch from the repository. + + Args: + dest: the directory to fetch the repository to. + rev_options: a RevOptions object. + """ + raise NotImplementedError + + def switch(self, dest, url, rev_options): + # type: (str, HiddenText, RevOptions) -> None + """ + Switch the repo at ``dest`` to point to ``URL``. + + Args: + rev_options: a RevOptions object. + """ + raise NotImplementedError + + def update(self, dest, url, rev_options): + # type: (str, HiddenText, RevOptions) -> None + """ + Update an already-existing repo to the given ``rev_options``. + + Args: + rev_options: a RevOptions object. + """ + raise NotImplementedError + + @classmethod + def is_commit_id_equal(cls, dest, name): + # type: (str, Optional[str]) -> bool + """ + Return whether the id of the current commit equals the given name. + + Args: + dest: the repository directory. + name: a string name. + """ + raise NotImplementedError + + def obtain(self, dest, url): + # type: (str, HiddenText) -> None + """ + Install or update in editable mode the package represented by this + VersionControl object. + + :param dest: the repository directory in which to install or update. + :param url: the repository URL starting with a vcs prefix. + """ + url, rev_options = self.get_url_rev_options(url) + + if not os.path.exists(dest): + self.fetch_new(dest, url, rev_options) + return + + rev_display = rev_options.to_display() + if self.is_repository_directory(dest): + existing_url = self.get_remote_url(dest) + if self.compare_urls(existing_url, url.secret): + logger.debug( + '%s in %s exists, and has correct URL (%s)', + self.repo_name.title(), + display_path(dest), + url, + ) + if not self.is_commit_id_equal(dest, rev_options.rev): + logger.info( + 'Updating %s %s%s', + display_path(dest), + self.repo_name, + rev_display, + ) + self.update(dest, url, rev_options) + else: + logger.info('Skipping because already up-to-date.') + return + + logger.warning( + '%s %s in %s exists with URL %s', + self.name, + self.repo_name, + display_path(dest), + existing_url, + ) + prompt = ('(s)witch, (i)gnore, (w)ipe, (b)ackup ', + ('s', 'i', 'w', 'b')) + else: + logger.warning( + 'Directory %s already exists, and is not a %s %s.', + dest, + self.name, + self.repo_name, + ) + # https://github.com/python/mypy/issues/1174 + prompt = ('(i)gnore, (w)ipe, (b)ackup ', # type: ignore + ('i', 'w', 'b')) + + logger.warning( + 'The plan is to install the %s repository %s', + self.name, + url, + ) + response = ask_path_exists('What to do? %s' % prompt[0], prompt[1]) + + if response == 'a': + sys.exit(-1) + + if response == 'w': + logger.warning('Deleting %s', display_path(dest)) + rmtree(dest) + self.fetch_new(dest, url, rev_options) + return + + if response == 'b': + dest_dir = backup_dir(dest) + logger.warning( + 'Backing up %s to %s', display_path(dest), dest_dir, + ) + shutil.move(dest, dest_dir) + self.fetch_new(dest, url, rev_options) + return + + # Do nothing if the response is "i". + if response == 's': + logger.info( + 'Switching %s %s to %s%s', + self.repo_name, + display_path(dest), + url, + rev_display, + ) + self.switch(dest, url, rev_options) + + def unpack(self, location, url): + # type: (str, HiddenText) -> None + """ + Clean up current location and download the url repository + (and vcs infos) into location + + :param url: the repository URL starting with a vcs prefix. + """ + if os.path.exists(location): + rmtree(location) + self.obtain(location, url=url) + + @classmethod + def get_remote_url(cls, location): + # type: (str) -> str + """ + Return the url used at location + + Raises RemoteNotFoundError if the repository does not have a remote + url configured. + """ + raise NotImplementedError + + @classmethod + def get_revision(cls, location): + # type: (str) -> str + """ + Return the current commit id of the files at the given location. + """ + raise NotImplementedError + + @classmethod + def run_command( + cls, + cmd, # type: Union[List[str], CommandArgs] + show_stdout=True, # type: bool + cwd=None, # type: Optional[str] + on_returncode='raise', # type: str + extra_ok_returncodes=None, # type: Optional[Iterable[int]] + command_desc=None, # type: Optional[str] + extra_environ=None, # type: Optional[Mapping[str, Any]] + spinner=None, # type: Optional[SpinnerInterface] + log_failed_cmd=True # type: bool + ): + # type: (...) -> Text + """ + Run a VCS subcommand + This is simply a wrapper around call_subprocess that adds the VCS + command name, and checks that the VCS is available + """ + cmd = make_command(cls.name, *cmd) + try: + return call_subprocess(cmd, show_stdout, cwd, + on_returncode=on_returncode, + extra_ok_returncodes=extra_ok_returncodes, + command_desc=command_desc, + extra_environ=extra_environ, + unset_environ=cls.unset_environ, + spinner=spinner, + log_failed_cmd=log_failed_cmd) + except OSError as e: + # errno.ENOENT = no such file or directory + # In other words, the VCS executable isn't available + if e.errno == errno.ENOENT: + raise BadCommand( + 'Cannot find command %r - do you have ' + '%r installed and in your ' + 'PATH?' % (cls.name, cls.name)) + else: + raise # re-raise exception if a different error occurred + + @classmethod + def is_repository_directory(cls, path): + # type: (str) -> bool + """ + Return whether a directory path is a repository directory. + """ + logger.debug('Checking in %s for %s (%s)...', + path, cls.dirname, cls.name) + return os.path.exists(os.path.join(path, cls.dirname)) + + @classmethod + def controls_location(cls, location): + # type: (str) -> bool + """ + Check if a location is controlled by the vcs. + It is meant to be overridden to implement smarter detection + mechanisms for specific vcs. + + This can do more than is_repository_directory() alone. For example, + the Git override checks that Git is actually available. + """ + return cls.is_repository_directory(location) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/vcs/versioncontrol.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/vcs/versioncontrol.py new file mode 100644 index 0000000..7cfd568 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/vcs/versioncontrol.py @@ -0,0 +1,700 @@ +"""Handles all VCS (version control) support""" + +from __future__ import absolute_import + +import errno +import logging +import os +import shutil +import sys + +from pip._vendor import pkg_resources +from pip._vendor.six.moves.urllib import parse as urllib_parse + +from pip._internal.exceptions import BadCommand +from pip._internal.utils.compat import samefile +from pip._internal.utils.misc import ( + ask_path_exists, + backup_dir, + display_path, + hide_url, + hide_value, + rmtree, +) +from pip._internal.utils.subprocess import call_subprocess, make_command +from pip._internal.utils.typing import MYPY_CHECK_RUNNING +from pip._internal.utils.urls import get_url_scheme + +if MYPY_CHECK_RUNNING: + from typing import ( + Any, Dict, Iterable, Iterator, List, Mapping, Optional, Text, Tuple, + Type, Union + ) + from pip._internal.utils.ui import SpinnerInterface + from pip._internal.utils.misc import HiddenText + from pip._internal.utils.subprocess import CommandArgs + + AuthInfo = Tuple[Optional[str], Optional[str]] + + +__all__ = ['vcs'] + + +logger = logging.getLogger(__name__) + + +def is_url(name): + # type: (Union[str, Text]) -> bool + """ + Return true if the name looks like a URL. + """ + scheme = get_url_scheme(name) + if scheme is None: + return False + return scheme in ['http', 'https', 'file', 'ftp'] + vcs.all_schemes + + +def make_vcs_requirement_url(repo_url, rev, project_name, subdir=None): + # type: (str, str, str, Optional[str]) -> str + """ + Return the URL for a VCS requirement. + + Args: + repo_url: the remote VCS url, with any needed VCS prefix (e.g. "git+"). + project_name: the (unescaped) project name. + """ + egg_project_name = pkg_resources.to_filename(project_name) + req = '{}@{}#egg={}'.format(repo_url, rev, egg_project_name) + if subdir: + req += '&subdirectory={}'.format(subdir) + + return req + + +def find_path_to_setup_from_repo_root(location, repo_root): + # type: (str, str) -> Optional[str] + """ + Find the path to `setup.py` by searching up the filesystem from `location`. + Return the path to `setup.py` relative to `repo_root`. + Return None if `setup.py` is in `repo_root` or cannot be found. + """ + # find setup.py + orig_location = location + while not os.path.exists(os.path.join(location, 'setup.py')): + last_location = location + location = os.path.dirname(location) + if location == last_location: + # We've traversed up to the root of the filesystem without + # finding setup.py + logger.warning( + "Could not find setup.py for directory %s (tried all " + "parent directories)", + orig_location, + ) + return None + + if samefile(repo_root, location): + return None + + return os.path.relpath(location, repo_root) + + +class RemoteNotFoundError(Exception): + pass + + +class RevOptions(object): + + """ + Encapsulates a VCS-specific revision to install, along with any VCS + install options. + + Instances of this class should be treated as if immutable. + """ + + def __init__( + self, + vc_class, # type: Type[VersionControl] + rev=None, # type: Optional[str] + extra_args=None, # type: Optional[CommandArgs] + ): + # type: (...) -> None + """ + Args: + vc_class: a VersionControl subclass. + rev: the name of the revision to install. + extra_args: a list of extra options. + """ + if extra_args is None: + extra_args = [] + + self.extra_args = extra_args + self.rev = rev + self.vc_class = vc_class + self.branch_name = None # type: Optional[str] + + def __repr__(self): + # type: () -> str + return ''.format(self.vc_class.name, self.rev) + + @property + def arg_rev(self): + # type: () -> Optional[str] + if self.rev is None: + return self.vc_class.default_arg_rev + + return self.rev + + def to_args(self): + # type: () -> CommandArgs + """ + Return the VCS-specific command arguments. + """ + args = [] # type: CommandArgs + rev = self.arg_rev + if rev is not None: + args += self.vc_class.get_base_rev_args(rev) + args += self.extra_args + + return args + + def to_display(self): + # type: () -> str + if not self.rev: + return '' + + return ' (to revision {})'.format(self.rev) + + def make_new(self, rev): + # type: (str) -> RevOptions + """ + Make a copy of the current instance, but with a new rev. + + Args: + rev: the name of the revision for the new object. + """ + return self.vc_class.make_rev_options(rev, extra_args=self.extra_args) + + +class VcsSupport(object): + _registry = {} # type: Dict[str, VersionControl] + schemes = ['ssh', 'git', 'hg', 'bzr', 'sftp', 'svn'] + + def __init__(self): + # type: () -> None + # Register more schemes with urlparse for various version control + # systems + urllib_parse.uses_netloc.extend(self.schemes) + # Python >= 2.7.4, 3.3 doesn't have uses_fragment + if getattr(urllib_parse, 'uses_fragment', None): + urllib_parse.uses_fragment.extend(self.schemes) + super(VcsSupport, self).__init__() + + def __iter__(self): + # type: () -> Iterator[str] + return self._registry.__iter__() + + @property + def backends(self): + # type: () -> List[VersionControl] + return list(self._registry.values()) + + @property + def dirnames(self): + # type: () -> List[str] + return [backend.dirname for backend in self.backends] + + @property + def all_schemes(self): + # type: () -> List[str] + schemes = [] # type: List[str] + for backend in self.backends: + schemes.extend(backend.schemes) + return schemes + + def register(self, cls): + # type: (Type[VersionControl]) -> None + if not hasattr(cls, 'name'): + logger.warning('Cannot register VCS %s', cls.__name__) + return + if cls.name not in self._registry: + self._registry[cls.name] = cls() + logger.debug('Registered VCS backend: %s', cls.name) + + def unregister(self, name): + # type: (str) -> None + if name in self._registry: + del self._registry[name] + + def get_backend_for_dir(self, location): + # type: (str) -> Optional[VersionControl] + """ + Return a VersionControl object if a repository of that type is found + at the given directory. + """ + for vcs_backend in self._registry.values(): + if vcs_backend.controls_location(location): + logger.debug('Determine that %s uses VCS: %s', + location, vcs_backend.name) + return vcs_backend + return None + + def get_backend_for_scheme(self, scheme): + # type: (str) -> Optional[VersionControl] + """ + Return a VersionControl object or None. + """ + for vcs_backend in self._registry.values(): + if scheme in vcs_backend.schemes: + return vcs_backend + return None + + def get_backend(self, name): + # type: (str) -> Optional[VersionControl] + """ + Return a VersionControl object or None. + """ + name = name.lower() + return self._registry.get(name) + + +vcs = VcsSupport() + + +class VersionControl(object): + name = '' + dirname = '' + repo_name = '' + # List of supported schemes for this Version Control + schemes = () # type: Tuple[str, ...] + # Iterable of environment variable names to pass to call_subprocess(). + unset_environ = () # type: Tuple[str, ...] + default_arg_rev = None # type: Optional[str] + + @classmethod + def should_add_vcs_url_prefix(cls, remote_url): + # type: (str) -> bool + """ + Return whether the vcs prefix (e.g. "git+") should be added to a + repository's remote url when used in a requirement. + """ + return not remote_url.lower().startswith('{}:'.format(cls.name)) + + @classmethod + def get_subdirectory(cls, location): + # type: (str) -> Optional[str] + """ + Return the path to setup.py, relative to the repo root. + Return None if setup.py is in the repo root. + """ + return None + + @classmethod + def get_requirement_revision(cls, repo_dir): + # type: (str) -> str + """ + Return the revision string that should be used in a requirement. + """ + return cls.get_revision(repo_dir) + + @classmethod + def get_src_requirement(cls, repo_dir, project_name): + # type: (str, str) -> Optional[str] + """ + Return the requirement string to use to redownload the files + currently at the given repository directory. + + Args: + project_name: the (unescaped) project name. + + The return value has a form similar to the following: + + {repository_url}@{revision}#egg={project_name} + """ + repo_url = cls.get_remote_url(repo_dir) + if repo_url is None: + return None + + if cls.should_add_vcs_url_prefix(repo_url): + repo_url = '{}+{}'.format(cls.name, repo_url) + + revision = cls.get_requirement_revision(repo_dir) + subdir = cls.get_subdirectory(repo_dir) + req = make_vcs_requirement_url(repo_url, revision, project_name, + subdir=subdir) + + return req + + @staticmethod + def get_base_rev_args(rev): + # type: (str) -> List[str] + """ + Return the base revision arguments for a vcs command. + + Args: + rev: the name of a revision to install. Cannot be None. + """ + raise NotImplementedError + + def is_immutable_rev_checkout(self, url, dest): + # type: (str, str) -> bool + """ + Return true if the commit hash checked out at dest matches + the revision in url. + + Always return False, if the VCS does not support immutable commit + hashes. + + This method does not check if there are local uncommitted changes + in dest after checkout, as pip currently has no use case for that. + """ + return False + + @classmethod + def make_rev_options(cls, rev=None, extra_args=None): + # type: (Optional[str], Optional[CommandArgs]) -> RevOptions + """ + Return a RevOptions object. + + Args: + rev: the name of a revision to install. + extra_args: a list of extra options. + """ + return RevOptions(cls, rev, extra_args=extra_args) + + @classmethod + def _is_local_repository(cls, repo): + # type: (str) -> bool + """ + posix absolute paths start with os.path.sep, + win32 ones start with drive (like c:\\folder) + """ + drive, tail = os.path.splitdrive(repo) + return repo.startswith(os.path.sep) or bool(drive) + + def export(self, location, url): + # type: (str, HiddenText) -> None + """ + Export the repository at the url to the destination location + i.e. only download the files, without vcs informations + + :param url: the repository URL starting with a vcs prefix. + """ + raise NotImplementedError + + @classmethod + def get_netloc_and_auth(cls, netloc, scheme): + # type: (str, str) -> Tuple[str, Tuple[Optional[str], Optional[str]]] + """ + Parse the repository URL's netloc, and return the new netloc to use + along with auth information. + + Args: + netloc: the original repository URL netloc. + scheme: the repository URL's scheme without the vcs prefix. + + This is mainly for the Subversion class to override, so that auth + information can be provided via the --username and --password options + instead of through the URL. For other subclasses like Git without + such an option, auth information must stay in the URL. + + Returns: (netloc, (username, password)). + """ + return netloc, (None, None) + + @classmethod + def get_url_rev_and_auth(cls, url): + # type: (str) -> Tuple[str, Optional[str], AuthInfo] + """ + Parse the repository URL to use, and return the URL, revision, + and auth info to use. + + Returns: (url, rev, (username, password)). + """ + scheme, netloc, path, query, frag = urllib_parse.urlsplit(url) + if '+' not in scheme: + raise ValueError( + "Sorry, {!r} is a malformed VCS url. " + "The format is +://, " + "e.g. svn+http://myrepo/svn/MyApp#egg=MyApp".format(url) + ) + # Remove the vcs prefix. + scheme = scheme.split('+', 1)[1] + netloc, user_pass = cls.get_netloc_and_auth(netloc, scheme) + rev = None + if '@' in path: + path, rev = path.rsplit('@', 1) + url = urllib_parse.urlunsplit((scheme, netloc, path, query, '')) + return url, rev, user_pass + + @staticmethod + def make_rev_args(username, password): + # type: (Optional[str], Optional[HiddenText]) -> CommandArgs + """ + Return the RevOptions "extra arguments" to use in obtain(). + """ + return [] + + def get_url_rev_options(self, url): + # type: (HiddenText) -> Tuple[HiddenText, RevOptions] + """ + Return the URL and RevOptions object to use in obtain() and in + some cases export(), as a tuple (url, rev_options). + """ + secret_url, rev, user_pass = self.get_url_rev_and_auth(url.secret) + username, secret_password = user_pass + password = None # type: Optional[HiddenText] + if secret_password is not None: + password = hide_value(secret_password) + extra_args = self.make_rev_args(username, password) + rev_options = self.make_rev_options(rev, extra_args=extra_args) + + return hide_url(secret_url), rev_options + + @staticmethod + def normalize_url(url): + # type: (str) -> str + """ + Normalize a URL for comparison by unquoting it and removing any + trailing slash. + """ + return urllib_parse.unquote(url).rstrip('/') + + @classmethod + def compare_urls(cls, url1, url2): + # type: (str, str) -> bool + """ + Compare two repo URLs for identity, ignoring incidental differences. + """ + return (cls.normalize_url(url1) == cls.normalize_url(url2)) + + def fetch_new(self, dest, url, rev_options): + # type: (str, HiddenText, RevOptions) -> None + """ + Fetch a revision from a repository, in the case that this is the + first fetch from the repository. + + Args: + dest: the directory to fetch the repository to. + rev_options: a RevOptions object. + """ + raise NotImplementedError + + def switch(self, dest, url, rev_options): + # type: (str, HiddenText, RevOptions) -> None + """ + Switch the repo at ``dest`` to point to ``URL``. + + Args: + rev_options: a RevOptions object. + """ + raise NotImplementedError + + def update(self, dest, url, rev_options): + # type: (str, HiddenText, RevOptions) -> None + """ + Update an already-existing repo to the given ``rev_options``. + + Args: + rev_options: a RevOptions object. + """ + raise NotImplementedError + + @classmethod + def is_commit_id_equal(cls, dest, name): + # type: (str, Optional[str]) -> bool + """ + Return whether the id of the current commit equals the given name. + + Args: + dest: the repository directory. + name: a string name. + """ + raise NotImplementedError + + def obtain(self, dest, url): + # type: (str, HiddenText) -> None + """ + Install or update in editable mode the package represented by this + VersionControl object. + + :param dest: the repository directory in which to install or update. + :param url: the repository URL starting with a vcs prefix. + """ + url, rev_options = self.get_url_rev_options(url) + + if not os.path.exists(dest): + self.fetch_new(dest, url, rev_options) + return + + rev_display = rev_options.to_display() + if self.is_repository_directory(dest): + existing_url = self.get_remote_url(dest) + if self.compare_urls(existing_url, url.secret): + logger.debug( + '%s in %s exists, and has correct URL (%s)', + self.repo_name.title(), + display_path(dest), + url, + ) + if not self.is_commit_id_equal(dest, rev_options.rev): + logger.info( + 'Updating %s %s%s', + display_path(dest), + self.repo_name, + rev_display, + ) + self.update(dest, url, rev_options) + else: + logger.info('Skipping because already up-to-date.') + return + + logger.warning( + '%s %s in %s exists with URL %s', + self.name, + self.repo_name, + display_path(dest), + existing_url, + ) + prompt = ('(s)witch, (i)gnore, (w)ipe, (b)ackup ', + ('s', 'i', 'w', 'b')) + else: + logger.warning( + 'Directory %s already exists, and is not a %s %s.', + dest, + self.name, + self.repo_name, + ) + # https://github.com/python/mypy/issues/1174 + prompt = ('(i)gnore, (w)ipe, (b)ackup ', # type: ignore + ('i', 'w', 'b')) + + logger.warning( + 'The plan is to install the %s repository %s', + self.name, + url, + ) + response = ask_path_exists('What to do? %s' % prompt[0], prompt[1]) + + if response == 'a': + sys.exit(-1) + + if response == 'w': + logger.warning('Deleting %s', display_path(dest)) + rmtree(dest) + self.fetch_new(dest, url, rev_options) + return + + if response == 'b': + dest_dir = backup_dir(dest) + logger.warning( + 'Backing up %s to %s', display_path(dest), dest_dir, + ) + shutil.move(dest, dest_dir) + self.fetch_new(dest, url, rev_options) + return + + # Do nothing if the response is "i". + if response == 's': + logger.info( + 'Switching %s %s to %s%s', + self.repo_name, + display_path(dest), + url, + rev_display, + ) + self.switch(dest, url, rev_options) + + def unpack(self, location, url): + # type: (str, HiddenText) -> None + """ + Clean up current location and download the url repository + (and vcs infos) into location + + :param url: the repository URL starting with a vcs prefix. + """ + if os.path.exists(location): + rmtree(location) + self.obtain(location, url=url) + + @classmethod + def get_remote_url(cls, location): + # type: (str) -> str + """ + Return the url used at location + + Raises RemoteNotFoundError if the repository does not have a remote + url configured. + """ + raise NotImplementedError + + @classmethod + def get_revision(cls, location): + # type: (str) -> str + """ + Return the current commit id of the files at the given location. + """ + raise NotImplementedError + + @classmethod + def run_command( + cls, + cmd, # type: Union[List[str], CommandArgs] + show_stdout=True, # type: bool + cwd=None, # type: Optional[str] + on_returncode='raise', # type: str + extra_ok_returncodes=None, # type: Optional[Iterable[int]] + command_desc=None, # type: Optional[str] + extra_environ=None, # type: Optional[Mapping[str, Any]] + spinner=None, # type: Optional[SpinnerInterface] + log_failed_cmd=True # type: bool + ): + # type: (...) -> Text + """ + Run a VCS subcommand + This is simply a wrapper around call_subprocess that adds the VCS + command name, and checks that the VCS is available + """ + cmd = make_command(cls.name, *cmd) + try: + return call_subprocess(cmd, show_stdout, cwd, + on_returncode=on_returncode, + extra_ok_returncodes=extra_ok_returncodes, + command_desc=command_desc, + extra_environ=extra_environ, + unset_environ=cls.unset_environ, + spinner=spinner, + log_failed_cmd=log_failed_cmd) + except OSError as e: + # errno.ENOENT = no such file or directory + # In other words, the VCS executable isn't available + if e.errno == errno.ENOENT: + raise BadCommand( + 'Cannot find command %r - do you have ' + '%r installed and in your ' + 'PATH?' % (cls.name, cls.name)) + else: + raise # re-raise exception if a different error occurred + + @classmethod + def is_repository_directory(cls, path): + # type: (str) -> bool + """ + Return whether a directory path is a repository directory. + """ + logger.debug('Checking in %s for %s (%s)...', + path, cls.dirname, cls.name) + return os.path.exists(os.path.join(path, cls.dirname)) + + @classmethod + def controls_location(cls, location): + # type: (str) -> bool + """ + Check if a location is controlled by the vcs. + It is meant to be overridden to implement smarter detection + mechanisms for specific vcs. + + This can do more than is_repository_directory() alone. For example, + the Git override checks that Git is actually available. + """ + return cls.is_repository_directory(location) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/vcs/versioncontrol.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/vcs/versioncontrol.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d96f5418114a8d9657fc66b82bd09ae229493744 GIT binary patch literal 25564 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 literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/wheel_builder 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/wheel_builder 2.py new file mode 100644 index 0000000..7c7820d --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/wheel_builder 2.py @@ -0,0 +1,305 @@ +"""Orchestrator for building wheels from InstallRequirements. +""" + +# The following comment should be removed at some point in the future. +# mypy: strict-optional=False + +import logging +import os.path +import re +import shutil + +from pip._internal.models.link import Link +from pip._internal.operations.build.wheel import build_wheel_pep517 +from pip._internal.operations.build.wheel_legacy import build_wheel_legacy +from pip._internal.utils.logging import indent_log +from pip._internal.utils.misc import ensure_dir, hash_file, is_wheel_installed +from pip._internal.utils.setuptools_build import make_setuptools_clean_args +from pip._internal.utils.subprocess import call_subprocess +from pip._internal.utils.temp_dir import TempDirectory +from pip._internal.utils.typing import MYPY_CHECK_RUNNING +from pip._internal.utils.urls import path_to_url +from pip._internal.vcs import vcs + +if MYPY_CHECK_RUNNING: + from typing import ( + Any, Callable, Iterable, List, Optional, Pattern, Tuple, + ) + + from pip._internal.cache import WheelCache + from pip._internal.req.req_install import InstallRequirement + + BinaryAllowedPredicate = Callable[[InstallRequirement], bool] + BuildResult = Tuple[List[InstallRequirement], List[InstallRequirement]] + +logger = logging.getLogger(__name__) + + +def _contains_egg_info( + s, _egg_info_re=re.compile(r'([a-z0-9_.]+)-([a-z0-9_.!+-]+)', re.I)): + # type: (str, Pattern[str]) -> bool + """Determine whether the string looks like an egg_info. + + :param s: The string to parse. E.g. foo-2.1 + """ + return bool(_egg_info_re.search(s)) + + +def _should_build( + req, # type: InstallRequirement + need_wheel, # type: bool + check_binary_allowed, # type: BinaryAllowedPredicate +): + # type: (...) -> bool + """Return whether an InstallRequirement should be built into a wheel.""" + if req.constraint: + # never build requirements that are merely constraints + return False + if req.is_wheel: + if need_wheel: + logger.info( + 'Skipping %s, due to already being wheel.', req.name, + ) + return False + + if need_wheel: + # i.e. pip wheel, not pip install + return True + + # From this point, this concerns the pip install command only + # (need_wheel=False). + + if not req.use_pep517 and not is_wheel_installed(): + # we don't build legacy requirements if wheel is not installed + return False + + if req.editable or not req.source_dir: + return False + + if not check_binary_allowed(req): + logger.info( + "Skipping wheel build for %s, due to binaries " + "being disabled for it.", req.name, + ) + return False + + return True + + +def should_build_for_wheel_command( + req, # type: InstallRequirement +): + # type: (...) -> bool + return _should_build( + req, need_wheel=True, check_binary_allowed=_always_true + ) + + +def should_build_for_install_command( + req, # type: InstallRequirement + check_binary_allowed, # type: BinaryAllowedPredicate +): + # type: (...) -> bool + return _should_build( + req, need_wheel=False, check_binary_allowed=check_binary_allowed + ) + + +def _should_cache( + req, # type: InstallRequirement +): + # type: (...) -> Optional[bool] + """ + Return whether a built InstallRequirement can be stored in the persistent + wheel cache, assuming the wheel cache is available, and _should_build() + has determined a wheel needs to be built. + """ + if not should_build_for_install_command( + req, check_binary_allowed=_always_true + ): + # never cache if pip install would not have built + # (editable mode, etc) + return False + + if req.link and req.link.is_vcs: + # VCS checkout. Do not cache + # unless it points to an immutable commit hash. + assert not req.editable + assert req.source_dir + vcs_backend = vcs.get_backend_for_scheme(req.link.scheme) + assert vcs_backend + if vcs_backend.is_immutable_rev_checkout(req.link.url, req.source_dir): + return True + return False + + base, ext = req.link.splitext() + if _contains_egg_info(base): + return True + + # Otherwise, do not cache. + return False + + +def _get_cache_dir( + req, # type: InstallRequirement + wheel_cache, # type: WheelCache +): + # type: (...) -> str + """Return the persistent or temporary cache directory where the built + wheel need to be stored. + """ + cache_available = bool(wheel_cache.cache_dir) + if cache_available and _should_cache(req): + cache_dir = wheel_cache.get_path_for_link(req.link) + else: + cache_dir = wheel_cache.get_ephem_path_for_link(req.link) + return cache_dir + + +def _always_true(_): + # type: (Any) -> bool + return True + + +def _build_one( + req, # type: InstallRequirement + output_dir, # type: str + build_options, # type: List[str] + global_options, # type: List[str] +): + # type: (...) -> Optional[str] + """Build one wheel. + + :return: The filename of the built wheel, or None if the build failed. + """ + try: + ensure_dir(output_dir) + except OSError as e: + logger.warning( + "Building wheel for %s failed: %s", + req.name, e, + ) + return None + + # Install build deps into temporary directory (PEP 518) + with req.build_env: + return _build_one_inside_env( + req, output_dir, build_options, global_options + ) + + +def _build_one_inside_env( + req, # type: InstallRequirement + output_dir, # type: str + build_options, # type: List[str] + global_options, # type: List[str] +): + # type: (...) -> Optional[str] + with TempDirectory(kind="wheel") as temp_dir: + if req.use_pep517: + wheel_path = build_wheel_pep517( + name=req.name, + backend=req.pep517_backend, + metadata_directory=req.metadata_directory, + build_options=build_options, + tempd=temp_dir.path, + ) + else: + wheel_path = build_wheel_legacy( + name=req.name, + setup_py_path=req.setup_py_path, + source_dir=req.unpacked_source_directory, + global_options=global_options, + build_options=build_options, + tempd=temp_dir.path, + ) + + if wheel_path is not None: + wheel_name = os.path.basename(wheel_path) + dest_path = os.path.join(output_dir, wheel_name) + try: + wheel_hash, length = hash_file(wheel_path) + shutil.move(wheel_path, dest_path) + logger.info('Created wheel for %s: ' + 'filename=%s size=%d sha256=%s', + req.name, wheel_name, length, + wheel_hash.hexdigest()) + logger.info('Stored in directory: %s', output_dir) + return dest_path + except Exception as e: + logger.warning( + "Building wheel for %s failed: %s", + req.name, e, + ) + # Ignore return, we can't do anything else useful. + if not req.use_pep517: + _clean_one_legacy(req, global_options) + return None + + +def _clean_one_legacy(req, global_options): + # type: (InstallRequirement, List[str]) -> bool + clean_args = make_setuptools_clean_args( + req.setup_py_path, + global_options=global_options, + ) + + logger.info('Running setup.py clean for %s', req.name) + try: + call_subprocess(clean_args, cwd=req.source_dir) + return True + except Exception: + logger.error('Failed cleaning build dir for %s', req.name) + return False + + +def build( + requirements, # type: Iterable[InstallRequirement] + wheel_cache, # type: WheelCache + build_options, # type: List[str] + global_options, # type: List[str] +): + # type: (...) -> BuildResult + """Build wheels. + + :return: The list of InstallRequirement that succeeded to build and + the list of InstallRequirement that failed to build. + """ + if not requirements: + return [], [] + + # Build the wheels. + logger.info( + 'Building wheels for collected packages: %s', + ', '.join(req.name for req in requirements), + ) + + with indent_log(): + build_successes, build_failures = [], [] + for req in requirements: + cache_dir = _get_cache_dir(req, wheel_cache) + wheel_file = _build_one( + req, cache_dir, build_options, global_options + ) + if wheel_file: + # Update the link for this. + req.link = Link(path_to_url(wheel_file)) + req.local_file_path = req.link.file_path + assert req.link.is_wheel + build_successes.append(req) + else: + build_failures.append(req) + + # notify success/failure + if build_successes: + logger.info( + 'Successfully built %s', + ' '.join([req.name for req in build_successes]), + ) + if build_failures: + logger.info( + 'Failed to build %s', + ' '.join([req.name for req in build_failures]), + ) + # Return a list of requirements that failed to build + return build_successes, build_failures diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/wheel_builder 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/wheel_builder 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0a2edc0904da158d198717fff1f250efdcfca0ba GIT binary patch literal 8730 zcmc&(OLH98bv`{000ZJBfDlE2vYL`04McK4Qg2#vi7#2QWk_mJAvKZI)tGJ!8tBKc zZx2bR$W5qKToqMi;qoq7+Z=_%=+vgH$!JSXXC>7KUb8A+a(bVa%=wmd7z z8A)G|?hE2Xr=|E#S3D=l&m?_Ox-UxVO4pV2taQ&x`jT{ClJsTizAWi0(tSnJRq3wU zndT*VRnpg_`R`hlvQx-v)7w$Hmtzn#m zan^V5??h2z-0dPy-A^)821(*YcZYEirBPOz&UE~L__xt^FiT1K`ZUh=Y-tfCoyXTn z{6RE$>(V<KX4XZS85WTr#zomeaVIc4{&t*1C0`Vq z>MgNdWE9%To=006>_xtb%Hg2Q^ThbQBnmP=DEh|snMa=%aEBFE=(m+4!ZM>jc^cLAm3Xxj!rtTgffl>zVc> zeoGdvX8Yw7ey`)L!4|f_!Y5@^Xu%$%DYf>qK^f;+kdz$!c~GKLRyL8pH5??7ou8+3 zn-_IGz&+YJF7hcC_A^ws|1r4m-Ng&<`JHdhtz9@MojrE}6+K{s@ZmzQ<1tG}N|A>U zTSp!W#TNfJ^*v@6jW;5!Dvh&<;!^HJg^R?6JW+y@Jl`{J67NNBkhxL6@5kA8-kF|u z@$bqYD1y{ASKM0%Bg))GwTU|J%}&1qdCV_d?p)ITZ7xjZYztRePH=fq0O_?2ltNR^ zAoWKt@{6dAvS?zUeX>3%;(I|Et=|iZ_3bKGo( zxU(Lz1u2EALxZ>CEGXj0RHMV#P^Uue7MGni6;$B_S3<73wDqTRJ zepIN$QEWAn1!<(2Tg5QaxrQdH;LW2*>NHUpm#WUxPLmIdo?@59vpVXE=&laVqA0ZB zRh~pOG`P3t>o)d%;6r{NScdxJlVHN2Z?Do&KQR+r*m6uJ}wt9(;tKx3e<|D^V5cT&u+sv=Zzw>26tjq{X8=;IIotNyTRCq^A+ zG&4y=E&f@`S%BX7y}NUS(XVUr2>>Dvx@DnzM049~ zIv2Q;8;*>2=vIjA5{V2Ecm&uTyAM^w1#HVZ$7GEOMNdI60pU}q1a5-lcrUYI4#`zx zfSe#NH;W=KyjM7i>RVF#`%&p{1--o}3sqGNwgptBI#k)y$YRPkO^1r3Fy!}q1;>0? zDvJWYvY;@dt(lQCqGrIP=c3Gvll{4ZtdMjk@9oH%TnGj>mk8WK7a1<}lw%86d&HSqiGshuyl$ zctcg8F4>~;y5^C}hxHM=3o&aY#-wxyBI&|OC_#<$A}IDNtl&(D`IV4yr*V?++OD+)A!!tww^&kfl*>jV5Q7?=h<|sYKjJspQ9aqBm}A@ zzRnEY9lc|$EZ)1QJ6>U+()irxc>6z~#*jbA)V#CkEY}t-V2%u`-aN$sH*fj4^~6*y ztRKLx{;}>$@#5dG49jJ&?o#7TfaDszTQ|4< zN|cOzkwPi0bw%h{lIOYk_JJH*;(DI4zroS*K^q7rP&W##I2(8LmNA2^cxu({3i$3u zo4Doa_0hTeY|{cIwO_rx`$3Umyyvol-S|@VeU*jzQFgCfMztknJ{sYMm^h5s(&hogi1=(kNQ@lYA>k{81If=9nEPF8g3>|ACS@i9}A+ojE`v+2w4l zS)azQiWHHaNTDK?V*^kM8`63#&JSHm5hVpc_yy@iXn_ziW$WQkSrkN&Yk~q4LYNSm znSj}EK59z#9&hDf)RfLPC84DkEeWS7b5D$&z}SbFQ)I6t#m5dT66V|m)qv*)oSu-X zW>y6kuLHlBl>M)1MQxw2Q8OivS|lC23#@#o9K``L?k-9=;x7-eZmb5BXNg?paT6M0 zd*E##lkgKUaP#)vkDUg54Qkg7$9XhuyDdwICE$c`Fknj1F7&$t$I_mf2^?5%suvW? zdYsr3^h>B;#2@0OL9 zXV}Ic>?^ce4)GDI-#~I5Zej^@V)+llR;vgkj5POyRpXlYyXb?}5PoQI`K`B6V`win z$24pFYU<-pQrb2r@Q7UAOH8OIc7NQx4RMXQhNm{U!Foi5Jeq2614&70Gt360KcRo% z8dj%pm0j35H|j`|t&CmH-8{}bs zS^Q2_ICQe!LP<#(jSTO{q7X79WePjAUG(T2P_xRK*$@j%8T4s?g|biFvA_f%a2#5+ z&D+^3tl^aE>#nd8wh(wT!Yz)*Id57m|`!M*z+ z{pk6T8Zg_=5o#ky>Z;BfI`OE+D#ZuFrtDU}skKXzJ;;|;CR_E2%mvG%nxa3)+YGNqbT(w^A9q2x8)+|UL^i&x5-^69Z zz*wt;h#ju-d+l@sNYDSgDZr=55C1NX9ae)~f{A$WTTXW4o5yMqaJ9g49ROQExj+&2 zXhdsZ4gmAT9|;2x5#;R)(9K5^?2Gk#QG`{p#S>!wzyJ!JWY{%eJw*&C{{=0|k@D@^ z5Uwxopj+{*Q|(F3BKCw;qyEM>^IRyWo|A8Da`!Kz{n21FrPvsagUv)IJFfZUxXVs; zE*yt#H}xEq8kyhYs4Z7hc)`~O^+&H9CTa;>WRkR}c-7@jP`YN=>%r%!ybdLP@QQUF z2B7Jq{JkkGvs15y<132y`e<=uiigi6utB{%Nr2>dApt%B{;F{ypr3bpv=_|sF?^mw zf{XuVt_n=-iu{9f7d+xejNU~*8|3ED&P7G(V}(ycZFs*QWzmB{@ry<5ObPykY#6fA zO&+{4+ruP5D3@*^Y%Dmvh->(9qJkSn8}wFIO`C4nAy~P^BJtGwfXT;9@Q9~YO5Hy$ zfd=2&8jeqLe9F=9LY6Wp26oV(rY9H-5OGkzYICf{6A_3Vf6(&yIqZ<#qpK zz_87Y>nIucCS|P2qz8G(-f>;WdO-@mx_Cxk&6`-B%uG1bFl=?_c@XDW{LRy(A#l5l z986p76k6H7R;zyNZJs_r27JK}^PcZ(o`G>lzUFh&QHI0YQRY%a-j~di=-?AcXZ(4j zljb45CwA08<~zSzN5;oOshQi6MI*DMmblx^28vrCM?2kK}D>j z9v)qX?Ucr*r#_mpE*su|a?Q4{+F1LIQCF_UvLq>c+RO)E8`XA}G?7p1H=fki5~O{(4JDN+w4q z>M=s;on#|*?`R`bt%HYts(wl)P}r~!V?WpU?PmX~{pRsGLZNXF1YbjV*N72bWQK`l zvj~%XYCp}8clbV;r|&Cxs7NB#Jb?Zw-h84lK^rkAYTGC#BTE)o)|gXtpXDfz&iPNrux+q6!*;ra`+0fQk!qAv|4Me TR%^QTa%-X0Y^}5|wHE##tzj|G literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/wheel_builder.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/wheel_builder.py new file mode 100644 index 0000000..7c7820d --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/wheel_builder.py @@ -0,0 +1,305 @@ +"""Orchestrator for building wheels from InstallRequirements. +""" + +# The following comment should be removed at some point in the future. +# mypy: strict-optional=False + +import logging +import os.path +import re +import shutil + +from pip._internal.models.link import Link +from pip._internal.operations.build.wheel import build_wheel_pep517 +from pip._internal.operations.build.wheel_legacy import build_wheel_legacy +from pip._internal.utils.logging import indent_log +from pip._internal.utils.misc import ensure_dir, hash_file, is_wheel_installed +from pip._internal.utils.setuptools_build import make_setuptools_clean_args +from pip._internal.utils.subprocess import call_subprocess +from pip._internal.utils.temp_dir import TempDirectory +from pip._internal.utils.typing import MYPY_CHECK_RUNNING +from pip._internal.utils.urls import path_to_url +from pip._internal.vcs import vcs + +if MYPY_CHECK_RUNNING: + from typing import ( + Any, Callable, Iterable, List, Optional, Pattern, Tuple, + ) + + from pip._internal.cache import WheelCache + from pip._internal.req.req_install import InstallRequirement + + BinaryAllowedPredicate = Callable[[InstallRequirement], bool] + BuildResult = Tuple[List[InstallRequirement], List[InstallRequirement]] + +logger = logging.getLogger(__name__) + + +def _contains_egg_info( + s, _egg_info_re=re.compile(r'([a-z0-9_.]+)-([a-z0-9_.!+-]+)', re.I)): + # type: (str, Pattern[str]) -> bool + """Determine whether the string looks like an egg_info. + + :param s: The string to parse. E.g. foo-2.1 + """ + return bool(_egg_info_re.search(s)) + + +def _should_build( + req, # type: InstallRequirement + need_wheel, # type: bool + check_binary_allowed, # type: BinaryAllowedPredicate +): + # type: (...) -> bool + """Return whether an InstallRequirement should be built into a wheel.""" + if req.constraint: + # never build requirements that are merely constraints + return False + if req.is_wheel: + if need_wheel: + logger.info( + 'Skipping %s, due to already being wheel.', req.name, + ) + return False + + if need_wheel: + # i.e. pip wheel, not pip install + return True + + # From this point, this concerns the pip install command only + # (need_wheel=False). + + if not req.use_pep517 and not is_wheel_installed(): + # we don't build legacy requirements if wheel is not installed + return False + + if req.editable or not req.source_dir: + return False + + if not check_binary_allowed(req): + logger.info( + "Skipping wheel build for %s, due to binaries " + "being disabled for it.", req.name, + ) + return False + + return True + + +def should_build_for_wheel_command( + req, # type: InstallRequirement +): + # type: (...) -> bool + return _should_build( + req, need_wheel=True, check_binary_allowed=_always_true + ) + + +def should_build_for_install_command( + req, # type: InstallRequirement + check_binary_allowed, # type: BinaryAllowedPredicate +): + # type: (...) -> bool + return _should_build( + req, need_wheel=False, check_binary_allowed=check_binary_allowed + ) + + +def _should_cache( + req, # type: InstallRequirement +): + # type: (...) -> Optional[bool] + """ + Return whether a built InstallRequirement can be stored in the persistent + wheel cache, assuming the wheel cache is available, and _should_build() + has determined a wheel needs to be built. + """ + if not should_build_for_install_command( + req, check_binary_allowed=_always_true + ): + # never cache if pip install would not have built + # (editable mode, etc) + return False + + if req.link and req.link.is_vcs: + # VCS checkout. Do not cache + # unless it points to an immutable commit hash. + assert not req.editable + assert req.source_dir + vcs_backend = vcs.get_backend_for_scheme(req.link.scheme) + assert vcs_backend + if vcs_backend.is_immutable_rev_checkout(req.link.url, req.source_dir): + return True + return False + + base, ext = req.link.splitext() + if _contains_egg_info(base): + return True + + # Otherwise, do not cache. + return False + + +def _get_cache_dir( + req, # type: InstallRequirement + wheel_cache, # type: WheelCache +): + # type: (...) -> str + """Return the persistent or temporary cache directory where the built + wheel need to be stored. + """ + cache_available = bool(wheel_cache.cache_dir) + if cache_available and _should_cache(req): + cache_dir = wheel_cache.get_path_for_link(req.link) + else: + cache_dir = wheel_cache.get_ephem_path_for_link(req.link) + return cache_dir + + +def _always_true(_): + # type: (Any) -> bool + return True + + +def _build_one( + req, # type: InstallRequirement + output_dir, # type: str + build_options, # type: List[str] + global_options, # type: List[str] +): + # type: (...) -> Optional[str] + """Build one wheel. + + :return: The filename of the built wheel, or None if the build failed. + """ + try: + ensure_dir(output_dir) + except OSError as e: + logger.warning( + "Building wheel for %s failed: %s", + req.name, e, + ) + return None + + # Install build deps into temporary directory (PEP 518) + with req.build_env: + return _build_one_inside_env( + req, output_dir, build_options, global_options + ) + + +def _build_one_inside_env( + req, # type: InstallRequirement + output_dir, # type: str + build_options, # type: List[str] + global_options, # type: List[str] +): + # type: (...) -> Optional[str] + with TempDirectory(kind="wheel") as temp_dir: + if req.use_pep517: + wheel_path = build_wheel_pep517( + name=req.name, + backend=req.pep517_backend, + metadata_directory=req.metadata_directory, + build_options=build_options, + tempd=temp_dir.path, + ) + else: + wheel_path = build_wheel_legacy( + name=req.name, + setup_py_path=req.setup_py_path, + source_dir=req.unpacked_source_directory, + global_options=global_options, + build_options=build_options, + tempd=temp_dir.path, + ) + + if wheel_path is not None: + wheel_name = os.path.basename(wheel_path) + dest_path = os.path.join(output_dir, wheel_name) + try: + wheel_hash, length = hash_file(wheel_path) + shutil.move(wheel_path, dest_path) + logger.info('Created wheel for %s: ' + 'filename=%s size=%d sha256=%s', + req.name, wheel_name, length, + wheel_hash.hexdigest()) + logger.info('Stored in directory: %s', output_dir) + return dest_path + except Exception as e: + logger.warning( + "Building wheel for %s failed: %s", + req.name, e, + ) + # Ignore return, we can't do anything else useful. + if not req.use_pep517: + _clean_one_legacy(req, global_options) + return None + + +def _clean_one_legacy(req, global_options): + # type: (InstallRequirement, List[str]) -> bool + clean_args = make_setuptools_clean_args( + req.setup_py_path, + global_options=global_options, + ) + + logger.info('Running setup.py clean for %s', req.name) + try: + call_subprocess(clean_args, cwd=req.source_dir) + return True + except Exception: + logger.error('Failed cleaning build dir for %s', req.name) + return False + + +def build( + requirements, # type: Iterable[InstallRequirement] + wheel_cache, # type: WheelCache + build_options, # type: List[str] + global_options, # type: List[str] +): + # type: (...) -> BuildResult + """Build wheels. + + :return: The list of InstallRequirement that succeeded to build and + the list of InstallRequirement that failed to build. + """ + if not requirements: + return [], [] + + # Build the wheels. + logger.info( + 'Building wheels for collected packages: %s', + ', '.join(req.name for req in requirements), + ) + + with indent_log(): + build_successes, build_failures = [], [] + for req in requirements: + cache_dir = _get_cache_dir(req, wheel_cache) + wheel_file = _build_one( + req, cache_dir, build_options, global_options + ) + if wheel_file: + # Update the link for this. + req.link = Link(path_to_url(wheel_file)) + req.local_file_path = req.link.file_path + assert req.link.is_wheel + build_successes.append(req) + else: + build_failures.append(req) + + # notify success/failure + if build_successes: + logger.info( + 'Successfully built %s', + ' '.join([req.name for req in build_successes]), + ) + if build_failures: + logger.info( + 'Failed to build %s', + ' '.join([req.name for req in build_failures]), + ) + # Return a list of requirements that failed to build + return build_successes, build_failures diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/wheel_builder.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_internal/wheel_builder.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4a3d4d4c5daadbffbc7577a1b2895b4ae9374e05 GIT binary patch literal 8730 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 TR%^EPW^1X{Y@KUeZ7ux|6=p5U literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/__init__.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/__init__.py new file mode 100644 index 0000000..a0fcb8e --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/__init__.py @@ -0,0 +1,109 @@ +""" +pip._vendor is for vendoring dependencies of pip to prevent needing pip to +depend on something external. + +Files inside of pip._vendor should be considered immutable and should only be +updated to versions from upstream. +""" +from __future__ import absolute_import + +import glob +import os.path +import sys + +# Downstream redistributors which have debundled our dependencies should also +# patch this value to be true. This will trigger the additional patching +# to cause things like "six" to be available as pip. +DEBUNDLED = False + +# By default, look in this directory for a bunch of .whl files which we will +# add to the beginning of sys.path before attempting to import anything. This +# is done to support downstream re-distributors like Debian and Fedora who +# wish to create their own Wheels for our dependencies to aid in debundling. +WHEEL_DIR = os.path.abspath(os.path.dirname(__file__)) + + +# Define a small helper function to alias our vendored modules to the real ones +# if the vendored ones do not exist. This idea of this was taken from +# https://github.com/kennethreitz/requests/pull/2567. +def vendored(modulename): + vendored_name = "{0}.{1}".format(__name__, modulename) + + try: + __import__(modulename, globals(), locals(), level=0) + except ImportError: + # We can just silently allow import failures to pass here. If we + # got to this point it means that ``import pip._vendor.whatever`` + # failed and so did ``import whatever``. Since we're importing this + # upfront in an attempt to alias imports, not erroring here will + # just mean we get a regular import error whenever pip *actually* + # tries to import one of these modules to use it, which actually + # gives us a better error message than we would have otherwise + # gotten. + pass + else: + sys.modules[vendored_name] = sys.modules[modulename] + base, head = vendored_name.rsplit(".", 1) + setattr(sys.modules[base], head, sys.modules[modulename]) + + +# If we're operating in a debundled setup, then we want to go ahead and trigger +# the aliasing of our vendored libraries as well as looking for wheels to add +# to our sys.path. This will cause all of this code to be a no-op typically +# however downstream redistributors can enable it in a consistent way across +# all platforms. +if DEBUNDLED: + # Actually look inside of WHEEL_DIR to find .whl files and add them to the + # front of our sys.path. + sys.path[:] = glob.glob(os.path.join(WHEEL_DIR, "*.whl")) + sys.path + + # Actually alias all of our vendored dependencies. + vendored("cachecontrol") + vendored("colorama") + vendored("contextlib2") + vendored("distlib") + vendored("distro") + vendored("html5lib") + vendored("six") + vendored("six.moves") + vendored("six.moves.urllib") + vendored("six.moves.urllib.parse") + vendored("packaging") + vendored("packaging.version") + vendored("packaging.specifiers") + vendored("pep517") + vendored("pkg_resources") + vendored("progress") + vendored("pytoml") + vendored("retrying") + vendored("requests") + vendored("requests.exceptions") + vendored("requests.packages") + vendored("requests.packages.urllib3") + vendored("requests.packages.urllib3._collections") + vendored("requests.packages.urllib3.connection") + vendored("requests.packages.urllib3.connectionpool") + vendored("requests.packages.urllib3.contrib") + vendored("requests.packages.urllib3.contrib.ntlmpool") + vendored("requests.packages.urllib3.contrib.pyopenssl") + vendored("requests.packages.urllib3.exceptions") + vendored("requests.packages.urllib3.fields") + vendored("requests.packages.urllib3.filepost") + vendored("requests.packages.urllib3.packages") + vendored("requests.packages.urllib3.packages.ordered_dict") + vendored("requests.packages.urllib3.packages.six") + vendored("requests.packages.urllib3.packages.ssl_match_hostname") + vendored("requests.packages.urllib3.packages.ssl_match_hostname." + "_implementation") + vendored("requests.packages.urllib3.poolmanager") + vendored("requests.packages.urllib3.request") + vendored("requests.packages.urllib3.response") + vendored("requests.packages.urllib3.util") + vendored("requests.packages.urllib3.util.connection") + vendored("requests.packages.urllib3.util.request") + vendored("requests.packages.urllib3.util.response") + vendored("requests.packages.urllib3.util.retry") + vendored("requests.packages.urllib3.util.ssl_") + vendored("requests.packages.urllib3.util.timeout") + vendored("requests.packages.urllib3.util.url") + vendored("urllib3") diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/__init__.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9906532b10e970e2834de69774a8a89282b5b70e GIT binary patch literal 3392 zcmcgu>v9t}6h7-soWu|amja=ME_VZEoe%2znkE882it3{GS zT*$BV5&A-XkG@4;pr5q1NT(e;)9KU~?I-Ee(b2hS{Xdo)`@enuQ$pj<9G=gf5vhY3 zQA*T7>rq-G?onQ&PK`X%_lf(|@$DS&9ChX=xK5oqu?6ZZ5}T*pCE9IFzzJd}>CiL3 z&N8KQ^b0mPMQoAesK$KS^(V~J#6Xy*!D%UGgrfQ#O{2`pFxq29DrAtUpod4*%Zh%GvJx|_NHV4Z(F;HhvbT2U z5Ep4Mrig-%z-tW4G}a(NojoR1hGjudiaZ#WN=p{!VI#x&sOh26r_sb+CHPRYD9cMB z^>$)rOitGE|LPeG@+$x`a2E?adQT=p4m=tKq-&5nP$aS}y`dQ4!}XinN)G#s)ywNbGab zjk&T*xJV2P04v>jGVV=vh>_O!cHJhQD{##j|o zEVYWjghbsKYYZ5$IBnudwo!ecRw=VRxVNI zF?x7sYrYqF%S&^$^WG&-8C%~A-wwDw36#XifFVk?6x<3(1Q#-fsg2pp1Y(|N-G|mL zX{Joan#*7*?3#hj`KB4Srp@-%64t70Kg`7*Q&tVv3x|?}sxBO*j0eLqmN27PUB=1l zxR0DuXO8y5Np_t7%cv?@lJzp!)v8vqa&!HO^;G$~A4#UfP$qD*iJnr5K1RmOkrsJ% zaLKeBVM9xj?9C8-rOsi+q!Y6Jgq7MPr`5`hSIR=>>QVM&bbPoCb$i-u7{T(KC6)M_ zQ>k!EF=m=5`D=aiePC@AXW6{fzK=Dryp+JqJgi4;cmr&*$Bc-5^z0;tX7iHDUUBw#X#2GHFU z9o7D~D??KrIm>au#Wu8VO_v0Z=5Z1CkxJ8}WfFALEsI1ekuFSKox1H%XI$N#NjVbF zGt6!Th7%R<%ognQoF1KHu_zSk#%!U+kH^tdXE_tYSwU*|M)9O;h3RKoq4S zaaUq*sD~0a|8dn>h*9=`MS`qlc<<+^{@Z+QR7xAxCc{sd2+lYIaH literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/appdirs.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/appdirs.py new file mode 100644 index 0000000..3a52b75 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/appdirs.py @@ -0,0 +1,639 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# Copyright (c) 2005-2010 ActiveState Software Inc. +# Copyright (c) 2013 Eddy Petrișor + +"""Utilities for determining application-specific dirs. + +See for details and usage. +""" +# Dev Notes: +# - MSDN on where to store app data files: +# http://support.microsoft.com/default.aspx?scid=kb;en-us;310294#XSLTH3194121123120121120120 +# - Mac OS X: http://developer.apple.com/documentation/MacOSX/Conceptual/BPFileSystem/index.html +# - XDG spec for Un*x: http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html + +__version_info__ = (1, 4, 3) +__version__ = '.'.join(map(str, __version_info__)) + + +import sys +import os + +PY3 = sys.version_info[0] == 3 + +if PY3: + unicode = str + +if sys.platform.startswith('java'): + import platform + os_name = platform.java_ver()[3][0] + if os_name.startswith('Windows'): # "Windows XP", "Windows 7", etc. + system = 'win32' + elif os_name.startswith('Mac'): # "Mac OS X", etc. + system = 'darwin' + else: # "Linux", "SunOS", "FreeBSD", etc. + # Setting this to "linux2" is not ideal, but only Windows or Mac + # are actually checked for and the rest of the module expects + # *sys.platform* style strings. + system = 'linux2' +elif sys.platform == 'cli' and os.name == 'nt': + # Detect Windows in IronPython to match pip._internal.utils.compat.WINDOWS + # Discussion: + system = 'win32' +else: + system = sys.platform + + + +def user_data_dir(appname=None, appauthor=None, version=None, roaming=False): + r"""Return full path to the user-specific data dir for this application. + + "appname" is the name of application. + If None, just the system directory is returned. + "appauthor" (only used on Windows) is the name of the + appauthor or distributing body for this application. Typically + it is the owning company name. This falls back to appname. You may + pass False to disable it. + "version" is an optional version path element to append to the + path. You might want to use this if you want multiple versions + of your app to be able to run independently. If used, this + would typically be ".". + Only applied when appname is present. + "roaming" (boolean, default False) can be set True to use the Windows + roaming appdata directory. That means that for users on a Windows + network setup for roaming profiles, this user data will be + sync'd on login. See + + for a discussion of issues. + + Typical user data directories are: + Mac OS X: ~/Library/Application Support/ # or ~/.config/, if the other does not exist + Unix: ~/.local/share/ # or in $XDG_DATA_HOME, if defined + Win XP (not roaming): C:\Documents and Settings\\Application Data\\ + Win XP (roaming): C:\Documents and Settings\\Local Settings\Application Data\\ + Win 7 (not roaming): C:\Users\\AppData\Local\\ + Win 7 (roaming): C:\Users\\AppData\Roaming\\ + + For Unix, we follow the XDG spec and support $XDG_DATA_HOME. + That means, by default "~/.local/share/". + """ + if system == "win32": + if appauthor is None: + appauthor = appname + const = roaming and "CSIDL_APPDATA" or "CSIDL_LOCAL_APPDATA" + path = os.path.normpath(_get_win_folder(const)) + if appname: + if appauthor is not False: + path = os.path.join(path, appauthor, appname) + else: + path = os.path.join(path, appname) + elif system == 'darwin': + path = os.path.expanduser('~/Library/Application Support/') + if appname: + path = os.path.join(path, appname) + if not os.path.isdir(path): + path = os.path.expanduser('~/.config/') + if appname: + path = os.path.join(path, appname) + else: + path = os.getenv('XDG_DATA_HOME', os.path.expanduser("~/.local/share")) + if appname: + path = os.path.join(path, appname) + if appname and version: + path = os.path.join(path, version) + return path + + +def site_data_dir(appname=None, appauthor=None, version=None, multipath=False): + r"""Return full path to the user-shared data dir for this application. + + "appname" is the name of application. + If None, just the system directory is returned. + "appauthor" (only used on Windows) is the name of the + appauthor or distributing body for this application. Typically + it is the owning company name. This falls back to appname. You may + pass False to disable it. + "version" is an optional version path element to append to the + path. You might want to use this if you want multiple versions + of your app to be able to run independently. If used, this + would typically be ".". + Only applied when appname is present. + "multipath" is an optional parameter only applicable to *nix + which indicates that the entire list of data dirs should be + returned. By default, the first item from XDG_DATA_DIRS is + returned, or '/usr/local/share/', + if XDG_DATA_DIRS is not set + + Typical site data directories are: + Mac OS X: /Library/Application Support/ + Unix: /usr/local/share/ or /usr/share/ + Win XP: C:\Documents and Settings\All Users\Application Data\\ + Vista: (Fail! "C:\ProgramData" is a hidden *system* directory on Vista.) + Win 7: C:\ProgramData\\ # Hidden, but writeable on Win 7. + + For Unix, this is using the $XDG_DATA_DIRS[0] default. + + WARNING: Do not use this on Windows. See the Vista-Fail note above for why. + """ + if system == "win32": + if appauthor is None: + appauthor = appname + path = os.path.normpath(_get_win_folder("CSIDL_COMMON_APPDATA")) + if appname: + if appauthor is not False: + path = os.path.join(path, appauthor, appname) + else: + path = os.path.join(path, appname) + elif system == 'darwin': + path = os.path.expanduser('/Library/Application Support') + if appname: + path = os.path.join(path, appname) + else: + # XDG default for $XDG_DATA_DIRS + # only first, if multipath is False + path = os.getenv('XDG_DATA_DIRS', + os.pathsep.join(['/usr/local/share', '/usr/share'])) + pathlist = [os.path.expanduser(x.rstrip(os.sep)) for x in path.split(os.pathsep)] + if appname: + if version: + appname = os.path.join(appname, version) + pathlist = [os.path.join(x, appname) for x in pathlist] + + if multipath: + path = os.pathsep.join(pathlist) + else: + path = pathlist[0] + return path + + if appname and version: + path = os.path.join(path, version) + return path + + +def user_config_dir(appname=None, appauthor=None, version=None, roaming=False): + r"""Return full path to the user-specific config dir for this application. + + "appname" is the name of application. + If None, just the system directory is returned. + "appauthor" (only used on Windows) is the name of the + appauthor or distributing body for this application. Typically + it is the owning company name. This falls back to appname. You may + pass False to disable it. + "version" is an optional version path element to append to the + path. You might want to use this if you want multiple versions + of your app to be able to run independently. If used, this + would typically be ".". + Only applied when appname is present. + "roaming" (boolean, default False) can be set True to use the Windows + roaming appdata directory. That means that for users on a Windows + network setup for roaming profiles, this user data will be + sync'd on login. See + + for a discussion of issues. + + Typical user config directories are: + Mac OS X: same as user_data_dir + Unix: ~/.config/ # or in $XDG_CONFIG_HOME, if defined + Win *: same as user_data_dir + + For Unix, we follow the XDG spec and support $XDG_CONFIG_HOME. + That means, by default "~/.config/". + """ + if system in ["win32", "darwin"]: + path = user_data_dir(appname, appauthor, None, roaming) + else: + path = os.getenv('XDG_CONFIG_HOME', os.path.expanduser("~/.config")) + if appname: + path = os.path.join(path, appname) + if appname and version: + path = os.path.join(path, version) + return path + + +# for the discussion regarding site_config_dir locations +# see +def site_config_dir(appname=None, appauthor=None, version=None, multipath=False): + r"""Return full path to the user-shared data dir for this application. + + "appname" is the name of application. + If None, just the system directory is returned. + "appauthor" (only used on Windows) is the name of the + appauthor or distributing body for this application. Typically + it is the owning company name. This falls back to appname. You may + pass False to disable it. + "version" is an optional version path element to append to the + path. You might want to use this if you want multiple versions + of your app to be able to run independently. If used, this + would typically be ".". + Only applied when appname is present. + "multipath" is an optional parameter only applicable to *nix + which indicates that the entire list of config dirs should be + returned. By default, the first item from XDG_CONFIG_DIRS is + returned, or '/etc/xdg/', if XDG_CONFIG_DIRS is not set + + Typical site config directories are: + Mac OS X: same as site_data_dir + Unix: /etc/xdg/ or $XDG_CONFIG_DIRS[i]/ for each value in + $XDG_CONFIG_DIRS + Win *: same as site_data_dir + Vista: (Fail! "C:\ProgramData" is a hidden *system* directory on Vista.) + + For Unix, this is using the $XDG_CONFIG_DIRS[0] default, if multipath=False + + WARNING: Do not use this on Windows. See the Vista-Fail note above for why. + """ + if system in ["win32", "darwin"]: + path = site_data_dir(appname, appauthor) + if appname and version: + path = os.path.join(path, version) + else: + # XDG default for $XDG_CONFIG_DIRS (missing or empty) + # see + # only first, if multipath is False + path = os.getenv('XDG_CONFIG_DIRS') or '/etc/xdg' + pathlist = [os.path.expanduser(x.rstrip(os.sep)) for x in path.split(os.pathsep) if x] + if appname: + if version: + appname = os.path.join(appname, version) + pathlist = [os.path.join(x, appname) for x in pathlist] + # always look in /etc directly as well + pathlist.append('/etc') + + if multipath: + path = os.pathsep.join(pathlist) + else: + path = pathlist[0] + return path + + +def user_cache_dir(appname=None, appauthor=None, version=None, opinion=True): + r"""Return full path to the user-specific cache dir for this application. + + "appname" is the name of application. + If None, just the system directory is returned. + "appauthor" (only used on Windows) is the name of the + appauthor or distributing body for this application. Typically + it is the owning company name. This falls back to appname. You may + pass False to disable it. + "version" is an optional version path element to append to the + path. You might want to use this if you want multiple versions + of your app to be able to run independently. If used, this + would typically be ".". + Only applied when appname is present. + "opinion" (boolean) can be False to disable the appending of + "Cache" to the base app data dir for Windows. See + discussion below. + + Typical user cache directories are: + Mac OS X: ~/Library/Caches/ + Unix: ~/.cache/ (XDG default) + Win XP: C:\Documents and Settings\\Local Settings\Application Data\\\Cache + Vista: C:\Users\\AppData\Local\\\Cache + + On Windows the only suggestion in the MSDN docs is that local settings go in + the `CSIDL_LOCAL_APPDATA` directory. This is identical to the non-roaming + app data dir (the default returned by `user_data_dir` above). Apps typically + put cache data somewhere *under* the given dir here. Some examples: + ...\Mozilla\Firefox\Profiles\\Cache + ...\Acme\SuperApp\Cache\1.0 + OPINION: This function appends "Cache" to the `CSIDL_LOCAL_APPDATA` value. + This can be disabled with the `opinion=False` option. + """ + if system == "win32": + if appauthor is None: + appauthor = appname + path = os.path.normpath(_get_win_folder("CSIDL_LOCAL_APPDATA")) + # When using Python 2, return paths as bytes on Windows like we do on + # other operating systems. See helper function docs for more details. + if not PY3 and isinstance(path, unicode): + path = _win_path_to_bytes(path) + if appname: + if appauthor is not False: + path = os.path.join(path, appauthor, appname) + else: + path = os.path.join(path, appname) + if opinion: + path = os.path.join(path, "Cache") + elif system == 'darwin': + path = os.path.expanduser('~/Library/Caches') + if appname: + path = os.path.join(path, appname) + else: + path = os.getenv('XDG_CACHE_HOME', os.path.expanduser('~/.cache')) + if appname: + path = os.path.join(path, appname) + if appname and version: + path = os.path.join(path, version) + return path + + +def user_state_dir(appname=None, appauthor=None, version=None, roaming=False): + r"""Return full path to the user-specific state dir for this application. + + "appname" is the name of application. + If None, just the system directory is returned. + "appauthor" (only used on Windows) is the name of the + appauthor or distributing body for this application. Typically + it is the owning company name. This falls back to appname. You may + pass False to disable it. + "version" is an optional version path element to append to the + path. You might want to use this if you want multiple versions + of your app to be able to run independently. If used, this + would typically be ".". + Only applied when appname is present. + "roaming" (boolean, default False) can be set True to use the Windows + roaming appdata directory. That means that for users on a Windows + network setup for roaming profiles, this user data will be + sync'd on login. See + + for a discussion of issues. + + Typical user state directories are: + Mac OS X: same as user_data_dir + Unix: ~/.local/state/ # or in $XDG_STATE_HOME, if defined + Win *: same as user_data_dir + + For Unix, we follow this Debian proposal + to extend the XDG spec and support $XDG_STATE_HOME. + + That means, by default "~/.local/state/". + """ + if system in ["win32", "darwin"]: + path = user_data_dir(appname, appauthor, None, roaming) + else: + path = os.getenv('XDG_STATE_HOME', os.path.expanduser("~/.local/state")) + if appname: + path = os.path.join(path, appname) + if appname and version: + path = os.path.join(path, version) + return path + + +def user_log_dir(appname=None, appauthor=None, version=None, opinion=True): + r"""Return full path to the user-specific log dir for this application. + + "appname" is the name of application. + If None, just the system directory is returned. + "appauthor" (only used on Windows) is the name of the + appauthor or distributing body for this application. Typically + it is the owning company name. This falls back to appname. You may + pass False to disable it. + "version" is an optional version path element to append to the + path. You might want to use this if you want multiple versions + of your app to be able to run independently. If used, this + would typically be ".". + Only applied when appname is present. + "opinion" (boolean) can be False to disable the appending of + "Logs" to the base app data dir for Windows, and "log" to the + base cache dir for Unix. See discussion below. + + Typical user log directories are: + Mac OS X: ~/Library/Logs/ + Unix: ~/.cache//log # or under $XDG_CACHE_HOME if defined + Win XP: C:\Documents and Settings\\Local Settings\Application Data\\\Logs + Vista: C:\Users\\AppData\Local\\\Logs + + On Windows the only suggestion in the MSDN docs is that local settings + go in the `CSIDL_LOCAL_APPDATA` directory. (Note: I'm interested in + examples of what some windows apps use for a logs dir.) + + OPINION: This function appends "Logs" to the `CSIDL_LOCAL_APPDATA` + value for Windows and appends "log" to the user cache dir for Unix. + This can be disabled with the `opinion=False` option. + """ + if system == "darwin": + path = os.path.join( + os.path.expanduser('~/Library/Logs'), + appname) + elif system == "win32": + path = user_data_dir(appname, appauthor, version) + version = False + if opinion: + path = os.path.join(path, "Logs") + else: + path = user_cache_dir(appname, appauthor, version) + version = False + if opinion: + path = os.path.join(path, "log") + if appname and version: + path = os.path.join(path, version) + return path + + +class AppDirs(object): + """Convenience wrapper for getting application dirs.""" + def __init__(self, appname=None, appauthor=None, version=None, + roaming=False, multipath=False): + self.appname = appname + self.appauthor = appauthor + self.version = version + self.roaming = roaming + self.multipath = multipath + + @property + def user_data_dir(self): + return user_data_dir(self.appname, self.appauthor, + version=self.version, roaming=self.roaming) + + @property + def site_data_dir(self): + return site_data_dir(self.appname, self.appauthor, + version=self.version, multipath=self.multipath) + + @property + def user_config_dir(self): + return user_config_dir(self.appname, self.appauthor, + version=self.version, roaming=self.roaming) + + @property + def site_config_dir(self): + return site_config_dir(self.appname, self.appauthor, + version=self.version, multipath=self.multipath) + + @property + def user_cache_dir(self): + return user_cache_dir(self.appname, self.appauthor, + version=self.version) + + @property + def user_state_dir(self): + return user_state_dir(self.appname, self.appauthor, + version=self.version) + + @property + def user_log_dir(self): + return user_log_dir(self.appname, self.appauthor, + version=self.version) + + +#---- internal support stuff + +def _get_win_folder_from_registry(csidl_name): + """This is a fallback technique at best. I'm not sure if using the + registry for this guarantees us the correct answer for all CSIDL_* + names. + """ + if PY3: + import winreg as _winreg + else: + import _winreg + + shell_folder_name = { + "CSIDL_APPDATA": "AppData", + "CSIDL_COMMON_APPDATA": "Common AppData", + "CSIDL_LOCAL_APPDATA": "Local AppData", + }[csidl_name] + + key = _winreg.OpenKey( + _winreg.HKEY_CURRENT_USER, + r"Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" + ) + dir, type = _winreg.QueryValueEx(key, shell_folder_name) + return dir + + +def _get_win_folder_with_pywin32(csidl_name): + from win32com.shell import shellcon, shell + dir = shell.SHGetFolderPath(0, getattr(shellcon, csidl_name), 0, 0) + # Try to make this a unicode path because SHGetFolderPath does + # not return unicode strings when there is unicode data in the + # path. + try: + dir = unicode(dir) + + # Downgrade to short path name if have highbit chars. See + # . + has_high_char = False + for c in dir: + if ord(c) > 255: + has_high_char = True + break + if has_high_char: + try: + import win32api + dir = win32api.GetShortPathName(dir) + except ImportError: + pass + except UnicodeError: + pass + return dir + + +def _get_win_folder_with_ctypes(csidl_name): + import ctypes + + csidl_const = { + "CSIDL_APPDATA": 26, + "CSIDL_COMMON_APPDATA": 35, + "CSIDL_LOCAL_APPDATA": 28, + }[csidl_name] + + buf = ctypes.create_unicode_buffer(1024) + ctypes.windll.shell32.SHGetFolderPathW(None, csidl_const, None, 0, buf) + + # Downgrade to short path name if have highbit chars. See + # . + has_high_char = False + for c in buf: + if ord(c) > 255: + has_high_char = True + break + if has_high_char: + buf2 = ctypes.create_unicode_buffer(1024) + if ctypes.windll.kernel32.GetShortPathNameW(buf.value, buf2, 1024): + buf = buf2 + + return buf.value + +def _get_win_folder_with_jna(csidl_name): + import array + from com.sun import jna + from com.sun.jna.platform import win32 + + buf_size = win32.WinDef.MAX_PATH * 2 + buf = array.zeros('c', buf_size) + shell = win32.Shell32.INSTANCE + shell.SHGetFolderPath(None, getattr(win32.ShlObj, csidl_name), None, win32.ShlObj.SHGFP_TYPE_CURRENT, buf) + dir = jna.Native.toString(buf.tostring()).rstrip("\0") + + # Downgrade to short path name if have highbit chars. See + # . + has_high_char = False + for c in dir: + if ord(c) > 255: + has_high_char = True + break + if has_high_char: + buf = array.zeros('c', buf_size) + kernel = win32.Kernel32.INSTANCE + if kernel.GetShortPathName(dir, buf, buf_size): + dir = jna.Native.toString(buf.tostring()).rstrip("\0") + + return dir + +if system == "win32": + try: + from ctypes import windll + _get_win_folder = _get_win_folder_with_ctypes + except ImportError: + try: + import com.sun.jna + _get_win_folder = _get_win_folder_with_jna + except ImportError: + _get_win_folder = _get_win_folder_from_registry + + +def _win_path_to_bytes(path): + """Encode Windows paths to bytes. Only used on Python 2. + + Motivation is to be consistent with other operating systems where paths + are also returned as bytes. This avoids problems mixing bytes and Unicode + elsewhere in the codebase. For more details and discussion see + . + + If encoding using ASCII and MBCS fails, return the original Unicode path. + """ + for encoding in ('ASCII', 'MBCS'): + try: + return path.encode(encoding) + except (UnicodeEncodeError, LookupError): + pass + return path + + +#---- self test code + +if __name__ == "__main__": + appname = "MyApp" + appauthor = "MyCompany" + + props = ("user_data_dir", + "user_config_dir", + "user_cache_dir", + "user_state_dir", + "user_log_dir", + "site_data_dir", + "site_config_dir") + + print("-- app dirs %s --" % __version__) + + print("-- app dirs (with optional 'version')") + dirs = AppDirs(appname, appauthor, version="1.0") + for prop in props: + print("%s: %s" % (prop, getattr(dirs, prop))) + + print("\n-- app dirs (without optional 'version')") + dirs = AppDirs(appname, appauthor) + for prop in props: + print("%s: %s" % (prop, getattr(dirs, prop))) + + print("\n-- app dirs (without optional 'appauthor')") + dirs = AppDirs(appname) + for prop in props: + print("%s: %s" % (prop, getattr(dirs, prop))) + + print("\n-- app dirs (with disabled 'appauthor')") + dirs = AppDirs(appname, appauthor=False) + for prop in props: + print("%s: %s" % (prop, getattr(dirs, prop))) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/appdirs.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/appdirs.pyc new file mode 100644 index 0000000000000000000000000000000000000000..53de6e7e34a2387fd77671a2b01e7eab6e7afdf9 GIT binary patch literal 24985 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 literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/__init__ 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/__init__ 2.py new file mode 100644 index 0000000..a1bbbbe --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/__init__ 2.py @@ -0,0 +1,11 @@ +"""CacheControl import Interface. + +Make it easy to import from cachecontrol without long namespaces. +""" +__author__ = "Eric Larson" +__email__ = "eric@ionrock.org" +__version__ = "0.12.6" + +from .wrapper import CacheControl +from .adapter import CacheControlAdapter +from .controller import CacheController diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/__init__ 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/__init__ 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..284d9f9c0868bf610d81434954e56cc90a912278 GIT binary patch literal 630 zcmZ8eO>Yx15S`6;77&s613u=`bwUwbplVfmKq?5O?PU+O+_kfD>$Q#TBnrQ-*Zv;< z0OM>BRlV}tdC#7ir*ZesoBZkV%WVaR)xrNM?r@1907}FR$_zvY$_|JwlwA-#5Pi@+ zX!=n0AxnG!dH~H3%3;fgphwV*p&TP0!PRt}s@@@-^J*o}t%=@hq8ev?B;QPwe#t9Y zDcTV~RhHWL@HeKv}rgDclV82Cr zwrRTgA3{V*omU$kCEajOmsSgGL2F0FulxGYx15S`6;77&s613u=`-K0hB1yE7N0jcy5IPC$;T{|1MUfbA{gz)e9P5c4I z*&wQV<+t;mJu^?^{-0O*&)@IA*Kk@r`d`zIw*(TPBFv!5K=z>Of$T%o2RQ&a1T%nk z2-Og>#7AI8(2k)RcYF+H0__y4De(z>oljHMdx9HLZ`6&m7@T3c^)4X$Y*B@^s8x~Y zU&Nzg8krLDz|j4>vJS3gb;_+zxqFQpw?$^0ZI~6Uik>ROB9AYq&8MJib}K@3HqMAE z;@8^Q;OfW1g(i+jTolXm;!5+AmY`OdGvK?prQ}(VlzPs6bRa)t{vEiKnN)NBA_K$aU)UTE8LX> z2lh$%6Fv05^xEIkAJEP>%htWLR}185c4i;5-#0V#|JWP;{@b@dEvWr@{Qo__=2sRe zKZ1b4Xx?$-4&_}cdNl93ahLKPD*80@BhhcnY5y;C&5LwZcrH`u8HdTI@CbiX#a}L;foGq+OaHbxc@@l#Kd&+w}K5UkoLYMYM z(iq(cPB;xX9r0`SSy-aABJ0uGr>!Cdt%F#vov%w*Bn}2`CPz&JoE7<4jJS=q&-I1Q z?G6tRLRKzqm-XXkKb)V~J=SKn(MfTdlxeOTJ7i0ertQ#$kF_i34_GA;re-ayo9rU7 zI=o1l@MV>!x-sFh4%64`<=d}bK7RD`<0qGw7j|u}{rbt9)g%5b%kV6$vwA-(jZN}= z|M2*kd2tStyzzxD)2ay<0C?d54&z0U9@Li-FyCoY$L(c6mcgA#jnzmAj=&I?7aV_N zg>keBxN!zBhABUiWh}SK2bdjNcLi8QSBlm>N;`rrCuBQzSYynj>|j>hhnxxGQ@hLO zNXW6a$f0KOMzvd zwr#1fW6(OdWi<)tI5{o5;N;{q1ra!RDm8F~8c#np=tI-WI?&U}(;z?}iavq(kcF_u z*NH$@gj|Upz>EwLqT)uIx+=LfAi3LaEvuU3&CRrw=Sd@%7$gS(Q1k&d1I^gxwy8rL zMUs`D^S?nAlNzXjf6w3XKla~OeNQ@j9Ai!#2X}cwgv65;#9j2D?Vzq#OxW`;<@Z_(V#baFj9X34JsGw literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/_cmd.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/_cmd.py new file mode 100644 index 0000000..f1e0ad9 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/_cmd.py @@ -0,0 +1,57 @@ +import logging + +from pip._vendor import requests + +from pip._vendor.cachecontrol.adapter import CacheControlAdapter +from pip._vendor.cachecontrol.cache import DictCache +from pip._vendor.cachecontrol.controller import logger + +from argparse import ArgumentParser + + +def setup_logging(): + logger.setLevel(logging.DEBUG) + handler = logging.StreamHandler() + logger.addHandler(handler) + + +def get_session(): + adapter = CacheControlAdapter( + DictCache(), cache_etags=True, serializer=None, heuristic=None + ) + sess = requests.Session() + sess.mount("http://", adapter) + sess.mount("https://", adapter) + + sess.cache_controller = adapter.controller + return sess + + +def get_args(): + parser = ArgumentParser() + parser.add_argument("url", help="The URL to try and cache") + return parser.parse_args() + + +def main(args=None): + args = get_args() + sess = get_session() + + # Make a request to get a response + resp = sess.get(args.url) + + # Turn on logging + setup_logging() + + # try setting the cache + sess.cache_controller.cache_response(resp.request, resp.raw) + + # Now try to get it + if sess.cache_controller.cached_request(resp.request): + print("Cached!") + else: + print("Not cached :(") + + +if __name__ == "__main__": + main() diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/_cmd.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/_cmd.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f6af2844eb6be22720b8749ec0683d52e57d2b4a GIT binary patch literal 2288 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 literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/adapter.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/adapter.py new file mode 100644 index 0000000..815650e --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/adapter.py @@ -0,0 +1,133 @@ +import types +import functools +import zlib + +from pip._vendor.requests.adapters import HTTPAdapter + +from .controller import CacheController +from .cache import DictCache +from .filewrapper import CallbackFileWrapper + + +class CacheControlAdapter(HTTPAdapter): + invalidating_methods = {"PUT", "DELETE"} + + def __init__( + self, + cache=None, + cache_etags=True, + controller_class=None, + serializer=None, + heuristic=None, + cacheable_methods=None, + *args, + **kw + ): + super(CacheControlAdapter, self).__init__(*args, **kw) + self.cache = DictCache() if cache is None else cache + self.heuristic = heuristic + self.cacheable_methods = cacheable_methods or ("GET",) + + controller_factory = controller_class or CacheController + self.controller = controller_factory( + self.cache, cache_etags=cache_etags, serializer=serializer + ) + + def send(self, request, cacheable_methods=None, **kw): + """ + Send a request. Use the request information to see if it + exists in the cache and cache the response if we need to and can. + """ + cacheable = cacheable_methods or self.cacheable_methods + if request.method in cacheable: + try: + cached_response = self.controller.cached_request(request) + except zlib.error: + cached_response = None + if cached_response: + return self.build_response(request, cached_response, from_cache=True) + + # check for etags and add headers if appropriate + request.headers.update(self.controller.conditional_headers(request)) + + resp = super(CacheControlAdapter, self).send(request, **kw) + + return resp + + def build_response( + self, request, response, from_cache=False, cacheable_methods=None + ): + """ + Build a response by making a request or using the cache. + + This will end up calling send and returning a potentially + cached response + """ + cacheable = cacheable_methods or self.cacheable_methods + if not from_cache and request.method in cacheable: + # Check for any heuristics that might update headers + # before trying to cache. + if self.heuristic: + response = self.heuristic.apply(response) + + # apply any expiration heuristics + if response.status == 304: + # We must have sent an ETag request. This could mean + # that we've been expired already or that we simply + # have an etag. In either case, we want to try and + # update the cache if that is the case. + cached_response = self.controller.update_cached_response( + request, response + ) + + if cached_response is not response: + from_cache = True + + # We are done with the server response, read a + # possible response body (compliant servers will + # not return one, but we cannot be 100% sure) and + # release the connection back to the pool. + response.read(decode_content=False) + response.release_conn() + + response = cached_response + + # We always cache the 301 responses + elif response.status == 301: + self.controller.cache_response(request, response) + else: + # Wrap the response file with a wrapper that will cache the + # response when the stream has been consumed. + response._fp = CallbackFileWrapper( + response._fp, + functools.partial( + self.controller.cache_response, request, response + ), + ) + if response.chunked: + super_update_chunk_length = response._update_chunk_length + + def _update_chunk_length(self): + super_update_chunk_length() + if self.chunk_left == 0: + self._fp._close() + + response._update_chunk_length = types.MethodType( + _update_chunk_length, response + ) + + resp = super(CacheControlAdapter, self).build_response(request, response) + + # See if we should invalidate the cache. + if request.method in self.invalidating_methods and resp.ok: + cache_url = self.controller.cache_url(request.url) + self.cache.delete(cache_url) + + # Give the request a from_cache attr to let people use it + resp.from_cache = from_cache + + return resp + + def close(self): + self.cache.close() + super(CacheControlAdapter, self).close() diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/adapter.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/adapter.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8c76da1c498d80a3cb6b6d27ef783c01a5dff698 GIT binary patch literal 4059 zcmd5<-;*1~5$@TQbds#I&M`h>4#*OyM4`$j14&#^kV-HnP>{p5Ckmp6Z0%`Brz&aZa^3M_S3;_iJSES0%2WOds`!uc2P9wj=!dEBZlvAO>`YH@Pxsf~wEX|A^k5tM?HnEy@KY0!QlRH zlDM?GN_o)DbkVyTk0$zVk=v@sGF`a|R`FgsvNGw0u8VAzoy4Qr`)Q^>tKzcMm38A= z9jmu&JhOv!@8UMcXf%AX_QS;ap~3q|8c$pvJ%$hJGUC%?xDGNq@>rwCSk# zC_L`*3oQHp{-*=m!0&taKE5}&H{$U&ZXWssx4A@PaVffh!#tXLbg@GhP5K*=x)8Hw zO{xyb*4Ur9PZ)$~RHqAE=rrh}LFI=WDSpIapUTh4HtDiO7r2O~up4?2U@V6o<*{Uo z<9*z#!-6BR^|$v15|EG}m@gBqkJy@Eb;349E*vsnOXu+(jqk z_u0K~iAAF{hCC#9bf)v9sQTiHl?DCS<-lRN3^^^>V#Bu6m7D5C)lyxrqkJ`DII-*5l^@|Y z|3-tLmK}*P(IpU|XbODPXx5x>?iX;2TQ^%~mMbq|L=@piMQd}yBn>%E8d5&>>RaX1-SG-dodfej; zn7^ZG2dmF9yb;7fr5`M`v4_E@MhAAH*8@SCkBe#^+qB37TLebyARPy(-6+ss07eFK zvP`@h#L($_PL(N(9D1?vTnD+<39E8K`Qb*BAbngF^GMbn^*9U;J)Eo#nIVJCa%@B> ziB^^iz#eAliQrsURZ)eVwdlzr%~;aeA)h2o4 z$On&cd+8C7i~baZuV@CDe~L_VYc7)C~`ZLj=NRHeZ z{Sg$fLm;>5bvZ=Da$a?f?cfA`hU^Vi&It-?*zB&!eRdbT^sIR7D}^&?`a`PFkppCU zQ)HeKr@2$*fTqv$3A0LnI38=F7r1rDiuo7EYn|-xavn&wuQKvv8O-BZnxAedASkL} zVR(phSI~Oc-e?$1QWKn~Sr#yFEJ_Gu84DZX5sX#ZE~?zAEDNi1i<2u`ZZtUjL(G}5 z8BcEmNRrrz9un45X^EsT%&IO3a64=ydtt7yKG0!O?fr4>WxC*nc460XM*xIEz_ zme(DnXh=9vsAe=-J;8&WuI|@ld8?BhkyZG`->8(1%R;Q&zy#I9}v9_lwL3eU@>>V3EGKS0^FI zSzck6B@QU2p5IA{GQjhek;4O)V^5^{87d|4I3T#LW~AsSW?MFn7F8xe$FCGJvi$_M zTOIPwrMQythcB__CYm*5MZh`o#~2P@=7#MInLNWc(Ks?^z=l6V^VEtN_6pl$-ai%iE+MNAE7{j(5`{1a@U~ztyDwGp!8@ne`4PsBZ{Cfu$U_WHoWKz58$ko{l zfGEo2xkh2lD2$?ckt|R#N8uejO0glCAr)j8@K~Q4jzP$39VpOw%3I`}ajF_lmxk&f z^y_cuYG=RuVUK6SUvTp}H_UzZ1vIFk4_Ec`;i}d#hpXDzgb*O%4*B!o{vR;!%0HSh n{u`dV|AvkO*oyCoM6a5^Y%~x?fL%$5LuBa literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/cache 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/cache 2.py new file mode 100644 index 0000000..94e0773 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/cache 2.py @@ -0,0 +1,39 @@ +""" +The cache object API for implementing caches. The default is a thread +safe in-memory dictionary. +""" +from threading import Lock + + +class BaseCache(object): + + def get(self, key): + raise NotImplementedError() + + def set(self, key, value): + raise NotImplementedError() + + def delete(self, key): + raise NotImplementedError() + + def close(self): + pass + + +class DictCache(BaseCache): + + def __init__(self, init_dict=None): + self.lock = Lock() + self.data = init_dict or {} + + def get(self, key): + return self.data.get(key, None) + + def set(self, key, value): + with self.lock: + self.data.update({key: value}) + + def delete(self, key): + with self.lock: + if key in self.data: + self.data.pop(key) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/cache 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/cache 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bdde34de1965c5ff54a66b29dda92b50989b8ce7 GIT binary patch literal 2923 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 literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py new file mode 100644 index 0000000..ed705ce --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py @@ -0,0 +1,33 @@ +from __future__ import division + +from datetime import datetime +from pip._vendor.cachecontrol.cache import BaseCache + + +class RedisCache(BaseCache): + + def __init__(self, conn): + self.conn = conn + + def get(self, key): + return self.conn.get(key) + + def set(self, key, value, expires=None): + if not expires: + self.conn.set(key, value) + else: + expires = expires - datetime.utcnow() + self.conn.setex(key, int(expires.total_seconds()), value) + + def delete(self, key): + self.conn.delete(key) + + def clear(self): + """Helper for clearing all the keys in a database. Use with + caution!""" + for key in self.conn.keys(): + self.conn.delete(key) + + def close(self): + """Redis uses connection pooling, no need to close the connection.""" + pass diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a42a43f9fe88028b3f370b5d9fb14e4fb5428d6c GIT binary patch literal 2500 zcmd5-%Wm676ul&6`2iad(!gkdqM5F$MIzcxP;dH3>n@ruw4hTI6_5}#Ig+VTq{11= zc3@{?|5(4NAJCpNlq$E)2Z+#6_uhH%+%sqH1b^=BT>kOR+f)`$fd7|D#QY2+!_SjK zWa7!d6OXAAK$@FJb%#<~CC^*KlZ@AojY5GGLK_|Cv0Q(Kh7CO_aEW4ay z=^0%NBN|<_=4C#>3a52GM~dM*sl#DaWV$xtXc}hk#-sNyhKC1dhtIFB=5}nYJ$`<1 zet>6GhOfhEK7E###wJDa?CAKb{vcw=wRo<}tg6G5Bmsu4tDxithV-v86>AdFnc_#tUeZar)ux2^ATbg5YiWu$Er*?{9Bzw4{DN;;zMcF~r} za$Abs*-mf2Dlw%Pj<69&t0g zYqMUgQ(h0y3;~PR_V)eGM}+nWo&OOUYs`{8>a$^wgk`z_Pb(u3IUSZx(x|r%(4XawEg-+_c z94Qn8WzV(3u`?LR!2J8JQy$;_hMe$np|PeUxF#mNz&uQRt! z^)BznKx&9vf_*O~#mnX>X3vVa@8G#xL(PmfigjA2WI;`rB}SyjCEM zgsukm`i;i;5qAjJN^%QY0Q(8>HM;ZrU7o*1y)ToAj$?Oy#_^=eW(C}c2g=n(cVYFb zQb(NQWDq^1^$A|9RGqa3msmvUvg{ca^|rqqYzMoWc(?mq=CsIjIJ2{wc_JiD&HWq} mF3sNJ!tC9@FdHXw^@blr0%u~QZIl&q7q!HCwwriu*LDKS z%kU~(c>*4UBL^6JvxG*%lEGJuQ#2Pg?7 z1jwa$1Z~!WWeEBV2q7CFXaGUrL)G`X7VtJC9k>(^|7!9^gUOCddcLj`0N;bM3rY8O zov)1sf&B*fN7n{^0A&bCcw6_Q(IIfy0A3dYJA$N#o!!IE?)b0yVuMYGa;Aq#O)M~*P^W;z{Dm{C#~wv85MHdiysrD55y@6?V(H7~9rm1@H# z=z~2(^R`q{+jFha?$?wjd_g)c=#n$LhY3|*BY#!VY|TU_b)?zNiWzJ0UAjzjW}>>z z2s3qG6W{-X9o;TvpX>nte|TjJK4~Ft@9$`uM;%d5OcYdR%pN$JeYP`OsoJ|pOICk% zfH`CJ5D(ZIqtT6(F4n1K@jBJ4*-BXQ*faC}p2@`j*$-~Nzy3^NySjM3#jSw=)I-PsG6Ec+B#;mw zm(>&KFb`G%s0k24wt(LP6@gFn!09~T9Z0%xSv~%%$y*I3yEf_grj8H%0LmUDy}Nb3 zwHgEtTi_pE2lx?`0VKg)-H%p>z;O#WT>$I^l0J6!06V+qzUG&u*?k+fOyg#( zbByLgDTOlcltO#hP>yf~=|w?ToS6em$mSZls|@EGR%JqkiruW4HX7fht2AdiZ0d|L z)ASX){vYk>_9^ph5BUGXYg6#pL)<*v)3lFTqM2A#P?0fnWNCJ5=BAd7H%&{{e6^1` zZPW-4*cq+Rjif3zsbSG3RnbE5j42)EGRkh2`PUbV^Ruh-ab0iB(ik%tf4M%xl~>U$ zl7&1iDs58EPoGa-PLtS%+};i@qA9&*R8&R@9#K)s)P%Bj|KL?AvNdOK?BMiMG(H)U TJ{kHx8Q?kSZhdbT4>0}*$Xv current_age: + logger.debug('The response is "fresh", returning cached response') + logger.debug("%i > %i", freshness_lifetime, current_age) + return resp + + # we're not fresh. If we don't have an Etag, clear it out + if "etag" not in headers: + logger.debug('The cached response is "stale" with no etag, purging') + self.cache.delete(cache_url) + + # return the original handler + return False + + def conditional_headers(self, request): + cache_url = self.cache_url(request.url) + resp = self.serializer.loads(request, self.cache.get(cache_url)) + new_headers = {} + + if resp: + headers = CaseInsensitiveDict(resp.headers) + + if "etag" in headers: + new_headers["If-None-Match"] = headers["ETag"] + + if "last-modified" in headers: + new_headers["If-Modified-Since"] = headers["Last-Modified"] + + return new_headers + + def cache_response(self, request, response, body=None, status_codes=None): + """ + Algorithm for caching requests. + + This assumes a requests Response object. + """ + # From httplib2: Don't cache 206's since we aren't going to + # handle byte range requests + cacheable_status_codes = status_codes or self.cacheable_status_codes + if response.status not in cacheable_status_codes: + logger.debug( + "Status code %s not in %s", response.status, cacheable_status_codes + ) + return + + response_headers = CaseInsensitiveDict(response.headers) + + # If we've been given a body, our response has a Content-Length, that + # Content-Length is valid then we can check to see if the body we've + # been given matches the expected size, and if it doesn't we'll just + # skip trying to cache it. + if ( + body is not None + and "content-length" in response_headers + and response_headers["content-length"].isdigit() + and int(response_headers["content-length"]) != len(body) + ): + return + + cc_req = self.parse_cache_control(request.headers) + cc = self.parse_cache_control(response_headers) + + cache_url = self.cache_url(request.url) + logger.debug('Updating cache with response from "%s"', cache_url) + + # Delete it from the cache if we happen to have it stored there + no_store = False + if "no-store" in cc: + no_store = True + logger.debug('Response header has "no-store"') + if "no-store" in cc_req: + no_store = True + logger.debug('Request header has "no-store"') + if no_store and self.cache.get(cache_url): + logger.debug('Purging existing cache entry to honor "no-store"') + self.cache.delete(cache_url) + if no_store: + return + + # https://tools.ietf.org/html/rfc7234#section-4.1: + # A Vary header field-value of "*" always fails to match. + # Storing such a response leads to a deserialization warning + # during cache lookup and is not allowed to ever be served, + # so storing it can be avoided. + if "*" in response_headers.get("vary", ""): + logger.debug('Response header has "Vary: *"') + return + + # If we've been given an etag, then keep the response + if self.cache_etags and "etag" in response_headers: + logger.debug("Caching due to etag") + self.cache.set( + cache_url, self.serializer.dumps(request, response, body=body) + ) + + # Add to the cache any 301s. We do this before looking that + # the Date headers. + elif response.status == 301: + logger.debug("Caching permanant redirect") + self.cache.set(cache_url, self.serializer.dumps(request, response)) + + # Add to the cache if the response headers demand it. If there + # is no date header then we can't do anything about expiring + # the cache. + elif "date" in response_headers: + # cache when there is a max-age > 0 + if "max-age" in cc and cc["max-age"] > 0: + logger.debug("Caching b/c date exists and max-age > 0") + self.cache.set( + cache_url, self.serializer.dumps(request, response, body=body) + ) + + # If the request can expire, it means we should cache it + # in the meantime. + elif "expires" in response_headers: + if response_headers["expires"]: + logger.debug("Caching b/c of expires header") + self.cache.set( + cache_url, self.serializer.dumps(request, response, body=body) + ) + + def update_cached_response(self, request, response): + """On a 304 we will get a new set of headers that we want to + update our cached value with, assuming we have one. + + This should only ever be called when we've sent an ETag and + gotten a 304 as the response. + """ + cache_url = self.cache_url(request.url) + + cached_response = self.serializer.loads(request, self.cache.get(cache_url)) + + if not cached_response: + # we didn't have a cached response + return response + + # Lets update our headers with the headers from the new request: + # http://tools.ietf.org/html/draft-ietf-httpbis-p4-conditional-26#section-4.1 + # + # The server isn't supposed to send headers that would make + # the cached body invalid. But... just in case, we'll be sure + # to strip out ones we know that might be problmatic due to + # typical assumptions. + excluded_headers = ["content-length"] + + cached_response.headers.update( + dict( + (k, v) + for k, v in response.headers.items() + if k.lower() not in excluded_headers + ) + ) + + # we want a 200 b/c we have content via the cache + cached_response.status = 200 + + # update our cache + self.cache.set(cache_url, self.serializer.dumps(request, cached_response)) + + return cached_response diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/controller 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/controller 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a464685d7fab2cbca4ef87e2d322d2f05688061e GIT binary patch literal 10239 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 literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/controller.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/controller.py new file mode 100644 index 0000000..dafe55c --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/controller.py @@ -0,0 +1,376 @@ +""" +The httplib2 algorithms ported for use with requests. +""" +import logging +import re +import calendar +import time +from email.utils import parsedate_tz + +from pip._vendor.requests.structures import CaseInsensitiveDict + +from .cache import DictCache +from .serialize import Serializer + + +logger = logging.getLogger(__name__) + +URI = re.compile(r"^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?") + + +def parse_uri(uri): + """Parses a URI using the regex given in Appendix B of RFC 3986. + + (scheme, authority, path, query, fragment) = parse_uri(uri) + """ + groups = URI.match(uri).groups() + return (groups[1], groups[3], groups[4], groups[6], groups[8]) + + +class CacheController(object): + """An interface to see if request should cached or not. + """ + + def __init__( + self, cache=None, cache_etags=True, serializer=None, status_codes=None + ): + self.cache = DictCache() if cache is None else cache + self.cache_etags = cache_etags + self.serializer = serializer or Serializer() + self.cacheable_status_codes = status_codes or (200, 203, 300, 301) + + @classmethod + def _urlnorm(cls, uri): + """Normalize the URL to create a safe key for the cache""" + (scheme, authority, path, query, fragment) = parse_uri(uri) + if not scheme or not authority: + raise Exception("Only absolute URIs are allowed. uri = %s" % uri) + + scheme = scheme.lower() + authority = authority.lower() + + if not path: + path = "/" + + # Could do syntax based normalization of the URI before + # computing the digest. See Section 6.2.2 of Std 66. + request_uri = query and "?".join([path, query]) or path + defrag_uri = scheme + "://" + authority + request_uri + + return defrag_uri + + @classmethod + def cache_url(cls, uri): + return cls._urlnorm(uri) + + def parse_cache_control(self, headers): + known_directives = { + # https://tools.ietf.org/html/rfc7234#section-5.2 + "max-age": (int, True), + "max-stale": (int, False), + "min-fresh": (int, True), + "no-cache": (None, False), + "no-store": (None, False), + "no-transform": (None, False), + "only-if-cached": (None, False), + "must-revalidate": (None, False), + "public": (None, False), + "private": (None, False), + "proxy-revalidate": (None, False), + "s-maxage": (int, True), + } + + cc_headers = headers.get("cache-control", headers.get("Cache-Control", "")) + + retval = {} + + for cc_directive in cc_headers.split(","): + if not cc_directive.strip(): + continue + + parts = cc_directive.split("=", 1) + directive = parts[0].strip() + + try: + typ, required = known_directives[directive] + except KeyError: + logger.debug("Ignoring unknown cache-control directive: %s", directive) + continue + + if not typ or not required: + retval[directive] = None + if typ: + try: + retval[directive] = typ(parts[1].strip()) + except IndexError: + if required: + logger.debug( + "Missing value for cache-control " "directive: %s", + directive, + ) + except ValueError: + logger.debug( + "Invalid value for cache-control directive " "%s, must be %s", + directive, + typ.__name__, + ) + + return retval + + def cached_request(self, request): + """ + Return a cached response if it exists in the cache, otherwise + return False. + """ + cache_url = self.cache_url(request.url) + logger.debug('Looking up "%s" in the cache', cache_url) + cc = self.parse_cache_control(request.headers) + + # Bail out if the request insists on fresh data + if "no-cache" in cc: + logger.debug('Request header has "no-cache", cache bypassed') + return False + + if "max-age" in cc and cc["max-age"] == 0: + logger.debug('Request header has "max_age" as 0, cache bypassed') + return False + + # Request allows serving from the cache, let's see if we find something + cache_data = self.cache.get(cache_url) + if cache_data is None: + logger.debug("No cache entry available") + return False + + # Check whether it can be deserialized + resp = self.serializer.loads(request, cache_data) + if not resp: + logger.warning("Cache entry deserialization failed, entry ignored") + return False + + # If we have a cached 301, return it immediately. We don't + # need to test our response for other headers b/c it is + # intrinsically "cacheable" as it is Permanent. + # See: + # https://tools.ietf.org/html/rfc7231#section-6.4.2 + # + # Client can try to refresh the value by repeating the request + # with cache busting headers as usual (ie no-cache). + if resp.status == 301: + msg = ( + 'Returning cached "301 Moved Permanently" response ' + "(ignoring date and etag information)" + ) + logger.debug(msg) + return resp + + headers = CaseInsensitiveDict(resp.headers) + if not headers or "date" not in headers: + if "etag" not in headers: + # Without date or etag, the cached response can never be used + # and should be deleted. + logger.debug("Purging cached response: no date or etag") + self.cache.delete(cache_url) + logger.debug("Ignoring cached response: no date") + return False + + now = time.time() + date = calendar.timegm(parsedate_tz(headers["date"])) + current_age = max(0, now - date) + logger.debug("Current age based on date: %i", current_age) + + # TODO: There is an assumption that the result will be a + # urllib3 response object. This may not be best since we + # could probably avoid instantiating or constructing the + # response until we know we need it. + resp_cc = self.parse_cache_control(headers) + + # determine freshness + freshness_lifetime = 0 + + # Check the max-age pragma in the cache control header + if "max-age" in resp_cc: + freshness_lifetime = resp_cc["max-age"] + logger.debug("Freshness lifetime from max-age: %i", freshness_lifetime) + + # If there isn't a max-age, check for an expires header + elif "expires" in headers: + expires = parsedate_tz(headers["expires"]) + if expires is not None: + expire_time = calendar.timegm(expires) - date + freshness_lifetime = max(0, expire_time) + logger.debug("Freshness lifetime from expires: %i", freshness_lifetime) + + # Determine if we are setting freshness limit in the + # request. Note, this overrides what was in the response. + if "max-age" in cc: + freshness_lifetime = cc["max-age"] + logger.debug( + "Freshness lifetime from request max-age: %i", freshness_lifetime + ) + + if "min-fresh" in cc: + min_fresh = cc["min-fresh"] + # adjust our current age by our min fresh + current_age += min_fresh + logger.debug("Adjusted current age from min-fresh: %i", current_age) + + # Return entry if it is fresh enough + if freshness_lifetime > current_age: + logger.debug('The response is "fresh", returning cached response') + logger.debug("%i > %i", freshness_lifetime, current_age) + return resp + + # we're not fresh. If we don't have an Etag, clear it out + if "etag" not in headers: + logger.debug('The cached response is "stale" with no etag, purging') + self.cache.delete(cache_url) + + # return the original handler + return False + + def conditional_headers(self, request): + cache_url = self.cache_url(request.url) + resp = self.serializer.loads(request, self.cache.get(cache_url)) + new_headers = {} + + if resp: + headers = CaseInsensitiveDict(resp.headers) + + if "etag" in headers: + new_headers["If-None-Match"] = headers["ETag"] + + if "last-modified" in headers: + new_headers["If-Modified-Since"] = headers["Last-Modified"] + + return new_headers + + def cache_response(self, request, response, body=None, status_codes=None): + """ + Algorithm for caching requests. + + This assumes a requests Response object. + """ + # From httplib2: Don't cache 206's since we aren't going to + # handle byte range requests + cacheable_status_codes = status_codes or self.cacheable_status_codes + if response.status not in cacheable_status_codes: + logger.debug( + "Status code %s not in %s", response.status, cacheable_status_codes + ) + return + + response_headers = CaseInsensitiveDict(response.headers) + + # If we've been given a body, our response has a Content-Length, that + # Content-Length is valid then we can check to see if the body we've + # been given matches the expected size, and if it doesn't we'll just + # skip trying to cache it. + if ( + body is not None + and "content-length" in response_headers + and response_headers["content-length"].isdigit() + and int(response_headers["content-length"]) != len(body) + ): + return + + cc_req = self.parse_cache_control(request.headers) + cc = self.parse_cache_control(response_headers) + + cache_url = self.cache_url(request.url) + logger.debug('Updating cache with response from "%s"', cache_url) + + # Delete it from the cache if we happen to have it stored there + no_store = False + if "no-store" in cc: + no_store = True + logger.debug('Response header has "no-store"') + if "no-store" in cc_req: + no_store = True + logger.debug('Request header has "no-store"') + if no_store and self.cache.get(cache_url): + logger.debug('Purging existing cache entry to honor "no-store"') + self.cache.delete(cache_url) + if no_store: + return + + # https://tools.ietf.org/html/rfc7234#section-4.1: + # A Vary header field-value of "*" always fails to match. + # Storing such a response leads to a deserialization warning + # during cache lookup and is not allowed to ever be served, + # so storing it can be avoided. + if "*" in response_headers.get("vary", ""): + logger.debug('Response header has "Vary: *"') + return + + # If we've been given an etag, then keep the response + if self.cache_etags and "etag" in response_headers: + logger.debug("Caching due to etag") + self.cache.set( + cache_url, self.serializer.dumps(request, response, body=body) + ) + + # Add to the cache any 301s. We do this before looking that + # the Date headers. + elif response.status == 301: + logger.debug("Caching permanant redirect") + self.cache.set(cache_url, self.serializer.dumps(request, response)) + + # Add to the cache if the response headers demand it. If there + # is no date header then we can't do anything about expiring + # the cache. + elif "date" in response_headers: + # cache when there is a max-age > 0 + if "max-age" in cc and cc["max-age"] > 0: + logger.debug("Caching b/c date exists and max-age > 0") + self.cache.set( + cache_url, self.serializer.dumps(request, response, body=body) + ) + + # If the request can expire, it means we should cache it + # in the meantime. + elif "expires" in response_headers: + if response_headers["expires"]: + logger.debug("Caching b/c of expires header") + self.cache.set( + cache_url, self.serializer.dumps(request, response, body=body) + ) + + def update_cached_response(self, request, response): + """On a 304 we will get a new set of headers that we want to + update our cached value with, assuming we have one. + + This should only ever be called when we've sent an ETag and + gotten a 304 as the response. + """ + cache_url = self.cache_url(request.url) + + cached_response = self.serializer.loads(request, self.cache.get(cache_url)) + + if not cached_response: + # we didn't have a cached response + return response + + # Lets update our headers with the headers from the new request: + # http://tools.ietf.org/html/draft-ietf-httpbis-p4-conditional-26#section-4.1 + # + # The server isn't supposed to send headers that would make + # the cached body invalid. But... just in case, we'll be sure + # to strip out ones we know that might be problmatic due to + # typical assumptions. + excluded_headers = ["content-length"] + + cached_response.headers.update( + dict( + (k, v) + for k, v in response.headers.items() + if k.lower() not in excluded_headers + ) + ) + + # we want a 200 b/c we have content via the cache + cached_response.status = 200 + + # update our cache + self.cache.set(cache_url, self.serializer.dumps(request, cached_response)) + + return cached_response diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/controller.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/controller.pyc new file mode 100644 index 0000000000000000000000000000000000000000..81c48716d48d276ff4a41a941f9e2c3937b6f3da GIT binary patch literal 10239 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 A&Hw-a literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/heuristics.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/heuristics.py new file mode 100644 index 0000000..6c0e979 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/heuristics.py @@ -0,0 +1,135 @@ +import calendar +import time + +from email.utils import formatdate, parsedate, parsedate_tz + +from datetime import datetime, timedelta + +TIME_FMT = "%a, %d %b %Y %H:%M:%S GMT" + + +def expire_after(delta, date=None): + date = date or datetime.utcnow() + return date + delta + + +def datetime_to_header(dt): + return formatdate(calendar.timegm(dt.timetuple())) + + +class BaseHeuristic(object): + + def warning(self, response): + """ + Return a valid 1xx warning header value describing the cache + adjustments. + + The response is provided too allow warnings like 113 + http://tools.ietf.org/html/rfc7234#section-5.5.4 where we need + to explicitly say response is over 24 hours old. + """ + return '110 - "Response is Stale"' + + def update_headers(self, response): + """Update the response headers with any new headers. + + NOTE: This SHOULD always include some Warning header to + signify that the response was cached by the client, not + by way of the provided headers. + """ + return {} + + def apply(self, response): + updated_headers = self.update_headers(response) + + if updated_headers: + response.headers.update(updated_headers) + warning_header_value = self.warning(response) + if warning_header_value is not None: + response.headers.update({"Warning": warning_header_value}) + + return response + + +class OneDayCache(BaseHeuristic): + """ + Cache the response by providing an expires 1 day in the + future. + """ + + def update_headers(self, response): + headers = {} + + if "expires" not in response.headers: + date = parsedate(response.headers["date"]) + expires = expire_after(timedelta(days=1), date=datetime(*date[:6])) + headers["expires"] = datetime_to_header(expires) + headers["cache-control"] = "public" + return headers + + +class ExpiresAfter(BaseHeuristic): + """ + Cache **all** requests for a defined time period. + """ + + def __init__(self, **kw): + self.delta = timedelta(**kw) + + def update_headers(self, response): + expires = expire_after(self.delta) + return {"expires": datetime_to_header(expires), "cache-control": "public"} + + def warning(self, response): + tmpl = "110 - Automatically cached for %s. Response might be stale" + return tmpl % self.delta + + +class LastModified(BaseHeuristic): + """ + If there is no Expires header already, fall back on Last-Modified + using the heuristic from + http://tools.ietf.org/html/rfc7234#section-4.2.2 + to calculate a reasonable value. + + Firefox also does something like this per + https://developer.mozilla.org/en-US/docs/Web/HTTP/Caching_FAQ + http://lxr.mozilla.org/mozilla-release/source/netwerk/protocol/http/nsHttpResponseHead.cpp#397 + Unlike mozilla we limit this to 24-hr. + """ + cacheable_by_default_statuses = { + 200, 203, 204, 206, 300, 301, 404, 405, 410, 414, 501 + } + + def update_headers(self, resp): + headers = resp.headers + + if "expires" in headers: + return {} + + if "cache-control" in headers and headers["cache-control"] != "public": + return {} + + if resp.status not in self.cacheable_by_default_statuses: + return {} + + if "date" not in headers or "last-modified" not in headers: + return {} + + date = calendar.timegm(parsedate_tz(headers["date"])) + last_modified = parsedate(headers["last-modified"]) + if date is None or last_modified is None: + return {} + + now = time.time() + current_age = max(0, now - date) + delta = date - calendar.timegm(last_modified) + freshness_lifetime = max(0, min(delta / 10, 24 * 3600)) + if freshness_lifetime <= current_age: + return {} + + expires = date + freshness_lifetime + return {"expires": time.strftime(TIME_FMT, time.gmtime(expires))} + + def warning(self, resp): + return None diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/heuristics.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/heuristics.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8eeb6e53b34b2052f5bf58d6a7c697f1a2b83a71 GIT binary patch literal 6673 zcmd5=OK%&=5$+)=O4P&hBa!XIo3w2R%Lo=}$yz(>I6-W$y;{VQvm+Us6|f;jGflCj z;S4?96h%V<0@%nYxh0nz@(XgvU+^tJg8Y>|EOJi1sveH4U0-sN2JB|PySlm_Uv>GL znaP8H9;+}h4^x7MnpBCX1H~- zXgw#QsZr~6(K;)lnNjPxqV+s&wo#wODfEBwt=H*fb`n`T&ANe&0;_Bd)n1Sp#kJ{o zYc2b#UZN=z$hcc~-2{t5q+%PGtLT~!Zpryb&Tq^4FXjB|{rR=~^BeNhwat)bkJ4k5 z%@2?rdZITgtPr~%9rehgmO~*fZ`3_>uk)Th(^^HnZ^I-VI6}ry=Y4I3N}#`vf5DmA zN2%G%^gf!K`$5)hr*Wh*)742S!6*IIk;&Y*J}-%irpZ1!|- zQ76U*alE*E@9z4RPfeU!`zndjtQiJjM}=u(vovmYR6od-WLLrZK^2R)ssR?xO8 zn?l_XiNd?+g>))PbR^~iF%9Rpp4ctX$#=`dh}U2TU6^A6&GwNT_ro9t5kY2&BgFlk zF5es#ZNC>Qo@I&Gkv$tcxk$8-gn`7COq)exD&vopva1xBroco|YVeZ+!C zNaiLo1s!39gKBJ*NT{h$7Ey@{72$8NWEav#vzgDtL)HP>&|F9Rq|84bY|9cE$o(MJ zkz6`Bkb@vgbh0BIq14e=GEyeY^ftBIj*=_`#Ueqp+c&nW5^EZhMe8QUWy}Bb`j#MOVno7u5Iv8zbWUTj;Tw1zQOzv3QyWebLXlxo<*>)q%cA6dAjhk6JytjO3 z<)%@g)oHT$QRAb=iX3!QrsP1$M5(A)#-K(FD>1ci}Hs5&LK9S8R~|UEaE0Bpiyy~jl<};XG8MFL0^8Eb9C`6ZngJ|hZecU znXfVQMUNzwZ+dj3TpWxXXxouNG6bUsqsDh`ef|07llyYBgA3nSeg5LvC%EcCFf>vp zVcd_DG-+4KFHXvsO$)|5xioqw(d{892<%BR27z(X7s+kvhb+b#l6Olcsr}X}7=W#1 z+U9YE{5ipfsE(B2_&R;^5R>J%9hBudd}FQl?Ii?A*_fHd$kioHM|kpJ#m+2y!=WeyzB{E<(Fj$3p7vW<4c`xmH>$XrhoRj0x+r!Dc^jf+O7wBJKpF1vYKiw)7)xE4BZ z(Cfv+1r!WjlJI6rRqwnv>rHzfl$arG5n8PzfZcB~+-SABY1EHVWri@vd~$-vr{dBn zx^SNkL(DhiVXLLuRIO&ojXzJ+C&BPB`+ijUBL~Co=`sq1dwSP5!6mWJS;GKUH(ubR zMng-TYLasa5;E8T5JoP^2+FGy8qIUtefTQn)RtwRu7Sv8*@turSTTq^M3&?o0zEFW zT>*IEs&JH7oxB4eSco=$6(9}|9S}|u_Aw#&2c!rk z*vkoQ=@cQS*(ar7IS1(m3IviEsZiGIZ^IE8^7bLIaWThGb?Wqq=RQsFX;q(9q)a6m z?-Z=CO>Qvl<$plENT-hdSePGxkX#+ArCINiHxHGV@tndF=JkJwjEzLA6{R5*fvm>y z0l0LU;(ra~+(ly4TCG$|jA@@Zk$gy)HbgIfh4lXf)%Qw&fy^LjZ-CXt2%^!=nx7$i zM;{gzfQJ?q08U=^m9a)5Fp&X3S6e3pm;fDRPh~pI5lTpVlVVZ&6_UAx3{V<^{zv3O zv=}LlKr{_=B1N+10t=ER2FiPbWB#8a>vMCd6Kz|qXCN+z$E@k336vgF`-jNrtS)k5 zFQ=iwBj-jQ3!Def?>cU;vzGWjrn%qMK3dl49P1&g8@C;++u2gG=X4H|BKRDy;0|3e zbBA0lSm0bg@kofd+-IBn=yRac326}+cJcyyT(ohc3< z`TYd1Hh4QJj1-{&^A=Wyjnrohpb=gH)F-LTt>Gv@4B`wS?eLatLzd)r5bnt|kwoj_ zh*(~wZ${B$@n|61S=!~!|0CX8X)HIEc@m;K$Zyz>DOd?$Jp+>_!FH@%(3(djPk|=d z=>g&plgcOsvY-&ec8D5|J5fY*s4H4|kAD%-<@O={DSUQ`hI zHWRaozmXoUg1?Qh*SmS=<9octi-ZZ!m!zmS)?H1J5>5iHEUzqfG6$6OKX8@$pOpQJ zvVT){3pcA5Df<&;f2Qm&l>L>m{~%+#GKsOI?vIhoPtoddR1UF9Vy`N)s|30>AZS2D zRR5Sk5|9?`?_Qbe)K3!uq+pFO3aIS4n+4Ftb+bbf>dM(3_W_^nIt&I=USZ&tV>buG z#vGP&unkaeLYTi1UW>S#{oO4xA$BK#@Wj!Wz&jBkIBZiES6-LI5h`VZf!N03yemiJ z`6!_EL+Hx5_&ziRV`=z=IK;0i_B@fD^Y~B*oF>HOqnZHHgZtW@5>Qhr%!tDpAxF$3 zZ?sV-C3SA-yB>%g6C+3Ni%D@1C$N@d8(aw8gT6x9c_^m--RGXDlZG-5%??cDdH96b%fH2%QyyTegi}5NT-kQ30M3cDTih6^{Ir+&ZJMB2VuV<;z@w3 zQ`ORk<=T(xbR?${#A234)eUsq=vy5dA8mO^#=1g^;Xw2)Dv{PW+(?j-l_A~U#hWCD z(Ec^*zD^nKeSC#nI&GN!0Gfz*h+mMz8Hzloz3I}m(p;%po*t`J=5EYgn7i;l{3J>4 literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/serialize 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/serialize 2.py new file mode 100644 index 0000000..3b6ec2d --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/serialize 2.py @@ -0,0 +1,188 @@ +import base64 +import io +import json +import zlib + +from pip._vendor import msgpack +from pip._vendor.requests.structures import CaseInsensitiveDict + +from .compat import HTTPResponse, pickle, text_type + + +def _b64_decode_bytes(b): + return base64.b64decode(b.encode("ascii")) + + +def _b64_decode_str(s): + return _b64_decode_bytes(s).decode("utf8") + + +class Serializer(object): + + def dumps(self, request, response, body=None): + response_headers = CaseInsensitiveDict(response.headers) + + if body is None: + body = response.read(decode_content=False) + + # NOTE: 99% sure this is dead code. I'm only leaving it + # here b/c I don't have a test yet to prove + # it. Basically, before using + # `cachecontrol.filewrapper.CallbackFileWrapper`, + # this made an effort to reset the file handle. The + # `CallbackFileWrapper` short circuits this code by + # setting the body as the content is consumed, the + # result being a `body` argument is *always* passed + # into cache_response, and in turn, + # `Serializer.dump`. + response._fp = io.BytesIO(body) + + # NOTE: This is all a bit weird, but it's really important that on + # Python 2.x these objects are unicode and not str, even when + # they contain only ascii. The problem here is that msgpack + # understands the difference between unicode and bytes and we + # have it set to differentiate between them, however Python 2 + # doesn't know the difference. Forcing these to unicode will be + # enough to have msgpack know the difference. + data = { + u"response": { + u"body": body, + u"headers": dict( + (text_type(k), text_type(v)) for k, v in response.headers.items() + ), + u"status": response.status, + u"version": response.version, + u"reason": text_type(response.reason), + u"strict": response.strict, + u"decode_content": response.decode_content, + } + } + + # Construct our vary headers + data[u"vary"] = {} + if u"vary" in response_headers: + varied_headers = response_headers[u"vary"].split(",") + for header in varied_headers: + header = text_type(header).strip() + header_value = request.headers.get(header, None) + if header_value is not None: + header_value = text_type(header_value) + data[u"vary"][header] = header_value + + return b",".join([b"cc=4", msgpack.dumps(data, use_bin_type=True)]) + + def loads(self, request, data): + # Short circuit if we've been given an empty set of data + if not data: + return + + # Determine what version of the serializer the data was serialized + # with + try: + ver, data = data.split(b",", 1) + except ValueError: + ver = b"cc=0" + + # Make sure that our "ver" is actually a version and isn't a false + # positive from a , being in the data stream. + if ver[:3] != b"cc=": + data = ver + data + ver = b"cc=0" + + # Get the version number out of the cc=N + ver = ver.split(b"=", 1)[-1].decode("ascii") + + # Dispatch to the actual load method for the given version + try: + return getattr(self, "_loads_v{}".format(ver))(request, data) + + except AttributeError: + # This is a version we don't have a loads function for, so we'll + # just treat it as a miss and return None + return + + def prepare_response(self, request, cached): + """Verify our vary headers match and construct a real urllib3 + HTTPResponse object. + """ + # Special case the '*' Vary value as it means we cannot actually + # determine if the cached response is suitable for this request. + # This case is also handled in the controller code when creating + # a cache entry, but is left here for backwards compatibility. + if "*" in cached.get("vary", {}): + return + + # Ensure that the Vary headers for the cached response match our + # request + for header, value in cached.get("vary", {}).items(): + if request.headers.get(header, None) != value: + return + + body_raw = cached["response"].pop("body") + + headers = CaseInsensitiveDict(data=cached["response"]["headers"]) + if headers.get("transfer-encoding", "") == "chunked": + headers.pop("transfer-encoding") + + cached["response"]["headers"] = headers + + try: + body = io.BytesIO(body_raw) + except TypeError: + # This can happen if cachecontrol serialized to v1 format (pickle) + # using Python 2. A Python 2 str(byte string) will be unpickled as + # a Python 3 str (unicode string), which will cause the above to + # fail with: + # + # TypeError: 'str' does not support the buffer interface + body = io.BytesIO(body_raw.encode("utf8")) + + return HTTPResponse(body=body, preload_content=False, **cached["response"]) + + def _loads_v0(self, request, data): + # The original legacy cache data. This doesn't contain enough + # information to construct everything we need, so we'll treat this as + # a miss. + return + + def _loads_v1(self, request, data): + try: + cached = pickle.loads(data) + except ValueError: + return + + return self.prepare_response(request, cached) + + def _loads_v2(self, request, data): + try: + cached = json.loads(zlib.decompress(data).decode("utf8")) + except (ValueError, zlib.error): + return + + # We need to decode the items that we've base64 encoded + cached["response"]["body"] = _b64_decode_bytes(cached["response"]["body"]) + cached["response"]["headers"] = dict( + (_b64_decode_str(k), _b64_decode_str(v)) + for k, v in cached["response"]["headers"].items() + ) + cached["response"]["reason"] = _b64_decode_str(cached["response"]["reason"]) + cached["vary"] = dict( + (_b64_decode_str(k), _b64_decode_str(v) if v is not None else v) + for k, v in cached["vary"].items() + ) + + return self.prepare_response(request, cached) + + def _loads_v3(self, request, data): + # Due to Python 2 encoding issues, it's impossible to know for sure + # exactly how to load v3 entries, thus we'll treat these as a miss so + # that they get rewritten out as v4 entries. + return + + def _loads_v4(self, request, data): + try: + cached = msgpack.loads(data, raw=False) + except ValueError: + return + + return self.prepare_response(request, cached) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/serialize 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/serialize 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..489b00f571c1b96394fd3ccbacae43e1ae675ce6 GIT binary patch literal 6401 zcmdT|OLH7o6+X9nG%riCE%^~)IT_03Wb&{iV_Bp?b`n1VfkLEO!VW6T(3);ZJ(}qm z_r0TdjI?sLuwuc2EgM#>QpJX1%Wt5HKfw=x?>jv+k`wJ%SRSjdZ=d@*_uTJ%=iK)H zGgbZPKkodxDZ`(S|3AiK|A->OpOLo6=D2QT(~RVvYkEg#&Q)(UWoj1 z^DGrwuUDa5@?ZSc>IPL;Lea51y|B5L3uYm>AKLh{)W)ezT(TcONSZET?>hJBCQ}AP*=;FowFk9U2 zwxc++i#xr==xJ-``SSM7rLCK{27`Uqa?XAK)|b0W`0b>N8;iZ9cOyxy3)}4*pFDVI zKmP?q`ZV_AH0oxH&9J!(O;VS2+lw~NlCYgTj~99acOEM@plBo4w6QgCv8Bl@cPM6T z6uzoaXmJciSJTfdU?%+B={9X!G_|Z2m0NJHC1AvU3m(x9+I@ z`p8&W6L0#XCGO#|>nLJC88#@>CBA~sz&DJ-8Xn+jWrD6j#1|zhXr)Bwpai3GXQ+&v zp(??8ov3WmkgO0>YWF7q4ejpH=rH|ZK@QXt_sWvpQ@Jkg3h*Fv=nK%OP9{ER=(yJb3a*4oh^{gAyBB=cx`P z2a2=S4COHM3r`Nqa-b&Pt4Q{?;gGV!Nm; z7Iz7w%#O#g>vh6m%}t{mIs-i>PFd)hmK zdfGd2amOlY<-5`m!(Hi-X9Nk zvnt=n`my@GzS+3Ft;=Td(|&9n{Pf61+Jk6xTybQ%#&HuwAJ%uHUa_{KLSJXgJ{shV?m&QDa$q?t8SX2x7Z z?X0=zHF=r@0E6;z*QC$1|lEKD{;ZOL2mGPPhHlh%RWvoO97DEt4j8f7-PVS zAkfsv7o^yN)WCszz90tR9aCP$pkW^@;Y$m%g5Gsjq&0KQ6>>uIWpGUZ0gwckv89|1 zO2F!1HOz#{`r~v4%VPyB|2JJ8>V83;HUC))E?^^?(Tp5oDdA=<3%G|m%N0&w6|c%B~P7mkNfYo4dQ{_Np5+Zc%vF`v9Y!V=CG!Ad6}a(q2#L_T2Ww$AbN zwmilHz|+@x+1Dz^XoZ+b0m0*AR|m69 zx>^XF`Sc|K{9PcdtO)afZ!>O3%ttgPBB2K|1VA1rfnJQYlj0D#b8UYo-gx?qYr*?iH28o8VHYS%Fn4uXnA+_)yP@fIlI|et4nf`A?WcQj6r7=e zvAvhYghyi-*6W0SaGk}QEI4PtxT2u$b$c3Lg6~j#g<^)o4O|p*=OJ_g29;nAMO|OV z&Y_;vWY!%8Bs0aP60LGM>AR7IU*>CaTc^T-7*JrOUYNy=QDE7H%+fwmegnRA-CQwc zZ`QkP-Z1C9Y0oDMm*#W!_0fwlS-pvDp&UlZTE0Ja_y&WVijDJRM})cbd%WaVfWo(9 z%71?12G@tCf^ldIH5iFc31?)yD;oaTrO0HN zR=hX1A_5et)RQ^T=^Ta}y{+;Bqj##2Yyz};{1$U0Uj?m=-ij~HQxu&?zecb}`Gh&j zvdYs08y=k|L9?dpa>Pzef}Ll}L;nA72-BEFZwLXoE|_64OBtS5jfj_T2Y-e_`R%~u zr1o71zHN<RhEn!i=K{i`fAfT=ZJFDCikpP;>Eh$WL; zHLVDd;(wGv%@xFA5 z(k)4&g!h6(Q_?9*w<3*-bgR;+O81mBPNA(RUtytXiAq|Tk*F;3tZZSq3MDT@e$zNj zg*NI{D3|;fzxBF7)s;|m?RGzG?dF0x2=0Y8{yepDY7>|2#rKnzOW3>4J-TTWKYRG_ z*FkLiJ@j%#2>MBDw-dVxJH*di(+&G^i(~k3*gZVX6`gr=btQ^hy(nKYPFc;h<|>%A`{?GEJInZOr%Ml)`bqzKl3EvbI@dq^Xm!02 zP^3?DFHWOgw$ut+JJ2L`S+BEX<17g~$@6%zKXhlYaubR+b4{C@Ll;|`%yNffCPv|_ z8if{zQD70+0;b80GPXzotpm69u^K4g@u|J@*$+2wPsHX=L%pM$w=O#a(P-;_zZl*D6HWDo>r#l8bo|iqJmaRbPh@|DtCs;*cqx4 zY}AR$77fV?F{O5Y0?^Rz9*qvu9~5L?J#n`z*G6%i@o$Vs~pfg4_OOnEw zj3gx;=*g;s0;*d+X}dz-yN~YpgRZL-SE;PlPEp%c_!Gr5+NYGa%+dhb2X0%D)u<|~ z2UC(jTkQUntl`-&$Zk=x9~)HgI^RAc(X{TPD9=LKFUtKVkK~|4hutr+p?#L>K(enm zYoDVWW`5zxL0R_I(gZ)rzyjafnOIxEtedFBc^A^9@ADu4h;0?gP}&ITo5 zb+8&{LS^G|dJfBD1uXwhT^{OwL7g@KSr5)*Bbw2S9b!4*W-SZ2hdRq`O_Ks{9vcR( zJH0Tn&AmSy)OqZ|RTLW09`U#zWLYl@80QsdfM@7jrf}ZsWnH`wK0kph*&MjMd!5D& z-evI~i$xR)ZaBwDfR8$#?)vA@%r2l1uV@Md-z)$r)dG=I@!#@&bJd&i6)$uwl9}S= z3it%zz^U*&J;pB_52MxsPkZCpgYUL65+hFc4~vH(@8dOR%@f*(VV>2+ib@z zw>W83NWZ64$NATT_pxa30Sm$|P?lis>asAkTXA+>)9WPNM${dFy0tS%cjG8HMFC@b zKZ^;E<|wS!3IE_4i#J(t&VX@6LEZ25HNFHtp!hPy42KVKQOKQ#&_|i3V*_6FG z?~-}LobhHopDbKj$l2FNFUDl`CbETc7$xiZ{@CF=400ki&XXMz=JKELl3xJ|-;XID zqmllV-wMIsa2p@~MFs~~fWhCHFgQ5B4dw@$%lW1_Ld=*OmfX! zG*kWpYDJ`I`Tv*mM2$Z6+J}~#|KM(kTsbDR+<|yFe;8W8k)T9;pO^#~U#ao>gc?an znsI`*c##-=m87kZT-13N(95PGOVgCsG1{zrjeSg_&AdjN^}1$tWwbP#Y1oaMO?8-N zv)hXX9lR`@fDJ$uvU4q(CjtEE44PYap zbpjp0oT8MUz$O5(wFeLE%ao~%aGx+|?h}n_>Tr)qXb*5WeI;0wgoZQ!F zw4LNeIfsw#cTm?xPZkZBA7a}&VrF47}>yC_chYVyG)s@b;e;ElN_jFOW6{dWq z&v2TyXTK+y1*Bym124}wfQJOCZ+A~8i`mVmZ`~=W;K4c4WMj*vLM@ld%A490+B!LH zWbti2y?c3ca(sPqx>_x9j)<>LZ)eB!O)GgNo3c47D~HOMqqB>T?$c*>d6_JARn%5` zn%n-!TdSHz+ZW9W{bfIRAI#i6WnTNw#DNG!{AcV2Lop0SDHo9OI^Ud(Z>8@Q2Yhp` jY^yUa|8If+x5|XLyjj#mYxFz5R>!Y}s)<6X@P7OTdbZ4G literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/wrapper.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/wrapper.py new file mode 100644 index 0000000..d8e6fc6 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/wrapper.py @@ -0,0 +1,29 @@ +from .adapter import CacheControlAdapter +from .cache import DictCache + + +def CacheControl( + sess, + cache=None, + cache_etags=True, + serializer=None, + heuristic=None, + controller_class=None, + adapter_class=None, + cacheable_methods=None, +): + + cache = DictCache() if cache is None else cache + adapter_class = adapter_class or CacheControlAdapter + adapter = adapter_class( + cache, + cache_etags=cache_etags, + serializer=serializer, + heuristic=heuristic, + controller_class=controller_class, + cacheable_methods=cacheable_methods, + ) + sess.mount("http://", adapter) + sess.mount("https://", adapter) + + return sess diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/wrapper.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/wrapper.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0365cdd4aef56b7745525c907d44e68077b13473 GIT binary patch literal 923 zcmc&y&2H2%5FRJZZu%!Js*sSla>%8)rHD$1BA}f2koL3(R&L_%W^sP7CtJ44o|YHm znRo$aoGp|mAohHjKil7o9sWAp`~LIdO9tC7rvC>L_lY2B@M8#*0Xwgfh_)#NLBfDX1eYqC>&v=ATbqx$YEaugxJ$v$MTR~hV= zkG!+0X|#RWtk7TfqxZqg-81I3|6Cl1Pz?Tz-C!g}!8qXpQeNkqlk%RqzWI#Z|dvIg#Z8m literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/certifi/__init__ 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/certifi/__init__ 2.py new file mode 100644 index 0000000..0d59a05 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/certifi/__init__ 2.py @@ -0,0 +1,3 @@ +from .core import where + +__version__ = "2019.11.28" diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/certifi/__init__ 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/certifi/__init__ 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..271c7e194c5f61573e083089a917572dc8777731 GIT binary patch literal 287 zcmYL_%}T^D5P+wxf~*LheS%)LX?6t_R21|oqPv$p7;2Mtvt*N)j9u!}dG&dG0Vg6j z%zX0;!%XpgH2M0xdTHTLa`HE1@q{2rGcW+#3|1LrGKWsTlnJ;`*sWDi zaYE6o<`)&`)$IJCEK)m7w=SqB@_>f~AqEwqc2UP^Y5$K$Jf)gBY%>ie?f~k2#HFGA>>F&LkX1`X)+>nvMJ86ttp~NfOEuYuY!s* zjOvO%l$@9K{i?`QJ56^ks5N>5mk1$76{2=lh$0pL5gn$?2R*i+*w_ZvJ0o$J4W7xj z!|-|A^J>Qz(=@^X0G5l>zCsx+du3kxxwa8nW9IepZq=+)>DO?hl`gPO1<<`_LTIZ& Xh|*7Rfjb|MPQDxUoDPcV57*fb8CpVc literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/certifi/__main__ 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/certifi/__main__ 2.py new file mode 100644 index 0000000..ae2aff5 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/certifi/__main__ 2.py @@ -0,0 +1,2 @@ +from pip._vendor.certifi import where +print(where()) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/certifi/__main__ 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/certifi/__main__ 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3b874c9b898ffd71d087dccf140e0cf02c2e5d20 GIT binary patch literal 273 zcmZSn%*%E1fNfkd0~9a;X$K%KmH`qeK*Y$9!@!Ws$PmTIz?jO&(9FQ#?vcX85Ujxr zRFL@}2s9XhtP)lrQJ#@nl~)HpeVB}u_RT$EU`#GEk7qEwWwG>y+A*uFe|;vB+bwu$mn7!o=sLQ%76*iaguobTw?5Qv{rLFY#LT?-c)fzk5)Po9Ho5sJ Qr8%i~AP*FSTrI!|0Cv1a6#xJL literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/certifi/__main__.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/certifi/__main__.py new file mode 100644 index 0000000..ae2aff5 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/certifi/__main__.py @@ -0,0 +1,2 @@ +from pip._vendor.certifi import where +print(where()) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/certifi/__main__.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/certifi/__main__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6b91c60cef41dd7a0de2f01ce2b5e3e14742e250 GIT binary patch literal 273 zcmY*Uy>7xl4EBML5K^T|tbKqi#84_&O4Y4Q4A6<8r!N{k*cjDg(r2Z|#%KceiAA3(H*t$L z-lBx5vY<2FtLNeSD#CD-YZpz8d@5CB6+GF>MUbmVR}PZ0OhB6|DowgDCX3R9ZtB%) z+6(nB#$`k1;Tr+w89lg%0*n2eO6%L!C@z@s@U8>xL4cd5* z;>Xf}N>#U7`JcP+{Yj>5FxSbVkb#k~Fr^J3lYuHNL`4yS(q&NScw=-L#1Y-pt>nDx zt6z*!P3GVm9_B4Qc!~my|~F$Y?wv{I$0AP~)=LMm0-B9Q}*V{Z}%+w1I3Lj&|e zc@tiQE6>9VFtc{rM_}dsyz}$T&dg5j?`G@I@0Xtu zvjra$T;<6^85^c23RQ&Kl>U#%6a;KZbRGoQB>6+He{uT$EMhJPt+kPfMfbWC? z?mV#XR-)&`W4@p2n$-c<*zJzo-1kGkoSa3ayamW9NCWNwZb?a$W@QpAth3?5WoUoV zr7cOTOkCnrNtH)BPV$M=V<%6jwp@;usH8J9!sT%2IQEe8?A;X9TNO(^n$f|fw+dyM z#~~c+xtwV1%5R<9_6B#gMUdDew-{1J$hv!9>SZZer@y3#J!7B`>@C%bHLR9`DH2zqpG0lfRDg1aon|wVS z?{`M~2g~IGXNY)o@MYSeHOc);zetK*S45ibzB%dH^D9=lO+%K)+W65lG<2;W1WBG? z5bPC8S4f%4GfrWf6KQUVEwLe~F$Y@rPpwoHgakcQNCmkC2_JA=dy_cWUT1d_8lV@- zoA4w&6EDEb+G!twmG|?`&o?_WJFUO#y_-KTJ}1yDkN&S{+jD}HJ^?vEAs`e`co2FZ zSnEOFf}#y!yOvv!uRzg(umeRG!Y*ms@CzVZg>(fj`yGmw34%UffGvXepZ1&oL7y%7 znBYU1&6Tln{zjonP@CHS5t*WhEtxK(2)iVIJPR(*-(4ik<)CfauW8#a1PJhhP{5rB z_U%&ioOsIjQ(cob;0n9lk(>K|3Ye0!Xq2}AB?alg9l$LqiPCLMf`wH!T)GVHZ@RQ6 zY1N5K94o2HM5kFfl6vUm5!F`8>jf%l(U4)M=O`ytY~sQhA~KwC7POv6$lo5swePj(2H|O8?5QvTEBEk>}g{$43`oz$&+C$jVe3KN-h{uJxlRD>ICu zooe9=fM3_iQ=e%aZC&@H{uu9kiIh htqC>=T(uAIU+U&3I4yKK%hk&#bhcdHme>?qt$#<73g7?$ literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/big5freq 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/big5freq 2.py new file mode 100644 index 0000000..38f3251 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/big5freq 2.py @@ -0,0 +1,386 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# Big5 frequency table +# by Taiwan's Mandarin Promotion Council +# +# +# 128 --> 0.42261 +# 256 --> 0.57851 +# 512 --> 0.74851 +# 1024 --> 0.89384 +# 2048 --> 0.97583 +# +# Ideal Distribution Ratio = 0.74851/(1-0.74851) =2.98 +# Random Distribution Ration = 512/(5401-512)=0.105 +# +# Typical Distribution Ratio about 25% of Ideal one, still much higher than RDR + +BIG5_TYPICAL_DISTRIBUTION_RATIO = 0.75 + +#Char to FreqOrder table +BIG5_TABLE_SIZE = 5376 + +BIG5_CHAR_TO_FREQ_ORDER = ( + 1,1801,1506, 255,1431, 198, 9, 82, 6,5008, 177, 202,3681,1256,2821, 110, # 16 +3814, 33,3274, 261, 76, 44,2114, 16,2946,2187,1176, 659,3971, 26,3451,2653, # 32 +1198,3972,3350,4202, 410,2215, 302, 590, 361,1964, 8, 204, 58,4510,5009,1932, # 48 + 63,5010,5011, 317,1614, 75, 222, 159,4203,2417,1480,5012,3555,3091, 224,2822, # 64 +3682, 3, 10,3973,1471, 29,2787,1135,2866,1940, 873, 130,3275,1123, 312,5013, # 80 +4511,2052, 507, 252, 682,5014, 142,1915, 124, 206,2947, 34,3556,3204, 64, 604, # 96 +5015,2501,1977,1978, 155,1991, 645, 641,1606,5016,3452, 337, 72, 406,5017, 80, # 112 + 630, 238,3205,1509, 263, 939,1092,2654, 756,1440,1094,3453, 449, 69,2987, 591, # 128 + 179,2096, 471, 115,2035,1844, 60, 50,2988, 134, 806,1869, 734,2036,3454, 180, # 144 + 995,1607, 156, 537,2907, 688,5018, 319,1305, 779,2145, 514,2379, 298,4512, 359, # 160 +2502, 90,2716,1338, 663, 11, 906,1099,2553, 20,2441, 182, 532,1716,5019, 732, # 176 +1376,4204,1311,1420,3206, 25,2317,1056, 113, 399, 382,1950, 242,3455,2474, 529, # 192 +3276, 475,1447,3683,5020, 117, 21, 656, 810,1297,2300,2334,3557,5021, 126,4205, # 208 + 706, 456, 150, 613,4513, 71,1118,2037,4206, 145,3092, 85, 835, 486,2115,1246, # 224 +1426, 428, 727,1285,1015, 800, 106, 623, 303,1281,5022,2128,2359, 347,3815, 221, # 240 +3558,3135,5023,1956,1153,4207, 83, 296,1199,3093, 192, 624, 93,5024, 822,1898, # 256 +2823,3136, 795,2065, 991,1554,1542,1592, 27, 43,2867, 859, 139,1456, 860,4514, # 272 + 437, 712,3974, 164,2397,3137, 695, 211,3037,2097, 195,3975,1608,3559,3560,3684, # 288 +3976, 234, 811,2989,2098,3977,2233,1441,3561,1615,2380, 668,2077,1638, 305, 228, # 304 +1664,4515, 467, 415,5025, 262,2099,1593, 239, 108, 300, 200,1033, 512,1247,2078, # 320 +5026,5027,2176,3207,3685,2682, 593, 845,1062,3277, 88,1723,2038,3978,1951, 212, # 336 + 266, 152, 149, 468,1899,4208,4516, 77, 187,5028,3038, 37, 5,2990,5029,3979, # 352 +5030,5031, 39,2524,4517,2908,3208,2079, 55, 148, 74,4518, 545, 483,1474,1029, # 368 +1665, 217,1870,1531,3138,1104,2655,4209, 24, 172,3562, 900,3980,3563,3564,4519, # 384 + 32,1408,2824,1312, 329, 487,2360,2251,2717, 784,2683, 4,3039,3351,1427,1789, # 400 + 188, 109, 499,5032,3686,1717,1790, 888,1217,3040,4520,5033,3565,5034,3352,1520, # 416 +3687,3981, 196,1034, 775,5035,5036, 929,1816, 249, 439, 38,5037,1063,5038, 794, # 432 +3982,1435,2301, 46, 178,3278,2066,5039,2381,5040, 214,1709,4521, 804, 35, 707, # 448 + 324,3688,1601,2554, 140, 459,4210,5041,5042,1365, 839, 272, 978,2262,2580,3456, # 464 +2129,1363,3689,1423, 697, 100,3094, 48, 70,1231, 495,3139,2196,5043,1294,5044, # 480 +2080, 462, 586,1042,3279, 853, 256, 988, 185,2382,3457,1698, 434,1084,5045,3458, # 496 + 314,2625,2788,4522,2335,2336, 569,2285, 637,1817,2525, 757,1162,1879,1616,3459, # 512 + 287,1577,2116, 768,4523,1671,2868,3566,2526,1321,3816, 909,2418,5046,4211, 933, # 528 +3817,4212,2053,2361,1222,4524, 765,2419,1322, 786,4525,5047,1920,1462,1677,2909, # 544 +1699,5048,4526,1424,2442,3140,3690,2600,3353,1775,1941,3460,3983,4213, 309,1369, # 560 +1130,2825, 364,2234,1653,1299,3984,3567,3985,3986,2656, 525,1085,3041, 902,2001, # 576 +1475, 964,4527, 421,1845,1415,1057,2286, 940,1364,3141, 376,4528,4529,1381, 7, # 592 +2527, 983,2383, 336,1710,2684,1846, 321,3461, 559,1131,3042,2752,1809,1132,1313, # 608 + 265,1481,1858,5049, 352,1203,2826,3280, 167,1089, 420,2827, 776, 792,1724,3568, # 624 +4214,2443,3281,5050,4215,5051, 446, 229, 333,2753, 901,3818,1200,1557,4530,2657, # 640 +1921, 395,2754,2685,3819,4216,1836, 125, 916,3209,2626,4531,5052,5053,3820,5054, # 656 +5055,5056,4532,3142,3691,1133,2555,1757,3462,1510,2318,1409,3569,5057,2146, 438, # 672 +2601,2910,2384,3354,1068, 958,3043, 461, 311,2869,2686,4217,1916,3210,4218,1979, # 688 + 383, 750,2755,2627,4219, 274, 539, 385,1278,1442,5058,1154,1965, 384, 561, 210, # 704 + 98,1295,2556,3570,5059,1711,2420,1482,3463,3987,2911,1257, 129,5060,3821, 642, # 720 + 523,2789,2790,2658,5061, 141,2235,1333, 68, 176, 441, 876, 907,4220, 603,2602, # 736 + 710, 171,3464, 404, 549, 18,3143,2398,1410,3692,1666,5062,3571,4533,2912,4534, # 752 +5063,2991, 368,5064, 146, 366, 99, 871,3693,1543, 748, 807,1586,1185, 22,2263, # 768 + 379,3822,3211,5065,3212, 505,1942,2628,1992,1382,2319,5066, 380,2362, 218, 702, # 784 +1818,1248,3465,3044,3572,3355,3282,5067,2992,3694, 930,3283,3823,5068, 59,5069, # 800 + 585, 601,4221, 497,3466,1112,1314,4535,1802,5070,1223,1472,2177,5071, 749,1837, # 816 + 690,1900,3824,1773,3988,1476, 429,1043,1791,2236,2117, 917,4222, 447,1086,1629, # 832 +5072, 556,5073,5074,2021,1654, 844,1090, 105, 550, 966,1758,2828,1008,1783, 686, # 848 +1095,5075,2287, 793,1602,5076,3573,2603,4536,4223,2948,2302,4537,3825, 980,2503, # 864 + 544, 353, 527,4538, 908,2687,2913,5077, 381,2629,1943,1348,5078,1341,1252, 560, # 880 +3095,5079,3467,2870,5080,2054, 973, 886,2081, 143,4539,5081,5082, 157,3989, 496, # 896 +4224, 57, 840, 540,2039,4540,4541,3468,2118,1445, 970,2264,1748,1966,2082,4225, # 912 +3144,1234,1776,3284,2829,3695, 773,1206,2130,1066,2040,1326,3990,1738,1725,4226, # 928 + 279,3145, 51,1544,2604, 423,1578,2131,2067, 173,4542,1880,5083,5084,1583, 264, # 944 + 610,3696,4543,2444, 280, 154,5085,5086,5087,1739, 338,1282,3096, 693,2871,1411, # 960 +1074,3826,2445,5088,4544,5089,5090,1240, 952,2399,5091,2914,1538,2688, 685,1483, # 976 +4227,2475,1436, 953,4228,2055,4545, 671,2400, 79,4229,2446,3285, 608, 567,2689, # 992 +3469,4230,4231,1691, 393,1261,1792,2401,5092,4546,5093,5094,5095,5096,1383,1672, # 1008 +3827,3213,1464, 522,1119, 661,1150, 216, 675,4547,3991,1432,3574, 609,4548,2690, # 1024 +2402,5097,5098,5099,4232,3045, 0,5100,2476, 315, 231,2447, 301,3356,4549,2385, # 1040 +5101, 233,4233,3697,1819,4550,4551,5102, 96,1777,1315,2083,5103, 257,5104,1810, # 1056 +3698,2718,1139,1820,4234,2022,1124,2164,2791,1778,2659,5105,3097, 363,1655,3214, # 1072 +5106,2993,5107,5108,5109,3992,1567,3993, 718, 103,3215, 849,1443, 341,3357,2949, # 1088 +1484,5110,1712, 127, 67, 339,4235,2403, 679,1412, 821,5111,5112, 834, 738, 351, # 1104 +2994,2147, 846, 235,1497,1881, 418,1993,3828,2719, 186,1100,2148,2756,3575,1545, # 1120 +1355,2950,2872,1377, 583,3994,4236,2581,2995,5113,1298,3699,1078,2557,3700,2363, # 1136 + 78,3829,3830, 267,1289,2100,2002,1594,4237, 348, 369,1274,2197,2178,1838,4552, # 1152 +1821,2830,3701,2757,2288,2003,4553,2951,2758, 144,3358, 882,4554,3995,2759,3470, # 1168 +4555,2915,5114,4238,1726, 320,5115,3996,3046, 788,2996,5116,2831,1774,1327,2873, # 1184 +3997,2832,5117,1306,4556,2004,1700,3831,3576,2364,2660, 787,2023, 506, 824,3702, # 1200 + 534, 323,4557,1044,3359,2024,1901, 946,3471,5118,1779,1500,1678,5119,1882,4558, # 1216 + 165, 243,4559,3703,2528, 123, 683,4239, 764,4560, 36,3998,1793, 589,2916, 816, # 1232 + 626,1667,3047,2237,1639,1555,1622,3832,3999,5120,4000,2874,1370,1228,1933, 891, # 1248 +2084,2917, 304,4240,5121, 292,2997,2720,3577, 691,2101,4241,1115,4561, 118, 662, # 1264 +5122, 611,1156, 854,2386,1316,2875, 2, 386, 515,2918,5123,5124,3286, 868,2238, # 1280 +1486, 855,2661, 785,2216,3048,5125,1040,3216,3578,5126,3146, 448,5127,1525,5128, # 1296 +2165,4562,5129,3833,5130,4242,2833,3579,3147, 503, 818,4001,3148,1568, 814, 676, # 1312 +1444, 306,1749,5131,3834,1416,1030, 197,1428, 805,2834,1501,4563,5132,5133,5134, # 1328 +1994,5135,4564,5136,5137,2198, 13,2792,3704,2998,3149,1229,1917,5138,3835,2132, # 1344 +5139,4243,4565,2404,3580,5140,2217,1511,1727,1120,5141,5142, 646,3836,2448, 307, # 1360 +5143,5144,1595,3217,5145,5146,5147,3705,1113,1356,4002,1465,2529,2530,5148, 519, # 1376 +5149, 128,2133, 92,2289,1980,5150,4003,1512, 342,3150,2199,5151,2793,2218,1981, # 1392 +3360,4244, 290,1656,1317, 789, 827,2365,5152,3837,4566, 562, 581,4004,5153, 401, # 1408 +4567,2252, 94,4568,5154,1399,2794,5155,1463,2025,4569,3218,1944,5156, 828,1105, # 1424 +4245,1262,1394,5157,4246, 605,4570,5158,1784,2876,5159,2835, 819,2102, 578,2200, # 1440 +2952,5160,1502, 436,3287,4247,3288,2836,4005,2919,3472,3473,5161,2721,2320,5162, # 1456 +5163,2337,2068, 23,4571, 193, 826,3838,2103, 699,1630,4248,3098, 390,1794,1064, # 1472 +3581,5164,1579,3099,3100,1400,5165,4249,1839,1640,2877,5166,4572,4573, 137,4250, # 1488 + 598,3101,1967, 780, 104, 974,2953,5167, 278, 899, 253, 402, 572, 504, 493,1339, # 1504 +5168,4006,1275,4574,2582,2558,5169,3706,3049,3102,2253, 565,1334,2722, 863, 41, # 1520 +5170,5171,4575,5172,1657,2338, 19, 463,2760,4251, 606,5173,2999,3289,1087,2085, # 1536 +1323,2662,3000,5174,1631,1623,1750,4252,2691,5175,2878, 791,2723,2663,2339, 232, # 1552 +2421,5176,3001,1498,5177,2664,2630, 755,1366,3707,3290,3151,2026,1609, 119,1918, # 1568 +3474, 862,1026,4253,5178,4007,3839,4576,4008,4577,2265,1952,2477,5179,1125, 817, # 1584 +4254,4255,4009,1513,1766,2041,1487,4256,3050,3291,2837,3840,3152,5180,5181,1507, # 1600 +5182,2692, 733, 40,1632,1106,2879, 345,4257, 841,2531, 230,4578,3002,1847,3292, # 1616 +3475,5183,1263, 986,3476,5184, 735, 879, 254,1137, 857, 622,1300,1180,1388,1562, # 1632 +4010,4011,2954, 967,2761,2665,1349, 592,2134,1692,3361,3003,1995,4258,1679,4012, # 1648 +1902,2188,5185, 739,3708,2724,1296,1290,5186,4259,2201,2202,1922,1563,2605,2559, # 1664 +1871,2762,3004,5187, 435,5188, 343,1108, 596, 17,1751,4579,2239,3477,3709,5189, # 1680 +4580, 294,3582,2955,1693, 477, 979, 281,2042,3583, 643,2043,3710,2631,2795,2266, # 1696 +1031,2340,2135,2303,3584,4581, 367,1249,2560,5190,3585,5191,4582,1283,3362,2005, # 1712 + 240,1762,3363,4583,4584, 836,1069,3153, 474,5192,2149,2532, 268,3586,5193,3219, # 1728 +1521,1284,5194,1658,1546,4260,5195,3587,3588,5196,4261,3364,2693,1685,4262, 961, # 1744 +1673,2632, 190,2006,2203,3841,4585,4586,5197, 570,2504,3711,1490,5198,4587,2633, # 1760 +3293,1957,4588, 584,1514, 396,1045,1945,5199,4589,1968,2449,5200,5201,4590,4013, # 1776 + 619,5202,3154,3294, 215,2007,2796,2561,3220,4591,3221,4592, 763,4263,3842,4593, # 1792 +5203,5204,1958,1767,2956,3365,3712,1174, 452,1477,4594,3366,3155,5205,2838,1253, # 1808 +2387,2189,1091,2290,4264, 492,5206, 638,1169,1825,2136,1752,4014, 648, 926,1021, # 1824 +1324,4595, 520,4596, 997, 847,1007, 892,4597,3843,2267,1872,3713,2405,1785,4598, # 1840 +1953,2957,3103,3222,1728,4265,2044,3714,4599,2008,1701,3156,1551, 30,2268,4266, # 1856 +5207,2027,4600,3589,5208, 501,5209,4267, 594,3478,2166,1822,3590,3479,3591,3223, # 1872 + 829,2839,4268,5210,1680,3157,1225,4269,5211,3295,4601,4270,3158,2341,5212,4602, # 1888 +4271,5213,4015,4016,5214,1848,2388,2606,3367,5215,4603, 374,4017, 652,4272,4273, # 1904 + 375,1140, 798,5216,5217,5218,2366,4604,2269, 546,1659, 138,3051,2450,4605,5219, # 1920 +2254, 612,1849, 910, 796,3844,1740,1371, 825,3845,3846,5220,2920,2562,5221, 692, # 1936 + 444,3052,2634, 801,4606,4274,5222,1491, 244,1053,3053,4275,4276, 340,5223,4018, # 1952 +1041,3005, 293,1168, 87,1357,5224,1539, 959,5225,2240, 721, 694,4277,3847, 219, # 1968 +1478, 644,1417,3368,2666,1413,1401,1335,1389,4019,5226,5227,3006,2367,3159,1826, # 1984 + 730,1515, 184,2840, 66,4607,5228,1660,2958, 246,3369, 378,1457, 226,3480, 975, # 2000 +4020,2959,1264,3592, 674, 696,5229, 163,5230,1141,2422,2167, 713,3593,3370,4608, # 2016 +4021,5231,5232,1186, 15,5233,1079,1070,5234,1522,3224,3594, 276,1050,2725, 758, # 2032 +1126, 653,2960,3296,5235,2342, 889,3595,4022,3104,3007, 903,1250,4609,4023,3481, # 2048 +3596,1342,1681,1718, 766,3297, 286, 89,2961,3715,5236,1713,5237,2607,3371,3008, # 2064 +5238,2962,2219,3225,2880,5239,4610,2505,2533, 181, 387,1075,4024, 731,2190,3372, # 2080 +5240,3298, 310, 313,3482,2304, 770,4278, 54,3054, 189,4611,3105,3848,4025,5241, # 2096 +1230,1617,1850, 355,3597,4279,4612,3373, 111,4280,3716,1350,3160,3483,3055,4281, # 2112 +2150,3299,3598,5242,2797,4026,4027,3009, 722,2009,5243,1071, 247,1207,2343,2478, # 2128 +1378,4613,2010, 864,1437,1214,4614, 373,3849,1142,2220, 667,4615, 442,2763,2563, # 2144 +3850,4028,1969,4282,3300,1840, 837, 170,1107, 934,1336,1883,5244,5245,2119,4283, # 2160 +2841, 743,1569,5246,4616,4284, 582,2389,1418,3484,5247,1803,5248, 357,1395,1729, # 2176 +3717,3301,2423,1564,2241,5249,3106,3851,1633,4617,1114,2086,4285,1532,5250, 482, # 2192 +2451,4618,5251,5252,1492, 833,1466,5253,2726,3599,1641,2842,5254,1526,1272,3718, # 2208 +4286,1686,1795, 416,2564,1903,1954,1804,5255,3852,2798,3853,1159,2321,5256,2881, # 2224 +4619,1610,1584,3056,2424,2764, 443,3302,1163,3161,5257,5258,4029,5259,4287,2506, # 2240 +3057,4620,4030,3162,2104,1647,3600,2011,1873,4288,5260,4289, 431,3485,5261, 250, # 2256 + 97, 81,4290,5262,1648,1851,1558, 160, 848,5263, 866, 740,1694,5264,2204,2843, # 2272 +3226,4291,4621,3719,1687, 950,2479, 426, 469,3227,3720,3721,4031,5265,5266,1188, # 2288 + 424,1996, 861,3601,4292,3854,2205,2694, 168,1235,3602,4293,5267,2087,1674,4622, # 2304 +3374,3303, 220,2565,1009,5268,3855, 670,3010, 332,1208, 717,5269,5270,3603,2452, # 2320 +4032,3375,5271, 513,5272,1209,2882,3376,3163,4623,1080,5273,5274,5275,5276,2534, # 2336 +3722,3604, 815,1587,4033,4034,5277,3605,3486,3856,1254,4624,1328,3058,1390,4035, # 2352 +1741,4036,3857,4037,5278, 236,3858,2453,3304,5279,5280,3723,3859,1273,3860,4625, # 2368 +5281, 308,5282,4626, 245,4627,1852,2480,1307,2583, 430, 715,2137,2454,5283, 270, # 2384 + 199,2883,4038,5284,3606,2727,1753, 761,1754, 725,1661,1841,4628,3487,3724,5285, # 2400 +5286, 587, 14,3305, 227,2608, 326, 480,2270, 943,2765,3607, 291, 650,1884,5287, # 2416 +1702,1226, 102,1547, 62,3488, 904,4629,3489,1164,4294,5288,5289,1224,1548,2766, # 2432 + 391, 498,1493,5290,1386,1419,5291,2056,1177,4630, 813, 880,1081,2368, 566,1145, # 2448 +4631,2291,1001,1035,2566,2609,2242, 394,1286,5292,5293,2069,5294, 86,1494,1730, # 2464 +4039, 491,1588, 745, 897,2963, 843,3377,4040,2767,2884,3306,1768, 998,2221,2070, # 2480 + 397,1827,1195,1970,3725,3011,3378, 284,5295,3861,2507,2138,2120,1904,5296,4041, # 2496 +2151,4042,4295,1036,3490,1905, 114,2567,4296, 209,1527,5297,5298,2964,2844,2635, # 2512 +2390,2728,3164, 812,2568,5299,3307,5300,1559, 737,1885,3726,1210, 885, 28,2695, # 2528 +3608,3862,5301,4297,1004,1780,4632,5302, 346,1982,2222,2696,4633,3863,1742, 797, # 2544 +1642,4043,1934,1072,1384,2152, 896,4044,3308,3727,3228,2885,3609,5303,2569,1959, # 2560 +4634,2455,1786,5304,5305,5306,4045,4298,1005,1308,3728,4299,2729,4635,4636,1528, # 2576 +2610, 161,1178,4300,1983, 987,4637,1101,4301, 631,4046,1157,3229,2425,1343,1241, # 2592 +1016,2243,2570, 372, 877,2344,2508,1160, 555,1935, 911,4047,5307, 466,1170, 169, # 2608 +1051,2921,2697,3729,2481,3012,1182,2012,2571,1251,2636,5308, 992,2345,3491,1540, # 2624 +2730,1201,2071,2406,1997,2482,5309,4638, 528,1923,2191,1503,1874,1570,2369,3379, # 2640 +3309,5310, 557,1073,5311,1828,3492,2088,2271,3165,3059,3107, 767,3108,2799,4639, # 2656 +1006,4302,4640,2346,1267,2179,3730,3230, 778,4048,3231,2731,1597,2667,5312,4641, # 2672 +5313,3493,5314,5315,5316,3310,2698,1433,3311, 131, 95,1504,4049, 723,4303,3166, # 2688 +1842,3610,2768,2192,4050,2028,2105,3731,5317,3013,4051,1218,5318,3380,3232,4052, # 2704 +4304,2584, 248,1634,3864, 912,5319,2845,3732,3060,3865, 654, 53,5320,3014,5321, # 2720 +1688,4642, 777,3494,1032,4053,1425,5322, 191, 820,2121,2846, 971,4643, 931,3233, # 2736 + 135, 664, 783,3866,1998, 772,2922,1936,4054,3867,4644,2923,3234, 282,2732, 640, # 2752 +1372,3495,1127, 922, 325,3381,5323,5324, 711,2045,5325,5326,4055,2223,2800,1937, # 2768 +4056,3382,2224,2255,3868,2305,5327,4645,3869,1258,3312,4057,3235,2139,2965,4058, # 2784 +4059,5328,2225, 258,3236,4646, 101,1227,5329,3313,1755,5330,1391,3314,5331,2924, # 2800 +2057, 893,5332,5333,5334,1402,4305,2347,5335,5336,3237,3611,5337,5338, 878,1325, # 2816 +1781,2801,4647, 259,1385,2585, 744,1183,2272,4648,5339,4060,2509,5340, 684,1024, # 2832 +4306,5341, 472,3612,3496,1165,3315,4061,4062, 322,2153, 881, 455,1695,1152,1340, # 2848 + 660, 554,2154,4649,1058,4650,4307, 830,1065,3383,4063,4651,1924,5342,1703,1919, # 2864 +5343, 932,2273, 122,5344,4652, 947, 677,5345,3870,2637, 297,1906,1925,2274,4653, # 2880 +2322,3316,5346,5347,4308,5348,4309, 84,4310, 112, 989,5349, 547,1059,4064, 701, # 2896 +3613,1019,5350,4311,5351,3497, 942, 639, 457,2306,2456, 993,2966, 407, 851, 494, # 2912 +4654,3384, 927,5352,1237,5353,2426,3385, 573,4312, 680, 921,2925,1279,1875, 285, # 2928 + 790,1448,1984, 719,2168,5354,5355,4655,4065,4066,1649,5356,1541, 563,5357,1077, # 2944 +5358,3386,3061,3498, 511,3015,4067,4068,3733,4069,1268,2572,3387,3238,4656,4657, # 2960 +5359, 535,1048,1276,1189,2926,2029,3167,1438,1373,2847,2967,1134,2013,5360,4313, # 2976 +1238,2586,3109,1259,5361, 700,5362,2968,3168,3734,4314,5363,4315,1146,1876,1907, # 2992 +4658,2611,4070, 781,2427, 132,1589, 203, 147, 273,2802,2407, 898,1787,2155,4071, # 3008 +4072,5364,3871,2803,5365,5366,4659,4660,5367,3239,5368,1635,3872, 965,5369,1805, # 3024 +2699,1516,3614,1121,1082,1329,3317,4073,1449,3873, 65,1128,2848,2927,2769,1590, # 3040 +3874,5370,5371, 12,2668, 45, 976,2587,3169,4661, 517,2535,1013,1037,3240,5372, # 3056 +3875,2849,5373,3876,5374,3499,5375,2612, 614,1999,2323,3877,3110,2733,2638,5376, # 3072 +2588,4316, 599,1269,5377,1811,3735,5378,2700,3111, 759,1060, 489,1806,3388,3318, # 3088 +1358,5379,5380,2391,1387,1215,2639,2256, 490,5381,5382,4317,1759,2392,2348,5383, # 3104 +4662,3878,1908,4074,2640,1807,3241,4663,3500,3319,2770,2349, 874,5384,5385,3501, # 3120 +3736,1859, 91,2928,3737,3062,3879,4664,5386,3170,4075,2669,5387,3502,1202,1403, # 3136 +3880,2969,2536,1517,2510,4665,3503,2511,5388,4666,5389,2701,1886,1495,1731,4076, # 3152 +2370,4667,5390,2030,5391,5392,4077,2702,1216, 237,2589,4318,2324,4078,3881,4668, # 3168 +4669,2703,3615,3504, 445,4670,5393,5394,5395,5396,2771, 61,4079,3738,1823,4080, # 3184 +5397, 687,2046, 935, 925, 405,2670, 703,1096,1860,2734,4671,4081,1877,1367,2704, # 3200 +3389, 918,2106,1782,2483, 334,3320,1611,1093,4672, 564,3171,3505,3739,3390, 945, # 3216 +2641,2058,4673,5398,1926, 872,4319,5399,3506,2705,3112, 349,4320,3740,4082,4674, # 3232 +3882,4321,3741,2156,4083,4675,4676,4322,4677,2408,2047, 782,4084, 400, 251,4323, # 3248 +1624,5400,5401, 277,3742, 299,1265, 476,1191,3883,2122,4324,4325,1109, 205,5402, # 3264 +2590,1000,2157,3616,1861,5403,5404,5405,4678,5406,4679,2573, 107,2484,2158,4085, # 3280 +3507,3172,5407,1533, 541,1301, 158, 753,4326,2886,3617,5408,1696, 370,1088,4327, # 3296 +4680,3618, 579, 327, 440, 162,2244, 269,1938,1374,3508, 968,3063, 56,1396,3113, # 3312 +2107,3321,3391,5409,1927,2159,4681,3016,5410,3619,5411,5412,3743,4682,2485,5413, # 3328 +2804,5414,1650,4683,5415,2613,5416,5417,4086,2671,3392,1149,3393,4087,3884,4088, # 3344 +5418,1076, 49,5419, 951,3242,3322,3323, 450,2850, 920,5420,1812,2805,2371,4328, # 3360 +1909,1138,2372,3885,3509,5421,3243,4684,1910,1147,1518,2428,4685,3886,5422,4686, # 3376 +2393,2614, 260,1796,3244,5423,5424,3887,3324, 708,5425,3620,1704,5426,3621,1351, # 3392 +1618,3394,3017,1887, 944,4329,3395,4330,3064,3396,4331,5427,3744, 422, 413,1714, # 3408 +3325, 500,2059,2350,4332,2486,5428,1344,1911, 954,5429,1668,5430,5431,4089,2409, # 3424 +4333,3622,3888,4334,5432,2307,1318,2512,3114, 133,3115,2887,4687, 629, 31,2851, # 3440 +2706,3889,4688, 850, 949,4689,4090,2970,1732,2089,4335,1496,1853,5433,4091, 620, # 3456 +3245, 981,1242,3745,3397,1619,3746,1643,3326,2140,2457,1971,1719,3510,2169,5434, # 3472 +3246,5435,5436,3398,1829,5437,1277,4690,1565,2048,5438,1636,3623,3116,5439, 869, # 3488 +2852, 655,3890,3891,3117,4092,3018,3892,1310,3624,4691,5440,5441,5442,1733, 558, # 3504 +4692,3747, 335,1549,3065,1756,4336,3748,1946,3511,1830,1291,1192, 470,2735,2108, # 3520 +2806, 913,1054,4093,5443,1027,5444,3066,4094,4693, 982,2672,3399,3173,3512,3247, # 3536 +3248,1947,2807,5445, 571,4694,5446,1831,5447,3625,2591,1523,2429,5448,2090, 984, # 3552 +4695,3749,1960,5449,3750, 852, 923,2808,3513,3751, 969,1519, 999,2049,2325,1705, # 3568 +5450,3118, 615,1662, 151, 597,4095,2410,2326,1049, 275,4696,3752,4337, 568,3753, # 3584 +3626,2487,4338,3754,5451,2430,2275, 409,3249,5452,1566,2888,3514,1002, 769,2853, # 3600 + 194,2091,3174,3755,2226,3327,4339, 628,1505,5453,5454,1763,2180,3019,4096, 521, # 3616 +1161,2592,1788,2206,2411,4697,4097,1625,4340,4341, 412, 42,3119, 464,5455,2642, # 3632 +4698,3400,1760,1571,2889,3515,2537,1219,2207,3893,2643,2141,2373,4699,4700,3328, # 3648 +1651,3401,3627,5456,5457,3628,2488,3516,5458,3756,5459,5460,2276,2092, 460,5461, # 3664 +4701,5462,3020, 962, 588,3629, 289,3250,2644,1116, 52,5463,3067,1797,5464,5465, # 3680 +5466,1467,5467,1598,1143,3757,4342,1985,1734,1067,4702,1280,3402, 465,4703,1572, # 3696 + 510,5468,1928,2245,1813,1644,3630,5469,4704,3758,5470,5471,2673,1573,1534,5472, # 3712 +5473, 536,1808,1761,3517,3894,3175,2645,5474,5475,5476,4705,3518,2929,1912,2809, # 3728 +5477,3329,1122, 377,3251,5478, 360,5479,5480,4343,1529, 551,5481,2060,3759,1769, # 3744 +2431,5482,2930,4344,3330,3120,2327,2109,2031,4706,1404, 136,1468,1479, 672,1171, # 3760 +3252,2308, 271,3176,5483,2772,5484,2050, 678,2736, 865,1948,4707,5485,2014,4098, # 3776 +2971,5486,2737,2227,1397,3068,3760,4708,4709,1735,2931,3403,3631,5487,3895, 509, # 3792 +2854,2458,2890,3896,5488,5489,3177,3178,4710,4345,2538,4711,2309,1166,1010, 552, # 3808 + 681,1888,5490,5491,2972,2973,4099,1287,1596,1862,3179, 358, 453, 736, 175, 478, # 3824 +1117, 905,1167,1097,5492,1854,1530,5493,1706,5494,2181,3519,2292,3761,3520,3632, # 3840 +4346,2093,4347,5495,3404,1193,2489,4348,1458,2193,2208,1863,1889,1421,3331,2932, # 3856 +3069,2182,3521, 595,2123,5496,4100,5497,5498,4349,1707,2646, 223,3762,1359, 751, # 3872 +3121, 183,3522,5499,2810,3021, 419,2374, 633, 704,3897,2394, 241,5500,5501,5502, # 3888 + 838,3022,3763,2277,2773,2459,3898,1939,2051,4101,1309,3122,2246,1181,5503,1136, # 3904 +2209,3899,2375,1446,4350,2310,4712,5504,5505,4351,1055,2615, 484,3764,5506,4102, # 3920 + 625,4352,2278,3405,1499,4353,4103,5507,4104,4354,3253,2279,2280,3523,5508,5509, # 3936 +2774, 808,2616,3765,3406,4105,4355,3123,2539, 526,3407,3900,4356, 955,5510,1620, # 3952 +4357,2647,2432,5511,1429,3766,1669,1832, 994, 928,5512,3633,1260,5513,5514,5515, # 3968 +1949,2293, 741,2933,1626,4358,2738,2460, 867,1184, 362,3408,1392,5516,5517,4106, # 3984 +4359,1770,1736,3254,2934,4713,4714,1929,2707,1459,1158,5518,3070,3409,2891,1292, # 4000 +1930,2513,2855,3767,1986,1187,2072,2015,2617,4360,5519,2574,2514,2170,3768,2490, # 4016 +3332,5520,3769,4715,5521,5522, 666,1003,3023,1022,3634,4361,5523,4716,1814,2257, # 4032 + 574,3901,1603, 295,1535, 705,3902,4362, 283, 858, 417,5524,5525,3255,4717,4718, # 4048 +3071,1220,1890,1046,2281,2461,4107,1393,1599, 689,2575, 388,4363,5526,2491, 802, # 4064 +5527,2811,3903,2061,1405,2258,5528,4719,3904,2110,1052,1345,3256,1585,5529, 809, # 4080 +5530,5531,5532, 575,2739,3524, 956,1552,1469,1144,2328,5533,2329,1560,2462,3635, # 4096 +3257,4108, 616,2210,4364,3180,2183,2294,5534,1833,5535,3525,4720,5536,1319,3770, # 4112 +3771,1211,3636,1023,3258,1293,2812,5537,5538,5539,3905, 607,2311,3906, 762,2892, # 4128 +1439,4365,1360,4721,1485,3072,5540,4722,1038,4366,1450,2062,2648,4367,1379,4723, # 4144 +2593,5541,5542,4368,1352,1414,2330,2935,1172,5543,5544,3907,3908,4724,1798,1451, # 4160 +5545,5546,5547,5548,2936,4109,4110,2492,2351, 411,4111,4112,3637,3333,3124,4725, # 4176 +1561,2674,1452,4113,1375,5549,5550, 47,2974, 316,5551,1406,1591,2937,3181,5552, # 4192 +1025,2142,3125,3182, 354,2740, 884,2228,4369,2412, 508,3772, 726,3638, 996,2433, # 4208 +3639, 729,5553, 392,2194,1453,4114,4726,3773,5554,5555,2463,3640,2618,1675,2813, # 4224 + 919,2352,2975,2353,1270,4727,4115, 73,5556,5557, 647,5558,3259,2856,2259,1550, # 4240 +1346,3024,5559,1332, 883,3526,5560,5561,5562,5563,3334,2775,5564,1212, 831,1347, # 4256 +4370,4728,2331,3909,1864,3073, 720,3910,4729,4730,3911,5565,4371,5566,5567,4731, # 4272 +5568,5569,1799,4732,3774,2619,4733,3641,1645,2376,4734,5570,2938, 669,2211,2675, # 4288 +2434,5571,2893,5572,5573,1028,3260,5574,4372,2413,5575,2260,1353,5576,5577,4735, # 4304 +3183, 518,5578,4116,5579,4373,1961,5580,2143,4374,5581,5582,3025,2354,2355,3912, # 4320 + 516,1834,1454,4117,2708,4375,4736,2229,2620,1972,1129,3642,5583,2776,5584,2976, # 4336 +1422, 577,1470,3026,1524,3410,5585,5586, 432,4376,3074,3527,5587,2594,1455,2515, # 4352 +2230,1973,1175,5588,1020,2741,4118,3528,4737,5589,2742,5590,1743,1361,3075,3529, # 4368 +2649,4119,4377,4738,2295, 895, 924,4378,2171, 331,2247,3076, 166,1627,3077,1098, # 4384 +5591,1232,2894,2231,3411,4739, 657, 403,1196,2377, 542,3775,3412,1600,4379,3530, # 4400 +5592,4740,2777,3261, 576, 530,1362,4741,4742,2540,2676,3776,4120,5593, 842,3913, # 4416 +5594,2814,2032,1014,4121, 213,2709,3413, 665, 621,4380,5595,3777,2939,2435,5596, # 4432 +2436,3335,3643,3414,4743,4381,2541,4382,4744,3644,1682,4383,3531,1380,5597, 724, # 4448 +2282, 600,1670,5598,1337,1233,4745,3126,2248,5599,1621,4746,5600, 651,4384,5601, # 4464 +1612,4385,2621,5602,2857,5603,2743,2312,3078,5604, 716,2464,3079, 174,1255,2710, # 4480 +4122,3645, 548,1320,1398, 728,4123,1574,5605,1891,1197,3080,4124,5606,3081,3082, # 4496 +3778,3646,3779, 747,5607, 635,4386,4747,5608,5609,5610,4387,5611,5612,4748,5613, # 4512 +3415,4749,2437, 451,5614,3780,2542,2073,4388,2744,4389,4125,5615,1764,4750,5616, # 4528 +4390, 350,4751,2283,2395,2493,5617,4391,4126,2249,1434,4127, 488,4752, 458,4392, # 4544 +4128,3781, 771,1330,2396,3914,2576,3184,2160,2414,1553,2677,3185,4393,5618,2494, # 4560 +2895,2622,1720,2711,4394,3416,4753,5619,2543,4395,5620,3262,4396,2778,5621,2016, # 4576 +2745,5622,1155,1017,3782,3915,5623,3336,2313, 201,1865,4397,1430,5624,4129,5625, # 4592 +5626,5627,5628,5629,4398,1604,5630, 414,1866, 371,2595,4754,4755,3532,2017,3127, # 4608 +4756,1708, 960,4399, 887, 389,2172,1536,1663,1721,5631,2232,4130,2356,2940,1580, # 4624 +5632,5633,1744,4757,2544,4758,4759,5634,4760,5635,2074,5636,4761,3647,3417,2896, # 4640 +4400,5637,4401,2650,3418,2815, 673,2712,2465, 709,3533,4131,3648,4402,5638,1148, # 4656 + 502, 634,5639,5640,1204,4762,3649,1575,4763,2623,3783,5641,3784,3128, 948,3263, # 4672 + 121,1745,3916,1110,5642,4403,3083,2516,3027,4132,3785,1151,1771,3917,1488,4133, # 4688 +1987,5643,2438,3534,5644,5645,2094,5646,4404,3918,1213,1407,2816, 531,2746,2545, # 4704 +3264,1011,1537,4764,2779,4405,3129,1061,5647,3786,3787,1867,2897,5648,2018, 120, # 4720 +4406,4407,2063,3650,3265,2314,3919,2678,3419,1955,4765,4134,5649,3535,1047,2713, # 4736 +1266,5650,1368,4766,2858, 649,3420,3920,2546,2747,1102,2859,2679,5651,5652,2000, # 4752 +5653,1111,3651,2977,5654,2495,3921,3652,2817,1855,3421,3788,5655,5656,3422,2415, # 4768 +2898,3337,3266,3653,5657,2577,5658,3654,2818,4135,1460, 856,5659,3655,5660,2899, # 4784 +2978,5661,2900,3922,5662,4408, 632,2517, 875,3923,1697,3924,2296,5663,5664,4767, # 4800 +3028,1239, 580,4768,4409,5665, 914, 936,2075,1190,4136,1039,2124,5666,5667,5668, # 4816 +5669,3423,1473,5670,1354,4410,3925,4769,2173,3084,4137, 915,3338,4411,4412,3339, # 4832 +1605,1835,5671,2748, 398,3656,4413,3926,4138, 328,1913,2860,4139,3927,1331,4414, # 4848 +3029, 937,4415,5672,3657,4140,4141,3424,2161,4770,3425, 524, 742, 538,3085,1012, # 4864 +5673,5674,3928,2466,5675, 658,1103, 225,3929,5676,5677,4771,5678,4772,5679,3267, # 4880 +1243,5680,4142, 963,2250,4773,5681,2714,3658,3186,5682,5683,2596,2332,5684,4774, # 4896 +5685,5686,5687,3536, 957,3426,2547,2033,1931,2941,2467, 870,2019,3659,1746,2780, # 4912 +2781,2439,2468,5688,3930,5689,3789,3130,3790,3537,3427,3791,5690,1179,3086,5691, # 4928 +3187,2378,4416,3792,2548,3188,3131,2749,4143,5692,3428,1556,2549,2297, 977,2901, # 4944 +2034,4144,1205,3429,5693,1765,3430,3189,2125,1271, 714,1689,4775,3538,5694,2333, # 4960 +3931, 533,4417,3660,2184, 617,5695,2469,3340,3539,2315,5696,5697,3190,5698,5699, # 4976 +3932,1988, 618, 427,2651,3540,3431,5700,5701,1244,1690,5702,2819,4418,4776,5703, # 4992 +3541,4777,5704,2284,1576, 473,3661,4419,3432, 972,5705,3662,5706,3087,5707,5708, # 5008 +4778,4779,5709,3793,4145,4146,5710, 153,4780, 356,5711,1892,2902,4420,2144, 408, # 5024 + 803,2357,5712,3933,5713,4421,1646,2578,2518,4781,4782,3934,5714,3935,4422,5715, # 5040 +2416,3433, 752,5716,5717,1962,3341,2979,5718, 746,3030,2470,4783,4423,3794, 698, # 5056 +4784,1893,4424,3663,2550,4785,3664,3936,5719,3191,3434,5720,1824,1302,4147,2715, # 5072 +3937,1974,4425,5721,4426,3192, 823,1303,1288,1236,2861,3542,4148,3435, 774,3938, # 5088 +5722,1581,4786,1304,2862,3939,4787,5723,2440,2162,1083,3268,4427,4149,4428, 344, # 5104 +1173, 288,2316, 454,1683,5724,5725,1461,4788,4150,2597,5726,5727,4789, 985, 894, # 5120 +5728,3436,3193,5729,1914,2942,3795,1989,5730,2111,1975,5731,4151,5732,2579,1194, # 5136 + 425,5733,4790,3194,1245,3796,4429,5734,5735,2863,5736, 636,4791,1856,3940, 760, # 5152 +1800,5737,4430,2212,1508,4792,4152,1894,1684,2298,5738,5739,4793,4431,4432,2213, # 5168 + 479,5740,5741, 832,5742,4153,2496,5743,2980,2497,3797, 990,3132, 627,1815,2652, # 5184 +4433,1582,4434,2126,2112,3543,4794,5744, 799,4435,3195,5745,4795,2113,1737,3031, # 5200 +1018, 543, 754,4436,3342,1676,4796,4797,4154,4798,1489,5746,3544,5747,2624,2903, # 5216 +4155,5748,5749,2981,5750,5751,5752,5753,3196,4799,4800,2185,1722,5754,3269,3270, # 5232 +1843,3665,1715, 481, 365,1976,1857,5755,5756,1963,2498,4801,5757,2127,3666,3271, # 5248 + 433,1895,2064,2076,5758, 602,2750,5759,5760,5761,5762,5763,3032,1628,3437,5764, # 5264 +3197,4802,4156,2904,4803,2519,5765,2551,2782,5766,5767,5768,3343,4804,2905,5769, # 5280 +4805,5770,2864,4806,4807,1221,2982,4157,2520,5771,5772,5773,1868,1990,5774,5775, # 5296 +5776,1896,5777,5778,4808,1897,4158, 318,5779,2095,4159,4437,5780,5781, 485,5782, # 5312 + 938,3941, 553,2680, 116,5783,3942,3667,5784,3545,2681,2783,3438,3344,2820,5785, # 5328 +3668,2943,4160,1747,2944,2983,5786,5787, 207,5788,4809,5789,4810,2521,5790,3033, # 5344 + 890,3669,3943,5791,1878,3798,3439,5792,2186,2358,3440,1652,5793,5794,5795, 941, # 5360 +2299, 208,3546,4161,2020, 330,4438,3944,2906,2499,3799,4439,4811,5796,5797,5798, # 5376 +) + diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/big5freq.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/big5freq.py new file mode 100644 index 0000000..38f3251 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/big5freq.py @@ -0,0 +1,386 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# Big5 frequency table +# by Taiwan's Mandarin Promotion Council +# +# +# 128 --> 0.42261 +# 256 --> 0.57851 +# 512 --> 0.74851 +# 1024 --> 0.89384 +# 2048 --> 0.97583 +# +# Ideal Distribution Ratio = 0.74851/(1-0.74851) =2.98 +# Random Distribution Ration = 512/(5401-512)=0.105 +# +# Typical Distribution Ratio about 25% of Ideal one, still much higher than RDR + +BIG5_TYPICAL_DISTRIBUTION_RATIO = 0.75 + +#Char to FreqOrder table +BIG5_TABLE_SIZE = 5376 + +BIG5_CHAR_TO_FREQ_ORDER = ( + 1,1801,1506, 255,1431, 198, 9, 82, 6,5008, 177, 202,3681,1256,2821, 110, # 16 +3814, 33,3274, 261, 76, 44,2114, 16,2946,2187,1176, 659,3971, 26,3451,2653, # 32 +1198,3972,3350,4202, 410,2215, 302, 590, 361,1964, 8, 204, 58,4510,5009,1932, # 48 + 63,5010,5011, 317,1614, 75, 222, 159,4203,2417,1480,5012,3555,3091, 224,2822, # 64 +3682, 3, 10,3973,1471, 29,2787,1135,2866,1940, 873, 130,3275,1123, 312,5013, # 80 +4511,2052, 507, 252, 682,5014, 142,1915, 124, 206,2947, 34,3556,3204, 64, 604, # 96 +5015,2501,1977,1978, 155,1991, 645, 641,1606,5016,3452, 337, 72, 406,5017, 80, # 112 + 630, 238,3205,1509, 263, 939,1092,2654, 756,1440,1094,3453, 449, 69,2987, 591, # 128 + 179,2096, 471, 115,2035,1844, 60, 50,2988, 134, 806,1869, 734,2036,3454, 180, # 144 + 995,1607, 156, 537,2907, 688,5018, 319,1305, 779,2145, 514,2379, 298,4512, 359, # 160 +2502, 90,2716,1338, 663, 11, 906,1099,2553, 20,2441, 182, 532,1716,5019, 732, # 176 +1376,4204,1311,1420,3206, 25,2317,1056, 113, 399, 382,1950, 242,3455,2474, 529, # 192 +3276, 475,1447,3683,5020, 117, 21, 656, 810,1297,2300,2334,3557,5021, 126,4205, # 208 + 706, 456, 150, 613,4513, 71,1118,2037,4206, 145,3092, 85, 835, 486,2115,1246, # 224 +1426, 428, 727,1285,1015, 800, 106, 623, 303,1281,5022,2128,2359, 347,3815, 221, # 240 +3558,3135,5023,1956,1153,4207, 83, 296,1199,3093, 192, 624, 93,5024, 822,1898, # 256 +2823,3136, 795,2065, 991,1554,1542,1592, 27, 43,2867, 859, 139,1456, 860,4514, # 272 + 437, 712,3974, 164,2397,3137, 695, 211,3037,2097, 195,3975,1608,3559,3560,3684, # 288 +3976, 234, 811,2989,2098,3977,2233,1441,3561,1615,2380, 668,2077,1638, 305, 228, # 304 +1664,4515, 467, 415,5025, 262,2099,1593, 239, 108, 300, 200,1033, 512,1247,2078, # 320 +5026,5027,2176,3207,3685,2682, 593, 845,1062,3277, 88,1723,2038,3978,1951, 212, # 336 + 266, 152, 149, 468,1899,4208,4516, 77, 187,5028,3038, 37, 5,2990,5029,3979, # 352 +5030,5031, 39,2524,4517,2908,3208,2079, 55, 148, 74,4518, 545, 483,1474,1029, # 368 +1665, 217,1870,1531,3138,1104,2655,4209, 24, 172,3562, 900,3980,3563,3564,4519, # 384 + 32,1408,2824,1312, 329, 487,2360,2251,2717, 784,2683, 4,3039,3351,1427,1789, # 400 + 188, 109, 499,5032,3686,1717,1790, 888,1217,3040,4520,5033,3565,5034,3352,1520, # 416 +3687,3981, 196,1034, 775,5035,5036, 929,1816, 249, 439, 38,5037,1063,5038, 794, # 432 +3982,1435,2301, 46, 178,3278,2066,5039,2381,5040, 214,1709,4521, 804, 35, 707, # 448 + 324,3688,1601,2554, 140, 459,4210,5041,5042,1365, 839, 272, 978,2262,2580,3456, # 464 +2129,1363,3689,1423, 697, 100,3094, 48, 70,1231, 495,3139,2196,5043,1294,5044, # 480 +2080, 462, 586,1042,3279, 853, 256, 988, 185,2382,3457,1698, 434,1084,5045,3458, # 496 + 314,2625,2788,4522,2335,2336, 569,2285, 637,1817,2525, 757,1162,1879,1616,3459, # 512 + 287,1577,2116, 768,4523,1671,2868,3566,2526,1321,3816, 909,2418,5046,4211, 933, # 528 +3817,4212,2053,2361,1222,4524, 765,2419,1322, 786,4525,5047,1920,1462,1677,2909, # 544 +1699,5048,4526,1424,2442,3140,3690,2600,3353,1775,1941,3460,3983,4213, 309,1369, # 560 +1130,2825, 364,2234,1653,1299,3984,3567,3985,3986,2656, 525,1085,3041, 902,2001, # 576 +1475, 964,4527, 421,1845,1415,1057,2286, 940,1364,3141, 376,4528,4529,1381, 7, # 592 +2527, 983,2383, 336,1710,2684,1846, 321,3461, 559,1131,3042,2752,1809,1132,1313, # 608 + 265,1481,1858,5049, 352,1203,2826,3280, 167,1089, 420,2827, 776, 792,1724,3568, # 624 +4214,2443,3281,5050,4215,5051, 446, 229, 333,2753, 901,3818,1200,1557,4530,2657, # 640 +1921, 395,2754,2685,3819,4216,1836, 125, 916,3209,2626,4531,5052,5053,3820,5054, # 656 +5055,5056,4532,3142,3691,1133,2555,1757,3462,1510,2318,1409,3569,5057,2146, 438, # 672 +2601,2910,2384,3354,1068, 958,3043, 461, 311,2869,2686,4217,1916,3210,4218,1979, # 688 + 383, 750,2755,2627,4219, 274, 539, 385,1278,1442,5058,1154,1965, 384, 561, 210, # 704 + 98,1295,2556,3570,5059,1711,2420,1482,3463,3987,2911,1257, 129,5060,3821, 642, # 720 + 523,2789,2790,2658,5061, 141,2235,1333, 68, 176, 441, 876, 907,4220, 603,2602, # 736 + 710, 171,3464, 404, 549, 18,3143,2398,1410,3692,1666,5062,3571,4533,2912,4534, # 752 +5063,2991, 368,5064, 146, 366, 99, 871,3693,1543, 748, 807,1586,1185, 22,2263, # 768 + 379,3822,3211,5065,3212, 505,1942,2628,1992,1382,2319,5066, 380,2362, 218, 702, # 784 +1818,1248,3465,3044,3572,3355,3282,5067,2992,3694, 930,3283,3823,5068, 59,5069, # 800 + 585, 601,4221, 497,3466,1112,1314,4535,1802,5070,1223,1472,2177,5071, 749,1837, # 816 + 690,1900,3824,1773,3988,1476, 429,1043,1791,2236,2117, 917,4222, 447,1086,1629, # 832 +5072, 556,5073,5074,2021,1654, 844,1090, 105, 550, 966,1758,2828,1008,1783, 686, # 848 +1095,5075,2287, 793,1602,5076,3573,2603,4536,4223,2948,2302,4537,3825, 980,2503, # 864 + 544, 353, 527,4538, 908,2687,2913,5077, 381,2629,1943,1348,5078,1341,1252, 560, # 880 +3095,5079,3467,2870,5080,2054, 973, 886,2081, 143,4539,5081,5082, 157,3989, 496, # 896 +4224, 57, 840, 540,2039,4540,4541,3468,2118,1445, 970,2264,1748,1966,2082,4225, # 912 +3144,1234,1776,3284,2829,3695, 773,1206,2130,1066,2040,1326,3990,1738,1725,4226, # 928 + 279,3145, 51,1544,2604, 423,1578,2131,2067, 173,4542,1880,5083,5084,1583, 264, # 944 + 610,3696,4543,2444, 280, 154,5085,5086,5087,1739, 338,1282,3096, 693,2871,1411, # 960 +1074,3826,2445,5088,4544,5089,5090,1240, 952,2399,5091,2914,1538,2688, 685,1483, # 976 +4227,2475,1436, 953,4228,2055,4545, 671,2400, 79,4229,2446,3285, 608, 567,2689, # 992 +3469,4230,4231,1691, 393,1261,1792,2401,5092,4546,5093,5094,5095,5096,1383,1672, # 1008 +3827,3213,1464, 522,1119, 661,1150, 216, 675,4547,3991,1432,3574, 609,4548,2690, # 1024 +2402,5097,5098,5099,4232,3045, 0,5100,2476, 315, 231,2447, 301,3356,4549,2385, # 1040 +5101, 233,4233,3697,1819,4550,4551,5102, 96,1777,1315,2083,5103, 257,5104,1810, # 1056 +3698,2718,1139,1820,4234,2022,1124,2164,2791,1778,2659,5105,3097, 363,1655,3214, # 1072 +5106,2993,5107,5108,5109,3992,1567,3993, 718, 103,3215, 849,1443, 341,3357,2949, # 1088 +1484,5110,1712, 127, 67, 339,4235,2403, 679,1412, 821,5111,5112, 834, 738, 351, # 1104 +2994,2147, 846, 235,1497,1881, 418,1993,3828,2719, 186,1100,2148,2756,3575,1545, # 1120 +1355,2950,2872,1377, 583,3994,4236,2581,2995,5113,1298,3699,1078,2557,3700,2363, # 1136 + 78,3829,3830, 267,1289,2100,2002,1594,4237, 348, 369,1274,2197,2178,1838,4552, # 1152 +1821,2830,3701,2757,2288,2003,4553,2951,2758, 144,3358, 882,4554,3995,2759,3470, # 1168 +4555,2915,5114,4238,1726, 320,5115,3996,3046, 788,2996,5116,2831,1774,1327,2873, # 1184 +3997,2832,5117,1306,4556,2004,1700,3831,3576,2364,2660, 787,2023, 506, 824,3702, # 1200 + 534, 323,4557,1044,3359,2024,1901, 946,3471,5118,1779,1500,1678,5119,1882,4558, # 1216 + 165, 243,4559,3703,2528, 123, 683,4239, 764,4560, 36,3998,1793, 589,2916, 816, # 1232 + 626,1667,3047,2237,1639,1555,1622,3832,3999,5120,4000,2874,1370,1228,1933, 891, # 1248 +2084,2917, 304,4240,5121, 292,2997,2720,3577, 691,2101,4241,1115,4561, 118, 662, # 1264 +5122, 611,1156, 854,2386,1316,2875, 2, 386, 515,2918,5123,5124,3286, 868,2238, # 1280 +1486, 855,2661, 785,2216,3048,5125,1040,3216,3578,5126,3146, 448,5127,1525,5128, # 1296 +2165,4562,5129,3833,5130,4242,2833,3579,3147, 503, 818,4001,3148,1568, 814, 676, # 1312 +1444, 306,1749,5131,3834,1416,1030, 197,1428, 805,2834,1501,4563,5132,5133,5134, # 1328 +1994,5135,4564,5136,5137,2198, 13,2792,3704,2998,3149,1229,1917,5138,3835,2132, # 1344 +5139,4243,4565,2404,3580,5140,2217,1511,1727,1120,5141,5142, 646,3836,2448, 307, # 1360 +5143,5144,1595,3217,5145,5146,5147,3705,1113,1356,4002,1465,2529,2530,5148, 519, # 1376 +5149, 128,2133, 92,2289,1980,5150,4003,1512, 342,3150,2199,5151,2793,2218,1981, # 1392 +3360,4244, 290,1656,1317, 789, 827,2365,5152,3837,4566, 562, 581,4004,5153, 401, # 1408 +4567,2252, 94,4568,5154,1399,2794,5155,1463,2025,4569,3218,1944,5156, 828,1105, # 1424 +4245,1262,1394,5157,4246, 605,4570,5158,1784,2876,5159,2835, 819,2102, 578,2200, # 1440 +2952,5160,1502, 436,3287,4247,3288,2836,4005,2919,3472,3473,5161,2721,2320,5162, # 1456 +5163,2337,2068, 23,4571, 193, 826,3838,2103, 699,1630,4248,3098, 390,1794,1064, # 1472 +3581,5164,1579,3099,3100,1400,5165,4249,1839,1640,2877,5166,4572,4573, 137,4250, # 1488 + 598,3101,1967, 780, 104, 974,2953,5167, 278, 899, 253, 402, 572, 504, 493,1339, # 1504 +5168,4006,1275,4574,2582,2558,5169,3706,3049,3102,2253, 565,1334,2722, 863, 41, # 1520 +5170,5171,4575,5172,1657,2338, 19, 463,2760,4251, 606,5173,2999,3289,1087,2085, # 1536 +1323,2662,3000,5174,1631,1623,1750,4252,2691,5175,2878, 791,2723,2663,2339, 232, # 1552 +2421,5176,3001,1498,5177,2664,2630, 755,1366,3707,3290,3151,2026,1609, 119,1918, # 1568 +3474, 862,1026,4253,5178,4007,3839,4576,4008,4577,2265,1952,2477,5179,1125, 817, # 1584 +4254,4255,4009,1513,1766,2041,1487,4256,3050,3291,2837,3840,3152,5180,5181,1507, # 1600 +5182,2692, 733, 40,1632,1106,2879, 345,4257, 841,2531, 230,4578,3002,1847,3292, # 1616 +3475,5183,1263, 986,3476,5184, 735, 879, 254,1137, 857, 622,1300,1180,1388,1562, # 1632 +4010,4011,2954, 967,2761,2665,1349, 592,2134,1692,3361,3003,1995,4258,1679,4012, # 1648 +1902,2188,5185, 739,3708,2724,1296,1290,5186,4259,2201,2202,1922,1563,2605,2559, # 1664 +1871,2762,3004,5187, 435,5188, 343,1108, 596, 17,1751,4579,2239,3477,3709,5189, # 1680 +4580, 294,3582,2955,1693, 477, 979, 281,2042,3583, 643,2043,3710,2631,2795,2266, # 1696 +1031,2340,2135,2303,3584,4581, 367,1249,2560,5190,3585,5191,4582,1283,3362,2005, # 1712 + 240,1762,3363,4583,4584, 836,1069,3153, 474,5192,2149,2532, 268,3586,5193,3219, # 1728 +1521,1284,5194,1658,1546,4260,5195,3587,3588,5196,4261,3364,2693,1685,4262, 961, # 1744 +1673,2632, 190,2006,2203,3841,4585,4586,5197, 570,2504,3711,1490,5198,4587,2633, # 1760 +3293,1957,4588, 584,1514, 396,1045,1945,5199,4589,1968,2449,5200,5201,4590,4013, # 1776 + 619,5202,3154,3294, 215,2007,2796,2561,3220,4591,3221,4592, 763,4263,3842,4593, # 1792 +5203,5204,1958,1767,2956,3365,3712,1174, 452,1477,4594,3366,3155,5205,2838,1253, # 1808 +2387,2189,1091,2290,4264, 492,5206, 638,1169,1825,2136,1752,4014, 648, 926,1021, # 1824 +1324,4595, 520,4596, 997, 847,1007, 892,4597,3843,2267,1872,3713,2405,1785,4598, # 1840 +1953,2957,3103,3222,1728,4265,2044,3714,4599,2008,1701,3156,1551, 30,2268,4266, # 1856 +5207,2027,4600,3589,5208, 501,5209,4267, 594,3478,2166,1822,3590,3479,3591,3223, # 1872 + 829,2839,4268,5210,1680,3157,1225,4269,5211,3295,4601,4270,3158,2341,5212,4602, # 1888 +4271,5213,4015,4016,5214,1848,2388,2606,3367,5215,4603, 374,4017, 652,4272,4273, # 1904 + 375,1140, 798,5216,5217,5218,2366,4604,2269, 546,1659, 138,3051,2450,4605,5219, # 1920 +2254, 612,1849, 910, 796,3844,1740,1371, 825,3845,3846,5220,2920,2562,5221, 692, # 1936 + 444,3052,2634, 801,4606,4274,5222,1491, 244,1053,3053,4275,4276, 340,5223,4018, # 1952 +1041,3005, 293,1168, 87,1357,5224,1539, 959,5225,2240, 721, 694,4277,3847, 219, # 1968 +1478, 644,1417,3368,2666,1413,1401,1335,1389,4019,5226,5227,3006,2367,3159,1826, # 1984 + 730,1515, 184,2840, 66,4607,5228,1660,2958, 246,3369, 378,1457, 226,3480, 975, # 2000 +4020,2959,1264,3592, 674, 696,5229, 163,5230,1141,2422,2167, 713,3593,3370,4608, # 2016 +4021,5231,5232,1186, 15,5233,1079,1070,5234,1522,3224,3594, 276,1050,2725, 758, # 2032 +1126, 653,2960,3296,5235,2342, 889,3595,4022,3104,3007, 903,1250,4609,4023,3481, # 2048 +3596,1342,1681,1718, 766,3297, 286, 89,2961,3715,5236,1713,5237,2607,3371,3008, # 2064 +5238,2962,2219,3225,2880,5239,4610,2505,2533, 181, 387,1075,4024, 731,2190,3372, # 2080 +5240,3298, 310, 313,3482,2304, 770,4278, 54,3054, 189,4611,3105,3848,4025,5241, # 2096 +1230,1617,1850, 355,3597,4279,4612,3373, 111,4280,3716,1350,3160,3483,3055,4281, # 2112 +2150,3299,3598,5242,2797,4026,4027,3009, 722,2009,5243,1071, 247,1207,2343,2478, # 2128 +1378,4613,2010, 864,1437,1214,4614, 373,3849,1142,2220, 667,4615, 442,2763,2563, # 2144 +3850,4028,1969,4282,3300,1840, 837, 170,1107, 934,1336,1883,5244,5245,2119,4283, # 2160 +2841, 743,1569,5246,4616,4284, 582,2389,1418,3484,5247,1803,5248, 357,1395,1729, # 2176 +3717,3301,2423,1564,2241,5249,3106,3851,1633,4617,1114,2086,4285,1532,5250, 482, # 2192 +2451,4618,5251,5252,1492, 833,1466,5253,2726,3599,1641,2842,5254,1526,1272,3718, # 2208 +4286,1686,1795, 416,2564,1903,1954,1804,5255,3852,2798,3853,1159,2321,5256,2881, # 2224 +4619,1610,1584,3056,2424,2764, 443,3302,1163,3161,5257,5258,4029,5259,4287,2506, # 2240 +3057,4620,4030,3162,2104,1647,3600,2011,1873,4288,5260,4289, 431,3485,5261, 250, # 2256 + 97, 81,4290,5262,1648,1851,1558, 160, 848,5263, 866, 740,1694,5264,2204,2843, # 2272 +3226,4291,4621,3719,1687, 950,2479, 426, 469,3227,3720,3721,4031,5265,5266,1188, # 2288 + 424,1996, 861,3601,4292,3854,2205,2694, 168,1235,3602,4293,5267,2087,1674,4622, # 2304 +3374,3303, 220,2565,1009,5268,3855, 670,3010, 332,1208, 717,5269,5270,3603,2452, # 2320 +4032,3375,5271, 513,5272,1209,2882,3376,3163,4623,1080,5273,5274,5275,5276,2534, # 2336 +3722,3604, 815,1587,4033,4034,5277,3605,3486,3856,1254,4624,1328,3058,1390,4035, # 2352 +1741,4036,3857,4037,5278, 236,3858,2453,3304,5279,5280,3723,3859,1273,3860,4625, # 2368 +5281, 308,5282,4626, 245,4627,1852,2480,1307,2583, 430, 715,2137,2454,5283, 270, # 2384 + 199,2883,4038,5284,3606,2727,1753, 761,1754, 725,1661,1841,4628,3487,3724,5285, # 2400 +5286, 587, 14,3305, 227,2608, 326, 480,2270, 943,2765,3607, 291, 650,1884,5287, # 2416 +1702,1226, 102,1547, 62,3488, 904,4629,3489,1164,4294,5288,5289,1224,1548,2766, # 2432 + 391, 498,1493,5290,1386,1419,5291,2056,1177,4630, 813, 880,1081,2368, 566,1145, # 2448 +4631,2291,1001,1035,2566,2609,2242, 394,1286,5292,5293,2069,5294, 86,1494,1730, # 2464 +4039, 491,1588, 745, 897,2963, 843,3377,4040,2767,2884,3306,1768, 998,2221,2070, # 2480 + 397,1827,1195,1970,3725,3011,3378, 284,5295,3861,2507,2138,2120,1904,5296,4041, # 2496 +2151,4042,4295,1036,3490,1905, 114,2567,4296, 209,1527,5297,5298,2964,2844,2635, # 2512 +2390,2728,3164, 812,2568,5299,3307,5300,1559, 737,1885,3726,1210, 885, 28,2695, # 2528 +3608,3862,5301,4297,1004,1780,4632,5302, 346,1982,2222,2696,4633,3863,1742, 797, # 2544 +1642,4043,1934,1072,1384,2152, 896,4044,3308,3727,3228,2885,3609,5303,2569,1959, # 2560 +4634,2455,1786,5304,5305,5306,4045,4298,1005,1308,3728,4299,2729,4635,4636,1528, # 2576 +2610, 161,1178,4300,1983, 987,4637,1101,4301, 631,4046,1157,3229,2425,1343,1241, # 2592 +1016,2243,2570, 372, 877,2344,2508,1160, 555,1935, 911,4047,5307, 466,1170, 169, # 2608 +1051,2921,2697,3729,2481,3012,1182,2012,2571,1251,2636,5308, 992,2345,3491,1540, # 2624 +2730,1201,2071,2406,1997,2482,5309,4638, 528,1923,2191,1503,1874,1570,2369,3379, # 2640 +3309,5310, 557,1073,5311,1828,3492,2088,2271,3165,3059,3107, 767,3108,2799,4639, # 2656 +1006,4302,4640,2346,1267,2179,3730,3230, 778,4048,3231,2731,1597,2667,5312,4641, # 2672 +5313,3493,5314,5315,5316,3310,2698,1433,3311, 131, 95,1504,4049, 723,4303,3166, # 2688 +1842,3610,2768,2192,4050,2028,2105,3731,5317,3013,4051,1218,5318,3380,3232,4052, # 2704 +4304,2584, 248,1634,3864, 912,5319,2845,3732,3060,3865, 654, 53,5320,3014,5321, # 2720 +1688,4642, 777,3494,1032,4053,1425,5322, 191, 820,2121,2846, 971,4643, 931,3233, # 2736 + 135, 664, 783,3866,1998, 772,2922,1936,4054,3867,4644,2923,3234, 282,2732, 640, # 2752 +1372,3495,1127, 922, 325,3381,5323,5324, 711,2045,5325,5326,4055,2223,2800,1937, # 2768 +4056,3382,2224,2255,3868,2305,5327,4645,3869,1258,3312,4057,3235,2139,2965,4058, # 2784 +4059,5328,2225, 258,3236,4646, 101,1227,5329,3313,1755,5330,1391,3314,5331,2924, # 2800 +2057, 893,5332,5333,5334,1402,4305,2347,5335,5336,3237,3611,5337,5338, 878,1325, # 2816 +1781,2801,4647, 259,1385,2585, 744,1183,2272,4648,5339,4060,2509,5340, 684,1024, # 2832 +4306,5341, 472,3612,3496,1165,3315,4061,4062, 322,2153, 881, 455,1695,1152,1340, # 2848 + 660, 554,2154,4649,1058,4650,4307, 830,1065,3383,4063,4651,1924,5342,1703,1919, # 2864 +5343, 932,2273, 122,5344,4652, 947, 677,5345,3870,2637, 297,1906,1925,2274,4653, # 2880 +2322,3316,5346,5347,4308,5348,4309, 84,4310, 112, 989,5349, 547,1059,4064, 701, # 2896 +3613,1019,5350,4311,5351,3497, 942, 639, 457,2306,2456, 993,2966, 407, 851, 494, # 2912 +4654,3384, 927,5352,1237,5353,2426,3385, 573,4312, 680, 921,2925,1279,1875, 285, # 2928 + 790,1448,1984, 719,2168,5354,5355,4655,4065,4066,1649,5356,1541, 563,5357,1077, # 2944 +5358,3386,3061,3498, 511,3015,4067,4068,3733,4069,1268,2572,3387,3238,4656,4657, # 2960 +5359, 535,1048,1276,1189,2926,2029,3167,1438,1373,2847,2967,1134,2013,5360,4313, # 2976 +1238,2586,3109,1259,5361, 700,5362,2968,3168,3734,4314,5363,4315,1146,1876,1907, # 2992 +4658,2611,4070, 781,2427, 132,1589, 203, 147, 273,2802,2407, 898,1787,2155,4071, # 3008 +4072,5364,3871,2803,5365,5366,4659,4660,5367,3239,5368,1635,3872, 965,5369,1805, # 3024 +2699,1516,3614,1121,1082,1329,3317,4073,1449,3873, 65,1128,2848,2927,2769,1590, # 3040 +3874,5370,5371, 12,2668, 45, 976,2587,3169,4661, 517,2535,1013,1037,3240,5372, # 3056 +3875,2849,5373,3876,5374,3499,5375,2612, 614,1999,2323,3877,3110,2733,2638,5376, # 3072 +2588,4316, 599,1269,5377,1811,3735,5378,2700,3111, 759,1060, 489,1806,3388,3318, # 3088 +1358,5379,5380,2391,1387,1215,2639,2256, 490,5381,5382,4317,1759,2392,2348,5383, # 3104 +4662,3878,1908,4074,2640,1807,3241,4663,3500,3319,2770,2349, 874,5384,5385,3501, # 3120 +3736,1859, 91,2928,3737,3062,3879,4664,5386,3170,4075,2669,5387,3502,1202,1403, # 3136 +3880,2969,2536,1517,2510,4665,3503,2511,5388,4666,5389,2701,1886,1495,1731,4076, # 3152 +2370,4667,5390,2030,5391,5392,4077,2702,1216, 237,2589,4318,2324,4078,3881,4668, # 3168 +4669,2703,3615,3504, 445,4670,5393,5394,5395,5396,2771, 61,4079,3738,1823,4080, # 3184 +5397, 687,2046, 935, 925, 405,2670, 703,1096,1860,2734,4671,4081,1877,1367,2704, # 3200 +3389, 918,2106,1782,2483, 334,3320,1611,1093,4672, 564,3171,3505,3739,3390, 945, # 3216 +2641,2058,4673,5398,1926, 872,4319,5399,3506,2705,3112, 349,4320,3740,4082,4674, # 3232 +3882,4321,3741,2156,4083,4675,4676,4322,4677,2408,2047, 782,4084, 400, 251,4323, # 3248 +1624,5400,5401, 277,3742, 299,1265, 476,1191,3883,2122,4324,4325,1109, 205,5402, # 3264 +2590,1000,2157,3616,1861,5403,5404,5405,4678,5406,4679,2573, 107,2484,2158,4085, # 3280 +3507,3172,5407,1533, 541,1301, 158, 753,4326,2886,3617,5408,1696, 370,1088,4327, # 3296 +4680,3618, 579, 327, 440, 162,2244, 269,1938,1374,3508, 968,3063, 56,1396,3113, # 3312 +2107,3321,3391,5409,1927,2159,4681,3016,5410,3619,5411,5412,3743,4682,2485,5413, # 3328 +2804,5414,1650,4683,5415,2613,5416,5417,4086,2671,3392,1149,3393,4087,3884,4088, # 3344 +5418,1076, 49,5419, 951,3242,3322,3323, 450,2850, 920,5420,1812,2805,2371,4328, # 3360 +1909,1138,2372,3885,3509,5421,3243,4684,1910,1147,1518,2428,4685,3886,5422,4686, # 3376 +2393,2614, 260,1796,3244,5423,5424,3887,3324, 708,5425,3620,1704,5426,3621,1351, # 3392 +1618,3394,3017,1887, 944,4329,3395,4330,3064,3396,4331,5427,3744, 422, 413,1714, # 3408 +3325, 500,2059,2350,4332,2486,5428,1344,1911, 954,5429,1668,5430,5431,4089,2409, # 3424 +4333,3622,3888,4334,5432,2307,1318,2512,3114, 133,3115,2887,4687, 629, 31,2851, # 3440 +2706,3889,4688, 850, 949,4689,4090,2970,1732,2089,4335,1496,1853,5433,4091, 620, # 3456 +3245, 981,1242,3745,3397,1619,3746,1643,3326,2140,2457,1971,1719,3510,2169,5434, # 3472 +3246,5435,5436,3398,1829,5437,1277,4690,1565,2048,5438,1636,3623,3116,5439, 869, # 3488 +2852, 655,3890,3891,3117,4092,3018,3892,1310,3624,4691,5440,5441,5442,1733, 558, # 3504 +4692,3747, 335,1549,3065,1756,4336,3748,1946,3511,1830,1291,1192, 470,2735,2108, # 3520 +2806, 913,1054,4093,5443,1027,5444,3066,4094,4693, 982,2672,3399,3173,3512,3247, # 3536 +3248,1947,2807,5445, 571,4694,5446,1831,5447,3625,2591,1523,2429,5448,2090, 984, # 3552 +4695,3749,1960,5449,3750, 852, 923,2808,3513,3751, 969,1519, 999,2049,2325,1705, # 3568 +5450,3118, 615,1662, 151, 597,4095,2410,2326,1049, 275,4696,3752,4337, 568,3753, # 3584 +3626,2487,4338,3754,5451,2430,2275, 409,3249,5452,1566,2888,3514,1002, 769,2853, # 3600 + 194,2091,3174,3755,2226,3327,4339, 628,1505,5453,5454,1763,2180,3019,4096, 521, # 3616 +1161,2592,1788,2206,2411,4697,4097,1625,4340,4341, 412, 42,3119, 464,5455,2642, # 3632 +4698,3400,1760,1571,2889,3515,2537,1219,2207,3893,2643,2141,2373,4699,4700,3328, # 3648 +1651,3401,3627,5456,5457,3628,2488,3516,5458,3756,5459,5460,2276,2092, 460,5461, # 3664 +4701,5462,3020, 962, 588,3629, 289,3250,2644,1116, 52,5463,3067,1797,5464,5465, # 3680 +5466,1467,5467,1598,1143,3757,4342,1985,1734,1067,4702,1280,3402, 465,4703,1572, # 3696 + 510,5468,1928,2245,1813,1644,3630,5469,4704,3758,5470,5471,2673,1573,1534,5472, # 3712 +5473, 536,1808,1761,3517,3894,3175,2645,5474,5475,5476,4705,3518,2929,1912,2809, # 3728 +5477,3329,1122, 377,3251,5478, 360,5479,5480,4343,1529, 551,5481,2060,3759,1769, # 3744 +2431,5482,2930,4344,3330,3120,2327,2109,2031,4706,1404, 136,1468,1479, 672,1171, # 3760 +3252,2308, 271,3176,5483,2772,5484,2050, 678,2736, 865,1948,4707,5485,2014,4098, # 3776 +2971,5486,2737,2227,1397,3068,3760,4708,4709,1735,2931,3403,3631,5487,3895, 509, # 3792 +2854,2458,2890,3896,5488,5489,3177,3178,4710,4345,2538,4711,2309,1166,1010, 552, # 3808 + 681,1888,5490,5491,2972,2973,4099,1287,1596,1862,3179, 358, 453, 736, 175, 478, # 3824 +1117, 905,1167,1097,5492,1854,1530,5493,1706,5494,2181,3519,2292,3761,3520,3632, # 3840 +4346,2093,4347,5495,3404,1193,2489,4348,1458,2193,2208,1863,1889,1421,3331,2932, # 3856 +3069,2182,3521, 595,2123,5496,4100,5497,5498,4349,1707,2646, 223,3762,1359, 751, # 3872 +3121, 183,3522,5499,2810,3021, 419,2374, 633, 704,3897,2394, 241,5500,5501,5502, # 3888 + 838,3022,3763,2277,2773,2459,3898,1939,2051,4101,1309,3122,2246,1181,5503,1136, # 3904 +2209,3899,2375,1446,4350,2310,4712,5504,5505,4351,1055,2615, 484,3764,5506,4102, # 3920 + 625,4352,2278,3405,1499,4353,4103,5507,4104,4354,3253,2279,2280,3523,5508,5509, # 3936 +2774, 808,2616,3765,3406,4105,4355,3123,2539, 526,3407,3900,4356, 955,5510,1620, # 3952 +4357,2647,2432,5511,1429,3766,1669,1832, 994, 928,5512,3633,1260,5513,5514,5515, # 3968 +1949,2293, 741,2933,1626,4358,2738,2460, 867,1184, 362,3408,1392,5516,5517,4106, # 3984 +4359,1770,1736,3254,2934,4713,4714,1929,2707,1459,1158,5518,3070,3409,2891,1292, # 4000 +1930,2513,2855,3767,1986,1187,2072,2015,2617,4360,5519,2574,2514,2170,3768,2490, # 4016 +3332,5520,3769,4715,5521,5522, 666,1003,3023,1022,3634,4361,5523,4716,1814,2257, # 4032 + 574,3901,1603, 295,1535, 705,3902,4362, 283, 858, 417,5524,5525,3255,4717,4718, # 4048 +3071,1220,1890,1046,2281,2461,4107,1393,1599, 689,2575, 388,4363,5526,2491, 802, # 4064 +5527,2811,3903,2061,1405,2258,5528,4719,3904,2110,1052,1345,3256,1585,5529, 809, # 4080 +5530,5531,5532, 575,2739,3524, 956,1552,1469,1144,2328,5533,2329,1560,2462,3635, # 4096 +3257,4108, 616,2210,4364,3180,2183,2294,5534,1833,5535,3525,4720,5536,1319,3770, # 4112 +3771,1211,3636,1023,3258,1293,2812,5537,5538,5539,3905, 607,2311,3906, 762,2892, # 4128 +1439,4365,1360,4721,1485,3072,5540,4722,1038,4366,1450,2062,2648,4367,1379,4723, # 4144 +2593,5541,5542,4368,1352,1414,2330,2935,1172,5543,5544,3907,3908,4724,1798,1451, # 4160 +5545,5546,5547,5548,2936,4109,4110,2492,2351, 411,4111,4112,3637,3333,3124,4725, # 4176 +1561,2674,1452,4113,1375,5549,5550, 47,2974, 316,5551,1406,1591,2937,3181,5552, # 4192 +1025,2142,3125,3182, 354,2740, 884,2228,4369,2412, 508,3772, 726,3638, 996,2433, # 4208 +3639, 729,5553, 392,2194,1453,4114,4726,3773,5554,5555,2463,3640,2618,1675,2813, # 4224 + 919,2352,2975,2353,1270,4727,4115, 73,5556,5557, 647,5558,3259,2856,2259,1550, # 4240 +1346,3024,5559,1332, 883,3526,5560,5561,5562,5563,3334,2775,5564,1212, 831,1347, # 4256 +4370,4728,2331,3909,1864,3073, 720,3910,4729,4730,3911,5565,4371,5566,5567,4731, # 4272 +5568,5569,1799,4732,3774,2619,4733,3641,1645,2376,4734,5570,2938, 669,2211,2675, # 4288 +2434,5571,2893,5572,5573,1028,3260,5574,4372,2413,5575,2260,1353,5576,5577,4735, # 4304 +3183, 518,5578,4116,5579,4373,1961,5580,2143,4374,5581,5582,3025,2354,2355,3912, # 4320 + 516,1834,1454,4117,2708,4375,4736,2229,2620,1972,1129,3642,5583,2776,5584,2976, # 4336 +1422, 577,1470,3026,1524,3410,5585,5586, 432,4376,3074,3527,5587,2594,1455,2515, # 4352 +2230,1973,1175,5588,1020,2741,4118,3528,4737,5589,2742,5590,1743,1361,3075,3529, # 4368 +2649,4119,4377,4738,2295, 895, 924,4378,2171, 331,2247,3076, 166,1627,3077,1098, # 4384 +5591,1232,2894,2231,3411,4739, 657, 403,1196,2377, 542,3775,3412,1600,4379,3530, # 4400 +5592,4740,2777,3261, 576, 530,1362,4741,4742,2540,2676,3776,4120,5593, 842,3913, # 4416 +5594,2814,2032,1014,4121, 213,2709,3413, 665, 621,4380,5595,3777,2939,2435,5596, # 4432 +2436,3335,3643,3414,4743,4381,2541,4382,4744,3644,1682,4383,3531,1380,5597, 724, # 4448 +2282, 600,1670,5598,1337,1233,4745,3126,2248,5599,1621,4746,5600, 651,4384,5601, # 4464 +1612,4385,2621,5602,2857,5603,2743,2312,3078,5604, 716,2464,3079, 174,1255,2710, # 4480 +4122,3645, 548,1320,1398, 728,4123,1574,5605,1891,1197,3080,4124,5606,3081,3082, # 4496 +3778,3646,3779, 747,5607, 635,4386,4747,5608,5609,5610,4387,5611,5612,4748,5613, # 4512 +3415,4749,2437, 451,5614,3780,2542,2073,4388,2744,4389,4125,5615,1764,4750,5616, # 4528 +4390, 350,4751,2283,2395,2493,5617,4391,4126,2249,1434,4127, 488,4752, 458,4392, # 4544 +4128,3781, 771,1330,2396,3914,2576,3184,2160,2414,1553,2677,3185,4393,5618,2494, # 4560 +2895,2622,1720,2711,4394,3416,4753,5619,2543,4395,5620,3262,4396,2778,5621,2016, # 4576 +2745,5622,1155,1017,3782,3915,5623,3336,2313, 201,1865,4397,1430,5624,4129,5625, # 4592 +5626,5627,5628,5629,4398,1604,5630, 414,1866, 371,2595,4754,4755,3532,2017,3127, # 4608 +4756,1708, 960,4399, 887, 389,2172,1536,1663,1721,5631,2232,4130,2356,2940,1580, # 4624 +5632,5633,1744,4757,2544,4758,4759,5634,4760,5635,2074,5636,4761,3647,3417,2896, # 4640 +4400,5637,4401,2650,3418,2815, 673,2712,2465, 709,3533,4131,3648,4402,5638,1148, # 4656 + 502, 634,5639,5640,1204,4762,3649,1575,4763,2623,3783,5641,3784,3128, 948,3263, # 4672 + 121,1745,3916,1110,5642,4403,3083,2516,3027,4132,3785,1151,1771,3917,1488,4133, # 4688 +1987,5643,2438,3534,5644,5645,2094,5646,4404,3918,1213,1407,2816, 531,2746,2545, # 4704 +3264,1011,1537,4764,2779,4405,3129,1061,5647,3786,3787,1867,2897,5648,2018, 120, # 4720 +4406,4407,2063,3650,3265,2314,3919,2678,3419,1955,4765,4134,5649,3535,1047,2713, # 4736 +1266,5650,1368,4766,2858, 649,3420,3920,2546,2747,1102,2859,2679,5651,5652,2000, # 4752 +5653,1111,3651,2977,5654,2495,3921,3652,2817,1855,3421,3788,5655,5656,3422,2415, # 4768 +2898,3337,3266,3653,5657,2577,5658,3654,2818,4135,1460, 856,5659,3655,5660,2899, # 4784 +2978,5661,2900,3922,5662,4408, 632,2517, 875,3923,1697,3924,2296,5663,5664,4767, # 4800 +3028,1239, 580,4768,4409,5665, 914, 936,2075,1190,4136,1039,2124,5666,5667,5668, # 4816 +5669,3423,1473,5670,1354,4410,3925,4769,2173,3084,4137, 915,3338,4411,4412,3339, # 4832 +1605,1835,5671,2748, 398,3656,4413,3926,4138, 328,1913,2860,4139,3927,1331,4414, # 4848 +3029, 937,4415,5672,3657,4140,4141,3424,2161,4770,3425, 524, 742, 538,3085,1012, # 4864 +5673,5674,3928,2466,5675, 658,1103, 225,3929,5676,5677,4771,5678,4772,5679,3267, # 4880 +1243,5680,4142, 963,2250,4773,5681,2714,3658,3186,5682,5683,2596,2332,5684,4774, # 4896 +5685,5686,5687,3536, 957,3426,2547,2033,1931,2941,2467, 870,2019,3659,1746,2780, # 4912 +2781,2439,2468,5688,3930,5689,3789,3130,3790,3537,3427,3791,5690,1179,3086,5691, # 4928 +3187,2378,4416,3792,2548,3188,3131,2749,4143,5692,3428,1556,2549,2297, 977,2901, # 4944 +2034,4144,1205,3429,5693,1765,3430,3189,2125,1271, 714,1689,4775,3538,5694,2333, # 4960 +3931, 533,4417,3660,2184, 617,5695,2469,3340,3539,2315,5696,5697,3190,5698,5699, # 4976 +3932,1988, 618, 427,2651,3540,3431,5700,5701,1244,1690,5702,2819,4418,4776,5703, # 4992 +3541,4777,5704,2284,1576, 473,3661,4419,3432, 972,5705,3662,5706,3087,5707,5708, # 5008 +4778,4779,5709,3793,4145,4146,5710, 153,4780, 356,5711,1892,2902,4420,2144, 408, # 5024 + 803,2357,5712,3933,5713,4421,1646,2578,2518,4781,4782,3934,5714,3935,4422,5715, # 5040 +2416,3433, 752,5716,5717,1962,3341,2979,5718, 746,3030,2470,4783,4423,3794, 698, # 5056 +4784,1893,4424,3663,2550,4785,3664,3936,5719,3191,3434,5720,1824,1302,4147,2715, # 5072 +3937,1974,4425,5721,4426,3192, 823,1303,1288,1236,2861,3542,4148,3435, 774,3938, # 5088 +5722,1581,4786,1304,2862,3939,4787,5723,2440,2162,1083,3268,4427,4149,4428, 344, # 5104 +1173, 288,2316, 454,1683,5724,5725,1461,4788,4150,2597,5726,5727,4789, 985, 894, # 5120 +5728,3436,3193,5729,1914,2942,3795,1989,5730,2111,1975,5731,4151,5732,2579,1194, # 5136 + 425,5733,4790,3194,1245,3796,4429,5734,5735,2863,5736, 636,4791,1856,3940, 760, # 5152 +1800,5737,4430,2212,1508,4792,4152,1894,1684,2298,5738,5739,4793,4431,4432,2213, # 5168 + 479,5740,5741, 832,5742,4153,2496,5743,2980,2497,3797, 990,3132, 627,1815,2652, # 5184 +4433,1582,4434,2126,2112,3543,4794,5744, 799,4435,3195,5745,4795,2113,1737,3031, # 5200 +1018, 543, 754,4436,3342,1676,4796,4797,4154,4798,1489,5746,3544,5747,2624,2903, # 5216 +4155,5748,5749,2981,5750,5751,5752,5753,3196,4799,4800,2185,1722,5754,3269,3270, # 5232 +1843,3665,1715, 481, 365,1976,1857,5755,5756,1963,2498,4801,5757,2127,3666,3271, # 5248 + 433,1895,2064,2076,5758, 602,2750,5759,5760,5761,5762,5763,3032,1628,3437,5764, # 5264 +3197,4802,4156,2904,4803,2519,5765,2551,2782,5766,5767,5768,3343,4804,2905,5769, # 5280 +4805,5770,2864,4806,4807,1221,2982,4157,2520,5771,5772,5773,1868,1990,5774,5775, # 5296 +5776,1896,5777,5778,4808,1897,4158, 318,5779,2095,4159,4437,5780,5781, 485,5782, # 5312 + 938,3941, 553,2680, 116,5783,3942,3667,5784,3545,2681,2783,3438,3344,2820,5785, # 5328 +3668,2943,4160,1747,2944,2983,5786,5787, 207,5788,4809,5789,4810,2521,5790,3033, # 5344 + 890,3669,3943,5791,1878,3798,3439,5792,2186,2358,3440,1652,5793,5794,5795, 941, # 5360 +2299, 208,3546,4161,2020, 330,4438,3944,2906,2499,3799,4439,4811,5796,5797,5798, # 5376 +) + diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/big5freq.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/big5freq.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fa102adc5419ded2891a3e9b135ce20301ce1593 GIT binary patch literal 54748 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 literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/big5prober.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/big5prober.py new file mode 100644 index 0000000..98f9970 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/big5prober.py @@ -0,0 +1,47 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .mbcharsetprober import MultiByteCharSetProber +from .codingstatemachine import CodingStateMachine +from .chardistribution import Big5DistributionAnalysis +from .mbcssm import BIG5_SM_MODEL + + +class Big5Prober(MultiByteCharSetProber): + def __init__(self): + super(Big5Prober, self).__init__() + self.coding_sm = CodingStateMachine(BIG5_SM_MODEL) + self.distribution_analyzer = Big5DistributionAnalysis() + self.reset() + + @property + def charset_name(self): + return "Big5" + + @property + def language(self): + return "Chinese" diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/big5prober.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/big5prober.pyc new file mode 100644 index 0000000000000000000000000000000000000000..08dcf6efbc90e2a1305f301e8e997a385c812511 GIT binary patch literal 1592 zcmd5+&2G~`5T3R3*Q%uz2*iOCT+AW3rIcO@f~E)|k%DY4_`u4EH_k@3<9a87RNUaj zcqU$encYx&5phw}gAQiB}d!&Yo z0`&{*cgzQV^T*G)fuqrV;OoymV~2lBSFp65b`1U7<&&%+G~tY{*6#g^nqXYg91_ z=nYnxa~g$pqnE^cxJ;XHGA}aKm@u!y?0lAAJe%zAjrI>#t0m45@#x^|bdRpQ3O|Ll zuKT(&m=;C<>CyAEBx08pxl~m)Z^AKUJ5v~rD2266`ICATb!gW|B!)qPxFdGNmbhe> z!47zq&r4Z}1BQ7I=h>nl(`MH$poCL7<0@i?qFbc?<;sq(sr-= 0: + self._total_chars += 1 + # order is valid + if order < self._table_size: + if 512 > self._char_to_freq_order[order]: + self._freq_chars += 1 + + def get_confidence(self): + """return confidence based on existing data""" + # if we didn't receive any character in our consideration range, + # return negative answer + if self._total_chars <= 0 or self._freq_chars <= self.MINIMUM_DATA_THRESHOLD: + return self.SURE_NO + + if self._total_chars != self._freq_chars: + r = (self._freq_chars / ((self._total_chars - self._freq_chars) + * self.typical_distribution_ratio)) + if r < self.SURE_YES: + return r + + # normalize confidence (we don't want to be 100% sure) + return self.SURE_YES + + def got_enough_data(self): + # It is not necessary to receive all data to draw conclusion. + # For charset detection, certain amount of data is enough + return self._total_chars > self.ENOUGH_DATA_THRESHOLD + + def get_order(self, byte_str): + # We do not handle characters based on the original encoding string, + # but convert this encoding string to a number, here called order. + # This allows multiple encodings of a language to share one frequency + # table. + return -1 + + +class EUCTWDistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + super(EUCTWDistributionAnalysis, self).__init__() + self._char_to_freq_order = EUCTW_CHAR_TO_FREQ_ORDER + self._table_size = EUCTW_TABLE_SIZE + self.typical_distribution_ratio = EUCTW_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, byte_str): + # for euc-TW encoding, we are interested + # first byte range: 0xc4 -- 0xfe + # second byte range: 0xa1 -- 0xfe + # no validation needed here. State machine has done that + first_char = byte_str[0] + if first_char >= 0xC4: + return 94 * (first_char - 0xC4) + byte_str[1] - 0xA1 + else: + return -1 + + +class EUCKRDistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + super(EUCKRDistributionAnalysis, self).__init__() + self._char_to_freq_order = EUCKR_CHAR_TO_FREQ_ORDER + self._table_size = EUCKR_TABLE_SIZE + self.typical_distribution_ratio = EUCKR_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, byte_str): + # for euc-KR encoding, we are interested + # first byte range: 0xb0 -- 0xfe + # second byte range: 0xa1 -- 0xfe + # no validation needed here. State machine has done that + first_char = byte_str[0] + if first_char >= 0xB0: + return 94 * (first_char - 0xB0) + byte_str[1] - 0xA1 + else: + return -1 + + +class GB2312DistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + super(GB2312DistributionAnalysis, self).__init__() + self._char_to_freq_order = GB2312_CHAR_TO_FREQ_ORDER + self._table_size = GB2312_TABLE_SIZE + self.typical_distribution_ratio = GB2312_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, byte_str): + # for GB2312 encoding, we are interested + # first byte range: 0xb0 -- 0xfe + # second byte range: 0xa1 -- 0xfe + # no validation needed here. State machine has done that + first_char, second_char = byte_str[0], byte_str[1] + if (first_char >= 0xB0) and (second_char >= 0xA1): + return 94 * (first_char - 0xB0) + second_char - 0xA1 + else: + return -1 + + +class Big5DistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + super(Big5DistributionAnalysis, self).__init__() + self._char_to_freq_order = BIG5_CHAR_TO_FREQ_ORDER + self._table_size = BIG5_TABLE_SIZE + self.typical_distribution_ratio = BIG5_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, byte_str): + # for big5 encoding, we are interested + # first byte range: 0xa4 -- 0xfe + # second byte range: 0x40 -- 0x7e , 0xa1 -- 0xfe + # no validation needed here. State machine has done that + first_char, second_char = byte_str[0], byte_str[1] + if first_char >= 0xA4: + if second_char >= 0xA1: + return 157 * (first_char - 0xA4) + second_char - 0xA1 + 63 + else: + return 157 * (first_char - 0xA4) + second_char - 0x40 + else: + return -1 + + +class SJISDistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + super(SJISDistributionAnalysis, self).__init__() + self._char_to_freq_order = JIS_CHAR_TO_FREQ_ORDER + self._table_size = JIS_TABLE_SIZE + self.typical_distribution_ratio = JIS_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, byte_str): + # for sjis encoding, we are interested + # first byte range: 0x81 -- 0x9f , 0xe0 -- 0xfe + # second byte range: 0x40 -- 0x7e, 0x81 -- oxfe + # no validation needed here. State machine has done that + first_char, second_char = byte_str[0], byte_str[1] + if (first_char >= 0x81) and (first_char <= 0x9F): + order = 188 * (first_char - 0x81) + elif (first_char >= 0xE0) and (first_char <= 0xEF): + order = 188 * (first_char - 0xE0 + 31) + else: + return -1 + order = order + second_char - 0x40 + if second_char > 0x7F: + order = -1 + return order + + +class EUCJPDistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + super(EUCJPDistributionAnalysis, self).__init__() + self._char_to_freq_order = JIS_CHAR_TO_FREQ_ORDER + self._table_size = JIS_TABLE_SIZE + self.typical_distribution_ratio = JIS_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, byte_str): + # for euc-JP encoding, we are interested + # first byte range: 0xa0 -- 0xfe + # second byte range: 0xa1 -- 0xfe + # no validation needed here. State machine has done that + char = byte_str[0] + if char >= 0xA0: + return 94 * (char - 0xA1) + byte_str[1] - 0xa1 + else: + return -1 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/chardistribution 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/chardistribution 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..eb4ad85bdc82bf670d841fcd93b957e021415bdb GIT binary patch literal 9073 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 0: + self._total_chars += 1 + # order is valid + if order < self._table_size: + if 512 > self._char_to_freq_order[order]: + self._freq_chars += 1 + + def get_confidence(self): + """return confidence based on existing data""" + # if we didn't receive any character in our consideration range, + # return negative answer + if self._total_chars <= 0 or self._freq_chars <= self.MINIMUM_DATA_THRESHOLD: + return self.SURE_NO + + if self._total_chars != self._freq_chars: + r = (self._freq_chars / ((self._total_chars - self._freq_chars) + * self.typical_distribution_ratio)) + if r < self.SURE_YES: + return r + + # normalize confidence (we don't want to be 100% sure) + return self.SURE_YES + + def got_enough_data(self): + # It is not necessary to receive all data to draw conclusion. + # For charset detection, certain amount of data is enough + return self._total_chars > self.ENOUGH_DATA_THRESHOLD + + def get_order(self, byte_str): + # We do not handle characters based on the original encoding string, + # but convert this encoding string to a number, here called order. + # This allows multiple encodings of a language to share one frequency + # table. + return -1 + + +class EUCTWDistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + super(EUCTWDistributionAnalysis, self).__init__() + self._char_to_freq_order = EUCTW_CHAR_TO_FREQ_ORDER + self._table_size = EUCTW_TABLE_SIZE + self.typical_distribution_ratio = EUCTW_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, byte_str): + # for euc-TW encoding, we are interested + # first byte range: 0xc4 -- 0xfe + # second byte range: 0xa1 -- 0xfe + # no validation needed here. State machine has done that + first_char = byte_str[0] + if first_char >= 0xC4: + return 94 * (first_char - 0xC4) + byte_str[1] - 0xA1 + else: + return -1 + + +class EUCKRDistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + super(EUCKRDistributionAnalysis, self).__init__() + self._char_to_freq_order = EUCKR_CHAR_TO_FREQ_ORDER + self._table_size = EUCKR_TABLE_SIZE + self.typical_distribution_ratio = EUCKR_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, byte_str): + # for euc-KR encoding, we are interested + # first byte range: 0xb0 -- 0xfe + # second byte range: 0xa1 -- 0xfe + # no validation needed here. State machine has done that + first_char = byte_str[0] + if first_char >= 0xB0: + return 94 * (first_char - 0xB0) + byte_str[1] - 0xA1 + else: + return -1 + + +class GB2312DistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + super(GB2312DistributionAnalysis, self).__init__() + self._char_to_freq_order = GB2312_CHAR_TO_FREQ_ORDER + self._table_size = GB2312_TABLE_SIZE + self.typical_distribution_ratio = GB2312_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, byte_str): + # for GB2312 encoding, we are interested + # first byte range: 0xb0 -- 0xfe + # second byte range: 0xa1 -- 0xfe + # no validation needed here. State machine has done that + first_char, second_char = byte_str[0], byte_str[1] + if (first_char >= 0xB0) and (second_char >= 0xA1): + return 94 * (first_char - 0xB0) + second_char - 0xA1 + else: + return -1 + + +class Big5DistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + super(Big5DistributionAnalysis, self).__init__() + self._char_to_freq_order = BIG5_CHAR_TO_FREQ_ORDER + self._table_size = BIG5_TABLE_SIZE + self.typical_distribution_ratio = BIG5_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, byte_str): + # for big5 encoding, we are interested + # first byte range: 0xa4 -- 0xfe + # second byte range: 0x40 -- 0x7e , 0xa1 -- 0xfe + # no validation needed here. State machine has done that + first_char, second_char = byte_str[0], byte_str[1] + if first_char >= 0xA4: + if second_char >= 0xA1: + return 157 * (first_char - 0xA4) + second_char - 0xA1 + 63 + else: + return 157 * (first_char - 0xA4) + second_char - 0x40 + else: + return -1 + + +class SJISDistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + super(SJISDistributionAnalysis, self).__init__() + self._char_to_freq_order = JIS_CHAR_TO_FREQ_ORDER + self._table_size = JIS_TABLE_SIZE + self.typical_distribution_ratio = JIS_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, byte_str): + # for sjis encoding, we are interested + # first byte range: 0x81 -- 0x9f , 0xe0 -- 0xfe + # second byte range: 0x40 -- 0x7e, 0x81 -- oxfe + # no validation needed here. State machine has done that + first_char, second_char = byte_str[0], byte_str[1] + if (first_char >= 0x81) and (first_char <= 0x9F): + order = 188 * (first_char - 0x81) + elif (first_char >= 0xE0) and (first_char <= 0xEF): + order = 188 * (first_char - 0xE0 + 31) + else: + return -1 + order = order + second_char - 0x40 + if second_char > 0x7F: + order = -1 + return order + + +class EUCJPDistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + super(EUCJPDistributionAnalysis, self).__init__() + self._char_to_freq_order = JIS_CHAR_TO_FREQ_ORDER + self._table_size = JIS_TABLE_SIZE + self.typical_distribution_ratio = JIS_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, byte_str): + # for euc-JP encoding, we are interested + # first byte range: 0xa0 -- 0xfe + # second byte range: 0xa1 -- 0xfe + # no validation needed here. State machine has done that + char = byte_str[0] + if char >= 0xA0: + return 94 * (char - 0xA1) + byte_str[1] - 0xa1 + else: + return -1 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/chardistribution.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/chardistribution.pyc new file mode 100644 index 0000000000000000000000000000000000000000..36e928111238224fcdb06ea97ed039332595d13e GIT binary patch literal 9073 zcmdT~&2Jmm5uaTyDN&!+HO4sdOo|Fi~VdaaYuelbQ)CC&<8@Nezpd zNh&9)nWA!vngdiG&~piD3{o>qS-02nwz?8eZY-}n%sZt*Ij^!O%*P)TR+k?-YlYH=U0B)ND6AJ9 zdzrsZ?ft&}1$*=4*}cKMVDEXB;{M8wn@cy&+kE0=wrBUNJ=_bnpW~$~h5K)xxA}N? zu4n77#JmeOp5=w_6-wvrJJy-%+4l7=>vMM%1Fr5=!Zklqp}%#Y{8q3WR2uEbk7BUE z-Ya}W-(%ttFv754j4)~#BaDx-MK0qdNv;KtVTia%84M6RG&qADhi06xGlMfkt~fKJ z#V+NBcx#_5qT0vz|M_(KElIE~f zdccC|0n4TbDO|EU0B8Z-r5tuG<_4K63&U36sVN>fRaT6nTF!Rp?K`c|^+GiazN&0B zJSXy>dg>Ki)!y@~m4@T?=+Fr(tV)%{au*wp$b~J%>#%L4caoj;IhKZAeTCD9Yy8FAer{CUQy1un^v)w*ayGp5BH;;C% z^It7k+*sW6_pbRt#P@GpyK(ECV%Y{u4(HGd+*Y^|0DSTbLlQ{-GH|RJ)0b|L;;2CQyLG>hsZLG0&S*I4=GTHli3O;R8o%PrT_HZhf z%-1an5A_9%1-ZbY{X^PsQ@{X9F#rZwg6It<+n(oUD_J-~rK-Fzd*rK~Y&~cl1=)rd z)YOg-`1$|lKQV};0w0(x=HS38&7|fjjTUX0NoLsysoF+(cCnGTIBq4*g@MEO5aSBg z`oo4ICG>KS<&Kcj$Q&^z&6F`>jGN=elp%f(wZs-Z;1d`?%8I%{(N#GW0KiBFg}IJ} zN_rirLG=WMLC;dXi$NJoTQog$%vLF=HluTM z1Ll+91hjJG)}}2A@U>Ot;Sp-Z1Gd_V6Qb%9i`%cVT<~oDSjilcZzqKXm8R!73gw35 zG+XWgXL85>8lT#4fLsO1f}lo}2yP=i*G5`erX-h5<*F*5>H*|@}Aqy4_ zG9ivCsEhP zpzZ&ahyI5kP>ugv5F}>pnz)&SV*49B5`W+Jx$KncQ!imYz0ANYKzafpL|w@tPN^AF zN<149+TR2b81@_F;Gp}E++vb4(y1=Q-naW1V)nP7(Q6>0R&f$3&F~x=T`1!uwf7~u ze!|lIU(oeOzR{OOm;Dwm?jub7G*;4O!W7){1tgC#g*>FYH2n{%1(sEVN{VR#6@s+} z6#`uUg6fwn-C0n<3~|aT@JT0S;mf3XlT#PoN;zHWx6);KL$xH6Ez3KoOmQYl&>W|- z^Rt-bE&-b)Fv({pSxmwbs!YjZf-`BHL>?FOZolQSk77M0XN-(7eK~R&JogunJjNXq zzT(&3?tj!>XGt~cP(kW014?_1IyCG07j=JN=`KK>%S$dm-4A+Dmp>16TsqE`&=KlI z;{c;E;C9epr>unbI%TB*@^^f$E6QJCbO+=v$QMG>UgRZxln4LB;zW4&BgW&1RF`v? z1C#LU-$VLSm@IMYzyC40#Bys)LiHMxqZrA{8=5iwi^)$|y0e%>NgQXwpYzEDn7l1u z<4nknzT3T+JhmuUlF5{$$-0aOWMRF#Fhv>0<=iwDGepx=dS(ISbNq8(hMDLC4-?wD zKf^4Ru|#M~LEpV7{xP5XzXtg;$fqEmfuNzGo49u|`VkWiTPgle=UV}_jh~YG2-$yQ zairY=WM_;CK4whI7-Nj5jZ5(c36%T=PZ1-$)1-OtgZ_s&dOepF;{SlsQIG!*{TVK1 zr9YEIf9CTl+u!gl^c$p9wvty*(&y>^jQtuf?jwAC%Hn7xU8XlkxaHp=c^6Z~9P}zb zN_huWb%dW=ZRU^-YuIQcb|>qhOo~}>xs6aLZL``I{-1!%%B!8c)xm*u=bP(fnUexk zYEP7%@bL86usl;II){Hfrd&*l?Z|s3sl^wNG+(Pl%^jn>Q>LGDk7DU<2Qb>>)6hl zaY#xcklGzTgk2?AvtY|lV8Mc4z=A)(Id`0<>K>8g&GmfTH}B55XULw83xLb&|lGJa@d@mM!P=8NaRYzm3B4U>hm)w70ht`XPkNm%iP+h`)T; zSZj=X;|sl^5ADI=!j08i{=q|bX|X$Qn2m}?2l>og&|mLD&Md~bJ|6F-T=Kgpo{JUp zwyEO3Ly9nH#;mY!qVgK-&)`nz74Y4wtn|yW`glbSG$F-#rUm(-BcMgYR_ImkgBT^b zTtcF@&+~aSO%n(ppeg}sYFZ*;t7xYTC8mWT7Y<8F$?24d&jaEsX7%6_9zQT!WhZ7+#JddW+PIZAhLB*lYouk`7<+-IA&~+|L(TL)G z`~Jh`s{LwBRUoQ6&pK6s=KVE$@0NDnZV$XuG0_nVImLmf8%9Ng1lZUM4g*EX-IFfC z9GgwSBl-r4e;-CvJSq^6idjIRt(sZ23$XL%RNO99QL3R*<4;tGvP`ub$18-J**(j2 zwZH;)CEC?s&RSVQ{$%kMex@_N7VksH?_v$exq(GT`>eqOJn$oVyKTiss^UK3gSdQn1e=GK&^GGR|uPvYRb^0m?lxpc|HtBtI zt+?baxp44kzQL`8%fTyJ4GvT-X5 zdl5H6mXh^~;1MEP`=9SqRNZA1&kHsdU#Zp><`(9vOHEC(Qo!N<=%Y%JNz*eoUQ1HS Zo8EJd)w(nbS7VAkKg;z|9v97G@-NsCz5DbL86usl;II){Hfrd&*l?Z|s3l!W?L&z%-6+evp39Jp&eZ8J&oR*TkWFd0ta0YUOn!)U5qB<*!?`Z5{AD(@poaIFsQ7; zFrOm8gux;Vgy3cvC__SjMVrY{b9Nf-#vCK1e^t^}eHJrzI6n(fxQXJg!UQ}<4lr3s z`Xzqkz+kP$;1lSziR7XcEIn2)%NcAXtgwgbZ(D@Hz)QE!fhPSLWP&Ig-MocA_5)O9vGc{k{$jG~Sb zjo(MDF)n($$U6^#z^nYp09-i4f5jB&j`-cPyYH&HwnE9P}m z#eatsVbF|OVc$aKCD@<9ozN@bd)HX$mu2nYsvK%Uii=DO@c21v(uQ2ZhzGG~GRqN$h~e$T~BFdHnIi4{}`HC}j2E2O@d=Uqf_c;o`4 zTe`EGb;XZpgflR?3$`;Fc6*r{cAP?`l0dQmSvzcRM@dlFP7GTK(JG2(GNn{ilxF`6 zl+p!!AmTzEQ7AoJk!+z z3)q!tSA#igWeNF{>3c~1-cQq{tv&qlh%Otlb4Q7#Wbi+z$DEJ?W%8+C;|Xq#ola58 z4l#yMq8~V=ezfy)P?jfUXdUq7eT)DRjXv4@Y4+o*(|T*n`evrCh$ge8Jc0s~k|OrDxfs_wkYQ z0xb#hV3g;$OcC?UZBFu(LKY>4+qcdERa%`jP^R@3!4E6rl-z8c7}ilA@1yv4VFVmo zFl8;|9uF}7o`an?Z=h7rSA|Ej{(MVWJ!NpUVvn`kqiiy8)U?h-mG9zE4qgmr*<~*jRj}T3eV~n5!-|HOWc=hx?gf<)&9F= literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/charsetprober 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/charsetprober 2.py new file mode 100644 index 0000000..eac4e59 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/charsetprober 2.py @@ -0,0 +1,145 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +import logging +import re + +from .enums import ProbingState + + +class CharSetProber(object): + + SHORTCUT_THRESHOLD = 0.95 + + def __init__(self, lang_filter=None): + self._state = None + self.lang_filter = lang_filter + self.logger = logging.getLogger(__name__) + + def reset(self): + self._state = ProbingState.DETECTING + + @property + def charset_name(self): + return None + + def feed(self, buf): + pass + + @property + def state(self): + return self._state + + def get_confidence(self): + return 0.0 + + @staticmethod + def filter_high_byte_only(buf): + buf = re.sub(b'([\x00-\x7F])+', b' ', buf) + return buf + + @staticmethod + def filter_international_words(buf): + """ + We define three types of bytes: + alphabet: english alphabets [a-zA-Z] + international: international characters [\x80-\xFF] + marker: everything else [^a-zA-Z\x80-\xFF] + + The input buffer can be thought to contain a series of words delimited + by markers. This function works to filter all words that contain at + least one international character. All contiguous sequences of markers + are replaced by a single space ascii character. + + This filter applies to all scripts which do not use English characters. + """ + filtered = bytearray() + + # This regex expression filters out only words that have at-least one + # international character. The word may include one marker character at + # the end. + words = re.findall(b'[a-zA-Z]*[\x80-\xFF]+[a-zA-Z]*[^a-zA-Z\x80-\xFF]?', + buf) + + for word in words: + filtered.extend(word[:-1]) + + # If the last character in the word is a marker, replace it with a + # space as markers shouldn't affect our analysis (they are used + # similarly across all languages and may thus have similar + # frequencies). + last_char = word[-1:] + if not last_char.isalpha() and last_char < b'\x80': + last_char = b' ' + filtered.extend(last_char) + + return filtered + + @staticmethod + def filter_with_english_letters(buf): + """ + Returns a copy of ``buf`` that retains only the sequences of English + alphabet and high byte characters that are not between <> characters. + Also retains English alphabet and high byte characters immediately + before occurrences of >. + + This filter can be applied to all scripts which contain both English + characters and extended ASCII characters, but is currently only used by + ``Latin1Prober``. + """ + filtered = bytearray() + in_tag = False + prev = 0 + + for curr in range(len(buf)): + # Slice here to get bytes instead of an int with Python 3 + buf_char = buf[curr:curr + 1] + # Check if we're coming out of or entering an HTML tag + if buf_char == b'>': + in_tag = False + elif buf_char == b'<': + in_tag = True + + # If current character is not extended-ASCII and not alphabetic... + if buf_char < b'\x80' and not buf_char.isalpha(): + # ...and we're not in a tag + if curr > prev and not in_tag: + # Keep everything after last non-extended-ASCII, + # non-alphabetic character + filtered.extend(buf[prev:curr]) + # Output a space to delimit stretch we kept + filtered.extend(b' ') + prev = curr + 1 + + # If we're not in a tag... + if not in_tag: + # Keep everything after last non-extended-ASCII, non-alphabetic + # character + filtered.extend(buf[prev:]) + + return filtered diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/charsetprober 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/charsetprober 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d8291310fe5d36d99f045fd617a4930b25a939ad GIT binary patch literal 4666 zcmd5=TW=Fb6dtcHkYFw;(3Vzh2P#xkNDQJE32|vi(t?Civ@xO$g3Wq&Y>!#*E<57{ zqeMl5-_ak@x4!kU{U3ekQ(yW6=y%TA>rfT-v39)2GiPVcoXebV&ZPX;;rZWwx%Ma! z<4+mCU*Rz~K|*{>A`)V=XqUuhNra9F%OY~bpe#1aq7+tys)!C=RK-gnUI_91W|gLH zG-?o|U*WT^OK3KT*gDAFENSbwyJ3B+>|rogdVaQ{Eb&!V=;PoGsbZdkC}@I3K%u}q zE$|ZhR7f8zizQW!6eAVDKOmqN@eeXTR}K6*5!RSLFVrCs9+-@;bNAq+dzia(lkO4W zZZr--iEf8Kf8Gd4x5=}DwrPMsyImo?lGw!;4M*6r=vRcTl2XKhjsl(`Ppmf%fZ7T* zlUP~umS@-{v{dBBU9Y1ft1?Riqomt~&+Hu9U1jf}i#G>pk{9~}<#{ZDhN-MUszkbXHa7OiHQ>20{bx$S4oP7;MGGtF+=44?G7&pzv1y4b#Sc{JL#eQWKPmv?#> z@#)6RRx{P^{h{cb$t>Q4rngOC2D$Bn{*_5NYl#a&Q>R4OP`vgiD zvRRbo@E4Fv=poJ7p~ujGru~U4_c^YNS1umG-dJ60t*x|fuYcnbpMC3+muA7@D)h({ zoNxgRL$-;jsbnsjO7Yoe9`RioJ6pC;=2B>34ez)n`ngF?kq&P%2}1>MN{$S&LWuUT zGYb(S-*=P>FXQ)(0ipy%`u3-}%Q2eG{l*ybMPZIpq}J=fA%vz)w%!HdPaY1oY*zB; z2owX_c|j6)bg1G$T>!P{t1xYo@<(8dF?_`}0< z=Pem4bF?I1WQw<@8MgD(qvdB|lb(bg`B~ugbhqcVM^<@B9F4Bwg(35Wb20}OLY%@M z&(MKCUI?*Q5-_%pvy<`kg(LPH@$@^f>xk8dcg0?r&a6IYnfxYkT$S?XM|%~qTcJ}7 zQtFwa4$j%f6n4fxq}{d2#b$F<8eqBxB#|B=(~#^0lrc#PS0S zz{KZ^ucosGe)d>pSYTUaBiqB-Dph2ZeDElj&x4CKT0I59>Cj5xR!3zr@MGB~Gm>Gq zXQfRf_NeuBEPZKIrgO7)k}NbZIno1dRal5?k7T~SS(2@uHnKB}12RBj#$!X`@_57U zhL&9l3a!mQcrh>$ymwu!9URL8en{%H`+oTcEu0xHh0|P7G`V1JB+8gl=ob%EvL6VLLp|-Y=`CD6g8seZpsw01Z!Qdb{_NUZ%R~N!2*d_fqlmy@mche*q z=Qd>?B?fSBN2yp|y}obAG%uDTlORKL1ttmf-%IGhK!qA5e>5r-YpYIzMUx;HW?6v< z*WZxTW5~;MJN)Oa_r|TQsgE=QD)`pPNBniBSNB5%h1`7`gj4%#AJEUO4EL_Q3W!w9 z$==F_%B9M}eHVmpwG0q0yld2pJkZEle23?bMxGlLNCL*p?*>}cEb#)qpH zDN83LRf6UWh^Wt%YNeWU%2{yg00=zgQ_k`73Fla8p~uTDjNqTDROabndM3g~p|!E?p$pHMkk3xWtZJ`X7MH0_oQ0F33cJb81e#I#)hg89&vdXY(CHz?vUI)Kc+q kVDc+0p>ERdtH83TS+R=)bTtp^^$*BCQnX&GJIBg@16xF%i2wiq literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/charsetprober.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/charsetprober.py new file mode 100644 index 0000000..eac4e59 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/charsetprober.py @@ -0,0 +1,145 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +import logging +import re + +from .enums import ProbingState + + +class CharSetProber(object): + + SHORTCUT_THRESHOLD = 0.95 + + def __init__(self, lang_filter=None): + self._state = None + self.lang_filter = lang_filter + self.logger = logging.getLogger(__name__) + + def reset(self): + self._state = ProbingState.DETECTING + + @property + def charset_name(self): + return None + + def feed(self, buf): + pass + + @property + def state(self): + return self._state + + def get_confidence(self): + return 0.0 + + @staticmethod + def filter_high_byte_only(buf): + buf = re.sub(b'([\x00-\x7F])+', b' ', buf) + return buf + + @staticmethod + def filter_international_words(buf): + """ + We define three types of bytes: + alphabet: english alphabets [a-zA-Z] + international: international characters [\x80-\xFF] + marker: everything else [^a-zA-Z\x80-\xFF] + + The input buffer can be thought to contain a series of words delimited + by markers. This function works to filter all words that contain at + least one international character. All contiguous sequences of markers + are replaced by a single space ascii character. + + This filter applies to all scripts which do not use English characters. + """ + filtered = bytearray() + + # This regex expression filters out only words that have at-least one + # international character. The word may include one marker character at + # the end. + words = re.findall(b'[a-zA-Z]*[\x80-\xFF]+[a-zA-Z]*[^a-zA-Z\x80-\xFF]?', + buf) + + for word in words: + filtered.extend(word[:-1]) + + # If the last character in the word is a marker, replace it with a + # space as markers shouldn't affect our analysis (they are used + # similarly across all languages and may thus have similar + # frequencies). + last_char = word[-1:] + if not last_char.isalpha() and last_char < b'\x80': + last_char = b' ' + filtered.extend(last_char) + + return filtered + + @staticmethod + def filter_with_english_letters(buf): + """ + Returns a copy of ``buf`` that retains only the sequences of English + alphabet and high byte characters that are not between <> characters. + Also retains English alphabet and high byte characters immediately + before occurrences of >. + + This filter can be applied to all scripts which contain both English + characters and extended ASCII characters, but is currently only used by + ``Latin1Prober``. + """ + filtered = bytearray() + in_tag = False + prev = 0 + + for curr in range(len(buf)): + # Slice here to get bytes instead of an int with Python 3 + buf_char = buf[curr:curr + 1] + # Check if we're coming out of or entering an HTML tag + if buf_char == b'>': + in_tag = False + elif buf_char == b'<': + in_tag = True + + # If current character is not extended-ASCII and not alphabetic... + if buf_char < b'\x80' and not buf_char.isalpha(): + # ...and we're not in a tag + if curr > prev and not in_tag: + # Keep everything after last non-extended-ASCII, + # non-alphabetic character + filtered.extend(buf[prev:curr]) + # Output a space to delimit stretch we kept + filtered.extend(b' ') + prev = curr + 1 + + # If we're not in a tag... + if not in_tag: + # Keep everything after last non-extended-ASCII, non-alphabetic + # character + filtered.extend(buf[prev:]) + + return filtered diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/charsetprober.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/charsetprober.pyc new file mode 100644 index 0000000000000000000000000000000000000000..aae42d1fe72f69a5133cff7d9b309998093f4504 GIT binary patch literal 4666 zcmd5=TW=Fb6dtcHkYFw;(3Vy$0~M+%B!<$0gt#;WT98nRHm+!c!e+fYw#Te@mz{Bf zQKBNj@92-{TOa$@AJT_D^`$?6e&?*c4pmVfYsY&$b9Uy;xy>}-(-B9yZa~IgWR2)bPox4 zt#JTKbUXa{^JYN0O`a9BO#=kl?FiwO#16h_IKq}izangvlp+pv6z~jrVzsdk)K;jO z#LAMlJi{)br6ND>dL12Em021XCEYH3X6MlEDtjMYyxC8ayx1Qo&tnNROl1vHjYS(3 zbzEA5^vj8{Xf@MJZ^8Y|EkA2^k|9>34ez)n`ngF?kq&P&2}1>MN{$S&LWuUT zGYb(S-*=P>FX8vC0ipy%`u3-}%Q2eG{l*w_xiH5mQtQp&5JJ-?TkV4ICl3c(HY@pa z2#Nviyda4?I#h9>u7dN=I8h8akxrnIV+PI#oD7KB%d*(z;H@<%T&re3XycJs{Bh&# zIZMXM94*Ngnc}T!hV4A{X!%*#q{pF0einE=-R*hpkyTz2N2BX_VaR;p9M6G;5U23R zb9CU3mqP581dQ$D>|{KB>4;rNJo{ekIO6uk1F>7CGpi3;CcjA>SEampa0-WwW9Q}g^H9l9b#$zx?PUsdlqw^W zjwFlB)nc3{Y4aZlq05PB=zB@)w^kFRpJCgLRBUGWM-bVn4bn-{?w0EI+^i zOnkBUdOB<1XHQgy1-4W+vOS!wQbk6|M~`#)Jh)h+)l(3h4y^=kbyOw;KbCDWBN=vk zR@y{jk6K^H(w9bMIyY-O$wC8@BR$Yog@w5GNapLCCE4m}BRj)5AOj?3JTW9Lk2ma& zhzBXQ=iBKbwvZJm-&lzf;%$~M$z=#3^>lZb3=Q;qI;31;&yV#e#QB+$nMxx+P$9xX z=D;_Rk|qU9`XeZ$BVq$IwS1i&`(}-LEJIDYNWIDA*ZufN1lVKv`#L6L@ePX}8!!fb7Lhw)UG@}8@eJP0a81t$cDfvYNNvHS?G_el9!K#32a;}|90$N`TPzlFEv z7>GDLS4GL?94sx==1V6~d@bZ>1XW{X=L#P42gqLN09*h%fD_Mt7M2TJ0@o6KZ*TlW zFn~U=f#AUr@15GMiXGeofE13%S_D3j5Fck|g_)WvRAOQtMphY98r1HiUM8?X2Ld6Y zBC=lys_OIusHyQ{K&y&4#ZbjOl=jpidASnM_GyE@4>8yL{>Idklc5AubiSM4uz`xr z=PEnQVuRfuBf2$~FA1HV$K$OJ20|Af7i!!eK<$ zP(t9fyWhI4mG4?!>#lnTo%^@>LgUgcQ kF!>dhP&aA!RbW}vtk}f?x|Rp^#z$lyDOxYpog?MH0rs_<761SM literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/cli/__init__ 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/cli/__init__ 2.py new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/cli/__init__ 2.py @@ -0,0 +1 @@ + diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/cli/__init__ 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/cli/__init__ 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1972d87c3fac04260b604405a93cd8bbace494be GIT binary patch literal 202 zcmZ9GK?=e!5Je-p5W#zNQ>R72jf#S9MNqef*raVrOk*-e>gn8i9xq@juKe)+hqsyO zzK4U?bAHOmFP*Tto07G5iUm#E;mrNl5u09(!j1w^<0#3bdHm* zbJ!qan%wKir&4eLEp#Z9#azm8o-VWFu2)~Efj)-d?d{IZ&hF0q<~LjW_pRU` zfBV(f6I%a#yg&G$M)oi0#6%;s9>qST9%Vj_e9CGxs!>*_QJp;gR-<%>MmwU1euG90 z>DMXUrEHHzdzIb}rA^8L8U@w3LFqnaEgH2j-lcet{@~H*78{J4(mx>GrZ}MIKAAs} zKA>wNFUO8*^rW+o4VL#kqTtEIBul3*=E-EPT=ZO9RpeR~MrDQ3YMP{4Eh9I#D#~MJ z^s+FHRg|0S#Hd(1J#jh?bUrEKB%j$J`1qSBTc&z22m*!Q12vgPrczY4$h6qxP5~Q+ zN20g+G*A~w9v2t3d;IYIhZwlIniTmoiLr)ON4@uN)Nc$7RAeVf@|yB-?M+-=B~ zCdpkmE%S*>irlp!D)R)s&|#W5ZKBkkbl_-m?DH@@*TzCI3@ahqKK#4K4P5x6&*($*(;yEc|?~)kH0#ks~S0vE^Bn{asSe%g})wp zJgAXr)9H&g;r}@c>H-e#?a)=7T!W0GOOF=20@ycntZ8ncGJy0iT`SW@=z-O8w4-iegD4|E%C%ha7nVh8{r=JP_-K6m-fDI3 z7S6e!zjrY|!f%%M&-%+`*-dimqBQM(`1oUc`jkcTAk)AiroSei{v=H{eMG9aTuJ&? zpj&d}!eaU(?8R~zC}?`Oyq0&%Z+d%P;5EI5_hY=<-o8KK^RT1%Ad-gvLI-KM0G|up zUz3MC;r#K1kdYH$_=f0!pLaPg!Pp>b@G~4^J|To-(V)D!?jZ4I$TzRZE*sdzmtOj6oohFhw+_#=HD-$e%h04FW~$!F(G`vfHcfB^cljH?5OS4C!4 z0v;e#76CLCDaVBYX&M=nidWMV>gNOX**cSNCLe;(Rf5!B>Pa$9bi6J(o3*;UR+YQF zlbav7{sibgRL`CPs6Dp+|;i4n#g69k*@2fp*v59;W!rsD1`8%BZ z?EkHhpqZ`mc(cD(I-4Z2!tqjnBu(ZzU6x;Cwcl{{y_h3Ozoo1TNQyFLZ$H;eYFt@O z#_o8<`0ImCtfvuJVt`1XzP%%Bu>(pjEM_c}ki!|aWQhONF<-CeluRex?z(zO)poWQB0>3&Dh3xUG1o?FoJRTc3VZN|1+zw}uzdLllR*Nkwkk?fRrsC)Mle(t zQSKDG`jEG?y%jlAx69uGaT4?1Nr%fb$|3FnW`-IA=41x`aEDViJbpybyOX+%I$(4%yt0&pKqB51HSq7_hHUE_&-y z(OaXjiU8Mw@A%jQ+2KB1RmundLkBm&>JnGodJ7{ZSz;sJXNnrWi^+nHFyu0cgFx{8 lsEiEqUuH#Irux^6NqYxP!@uXZ5Rx{6(XO@bweGjP{{p%aWoG~Y literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/cli/chardetect.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/cli/chardetect.py new file mode 100644 index 0000000..c61136b --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/cli/chardetect.py @@ -0,0 +1,85 @@ +#!/usr/bin/env python +""" +Script which takes one or more file paths and reports on their detected +encodings + +Example:: + + % chardetect somefile someotherfile + somefile: windows-1252 with confidence 0.5 + someotherfile: ascii with confidence 1.0 + +If no paths are provided, it takes its input from stdin. + +""" + +from __future__ import absolute_import, print_function, unicode_literals + +import argparse +import sys + +from pip._vendor.chardet import __version__ +from pip._vendor.chardet.compat import PY2 +from pip._vendor.chardet.universaldetector import UniversalDetector + + +def description_of(lines, name='stdin'): + """ + Return a string describing the probable encoding of a file or + list of strings. + + :param lines: The lines to get the encoding of. + :type lines: Iterable of bytes + :param name: Name of file or collection of lines + :type name: str + """ + u = UniversalDetector() + for line in lines: + line = bytearray(line) + u.feed(line) + # shortcut out of the loop to save reading further - particularly useful if we read a BOM. + if u.done: + break + u.close() + result = u.result + if PY2: + name = name.decode(sys.getfilesystemencoding(), 'ignore') + if result['encoding']: + return '{0}: {1} with confidence {2}'.format(name, result['encoding'], + result['confidence']) + else: + return '{0}: no result'.format(name) + + +def main(argv=None): + """ + Handles command line arguments and gets things started. + + :param argv: List of arguments, as if specified on the command-line. + If None, ``sys.argv[1:]`` is used instead. + :type argv: list of str + """ + # Get command line arguments + parser = argparse.ArgumentParser( + description="Takes one or more file paths and reports their detected \ + encodings") + parser.add_argument('input', + help='File whose encoding we would like to determine. \ + (default: stdin)', + type=argparse.FileType('rb'), nargs='*', + default=[sys.stdin if PY2 else sys.stdin.buffer]) + parser.add_argument('--version', action='version', + version='%(prog)s {0}'.format(__version__)) + args = parser.parse_args(argv) + + for f in args.input: + if f.isatty(): + print("You are running chardetect interactively. Press " + + "CTRL-D twice at the start of a blank line to signal the " + + "end of your input. If you want help, run chardetect " + + "--help\n", file=sys.stderr) + print(description_of(f, f.name)) + + +if __name__ == '__main__': + main() diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/cli/chardetect.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/cli/chardetect.pyc new file mode 100644 index 0000000000000000000000000000000000000000..98fa06e9a349ab47a8fc871273e3f8d31d429a2c GIT binary patch literal 3331 zcmd5;UvC@75uZC!lz5^oCb3(jHQaqMz_cPMDNa%lO^_mPkraVo&`N`_NX|#zl05qU z(7St*SxZmqH^@s0^b_=3^r;`D=qKoNf&ONWRA{&b`WS+@w>vjGyF2rn-)!w)w}Kac z`|z6yt$#k=AAejU`xkU#q7hn;VxLlvGM`31Wi=YrD67+`P9A@&QMyB;9nnL-L8FHB z>y++NwnwAAN^ghKCS?JQf@<8Lbf2;ojanG*QoKih@@RC64aQCBACPWS9MChL%y*;@ z=$gpOv7;J2>Fi^J<$aGRcrr1`(y5DiGMOtEJ=0bdxmJZySz)xACaG4-$jz;a@>m(Y zER16n<>opuD%MU@28=5e_c*M^qjI+O@B+>qEM#k@M)XM%NzqFMV40>!HVk z8ksgde%>bhzhpsOz`?y8x~h|Fka2YB(PEd}9xa;u8EC!s>B=Ku=(5hJe%t(+(XMi=24~x>J%-1Uhf9@OjG0m0?SfaZ_92q2fGwm*?9y#4Vk4%4Bq%ks}KU?t#>eljR_AWv zocrM2i}?|Lv%G)SUna|Ll3N$0Y4_xV_fJPd7RiH51B;mcntb|`G}-hKsoruW>05zr z$&m|-=})j1%VD6P>D}^L-YviB?RkOM^cvnz@oszj{)ErNj^cwz8vYX3<-7!AgQ&sJaE$qs5ROHI^5(jO#G4`Cyt=oxvQKe~V(|NI ziVtY9$MJ=gYtI)Aq#$Sj*$x``LK1!-Oz=C&eq?Bi6WIKn91Nf+yg@&X-^BA4o;$MQ zZA|vKIzR(d2kO9o(dLYYRqy$?^ksY(8T=!hwEPF3oipuIlmq|*=+82)4jf(;nOO;V zfKXWk&{(7#7Y3whWKb$zO;f0!57g)DOum_X2trp0QhTW<$u!aNy5wxu>hfAu?($A< ze&G63p!-lgeF~uV*!mxi2VXyZsuHV83p)%K9bp$dXCQfB?O}^e0 zX(Qh1mo3O2bim@XcdP+77dFpzy6UONU?fEBmzea) z+3@r3Bjqjew=aKRFDZKTF&ls~Jm2X9y~Ym^Ghmk%)+B*1E`qBK>7?{4EeCG4GvrxICjA;vQgTs4-wpX5e41@&1@4#__SEI1ZsBX&@6g zj%RSR@avFO#McrA@#VOjPPG}by&-e1V{VZ(*pLvLY^1{Sjl*-a*sw@A)l+q>W&-Ypr{&`z`N3=1gQf literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/codingstatemachine 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/codingstatemachine 2.py new file mode 100644 index 0000000..68fba44 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/codingstatemachine 2.py @@ -0,0 +1,88 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +import logging + +from .enums import MachineState + + +class CodingStateMachine(object): + """ + A state machine to verify a byte sequence for a particular encoding. For + each byte the detector receives, it will feed that byte to every active + state machine available, one byte at a time. The state machine changes its + state based on its previous state and the byte it receives. There are 3 + states in a state machine that are of interest to an auto-detector: + + START state: This is the state to start with, or a legal byte sequence + (i.e. a valid code point) for character has been identified. + + ME state: This indicates that the state machine identified a byte sequence + that is specific to the charset it is designed for and that + there is no other possible encoding which can contain this byte + sequence. This will to lead to an immediate positive answer for + the detector. + + ERROR state: This indicates the state machine identified an illegal byte + sequence for that encoding. This will lead to an immediate + negative answer for this encoding. Detector will exclude this + encoding from consideration from here on. + """ + def __init__(self, sm): + self._model = sm + self._curr_byte_pos = 0 + self._curr_char_len = 0 + self._curr_state = None + self.logger = logging.getLogger(__name__) + self.reset() + + def reset(self): + self._curr_state = MachineState.START + + def next_state(self, c): + # for each byte we get its class + # if it is first byte, we also get byte length + byte_class = self._model['class_table'][c] + if self._curr_state == MachineState.START: + self._curr_byte_pos = 0 + self._curr_char_len = self._model['char_len_table'][byte_class] + # from byte's class and state_table, we get its next state + curr_state = (self._curr_state * self._model['class_factor'] + + byte_class) + self._curr_state = self._model['state_table'][curr_state] + self._curr_byte_pos += 1 + return self._curr_state + + def get_current_charlen(self): + return self._curr_char_len + + def get_coding_state_machine(self): + return self._model['name'] + + @property + def language(self): + return self._model['language'] diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/codingstatemachine 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/codingstatemachine 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b4448116f44af60744462ab8d24cf83aade572f6 GIT binary patch literal 3736 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 B*|q=x literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/compat 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/compat 2.py new file mode 100644 index 0000000..ddd7468 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/compat 2.py @@ -0,0 +1,34 @@ +######################## BEGIN LICENSE BLOCK ######################## +# Contributor(s): +# Dan Blanchard +# Ian Cordasco +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +import sys + + +if sys.version_info < (3, 0): + PY2 = True + PY3 = False + base_str = (str, unicode) + text_type = unicode +else: + PY2 = False + PY3 = True + base_str = (bytes, str) + text_type = str diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/compat 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/compat 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ba76e205fa0e7a9ed90af5fe31b4fcd02a87f434 GIT binary patch literal 451 zcmYLDO;5r=5S>!K#h7^T=(!hM5ECzGG*OR+L_F97O=+jFShjU{sMcTS)!*X}(Ak1v zw)64cyv~gKbJ+dGnexXyP0u_`Ewuz@Bt8DN8HUV3Z zFw?e$-vM=6wOGI;3%XXb6Ev-W$3A%tULk+k9;IC?*}<#XY7Y+>l7*%;)Z<*BHZoIz zR7pm4CZ>9Wm16R8PIlx&n3{iPwEdSfwYalUGRk74HrMmeU|_h>VL8h}l}7R1c7 zZQ*r5T~{p@Fv)_h)f@#)E8wxO{RXd)zie}9*GhKi*KBoyXAH?gQyS`VE>IhpDqpHN zr8*M}onxhVejAe=`4lAPpP3x~B~2~v(cAMtOn{SG?U^a_G4iPLp5H>C_JS E5BMr$)Bpeg literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/cp949prober 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/cp949prober 2.py new file mode 100644 index 0000000..efd793a --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/cp949prober 2.py @@ -0,0 +1,49 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .chardistribution import EUCKRDistributionAnalysis +from .codingstatemachine import CodingStateMachine +from .mbcharsetprober import MultiByteCharSetProber +from .mbcssm import CP949_SM_MODEL + + +class CP949Prober(MultiByteCharSetProber): + def __init__(self): + super(CP949Prober, self).__init__() + self.coding_sm = CodingStateMachine(CP949_SM_MODEL) + # NOTE: CP949 is a superset of EUC-KR, so the distribution should be + # not different. + self.distribution_analyzer = EUCKRDistributionAnalysis() + self.reset() + + @property + def charset_name(self): + return "CP949" + + @property + def language(self): + return "Korean" diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/cp949prober 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/cp949prober 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3f5ab64180feb9d8e5c41092fb86d9680af885cf GIT binary patch literal 1600 zcmd5+O>fgc5FOibl9oa%5J*Uz;9?0Cw`!%TQbDvyP9>$X=>Z>DIq@dl$X|FTL8-XG z597-3;SVsgo0i@kjv_Ogw!iU7SaSQS`6dg!96#F23m^hHN;U~ZkfX_)6vJS*SmzGx!xqux$ zCpWn0oko47u~DNrs;WFL(|oCwwo@L{lwOsoavEcba+r=URVi)m8Rdra9M#DZW$!X= zVu|NXHIj|ZKjL@K5BCp6JQTx^{lN!(a6M$_-4Ni?_z9T~$w^?`1e;EuxF9{|gOLy) zEfc!ep$}0UFnePL#Ku97OdpX$x*hmVuevaEnFqrwMl^C&-e*w4CV673xu z3}?X_FXQuq^IA4hi$kVS2vsT+BH~RW-W7T3*l;Cu5m5m6lw5X;T#+)nSF$lnHd0Hp zT=BYE=97S5Gfp@36xNMe5bxn4ZNf>FXR^`Zv<|bcv+33TWOrw@ySH2}aE6End*3d1 z=$e+{r?6J_wkkEIdA@zzAL#Q79x^5tvdpR`9Ft<1#Bf}bM77cFO}&iTwCyW0%_zZn z;%s^w&JDecw#QjMFv$`JEZv!bW3;va3@PiBxpO?YL8oA-M71c>LcXS0^P$20FDmBZ zv}$Bp-aA;VPM((2c{-KcG%H8}A9+=vj8+I_8H6aRY@SnS^fePma;j)tM$Aye&H7I) z^K@4g$ffm?Of#0Yv)0{gt@?0_229!BYAM@j{GGDBM>UVKu-_@uoVZE3VzjCOTj&uN h0QJ5}XzEsOVAI_9g99Vbk=5+o3p$(W#x2MEyuV(=db|Jt literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/cp949prober.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/cp949prober.py new file mode 100644 index 0000000..efd793a --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/cp949prober.py @@ -0,0 +1,49 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .chardistribution import EUCKRDistributionAnalysis +from .codingstatemachine import CodingStateMachine +from .mbcharsetprober import MultiByteCharSetProber +from .mbcssm import CP949_SM_MODEL + + +class CP949Prober(MultiByteCharSetProber): + def __init__(self): + super(CP949Prober, self).__init__() + self.coding_sm = CodingStateMachine(CP949_SM_MODEL) + # NOTE: CP949 is a superset of EUC-KR, so the distribution should be + # not different. + self.distribution_analyzer = EUCKRDistributionAnalysis() + self.reset() + + @property + def charset_name(self): + return "CP949" + + @property + def language(self): + return "Korean" diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/cp949prober.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/cp949prober.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9d83fe1a7e0090aa7930b6d2afd1da37f15b861d GIT binary patch literal 1600 zcmd5+O>fgc5S_K-BrSzhAdrwa!Nn3PZfQkTsUT?DQ%R|8IN$>-C*C9*`3vtPkcu1p zF@6(&fSGk#dgItSo{48?y}R$d8M}Y(u7Cgi`pXDbmrMU|$xKWxrCUG-kPC@{%?DK2ZnVO!0s@4nQJy;}lFfOxH)h3u!LHczzx!4=;Y!7#Km&*mt5OII^+jN_* zNfCSuDqU^q!eEkRTQB!toy8#!S(6J@q-7n9NU>C5FsewR%Ifx_T83@f_8FOBlpr36 zp1UEg=w-Bh&hmjtmdI!6&MX|ObpybXvQC*B$AcSm3WiEl%Oc6ubBYZg8l3;4VlGb0 zS|!D;gT?A(Nimrx6U9xlg5>j&R|U#wr9_rN%DhbH8HH9~JAovpipFKg429gR|HQIS zH&uaLT2ILgV`+=EZm+fK!%Z5nWqYlqnnvUARMUG@^QiLXJ7t>_dz8zEs~TtuJ>&wQ g-nR)u-O3GYoBMWfU80tre zgs}l+g^3CqRammceqii-#!d%YEUA{-?X|Ybl3J;)ueIAOxmId-*4i3Nu9w=zT3cty zjZ%Aat-Z#QTg-31L3R}o4J%D~KH_>JxSh?X3bRP_s1SUvM1ob3&&QK|uFaNs5*3Ni zd=|w|qOsU*H1?vop5(F%IPZL<$8qZqE)AR9npN#I`JG=j2vAEFZTI0PU9tK$<=nGs%yEXj-3Dt9f4liHmvJi4FUQY7ltdWHUIf<`aO#&hI%U#40V>l9Hm zOo|?3^70fV+iU;?*4O}utFyrl6F~VkYYzZb{H?LJsAJWjWK#UpImA_y30xWb_{bQj z_%mUW7|mwsg6o_|=A_~9q)c{qmFwYfmE(1KB|%A22;^HNK7?rAfbeLGM?QO12>lL3 z=aJ*uz8(6`(Q(h&ckHfy_c?XoSzRY^`mWV8fO%{kTeM#jgbw?jZMg<4Zr=?%j}JAS zYxR0Yw>sMB@NEMOGkf*uprpKwp~&z0_7WYXY*h43sE>>MOlIT%T*wDF>#Dh57xE03 ziz^lHwErXs|Lf*He?(HPpH!GP=W1Tb!y5wY_pyGbBD1I)r)Q#_G?>S8|wDn?w$m zA-e;eYadvF^R;dG;>7Jahj#DO0CzQ|O~-v7{Eto4K;kq~YAWzNO1uxS-uP{1uiSa> zeHigEh9VLv8$Kv~OB2y|N+flb*<7sAP02HT|07JUg6?JCFG2ki{@2Svy?Lf>a>Cb5 z9`7uXD&V^?rwoTaK%R>BLJP842~B-S6vH9Mt8!Bj1V)|XjY{aZvV{g|j(IASdE{oi z({}@}-{W{Y#(AbB9$R?vM%bZIPphK&3&zVoN&G?LcM`urG%4MeaYEQZBeD1KO6Zzb zVh^*hjmCdypyHn%wfj9od|l@N{f4^i%8u6#4-Q)_j3qqkWv{PS+@-Tb7{-hI>>Lkg p4@>5e10J<1kBHMi%;T87Zf{JPezAO_e?^UE1^V09Z@-BF`8S-4P`LmA literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/enums.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/enums.py new file mode 100644 index 0000000..0451207 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/enums.py @@ -0,0 +1,76 @@ +""" +All of the Enums that are used throughout the chardet package. + +:author: Dan Blanchard (dan.blanchard@gmail.com) +""" + + +class InputState(object): + """ + This enum represents the different states a universal detector can be in. + """ + PURE_ASCII = 0 + ESC_ASCII = 1 + HIGH_BYTE = 2 + + +class LanguageFilter(object): + """ + This enum represents the different language filters we can apply to a + ``UniversalDetector``. + """ + CHINESE_SIMPLIFIED = 0x01 + CHINESE_TRADITIONAL = 0x02 + JAPANESE = 0x04 + KOREAN = 0x08 + NON_CJK = 0x10 + ALL = 0x1F + CHINESE = CHINESE_SIMPLIFIED | CHINESE_TRADITIONAL + CJK = CHINESE | JAPANESE | KOREAN + + +class ProbingState(object): + """ + This enum represents the different states a prober can be in. + """ + DETECTING = 0 + FOUND_IT = 1 + NOT_ME = 2 + + +class MachineState(object): + """ + This enum represents the different states a state machine can be in. + """ + START = 0 + ERROR = 1 + ITS_ME = 2 + + +class SequenceLikelihood(object): + """ + This enum represents the likelihood of a character following the previous one. + """ + NEGATIVE = 0 + UNLIKELY = 1 + LIKELY = 2 + POSITIVE = 3 + + @classmethod + def get_num_categories(cls): + """:returns: The number of likelihood categories in the enum.""" + return 4 + + +class CharacterCategory(object): + """ + This enum represents the different categories language models for + ``SingleByteCharsetProber`` put characters into. + + Anything less than CONTROL is considered a letter. + """ + UNDEFINED = 255 + LINE_BREAK = 254 + SYMBOL = 253 + DIGIT = 252 + CONTROL = 251 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/enums.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/enums.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e427acaeef3b7d92ab27868c9f2652161724298e GIT binary patch literal 3505 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 literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/escprober.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/escprober.py new file mode 100644 index 0000000..c70493f --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/escprober.py @@ -0,0 +1,101 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetprober import CharSetProber +from .codingstatemachine import CodingStateMachine +from .enums import LanguageFilter, ProbingState, MachineState +from .escsm import (HZ_SM_MODEL, ISO2022CN_SM_MODEL, ISO2022JP_SM_MODEL, + ISO2022KR_SM_MODEL) + + +class EscCharSetProber(CharSetProber): + """ + This CharSetProber uses a "code scheme" approach for detecting encodings, + whereby easily recognizable escape or shift sequences are relied on to + identify these encodings. + """ + + def __init__(self, lang_filter=None): + super(EscCharSetProber, self).__init__(lang_filter=lang_filter) + self.coding_sm = [] + if self.lang_filter & LanguageFilter.CHINESE_SIMPLIFIED: + self.coding_sm.append(CodingStateMachine(HZ_SM_MODEL)) + self.coding_sm.append(CodingStateMachine(ISO2022CN_SM_MODEL)) + if self.lang_filter & LanguageFilter.JAPANESE: + self.coding_sm.append(CodingStateMachine(ISO2022JP_SM_MODEL)) + if self.lang_filter & LanguageFilter.KOREAN: + self.coding_sm.append(CodingStateMachine(ISO2022KR_SM_MODEL)) + self.active_sm_count = None + self._detected_charset = None + self._detected_language = None + self._state = None + self.reset() + + def reset(self): + super(EscCharSetProber, self).reset() + for coding_sm in self.coding_sm: + if not coding_sm: + continue + coding_sm.active = True + coding_sm.reset() + self.active_sm_count = len(self.coding_sm) + self._detected_charset = None + self._detected_language = None + + @property + def charset_name(self): + return self._detected_charset + + @property + def language(self): + return self._detected_language + + def get_confidence(self): + if self._detected_charset: + return 0.99 + else: + return 0.00 + + def feed(self, byte_str): + for c in byte_str: + for coding_sm in self.coding_sm: + if not coding_sm or not coding_sm.active: + continue + coding_state = coding_sm.next_state(c) + if coding_state == MachineState.ERROR: + coding_sm.active = False + self.active_sm_count -= 1 + if self.active_sm_count <= 0: + self._state = ProbingState.NOT_ME + return self.state + elif coding_state == MachineState.ITS_ME: + self._state = ProbingState.FOUND_IT + self._detected_charset = coding_sm.get_coding_state_machine() + self._detected_language = coding_sm.language + return self.state + + return self.state diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/escprober.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/escprober.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c92924ac16d48a550c0b5b953bdf616c62168021 GIT binary patch literal 3607 zcmd5<&2Jl35TCUjJ9eCpe$W7F(JBbZLbOiPiXy~EOX5(sjT5bdDlC=N#`|oqySsMw zJ*RQioZ1r?{*zu1Hx6(_;=-8|2hJS$2l&mb-8863+|qU4?0d8GK4#|kW+vIc=Szn_ zfBH?ECQlacn`rtF#K)gSAyH&e%OZ=%845ELWvP`-$5{$<6wOd;hN3*R@)Q-QRYcV&W)J)z?lz5Q)Rx!o1+l8I3T6T1o)>pVURP}fp;3t`gT>RQ^1_%* zk_9R`o;e3{yX7{w+^y}6+C9U&)SKIDt7~iPjaRbo?7WhF*Ewb{VUe0{pHSk3%`^D; z1)6SxC}LB?(ya{J0``9f4)1xs#ex|A@s) zHlE#HpzRYUu}4~I+p|~N17F#?-BXcTvAy9i8NjA?XOP&wGOBH0I$On%LPvift3B$e zMD2}j<>??C+lguqx^eK>+Y6PgblV#$8`E_!=onk8{Sl_~UWtNe7%1N!#I_m8Qh~2x z6LiM5=_!rb(~Yjk*EXAp8~b-1P5%jE@MqBzz$Zg}SPXp&P_nEpG1tv9?dQnMP(M#M z6Hmrj>KDk&k}1+thy&Uz^@3ZPa${L!GJOuyzdbp<{7S)j2!4N3aN#9E_?Az$#7^eU znQ727BTAj+ z>c}Z!Gj+7My*+MoAs@od-ctFZNud84Nh0F@9?#Acxi{3vg(~%JGXd-Q(z9W z?`}J_TMdV|G&zvQAXa7(9S=x3P}tLL4@R*uXTWn)1S#Kb<0flmSw-?4ecI5lt#slZ5CYdevbP9AHlMz)Px~LFlVQSG&Wizu)gZzTUaIx_9;3 zczj^`#+Vz|9`#o7bmQu7br=jU2Ql^w!^>+oK5VocW=V4oV2VLf|6js(cMO8b`x z^3WZ)c4wFZ<}8j6_hGCQxPUN23GpJu6z+f8DRHMM@v>3j(B=qXWH`%AIJSyqcau?S z{M36Uiw~iSopUV3LC`tRgh40naNgu0Pd{x}upS?yX+9-c=iq`oeno4+Iy-d$JAvCe znq~yE-Ht6IcxU~@Qli=^YbDufa#h^ei&TwI&N!lsKd2K zXbzkNROT|0&^X3&6I}j|&f#x-$2T7QLPr@o{Apr`jR!x_5pr3U%6ge!eT&M;b=qI% z=)mI)JwaTs=m?Pl=?XWtRWUXZpDo=&5$2^B3jywx;h(+lyy)^&+eu3_@FR`3dW(}$90%%GV&I=Mj zoVU?4oSQ&kkU+oasyd4jhmbVrU{la z)@k1`Hd#k0p9@L70z%e2qTv}t!$tgxLd#YO?{eBQX;zrj4IF1sH?SjIHyZe(kcS*D zUDqG9T{lexthQtinTDK*^23asi_8}Dy~91uj>iU(-sz-jPIm92X}*&AnS7?aRGeGP zE#`{(MumCu55^?crWxJ=H?5N<#V&hy3KIr^z){7cNJ~lOFdUB&i%J0nm*9tiC?%8B dNm8V}4n`5reUiHPGj^Pw1z7@EE?O(Oe*iH%B_#j= literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/escsm 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/escsm 2.py new file mode 100644 index 0000000..0069523 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/escsm 2.py @@ -0,0 +1,246 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .enums import MachineState + +HZ_CLS = ( +1,0,0,0,0,0,0,0, # 00 - 07 +0,0,0,0,0,0,0,0, # 08 - 0f +0,0,0,0,0,0,0,0, # 10 - 17 +0,0,0,1,0,0,0,0, # 18 - 1f +0,0,0,0,0,0,0,0, # 20 - 27 +0,0,0,0,0,0,0,0, # 28 - 2f +0,0,0,0,0,0,0,0, # 30 - 37 +0,0,0,0,0,0,0,0, # 38 - 3f +0,0,0,0,0,0,0,0, # 40 - 47 +0,0,0,0,0,0,0,0, # 48 - 4f +0,0,0,0,0,0,0,0, # 50 - 57 +0,0,0,0,0,0,0,0, # 58 - 5f +0,0,0,0,0,0,0,0, # 60 - 67 +0,0,0,0,0,0,0,0, # 68 - 6f +0,0,0,0,0,0,0,0, # 70 - 77 +0,0,0,4,0,5,2,0, # 78 - 7f +1,1,1,1,1,1,1,1, # 80 - 87 +1,1,1,1,1,1,1,1, # 88 - 8f +1,1,1,1,1,1,1,1, # 90 - 97 +1,1,1,1,1,1,1,1, # 98 - 9f +1,1,1,1,1,1,1,1, # a0 - a7 +1,1,1,1,1,1,1,1, # a8 - af +1,1,1,1,1,1,1,1, # b0 - b7 +1,1,1,1,1,1,1,1, # b8 - bf +1,1,1,1,1,1,1,1, # c0 - c7 +1,1,1,1,1,1,1,1, # c8 - cf +1,1,1,1,1,1,1,1, # d0 - d7 +1,1,1,1,1,1,1,1, # d8 - df +1,1,1,1,1,1,1,1, # e0 - e7 +1,1,1,1,1,1,1,1, # e8 - ef +1,1,1,1,1,1,1,1, # f0 - f7 +1,1,1,1,1,1,1,1, # f8 - ff +) + +HZ_ST = ( +MachineState.START,MachineState.ERROR, 3,MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,# 00-07 +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,# 08-0f +MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START, 4,MachineState.ERROR,# 10-17 + 5,MachineState.ERROR, 6,MachineState.ERROR, 5, 5, 4,MachineState.ERROR,# 18-1f + 4,MachineState.ERROR, 4, 4, 4,MachineState.ERROR, 4,MachineState.ERROR,# 20-27 + 4,MachineState.ITS_ME,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,# 28-2f +) + +HZ_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0) + +HZ_SM_MODEL = {'class_table': HZ_CLS, + 'class_factor': 6, + 'state_table': HZ_ST, + 'char_len_table': HZ_CHAR_LEN_TABLE, + 'name': "HZ-GB-2312", + 'language': 'Chinese'} + +ISO2022CN_CLS = ( +2,0,0,0,0,0,0,0, # 00 - 07 +0,0,0,0,0,0,0,0, # 08 - 0f +0,0,0,0,0,0,0,0, # 10 - 17 +0,0,0,1,0,0,0,0, # 18 - 1f +0,0,0,0,0,0,0,0, # 20 - 27 +0,3,0,0,0,0,0,0, # 28 - 2f +0,0,0,0,0,0,0,0, # 30 - 37 +0,0,0,0,0,0,0,0, # 38 - 3f +0,0,0,4,0,0,0,0, # 40 - 47 +0,0,0,0,0,0,0,0, # 48 - 4f +0,0,0,0,0,0,0,0, # 50 - 57 +0,0,0,0,0,0,0,0, # 58 - 5f +0,0,0,0,0,0,0,0, # 60 - 67 +0,0,0,0,0,0,0,0, # 68 - 6f +0,0,0,0,0,0,0,0, # 70 - 77 +0,0,0,0,0,0,0,0, # 78 - 7f +2,2,2,2,2,2,2,2, # 80 - 87 +2,2,2,2,2,2,2,2, # 88 - 8f +2,2,2,2,2,2,2,2, # 90 - 97 +2,2,2,2,2,2,2,2, # 98 - 9f +2,2,2,2,2,2,2,2, # a0 - a7 +2,2,2,2,2,2,2,2, # a8 - af +2,2,2,2,2,2,2,2, # b0 - b7 +2,2,2,2,2,2,2,2, # b8 - bf +2,2,2,2,2,2,2,2, # c0 - c7 +2,2,2,2,2,2,2,2, # c8 - cf +2,2,2,2,2,2,2,2, # d0 - d7 +2,2,2,2,2,2,2,2, # d8 - df +2,2,2,2,2,2,2,2, # e0 - e7 +2,2,2,2,2,2,2,2, # e8 - ef +2,2,2,2,2,2,2,2, # f0 - f7 +2,2,2,2,2,2,2,2, # f8 - ff +) + +ISO2022CN_ST = ( +MachineState.START, 3,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,# 00-07 +MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 08-0f +MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,# 10-17 +MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 4,MachineState.ERROR,# 18-1f +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 20-27 + 5, 6,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 28-2f +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 30-37 +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.START,# 38-3f +) + +ISO2022CN_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0, 0, 0, 0) + +ISO2022CN_SM_MODEL = {'class_table': ISO2022CN_CLS, + 'class_factor': 9, + 'state_table': ISO2022CN_ST, + 'char_len_table': ISO2022CN_CHAR_LEN_TABLE, + 'name': "ISO-2022-CN", + 'language': 'Chinese'} + +ISO2022JP_CLS = ( +2,0,0,0,0,0,0,0, # 00 - 07 +0,0,0,0,0,0,2,2, # 08 - 0f +0,0,0,0,0,0,0,0, # 10 - 17 +0,0,0,1,0,0,0,0, # 18 - 1f +0,0,0,0,7,0,0,0, # 20 - 27 +3,0,0,0,0,0,0,0, # 28 - 2f +0,0,0,0,0,0,0,0, # 30 - 37 +0,0,0,0,0,0,0,0, # 38 - 3f +6,0,4,0,8,0,0,0, # 40 - 47 +0,9,5,0,0,0,0,0, # 48 - 4f +0,0,0,0,0,0,0,0, # 50 - 57 +0,0,0,0,0,0,0,0, # 58 - 5f +0,0,0,0,0,0,0,0, # 60 - 67 +0,0,0,0,0,0,0,0, # 68 - 6f +0,0,0,0,0,0,0,0, # 70 - 77 +0,0,0,0,0,0,0,0, # 78 - 7f +2,2,2,2,2,2,2,2, # 80 - 87 +2,2,2,2,2,2,2,2, # 88 - 8f +2,2,2,2,2,2,2,2, # 90 - 97 +2,2,2,2,2,2,2,2, # 98 - 9f +2,2,2,2,2,2,2,2, # a0 - a7 +2,2,2,2,2,2,2,2, # a8 - af +2,2,2,2,2,2,2,2, # b0 - b7 +2,2,2,2,2,2,2,2, # b8 - bf +2,2,2,2,2,2,2,2, # c0 - c7 +2,2,2,2,2,2,2,2, # c8 - cf +2,2,2,2,2,2,2,2, # d0 - d7 +2,2,2,2,2,2,2,2, # d8 - df +2,2,2,2,2,2,2,2, # e0 - e7 +2,2,2,2,2,2,2,2, # e8 - ef +2,2,2,2,2,2,2,2, # f0 - f7 +2,2,2,2,2,2,2,2, # f8 - ff +) + +ISO2022JP_ST = ( +MachineState.START, 3,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,# 00-07 +MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 08-0f +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,# 10-17 +MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,# 18-1f +MachineState.ERROR, 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 4,MachineState.ERROR,MachineState.ERROR,# 20-27 +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 6,MachineState.ITS_ME,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,# 28-2f +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,# 30-37 +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 38-3f +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.START,MachineState.START,# 40-47 +) + +ISO2022JP_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0) + +ISO2022JP_SM_MODEL = {'class_table': ISO2022JP_CLS, + 'class_factor': 10, + 'state_table': ISO2022JP_ST, + 'char_len_table': ISO2022JP_CHAR_LEN_TABLE, + 'name': "ISO-2022-JP", + 'language': 'Japanese'} + +ISO2022KR_CLS = ( +2,0,0,0,0,0,0,0, # 00 - 07 +0,0,0,0,0,0,0,0, # 08 - 0f +0,0,0,0,0,0,0,0, # 10 - 17 +0,0,0,1,0,0,0,0, # 18 - 1f +0,0,0,0,3,0,0,0, # 20 - 27 +0,4,0,0,0,0,0,0, # 28 - 2f +0,0,0,0,0,0,0,0, # 30 - 37 +0,0,0,0,0,0,0,0, # 38 - 3f +0,0,0,5,0,0,0,0, # 40 - 47 +0,0,0,0,0,0,0,0, # 48 - 4f +0,0,0,0,0,0,0,0, # 50 - 57 +0,0,0,0,0,0,0,0, # 58 - 5f +0,0,0,0,0,0,0,0, # 60 - 67 +0,0,0,0,0,0,0,0, # 68 - 6f +0,0,0,0,0,0,0,0, # 70 - 77 +0,0,0,0,0,0,0,0, # 78 - 7f +2,2,2,2,2,2,2,2, # 80 - 87 +2,2,2,2,2,2,2,2, # 88 - 8f +2,2,2,2,2,2,2,2, # 90 - 97 +2,2,2,2,2,2,2,2, # 98 - 9f +2,2,2,2,2,2,2,2, # a0 - a7 +2,2,2,2,2,2,2,2, # a8 - af +2,2,2,2,2,2,2,2, # b0 - b7 +2,2,2,2,2,2,2,2, # b8 - bf +2,2,2,2,2,2,2,2, # c0 - c7 +2,2,2,2,2,2,2,2, # c8 - cf +2,2,2,2,2,2,2,2, # d0 - d7 +2,2,2,2,2,2,2,2, # d8 - df +2,2,2,2,2,2,2,2, # e0 - e7 +2,2,2,2,2,2,2,2, # e8 - ef +2,2,2,2,2,2,2,2, # f0 - f7 +2,2,2,2,2,2,2,2, # f8 - ff +) + +ISO2022KR_ST = ( +MachineState.START, 3,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,# 00-07 +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,# 08-0f +MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 4,MachineState.ERROR,MachineState.ERROR,# 10-17 +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 18-1f +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.START,MachineState.START,MachineState.START,MachineState.START,# 20-27 +) + +ISO2022KR_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0) + +ISO2022KR_SM_MODEL = {'class_table': ISO2022KR_CLS, + 'class_factor': 6, + 'state_table': ISO2022KR_ST, + 'char_len_table': ISO2022KR_CHAR_LEN_TABLE, + 'name': "ISO-2022-KR", + 'language': 'Korean'} + + diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/escsm 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/escsm 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..aa267f8eab277c0c41731549d23559f996163b18 GIT binary patch literal 8062 zcmeHM>r>i55Z{QRpwxG3-?g8Z&ZI%?*e`9z7gOtdfPTq`GLZ`yCj?4PJNB>Z*Zw{I z2fBMlOo9QQmFbAUaksno+r8b}y>Q0{gXef(Ai?@s|(#=bif2VnSCzy_!(pevxT zC!i02slZW8w1dFnfuSUNED{@RiADE^1h;z|MDXyLr-FH0HtgAhCgJ-`AkaZ#B%N%N zHhB2{0>hL_2J|?vr=Smmg$o}5HUdkineDdH`%3mh=%|&p=PK zeARNAG(M~%TD7;#Xg7A^c6V$iZW!&%W6`Q5NO+2rq$qeniJluZ%a`no?8|gQ2+oZ` zWf}A&u;-wUil`-I)Fx!qkV8=$l~J1vMGa&40`$~%qvq|siw*9+kWP{6P7hFr-h?% z%Lj@Wa>!BB(ov73qvoWe(3g*)kbaG)gN3IAq^aR!*z6ePL(4G>+~B5#W3UFP8KP!@ zniw^Bpa37mrfeIoTjIunZHnn~TrtYL-V_2Z0ks4k(1b&yS+Y$>lH4ScHgxs#s+wI~ z$a2!<7&Vg*V`q&FaZNsgecN!V$41q(5;$;4^OwS&n$2Xh>e{YF(iVwXgcoLS?hAlT zqhSzQn7Nhbw3MxS(=?pjG@u)VKjg}h13l|eM0%#Yrz^i7%0*g|& zN8GU^(o_(;7amzB#c9y{T)mw-DNePXF2=71JvHP1Q7-mhziB;|^&N4?jz}jkRl3*7 zHtubfO+Vb%OxP=xP4Rr)rl?mH(?6d4iYXrb+w2oV5hL+@6~(=mG=Jyxdv{zitdoBEy0Jmm1n3vWEAGVmox1(Cnty~St#;JoJeyvR`R9o z+-|A3vbvoUH@d{%Dedg7=eBtYrSKw_?qSzFEhS;+(%<{BfAUzpA4ZwT9JDEe9{nZChPg&$;_wi6lOy6VqY! zrbajD%;cKsmfhOh#;Lg8{!pv4W83`n43)bLJfJ3Gc$s~JSA0-aGK#9q<7+V%A4n?0 dtyl6^kO@1Zyur`XKS3vK((rHaRm2Y4{TE4^TVwzL literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/escsm.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/escsm.py new file mode 100644 index 0000000..0069523 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/escsm.py @@ -0,0 +1,246 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .enums import MachineState + +HZ_CLS = ( +1,0,0,0,0,0,0,0, # 00 - 07 +0,0,0,0,0,0,0,0, # 08 - 0f +0,0,0,0,0,0,0,0, # 10 - 17 +0,0,0,1,0,0,0,0, # 18 - 1f +0,0,0,0,0,0,0,0, # 20 - 27 +0,0,0,0,0,0,0,0, # 28 - 2f +0,0,0,0,0,0,0,0, # 30 - 37 +0,0,0,0,0,0,0,0, # 38 - 3f +0,0,0,0,0,0,0,0, # 40 - 47 +0,0,0,0,0,0,0,0, # 48 - 4f +0,0,0,0,0,0,0,0, # 50 - 57 +0,0,0,0,0,0,0,0, # 58 - 5f +0,0,0,0,0,0,0,0, # 60 - 67 +0,0,0,0,0,0,0,0, # 68 - 6f +0,0,0,0,0,0,0,0, # 70 - 77 +0,0,0,4,0,5,2,0, # 78 - 7f +1,1,1,1,1,1,1,1, # 80 - 87 +1,1,1,1,1,1,1,1, # 88 - 8f +1,1,1,1,1,1,1,1, # 90 - 97 +1,1,1,1,1,1,1,1, # 98 - 9f +1,1,1,1,1,1,1,1, # a0 - a7 +1,1,1,1,1,1,1,1, # a8 - af +1,1,1,1,1,1,1,1, # b0 - b7 +1,1,1,1,1,1,1,1, # b8 - bf +1,1,1,1,1,1,1,1, # c0 - c7 +1,1,1,1,1,1,1,1, # c8 - cf +1,1,1,1,1,1,1,1, # d0 - d7 +1,1,1,1,1,1,1,1, # d8 - df +1,1,1,1,1,1,1,1, # e0 - e7 +1,1,1,1,1,1,1,1, # e8 - ef +1,1,1,1,1,1,1,1, # f0 - f7 +1,1,1,1,1,1,1,1, # f8 - ff +) + +HZ_ST = ( +MachineState.START,MachineState.ERROR, 3,MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,# 00-07 +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,# 08-0f +MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START, 4,MachineState.ERROR,# 10-17 + 5,MachineState.ERROR, 6,MachineState.ERROR, 5, 5, 4,MachineState.ERROR,# 18-1f + 4,MachineState.ERROR, 4, 4, 4,MachineState.ERROR, 4,MachineState.ERROR,# 20-27 + 4,MachineState.ITS_ME,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,# 28-2f +) + +HZ_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0) + +HZ_SM_MODEL = {'class_table': HZ_CLS, + 'class_factor': 6, + 'state_table': HZ_ST, + 'char_len_table': HZ_CHAR_LEN_TABLE, + 'name': "HZ-GB-2312", + 'language': 'Chinese'} + +ISO2022CN_CLS = ( +2,0,0,0,0,0,0,0, # 00 - 07 +0,0,0,0,0,0,0,0, # 08 - 0f +0,0,0,0,0,0,0,0, # 10 - 17 +0,0,0,1,0,0,0,0, # 18 - 1f +0,0,0,0,0,0,0,0, # 20 - 27 +0,3,0,0,0,0,0,0, # 28 - 2f +0,0,0,0,0,0,0,0, # 30 - 37 +0,0,0,0,0,0,0,0, # 38 - 3f +0,0,0,4,0,0,0,0, # 40 - 47 +0,0,0,0,0,0,0,0, # 48 - 4f +0,0,0,0,0,0,0,0, # 50 - 57 +0,0,0,0,0,0,0,0, # 58 - 5f +0,0,0,0,0,0,0,0, # 60 - 67 +0,0,0,0,0,0,0,0, # 68 - 6f +0,0,0,0,0,0,0,0, # 70 - 77 +0,0,0,0,0,0,0,0, # 78 - 7f +2,2,2,2,2,2,2,2, # 80 - 87 +2,2,2,2,2,2,2,2, # 88 - 8f +2,2,2,2,2,2,2,2, # 90 - 97 +2,2,2,2,2,2,2,2, # 98 - 9f +2,2,2,2,2,2,2,2, # a0 - a7 +2,2,2,2,2,2,2,2, # a8 - af +2,2,2,2,2,2,2,2, # b0 - b7 +2,2,2,2,2,2,2,2, # b8 - bf +2,2,2,2,2,2,2,2, # c0 - c7 +2,2,2,2,2,2,2,2, # c8 - cf +2,2,2,2,2,2,2,2, # d0 - d7 +2,2,2,2,2,2,2,2, # d8 - df +2,2,2,2,2,2,2,2, # e0 - e7 +2,2,2,2,2,2,2,2, # e8 - ef +2,2,2,2,2,2,2,2, # f0 - f7 +2,2,2,2,2,2,2,2, # f8 - ff +) + +ISO2022CN_ST = ( +MachineState.START, 3,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,# 00-07 +MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 08-0f +MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,# 10-17 +MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 4,MachineState.ERROR,# 18-1f +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 20-27 + 5, 6,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 28-2f +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 30-37 +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.START,# 38-3f +) + +ISO2022CN_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0, 0, 0, 0) + +ISO2022CN_SM_MODEL = {'class_table': ISO2022CN_CLS, + 'class_factor': 9, + 'state_table': ISO2022CN_ST, + 'char_len_table': ISO2022CN_CHAR_LEN_TABLE, + 'name': "ISO-2022-CN", + 'language': 'Chinese'} + +ISO2022JP_CLS = ( +2,0,0,0,0,0,0,0, # 00 - 07 +0,0,0,0,0,0,2,2, # 08 - 0f +0,0,0,0,0,0,0,0, # 10 - 17 +0,0,0,1,0,0,0,0, # 18 - 1f +0,0,0,0,7,0,0,0, # 20 - 27 +3,0,0,0,0,0,0,0, # 28 - 2f +0,0,0,0,0,0,0,0, # 30 - 37 +0,0,0,0,0,0,0,0, # 38 - 3f +6,0,4,0,8,0,0,0, # 40 - 47 +0,9,5,0,0,0,0,0, # 48 - 4f +0,0,0,0,0,0,0,0, # 50 - 57 +0,0,0,0,0,0,0,0, # 58 - 5f +0,0,0,0,0,0,0,0, # 60 - 67 +0,0,0,0,0,0,0,0, # 68 - 6f +0,0,0,0,0,0,0,0, # 70 - 77 +0,0,0,0,0,0,0,0, # 78 - 7f +2,2,2,2,2,2,2,2, # 80 - 87 +2,2,2,2,2,2,2,2, # 88 - 8f +2,2,2,2,2,2,2,2, # 90 - 97 +2,2,2,2,2,2,2,2, # 98 - 9f +2,2,2,2,2,2,2,2, # a0 - a7 +2,2,2,2,2,2,2,2, # a8 - af +2,2,2,2,2,2,2,2, # b0 - b7 +2,2,2,2,2,2,2,2, # b8 - bf +2,2,2,2,2,2,2,2, # c0 - c7 +2,2,2,2,2,2,2,2, # c8 - cf +2,2,2,2,2,2,2,2, # d0 - d7 +2,2,2,2,2,2,2,2, # d8 - df +2,2,2,2,2,2,2,2, # e0 - e7 +2,2,2,2,2,2,2,2, # e8 - ef +2,2,2,2,2,2,2,2, # f0 - f7 +2,2,2,2,2,2,2,2, # f8 - ff +) + +ISO2022JP_ST = ( +MachineState.START, 3,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,# 00-07 +MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 08-0f +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,# 10-17 +MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,# 18-1f +MachineState.ERROR, 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 4,MachineState.ERROR,MachineState.ERROR,# 20-27 +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 6,MachineState.ITS_ME,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,# 28-2f +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,# 30-37 +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 38-3f +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.START,MachineState.START,# 40-47 +) + +ISO2022JP_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0) + +ISO2022JP_SM_MODEL = {'class_table': ISO2022JP_CLS, + 'class_factor': 10, + 'state_table': ISO2022JP_ST, + 'char_len_table': ISO2022JP_CHAR_LEN_TABLE, + 'name': "ISO-2022-JP", + 'language': 'Japanese'} + +ISO2022KR_CLS = ( +2,0,0,0,0,0,0,0, # 00 - 07 +0,0,0,0,0,0,0,0, # 08 - 0f +0,0,0,0,0,0,0,0, # 10 - 17 +0,0,0,1,0,0,0,0, # 18 - 1f +0,0,0,0,3,0,0,0, # 20 - 27 +0,4,0,0,0,0,0,0, # 28 - 2f +0,0,0,0,0,0,0,0, # 30 - 37 +0,0,0,0,0,0,0,0, # 38 - 3f +0,0,0,5,0,0,0,0, # 40 - 47 +0,0,0,0,0,0,0,0, # 48 - 4f +0,0,0,0,0,0,0,0, # 50 - 57 +0,0,0,0,0,0,0,0, # 58 - 5f +0,0,0,0,0,0,0,0, # 60 - 67 +0,0,0,0,0,0,0,0, # 68 - 6f +0,0,0,0,0,0,0,0, # 70 - 77 +0,0,0,0,0,0,0,0, # 78 - 7f +2,2,2,2,2,2,2,2, # 80 - 87 +2,2,2,2,2,2,2,2, # 88 - 8f +2,2,2,2,2,2,2,2, # 90 - 97 +2,2,2,2,2,2,2,2, # 98 - 9f +2,2,2,2,2,2,2,2, # a0 - a7 +2,2,2,2,2,2,2,2, # a8 - af +2,2,2,2,2,2,2,2, # b0 - b7 +2,2,2,2,2,2,2,2, # b8 - bf +2,2,2,2,2,2,2,2, # c0 - c7 +2,2,2,2,2,2,2,2, # c8 - cf +2,2,2,2,2,2,2,2, # d0 - d7 +2,2,2,2,2,2,2,2, # d8 - df +2,2,2,2,2,2,2,2, # e0 - e7 +2,2,2,2,2,2,2,2, # e8 - ef +2,2,2,2,2,2,2,2, # f0 - f7 +2,2,2,2,2,2,2,2, # f8 - ff +) + +ISO2022KR_ST = ( +MachineState.START, 3,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,# 00-07 +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,# 08-0f +MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 4,MachineState.ERROR,MachineState.ERROR,# 10-17 +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 18-1f +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.START,MachineState.START,MachineState.START,MachineState.START,# 20-27 +) + +ISO2022KR_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0) + +ISO2022KR_SM_MODEL = {'class_table': ISO2022KR_CLS, + 'class_factor': 6, + 'state_table': ISO2022KR_ST, + 'char_len_table': ISO2022KR_CHAR_LEN_TABLE, + 'name': "ISO-2022-KR", + 'language': 'Korean'} + + diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/escsm.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/escsm.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a1db42f51c406e7b20ee3b8204e79da6f869773d GIT binary patch literal 8062 zcmeHM>r>i55Z{PJ!BT7A5BvPYbS4dAhkj{0wU(*%fe!HLK9othfN?^gR z2-pNz8tf!wI|)1)8Y-gCBC*MySbYDQo`QmfoHTynXasRS`xG`e7pv%byfYA%ti7>C;#NhROB}*sP3lMn(CKiZXI2%CjoUcU6?{ zsocbk@Eq9O@uGZq35O}+B@gOHXB`;`<o&TR|@noY}2;lLx!Un`q>K9|qy%O#tnZ4$EyFUnrsk^rk_ z$0W2UbFD0BDQoSnWxAy-pc|w=)XI?qBkNH_My7nEE591bWm?Il2Dv4NGVtT3mxyCW zT(TpwR1k+39#tphX)yX+J)b%$PqmRQCa4D^HRJzLF8ANK={=T>9dXHy$fht=hS$kH z?s=BYAl#=+*b|ja`F!1{XjBz5IG%!vDIfj&?2|(oBl&z4$GwuYVCRf`ms~Q`59q7y z_ALEE?<7#GG9?!>E|y5sVNm1~q+;5a|c?_wT06=BA~u5R_iA|(n- zB2hC#up}L0?OM4X7Aa9!5*Y|f(mmKLt^tC^!~d~@(dpWIc=2uQnO&pNcDU8`jAqB+ zKX#hG-!v9--xn75_xHq(5aR9P&+Q!kHC>}>bnK39yLf5tIC}nVp~T8WlAqe1!0%K!iX literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/eucjpprober 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/eucjpprober 2.py new file mode 100644 index 0000000..20ce8f7 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/eucjpprober 2.py @@ -0,0 +1,92 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .enums import ProbingState, MachineState +from .mbcharsetprober import MultiByteCharSetProber +from .codingstatemachine import CodingStateMachine +from .chardistribution import EUCJPDistributionAnalysis +from .jpcntx import EUCJPContextAnalysis +from .mbcssm import EUCJP_SM_MODEL + + +class EUCJPProber(MultiByteCharSetProber): + def __init__(self): + super(EUCJPProber, self).__init__() + self.coding_sm = CodingStateMachine(EUCJP_SM_MODEL) + self.distribution_analyzer = EUCJPDistributionAnalysis() + self.context_analyzer = EUCJPContextAnalysis() + self.reset() + + def reset(self): + super(EUCJPProber, self).reset() + self.context_analyzer.reset() + + @property + def charset_name(self): + return "EUC-JP" + + @property + def language(self): + return "Japanese" + + def feed(self, byte_str): + for i in range(len(byte_str)): + # PY3K: byte_str is a byte array, so byte_str[i] is an int, not a byte + coding_state = self.coding_sm.next_state(byte_str[i]) + if coding_state == MachineState.ERROR: + self.logger.debug('%s %s prober hit error at byte %s', + self.charset_name, self.language, i) + self._state = ProbingState.NOT_ME + break + elif coding_state == MachineState.ITS_ME: + self._state = ProbingState.FOUND_IT + break + elif coding_state == MachineState.START: + char_len = self.coding_sm.get_current_charlen() + if i == 0: + self._last_char[1] = byte_str[0] + self.context_analyzer.feed(self._last_char, char_len) + self.distribution_analyzer.feed(self._last_char, char_len) + else: + self.context_analyzer.feed(byte_str[i - 1:i + 1], + char_len) + self.distribution_analyzer.feed(byte_str[i - 1:i + 1], + char_len) + + self._last_char[0] = byte_str[-1] + + if self.state == ProbingState.DETECTING: + if (self.context_analyzer.got_enough_data() and + (self.get_confidence() > self.SHORTCUT_THRESHOLD)): + self._state = ProbingState.FOUND_IT + + return self.state + + def get_confidence(self): + context_conf = self.context_analyzer.get_confidence() + distrib_conf = self.distribution_analyzer.get_confidence() + return max(context_conf, distrib_conf) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/eucjpprober 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/eucjpprober 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..00a68c8bd974e8c3d607e3d28c9c28eca246968d GIT binary patch literal 3422 zcmd5;-ESL35T84Lr%BT!P1;Z-646Q)5S*%&;GwN(Z9^M1A38fiwFIk+Z|$6WcXsa9 zA*osk2_E?i`o@34D}N6Xukf2$I}Hkm$JD;v+nt%)o$s04A9FLm|Mu|vE=_(pyuZT8 ze#8{uaVR2+9qKp~yVP;XVW>+{j^aFZ@^+u2s6cU%Iz_wBQ&gh3Or5gb7bvPwJVTus zyDw67h2mN2%wk_6ou{5dL79Fg`iba8XO4mjwW>2I4S%Lni(dr3J`AR(Ob)QPRp6TY^{u@|n3*&@ z7@KgIJWl-RGz&9Ja(zltA0|ehn15ogPO+-Bt+sa?&FALI6l9q=(>2TV1S8wRq={7w z-9iP>GW5=i9IFP}X1%}$1=;4N+ad*dAuCZ(kVToiR<(%Zx~vHvY|uJJ_7s!BmN72UPMl;*nXOIkatdn4v*1GVgK%1H#cL$@9c-7~lQ;+4lgORbzlC$K@ zJG1y-G{bG6|HTZf-`vzD=TyuRdaP5?t~bXk4g-vXY#PLqXE`cc9*xIw)Gu`_kjHDE{F?>uVeylgaTE>w|?*EA;zQ5&<`~)8Q-U-G| z6!}Si?DzHkb3(Cf9B^zCvDL4z#>pdR;-n7e20V@LK5^c-k_V7Ga`YM*!=+VV-e4n1 zWKf`&E~T*$6={I1Bxz+(76_6EQVt4+nW4cI2B}%vJ6f84JttrPLX5t85j`(xP$N>n z!8J}sZ}NO5@+05-C-a2$DpM>_kfR5@TBL#fXn|fM(V>7b^!f$p(L+I4auE(E+~nhP zbYuO(r~gF(dGLJ8tmMyFaV;y$BHM~^`*wQU4HhJ|+nc;*_Eza-o`L6earD+nEOr@z z#3tLx)-m77*6`R=w00PpHJzrzbj>$w2dIC*g&?wJH2e#{>Ic}`ObU0-INQeEtP6Zg~gK^)R2hdyK34;p=7~5^D?WQd4L9%?- zZZVV{@$23ForZeWmSbA&$6nhk0SsS-N#?<$b= z1Du5$&33ciezx`hHurpL$Jf zo;O6nl9PmCRwYD9Q9hwdn_O?mC z!<9lQ>#Hgr2IB}@X$qud3l$<1U6MIH7cgum(abvmWp!D8!yVjhmXa+}bSkAvejfkI z`c9PtN1|0H<2aL0x7mTCEIyc&Oq+!~t|<~%w&jyt65BpqdP3XWaVK@I|Fc~or;ov? no0t>Z2J#-qXXqMvDQ(dEp)E1$18eL@AA&d0+KO{+`p^9hc$owe literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/eucjpprober.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/eucjpprober.py new file mode 100644 index 0000000..20ce8f7 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/eucjpprober.py @@ -0,0 +1,92 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .enums import ProbingState, MachineState +from .mbcharsetprober import MultiByteCharSetProber +from .codingstatemachine import CodingStateMachine +from .chardistribution import EUCJPDistributionAnalysis +from .jpcntx import EUCJPContextAnalysis +from .mbcssm import EUCJP_SM_MODEL + + +class EUCJPProber(MultiByteCharSetProber): + def __init__(self): + super(EUCJPProber, self).__init__() + self.coding_sm = CodingStateMachine(EUCJP_SM_MODEL) + self.distribution_analyzer = EUCJPDistributionAnalysis() + self.context_analyzer = EUCJPContextAnalysis() + self.reset() + + def reset(self): + super(EUCJPProber, self).reset() + self.context_analyzer.reset() + + @property + def charset_name(self): + return "EUC-JP" + + @property + def language(self): + return "Japanese" + + def feed(self, byte_str): + for i in range(len(byte_str)): + # PY3K: byte_str is a byte array, so byte_str[i] is an int, not a byte + coding_state = self.coding_sm.next_state(byte_str[i]) + if coding_state == MachineState.ERROR: + self.logger.debug('%s %s prober hit error at byte %s', + self.charset_name, self.language, i) + self._state = ProbingState.NOT_ME + break + elif coding_state == MachineState.ITS_ME: + self._state = ProbingState.FOUND_IT + break + elif coding_state == MachineState.START: + char_len = self.coding_sm.get_current_charlen() + if i == 0: + self._last_char[1] = byte_str[0] + self.context_analyzer.feed(self._last_char, char_len) + self.distribution_analyzer.feed(self._last_char, char_len) + else: + self.context_analyzer.feed(byte_str[i - 1:i + 1], + char_len) + self.distribution_analyzer.feed(byte_str[i - 1:i + 1], + char_len) + + self._last_char[0] = byte_str[-1] + + if self.state == ProbingState.DETECTING: + if (self.context_analyzer.got_enough_data() and + (self.get_confidence() > self.SHORTCUT_THRESHOLD)): + self._state = ProbingState.FOUND_IT + + return self.state + + def get_confidence(self): + context_conf = self.context_analyzer.get_confidence() + distrib_conf = self.distribution_analyzer.get_confidence() + return max(context_conf, distrib_conf) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/eucjpprober.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/eucjpprober.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dccdd5c7c936c955199856556c8ffbdd61e5a533 GIT binary patch literal 3422 zcmd5;UvC>l5T85$Pm`uenzW%vq@tB9AULHJ<)N);9YY&6PIPvKY6(^s-`Y9%?(E#H zLsGR854$Ga>N`znQhupn!Nx?AyKFnYrEhKa=}oZszFshd*>_^2_1de@E zk)lf!&r)X=`x5Cq^&ASy^b66?L@zsY6jZ2HodFY}gQ@CbGP9U=)8Ss2^jpR^S^(RA zcRx(D0IE!DRxoXkBNIM3HoCs=r!8&xGo4!eBJlNLFg;~*fW@r>*LYFi+T9E@lZJa^ z6AqKdi60$jVP;9LPD$#+#ONdQPweF>R<*X(_RePGxw$k2Std?&%`!c~$hI(PViiNT zPyw_Iz4Ic+s)4pyFR(#Dwz=uHNI_o6N)!}iQ6{fdE#kN?Yk~(Gw2qNI#bod}^ah8y zG;mqfj>(b9^WlK10+}L1d0iq?o~|nl8O+EBV6i2NXjWM;Q{cnLBb|CB-j*>b6(*rk z%HzvDX2(=8bw%eYi@iL9mN5mVw5)tq^J^T$N17}0g=qK$BbTK*)5e;D&&hPutKv;E zWhqv*Q5qh?KWc}5TI&s?K&M%)KdJ=>gZ}G#y*nFwckUh^ADV$N=KkFu_c!qCC$)BM z6pq%zBr|>#t$%U<%Vx)8kPLOGlVF(Ey6~q!o0=YX2cwaA)#syQkLA0Kk+I8?v*gS> zv-qDi!!4ly#SE<9+|(wgRLl~3tW(jhH^(au1CifjXFGq{nW@h(GG>-#KarXpP@Io3 zaOsxBaWi9=K$NX-?ON`c?qUcdDTQqeA5)1R>kY7$aio&_e`1O6Z}}rXfrnl=!Pto+ zKk1MCzP@)#D3*-_j%^~g`VH1NdgM%;)ZyHKXY>0{oVTvz0pyMxy+OusX%(2a*hmr? z6zG*pX)HuV8Xzl4S{alDf+T{JgMwjZXmE)^YL<2nmZo3N$=AOUqc5LD&kGvVh!k*e zg_F_SJfDgD$oKxqJYl`c6blsO=mD=5X<$EEpf^Z#C}0e|dIoy%P!N_}gu@Bf`S=`N zyLsl*|Du3Ac)nv+@+YjgmX&3ZZAG|!H@)o|3zFLHbzU=jtMn?*z|*=oc;_S*yNp0$ zlQpxOm~Urmcx)Ps!36}2?X=Z)Lzea+Sw3sG z7|M?L&CZMFrh3+vV_NOUUfV1I3~p3+oTfU#8$k%Rgd-LCnT1I5L%|~IX&rd)E0FX9 zoP{?V?MA)*tof~B#`;5}bTSaIvVT0%w2 z%Zg{NPz%lqus58NbHlmpF1U+;E<1}h)v;snsAFWGVq(w4gM5I{v!RVhv|E?pNH!@T z#-<&DlrOGV-p4$Nx%kM~KdSQEDwqknwwY3R_e8yu)<6K~uTf_IC5DtP675yl+a~=E zR|=)9uc~+$j3aENDUgyaRESV?N#^)ez_6V}Gw%hI)p_|1cW}2@O14PRsgx@DdHgFk zn^g`RiB_GA<4i)`W(SV4cyCfNZ5Hylrbt}bmQQj?Z2NTS32k%7oz$uR&vu2JJ_e(1 mVvcMZ$a@^0p=;!&v_Tg`TVm7)*4U3e1aG3X73a$IpZgo-Z~=M% literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/euckrfreq 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/euckrfreq 2.py new file mode 100644 index 0000000..b68078c --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/euckrfreq 2.py @@ -0,0 +1,195 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# Sampling from about 20M text materials include literature and computer technology + +# 128 --> 0.79 +# 256 --> 0.92 +# 512 --> 0.986 +# 1024 --> 0.99944 +# 2048 --> 0.99999 +# +# Idea Distribution Ratio = 0.98653 / (1-0.98653) = 73.24 +# Random Distribution Ration = 512 / (2350-512) = 0.279. +# +# Typical Distribution Ratio + +EUCKR_TYPICAL_DISTRIBUTION_RATIO = 6.0 + +EUCKR_TABLE_SIZE = 2352 + +# Char to FreqOrder table , +EUCKR_CHAR_TO_FREQ_ORDER = ( + 13, 130, 120,1396, 481,1719,1720, 328, 609, 212,1721, 707, 400, 299,1722, 87, +1397,1723, 104, 536,1117,1203,1724,1267, 685,1268, 508,1725,1726,1727,1728,1398, +1399,1729,1730,1731, 141, 621, 326,1057, 368,1732, 267, 488, 20,1733,1269,1734, + 945,1400,1735, 47, 904,1270,1736,1737, 773, 248,1738, 409, 313, 786, 429,1739, + 116, 987, 813,1401, 683, 75,1204, 145,1740,1741,1742,1743, 16, 847, 667, 622, + 708,1744,1745,1746, 966, 787, 304, 129,1747, 60, 820, 123, 676,1748,1749,1750, +1751, 617,1752, 626,1753,1754,1755,1756, 653,1757,1758,1759,1760,1761,1762, 856, + 344,1763,1764,1765,1766, 89, 401, 418, 806, 905, 848,1767,1768,1769, 946,1205, + 709,1770,1118,1771, 241,1772,1773,1774,1271,1775, 569,1776, 999,1777,1778,1779, +1780, 337, 751,1058, 28, 628, 254,1781, 177, 906, 270, 349, 891,1079,1782, 19, +1783, 379,1784, 315,1785, 629, 754,1402, 559,1786, 636, 203,1206,1787, 710, 567, +1788, 935, 814,1789,1790,1207, 766, 528,1791,1792,1208,1793,1794,1795,1796,1797, +1403,1798,1799, 533,1059,1404,1405,1156,1406, 936, 884,1080,1800, 351,1801,1802, +1803,1804,1805, 801,1806,1807,1808,1119,1809,1157, 714, 474,1407,1810, 298, 899, + 885,1811,1120, 802,1158,1812, 892,1813,1814,1408, 659,1815,1816,1121,1817,1818, +1819,1820,1821,1822, 319,1823, 594, 545,1824, 815, 937,1209,1825,1826, 573,1409, +1022,1827,1210,1828,1829,1830,1831,1832,1833, 556, 722, 807,1122,1060,1834, 697, +1835, 900, 557, 715,1836,1410, 540,1411, 752,1159, 294, 597,1211, 976, 803, 770, +1412,1837,1838, 39, 794,1413, 358,1839, 371, 925,1840, 453, 661, 788, 531, 723, + 544,1023,1081, 869, 91,1841, 392, 430, 790, 602,1414, 677,1082, 457,1415,1416, +1842,1843, 475, 327,1024,1417, 795, 121,1844, 733, 403,1418,1845,1846,1847, 300, + 119, 711,1212, 627,1848,1272, 207,1849,1850, 796,1213, 382,1851, 519,1852,1083, + 893,1853,1854,1855, 367, 809, 487, 671,1856, 663,1857,1858, 956, 471, 306, 857, +1859,1860,1160,1084,1861,1862,1863,1864,1865,1061,1866,1867,1868,1869,1870,1871, + 282, 96, 574,1872, 502,1085,1873,1214,1874, 907,1875,1876, 827, 977,1419,1420, +1421, 268,1877,1422,1878,1879,1880, 308,1881, 2, 537,1882,1883,1215,1884,1885, + 127, 791,1886,1273,1423,1887, 34, 336, 404, 643,1888, 571, 654, 894, 840,1889, + 0, 886,1274, 122, 575, 260, 908, 938,1890,1275, 410, 316,1891,1892, 100,1893, +1894,1123, 48,1161,1124,1025,1895, 633, 901,1276,1896,1897, 115, 816,1898, 317, +1899, 694,1900, 909, 734,1424, 572, 866,1425, 691, 85, 524,1010, 543, 394, 841, +1901,1902,1903,1026,1904,1905,1906,1907,1908,1909, 30, 451, 651, 988, 310,1910, +1911,1426, 810,1216, 93,1912,1913,1277,1217,1914, 858, 759, 45, 58, 181, 610, + 269,1915,1916, 131,1062, 551, 443,1000, 821,1427, 957, 895,1086,1917,1918, 375, +1919, 359,1920, 687,1921, 822,1922, 293,1923,1924, 40, 662, 118, 692, 29, 939, + 887, 640, 482, 174,1925, 69,1162, 728,1428, 910,1926,1278,1218,1279, 386, 870, + 217, 854,1163, 823,1927,1928,1929,1930, 834,1931, 78,1932, 859,1933,1063,1934, +1935,1936,1937, 438,1164, 208, 595,1938,1939,1940,1941,1219,1125,1942, 280, 888, +1429,1430,1220,1431,1943,1944,1945,1946,1947,1280, 150, 510,1432,1948,1949,1950, +1951,1952,1953,1954,1011,1087,1955,1433,1043,1956, 881,1957, 614, 958,1064,1065, +1221,1958, 638,1001, 860, 967, 896,1434, 989, 492, 553,1281,1165,1959,1282,1002, +1283,1222,1960,1961,1962,1963, 36, 383, 228, 753, 247, 454,1964, 876, 678,1965, +1966,1284, 126, 464, 490, 835, 136, 672, 529, 940,1088,1435, 473,1967,1968, 467, + 50, 390, 227, 587, 279, 378, 598, 792, 968, 240, 151, 160, 849, 882,1126,1285, + 639,1044, 133, 140, 288, 360, 811, 563,1027, 561, 142, 523,1969,1970,1971, 7, + 103, 296, 439, 407, 506, 634, 990,1972,1973,1974,1975, 645,1976,1977,1978,1979, +1980,1981, 236,1982,1436,1983,1984,1089, 192, 828, 618, 518,1166, 333,1127,1985, + 818,1223,1986,1987,1988,1989,1990,1991,1992,1993, 342,1128,1286, 746, 842,1994, +1995, 560, 223,1287, 98, 8, 189, 650, 978,1288,1996,1437,1997, 17, 345, 250, + 423, 277, 234, 512, 226, 97, 289, 42, 167,1998, 201,1999,2000, 843, 836, 824, + 532, 338, 783,1090, 182, 576, 436,1438,1439, 527, 500,2001, 947, 889,2002,2003, +2004,2005, 262, 600, 314, 447,2006, 547,2007, 693, 738,1129,2008, 71,1440, 745, + 619, 688,2009, 829,2010,2011, 147,2012, 33, 948,2013,2014, 74, 224,2015, 61, + 191, 918, 399, 637,2016,1028,1130, 257, 902,2017,2018,2019,2020,2021,2022,2023, +2024,2025,2026, 837,2027,2028,2029,2030, 179, 874, 591, 52, 724, 246,2031,2032, +2033,2034,1167, 969,2035,1289, 630, 605, 911,1091,1168,2036,2037,2038,1441, 912, +2039, 623,2040,2041, 253,1169,1290,2042,1442, 146, 620, 611, 577, 433,2043,1224, + 719,1170, 959, 440, 437, 534, 84, 388, 480,1131, 159, 220, 198, 679,2044,1012, + 819,1066,1443, 113,1225, 194, 318,1003,1029,2045,2046,2047,2048,1067,2049,2050, +2051,2052,2053, 59, 913, 112,2054, 632,2055, 455, 144, 739,1291,2056, 273, 681, + 499,2057, 448,2058,2059, 760,2060,2061, 970, 384, 169, 245,1132,2062,2063, 414, +1444,2064,2065, 41, 235,2066, 157, 252, 877, 568, 919, 789, 580,2067, 725,2068, +2069,1292,2070,2071,1445,2072,1446,2073,2074, 55, 588, 66,1447, 271,1092,2075, +1226,2076, 960,1013, 372,2077,2078,2079,2080,2081,1293,2082,2083,2084,2085, 850, +2086,2087,2088,2089,2090, 186,2091,1068, 180,2092,2093,2094, 109,1227, 522, 606, +2095, 867,1448,1093, 991,1171, 926, 353,1133,2096, 581,2097,2098,2099,1294,1449, +1450,2100, 596,1172,1014,1228,2101,1451,1295,1173,1229,2102,2103,1296,1134,1452, + 949,1135,2104,2105,1094,1453,1454,1455,2106,1095,2107,2108,2109,2110,2111,2112, +2113,2114,2115,2116,2117, 804,2118,2119,1230,1231, 805,1456, 405,1136,2120,2121, +2122,2123,2124, 720, 701,1297, 992,1457, 927,1004,2125,2126,2127,2128,2129,2130, + 22, 417,2131, 303,2132, 385,2133, 971, 520, 513,2134,1174, 73,1096, 231, 274, + 962,1458, 673,2135,1459,2136, 152,1137,2137,2138,2139,2140,1005,1138,1460,1139, +2141,2142,2143,2144, 11, 374, 844,2145, 154,1232, 46,1461,2146, 838, 830, 721, +1233, 106,2147, 90, 428, 462, 578, 566,1175, 352,2148,2149, 538,1234, 124,1298, +2150,1462, 761, 565,2151, 686,2152, 649,2153, 72, 173,2154, 460, 415,2155,1463, +2156,1235, 305,2157,2158,2159,2160,2161,2162, 579,2163,2164,2165,2166,2167, 747, +2168,2169,2170,2171,1464, 669,2172,2173,2174,2175,2176,1465,2177, 23, 530, 285, +2178, 335, 729,2179, 397,2180,2181,2182,1030,2183,2184, 698,2185,2186, 325,2187, +2188, 369,2189, 799,1097,1015, 348,2190,1069, 680,2191, 851,1466,2192,2193, 10, +2194, 613, 424,2195, 979, 108, 449, 589, 27, 172, 81,1031, 80, 774, 281, 350, +1032, 525, 301, 582,1176,2196, 674,1045,2197,2198,1467, 730, 762,2199,2200,2201, +2202,1468,2203, 993,2204,2205, 266,1070, 963,1140,2206,2207,2208, 664,1098, 972, +2209,2210,2211,1177,1469,1470, 871,2212,2213,2214,2215,2216,1471,2217,2218,2219, +2220,2221,2222,2223,2224,2225,2226,2227,1472,1236,2228,2229,2230,2231,2232,2233, +2234,2235,1299,2236,2237, 200,2238, 477, 373,2239,2240, 731, 825, 777,2241,2242, +2243, 521, 486, 548,2244,2245,2246,1473,1300, 53, 549, 137, 875, 76, 158,2247, +1301,1474, 469, 396,1016, 278, 712,2248, 321, 442, 503, 767, 744, 941,1237,1178, +1475,2249, 82, 178,1141,1179, 973,2250,1302,2251, 297,2252,2253, 570,2254,2255, +2256, 18, 450, 206,2257, 290, 292,1142,2258, 511, 162, 99, 346, 164, 735,2259, +1476,1477, 4, 554, 343, 798,1099,2260,1100,2261, 43, 171,1303, 139, 215,2262, +2263, 717, 775,2264,1033, 322, 216,2265, 831,2266, 149,2267,1304,2268,2269, 702, +1238, 135, 845, 347, 309,2270, 484,2271, 878, 655, 238,1006,1478,2272, 67,2273, + 295,2274,2275, 461,2276, 478, 942, 412,2277,1034,2278,2279,2280, 265,2281, 541, +2282,2283,2284,2285,2286, 70, 852,1071,2287,2288,2289,2290, 21, 56, 509, 117, + 432,2291,2292, 331, 980, 552,1101, 148, 284, 105, 393,1180,1239, 755,2293, 187, +2294,1046,1479,2295, 340,2296, 63,1047, 230,2297,2298,1305, 763,1306, 101, 800, + 808, 494,2299,2300,2301, 903,2302, 37,1072, 14, 5,2303, 79, 675,2304, 312, +2305,2306,2307,2308,2309,1480, 6,1307,2310,2311,2312, 1, 470, 35, 24, 229, +2313, 695, 210, 86, 778, 15, 784, 592, 779, 32, 77, 855, 964,2314, 259,2315, + 501, 380,2316,2317, 83, 981, 153, 689,1308,1481,1482,1483,2318,2319, 716,1484, +2320,2321,2322,2323,2324,2325,1485,2326,2327, 128, 57, 68, 261,1048, 211, 170, +1240, 31,2328, 51, 435, 742,2329,2330,2331, 635,2332, 264, 456,2333,2334,2335, + 425,2336,1486, 143, 507, 263, 943,2337, 363, 920,1487, 256,1488,1102, 243, 601, +1489,2338,2339,2340,2341,2342,2343,2344, 861,2345,2346,2347,2348,2349,2350, 395, +2351,1490,1491, 62, 535, 166, 225,2352,2353, 668, 419,1241, 138, 604, 928,2354, +1181,2355,1492,1493,2356,2357,2358,1143,2359, 696,2360, 387, 307,1309, 682, 476, +2361,2362, 332, 12, 222, 156,2363, 232,2364, 641, 276, 656, 517,1494,1495,1035, + 416, 736,1496,2365,1017, 586,2366,2367,2368,1497,2369, 242,2370,2371,2372,1498, +2373, 965, 713,2374,2375,2376,2377, 740, 982,1499, 944,1500,1007,2378,2379,1310, +1501,2380,2381,2382, 785, 329,2383,2384,1502,2385,2386,2387, 932,2388,1503,2389, +2390,2391,2392,1242,2393,2394,2395,2396,2397, 994, 950,2398,2399,2400,2401,1504, +1311,2402,2403,2404,2405,1049, 749,2406,2407, 853, 718,1144,1312,2408,1182,1505, +2409,2410, 255, 516, 479, 564, 550, 214,1506,1507,1313, 413, 239, 444, 339,1145, +1036,1508,1509,1314,1037,1510,1315,2411,1511,2412,2413,2414, 176, 703, 497, 624, + 593, 921, 302,2415, 341, 165,1103,1512,2416,1513,2417,2418,2419, 376,2420, 700, +2421,2422,2423, 258, 768,1316,2424,1183,2425, 995, 608,2426,2427,2428,2429, 221, +2430,2431,2432,2433,2434,2435,2436,2437, 195, 323, 726, 188, 897, 983,1317, 377, + 644,1050, 879,2438, 452,2439,2440,2441,2442,2443,2444, 914,2445,2446,2447,2448, + 915, 489,2449,1514,1184,2450,2451, 515, 64, 427, 495,2452, 583,2453, 483, 485, +1038, 562, 213,1515, 748, 666,2454,2455,2456,2457, 334,2458, 780, 996,1008, 705, +1243,2459,2460,2461,2462,2463, 114,2464, 493,1146, 366, 163,1516, 961,1104,2465, + 291,2466,1318,1105,2467,1517, 365,2468, 355, 951,1244,2469,1319,2470, 631,2471, +2472, 218,1320, 364, 320, 756,1518,1519,1321,1520,1322,2473,2474,2475,2476, 997, +2477,2478,2479,2480, 665,1185,2481, 916,1521,2482,2483,2484, 584, 684,2485,2486, + 797,2487,1051,1186,2488,2489,2490,1522,2491,2492, 370,2493,1039,1187, 65,2494, + 434, 205, 463,1188,2495, 125, 812, 391, 402, 826, 699, 286, 398, 155, 781, 771, + 585,2496, 590, 505,1073,2497, 599, 244, 219, 917,1018, 952, 646,1523,2498,1323, +2499,2500, 49, 984, 354, 741,2501, 625,2502,1324,2503,1019, 190, 357, 757, 491, + 95, 782, 868,2504,2505,2506,2507,2508,2509, 134,1524,1074, 422,1525, 898,2510, + 161,2511,2512,2513,2514, 769,2515,1526,2516,2517, 411,1325,2518, 472,1527,2519, +2520,2521,2522,2523,2524, 985,2525,2526,2527,2528,2529,2530, 764,2531,1245,2532, +2533, 25, 204, 311,2534, 496,2535,1052,2536,2537,2538,2539,2540,2541,2542, 199, + 704, 504, 468, 758, 657,1528, 196, 44, 839,1246, 272, 750,2543, 765, 862,2544, +2545,1326,2546, 132, 615, 933,2547, 732,2548,2549,2550,1189,1529,2551, 283,1247, +1053, 607, 929,2552,2553,2554, 930, 183, 872, 616,1040,1147,2555,1148,1020, 441, + 249,1075,2556,2557,2558, 466, 743,2559,2560,2561, 92, 514, 426, 420, 526,2562, +2563,2564,2565,2566,2567,2568, 185,2569,2570,2571,2572, 776,1530, 658,2573, 362, +2574, 361, 922,1076, 793,2575,2576,2577,2578,2579,2580,1531, 251,2581,2582,2583, +2584,1532, 54, 612, 237,1327,2585,2586, 275, 408, 647, 111,2587,1533,1106, 465, + 3, 458, 9, 38,2588, 107, 110, 890, 209, 26, 737, 498,2589,1534,2590, 431, + 202, 88,1535, 356, 287,1107, 660,1149,2591, 381,1536, 986,1150, 445,1248,1151, + 974,2592,2593, 846,2594, 446, 953, 184,1249,1250, 727,2595, 923, 193, 883,2596, +2597,2598, 102, 324, 539, 817,2599, 421,1041,2600, 832,2601, 94, 175, 197, 406, +2602, 459,2603,2604,2605,2606,2607, 330, 555,2608,2609,2610, 706,1108, 389,2611, +2612,2613,2614, 233,2615, 833, 558, 931, 954,1251,2616,2617,1537, 546,2618,2619, +1009,2620,2621,2622,1538, 690,1328,2623, 955,2624,1539,2625,2626, 772,2627,2628, +2629,2630,2631, 924, 648, 863, 603,2632,2633, 934,1540, 864, 865,2634, 642,1042, + 670,1190,2635,2636,2637,2638, 168,2639, 652, 873, 542,1054,1541,2640,2641,2642, # 512, 256 +) + diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/euckrfreq 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/euckrfreq 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..51a5f5850a81c80eb371b9af9068663e02fbf58d GIT binary patch literal 24134 zcmeI(WtWxb7Nz0B-QC@#aCdiy5D4yWg==tkLV`;m0)Y_R-Q9va351XYcj z1(B_K`<2rfIbfUK7u>!UY*%(vCY5UzF@W{3gYlgDh4F&=V8KqtF4zrwpr2L!VXtx@ z?1w2fce9|9*>tw_qz-UnP!A!Y+(EsUB8RAT5ds)s>0xEC$auY1B1iO&LL|L6++)h` z>?;cK8NX1+86hIq^m4&Kn^(D7b;bruXHX}EPr@lU4RIN@jm^!3cRe&*=`rhmX#zpuYE8WvVxIg}MsY;5tlU+@Nm4Ew~ML;4UeH}%x2$J9UYFTCddM-?^k zgnD4hQ|cK!hZj)S4gQl$Z!D#KA<9qGOObWdL9ws3Zs?7s2?2}0!8$qnrPt@MWdoa42TJ_Af0e*Dh|Yj7G~p7 zW2j?}ylTsEXT)b@SB^5<7ZT{T6i%-kOC{7BqD(|3h7lIbvM-4;DYOz!MkR+7kP=cs zYAEfrG*msa=^(8#*!rJft1apD(nCp+ubuXZn?Y}zNJc6XWQHt|6|zB2W9J}?vDTpz zke$1gk%Jn|&80jJIrT<5Ev0f4^@JK{HnZC|RBl(E3B3@6hta~hEXWO6d|f4HjA67l z8_eiKEo9_T9#qb;G@)Js>O7={&w53j){bgwX4@gT0s>vag;kw zZ#?8PmLIM$DnpRm1a1mj23lW0J@^*kdx70_^{j#Tl!E%xNnrFxkZ)5 zAf@#?8NNasdBJG1+^i$%`JVbQVy@9_e!s%*}BSIR6S~v8`P&7Kyl?+ znB;LzhA9x!f`%efm5rz`pfMB({V-JE#K8BKbDJoe!fvO1MKy!rB1xRlT=|we&C(Xi z^xQi3&4y7{wPX~hrou3@RiG6kFcA1VyYih?gOsJ^B3dw+@iVj*elIeQQ3BfNwGD-_ zc2s+4BbP^S0@W76K?m+Y>&IC7L9e4;C+K4$52LfPq%*oun@n`2rf_d6r~A+)sMdNj zlQPgP2>d0^8`cWIGRMaXH{b7XOU1Mt)V~ka# zCc438?rc|^Dm<3^iLnnp!$`C3xmS!eq9!p4Q{zmGhY2td%7sR#S|%n_P4%WwSKg|G+~!xC5u%iy_#N?X5N`JJ%@%I}rExGSjkZof;Jm75I?!bH0Dyz-Gq1nLmuN5)U^GpvG)KHG3x?o&^#dQBbDTP@Pn zmX(ZOlxrZOrNiXT$UTDca^v-u2*-ofdSx6w-^3NUwHEve=aum>vQPbfasJ+7ZL=G$WDfhzxI0%Q}FdTuS(8z+0CL%lckdGv0%K@^eJ zR8-gr6S?P1MCG0^v5-1R#S{55^f6ICP>JA?GRW**suiSTWDm{3DGQELr>Qeg-9Z(g z2qd(ip0PN}az4i<6J;117>nFxF~re(p?B7*^(F?wIpuk{02d*$Tw@c(sNL{8BZJ;0 zY9nz&(~TicNZlozO1 z)PEvR;3+(VY3_2=#B*gdkEEZ8W-yIWUSvAF5P1o&V5#tQk=M!|Cf-nQ;iDsG7>h3V zPH!1ClhIYU4U~m-p2mBTBPLGk&7^i)zlFOI5;GcDFj{#Vy2vfoyAFro2e}XSy|5rZ zWS3j+2E9a%D)&*PZ24OxlHNySpWrhD1-^$m6$_3zV?^kfeJ`P_tHtKVfkoW!oe@_V z53#3sf1J_h-qnJDhaGmCZ$$V$*AN|*yb8$%TYgY zoNC&ZONl#^fjF1WHnaxaPfvk`Xvconv$U)_F zwQw^xEsfN^XTcSE695mAV#;vNFtwKGZ;+xnf z{F@sr75+kay|OX&tz0h?Un-kGQ}_!0G25HF!9*Xb8KXJ0fR+%$mVQpFVWO4ZJiRj} za#I^EXw9f3QVPzx&{>hrB5k-$sMS`Tf^s5-V6I$Cy|!}gAUWe4V~DZ%&S=lrM7`w} zgbsRZsE*VG%0Dl3s$%RH=&U?p{bJ~%+-yr%>bx`ZGP)_dLl5W)y`VRgx491$0)3$$ z^oPH>1E_&82nNFz2QB0dQ4WP+FdRm}R*|o%B%vQwIF$>H)T>Qh(Ho_lq8v?)fw2(T zM;J$qhi$?WsEJU~#3X7m^ioct()fj{YW6kt6=NzRm)?)IOjFk9Zga`$${7&dO=nW= zPS1YN!iQtgk~w7EUJD9HKH}naHKAM189_+va7;M9MkJZ(zGy zU1hw3xq9EicQ6ljh|H(%IBfy75TZLHw|)B=A=DzqVpsy-T3U^9LS(7lGFT4ZF?L$N z3p$8=&sYH~;RpB;c8mN({S2#MHT(i=U@iO#>)gd-mIF6xF4-4}K%_rNuuvZ&ifgS~qDU_V6T{%Im3bwKYR9D=t!yoS$=hwzK=MGs;g?6>NuiF(fX4f-a1RRWk%>{^EtiG%4H&Lpo#K(>XxPF zMGiRkAOxlYe=BEvA(z_Ks#|qIt_F3H$|1K3k{FvrU4q}am*Au=Q7pKujApi+rI+Qd z=#}PPrRL~eqmtTpow@L#_u*aGSgz32}AlX?ITAsY8DDwWe7QGdf@_y_)lN{(z`U$8Cz={#(HvO2A%RkP(%GCENcs0EBm@LcYt+3nm{RAR9M8;Qo zOB|F>WFf;V37sxjbrA|E3qm32FH)G=Vzvl1%F_Ih%EZr%>&l|sVo*aF(~&n}0TgFE zq)Jd<8%roRor(m%+jj|KICly6Hsi8hNn>x_zM5VsWoak_S47HE&zwfhh9VEnu%Yj>(qat=ZaK^)Ot6dhO#Eqf_QROUA(rk4&0QhOVxw= z@V#6E>K3;l)d;?T#&Fd$_>yV@P2nqO26rvk1kIH#pe3||+m@z**2*@}7TQ5FoB#1q z+bcUjL#s~d4dA9V+mW$Ic}Lkv*%>~2#1VyW`KSe`%n!$3=8 z!hMlHAU(v=`;*E5U7YrS>PmHk?(nO9yB+z|zMfQF_|E6Zt=B`YA+dE+v z>P7X2J}^KygxXob}iptso4fz&-lOJjqSgJB2^g&S@#j2aFj;AW-}@?=1}+a{(#tK^D!=(_}jk6%6agO@Lc#7 zzJprE=20=-%PgBC?X|?`l6#Kf+a~W#x7?Rt8>({HymLWP>M=9ey(Q zGpvHu@Q2fWq1M1!_!YjhYN>0iQ_hxqYRhlR^{@e|$gPHr%1w|;cr%s4f@QEpxfQm- zGpn{!JD|7Q@1)`gFNd-|;4Z!2xF?mTsqeYF8AJ7QI&Bw zJEck_binh?%4OtL@K#Y_NAuQ>Kzkl44)Zo_0m9n zN6t1oluBb_C?hEF`>#${oiU8DQ|~r498NLP3a5iw%JkGOxvk1Ap|=vg3zwXcL1aF6 zFSiesQ7;o@hW3mKwxlqTS0oE#gxWmst6KcVaK7MU#vYfBhPN}KXCL-Bfhg%ow1yCz%9^dV;%#DNr z5aMIr@r=V>_zwKc^+>{A_zwKI@b%N!*HmL)8(}Ye2Yx%|o9h`2@;wtwg}v|{_*v!E zf$Y9YM)`W_3kmdE`azUlIhIPOH$<6;N(>`B$yuIc5@k|oC7g^(4k;idq=M8?+G%O1 zdS=r>T4k{HKfzX8(&?p#k|JL_?GrbH-ZqhpR3^v_Ss*K9gPg|BK^9}JLnk0RcPk?Y zHJY1Cc^q=;jdWT{zYu8?yL`l$t3NYUK5>QcD2`WPs zs0x|5)u`%F18PDos13<&Zs}u{a(ErRS9&GQ)>ZDJ>QR&2pgz?AiYw2;B#(14Oo5md zG!&VtY(#wljiEs3hoJ%|2EMnP+eFzEc027Wsu>IyN#cy=%D3EUmbOr)=hm@rHjJ{W zC8Ibs6^5Cu0<9QvLClU%yf8m#vc2cnHazr z2p{$K!XRZ6xz|?Zk}C!qp|xHtn+MAcfl-XiX0vd&b01nz5N0`dCp8>O$qh9&4EhTX zr#et0sI|6yO%*aRlFGy#MU956j{HWhAGLu>MXfT?A4cfiHMWK^##lvaq8nW1&UUq_ z!ehCg82jKej5OPxd&O8IY7(O`HO|C%m;e)@Txf)kceR;}Suh*szsbHz3?6Q0pO9Wf{Y&Ga1ZA`_0;2hO&!u(Ez;Ff zTgmuExdtNoVi+cOM(z=mmm9CQL^vL-)+^&zVZMnga%(O470xU3nHWpmqpBNAq8tQ` zlu2zl0#8KdhMoa+^?E~lXGC(wa1#lYV?-uHTB|xj4&nSF5k&G*Q$=D>>)h%$SPy}} z0^e$o)$C@N3-4f%iJSIq5Z(xzU^9&2ZlSiqHrNh3U?)7bc^9?7#dlMCpscIy;g+zz zvsIB{Dx;>uJ5YOt^NAc*?o;lE18@)y!C^Q8N1>4g9Zf`b?jxJ4*>a3~9P;Sha)T%$ zt*NN66DD%cnTX0gVPYY5l8PttW$0s~exMS;BV~};yHqPk$H*R&>KgTfc?75fU@PUic3D{>?*t z8TuqWrr3dR^spDc1J59<2ayf3!!}PS2bI%f3VY!@@DKE!Mky!_WuPpSgYr-TDndrz zewC=oa4Phh6EZQvUic3DKE=~$=HWDl7SIx6_|og=hgJ>Gs+Hb6y)!0qQ(-TB2mVc@ zpXdWToPjV121D2j-+@0V@>Q}L!e00e{0_*MMc519f!`nbsq)58mBiE$-$G$8d3&P&|4*dIg4QzIweD4Zf^XwS3tc zEh<#4-=JRAat#|)tzD}{y|RJ-35olELS@Ut8<4z1={D$ z(>ibdfdl)6bPfp#DV)E5$2@`mbm$)3Ah>6zp1C@8?-SChYu8+5D^%=Lr=eEpUoHBz z>)y6U@8C8aTlH?+E+n{J-!@%(x9{DqSMHtzLjr#s6jY*HkG6fgwkwq_p!;|?B69f1 Q5d;61=&=9(f1beq0OXie-v9sr literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/euckrfreq.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/euckrfreq.py new file mode 100644 index 0000000..b68078c --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/euckrfreq.py @@ -0,0 +1,195 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# Sampling from about 20M text materials include literature and computer technology + +# 128 --> 0.79 +# 256 --> 0.92 +# 512 --> 0.986 +# 1024 --> 0.99944 +# 2048 --> 0.99999 +# +# Idea Distribution Ratio = 0.98653 / (1-0.98653) = 73.24 +# Random Distribution Ration = 512 / (2350-512) = 0.279. +# +# Typical Distribution Ratio + +EUCKR_TYPICAL_DISTRIBUTION_RATIO = 6.0 + +EUCKR_TABLE_SIZE = 2352 + +# Char to FreqOrder table , +EUCKR_CHAR_TO_FREQ_ORDER = ( + 13, 130, 120,1396, 481,1719,1720, 328, 609, 212,1721, 707, 400, 299,1722, 87, +1397,1723, 104, 536,1117,1203,1724,1267, 685,1268, 508,1725,1726,1727,1728,1398, +1399,1729,1730,1731, 141, 621, 326,1057, 368,1732, 267, 488, 20,1733,1269,1734, + 945,1400,1735, 47, 904,1270,1736,1737, 773, 248,1738, 409, 313, 786, 429,1739, + 116, 987, 813,1401, 683, 75,1204, 145,1740,1741,1742,1743, 16, 847, 667, 622, + 708,1744,1745,1746, 966, 787, 304, 129,1747, 60, 820, 123, 676,1748,1749,1750, +1751, 617,1752, 626,1753,1754,1755,1756, 653,1757,1758,1759,1760,1761,1762, 856, + 344,1763,1764,1765,1766, 89, 401, 418, 806, 905, 848,1767,1768,1769, 946,1205, + 709,1770,1118,1771, 241,1772,1773,1774,1271,1775, 569,1776, 999,1777,1778,1779, +1780, 337, 751,1058, 28, 628, 254,1781, 177, 906, 270, 349, 891,1079,1782, 19, +1783, 379,1784, 315,1785, 629, 754,1402, 559,1786, 636, 203,1206,1787, 710, 567, +1788, 935, 814,1789,1790,1207, 766, 528,1791,1792,1208,1793,1794,1795,1796,1797, +1403,1798,1799, 533,1059,1404,1405,1156,1406, 936, 884,1080,1800, 351,1801,1802, +1803,1804,1805, 801,1806,1807,1808,1119,1809,1157, 714, 474,1407,1810, 298, 899, + 885,1811,1120, 802,1158,1812, 892,1813,1814,1408, 659,1815,1816,1121,1817,1818, +1819,1820,1821,1822, 319,1823, 594, 545,1824, 815, 937,1209,1825,1826, 573,1409, +1022,1827,1210,1828,1829,1830,1831,1832,1833, 556, 722, 807,1122,1060,1834, 697, +1835, 900, 557, 715,1836,1410, 540,1411, 752,1159, 294, 597,1211, 976, 803, 770, +1412,1837,1838, 39, 794,1413, 358,1839, 371, 925,1840, 453, 661, 788, 531, 723, + 544,1023,1081, 869, 91,1841, 392, 430, 790, 602,1414, 677,1082, 457,1415,1416, +1842,1843, 475, 327,1024,1417, 795, 121,1844, 733, 403,1418,1845,1846,1847, 300, + 119, 711,1212, 627,1848,1272, 207,1849,1850, 796,1213, 382,1851, 519,1852,1083, + 893,1853,1854,1855, 367, 809, 487, 671,1856, 663,1857,1858, 956, 471, 306, 857, +1859,1860,1160,1084,1861,1862,1863,1864,1865,1061,1866,1867,1868,1869,1870,1871, + 282, 96, 574,1872, 502,1085,1873,1214,1874, 907,1875,1876, 827, 977,1419,1420, +1421, 268,1877,1422,1878,1879,1880, 308,1881, 2, 537,1882,1883,1215,1884,1885, + 127, 791,1886,1273,1423,1887, 34, 336, 404, 643,1888, 571, 654, 894, 840,1889, + 0, 886,1274, 122, 575, 260, 908, 938,1890,1275, 410, 316,1891,1892, 100,1893, +1894,1123, 48,1161,1124,1025,1895, 633, 901,1276,1896,1897, 115, 816,1898, 317, +1899, 694,1900, 909, 734,1424, 572, 866,1425, 691, 85, 524,1010, 543, 394, 841, +1901,1902,1903,1026,1904,1905,1906,1907,1908,1909, 30, 451, 651, 988, 310,1910, +1911,1426, 810,1216, 93,1912,1913,1277,1217,1914, 858, 759, 45, 58, 181, 610, + 269,1915,1916, 131,1062, 551, 443,1000, 821,1427, 957, 895,1086,1917,1918, 375, +1919, 359,1920, 687,1921, 822,1922, 293,1923,1924, 40, 662, 118, 692, 29, 939, + 887, 640, 482, 174,1925, 69,1162, 728,1428, 910,1926,1278,1218,1279, 386, 870, + 217, 854,1163, 823,1927,1928,1929,1930, 834,1931, 78,1932, 859,1933,1063,1934, +1935,1936,1937, 438,1164, 208, 595,1938,1939,1940,1941,1219,1125,1942, 280, 888, +1429,1430,1220,1431,1943,1944,1945,1946,1947,1280, 150, 510,1432,1948,1949,1950, +1951,1952,1953,1954,1011,1087,1955,1433,1043,1956, 881,1957, 614, 958,1064,1065, +1221,1958, 638,1001, 860, 967, 896,1434, 989, 492, 553,1281,1165,1959,1282,1002, +1283,1222,1960,1961,1962,1963, 36, 383, 228, 753, 247, 454,1964, 876, 678,1965, +1966,1284, 126, 464, 490, 835, 136, 672, 529, 940,1088,1435, 473,1967,1968, 467, + 50, 390, 227, 587, 279, 378, 598, 792, 968, 240, 151, 160, 849, 882,1126,1285, + 639,1044, 133, 140, 288, 360, 811, 563,1027, 561, 142, 523,1969,1970,1971, 7, + 103, 296, 439, 407, 506, 634, 990,1972,1973,1974,1975, 645,1976,1977,1978,1979, +1980,1981, 236,1982,1436,1983,1984,1089, 192, 828, 618, 518,1166, 333,1127,1985, + 818,1223,1986,1987,1988,1989,1990,1991,1992,1993, 342,1128,1286, 746, 842,1994, +1995, 560, 223,1287, 98, 8, 189, 650, 978,1288,1996,1437,1997, 17, 345, 250, + 423, 277, 234, 512, 226, 97, 289, 42, 167,1998, 201,1999,2000, 843, 836, 824, + 532, 338, 783,1090, 182, 576, 436,1438,1439, 527, 500,2001, 947, 889,2002,2003, +2004,2005, 262, 600, 314, 447,2006, 547,2007, 693, 738,1129,2008, 71,1440, 745, + 619, 688,2009, 829,2010,2011, 147,2012, 33, 948,2013,2014, 74, 224,2015, 61, + 191, 918, 399, 637,2016,1028,1130, 257, 902,2017,2018,2019,2020,2021,2022,2023, +2024,2025,2026, 837,2027,2028,2029,2030, 179, 874, 591, 52, 724, 246,2031,2032, +2033,2034,1167, 969,2035,1289, 630, 605, 911,1091,1168,2036,2037,2038,1441, 912, +2039, 623,2040,2041, 253,1169,1290,2042,1442, 146, 620, 611, 577, 433,2043,1224, + 719,1170, 959, 440, 437, 534, 84, 388, 480,1131, 159, 220, 198, 679,2044,1012, + 819,1066,1443, 113,1225, 194, 318,1003,1029,2045,2046,2047,2048,1067,2049,2050, +2051,2052,2053, 59, 913, 112,2054, 632,2055, 455, 144, 739,1291,2056, 273, 681, + 499,2057, 448,2058,2059, 760,2060,2061, 970, 384, 169, 245,1132,2062,2063, 414, +1444,2064,2065, 41, 235,2066, 157, 252, 877, 568, 919, 789, 580,2067, 725,2068, +2069,1292,2070,2071,1445,2072,1446,2073,2074, 55, 588, 66,1447, 271,1092,2075, +1226,2076, 960,1013, 372,2077,2078,2079,2080,2081,1293,2082,2083,2084,2085, 850, +2086,2087,2088,2089,2090, 186,2091,1068, 180,2092,2093,2094, 109,1227, 522, 606, +2095, 867,1448,1093, 991,1171, 926, 353,1133,2096, 581,2097,2098,2099,1294,1449, +1450,2100, 596,1172,1014,1228,2101,1451,1295,1173,1229,2102,2103,1296,1134,1452, + 949,1135,2104,2105,1094,1453,1454,1455,2106,1095,2107,2108,2109,2110,2111,2112, +2113,2114,2115,2116,2117, 804,2118,2119,1230,1231, 805,1456, 405,1136,2120,2121, +2122,2123,2124, 720, 701,1297, 992,1457, 927,1004,2125,2126,2127,2128,2129,2130, + 22, 417,2131, 303,2132, 385,2133, 971, 520, 513,2134,1174, 73,1096, 231, 274, + 962,1458, 673,2135,1459,2136, 152,1137,2137,2138,2139,2140,1005,1138,1460,1139, +2141,2142,2143,2144, 11, 374, 844,2145, 154,1232, 46,1461,2146, 838, 830, 721, +1233, 106,2147, 90, 428, 462, 578, 566,1175, 352,2148,2149, 538,1234, 124,1298, +2150,1462, 761, 565,2151, 686,2152, 649,2153, 72, 173,2154, 460, 415,2155,1463, +2156,1235, 305,2157,2158,2159,2160,2161,2162, 579,2163,2164,2165,2166,2167, 747, +2168,2169,2170,2171,1464, 669,2172,2173,2174,2175,2176,1465,2177, 23, 530, 285, +2178, 335, 729,2179, 397,2180,2181,2182,1030,2183,2184, 698,2185,2186, 325,2187, +2188, 369,2189, 799,1097,1015, 348,2190,1069, 680,2191, 851,1466,2192,2193, 10, +2194, 613, 424,2195, 979, 108, 449, 589, 27, 172, 81,1031, 80, 774, 281, 350, +1032, 525, 301, 582,1176,2196, 674,1045,2197,2198,1467, 730, 762,2199,2200,2201, +2202,1468,2203, 993,2204,2205, 266,1070, 963,1140,2206,2207,2208, 664,1098, 972, +2209,2210,2211,1177,1469,1470, 871,2212,2213,2214,2215,2216,1471,2217,2218,2219, +2220,2221,2222,2223,2224,2225,2226,2227,1472,1236,2228,2229,2230,2231,2232,2233, +2234,2235,1299,2236,2237, 200,2238, 477, 373,2239,2240, 731, 825, 777,2241,2242, +2243, 521, 486, 548,2244,2245,2246,1473,1300, 53, 549, 137, 875, 76, 158,2247, +1301,1474, 469, 396,1016, 278, 712,2248, 321, 442, 503, 767, 744, 941,1237,1178, +1475,2249, 82, 178,1141,1179, 973,2250,1302,2251, 297,2252,2253, 570,2254,2255, +2256, 18, 450, 206,2257, 290, 292,1142,2258, 511, 162, 99, 346, 164, 735,2259, +1476,1477, 4, 554, 343, 798,1099,2260,1100,2261, 43, 171,1303, 139, 215,2262, +2263, 717, 775,2264,1033, 322, 216,2265, 831,2266, 149,2267,1304,2268,2269, 702, +1238, 135, 845, 347, 309,2270, 484,2271, 878, 655, 238,1006,1478,2272, 67,2273, + 295,2274,2275, 461,2276, 478, 942, 412,2277,1034,2278,2279,2280, 265,2281, 541, +2282,2283,2284,2285,2286, 70, 852,1071,2287,2288,2289,2290, 21, 56, 509, 117, + 432,2291,2292, 331, 980, 552,1101, 148, 284, 105, 393,1180,1239, 755,2293, 187, +2294,1046,1479,2295, 340,2296, 63,1047, 230,2297,2298,1305, 763,1306, 101, 800, + 808, 494,2299,2300,2301, 903,2302, 37,1072, 14, 5,2303, 79, 675,2304, 312, +2305,2306,2307,2308,2309,1480, 6,1307,2310,2311,2312, 1, 470, 35, 24, 229, +2313, 695, 210, 86, 778, 15, 784, 592, 779, 32, 77, 855, 964,2314, 259,2315, + 501, 380,2316,2317, 83, 981, 153, 689,1308,1481,1482,1483,2318,2319, 716,1484, +2320,2321,2322,2323,2324,2325,1485,2326,2327, 128, 57, 68, 261,1048, 211, 170, +1240, 31,2328, 51, 435, 742,2329,2330,2331, 635,2332, 264, 456,2333,2334,2335, + 425,2336,1486, 143, 507, 263, 943,2337, 363, 920,1487, 256,1488,1102, 243, 601, +1489,2338,2339,2340,2341,2342,2343,2344, 861,2345,2346,2347,2348,2349,2350, 395, +2351,1490,1491, 62, 535, 166, 225,2352,2353, 668, 419,1241, 138, 604, 928,2354, +1181,2355,1492,1493,2356,2357,2358,1143,2359, 696,2360, 387, 307,1309, 682, 476, +2361,2362, 332, 12, 222, 156,2363, 232,2364, 641, 276, 656, 517,1494,1495,1035, + 416, 736,1496,2365,1017, 586,2366,2367,2368,1497,2369, 242,2370,2371,2372,1498, +2373, 965, 713,2374,2375,2376,2377, 740, 982,1499, 944,1500,1007,2378,2379,1310, +1501,2380,2381,2382, 785, 329,2383,2384,1502,2385,2386,2387, 932,2388,1503,2389, +2390,2391,2392,1242,2393,2394,2395,2396,2397, 994, 950,2398,2399,2400,2401,1504, +1311,2402,2403,2404,2405,1049, 749,2406,2407, 853, 718,1144,1312,2408,1182,1505, +2409,2410, 255, 516, 479, 564, 550, 214,1506,1507,1313, 413, 239, 444, 339,1145, +1036,1508,1509,1314,1037,1510,1315,2411,1511,2412,2413,2414, 176, 703, 497, 624, + 593, 921, 302,2415, 341, 165,1103,1512,2416,1513,2417,2418,2419, 376,2420, 700, +2421,2422,2423, 258, 768,1316,2424,1183,2425, 995, 608,2426,2427,2428,2429, 221, +2430,2431,2432,2433,2434,2435,2436,2437, 195, 323, 726, 188, 897, 983,1317, 377, + 644,1050, 879,2438, 452,2439,2440,2441,2442,2443,2444, 914,2445,2446,2447,2448, + 915, 489,2449,1514,1184,2450,2451, 515, 64, 427, 495,2452, 583,2453, 483, 485, +1038, 562, 213,1515, 748, 666,2454,2455,2456,2457, 334,2458, 780, 996,1008, 705, +1243,2459,2460,2461,2462,2463, 114,2464, 493,1146, 366, 163,1516, 961,1104,2465, + 291,2466,1318,1105,2467,1517, 365,2468, 355, 951,1244,2469,1319,2470, 631,2471, +2472, 218,1320, 364, 320, 756,1518,1519,1321,1520,1322,2473,2474,2475,2476, 997, +2477,2478,2479,2480, 665,1185,2481, 916,1521,2482,2483,2484, 584, 684,2485,2486, + 797,2487,1051,1186,2488,2489,2490,1522,2491,2492, 370,2493,1039,1187, 65,2494, + 434, 205, 463,1188,2495, 125, 812, 391, 402, 826, 699, 286, 398, 155, 781, 771, + 585,2496, 590, 505,1073,2497, 599, 244, 219, 917,1018, 952, 646,1523,2498,1323, +2499,2500, 49, 984, 354, 741,2501, 625,2502,1324,2503,1019, 190, 357, 757, 491, + 95, 782, 868,2504,2505,2506,2507,2508,2509, 134,1524,1074, 422,1525, 898,2510, + 161,2511,2512,2513,2514, 769,2515,1526,2516,2517, 411,1325,2518, 472,1527,2519, +2520,2521,2522,2523,2524, 985,2525,2526,2527,2528,2529,2530, 764,2531,1245,2532, +2533, 25, 204, 311,2534, 496,2535,1052,2536,2537,2538,2539,2540,2541,2542, 199, + 704, 504, 468, 758, 657,1528, 196, 44, 839,1246, 272, 750,2543, 765, 862,2544, +2545,1326,2546, 132, 615, 933,2547, 732,2548,2549,2550,1189,1529,2551, 283,1247, +1053, 607, 929,2552,2553,2554, 930, 183, 872, 616,1040,1147,2555,1148,1020, 441, + 249,1075,2556,2557,2558, 466, 743,2559,2560,2561, 92, 514, 426, 420, 526,2562, +2563,2564,2565,2566,2567,2568, 185,2569,2570,2571,2572, 776,1530, 658,2573, 362, +2574, 361, 922,1076, 793,2575,2576,2577,2578,2579,2580,1531, 251,2581,2582,2583, +2584,1532, 54, 612, 237,1327,2585,2586, 275, 408, 647, 111,2587,1533,1106, 465, + 3, 458, 9, 38,2588, 107, 110, 890, 209, 26, 737, 498,2589,1534,2590, 431, + 202, 88,1535, 356, 287,1107, 660,1149,2591, 381,1536, 986,1150, 445,1248,1151, + 974,2592,2593, 846,2594, 446, 953, 184,1249,1250, 727,2595, 923, 193, 883,2596, +2597,2598, 102, 324, 539, 817,2599, 421,1041,2600, 832,2601, 94, 175, 197, 406, +2602, 459,2603,2604,2605,2606,2607, 330, 555,2608,2609,2610, 706,1108, 389,2611, +2612,2613,2614, 233,2615, 833, 558, 931, 954,1251,2616,2617,1537, 546,2618,2619, +1009,2620,2621,2622,1538, 690,1328,2623, 955,2624,1539,2625,2626, 772,2627,2628, +2629,2630,2631, 924, 648, 863, 603,2632,2633, 934,1540, 864, 865,2634, 642,1042, + 670,1190,2635,2636,2637,2638, 168,2639, 652, 873, 542,1054,1541,2640,2641,2642, # 512, 256 +) + diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/euckrfreq.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/euckrfreq.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0753e1bb9f6a134da7b3103259537af4ca6f8929 GIT binary patch literal 24134 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 literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/euctwfreq 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/euctwfreq 2.py new file mode 100644 index 0000000..ed7a995 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/euctwfreq 2.py @@ -0,0 +1,387 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# EUCTW frequency table +# Converted from big5 work +# by Taiwan's Mandarin Promotion Council +# + +# 128 --> 0.42261 +# 256 --> 0.57851 +# 512 --> 0.74851 +# 1024 --> 0.89384 +# 2048 --> 0.97583 +# +# Idea Distribution Ratio = 0.74851/(1-0.74851) =2.98 +# Random Distribution Ration = 512/(5401-512)=0.105 +# +# Typical Distribution Ratio about 25% of Ideal one, still much higher than RDR + +EUCTW_TYPICAL_DISTRIBUTION_RATIO = 0.75 + +# Char to FreqOrder table , +EUCTW_TABLE_SIZE = 5376 + +EUCTW_CHAR_TO_FREQ_ORDER = ( + 1,1800,1506, 255,1431, 198, 9, 82, 6,7310, 177, 202,3615,1256,2808, 110, # 2742 +3735, 33,3241, 261, 76, 44,2113, 16,2931,2184,1176, 659,3868, 26,3404,2643, # 2758 +1198,3869,3313,4060, 410,2211, 302, 590, 361,1963, 8, 204, 58,4296,7311,1931, # 2774 + 63,7312,7313, 317,1614, 75, 222, 159,4061,2412,1480,7314,3500,3068, 224,2809, # 2790 +3616, 3, 10,3870,1471, 29,2774,1135,2852,1939, 873, 130,3242,1123, 312,7315, # 2806 +4297,2051, 507, 252, 682,7316, 142,1914, 124, 206,2932, 34,3501,3173, 64, 604, # 2822 +7317,2494,1976,1977, 155,1990, 645, 641,1606,7318,3405, 337, 72, 406,7319, 80, # 2838 + 630, 238,3174,1509, 263, 939,1092,2644, 756,1440,1094,3406, 449, 69,2969, 591, # 2854 + 179,2095, 471, 115,2034,1843, 60, 50,2970, 134, 806,1868, 734,2035,3407, 180, # 2870 + 995,1607, 156, 537,2893, 688,7320, 319,1305, 779,2144, 514,2374, 298,4298, 359, # 2886 +2495, 90,2707,1338, 663, 11, 906,1099,2545, 20,2436, 182, 532,1716,7321, 732, # 2902 +1376,4062,1311,1420,3175, 25,2312,1056, 113, 399, 382,1949, 242,3408,2467, 529, # 2918 +3243, 475,1447,3617,7322, 117, 21, 656, 810,1297,2295,2329,3502,7323, 126,4063, # 2934 + 706, 456, 150, 613,4299, 71,1118,2036,4064, 145,3069, 85, 835, 486,2114,1246, # 2950 +1426, 428, 727,1285,1015, 800, 106, 623, 303,1281,7324,2127,2354, 347,3736, 221, # 2966 +3503,3110,7325,1955,1153,4065, 83, 296,1199,3070, 192, 624, 93,7326, 822,1897, # 2982 +2810,3111, 795,2064, 991,1554,1542,1592, 27, 43,2853, 859, 139,1456, 860,4300, # 2998 + 437, 712,3871, 164,2392,3112, 695, 211,3017,2096, 195,3872,1608,3504,3505,3618, # 3014 +3873, 234, 811,2971,2097,3874,2229,1441,3506,1615,2375, 668,2076,1638, 305, 228, # 3030 +1664,4301, 467, 415,7327, 262,2098,1593, 239, 108, 300, 200,1033, 512,1247,2077, # 3046 +7328,7329,2173,3176,3619,2673, 593, 845,1062,3244, 88,1723,2037,3875,1950, 212, # 3062 + 266, 152, 149, 468,1898,4066,4302, 77, 187,7330,3018, 37, 5,2972,7331,3876, # 3078 +7332,7333, 39,2517,4303,2894,3177,2078, 55, 148, 74,4304, 545, 483,1474,1029, # 3094 +1665, 217,1869,1531,3113,1104,2645,4067, 24, 172,3507, 900,3877,3508,3509,4305, # 3110 + 32,1408,2811,1312, 329, 487,2355,2247,2708, 784,2674, 4,3019,3314,1427,1788, # 3126 + 188, 109, 499,7334,3620,1717,1789, 888,1217,3020,4306,7335,3510,7336,3315,1520, # 3142 +3621,3878, 196,1034, 775,7337,7338, 929,1815, 249, 439, 38,7339,1063,7340, 794, # 3158 +3879,1435,2296, 46, 178,3245,2065,7341,2376,7342, 214,1709,4307, 804, 35, 707, # 3174 + 324,3622,1601,2546, 140, 459,4068,7343,7344,1365, 839, 272, 978,2257,2572,3409, # 3190 +2128,1363,3623,1423, 697, 100,3071, 48, 70,1231, 495,3114,2193,7345,1294,7346, # 3206 +2079, 462, 586,1042,3246, 853, 256, 988, 185,2377,3410,1698, 434,1084,7347,3411, # 3222 + 314,2615,2775,4308,2330,2331, 569,2280, 637,1816,2518, 757,1162,1878,1616,3412, # 3238 + 287,1577,2115, 768,4309,1671,2854,3511,2519,1321,3737, 909,2413,7348,4069, 933, # 3254 +3738,7349,2052,2356,1222,4310, 765,2414,1322, 786,4311,7350,1919,1462,1677,2895, # 3270 +1699,7351,4312,1424,2437,3115,3624,2590,3316,1774,1940,3413,3880,4070, 309,1369, # 3286 +1130,2812, 364,2230,1653,1299,3881,3512,3882,3883,2646, 525,1085,3021, 902,2000, # 3302 +1475, 964,4313, 421,1844,1415,1057,2281, 940,1364,3116, 376,4314,4315,1381, 7, # 3318 +2520, 983,2378, 336,1710,2675,1845, 321,3414, 559,1131,3022,2742,1808,1132,1313, # 3334 + 265,1481,1857,7352, 352,1203,2813,3247, 167,1089, 420,2814, 776, 792,1724,3513, # 3350 +4071,2438,3248,7353,4072,7354, 446, 229, 333,2743, 901,3739,1200,1557,4316,2647, # 3366 +1920, 395,2744,2676,3740,4073,1835, 125, 916,3178,2616,4317,7355,7356,3741,7357, # 3382 +7358,7359,4318,3117,3625,1133,2547,1757,3415,1510,2313,1409,3514,7360,2145, 438, # 3398 +2591,2896,2379,3317,1068, 958,3023, 461, 311,2855,2677,4074,1915,3179,4075,1978, # 3414 + 383, 750,2745,2617,4076, 274, 539, 385,1278,1442,7361,1154,1964, 384, 561, 210, # 3430 + 98,1295,2548,3515,7362,1711,2415,1482,3416,3884,2897,1257, 129,7363,3742, 642, # 3446 + 523,2776,2777,2648,7364, 141,2231,1333, 68, 176, 441, 876, 907,4077, 603,2592, # 3462 + 710, 171,3417, 404, 549, 18,3118,2393,1410,3626,1666,7365,3516,4319,2898,4320, # 3478 +7366,2973, 368,7367, 146, 366, 99, 871,3627,1543, 748, 807,1586,1185, 22,2258, # 3494 + 379,3743,3180,7368,3181, 505,1941,2618,1991,1382,2314,7369, 380,2357, 218, 702, # 3510 +1817,1248,3418,3024,3517,3318,3249,7370,2974,3628, 930,3250,3744,7371, 59,7372, # 3526 + 585, 601,4078, 497,3419,1112,1314,4321,1801,7373,1223,1472,2174,7374, 749,1836, # 3542 + 690,1899,3745,1772,3885,1476, 429,1043,1790,2232,2116, 917,4079, 447,1086,1629, # 3558 +7375, 556,7376,7377,2020,1654, 844,1090, 105, 550, 966,1758,2815,1008,1782, 686, # 3574 +1095,7378,2282, 793,1602,7379,3518,2593,4322,4080,2933,2297,4323,3746, 980,2496, # 3590 + 544, 353, 527,4324, 908,2678,2899,7380, 381,2619,1942,1348,7381,1341,1252, 560, # 3606 +3072,7382,3420,2856,7383,2053, 973, 886,2080, 143,4325,7384,7385, 157,3886, 496, # 3622 +4081, 57, 840, 540,2038,4326,4327,3421,2117,1445, 970,2259,1748,1965,2081,4082, # 3638 +3119,1234,1775,3251,2816,3629, 773,1206,2129,1066,2039,1326,3887,1738,1725,4083, # 3654 + 279,3120, 51,1544,2594, 423,1578,2130,2066, 173,4328,1879,7386,7387,1583, 264, # 3670 + 610,3630,4329,2439, 280, 154,7388,7389,7390,1739, 338,1282,3073, 693,2857,1411, # 3686 +1074,3747,2440,7391,4330,7392,7393,1240, 952,2394,7394,2900,1538,2679, 685,1483, # 3702 +4084,2468,1436, 953,4085,2054,4331, 671,2395, 79,4086,2441,3252, 608, 567,2680, # 3718 +3422,4087,4088,1691, 393,1261,1791,2396,7395,4332,7396,7397,7398,7399,1383,1672, # 3734 +3748,3182,1464, 522,1119, 661,1150, 216, 675,4333,3888,1432,3519, 609,4334,2681, # 3750 +2397,7400,7401,7402,4089,3025, 0,7403,2469, 315, 231,2442, 301,3319,4335,2380, # 3766 +7404, 233,4090,3631,1818,4336,4337,7405, 96,1776,1315,2082,7406, 257,7407,1809, # 3782 +3632,2709,1139,1819,4091,2021,1124,2163,2778,1777,2649,7408,3074, 363,1655,3183, # 3798 +7409,2975,7410,7411,7412,3889,1567,3890, 718, 103,3184, 849,1443, 341,3320,2934, # 3814 +1484,7413,1712, 127, 67, 339,4092,2398, 679,1412, 821,7414,7415, 834, 738, 351, # 3830 +2976,2146, 846, 235,1497,1880, 418,1992,3749,2710, 186,1100,2147,2746,3520,1545, # 3846 +1355,2935,2858,1377, 583,3891,4093,2573,2977,7416,1298,3633,1078,2549,3634,2358, # 3862 + 78,3750,3751, 267,1289,2099,2001,1594,4094, 348, 369,1274,2194,2175,1837,4338, # 3878 +1820,2817,3635,2747,2283,2002,4339,2936,2748, 144,3321, 882,4340,3892,2749,3423, # 3894 +4341,2901,7417,4095,1726, 320,7418,3893,3026, 788,2978,7419,2818,1773,1327,2859, # 3910 +3894,2819,7420,1306,4342,2003,1700,3752,3521,2359,2650, 787,2022, 506, 824,3636, # 3926 + 534, 323,4343,1044,3322,2023,1900, 946,3424,7421,1778,1500,1678,7422,1881,4344, # 3942 + 165, 243,4345,3637,2521, 123, 683,4096, 764,4346, 36,3895,1792, 589,2902, 816, # 3958 + 626,1667,3027,2233,1639,1555,1622,3753,3896,7423,3897,2860,1370,1228,1932, 891, # 3974 +2083,2903, 304,4097,7424, 292,2979,2711,3522, 691,2100,4098,1115,4347, 118, 662, # 3990 +7425, 611,1156, 854,2381,1316,2861, 2, 386, 515,2904,7426,7427,3253, 868,2234, # 4006 +1486, 855,2651, 785,2212,3028,7428,1040,3185,3523,7429,3121, 448,7430,1525,7431, # 4022 +2164,4348,7432,3754,7433,4099,2820,3524,3122, 503, 818,3898,3123,1568, 814, 676, # 4038 +1444, 306,1749,7434,3755,1416,1030, 197,1428, 805,2821,1501,4349,7435,7436,7437, # 4054 +1993,7438,4350,7439,7440,2195, 13,2779,3638,2980,3124,1229,1916,7441,3756,2131, # 4070 +7442,4100,4351,2399,3525,7443,2213,1511,1727,1120,7444,7445, 646,3757,2443, 307, # 4086 +7446,7447,1595,3186,7448,7449,7450,3639,1113,1356,3899,1465,2522,2523,7451, 519, # 4102 +7452, 128,2132, 92,2284,1979,7453,3900,1512, 342,3125,2196,7454,2780,2214,1980, # 4118 +3323,7455, 290,1656,1317, 789, 827,2360,7456,3758,4352, 562, 581,3901,7457, 401, # 4134 +4353,2248, 94,4354,1399,2781,7458,1463,2024,4355,3187,1943,7459, 828,1105,4101, # 4150 +1262,1394,7460,4102, 605,4356,7461,1783,2862,7462,2822, 819,2101, 578,2197,2937, # 4166 +7463,1502, 436,3254,4103,3255,2823,3902,2905,3425,3426,7464,2712,2315,7465,7466, # 4182 +2332,2067, 23,4357, 193, 826,3759,2102, 699,1630,4104,3075, 390,1793,1064,3526, # 4198 +7467,1579,3076,3077,1400,7468,4105,1838,1640,2863,7469,4358,4359, 137,4106, 598, # 4214 +3078,1966, 780, 104, 974,2938,7470, 278, 899, 253, 402, 572, 504, 493,1339,7471, # 4230 +3903,1275,4360,2574,2550,7472,3640,3029,3079,2249, 565,1334,2713, 863, 41,7473, # 4246 +7474,4361,7475,1657,2333, 19, 463,2750,4107, 606,7476,2981,3256,1087,2084,1323, # 4262 +2652,2982,7477,1631,1623,1750,4108,2682,7478,2864, 791,2714,2653,2334, 232,2416, # 4278 +7479,2983,1498,7480,2654,2620, 755,1366,3641,3257,3126,2025,1609, 119,1917,3427, # 4294 + 862,1026,4109,7481,3904,3760,4362,3905,4363,2260,1951,2470,7482,1125, 817,4110, # 4310 +4111,3906,1513,1766,2040,1487,4112,3030,3258,2824,3761,3127,7483,7484,1507,7485, # 4326 +2683, 733, 40,1632,1106,2865, 345,4113, 841,2524, 230,4364,2984,1846,3259,3428, # 4342 +7486,1263, 986,3429,7487, 735, 879, 254,1137, 857, 622,1300,1180,1388,1562,3907, # 4358 +3908,2939, 967,2751,2655,1349, 592,2133,1692,3324,2985,1994,4114,1679,3909,1901, # 4374 +2185,7488, 739,3642,2715,1296,1290,7489,4115,2198,2199,1921,1563,2595,2551,1870, # 4390 +2752,2986,7490, 435,7491, 343,1108, 596, 17,1751,4365,2235,3430,3643,7492,4366, # 4406 + 294,3527,2940,1693, 477, 979, 281,2041,3528, 643,2042,3644,2621,2782,2261,1031, # 4422 +2335,2134,2298,3529,4367, 367,1249,2552,7493,3530,7494,4368,1283,3325,2004, 240, # 4438 +1762,3326,4369,4370, 836,1069,3128, 474,7495,2148,2525, 268,3531,7496,3188,1521, # 4454 +1284,7497,1658,1546,4116,7498,3532,3533,7499,4117,3327,2684,1685,4118, 961,1673, # 4470 +2622, 190,2005,2200,3762,4371,4372,7500, 570,2497,3645,1490,7501,4373,2623,3260, # 4486 +1956,4374, 584,1514, 396,1045,1944,7502,4375,1967,2444,7503,7504,4376,3910, 619, # 4502 +7505,3129,3261, 215,2006,2783,2553,3189,4377,3190,4378, 763,4119,3763,4379,7506, # 4518 +7507,1957,1767,2941,3328,3646,1174, 452,1477,4380,3329,3130,7508,2825,1253,2382, # 4534 +2186,1091,2285,4120, 492,7509, 638,1169,1824,2135,1752,3911, 648, 926,1021,1324, # 4550 +4381, 520,4382, 997, 847,1007, 892,4383,3764,2262,1871,3647,7510,2400,1784,4384, # 4566 +1952,2942,3080,3191,1728,4121,2043,3648,4385,2007,1701,3131,1551, 30,2263,4122, # 4582 +7511,2026,4386,3534,7512, 501,7513,4123, 594,3431,2165,1821,3535,3432,3536,3192, # 4598 + 829,2826,4124,7514,1680,3132,1225,4125,7515,3262,4387,4126,3133,2336,7516,4388, # 4614 +4127,7517,3912,3913,7518,1847,2383,2596,3330,7519,4389, 374,3914, 652,4128,4129, # 4630 + 375,1140, 798,7520,7521,7522,2361,4390,2264, 546,1659, 138,3031,2445,4391,7523, # 4646 +2250, 612,1848, 910, 796,3765,1740,1371, 825,3766,3767,7524,2906,2554,7525, 692, # 4662 + 444,3032,2624, 801,4392,4130,7526,1491, 244,1053,3033,4131,4132, 340,7527,3915, # 4678 +1041,2987, 293,1168, 87,1357,7528,1539, 959,7529,2236, 721, 694,4133,3768, 219, # 4694 +1478, 644,1417,3331,2656,1413,1401,1335,1389,3916,7530,7531,2988,2362,3134,1825, # 4710 + 730,1515, 184,2827, 66,4393,7532,1660,2943, 246,3332, 378,1457, 226,3433, 975, # 4726 +3917,2944,1264,3537, 674, 696,7533, 163,7534,1141,2417,2166, 713,3538,3333,4394, # 4742 +3918,7535,7536,1186, 15,7537,1079,1070,7538,1522,3193,3539, 276,1050,2716, 758, # 4758 +1126, 653,2945,3263,7539,2337, 889,3540,3919,3081,2989, 903,1250,4395,3920,3434, # 4774 +3541,1342,1681,1718, 766,3264, 286, 89,2946,3649,7540,1713,7541,2597,3334,2990, # 4790 +7542,2947,2215,3194,2866,7543,4396,2498,2526, 181, 387,1075,3921, 731,2187,3335, # 4806 +7544,3265, 310, 313,3435,2299, 770,4134, 54,3034, 189,4397,3082,3769,3922,7545, # 4822 +1230,1617,1849, 355,3542,4135,4398,3336, 111,4136,3650,1350,3135,3436,3035,4137, # 4838 +2149,3266,3543,7546,2784,3923,3924,2991, 722,2008,7547,1071, 247,1207,2338,2471, # 4854 +1378,4399,2009, 864,1437,1214,4400, 373,3770,1142,2216, 667,4401, 442,2753,2555, # 4870 +3771,3925,1968,4138,3267,1839, 837, 170,1107, 934,1336,1882,7548,7549,2118,4139, # 4886 +2828, 743,1569,7550,4402,4140, 582,2384,1418,3437,7551,1802,7552, 357,1395,1729, # 4902 +3651,3268,2418,1564,2237,7553,3083,3772,1633,4403,1114,2085,4141,1532,7554, 482, # 4918 +2446,4404,7555,7556,1492, 833,1466,7557,2717,3544,1641,2829,7558,1526,1272,3652, # 4934 +4142,1686,1794, 416,2556,1902,1953,1803,7559,3773,2785,3774,1159,2316,7560,2867, # 4950 +4405,1610,1584,3036,2419,2754, 443,3269,1163,3136,7561,7562,3926,7563,4143,2499, # 4966 +3037,4406,3927,3137,2103,1647,3545,2010,1872,4144,7564,4145, 431,3438,7565, 250, # 4982 + 97, 81,4146,7566,1648,1850,1558, 160, 848,7567, 866, 740,1694,7568,2201,2830, # 4998 +3195,4147,4407,3653,1687, 950,2472, 426, 469,3196,3654,3655,3928,7569,7570,1188, # 5014 + 424,1995, 861,3546,4148,3775,2202,2685, 168,1235,3547,4149,7571,2086,1674,4408, # 5030 +3337,3270, 220,2557,1009,7572,3776, 670,2992, 332,1208, 717,7573,7574,3548,2447, # 5046 +3929,3338,7575, 513,7576,1209,2868,3339,3138,4409,1080,7577,7578,7579,7580,2527, # 5062 +3656,3549, 815,1587,3930,3931,7581,3550,3439,3777,1254,4410,1328,3038,1390,3932, # 5078 +1741,3933,3778,3934,7582, 236,3779,2448,3271,7583,7584,3657,3780,1273,3781,4411, # 5094 +7585, 308,7586,4412, 245,4413,1851,2473,1307,2575, 430, 715,2136,2449,7587, 270, # 5110 + 199,2869,3935,7588,3551,2718,1753, 761,1754, 725,1661,1840,4414,3440,3658,7589, # 5126 +7590, 587, 14,3272, 227,2598, 326, 480,2265, 943,2755,3552, 291, 650,1883,7591, # 5142 +1702,1226, 102,1547, 62,3441, 904,4415,3442,1164,4150,7592,7593,1224,1548,2756, # 5158 + 391, 498,1493,7594,1386,1419,7595,2055,1177,4416, 813, 880,1081,2363, 566,1145, # 5174 +4417,2286,1001,1035,2558,2599,2238, 394,1286,7596,7597,2068,7598, 86,1494,1730, # 5190 +3936, 491,1588, 745, 897,2948, 843,3340,3937,2757,2870,3273,1768, 998,2217,2069, # 5206 + 397,1826,1195,1969,3659,2993,3341, 284,7599,3782,2500,2137,2119,1903,7600,3938, # 5222 +2150,3939,4151,1036,3443,1904, 114,2559,4152, 209,1527,7601,7602,2949,2831,2625, # 5238 +2385,2719,3139, 812,2560,7603,3274,7604,1559, 737,1884,3660,1210, 885, 28,2686, # 5254 +3553,3783,7605,4153,1004,1779,4418,7606, 346,1981,2218,2687,4419,3784,1742, 797, # 5270 +1642,3940,1933,1072,1384,2151, 896,3941,3275,3661,3197,2871,3554,7607,2561,1958, # 5286 +4420,2450,1785,7608,7609,7610,3942,4154,1005,1308,3662,4155,2720,4421,4422,1528, # 5302 +2600, 161,1178,4156,1982, 987,4423,1101,4157, 631,3943,1157,3198,2420,1343,1241, # 5318 +1016,2239,2562, 372, 877,2339,2501,1160, 555,1934, 911,3944,7611, 466,1170, 169, # 5334 +1051,2907,2688,3663,2474,2994,1182,2011,2563,1251,2626,7612, 992,2340,3444,1540, # 5350 +2721,1201,2070,2401,1996,2475,7613,4424, 528,1922,2188,1503,1873,1570,2364,3342, # 5366 +3276,7614, 557,1073,7615,1827,3445,2087,2266,3140,3039,3084, 767,3085,2786,4425, # 5382 +1006,4158,4426,2341,1267,2176,3664,3199, 778,3945,3200,2722,1597,2657,7616,4427, # 5398 +7617,3446,7618,7619,7620,3277,2689,1433,3278, 131, 95,1504,3946, 723,4159,3141, # 5414 +1841,3555,2758,2189,3947,2027,2104,3665,7621,2995,3948,1218,7622,3343,3201,3949, # 5430 +4160,2576, 248,1634,3785, 912,7623,2832,3666,3040,3786, 654, 53,7624,2996,7625, # 5446 +1688,4428, 777,3447,1032,3950,1425,7626, 191, 820,2120,2833, 971,4429, 931,3202, # 5462 + 135, 664, 783,3787,1997, 772,2908,1935,3951,3788,4430,2909,3203, 282,2723, 640, # 5478 +1372,3448,1127, 922, 325,3344,7627,7628, 711,2044,7629,7630,3952,2219,2787,1936, # 5494 +3953,3345,2220,2251,3789,2300,7631,4431,3790,1258,3279,3954,3204,2138,2950,3955, # 5510 +3956,7632,2221, 258,3205,4432, 101,1227,7633,3280,1755,7634,1391,3281,7635,2910, # 5526 +2056, 893,7636,7637,7638,1402,4161,2342,7639,7640,3206,3556,7641,7642, 878,1325, # 5542 +1780,2788,4433, 259,1385,2577, 744,1183,2267,4434,7643,3957,2502,7644, 684,1024, # 5558 +4162,7645, 472,3557,3449,1165,3282,3958,3959, 322,2152, 881, 455,1695,1152,1340, # 5574 + 660, 554,2153,4435,1058,4436,4163, 830,1065,3346,3960,4437,1923,7646,1703,1918, # 5590 +7647, 932,2268, 122,7648,4438, 947, 677,7649,3791,2627, 297,1905,1924,2269,4439, # 5606 +2317,3283,7650,7651,4164,7652,4165, 84,4166, 112, 989,7653, 547,1059,3961, 701, # 5622 +3558,1019,7654,4167,7655,3450, 942, 639, 457,2301,2451, 993,2951, 407, 851, 494, # 5638 +4440,3347, 927,7656,1237,7657,2421,3348, 573,4168, 680, 921,2911,1279,1874, 285, # 5654 + 790,1448,1983, 719,2167,7658,7659,4441,3962,3963,1649,7660,1541, 563,7661,1077, # 5670 +7662,3349,3041,3451, 511,2997,3964,3965,3667,3966,1268,2564,3350,3207,4442,4443, # 5686 +7663, 535,1048,1276,1189,2912,2028,3142,1438,1373,2834,2952,1134,2012,7664,4169, # 5702 +1238,2578,3086,1259,7665, 700,7666,2953,3143,3668,4170,7667,4171,1146,1875,1906, # 5718 +4444,2601,3967, 781,2422, 132,1589, 203, 147, 273,2789,2402, 898,1786,2154,3968, # 5734 +3969,7668,3792,2790,7669,7670,4445,4446,7671,3208,7672,1635,3793, 965,7673,1804, # 5750 +2690,1516,3559,1121,1082,1329,3284,3970,1449,3794, 65,1128,2835,2913,2759,1590, # 5766 +3795,7674,7675, 12,2658, 45, 976,2579,3144,4447, 517,2528,1013,1037,3209,7676, # 5782 +3796,2836,7677,3797,7678,3452,7679,2602, 614,1998,2318,3798,3087,2724,2628,7680, # 5798 +2580,4172, 599,1269,7681,1810,3669,7682,2691,3088, 759,1060, 489,1805,3351,3285, # 5814 +1358,7683,7684,2386,1387,1215,2629,2252, 490,7685,7686,4173,1759,2387,2343,7687, # 5830 +4448,3799,1907,3971,2630,1806,3210,4449,3453,3286,2760,2344, 874,7688,7689,3454, # 5846 +3670,1858, 91,2914,3671,3042,3800,4450,7690,3145,3972,2659,7691,3455,1202,1403, # 5862 +3801,2954,2529,1517,2503,4451,3456,2504,7692,4452,7693,2692,1885,1495,1731,3973, # 5878 +2365,4453,7694,2029,7695,7696,3974,2693,1216, 237,2581,4174,2319,3975,3802,4454, # 5894 +4455,2694,3560,3457, 445,4456,7697,7698,7699,7700,2761, 61,3976,3672,1822,3977, # 5910 +7701, 687,2045, 935, 925, 405,2660, 703,1096,1859,2725,4457,3978,1876,1367,2695, # 5926 +3352, 918,2105,1781,2476, 334,3287,1611,1093,4458, 564,3146,3458,3673,3353, 945, # 5942 +2631,2057,4459,7702,1925, 872,4175,7703,3459,2696,3089, 349,4176,3674,3979,4460, # 5958 +3803,4177,3675,2155,3980,4461,4462,4178,4463,2403,2046, 782,3981, 400, 251,4179, # 5974 +1624,7704,7705, 277,3676, 299,1265, 476,1191,3804,2121,4180,4181,1109, 205,7706, # 5990 +2582,1000,2156,3561,1860,7707,7708,7709,4464,7710,4465,2565, 107,2477,2157,3982, # 6006 +3460,3147,7711,1533, 541,1301, 158, 753,4182,2872,3562,7712,1696, 370,1088,4183, # 6022 +4466,3563, 579, 327, 440, 162,2240, 269,1937,1374,3461, 968,3043, 56,1396,3090, # 6038 +2106,3288,3354,7713,1926,2158,4467,2998,7714,3564,7715,7716,3677,4468,2478,7717, # 6054 +2791,7718,1650,4469,7719,2603,7720,7721,3983,2661,3355,1149,3356,3984,3805,3985, # 6070 +7722,1076, 49,7723, 951,3211,3289,3290, 450,2837, 920,7724,1811,2792,2366,4184, # 6086 +1908,1138,2367,3806,3462,7725,3212,4470,1909,1147,1518,2423,4471,3807,7726,4472, # 6102 +2388,2604, 260,1795,3213,7727,7728,3808,3291, 708,7729,3565,1704,7730,3566,1351, # 6118 +1618,3357,2999,1886, 944,4185,3358,4186,3044,3359,4187,7731,3678, 422, 413,1714, # 6134 +3292, 500,2058,2345,4188,2479,7732,1344,1910, 954,7733,1668,7734,7735,3986,2404, # 6150 +4189,3567,3809,4190,7736,2302,1318,2505,3091, 133,3092,2873,4473, 629, 31,2838, # 6166 +2697,3810,4474, 850, 949,4475,3987,2955,1732,2088,4191,1496,1852,7737,3988, 620, # 6182 +3214, 981,1242,3679,3360,1619,3680,1643,3293,2139,2452,1970,1719,3463,2168,7738, # 6198 +3215,7739,7740,3361,1828,7741,1277,4476,1565,2047,7742,1636,3568,3093,7743, 869, # 6214 +2839, 655,3811,3812,3094,3989,3000,3813,1310,3569,4477,7744,7745,7746,1733, 558, # 6230 +4478,3681, 335,1549,3045,1756,4192,3682,1945,3464,1829,1291,1192, 470,2726,2107, # 6246 +2793, 913,1054,3990,7747,1027,7748,3046,3991,4479, 982,2662,3362,3148,3465,3216, # 6262 +3217,1946,2794,7749, 571,4480,7750,1830,7751,3570,2583,1523,2424,7752,2089, 984, # 6278 +4481,3683,1959,7753,3684, 852, 923,2795,3466,3685, 969,1519, 999,2048,2320,1705, # 6294 +7754,3095, 615,1662, 151, 597,3992,2405,2321,1049, 275,4482,3686,4193, 568,3687, # 6310 +3571,2480,4194,3688,7755,2425,2270, 409,3218,7756,1566,2874,3467,1002, 769,2840, # 6326 + 194,2090,3149,3689,2222,3294,4195, 628,1505,7757,7758,1763,2177,3001,3993, 521, # 6342 +1161,2584,1787,2203,2406,4483,3994,1625,4196,4197, 412, 42,3096, 464,7759,2632, # 6358 +4484,3363,1760,1571,2875,3468,2530,1219,2204,3814,2633,2140,2368,4485,4486,3295, # 6374 +1651,3364,3572,7760,7761,3573,2481,3469,7762,3690,7763,7764,2271,2091, 460,7765, # 6390 +4487,7766,3002, 962, 588,3574, 289,3219,2634,1116, 52,7767,3047,1796,7768,7769, # 6406 +7770,1467,7771,1598,1143,3691,4198,1984,1734,1067,4488,1280,3365, 465,4489,1572, # 6422 + 510,7772,1927,2241,1812,1644,3575,7773,4490,3692,7774,7775,2663,1573,1534,7776, # 6438 +7777,4199, 536,1807,1761,3470,3815,3150,2635,7778,7779,7780,4491,3471,2915,1911, # 6454 +2796,7781,3296,1122, 377,3220,7782, 360,7783,7784,4200,1529, 551,7785,2059,3693, # 6470 +1769,2426,7786,2916,4201,3297,3097,2322,2108,2030,4492,1404, 136,1468,1479, 672, # 6486 +1171,3221,2303, 271,3151,7787,2762,7788,2049, 678,2727, 865,1947,4493,7789,2013, # 6502 +3995,2956,7790,2728,2223,1397,3048,3694,4494,4495,1735,2917,3366,3576,7791,3816, # 6518 + 509,2841,2453,2876,3817,7792,7793,3152,3153,4496,4202,2531,4497,2304,1166,1010, # 6534 + 552, 681,1887,7794,7795,2957,2958,3996,1287,1596,1861,3154, 358, 453, 736, 175, # 6550 + 478,1117, 905,1167,1097,7796,1853,1530,7797,1706,7798,2178,3472,2287,3695,3473, # 6566 +3577,4203,2092,4204,7799,3367,1193,2482,4205,1458,2190,2205,1862,1888,1421,3298, # 6582 +2918,3049,2179,3474, 595,2122,7800,3997,7801,7802,4206,1707,2636, 223,3696,1359, # 6598 + 751,3098, 183,3475,7803,2797,3003, 419,2369, 633, 704,3818,2389, 241,7804,7805, # 6614 +7806, 838,3004,3697,2272,2763,2454,3819,1938,2050,3998,1309,3099,2242,1181,7807, # 6630 +1136,2206,3820,2370,1446,4207,2305,4498,7808,7809,4208,1055,2605, 484,3698,7810, # 6646 +3999, 625,4209,2273,3368,1499,4210,4000,7811,4001,4211,3222,2274,2275,3476,7812, # 6662 +7813,2764, 808,2606,3699,3369,4002,4212,3100,2532, 526,3370,3821,4213, 955,7814, # 6678 +1620,4214,2637,2427,7815,1429,3700,1669,1831, 994, 928,7816,3578,1260,7817,7818, # 6694 +7819,1948,2288, 741,2919,1626,4215,2729,2455, 867,1184, 362,3371,1392,7820,7821, # 6710 +4003,4216,1770,1736,3223,2920,4499,4500,1928,2698,1459,1158,7822,3050,3372,2877, # 6726 +1292,1929,2506,2842,3701,1985,1187,2071,2014,2607,4217,7823,2566,2507,2169,3702, # 6742 +2483,3299,7824,3703,4501,7825,7826, 666,1003,3005,1022,3579,4218,7827,4502,1813, # 6758 +2253, 574,3822,1603, 295,1535, 705,3823,4219, 283, 858, 417,7828,7829,3224,4503, # 6774 +4504,3051,1220,1889,1046,2276,2456,4004,1393,1599, 689,2567, 388,4220,7830,2484, # 6790 + 802,7831,2798,3824,2060,1405,2254,7832,4505,3825,2109,1052,1345,3225,1585,7833, # 6806 + 809,7834,7835,7836, 575,2730,3477, 956,1552,1469,1144,2323,7837,2324,1560,2457, # 6822 +3580,3226,4005, 616,2207,3155,2180,2289,7838,1832,7839,3478,4506,7840,1319,3704, # 6838 +3705,1211,3581,1023,3227,1293,2799,7841,7842,7843,3826, 607,2306,3827, 762,2878, # 6854 +1439,4221,1360,7844,1485,3052,7845,4507,1038,4222,1450,2061,2638,4223,1379,4508, # 6870 +2585,7846,7847,4224,1352,1414,2325,2921,1172,7848,7849,3828,3829,7850,1797,1451, # 6886 +7851,7852,7853,7854,2922,4006,4007,2485,2346, 411,4008,4009,3582,3300,3101,4509, # 6902 +1561,2664,1452,4010,1375,7855,7856, 47,2959, 316,7857,1406,1591,2923,3156,7858, # 6918 +1025,2141,3102,3157, 354,2731, 884,2224,4225,2407, 508,3706, 726,3583, 996,2428, # 6934 +3584, 729,7859, 392,2191,1453,4011,4510,3707,7860,7861,2458,3585,2608,1675,2800, # 6950 + 919,2347,2960,2348,1270,4511,4012, 73,7862,7863, 647,7864,3228,2843,2255,1550, # 6966 +1346,3006,7865,1332, 883,3479,7866,7867,7868,7869,3301,2765,7870,1212, 831,1347, # 6982 +4226,4512,2326,3830,1863,3053, 720,3831,4513,4514,3832,7871,4227,7872,7873,4515, # 6998 +7874,7875,1798,4516,3708,2609,4517,3586,1645,2371,7876,7877,2924, 669,2208,2665, # 7014 +2429,7878,2879,7879,7880,1028,3229,7881,4228,2408,7882,2256,1353,7883,7884,4518, # 7030 +3158, 518,7885,4013,7886,4229,1960,7887,2142,4230,7888,7889,3007,2349,2350,3833, # 7046 + 516,1833,1454,4014,2699,4231,4519,2225,2610,1971,1129,3587,7890,2766,7891,2961, # 7062 +1422, 577,1470,3008,1524,3373,7892,7893, 432,4232,3054,3480,7894,2586,1455,2508, # 7078 +2226,1972,1175,7895,1020,2732,4015,3481,4520,7896,2733,7897,1743,1361,3055,3482, # 7094 +2639,4016,4233,4521,2290, 895, 924,4234,2170, 331,2243,3056, 166,1627,3057,1098, # 7110 +7898,1232,2880,2227,3374,4522, 657, 403,1196,2372, 542,3709,3375,1600,4235,3483, # 7126 +7899,4523,2767,3230, 576, 530,1362,7900,4524,2533,2666,3710,4017,7901, 842,3834, # 7142 +7902,2801,2031,1014,4018, 213,2700,3376, 665, 621,4236,7903,3711,2925,2430,7904, # 7158 +2431,3302,3588,3377,7905,4237,2534,4238,4525,3589,1682,4239,3484,1380,7906, 724, # 7174 +2277, 600,1670,7907,1337,1233,4526,3103,2244,7908,1621,4527,7909, 651,4240,7910, # 7190 +1612,4241,2611,7911,2844,7912,2734,2307,3058,7913, 716,2459,3059, 174,1255,2701, # 7206 +4019,3590, 548,1320,1398, 728,4020,1574,7914,1890,1197,3060,4021,7915,3061,3062, # 7222 +3712,3591,3713, 747,7916, 635,4242,4528,7917,7918,7919,4243,7920,7921,4529,7922, # 7238 +3378,4530,2432, 451,7923,3714,2535,2072,4244,2735,4245,4022,7924,1764,4531,7925, # 7254 +4246, 350,7926,2278,2390,2486,7927,4247,4023,2245,1434,4024, 488,4532, 458,4248, # 7270 +4025,3715, 771,1330,2391,3835,2568,3159,2159,2409,1553,2667,3160,4249,7928,2487, # 7286 +2881,2612,1720,2702,4250,3379,4533,7929,2536,4251,7930,3231,4252,2768,7931,2015, # 7302 +2736,7932,1155,1017,3716,3836,7933,3303,2308, 201,1864,4253,1430,7934,4026,7935, # 7318 +7936,7937,7938,7939,4254,1604,7940, 414,1865, 371,2587,4534,4535,3485,2016,3104, # 7334 +4536,1708, 960,4255, 887, 389,2171,1536,1663,1721,7941,2228,4027,2351,2926,1580, # 7350 +7942,7943,7944,1744,7945,2537,4537,4538,7946,4539,7947,2073,7948,7949,3592,3380, # 7366 +2882,4256,7950,4257,2640,3381,2802, 673,2703,2460, 709,3486,4028,3593,4258,7951, # 7382 +1148, 502, 634,7952,7953,1204,4540,3594,1575,4541,2613,3717,7954,3718,3105, 948, # 7398 +3232, 121,1745,3837,1110,7955,4259,3063,2509,3009,4029,3719,1151,1771,3838,1488, # 7414 +4030,1986,7956,2433,3487,7957,7958,2093,7959,4260,3839,1213,1407,2803, 531,2737, # 7430 +2538,3233,1011,1537,7960,2769,4261,3106,1061,7961,3720,3721,1866,2883,7962,2017, # 7446 + 120,4262,4263,2062,3595,3234,2309,3840,2668,3382,1954,4542,7963,7964,3488,1047, # 7462 +2704,1266,7965,1368,4543,2845, 649,3383,3841,2539,2738,1102,2846,2669,7966,7967, # 7478 +1999,7968,1111,3596,2962,7969,2488,3842,3597,2804,1854,3384,3722,7970,7971,3385, # 7494 +2410,2884,3304,3235,3598,7972,2569,7973,3599,2805,4031,1460, 856,7974,3600,7975, # 7510 +2885,2963,7976,2886,3843,7977,4264, 632,2510, 875,3844,1697,3845,2291,7978,7979, # 7526 +4544,3010,1239, 580,4545,4265,7980, 914, 936,2074,1190,4032,1039,2123,7981,7982, # 7542 +7983,3386,1473,7984,1354,4266,3846,7985,2172,3064,4033, 915,3305,4267,4268,3306, # 7558 +1605,1834,7986,2739, 398,3601,4269,3847,4034, 328,1912,2847,4035,3848,1331,4270, # 7574 +3011, 937,4271,7987,3602,4036,4037,3387,2160,4546,3388, 524, 742, 538,3065,1012, # 7590 +7988,7989,3849,2461,7990, 658,1103, 225,3850,7991,7992,4547,7993,4548,7994,3236, # 7606 +1243,7995,4038, 963,2246,4549,7996,2705,3603,3161,7997,7998,2588,2327,7999,4550, # 7622 +8000,8001,8002,3489,3307, 957,3389,2540,2032,1930,2927,2462, 870,2018,3604,1746, # 7638 +2770,2771,2434,2463,8003,3851,8004,3723,3107,3724,3490,3390,3725,8005,1179,3066, # 7654 +8006,3162,2373,4272,3726,2541,3163,3108,2740,4039,8007,3391,1556,2542,2292, 977, # 7670 +2887,2033,4040,1205,3392,8008,1765,3393,3164,2124,1271,1689, 714,4551,3491,8009, # 7686 +2328,3852, 533,4273,3605,2181, 617,8010,2464,3308,3492,2310,8011,8012,3165,8013, # 7702 +8014,3853,1987, 618, 427,2641,3493,3394,8015,8016,1244,1690,8017,2806,4274,4552, # 7718 +8018,3494,8019,8020,2279,1576, 473,3606,4275,3395, 972,8021,3607,8022,3067,8023, # 7734 +8024,4553,4554,8025,3727,4041,4042,8026, 153,4555, 356,8027,1891,2888,4276,2143, # 7750 + 408, 803,2352,8028,3854,8029,4277,1646,2570,2511,4556,4557,3855,8030,3856,4278, # 7766 +8031,2411,3396, 752,8032,8033,1961,2964,8034, 746,3012,2465,8035,4279,3728, 698, # 7782 +4558,1892,4280,3608,2543,4559,3609,3857,8036,3166,3397,8037,1823,1302,4043,2706, # 7798 +3858,1973,4281,8038,4282,3167, 823,1303,1288,1236,2848,3495,4044,3398, 774,3859, # 7814 +8039,1581,4560,1304,2849,3860,4561,8040,2435,2161,1083,3237,4283,4045,4284, 344, # 7830 +1173, 288,2311, 454,1683,8041,8042,1461,4562,4046,2589,8043,8044,4563, 985, 894, # 7846 +8045,3399,3168,8046,1913,2928,3729,1988,8047,2110,1974,8048,4047,8049,2571,1194, # 7862 + 425,8050,4564,3169,1245,3730,4285,8051,8052,2850,8053, 636,4565,1855,3861, 760, # 7878 +1799,8054,4286,2209,1508,4566,4048,1893,1684,2293,8055,8056,8057,4287,4288,2210, # 7894 + 479,8058,8059, 832,8060,4049,2489,8061,2965,2490,3731, 990,3109, 627,1814,2642, # 7910 +4289,1582,4290,2125,2111,3496,4567,8062, 799,4291,3170,8063,4568,2112,1737,3013, # 7926 +1018, 543, 754,4292,3309,1676,4569,4570,4050,8064,1489,8065,3497,8066,2614,2889, # 7942 +4051,8067,8068,2966,8069,8070,8071,8072,3171,4571,4572,2182,1722,8073,3238,3239, # 7958 +1842,3610,1715, 481, 365,1975,1856,8074,8075,1962,2491,4573,8076,2126,3611,3240, # 7974 + 433,1894,2063,2075,8077, 602,2741,8078,8079,8080,8081,8082,3014,1628,3400,8083, # 7990 +3172,4574,4052,2890,4575,2512,8084,2544,2772,8085,8086,8087,3310,4576,2891,8088, # 8006 +4577,8089,2851,4578,4579,1221,2967,4053,2513,8090,8091,8092,1867,1989,8093,8094, # 8022 +8095,1895,8096,8097,4580,1896,4054, 318,8098,2094,4055,4293,8099,8100, 485,8101, # 8038 + 938,3862, 553,2670, 116,8102,3863,3612,8103,3498,2671,2773,3401,3311,2807,8104, # 8054 +3613,2929,4056,1747,2930,2968,8105,8106, 207,8107,8108,2672,4581,2514,8109,3015, # 8070 + 890,3614,3864,8110,1877,3732,3402,8111,2183,2353,3403,1652,8112,8113,8114, 941, # 8086 +2294, 208,3499,4057,2019, 330,4294,3865,2892,2492,3733,4295,8115,8116,8117,8118, # 8102 +) + diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/euctwfreq 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/euctwfreq 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..92774f91e2a7ac1c6aef4525339238cedfb5e2d8 GIT binary patch literal 54757 zcmeI*Ww%uK(k*b@J;5CU!QI{6-QC?SKp?mW3&Gujy9W;v+}%9{0z^oFE>*fv(&uRF#;xHfWKoEVHT!jlz@rD>m5B{#tOej zFg;wrB#Rv|No1?U44B$T*UKiCc!Td2Zw}I>YP0dGsWnK)HRcGMhv|5VDa0HPwCgy9 z@CmZToqa2u$`lO}1cvKaS>g_}kh!fW!8-}I$2Z+KxK3ez!# zvi&NO3$K85H^LXnrc(gj@f+D6Ow?Mo02$NuI6-cBvwd*(F^DtZ4B5%TL0AU!&M_ge|hM6Z!3{q9?M&9@4D6Uar(xL;m&^(-MIcv%!d(u^C&)e@T z@LCF79%B_!HVZhw8K&cS1eFc=2JUlbBYE3-pTljXWwySzge?%Q9CDBNAD4gnv>_nou0!k=xUys#N*zteILc&f8cwp*81T8}4cOX+b3c$$`Lon1v0 zF{l7871K#scZuvEVP)qLR2@MsA{$G5Z>-zE8)!~%==pFtRlsx~u|4rybM3BrvuHxZt)rfr%Z z*DWPM%Rm~KBZD40BrZBTfhC7-hlQztD`>RQfSZ^!hE6T<0wl8@bCu;(mPTS5Z!ra% zRa8e%UblG~C6jIEEGJcuunZHPru3q-g+XH_k$AaO6a;w<+=a;^ahw;`PQzfn%S#Tt zNbO=~h_Hhx(-Pj(Vrv3dB|N=~wXzLR?a|{87a*-U7Vs`fMAPki-c06_u#@ZqxHE)T z4H7U*^gU@M>4bqj1SS_QmH0x%GTw6LOWDhoa~4ZAxQ+y+AUwb945kuu4kR`84=Ffg z#Sx7#obc-)RjK+Qkr7J`*}8^)sBa>WwagY*W~3dYlh`WU#+=t97056wAJnGeRn+n+ zlbhUQ^v#fsgQXWQ&@Aw}G{RfWrz`tN+FpsS%sT`tf{SoHw#j~C24Fcz?kNNp$XE%t zovKy5cSwIjnoezc!jB-0rYtgo)o?#Bi-ieo<8P21`ljctk^NG|T3!;kFHz0K{N7mE z;5IYsw2bR)9dHGcujgF}W(mJY=@(eiIy>z0lnHhtvLwh`WfNt8mUyJw1}qzyy84z! z5J&a`@4S{V?6juwYY1z@eTj4mZcUS%#>NfKpAnSy#e({cze zk&ALg;t%0?RP~(IKwk%6N_-iGrIm%D<*CH4un-lJWy|iLt!~IU*9wQu5vB8wxot>0z zAdy9*nnXUwH(c#u-~~4H4bte$HL9*N4VWV!lYn>FOJ00sgd3S%1a+~E3Cyp0G{%xj z?N7Wla1AM#0i4cRJZIS~ry-HwAk7q%LHJQE_o}$-GS;H`9`7fK`NAHkjtQrs>LzT> zYfnaIRFP4=)a^@WxrB>N?tA2p7Yy^2vW381XgQ9rEAMZKnKoX?9LIR=h>S+=3An)^ zd4)Id{iso5xO;juqW&DE`*?pM-Nc+!yFem~zDr2kEU`%Vvut5}r+5{SHe_B|>>Di` z<7=Qt8iMZIOH_SNt2iccKw_u?&p7)PK^BnByw1GEy1lfLteB6eScm>I1pi9xL{NsA zN#tv|{UF6anu44~p9SeT-g)K``hK!il$8SRXrlCRKRLT2`=7=BCj3*lUbZ~&1uQT0 zO&lbUz3A*mlc!epz|g-D)Ym5e27c&liLovzJK)NsLfVq%*t|y|6J`5hsjc=B<{==3 zoqb1r8QZulQIz+HsvHQyxKLLln$VH~!Bt^I3Qh-^nN-3lhJLK&HIVDfd}rAR|4qv` zyn@auC`+ctpAjCy=*x8!jiEKK}HjeaF)vmOYx0GbywL7%=dWr znQI_BP2LFPfwMXY!lCbPm~}{h#`n9Sm%+^w?o#%Lvq%Q~1@l7S#vs*c{!@0Ga4UT+ zWb-ovFgJ7Y{sMW=%++$7iGHQ(KVcKK52<>I{t@pn^MrZIw5Me(@G_%z(`cu&Xc{#~ zHIp}#ca5s0!e8;_(D!@b{j{`{cqK8AzNVT#)8jewg85s;c^e8a1%`IE9Ii0oPo0ey zW)=QL%WHg9oV^TEf&7CdJGn{R48MWAVSWW^0rH!P(vp_Oc3(+^Mf#c-S6L1OGb!zD zwxrHJV1CSNH;OruIbk zP*&4@u$0oe_})9~hvk&BKM-tG`?ZSFOl`Q2sG8Z!N_-=M^P>7w#a~P*;RD&`Di$Ga zWuj^lzo5FVtbuu#fE?#7x0mmXx*Md5MYLA7+t~qEIx0bx)%Hi4iD@Y;uUl@?J~1&> zES7ywP&|;F=<^}{gZf;-kXKE&6~dKFbb_L)$gTN#(hBMOFXkq)J(+({O#}Iw$qM(@ z&5(>2R`cBW_R#VR$OVaaAOmFgN_?yN-*(^2a(mSzQ%>8|FXR9|40sjc2Q|-cLyc(p4D%C^ zfAlRN%mbIe?n^uS3(M#B@{ft00(W6H1Gm8UNz1o-+|qY4?_XyP;oc)yZYA%6dlBZ< z<2o5%Ia{M!7>SR(e|TR=p0tw#X_|It#A zmj$>Hk*7>F5%X90(jurIq&IX}3c@50m@kA&C1zRJA@gq0JdcWSaE(!Y;Ps>VJK3;m zTk}TB*3+Y^dB4y+E51N7@Oct_c(?|^GiBkKZI<0e*=~)_D621QOh#PZGKovdBB+R? zQBP%uiHzthr|^Itk%WI>iOlPx_9M+vgg@9-R9<*z5s)6ik_*9K2y$sz$P#lqOJ&8` zf-;=A9u-r!1l#w}qdyjIJUE6O%dN%EaRRD;t{^hnY@z zKw01`wngOAV;QPERGrpnu-dr5Yh`Pzh$oDI>OZErOL5eIpGhnSc}mNE>RVv>Tp~U* z+JNg&O;DEGlnEpfGKE$2(matcF_VPJuc9HUDwqpf-7ek@EH{~?aFNj`;|()b9a@_3 zUh?)BCb?`81kVuEqad%AGeAF>T&xW!9q!@Cw!0;clQWAZ!L#gn36$J&A%Q-$hV9=DCem z)UrRSA;Q+KZ!_J((HxVOg7`|<=|%+6ETW_^I`5LP7OGuAOCjL4YI9zl=3w*VLE!8%3J>nv*NWm?t zp1{Q*cNIuJ&G(>hW8Pv&Un97oqOG&y&hF~b-PykgdV(|*c9Zy=pn1-^@RE>G+LUFO zuQWOayr10WOj)=ZYU|qCJQW|wSPguVs(6G?ktmC$tFv*yC4xIpTgYh>UQXE}u_ zD5D~lM0#b%BnBg$uj00|i^fmP`&-}RAR{pUBP@cYC@puG%jhF(o|4jf!he_(%3^EO z9o2o1_aJ2{I4N6>7Y8J~ZG5uROM3ifga-uu>ntuvJf;k3Sy2^`xPiGmmNr`6Mjyl3 z&*&>i^nrVWJ_1wG*&xi(n9uFLlCx7PPBWE-@g@FKJJ^&nffG18NWnN^F^L~3y-f4> z6l}Jf&nW$zse-DI)g2_QsO$wYss?+26vwhxqh(kUIIE!I1>8i##5eEvvelF&1lb^* zh_t%18cZUIa_+y*2x>Yjh(5PF;P3o)`s@lwQ z1W%1W#7z^%!ivFtN8}N5j}o3tSyc{_ zQ)yWr-h$Fm!huYFrYlp0 zf=);~Gi%8xWZq(~bZQH`f$A6Fo#>;3l;UMHbQfiV>HAvZPl*Ux4l>LpWe=SB#;4<1 zBUIIL81QdKJuk6DkDW|cd`ney1NUH-s0bVd%7poa z*_d9!w*(C|+eHMQ6PZMIo(=tpzMXIqZ#a?rfqSb>O~ybYTvA(I->9m z8nT_>E;GgSooY?nnSaqAP@95+hU9*OrKHQ)N4HIIeR=6fi-cu8NIz#Icq^@B5SCoR z{t{Un50jf+SQh;cWYk8rLRdhzMzVt`9m15;BeU8V zhIy)6YD*j{n@is;vgIUd=sO-uS1b7%BpSY9ytef9mOY4|G<`=1>ZL51vwgY^2aYbW z7o?>`ZjBmInhqqZmLE}l1N;EG4sIZo%DLr+j!f;Ud>c&47qIDwa)s>8}|BgluezHCVq`7NhA`s)U~L0=6fhq8$Xa`HCl z)(vEmvwz$NEt#53E|AF*Jx~=wkbt*HwuW_1k!{6$hqxAuVRkALu_&tkr!3m z1j!3B9ZPzU@e~vwD5~sF`rcCUiJ&)_X8<2Sy1;B34O2z)ok&kRn+ftAa|_E9wGC;G zCY&V^7VdlAE@gSJM3*h4WkCuGNX!PA!^~yoF?aD*py0NO>{R6@ypbM_nfY*cWV`Hq&|cuiECM$nXZ2)G$<0hX7>KkV#VeUH(%P+}2NQQ`>mH~OQz!g?&0 z&0{Z1ctxE3fvPC4unV;sUs4KUyE5y8SI}M>xD-=mm#U2=aZGJqnwyihOyaKD7O1^W z{oiVD@GkR)@N#HWOv@g?mFQcpb_G)zE^rk1w$E4(dFk<$)AAm3ot6z&d|2Whmb4P% z)iy@IGRUXfNjqqVCAzQ}ucwN!2#S-@OE?iOpIdL0+SSZ)XEBr=(P)ewZ<)(B^aDsI z-UMciFfwVgm6gDpRgWG_L1%^SFCUQug(X2=sdx?&-Pyk&U+VUw#CY8zpV% zX`6VJU9C;ZVxme0vVoSLB#uzuP;GgpyNZpnt+Z_CtTivcJ;y-W8%qzkUWWM(K>^wG z!oSS63BhJ&l)kZ1-=6q1o=+MiY&yP`X?5zA6I07YTfA zRCb@1W3t}(O1 zvIxpC?`1PMTWtI}q!oetQKOp(%EMKaC@Rt4{@Uv?%Gpp#`_NJx)pcj@mF+iMILv*l zsjIWJa7UT3aG6m})@X`s2c&z9a6!d1kkwQrtbV%be_35aYddkVoC-acg&3>}BQZzLwd-8EoMVHzw&fMX#&Wd}bh z%c>$L=KaF7zf#N<7os-nKHXf9^im4xXudWUovf*QvET17NC z-nIp_;Wy67Io9&EngpD_6?m6p({vwgZ2`USc z(^wDj{iJphRh{8}ktiUnN#s#IwivaG>>(rk zUCR50$T4u=>lWMD&zhe$Y6M{uWmAOR(Vvp7hM=j$2n0#o&r1zB3`-LV22jVK<7X`ALC#6swDAkV?q)mh?4qz4(kNJlnDUad z%ghyK5O7IXKfQbWs4qSyir;m6Wc->0g{QBhL|kXjY;7TZH}$Or zauY#cWBsJjE#X?YFmRk{cWG2a8prxPM{!A&54w!oqbWFIApkcs8$e4jS z6Vnl{HU(*9>+nkJR!nV1XYn)|fVr;h2p9AYEh~`@72XvtQ*jI5AQ#}CvwAAFNG#Xw zzO%C~a%qdmNLo(>BbnQ3>#K-q2N#X?K*d9*3{{VKWqEbmW`R$_!8=o2<{`Z zoN0mYCC%kjEHFY-CZ5DtrW@QXkl(OWw2dpy;^`Jk*)PI3vU~M-%NwV*ylfpJD=B*? zQJFVLMQxStw6p3{s*L!jSoXGJh&3w z&T0Mx_z&TqOjF&OF@Fii68WCj8q0YVN0I*RECzkwAb4pnPi?m)^@W(6&MqPNM$6U0 z3kXV5+5zM zC48Uj@kw}D_%Cm8@Xq07!q*PV856}qbp@ui_8g!b-$b zTUS{);Rv`m2>ycm0`9rX6B90>=9guw*-Lm85tv$8b0q+{G6~1UHD&iZdWox9-oqdgEvthn6)^!!*)!x_gS7*m~t+5OPJ}!)*wvDrx zypi~tl5thVVUv&2s3>q-xL9z%g2d*Q?scV274|J5y)Zj<1?#r(lKYr{1#Od<*rGx24cV9v~YW6E2+l|fIUqLy{k)(sko z)A*7gNMM9#x^;njZmcpCB$Z9ZBxicimx9-m7g1SfEbD0Qs&+EDBN0@#l9a%oT&UzW z9-p^B#T#KgS_-)DU#Lh0yvS_5s4qceeUM(d{Q^>2S$Wx=%o0=w^o=Q;N^>(kMgbo; z(L?kF;QC0!qpFaKYrG_Isr4PLwwpw6-L@-BBk>X>E$<7asde@NS#Ric&YoICdR{N; z`^tVP%q)?CmywxbIc=RKMLNWQ$#~yN+{QeWmkBtJY)-;63wIc10?pT%8_Xd?$EWmr z*(`9Mnd6xr#pr8be|?BU zNH(Rgu`oB5W*V&^V?MJP)h&I07e;eIGm_gx#Rgs;WhM0Or_pYW@;V!-HXkoPGtH%F zqoS$W*ZSVqt(mX@$iL{*qdEcinZBc3vd?)1$sHJ6tR1A3NZ@Ro)jdEpNVXOQ+nBF} z)AgMIcZ8q}dNkMannp!vE~xnoxGtC{>vkEz4HvID=2Ya?M$kgonRgqmF}@k(Zbr33 zVhr#Ai9(pCz!l~dVN%O}0bEr0NsqylCRh8PL@|jr!ry@7BPi~yEma8(GlkNJv^-)G zfXp<)PT9xKQW)?Jf+6TjASlU{VveHEhGnR1OBK~!9^FC8yB z`c>3lQMSTWC~WBGys4C?ko}IT(prWWmf<}?KTG0k&94BrQT__E#dc+rDY0hInmhz%!jp{r_mGYD=KRuEFn7z!D!|#`rZh>Q2RSmL!+9^ zAHq#4Ch=-H>x8d1uMTq;X=dgWk#(Jo!Ca5GJGf4Ztzr>>Vo41*UEfMURg~s2YJC+? zRYY)`H4rvr8Zmn;yD_gAx&4)Orlp;Q9Z>O;L}rPx6ogTcPRsLJj&t?}$iKoSsKzKe zNd4!$F0y~AXev8iMHfAq37a$RX-*epLEpkz%V2_xM5c_5>ORP1R8J99GjCvEU2GTr3*iNE@uzk=A8qNPE=t~Ox0jG}9jn!52=d=uR z89Pa|(Ws+}`}h(w@nnmrctycPss`g5>&ooq9b*=upH9$BW&f#&O-prQXY?nj@4^c! zyF$fEXD!_abJ0&i-xcJxaIROtM5?+uTLrv9ZC@>)1rz3&9NZOi%tUP^(p%korn}l_ zaGwZDEITte7Vo)450IWr4RUKT-{R|J8xMh}3d8UwoANEq8H})+X-;l01ihI_m?tyy zj1ZaJBBYgttA)NDEk~Jq2sT*f9br@ST6zi z6HOKV&2%J=Cc(TzVmiLBl>G|4N28@yQj*Alzz3KY2AekZ;J>l+S&S2=9NP9V31Tq46F|W6? z??`(9{E(TUVkF2Y=9ESm44sYFTeplLOAz!ykPN{ia${+pN%mK`zOsANjz(1{cuP5} zis~yBVmVP3PPUdAUk`mJVwuD&HPHZNFAyAOW|^%6(&;Y63}&pB<1ueRFdFG(1TWySU@ppw zAv+HEBn3&F^)=-|XG@hOB>avrJHCOMPeBz)__MNsApMkW5k4g7Tafl==scfx;!#axAj%7)l!4c;;pr+F`BmkZ~T5lhRVa6ib# zq`8`IUps5JR1zVML2qqhgJ4EwheU z&vZht!a7$n+mL2r=DI;vIa|&AYeSDLCpj}esLz$@K;&BVKfpETZNR*d$?hF}iXKJq zZE`jgB){6u5_RxxmI!N(rnZs7SzV@;vNd}2ad|e%4!4N*M1GVVWYjCJ!hb=LaD!#T zNL-iLf_^OU6a?#n+aPy=IlhA13bKuvqc*Iw9Qsb6^f%rt%$a4sB|Ho7Pns8ES&Oft zdADQP!Hm&-CvTo%k}5k(K`f-D$oSFOE|5IJ-g?Y3$8KkPn7zzC<}sGjwEP%MXkJ`J zX|>|l8ikuWI z7lspdHB4zOj{qNKx@b9H%SGnxsA34nPqM{jkMWK(5zH~)Y$t>xY3TrbQg{wQMFajU zJjJZgyq=0kdYpE)&ILHb8--vM&1Z$p5R7(qPI#W#PeE2avN3;~BLb?7%GT?)9^VAQ z$EaPY{MZHvpsc|%m~kT>z#!s@~yMy&Q2ki>+GGg_4e{q^GU#4>?)EuzJSX>T0iER zaI0*3EnlE&WyR~%{*G#!>@O032>)b;p^D55XMVx*667o1G{QHU?N?{7nAgm7iQjl{ zm`xyWdAaO#vv8OZ4!hUhNqmF;sk1~@Hv_>26V2ppC+&B*N7QdY@Q3g_*=AV&6h2W~ z56gDuFK4qrb|5$^JI6M53ZE(4is~fqd$?T^BWMZl*2@K4AJqqEQ3$H<`gTXvQ6eru zoh2Gb%*OIw-yO0gEisSmPPoauIUu<$Vw>iF13v?vEAfwTA*y-8b1FVKyX$Ig6n+$r zaNYhUawKUVnNJc=)keT~!o5*J*?d&r8RlP*-KPAH7bftd=#F8Ta7=h+0dN^|BLqXs zsfeXFFDV7v3E#oYH^)8MRQm38wpQ%{(iWoX&l{!oD_aXA`!%zRiKxd`i9J+hC%l`j zWs!{}8<~m1oO2eH_Z)7QZo8Ri&i3%4^Ah8W!Hda6v79`VmcqPc{NOwSN1J$ zu{(PTZ=N1Ug$rc&(iaug5@oRw40aX%G}|D!IL_iSTP5}erK$Lm@O{F(m`6E_2RE9R z+UmAi(<0tL*X_KDPqOt;eFnT#-@lA-nzVzweN>Hs`x@>SW&aA#x!ga>9&&j;M=)I3 zLc_!tCSbDKRYKk}^#7^dhw5tt@5uekY@2v55G*G09l2q3OQiO^>~aKYWYZx?EHM_} zIHnRArD;wgabGyVs4JAMWMa`09e4?rh`NO_LKpP;2w$S?N1IHFB^k3wBB7Sw!oB4s zmuO&w{lLlf9cPaGz+sX8f_}4#YARBIbQPvho02)JTPj|CkQk&*gG=pfCxUROVoLn3 zwwQ_ndW?6L1}-gA&{-!HWe_|w;8G?Q+!r8G5v1eAcJ_yGKl-iaXkg>%W#h={;#|tM*wADzzqnSi4lXi+LrevU0l+CSA9fan$xXp};KLHDb=x4!jWiyrBXCEV z!qoSm?~p|l5yr5WCrlFNZ!EuK$%7y-6IJbeYtJW~23OsN?z`oq$>x_Rz#PV0kavVv zh_}qVH&qlC{-olt9zW4?G^j;lsvUerb3+wHofTt}NhGA8c#uFv30_I26tmbczbM;> zxv21^ir;K)Jk#B53!JqBdEo4G-7dHk7xcKud;_wODUCTgxn+10fYa(Rk+(#TV$39A zS&+G={70j5!bZSlQEhZlCd2(IY%K8wvsKGudX!gD9N*^zy@LDQhR%~)9_bsJj{|Sh zs045YWsg;q6gELxMcH2XiO|PD6<>A}eevlVrM9E9N^pzdULswl zHj=QiL=~o~L{(ljCMLeaM0P^3#%){EfXmgEVyeT{U~bVjhrXJ^KjAi$ah%dx&Q_?X z&8x#aB`t%B>zEUeyG2E5xKq|t7cQYhJ>CaftIun|oWOjNX(*fmcY@}VOe1Hr-PAvW zw9%unv(_f6fNHC5&B^#)Hm#O9tfUECEG$iV+u*uU8qHW|K~5n(&BTUl1{a67JxD6- z3|Gc5zu8|4XDyl46wIKYmGFh^5#eGLt)1<_@~w$>%bp32plqi^B8k_)XC)E~<7(bU zZ8Mj#tiEl9DU~Jg*77sRG$X|0ZIjrAuN~a(pm4SMEh3?cD9k07HWhsxo&&(Jq@>)*TAKi8Enamtl}r$boBm= zLdQ{oVxSt5IvzCjXSF(vF^Fz-C7U3NM|IFq#9!s&$H zflFtY-c%*fvX-F_V$P=dAzoEIiZiS1^eT}<@ufs?7^D@Jubo|!EdhK2!BH*$flH~! zTjq$0UsX&5xvt^{bAjApLE*MBoVQxbZ+Q7gtBCI++z4kQneUv9;*Dm;Fk_k4dfdc( ziy2MTZY{^ju8>{HA@-#WW8J0wal<5f&xeh}`l#M?+GI;(~`DS}n_HmPj~ z7dx0>Cc!l_{x)+=7EWQlWu`LIn4b*Ogp3L%pYE&;(mT3cGI=GCyTWs1%mDd~cM0=M z;djg|=9Suez?GGK@9e&CHZQHS2f~NUQ8)E0XO}fPk8}>)TxK3q*;q%J`N9RvLZ-d5 zMZCq#BYYj4T|rgMN|s1uvyH3Hj=B$)I$Op(23gMg!Tpi|B%_6OGghDAXLQ+w63Hxk zWe{vl-9auh6@{-2{g-eRNOItw#=55VqV4tyZi87JWMR(gv4*#n>4D&}IWAblI%mgJ z45BXu(nR>yOVl;$3}=-n*x+o8QFE%T?5vNz8znX|o0)Z}{)9UhYz}uF=|g;#tmG$a zO6;tP=6mtY)aaPR7A#wtZOrz7sg@!16r{k%NV}_M<&|yr4zrNCZIxYY@wj)H&{L2C zpXuzSpV!(eUOO+J$CeY>64$s#%Xn+3;}!8c+#=a>&Z@a(55kpIJKH^49b}6zd+^mR z+gte7U7edLBFx3iQ8AjAUZX0qcM!beRY$*7_MvQf7j&L5F-TRl8+oCpAO+s>EIY9~ zd%dlNo`Mwk`Gi|JsXHf*<=o}Pa}Pyg3NT6CO_`Z=?xw~d6NDSx<4uI8ywh%T7aw=8 zrSuN645Wc&XV7DZ#6@Q(u;kF~urL*H1&ubkD4Uox-o8^yya36p$6RGOm8Fr`##>Cm zW);;Dl-F&ZM#*H`Im=1aBP_#&rzySYY+=v@{?c~nDM*1G%&?(K%sCrMZHW(U=#Ujh z^hP$^{;q>m^~Uo-BBM)NL$OdJ0nDdsW-G zZfnb}GmjOIv8&WJ{@h~Mg4A)A#S3--+zk~snYI#vs=)Uic6t@K60Zi_dY7WNmwjH$ zC7soCQL=l3>a52Z7ixR(Jp!bQv(!kV0-xZOln6ZqDe%$WI_ultli-Hzc{p#kv(QtJ z0ym)>={nPZ2|WcV@I~0Gr=7bbn)@a66r{kuyY zSE1fM(3N;M752|zGU_H=`a)1Qdr(=Ft;Us zVq#j|V%gABkOIGQvbF5il-Wx1*-&_1=qX5n?>a1JwU=Z8dkH-SDe!YM|M1Ko?w82C zKHiKzdLNG>{K2lG^1?fd;6^&)#hJ@@fuW}$1%9_>Llb-q$n9f50=r7c6n3xmvZh4B z#7q(+JV zTFwATA$!Za;|k&4;MX46loDxx2N0P~ZG4~l3Nr;LNCmQ<(lCBEn2VOOOi|rZ%T7fQ zR`xjhW~7A^_Q!Wy-!yPLgwHe&FWZ}fS;DlkMYODG8xh@MuXw#wd?6djSyO!@s7>eW zFPgKt6VnGFyxdswk`a0eQsBDTZVW5w;G&%24YHE#Ip+D~uz1h5Fr8Md5AI zD8H~Uz9LNMDM*1GxR!-1C-fAgzct?sM_lSrbR7i?z)HJugoYTU` zy)Nt7RSWBU?`U}MW{q<)K$R_sI_d&LV+SI^Th0A3N!-bxL6j+#hw~u=_ zg|8_sthgo9DtKdBc6zJ3=2C>7f)x13>Au?OmI^%uDe#9I-8q3bv%sG;bid>mW@CB@ z-+Ff(=%seiSCY_EkOJRe*~>vI$>)_9dJ0nDkBwWzZm+0*?wnQLX+lpy3j7IWdztJV zIFEPW5$>Fk%q1_YlHRU&^F}!fJq0Q7am&KGd8Y|I1u5`@9`DMbryvFXu7Q`(F>kq{ zryvFX(3I~w8v7s|dJ0nDhbFc$+*|2L-$PX9g`R>G_(`-c$Gd$w?rSB1Utb2k%kmSi z``%uU$%dYS6!^`fFU(b~si5d3J1u5{CMSR8#Jq0Q7*MfZc3_S%Y@PW#Q?b&`>5qb(z;7_LeupN2| zQs^m2zF_S24M%a`gN2@g6!_bjK3;~Nf)w~uw!uHt?*<7y1u5`vQ+a)ao`Mwk5sf<{ z^c1APUzqk&-Oy8z0{?QPUzCQPf)x1sW&Wk<&{L2Cf8XAplnp%vDe&!=J0kQHq`*&b z-4PjVBlHxcz`xVsGiK;1NP(AzFCC$$AcdZS$&AH!oMKY|ZA?Yn3TmD?=a` z=Kq@BJpy6&9=$sDYuTr5_I@pUWpCHLOPjX6dS`FnBYT^ko!Sq|(=KO@RylJI9N4c< zr#^l9u|Lyo|I+IP!dCwq^MJ+gM}*1J#3E?u&gEK|03jk=D4|7+f_ZMQbvdu4Ck zp=GZ&ZTnr+Jm?B-fx9QuZZLur?zxR^BuZJUr4?LzXZ0NtC K4gCMQf&T;1m{UUl literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/euctwfreq.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/euctwfreq.py new file mode 100644 index 0000000..ed7a995 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/euctwfreq.py @@ -0,0 +1,387 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# EUCTW frequency table +# Converted from big5 work +# by Taiwan's Mandarin Promotion Council +# + +# 128 --> 0.42261 +# 256 --> 0.57851 +# 512 --> 0.74851 +# 1024 --> 0.89384 +# 2048 --> 0.97583 +# +# Idea Distribution Ratio = 0.74851/(1-0.74851) =2.98 +# Random Distribution Ration = 512/(5401-512)=0.105 +# +# Typical Distribution Ratio about 25% of Ideal one, still much higher than RDR + +EUCTW_TYPICAL_DISTRIBUTION_RATIO = 0.75 + +# Char to FreqOrder table , +EUCTW_TABLE_SIZE = 5376 + +EUCTW_CHAR_TO_FREQ_ORDER = ( + 1,1800,1506, 255,1431, 198, 9, 82, 6,7310, 177, 202,3615,1256,2808, 110, # 2742 +3735, 33,3241, 261, 76, 44,2113, 16,2931,2184,1176, 659,3868, 26,3404,2643, # 2758 +1198,3869,3313,4060, 410,2211, 302, 590, 361,1963, 8, 204, 58,4296,7311,1931, # 2774 + 63,7312,7313, 317,1614, 75, 222, 159,4061,2412,1480,7314,3500,3068, 224,2809, # 2790 +3616, 3, 10,3870,1471, 29,2774,1135,2852,1939, 873, 130,3242,1123, 312,7315, # 2806 +4297,2051, 507, 252, 682,7316, 142,1914, 124, 206,2932, 34,3501,3173, 64, 604, # 2822 +7317,2494,1976,1977, 155,1990, 645, 641,1606,7318,3405, 337, 72, 406,7319, 80, # 2838 + 630, 238,3174,1509, 263, 939,1092,2644, 756,1440,1094,3406, 449, 69,2969, 591, # 2854 + 179,2095, 471, 115,2034,1843, 60, 50,2970, 134, 806,1868, 734,2035,3407, 180, # 2870 + 995,1607, 156, 537,2893, 688,7320, 319,1305, 779,2144, 514,2374, 298,4298, 359, # 2886 +2495, 90,2707,1338, 663, 11, 906,1099,2545, 20,2436, 182, 532,1716,7321, 732, # 2902 +1376,4062,1311,1420,3175, 25,2312,1056, 113, 399, 382,1949, 242,3408,2467, 529, # 2918 +3243, 475,1447,3617,7322, 117, 21, 656, 810,1297,2295,2329,3502,7323, 126,4063, # 2934 + 706, 456, 150, 613,4299, 71,1118,2036,4064, 145,3069, 85, 835, 486,2114,1246, # 2950 +1426, 428, 727,1285,1015, 800, 106, 623, 303,1281,7324,2127,2354, 347,3736, 221, # 2966 +3503,3110,7325,1955,1153,4065, 83, 296,1199,3070, 192, 624, 93,7326, 822,1897, # 2982 +2810,3111, 795,2064, 991,1554,1542,1592, 27, 43,2853, 859, 139,1456, 860,4300, # 2998 + 437, 712,3871, 164,2392,3112, 695, 211,3017,2096, 195,3872,1608,3504,3505,3618, # 3014 +3873, 234, 811,2971,2097,3874,2229,1441,3506,1615,2375, 668,2076,1638, 305, 228, # 3030 +1664,4301, 467, 415,7327, 262,2098,1593, 239, 108, 300, 200,1033, 512,1247,2077, # 3046 +7328,7329,2173,3176,3619,2673, 593, 845,1062,3244, 88,1723,2037,3875,1950, 212, # 3062 + 266, 152, 149, 468,1898,4066,4302, 77, 187,7330,3018, 37, 5,2972,7331,3876, # 3078 +7332,7333, 39,2517,4303,2894,3177,2078, 55, 148, 74,4304, 545, 483,1474,1029, # 3094 +1665, 217,1869,1531,3113,1104,2645,4067, 24, 172,3507, 900,3877,3508,3509,4305, # 3110 + 32,1408,2811,1312, 329, 487,2355,2247,2708, 784,2674, 4,3019,3314,1427,1788, # 3126 + 188, 109, 499,7334,3620,1717,1789, 888,1217,3020,4306,7335,3510,7336,3315,1520, # 3142 +3621,3878, 196,1034, 775,7337,7338, 929,1815, 249, 439, 38,7339,1063,7340, 794, # 3158 +3879,1435,2296, 46, 178,3245,2065,7341,2376,7342, 214,1709,4307, 804, 35, 707, # 3174 + 324,3622,1601,2546, 140, 459,4068,7343,7344,1365, 839, 272, 978,2257,2572,3409, # 3190 +2128,1363,3623,1423, 697, 100,3071, 48, 70,1231, 495,3114,2193,7345,1294,7346, # 3206 +2079, 462, 586,1042,3246, 853, 256, 988, 185,2377,3410,1698, 434,1084,7347,3411, # 3222 + 314,2615,2775,4308,2330,2331, 569,2280, 637,1816,2518, 757,1162,1878,1616,3412, # 3238 + 287,1577,2115, 768,4309,1671,2854,3511,2519,1321,3737, 909,2413,7348,4069, 933, # 3254 +3738,7349,2052,2356,1222,4310, 765,2414,1322, 786,4311,7350,1919,1462,1677,2895, # 3270 +1699,7351,4312,1424,2437,3115,3624,2590,3316,1774,1940,3413,3880,4070, 309,1369, # 3286 +1130,2812, 364,2230,1653,1299,3881,3512,3882,3883,2646, 525,1085,3021, 902,2000, # 3302 +1475, 964,4313, 421,1844,1415,1057,2281, 940,1364,3116, 376,4314,4315,1381, 7, # 3318 +2520, 983,2378, 336,1710,2675,1845, 321,3414, 559,1131,3022,2742,1808,1132,1313, # 3334 + 265,1481,1857,7352, 352,1203,2813,3247, 167,1089, 420,2814, 776, 792,1724,3513, # 3350 +4071,2438,3248,7353,4072,7354, 446, 229, 333,2743, 901,3739,1200,1557,4316,2647, # 3366 +1920, 395,2744,2676,3740,4073,1835, 125, 916,3178,2616,4317,7355,7356,3741,7357, # 3382 +7358,7359,4318,3117,3625,1133,2547,1757,3415,1510,2313,1409,3514,7360,2145, 438, # 3398 +2591,2896,2379,3317,1068, 958,3023, 461, 311,2855,2677,4074,1915,3179,4075,1978, # 3414 + 383, 750,2745,2617,4076, 274, 539, 385,1278,1442,7361,1154,1964, 384, 561, 210, # 3430 + 98,1295,2548,3515,7362,1711,2415,1482,3416,3884,2897,1257, 129,7363,3742, 642, # 3446 + 523,2776,2777,2648,7364, 141,2231,1333, 68, 176, 441, 876, 907,4077, 603,2592, # 3462 + 710, 171,3417, 404, 549, 18,3118,2393,1410,3626,1666,7365,3516,4319,2898,4320, # 3478 +7366,2973, 368,7367, 146, 366, 99, 871,3627,1543, 748, 807,1586,1185, 22,2258, # 3494 + 379,3743,3180,7368,3181, 505,1941,2618,1991,1382,2314,7369, 380,2357, 218, 702, # 3510 +1817,1248,3418,3024,3517,3318,3249,7370,2974,3628, 930,3250,3744,7371, 59,7372, # 3526 + 585, 601,4078, 497,3419,1112,1314,4321,1801,7373,1223,1472,2174,7374, 749,1836, # 3542 + 690,1899,3745,1772,3885,1476, 429,1043,1790,2232,2116, 917,4079, 447,1086,1629, # 3558 +7375, 556,7376,7377,2020,1654, 844,1090, 105, 550, 966,1758,2815,1008,1782, 686, # 3574 +1095,7378,2282, 793,1602,7379,3518,2593,4322,4080,2933,2297,4323,3746, 980,2496, # 3590 + 544, 353, 527,4324, 908,2678,2899,7380, 381,2619,1942,1348,7381,1341,1252, 560, # 3606 +3072,7382,3420,2856,7383,2053, 973, 886,2080, 143,4325,7384,7385, 157,3886, 496, # 3622 +4081, 57, 840, 540,2038,4326,4327,3421,2117,1445, 970,2259,1748,1965,2081,4082, # 3638 +3119,1234,1775,3251,2816,3629, 773,1206,2129,1066,2039,1326,3887,1738,1725,4083, # 3654 + 279,3120, 51,1544,2594, 423,1578,2130,2066, 173,4328,1879,7386,7387,1583, 264, # 3670 + 610,3630,4329,2439, 280, 154,7388,7389,7390,1739, 338,1282,3073, 693,2857,1411, # 3686 +1074,3747,2440,7391,4330,7392,7393,1240, 952,2394,7394,2900,1538,2679, 685,1483, # 3702 +4084,2468,1436, 953,4085,2054,4331, 671,2395, 79,4086,2441,3252, 608, 567,2680, # 3718 +3422,4087,4088,1691, 393,1261,1791,2396,7395,4332,7396,7397,7398,7399,1383,1672, # 3734 +3748,3182,1464, 522,1119, 661,1150, 216, 675,4333,3888,1432,3519, 609,4334,2681, # 3750 +2397,7400,7401,7402,4089,3025, 0,7403,2469, 315, 231,2442, 301,3319,4335,2380, # 3766 +7404, 233,4090,3631,1818,4336,4337,7405, 96,1776,1315,2082,7406, 257,7407,1809, # 3782 +3632,2709,1139,1819,4091,2021,1124,2163,2778,1777,2649,7408,3074, 363,1655,3183, # 3798 +7409,2975,7410,7411,7412,3889,1567,3890, 718, 103,3184, 849,1443, 341,3320,2934, # 3814 +1484,7413,1712, 127, 67, 339,4092,2398, 679,1412, 821,7414,7415, 834, 738, 351, # 3830 +2976,2146, 846, 235,1497,1880, 418,1992,3749,2710, 186,1100,2147,2746,3520,1545, # 3846 +1355,2935,2858,1377, 583,3891,4093,2573,2977,7416,1298,3633,1078,2549,3634,2358, # 3862 + 78,3750,3751, 267,1289,2099,2001,1594,4094, 348, 369,1274,2194,2175,1837,4338, # 3878 +1820,2817,3635,2747,2283,2002,4339,2936,2748, 144,3321, 882,4340,3892,2749,3423, # 3894 +4341,2901,7417,4095,1726, 320,7418,3893,3026, 788,2978,7419,2818,1773,1327,2859, # 3910 +3894,2819,7420,1306,4342,2003,1700,3752,3521,2359,2650, 787,2022, 506, 824,3636, # 3926 + 534, 323,4343,1044,3322,2023,1900, 946,3424,7421,1778,1500,1678,7422,1881,4344, # 3942 + 165, 243,4345,3637,2521, 123, 683,4096, 764,4346, 36,3895,1792, 589,2902, 816, # 3958 + 626,1667,3027,2233,1639,1555,1622,3753,3896,7423,3897,2860,1370,1228,1932, 891, # 3974 +2083,2903, 304,4097,7424, 292,2979,2711,3522, 691,2100,4098,1115,4347, 118, 662, # 3990 +7425, 611,1156, 854,2381,1316,2861, 2, 386, 515,2904,7426,7427,3253, 868,2234, # 4006 +1486, 855,2651, 785,2212,3028,7428,1040,3185,3523,7429,3121, 448,7430,1525,7431, # 4022 +2164,4348,7432,3754,7433,4099,2820,3524,3122, 503, 818,3898,3123,1568, 814, 676, # 4038 +1444, 306,1749,7434,3755,1416,1030, 197,1428, 805,2821,1501,4349,7435,7436,7437, # 4054 +1993,7438,4350,7439,7440,2195, 13,2779,3638,2980,3124,1229,1916,7441,3756,2131, # 4070 +7442,4100,4351,2399,3525,7443,2213,1511,1727,1120,7444,7445, 646,3757,2443, 307, # 4086 +7446,7447,1595,3186,7448,7449,7450,3639,1113,1356,3899,1465,2522,2523,7451, 519, # 4102 +7452, 128,2132, 92,2284,1979,7453,3900,1512, 342,3125,2196,7454,2780,2214,1980, # 4118 +3323,7455, 290,1656,1317, 789, 827,2360,7456,3758,4352, 562, 581,3901,7457, 401, # 4134 +4353,2248, 94,4354,1399,2781,7458,1463,2024,4355,3187,1943,7459, 828,1105,4101, # 4150 +1262,1394,7460,4102, 605,4356,7461,1783,2862,7462,2822, 819,2101, 578,2197,2937, # 4166 +7463,1502, 436,3254,4103,3255,2823,3902,2905,3425,3426,7464,2712,2315,7465,7466, # 4182 +2332,2067, 23,4357, 193, 826,3759,2102, 699,1630,4104,3075, 390,1793,1064,3526, # 4198 +7467,1579,3076,3077,1400,7468,4105,1838,1640,2863,7469,4358,4359, 137,4106, 598, # 4214 +3078,1966, 780, 104, 974,2938,7470, 278, 899, 253, 402, 572, 504, 493,1339,7471, # 4230 +3903,1275,4360,2574,2550,7472,3640,3029,3079,2249, 565,1334,2713, 863, 41,7473, # 4246 +7474,4361,7475,1657,2333, 19, 463,2750,4107, 606,7476,2981,3256,1087,2084,1323, # 4262 +2652,2982,7477,1631,1623,1750,4108,2682,7478,2864, 791,2714,2653,2334, 232,2416, # 4278 +7479,2983,1498,7480,2654,2620, 755,1366,3641,3257,3126,2025,1609, 119,1917,3427, # 4294 + 862,1026,4109,7481,3904,3760,4362,3905,4363,2260,1951,2470,7482,1125, 817,4110, # 4310 +4111,3906,1513,1766,2040,1487,4112,3030,3258,2824,3761,3127,7483,7484,1507,7485, # 4326 +2683, 733, 40,1632,1106,2865, 345,4113, 841,2524, 230,4364,2984,1846,3259,3428, # 4342 +7486,1263, 986,3429,7487, 735, 879, 254,1137, 857, 622,1300,1180,1388,1562,3907, # 4358 +3908,2939, 967,2751,2655,1349, 592,2133,1692,3324,2985,1994,4114,1679,3909,1901, # 4374 +2185,7488, 739,3642,2715,1296,1290,7489,4115,2198,2199,1921,1563,2595,2551,1870, # 4390 +2752,2986,7490, 435,7491, 343,1108, 596, 17,1751,4365,2235,3430,3643,7492,4366, # 4406 + 294,3527,2940,1693, 477, 979, 281,2041,3528, 643,2042,3644,2621,2782,2261,1031, # 4422 +2335,2134,2298,3529,4367, 367,1249,2552,7493,3530,7494,4368,1283,3325,2004, 240, # 4438 +1762,3326,4369,4370, 836,1069,3128, 474,7495,2148,2525, 268,3531,7496,3188,1521, # 4454 +1284,7497,1658,1546,4116,7498,3532,3533,7499,4117,3327,2684,1685,4118, 961,1673, # 4470 +2622, 190,2005,2200,3762,4371,4372,7500, 570,2497,3645,1490,7501,4373,2623,3260, # 4486 +1956,4374, 584,1514, 396,1045,1944,7502,4375,1967,2444,7503,7504,4376,3910, 619, # 4502 +7505,3129,3261, 215,2006,2783,2553,3189,4377,3190,4378, 763,4119,3763,4379,7506, # 4518 +7507,1957,1767,2941,3328,3646,1174, 452,1477,4380,3329,3130,7508,2825,1253,2382, # 4534 +2186,1091,2285,4120, 492,7509, 638,1169,1824,2135,1752,3911, 648, 926,1021,1324, # 4550 +4381, 520,4382, 997, 847,1007, 892,4383,3764,2262,1871,3647,7510,2400,1784,4384, # 4566 +1952,2942,3080,3191,1728,4121,2043,3648,4385,2007,1701,3131,1551, 30,2263,4122, # 4582 +7511,2026,4386,3534,7512, 501,7513,4123, 594,3431,2165,1821,3535,3432,3536,3192, # 4598 + 829,2826,4124,7514,1680,3132,1225,4125,7515,3262,4387,4126,3133,2336,7516,4388, # 4614 +4127,7517,3912,3913,7518,1847,2383,2596,3330,7519,4389, 374,3914, 652,4128,4129, # 4630 + 375,1140, 798,7520,7521,7522,2361,4390,2264, 546,1659, 138,3031,2445,4391,7523, # 4646 +2250, 612,1848, 910, 796,3765,1740,1371, 825,3766,3767,7524,2906,2554,7525, 692, # 4662 + 444,3032,2624, 801,4392,4130,7526,1491, 244,1053,3033,4131,4132, 340,7527,3915, # 4678 +1041,2987, 293,1168, 87,1357,7528,1539, 959,7529,2236, 721, 694,4133,3768, 219, # 4694 +1478, 644,1417,3331,2656,1413,1401,1335,1389,3916,7530,7531,2988,2362,3134,1825, # 4710 + 730,1515, 184,2827, 66,4393,7532,1660,2943, 246,3332, 378,1457, 226,3433, 975, # 4726 +3917,2944,1264,3537, 674, 696,7533, 163,7534,1141,2417,2166, 713,3538,3333,4394, # 4742 +3918,7535,7536,1186, 15,7537,1079,1070,7538,1522,3193,3539, 276,1050,2716, 758, # 4758 +1126, 653,2945,3263,7539,2337, 889,3540,3919,3081,2989, 903,1250,4395,3920,3434, # 4774 +3541,1342,1681,1718, 766,3264, 286, 89,2946,3649,7540,1713,7541,2597,3334,2990, # 4790 +7542,2947,2215,3194,2866,7543,4396,2498,2526, 181, 387,1075,3921, 731,2187,3335, # 4806 +7544,3265, 310, 313,3435,2299, 770,4134, 54,3034, 189,4397,3082,3769,3922,7545, # 4822 +1230,1617,1849, 355,3542,4135,4398,3336, 111,4136,3650,1350,3135,3436,3035,4137, # 4838 +2149,3266,3543,7546,2784,3923,3924,2991, 722,2008,7547,1071, 247,1207,2338,2471, # 4854 +1378,4399,2009, 864,1437,1214,4400, 373,3770,1142,2216, 667,4401, 442,2753,2555, # 4870 +3771,3925,1968,4138,3267,1839, 837, 170,1107, 934,1336,1882,7548,7549,2118,4139, # 4886 +2828, 743,1569,7550,4402,4140, 582,2384,1418,3437,7551,1802,7552, 357,1395,1729, # 4902 +3651,3268,2418,1564,2237,7553,3083,3772,1633,4403,1114,2085,4141,1532,7554, 482, # 4918 +2446,4404,7555,7556,1492, 833,1466,7557,2717,3544,1641,2829,7558,1526,1272,3652, # 4934 +4142,1686,1794, 416,2556,1902,1953,1803,7559,3773,2785,3774,1159,2316,7560,2867, # 4950 +4405,1610,1584,3036,2419,2754, 443,3269,1163,3136,7561,7562,3926,7563,4143,2499, # 4966 +3037,4406,3927,3137,2103,1647,3545,2010,1872,4144,7564,4145, 431,3438,7565, 250, # 4982 + 97, 81,4146,7566,1648,1850,1558, 160, 848,7567, 866, 740,1694,7568,2201,2830, # 4998 +3195,4147,4407,3653,1687, 950,2472, 426, 469,3196,3654,3655,3928,7569,7570,1188, # 5014 + 424,1995, 861,3546,4148,3775,2202,2685, 168,1235,3547,4149,7571,2086,1674,4408, # 5030 +3337,3270, 220,2557,1009,7572,3776, 670,2992, 332,1208, 717,7573,7574,3548,2447, # 5046 +3929,3338,7575, 513,7576,1209,2868,3339,3138,4409,1080,7577,7578,7579,7580,2527, # 5062 +3656,3549, 815,1587,3930,3931,7581,3550,3439,3777,1254,4410,1328,3038,1390,3932, # 5078 +1741,3933,3778,3934,7582, 236,3779,2448,3271,7583,7584,3657,3780,1273,3781,4411, # 5094 +7585, 308,7586,4412, 245,4413,1851,2473,1307,2575, 430, 715,2136,2449,7587, 270, # 5110 + 199,2869,3935,7588,3551,2718,1753, 761,1754, 725,1661,1840,4414,3440,3658,7589, # 5126 +7590, 587, 14,3272, 227,2598, 326, 480,2265, 943,2755,3552, 291, 650,1883,7591, # 5142 +1702,1226, 102,1547, 62,3441, 904,4415,3442,1164,4150,7592,7593,1224,1548,2756, # 5158 + 391, 498,1493,7594,1386,1419,7595,2055,1177,4416, 813, 880,1081,2363, 566,1145, # 5174 +4417,2286,1001,1035,2558,2599,2238, 394,1286,7596,7597,2068,7598, 86,1494,1730, # 5190 +3936, 491,1588, 745, 897,2948, 843,3340,3937,2757,2870,3273,1768, 998,2217,2069, # 5206 + 397,1826,1195,1969,3659,2993,3341, 284,7599,3782,2500,2137,2119,1903,7600,3938, # 5222 +2150,3939,4151,1036,3443,1904, 114,2559,4152, 209,1527,7601,7602,2949,2831,2625, # 5238 +2385,2719,3139, 812,2560,7603,3274,7604,1559, 737,1884,3660,1210, 885, 28,2686, # 5254 +3553,3783,7605,4153,1004,1779,4418,7606, 346,1981,2218,2687,4419,3784,1742, 797, # 5270 +1642,3940,1933,1072,1384,2151, 896,3941,3275,3661,3197,2871,3554,7607,2561,1958, # 5286 +4420,2450,1785,7608,7609,7610,3942,4154,1005,1308,3662,4155,2720,4421,4422,1528, # 5302 +2600, 161,1178,4156,1982, 987,4423,1101,4157, 631,3943,1157,3198,2420,1343,1241, # 5318 +1016,2239,2562, 372, 877,2339,2501,1160, 555,1934, 911,3944,7611, 466,1170, 169, # 5334 +1051,2907,2688,3663,2474,2994,1182,2011,2563,1251,2626,7612, 992,2340,3444,1540, # 5350 +2721,1201,2070,2401,1996,2475,7613,4424, 528,1922,2188,1503,1873,1570,2364,3342, # 5366 +3276,7614, 557,1073,7615,1827,3445,2087,2266,3140,3039,3084, 767,3085,2786,4425, # 5382 +1006,4158,4426,2341,1267,2176,3664,3199, 778,3945,3200,2722,1597,2657,7616,4427, # 5398 +7617,3446,7618,7619,7620,3277,2689,1433,3278, 131, 95,1504,3946, 723,4159,3141, # 5414 +1841,3555,2758,2189,3947,2027,2104,3665,7621,2995,3948,1218,7622,3343,3201,3949, # 5430 +4160,2576, 248,1634,3785, 912,7623,2832,3666,3040,3786, 654, 53,7624,2996,7625, # 5446 +1688,4428, 777,3447,1032,3950,1425,7626, 191, 820,2120,2833, 971,4429, 931,3202, # 5462 + 135, 664, 783,3787,1997, 772,2908,1935,3951,3788,4430,2909,3203, 282,2723, 640, # 5478 +1372,3448,1127, 922, 325,3344,7627,7628, 711,2044,7629,7630,3952,2219,2787,1936, # 5494 +3953,3345,2220,2251,3789,2300,7631,4431,3790,1258,3279,3954,3204,2138,2950,3955, # 5510 +3956,7632,2221, 258,3205,4432, 101,1227,7633,3280,1755,7634,1391,3281,7635,2910, # 5526 +2056, 893,7636,7637,7638,1402,4161,2342,7639,7640,3206,3556,7641,7642, 878,1325, # 5542 +1780,2788,4433, 259,1385,2577, 744,1183,2267,4434,7643,3957,2502,7644, 684,1024, # 5558 +4162,7645, 472,3557,3449,1165,3282,3958,3959, 322,2152, 881, 455,1695,1152,1340, # 5574 + 660, 554,2153,4435,1058,4436,4163, 830,1065,3346,3960,4437,1923,7646,1703,1918, # 5590 +7647, 932,2268, 122,7648,4438, 947, 677,7649,3791,2627, 297,1905,1924,2269,4439, # 5606 +2317,3283,7650,7651,4164,7652,4165, 84,4166, 112, 989,7653, 547,1059,3961, 701, # 5622 +3558,1019,7654,4167,7655,3450, 942, 639, 457,2301,2451, 993,2951, 407, 851, 494, # 5638 +4440,3347, 927,7656,1237,7657,2421,3348, 573,4168, 680, 921,2911,1279,1874, 285, # 5654 + 790,1448,1983, 719,2167,7658,7659,4441,3962,3963,1649,7660,1541, 563,7661,1077, # 5670 +7662,3349,3041,3451, 511,2997,3964,3965,3667,3966,1268,2564,3350,3207,4442,4443, # 5686 +7663, 535,1048,1276,1189,2912,2028,3142,1438,1373,2834,2952,1134,2012,7664,4169, # 5702 +1238,2578,3086,1259,7665, 700,7666,2953,3143,3668,4170,7667,4171,1146,1875,1906, # 5718 +4444,2601,3967, 781,2422, 132,1589, 203, 147, 273,2789,2402, 898,1786,2154,3968, # 5734 +3969,7668,3792,2790,7669,7670,4445,4446,7671,3208,7672,1635,3793, 965,7673,1804, # 5750 +2690,1516,3559,1121,1082,1329,3284,3970,1449,3794, 65,1128,2835,2913,2759,1590, # 5766 +3795,7674,7675, 12,2658, 45, 976,2579,3144,4447, 517,2528,1013,1037,3209,7676, # 5782 +3796,2836,7677,3797,7678,3452,7679,2602, 614,1998,2318,3798,3087,2724,2628,7680, # 5798 +2580,4172, 599,1269,7681,1810,3669,7682,2691,3088, 759,1060, 489,1805,3351,3285, # 5814 +1358,7683,7684,2386,1387,1215,2629,2252, 490,7685,7686,4173,1759,2387,2343,7687, # 5830 +4448,3799,1907,3971,2630,1806,3210,4449,3453,3286,2760,2344, 874,7688,7689,3454, # 5846 +3670,1858, 91,2914,3671,3042,3800,4450,7690,3145,3972,2659,7691,3455,1202,1403, # 5862 +3801,2954,2529,1517,2503,4451,3456,2504,7692,4452,7693,2692,1885,1495,1731,3973, # 5878 +2365,4453,7694,2029,7695,7696,3974,2693,1216, 237,2581,4174,2319,3975,3802,4454, # 5894 +4455,2694,3560,3457, 445,4456,7697,7698,7699,7700,2761, 61,3976,3672,1822,3977, # 5910 +7701, 687,2045, 935, 925, 405,2660, 703,1096,1859,2725,4457,3978,1876,1367,2695, # 5926 +3352, 918,2105,1781,2476, 334,3287,1611,1093,4458, 564,3146,3458,3673,3353, 945, # 5942 +2631,2057,4459,7702,1925, 872,4175,7703,3459,2696,3089, 349,4176,3674,3979,4460, # 5958 +3803,4177,3675,2155,3980,4461,4462,4178,4463,2403,2046, 782,3981, 400, 251,4179, # 5974 +1624,7704,7705, 277,3676, 299,1265, 476,1191,3804,2121,4180,4181,1109, 205,7706, # 5990 +2582,1000,2156,3561,1860,7707,7708,7709,4464,7710,4465,2565, 107,2477,2157,3982, # 6006 +3460,3147,7711,1533, 541,1301, 158, 753,4182,2872,3562,7712,1696, 370,1088,4183, # 6022 +4466,3563, 579, 327, 440, 162,2240, 269,1937,1374,3461, 968,3043, 56,1396,3090, # 6038 +2106,3288,3354,7713,1926,2158,4467,2998,7714,3564,7715,7716,3677,4468,2478,7717, # 6054 +2791,7718,1650,4469,7719,2603,7720,7721,3983,2661,3355,1149,3356,3984,3805,3985, # 6070 +7722,1076, 49,7723, 951,3211,3289,3290, 450,2837, 920,7724,1811,2792,2366,4184, # 6086 +1908,1138,2367,3806,3462,7725,3212,4470,1909,1147,1518,2423,4471,3807,7726,4472, # 6102 +2388,2604, 260,1795,3213,7727,7728,3808,3291, 708,7729,3565,1704,7730,3566,1351, # 6118 +1618,3357,2999,1886, 944,4185,3358,4186,3044,3359,4187,7731,3678, 422, 413,1714, # 6134 +3292, 500,2058,2345,4188,2479,7732,1344,1910, 954,7733,1668,7734,7735,3986,2404, # 6150 +4189,3567,3809,4190,7736,2302,1318,2505,3091, 133,3092,2873,4473, 629, 31,2838, # 6166 +2697,3810,4474, 850, 949,4475,3987,2955,1732,2088,4191,1496,1852,7737,3988, 620, # 6182 +3214, 981,1242,3679,3360,1619,3680,1643,3293,2139,2452,1970,1719,3463,2168,7738, # 6198 +3215,7739,7740,3361,1828,7741,1277,4476,1565,2047,7742,1636,3568,3093,7743, 869, # 6214 +2839, 655,3811,3812,3094,3989,3000,3813,1310,3569,4477,7744,7745,7746,1733, 558, # 6230 +4478,3681, 335,1549,3045,1756,4192,3682,1945,3464,1829,1291,1192, 470,2726,2107, # 6246 +2793, 913,1054,3990,7747,1027,7748,3046,3991,4479, 982,2662,3362,3148,3465,3216, # 6262 +3217,1946,2794,7749, 571,4480,7750,1830,7751,3570,2583,1523,2424,7752,2089, 984, # 6278 +4481,3683,1959,7753,3684, 852, 923,2795,3466,3685, 969,1519, 999,2048,2320,1705, # 6294 +7754,3095, 615,1662, 151, 597,3992,2405,2321,1049, 275,4482,3686,4193, 568,3687, # 6310 +3571,2480,4194,3688,7755,2425,2270, 409,3218,7756,1566,2874,3467,1002, 769,2840, # 6326 + 194,2090,3149,3689,2222,3294,4195, 628,1505,7757,7758,1763,2177,3001,3993, 521, # 6342 +1161,2584,1787,2203,2406,4483,3994,1625,4196,4197, 412, 42,3096, 464,7759,2632, # 6358 +4484,3363,1760,1571,2875,3468,2530,1219,2204,3814,2633,2140,2368,4485,4486,3295, # 6374 +1651,3364,3572,7760,7761,3573,2481,3469,7762,3690,7763,7764,2271,2091, 460,7765, # 6390 +4487,7766,3002, 962, 588,3574, 289,3219,2634,1116, 52,7767,3047,1796,7768,7769, # 6406 +7770,1467,7771,1598,1143,3691,4198,1984,1734,1067,4488,1280,3365, 465,4489,1572, # 6422 + 510,7772,1927,2241,1812,1644,3575,7773,4490,3692,7774,7775,2663,1573,1534,7776, # 6438 +7777,4199, 536,1807,1761,3470,3815,3150,2635,7778,7779,7780,4491,3471,2915,1911, # 6454 +2796,7781,3296,1122, 377,3220,7782, 360,7783,7784,4200,1529, 551,7785,2059,3693, # 6470 +1769,2426,7786,2916,4201,3297,3097,2322,2108,2030,4492,1404, 136,1468,1479, 672, # 6486 +1171,3221,2303, 271,3151,7787,2762,7788,2049, 678,2727, 865,1947,4493,7789,2013, # 6502 +3995,2956,7790,2728,2223,1397,3048,3694,4494,4495,1735,2917,3366,3576,7791,3816, # 6518 + 509,2841,2453,2876,3817,7792,7793,3152,3153,4496,4202,2531,4497,2304,1166,1010, # 6534 + 552, 681,1887,7794,7795,2957,2958,3996,1287,1596,1861,3154, 358, 453, 736, 175, # 6550 + 478,1117, 905,1167,1097,7796,1853,1530,7797,1706,7798,2178,3472,2287,3695,3473, # 6566 +3577,4203,2092,4204,7799,3367,1193,2482,4205,1458,2190,2205,1862,1888,1421,3298, # 6582 +2918,3049,2179,3474, 595,2122,7800,3997,7801,7802,4206,1707,2636, 223,3696,1359, # 6598 + 751,3098, 183,3475,7803,2797,3003, 419,2369, 633, 704,3818,2389, 241,7804,7805, # 6614 +7806, 838,3004,3697,2272,2763,2454,3819,1938,2050,3998,1309,3099,2242,1181,7807, # 6630 +1136,2206,3820,2370,1446,4207,2305,4498,7808,7809,4208,1055,2605, 484,3698,7810, # 6646 +3999, 625,4209,2273,3368,1499,4210,4000,7811,4001,4211,3222,2274,2275,3476,7812, # 6662 +7813,2764, 808,2606,3699,3369,4002,4212,3100,2532, 526,3370,3821,4213, 955,7814, # 6678 +1620,4214,2637,2427,7815,1429,3700,1669,1831, 994, 928,7816,3578,1260,7817,7818, # 6694 +7819,1948,2288, 741,2919,1626,4215,2729,2455, 867,1184, 362,3371,1392,7820,7821, # 6710 +4003,4216,1770,1736,3223,2920,4499,4500,1928,2698,1459,1158,7822,3050,3372,2877, # 6726 +1292,1929,2506,2842,3701,1985,1187,2071,2014,2607,4217,7823,2566,2507,2169,3702, # 6742 +2483,3299,7824,3703,4501,7825,7826, 666,1003,3005,1022,3579,4218,7827,4502,1813, # 6758 +2253, 574,3822,1603, 295,1535, 705,3823,4219, 283, 858, 417,7828,7829,3224,4503, # 6774 +4504,3051,1220,1889,1046,2276,2456,4004,1393,1599, 689,2567, 388,4220,7830,2484, # 6790 + 802,7831,2798,3824,2060,1405,2254,7832,4505,3825,2109,1052,1345,3225,1585,7833, # 6806 + 809,7834,7835,7836, 575,2730,3477, 956,1552,1469,1144,2323,7837,2324,1560,2457, # 6822 +3580,3226,4005, 616,2207,3155,2180,2289,7838,1832,7839,3478,4506,7840,1319,3704, # 6838 +3705,1211,3581,1023,3227,1293,2799,7841,7842,7843,3826, 607,2306,3827, 762,2878, # 6854 +1439,4221,1360,7844,1485,3052,7845,4507,1038,4222,1450,2061,2638,4223,1379,4508, # 6870 +2585,7846,7847,4224,1352,1414,2325,2921,1172,7848,7849,3828,3829,7850,1797,1451, # 6886 +7851,7852,7853,7854,2922,4006,4007,2485,2346, 411,4008,4009,3582,3300,3101,4509, # 6902 +1561,2664,1452,4010,1375,7855,7856, 47,2959, 316,7857,1406,1591,2923,3156,7858, # 6918 +1025,2141,3102,3157, 354,2731, 884,2224,4225,2407, 508,3706, 726,3583, 996,2428, # 6934 +3584, 729,7859, 392,2191,1453,4011,4510,3707,7860,7861,2458,3585,2608,1675,2800, # 6950 + 919,2347,2960,2348,1270,4511,4012, 73,7862,7863, 647,7864,3228,2843,2255,1550, # 6966 +1346,3006,7865,1332, 883,3479,7866,7867,7868,7869,3301,2765,7870,1212, 831,1347, # 6982 +4226,4512,2326,3830,1863,3053, 720,3831,4513,4514,3832,7871,4227,7872,7873,4515, # 6998 +7874,7875,1798,4516,3708,2609,4517,3586,1645,2371,7876,7877,2924, 669,2208,2665, # 7014 +2429,7878,2879,7879,7880,1028,3229,7881,4228,2408,7882,2256,1353,7883,7884,4518, # 7030 +3158, 518,7885,4013,7886,4229,1960,7887,2142,4230,7888,7889,3007,2349,2350,3833, # 7046 + 516,1833,1454,4014,2699,4231,4519,2225,2610,1971,1129,3587,7890,2766,7891,2961, # 7062 +1422, 577,1470,3008,1524,3373,7892,7893, 432,4232,3054,3480,7894,2586,1455,2508, # 7078 +2226,1972,1175,7895,1020,2732,4015,3481,4520,7896,2733,7897,1743,1361,3055,3482, # 7094 +2639,4016,4233,4521,2290, 895, 924,4234,2170, 331,2243,3056, 166,1627,3057,1098, # 7110 +7898,1232,2880,2227,3374,4522, 657, 403,1196,2372, 542,3709,3375,1600,4235,3483, # 7126 +7899,4523,2767,3230, 576, 530,1362,7900,4524,2533,2666,3710,4017,7901, 842,3834, # 7142 +7902,2801,2031,1014,4018, 213,2700,3376, 665, 621,4236,7903,3711,2925,2430,7904, # 7158 +2431,3302,3588,3377,7905,4237,2534,4238,4525,3589,1682,4239,3484,1380,7906, 724, # 7174 +2277, 600,1670,7907,1337,1233,4526,3103,2244,7908,1621,4527,7909, 651,4240,7910, # 7190 +1612,4241,2611,7911,2844,7912,2734,2307,3058,7913, 716,2459,3059, 174,1255,2701, # 7206 +4019,3590, 548,1320,1398, 728,4020,1574,7914,1890,1197,3060,4021,7915,3061,3062, # 7222 +3712,3591,3713, 747,7916, 635,4242,4528,7917,7918,7919,4243,7920,7921,4529,7922, # 7238 +3378,4530,2432, 451,7923,3714,2535,2072,4244,2735,4245,4022,7924,1764,4531,7925, # 7254 +4246, 350,7926,2278,2390,2486,7927,4247,4023,2245,1434,4024, 488,4532, 458,4248, # 7270 +4025,3715, 771,1330,2391,3835,2568,3159,2159,2409,1553,2667,3160,4249,7928,2487, # 7286 +2881,2612,1720,2702,4250,3379,4533,7929,2536,4251,7930,3231,4252,2768,7931,2015, # 7302 +2736,7932,1155,1017,3716,3836,7933,3303,2308, 201,1864,4253,1430,7934,4026,7935, # 7318 +7936,7937,7938,7939,4254,1604,7940, 414,1865, 371,2587,4534,4535,3485,2016,3104, # 7334 +4536,1708, 960,4255, 887, 389,2171,1536,1663,1721,7941,2228,4027,2351,2926,1580, # 7350 +7942,7943,7944,1744,7945,2537,4537,4538,7946,4539,7947,2073,7948,7949,3592,3380, # 7366 +2882,4256,7950,4257,2640,3381,2802, 673,2703,2460, 709,3486,4028,3593,4258,7951, # 7382 +1148, 502, 634,7952,7953,1204,4540,3594,1575,4541,2613,3717,7954,3718,3105, 948, # 7398 +3232, 121,1745,3837,1110,7955,4259,3063,2509,3009,4029,3719,1151,1771,3838,1488, # 7414 +4030,1986,7956,2433,3487,7957,7958,2093,7959,4260,3839,1213,1407,2803, 531,2737, # 7430 +2538,3233,1011,1537,7960,2769,4261,3106,1061,7961,3720,3721,1866,2883,7962,2017, # 7446 + 120,4262,4263,2062,3595,3234,2309,3840,2668,3382,1954,4542,7963,7964,3488,1047, # 7462 +2704,1266,7965,1368,4543,2845, 649,3383,3841,2539,2738,1102,2846,2669,7966,7967, # 7478 +1999,7968,1111,3596,2962,7969,2488,3842,3597,2804,1854,3384,3722,7970,7971,3385, # 7494 +2410,2884,3304,3235,3598,7972,2569,7973,3599,2805,4031,1460, 856,7974,3600,7975, # 7510 +2885,2963,7976,2886,3843,7977,4264, 632,2510, 875,3844,1697,3845,2291,7978,7979, # 7526 +4544,3010,1239, 580,4545,4265,7980, 914, 936,2074,1190,4032,1039,2123,7981,7982, # 7542 +7983,3386,1473,7984,1354,4266,3846,7985,2172,3064,4033, 915,3305,4267,4268,3306, # 7558 +1605,1834,7986,2739, 398,3601,4269,3847,4034, 328,1912,2847,4035,3848,1331,4270, # 7574 +3011, 937,4271,7987,3602,4036,4037,3387,2160,4546,3388, 524, 742, 538,3065,1012, # 7590 +7988,7989,3849,2461,7990, 658,1103, 225,3850,7991,7992,4547,7993,4548,7994,3236, # 7606 +1243,7995,4038, 963,2246,4549,7996,2705,3603,3161,7997,7998,2588,2327,7999,4550, # 7622 +8000,8001,8002,3489,3307, 957,3389,2540,2032,1930,2927,2462, 870,2018,3604,1746, # 7638 +2770,2771,2434,2463,8003,3851,8004,3723,3107,3724,3490,3390,3725,8005,1179,3066, # 7654 +8006,3162,2373,4272,3726,2541,3163,3108,2740,4039,8007,3391,1556,2542,2292, 977, # 7670 +2887,2033,4040,1205,3392,8008,1765,3393,3164,2124,1271,1689, 714,4551,3491,8009, # 7686 +2328,3852, 533,4273,3605,2181, 617,8010,2464,3308,3492,2310,8011,8012,3165,8013, # 7702 +8014,3853,1987, 618, 427,2641,3493,3394,8015,8016,1244,1690,8017,2806,4274,4552, # 7718 +8018,3494,8019,8020,2279,1576, 473,3606,4275,3395, 972,8021,3607,8022,3067,8023, # 7734 +8024,4553,4554,8025,3727,4041,4042,8026, 153,4555, 356,8027,1891,2888,4276,2143, # 7750 + 408, 803,2352,8028,3854,8029,4277,1646,2570,2511,4556,4557,3855,8030,3856,4278, # 7766 +8031,2411,3396, 752,8032,8033,1961,2964,8034, 746,3012,2465,8035,4279,3728, 698, # 7782 +4558,1892,4280,3608,2543,4559,3609,3857,8036,3166,3397,8037,1823,1302,4043,2706, # 7798 +3858,1973,4281,8038,4282,3167, 823,1303,1288,1236,2848,3495,4044,3398, 774,3859, # 7814 +8039,1581,4560,1304,2849,3860,4561,8040,2435,2161,1083,3237,4283,4045,4284, 344, # 7830 +1173, 288,2311, 454,1683,8041,8042,1461,4562,4046,2589,8043,8044,4563, 985, 894, # 7846 +8045,3399,3168,8046,1913,2928,3729,1988,8047,2110,1974,8048,4047,8049,2571,1194, # 7862 + 425,8050,4564,3169,1245,3730,4285,8051,8052,2850,8053, 636,4565,1855,3861, 760, # 7878 +1799,8054,4286,2209,1508,4566,4048,1893,1684,2293,8055,8056,8057,4287,4288,2210, # 7894 + 479,8058,8059, 832,8060,4049,2489,8061,2965,2490,3731, 990,3109, 627,1814,2642, # 7910 +4289,1582,4290,2125,2111,3496,4567,8062, 799,4291,3170,8063,4568,2112,1737,3013, # 7926 +1018, 543, 754,4292,3309,1676,4569,4570,4050,8064,1489,8065,3497,8066,2614,2889, # 7942 +4051,8067,8068,2966,8069,8070,8071,8072,3171,4571,4572,2182,1722,8073,3238,3239, # 7958 +1842,3610,1715, 481, 365,1975,1856,8074,8075,1962,2491,4573,8076,2126,3611,3240, # 7974 + 433,1894,2063,2075,8077, 602,2741,8078,8079,8080,8081,8082,3014,1628,3400,8083, # 7990 +3172,4574,4052,2890,4575,2512,8084,2544,2772,8085,8086,8087,3310,4576,2891,8088, # 8006 +4577,8089,2851,4578,4579,1221,2967,4053,2513,8090,8091,8092,1867,1989,8093,8094, # 8022 +8095,1895,8096,8097,4580,1896,4054, 318,8098,2094,4055,4293,8099,8100, 485,8101, # 8038 + 938,3862, 553,2670, 116,8102,3863,3612,8103,3498,2671,2773,3401,3311,2807,8104, # 8054 +3613,2929,4056,1747,2930,2968,8105,8106, 207,8107,8108,2672,4581,2514,8109,3015, # 8070 + 890,3614,3864,8110,1877,3732,3402,8111,2183,2353,3403,1652,8112,8113,8114, 941, # 8086 +2294, 208,3499,4057,2019, 330,4294,3865,2892,2492,3733,4295,8115,8116,8117,8118, # 8102 +) + diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/euctwfreq.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/euctwfreq.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7256c5eb54e71c899d8011f69696aee30dc3f410 GIT binary patch literal 54757 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 literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/euctwprober.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/euctwprober.py new file mode 100644 index 0000000..35669cc --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/euctwprober.py @@ -0,0 +1,46 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .mbcharsetprober import MultiByteCharSetProber +from .codingstatemachine import CodingStateMachine +from .chardistribution import EUCTWDistributionAnalysis +from .mbcssm import EUCTW_SM_MODEL + +class EUCTWProber(MultiByteCharSetProber): + def __init__(self): + super(EUCTWProber, self).__init__() + self.coding_sm = CodingStateMachine(EUCTW_SM_MODEL) + self.distribution_analyzer = EUCTWDistributionAnalysis() + self.reset() + + @property + def charset_name(self): + return "EUC-TW" + + @property + def language(self): + return "Taiwan" diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/euctwprober.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/euctwprober.pyc new file mode 100644 index 0000000000000000000000000000000000000000..33912b3f454ec390e1bf94e69ebc50f8c555c07f GIT binary patch literal 1601 zcmd5+&2G~`5T3R3*V2*-1QHS#IQc+ve-OPC1WkJ*1=&FrKCp7)O}dfo81Ez{6*qV> zo{1M=W;ZRpacphRcxQIKJKr}m_Wx|IfB*gF>j+ktPw#gmCLxv4BOnJT1SA3k+aBZ| z6h0)rvwg@LP&6TFI=caR3yL-*ZL*u71dIh_E%*iS6W~kIfvgR2(4pRqs5lV}+mU*-+JP{sGPRW|=N0F{Y^c>F8XS%FR8Yxs%Vm!P&7kSnJ^&^{jkf zruoun(|SDf+|%?<2=oCPycKz66R^cz9=BOfJ9ZJB9a{{i!5VMV z1tb-2Gcy>-aB}GnndifA{VO6W_38Cgl7svH6P(cWz+t$T1G88_Bn}Rlpr38uGkRQ z^fFpYF9%F%i37%YYWOQEhwZ_cLtt51C+DpL!VQXou@cv^Obf*k8IBsf|G}c_02rkD zA}#M6tPX{ir{!dxPSgt;uOI~+@~T1^t(3@Vkg}L%^PEhZV7q{FP9=@Yh`Tb{B=s*@ zc63`M$hGy1#8y>HthKt0RU>xETMSp(bTu213y^ 0.79 -- 0.79 +# 1024 --> 0.92 -- 0.13 +# 2048 --> 0.98 -- 0.06 +# 6768 --> 1.00 -- 0.02 +# +# Ideal Distribution Ratio = 0.79135/(1-0.79135) = 3.79 +# Random Distribution Ration = 512 / (3755 - 512) = 0.157 +# +# Typical Distribution Ratio about 25% of Ideal one, still much higher that RDR + +GB2312_TYPICAL_DISTRIBUTION_RATIO = 0.9 + +GB2312_TABLE_SIZE = 3760 + +GB2312_CHAR_TO_FREQ_ORDER = ( +1671, 749,1443,2364,3924,3807,2330,3921,1704,3463,2691,1511,1515, 572,3191,2205, +2361, 224,2558, 479,1711, 963,3162, 440,4060,1905,2966,2947,3580,2647,3961,3842, +2204, 869,4207, 970,2678,5626,2944,2956,1479,4048, 514,3595, 588,1346,2820,3409, + 249,4088,1746,1873,2047,1774, 581,1813, 358,1174,3590,1014,1561,4844,2245, 670, +1636,3112, 889,1286, 953, 556,2327,3060,1290,3141, 613, 185,3477,1367, 850,3820, +1715,2428,2642,2303,2732,3041,2562,2648,3566,3946,1349, 388,3098,2091,1360,3585, + 152,1687,1539, 738,1559, 59,1232,2925,2267,1388,1249,1741,1679,2960, 151,1566, +1125,1352,4271, 924,4296, 385,3166,4459, 310,1245,2850, 70,3285,2729,3534,3575, +2398,3298,3466,1960,2265, 217,3647, 864,1909,2084,4401,2773,1010,3269,5152, 853, +3051,3121,1244,4251,1895, 364,1499,1540,2313,1180,3655,2268, 562, 715,2417,3061, + 544, 336,3768,2380,1752,4075, 950, 280,2425,4382, 183,2759,3272, 333,4297,2155, +1688,2356,1444,1039,4540, 736,1177,3349,2443,2368,2144,2225, 565, 196,1482,3406, + 927,1335,4147, 692, 878,1311,1653,3911,3622,1378,4200,1840,2969,3149,2126,1816, +2534,1546,2393,2760, 737,2494, 13, 447, 245,2747, 38,2765,2129,2589,1079, 606, + 360, 471,3755,2890, 404, 848, 699,1785,1236, 370,2221,1023,3746,2074,2026,2023, +2388,1581,2119, 812,1141,3091,2536,1519, 804,2053, 406,1596,1090, 784, 548,4414, +1806,2264,2936,1100, 343,4114,5096, 622,3358, 743,3668,1510,1626,5020,3567,2513, +3195,4115,5627,2489,2991, 24,2065,2697,1087,2719, 48,1634, 315, 68, 985,2052, + 198,2239,1347,1107,1439, 597,2366,2172, 871,3307, 919,2487,2790,1867, 236,2570, +1413,3794, 906,3365,3381,1701,1982,1818,1524,2924,1205, 616,2586,2072,2004, 575, + 253,3099, 32,1365,1182, 197,1714,2454,1201, 554,3388,3224,2748, 756,2587, 250, +2567,1507,1517,3529,1922,2761,2337,3416,1961,1677,2452,2238,3153, 615, 911,1506, +1474,2495,1265,1906,2749,3756,3280,2161, 898,2714,1759,3450,2243,2444, 563, 26, +3286,2266,3769,3344,2707,3677, 611,1402, 531,1028,2871,4548,1375, 261,2948, 835, +1190,4134, 353, 840,2684,1900,3082,1435,2109,1207,1674, 329,1872,2781,4055,2686, +2104, 608,3318,2423,2957,2768,1108,3739,3512,3271,3985,2203,1771,3520,1418,2054, +1681,1153, 225,1627,2929, 162,2050,2511,3687,1954, 124,1859,2431,1684,3032,2894, + 585,4805,3969,2869,2704,2088,2032,2095,3656,2635,4362,2209, 256, 518,2042,2105, +3777,3657, 643,2298,1148,1779, 190, 989,3544, 414, 11,2135,2063,2979,1471, 403, +3678, 126, 770,1563, 671,2499,3216,2877, 600,1179, 307,2805,4937,1268,1297,2694, + 252,4032,1448,1494,1331,1394, 127,2256, 222,1647,1035,1481,3056,1915,1048, 873, +3651, 210, 33,1608,2516, 200,1520, 415, 102, 0,3389,1287, 817, 91,3299,2940, + 836,1814, 549,2197,1396,1669,2987,3582,2297,2848,4528,1070, 687, 20,1819, 121, +1552,1364,1461,1968,2617,3540,2824,2083, 177, 948,4938,2291, 110,4549,2066, 648, +3359,1755,2110,2114,4642,4845,1693,3937,3308,1257,1869,2123, 208,1804,3159,2992, +2531,2549,3361,2418,1350,2347,2800,2568,1291,2036,2680, 72, 842,1990, 212,1233, +1154,1586, 75,2027,3410,4900,1823,1337,2710,2676, 728,2810,1522,3026,4995, 157, + 755,1050,4022, 710, 785,1936,2194,2085,1406,2777,2400, 150,1250,4049,1206, 807, +1910, 534, 529,3309,1721,1660, 274, 39,2827, 661,2670,1578, 925,3248,3815,1094, +4278,4901,4252, 41,1150,3747,2572,2227,4501,3658,4902,3813,3357,3617,2884,2258, + 887, 538,4187,3199,1294,2439,3042,2329,2343,2497,1255, 107, 543,1527, 521,3478, +3568, 194,5062, 15, 961,3870,1241,1192,2664, 66,5215,3260,2111,1295,1127,2152, +3805,4135, 901,1164,1976, 398,1278, 530,1460, 748, 904,1054,1966,1426, 53,2909, + 509, 523,2279,1534, 536,1019, 239,1685, 460,2353, 673,1065,2401,3600,4298,2272, +1272,2363, 284,1753,3679,4064,1695, 81, 815,2677,2757,2731,1386, 859, 500,4221, +2190,2566, 757,1006,2519,2068,1166,1455, 337,2654,3203,1863,1682,1914,3025,1252, +1409,1366, 847, 714,2834,2038,3209, 964,2970,1901, 885,2553,1078,1756,3049, 301, +1572,3326, 688,2130,1996,2429,1805,1648,2930,3421,2750,3652,3088, 262,1158,1254, + 389,1641,1812, 526,1719, 923,2073,1073,1902, 468, 489,4625,1140, 857,2375,3070, +3319,2863, 380, 116,1328,2693,1161,2244, 273,1212,1884,2769,3011,1775,1142, 461, +3066,1200,2147,2212, 790, 702,2695,4222,1601,1058, 434,2338,5153,3640, 67,2360, +4099,2502, 618,3472,1329, 416,1132, 830,2782,1807,2653,3211,3510,1662, 192,2124, + 296,3979,1739,1611,3684, 23, 118, 324, 446,1239,1225, 293,2520,3814,3795,2535, +3116, 17,1074, 467,2692,2201, 387,2922, 45,1326,3055,1645,3659,2817, 958, 243, +1903,2320,1339,2825,1784,3289, 356, 576, 865,2315,2381,3377,3916,1088,3122,1713, +1655, 935, 628,4689,1034,1327, 441, 800, 720, 894,1979,2183,1528,5289,2702,1071, +4046,3572,2399,1571,3281, 79, 761,1103, 327, 134, 758,1899,1371,1615, 879, 442, + 215,2605,2579, 173,2048,2485,1057,2975,3317,1097,2253,3801,4263,1403,1650,2946, + 814,4968,3487,1548,2644,1567,1285, 2, 295,2636, 97, 946,3576, 832, 141,4257, +3273, 760,3821,3521,3156,2607, 949,1024,1733,1516,1803,1920,2125,2283,2665,3180, +1501,2064,3560,2171,1592, 803,3518,1416, 732,3897,4258,1363,1362,2458, 119,1427, + 602,1525,2608,1605,1639,3175, 694,3064, 10, 465, 76,2000,4846,4208, 444,3781, +1619,3353,2206,1273,3796, 740,2483, 320,1723,2377,3660,2619,1359,1137,1762,1724, +2345,2842,1850,1862, 912, 821,1866, 612,2625,1735,2573,3369,1093, 844, 89, 937, + 930,1424,3564,2413,2972,1004,3046,3019,2011, 711,3171,1452,4178, 428, 801,1943, + 432, 445,2811, 206,4136,1472, 730, 349, 73, 397,2802,2547, 998,1637,1167, 789, + 396,3217, 154,1218, 716,1120,1780,2819,4826,1931,3334,3762,2139,1215,2627, 552, +3664,3628,3232,1405,2383,3111,1356,2652,3577,3320,3101,1703, 640,1045,1370,1246, +4996, 371,1575,2436,1621,2210, 984,4033,1734,2638, 16,4529, 663,2755,3255,1451, +3917,2257,1253,1955,2234,1263,2951, 214,1229, 617, 485, 359,1831,1969, 473,2310, + 750,2058, 165, 80,2864,2419, 361,4344,2416,2479,1134, 796,3726,1266,2943, 860, +2715, 938, 390,2734,1313,1384, 248, 202, 877,1064,2854, 522,3907, 279,1602, 297, +2357, 395,3740, 137,2075, 944,4089,2584,1267,3802, 62,1533,2285, 178, 176, 780, +2440, 201,3707, 590, 478,1560,4354,2117,1075, 30, 74,4643,4004,1635,1441,2745, + 776,2596, 238,1077,1692,1912,2844, 605, 499,1742,3947, 241,3053, 980,1749, 936, +2640,4511,2582, 515,1543,2162,5322,2892,2993, 890,2148,1924, 665,1827,3581,1032, + 968,3163, 339,1044,1896, 270, 583,1791,1720,4367,1194,3488,3669, 43,2523,1657, + 163,2167, 290,1209,1622,3378, 550, 634,2508,2510, 695,2634,2384,2512,1476,1414, + 220,1469,2341,2138,2852,3183,2900,4939,2865,3502,1211,3680, 854,3227,1299,2976, +3172, 186,2998,1459, 443,1067,3251,1495, 321,1932,3054, 909, 753,1410,1828, 436, +2441,1119,1587,3164,2186,1258, 227, 231,1425,1890,3200,3942, 247, 959, 725,5254, +2741, 577,2158,2079, 929, 120, 174, 838,2813, 591,1115, 417,2024, 40,3240,1536, +1037, 291,4151,2354, 632,1298,2406,2500,3535,1825,1846,3451, 205,1171, 345,4238, + 18,1163, 811, 685,2208,1217, 425,1312,1508,1175,4308,2552,1033, 587,1381,3059, +2984,3482, 340,1316,4023,3972, 792,3176, 519, 777,4690, 918, 933,4130,2981,3741, + 90,3360,2911,2200,5184,4550, 609,3079,2030, 272,3379,2736, 363,3881,1130,1447, + 286, 779, 357,1169,3350,3137,1630,1220,2687,2391, 747,1277,3688,2618,2682,2601, +1156,3196,5290,4034,3102,1689,3596,3128, 874, 219,2783, 798, 508,1843,2461, 269, +1658,1776,1392,1913,2983,3287,2866,2159,2372, 829,4076, 46,4253,2873,1889,1894, + 915,1834,1631,2181,2318, 298, 664,2818,3555,2735, 954,3228,3117, 527,3511,2173, + 681,2712,3033,2247,2346,3467,1652, 155,2164,3382, 113,1994, 450, 899, 494, 994, +1237,2958,1875,2336,1926,3727, 545,1577,1550, 633,3473, 204,1305,3072,2410,1956, +2471, 707,2134, 841,2195,2196,2663,3843,1026,4940, 990,3252,4997, 368,1092, 437, +3212,3258,1933,1829, 675,2977,2893, 412, 943,3723,4644,3294,3283,2230,2373,5154, +2389,2241,2661,2323,1404,2524, 593, 787, 677,3008,1275,2059, 438,2709,2609,2240, +2269,2246,1446, 36,1568,1373,3892,1574,2301,1456,3962, 693,2276,5216,2035,1143, +2720,1919,1797,1811,2763,4137,2597,1830,1699,1488,1198,2090, 424,1694, 312,3634, +3390,4179,3335,2252,1214, 561,1059,3243,2295,2561, 975,5155,2321,2751,3772, 472, +1537,3282,3398,1047,2077,2348,2878,1323,3340,3076, 690,2906, 51, 369, 170,3541, +1060,2187,2688,3670,2541,1083,1683, 928,3918, 459, 109,4427, 599,3744,4286, 143, +2101,2730,2490, 82,1588,3036,2121, 281,1860, 477,4035,1238,2812,3020,2716,3312, +1530,2188,2055,1317, 843, 636,1808,1173,3495, 649, 181,1002, 147,3641,1159,2414, +3750,2289,2795, 813,3123,2610,1136,4368, 5,3391,4541,2174, 420, 429,1728, 754, +1228,2115,2219, 347,2223,2733, 735,1518,3003,2355,3134,1764,3948,3329,1888,2424, +1001,1234,1972,3321,3363,1672,1021,1450,1584, 226, 765, 655,2526,3404,3244,2302, +3665, 731, 594,2184, 319,1576, 621, 658,2656,4299,2099,3864,1279,2071,2598,2739, + 795,3086,3699,3908,1707,2352,2402,1382,3136,2475,1465,4847,3496,3865,1085,3004, +2591,1084, 213,2287,1963,3565,2250, 822, 793,4574,3187,1772,1789,3050, 595,1484, +1959,2770,1080,2650, 456, 422,2996, 940,3322,4328,4345,3092,2742, 965,2784, 739, +4124, 952,1358,2498,2949,2565, 332,2698,2378, 660,2260,2473,4194,3856,2919, 535, +1260,2651,1208,1428,1300,1949,1303,2942, 433,2455,2450,1251,1946, 614,1269, 641, +1306,1810,2737,3078,2912, 564,2365,1419,1415,1497,4460,2367,2185,1379,3005,1307, +3218,2175,1897,3063, 682,1157,4040,4005,1712,1160,1941,1399, 394, 402,2952,1573, +1151,2986,2404, 862, 299,2033,1489,3006, 346, 171,2886,3401,1726,2932, 168,2533, + 47,2507,1030,3735,1145,3370,1395,1318,1579,3609,4560,2857,4116,1457,2529,1965, + 504,1036,2690,2988,2405, 745,5871, 849,2397,2056,3081, 863,2359,3857,2096, 99, +1397,1769,2300,4428,1643,3455,1978,1757,3718,1440, 35,4879,3742,1296,4228,2280, + 160,5063,1599,2013, 166, 520,3479,1646,3345,3012, 490,1937,1545,1264,2182,2505, +1096,1188,1369,1436,2421,1667,2792,2460,1270,2122, 727,3167,2143, 806,1706,1012, +1800,3037, 960,2218,1882, 805, 139,2456,1139,1521, 851,1052,3093,3089, 342,2039, + 744,5097,1468,1502,1585,2087, 223, 939, 326,2140,2577, 892,2481,1623,4077, 982, +3708, 135,2131, 87,2503,3114,2326,1106, 876,1616, 547,2997,2831,2093,3441,4530, +4314, 9,3256,4229,4148, 659,1462,1986,1710,2046,2913,2231,4090,4880,5255,3392, +3274,1368,3689,4645,1477, 705,3384,3635,1068,1529,2941,1458,3782,1509, 100,1656, +2548, 718,2339, 408,1590,2780,3548,1838,4117,3719,1345,3530, 717,3442,2778,3220, +2898,1892,4590,3614,3371,2043,1998,1224,3483, 891, 635, 584,2559,3355, 733,1766, +1729,1172,3789,1891,2307, 781,2982,2271,1957,1580,5773,2633,2005,4195,3097,1535, +3213,1189,1934,5693,3262, 586,3118,1324,1598, 517,1564,2217,1868,1893,4445,3728, +2703,3139,1526,1787,1992,3882,2875,1549,1199,1056,2224,1904,2711,5098,4287, 338, +1993,3129,3489,2689,1809,2815,1997, 957,1855,3898,2550,3275,3057,1105,1319, 627, +1505,1911,1883,3526, 698,3629,3456,1833,1431, 746, 77,1261,2017,2296,1977,1885, + 125,1334,1600, 525,1798,1109,2222,1470,1945, 559,2236,1186,3443,2476,1929,1411, +2411,3135,1777,3372,2621,1841,1613,3229, 668,1430,1839,2643,2916, 195,1989,2671, +2358,1387, 629,3205,2293,5256,4439, 123,1310, 888,1879,4300,3021,3605,1003,1162, +3192,2910,2010, 140,2395,2859, 55,1082,2012,2901, 662, 419,2081,1438, 680,2774, +4654,3912,1620,1731,1625,5035,4065,2328, 512,1344, 802,5443,2163,2311,2537, 524, +3399, 98,1155,2103,1918,2606,3925,2816,1393,2465,1504,3773,2177,3963,1478,4346, + 180,1113,4655,3461,2028,1698, 833,2696,1235,1322,1594,4408,3623,3013,3225,2040, +3022, 541,2881, 607,3632,2029,1665,1219, 639,1385,1686,1099,2803,3231,1938,3188, +2858, 427, 676,2772,1168,2025, 454,3253,2486,3556, 230,1950, 580, 791,1991,1280, +1086,1974,2034, 630, 257,3338,2788,4903,1017, 86,4790, 966,2789,1995,1696,1131, + 259,3095,4188,1308, 179,1463,5257, 289,4107,1248, 42,3413,1725,2288, 896,1947, + 774,4474,4254, 604,3430,4264, 392,2514,2588, 452, 237,1408,3018, 988,4531,1970, +3034,3310, 540,2370,1562,1288,2990, 502,4765,1147, 4,1853,2708, 207, 294,2814, +4078,2902,2509, 684, 34,3105,3532,2551, 644, 709,2801,2344, 573,1727,3573,3557, +2021,1081,3100,4315,2100,3681, 199,2263,1837,2385, 146,3484,1195,2776,3949, 997, +1939,3973,1008,1091,1202,1962,1847,1149,4209,5444,1076, 493, 117,5400,2521, 972, +1490,2934,1796,4542,2374,1512,2933,2657, 413,2888,1135,2762,2314,2156,1355,2369, + 766,2007,2527,2170,3124,2491,2593,2632,4757,2437, 234,3125,3591,1898,1750,1376, +1942,3468,3138, 570,2127,2145,3276,4131, 962, 132,1445,4196, 19, 941,3624,3480, +3366,1973,1374,4461,3431,2629, 283,2415,2275, 808,2887,3620,2112,2563,1353,3610, + 955,1089,3103,1053, 96, 88,4097, 823,3808,1583, 399, 292,4091,3313, 421,1128, + 642,4006, 903,2539,1877,2082, 596, 29,4066,1790, 722,2157, 130, 995,1569, 769, +1485, 464, 513,2213, 288,1923,1101,2453,4316, 133, 486,2445, 50, 625, 487,2207, + 57, 423, 481,2962, 159,3729,1558, 491, 303, 482, 501, 240,2837, 112,3648,2392, +1783, 362, 8,3433,3422, 610,2793,3277,1390,1284,1654, 21,3823, 734, 367, 623, + 193, 287, 374,1009,1483, 816, 476, 313,2255,2340,1262,2150,2899,1146,2581, 782, +2116,1659,2018,1880, 255,3586,3314,1110,2867,2137,2564, 986,2767,5185,2006, 650, + 158, 926, 762, 881,3157,2717,2362,3587, 306,3690,3245,1542,3077,2427,1691,2478, +2118,2985,3490,2438, 539,2305, 983, 129,1754, 355,4201,2386, 827,2923, 104,1773, +2838,2771, 411,2905,3919, 376, 767, 122,1114, 828,2422,1817,3506, 266,3460,1007, +1609,4998, 945,2612,4429,2274, 726,1247,1964,2914,2199,2070,4002,4108, 657,3323, +1422, 579, 455,2764,4737,1222,2895,1670, 824,1223,1487,2525, 558, 861,3080, 598, +2659,2515,1967, 752,2583,2376,2214,4180, 977, 704,2464,4999,2622,4109,1210,2961, + 819,1541, 142,2284, 44, 418, 457,1126,3730,4347,4626,1644,1876,3671,1864, 302, +1063,5694, 624, 723,1984,3745,1314,1676,2488,1610,1449,3558,3569,2166,2098, 409, +1011,2325,3704,2306, 818,1732,1383,1824,1844,3757, 999,2705,3497,1216,1423,2683, +2426,2954,2501,2726,2229,1475,2554,5064,1971,1794,1666,2014,1343, 783, 724, 191, +2434,1354,2220,5065,1763,2752,2472,4152, 131, 175,2885,3434, 92,1466,4920,2616, +3871,3872,3866, 128,1551,1632, 669,1854,3682,4691,4125,1230, 188,2973,3290,1302, +1213, 560,3266, 917, 763,3909,3249,1760, 868,1958, 764,1782,2097, 145,2277,3774, +4462, 64,1491,3062, 971,2132,3606,2442, 221,1226,1617, 218, 323,1185,3207,3147, + 571, 619,1473,1005,1744,2281, 449,1887,2396,3685, 275, 375,3816,1743,3844,3731, + 845,1983,2350,4210,1377, 773, 967,3499,3052,3743,2725,4007,1697,1022,3943,1464, +3264,2855,2722,1952,1029,2839,2467, 84,4383,2215, 820,1391,2015,2448,3672, 377, +1948,2168, 797,2545,3536,2578,2645, 94,2874,1678, 405,1259,3071, 771, 546,1315, + 470,1243,3083, 895,2468, 981, 969,2037, 846,4181, 653,1276,2928, 14,2594, 557, +3007,2474, 156, 902,1338,1740,2574, 537,2518, 973,2282,2216,2433,1928, 138,2903, +1293,2631,1612, 646,3457, 839,2935, 111, 496,2191,2847, 589,3186, 149,3994,2060, +4031,2641,4067,3145,1870, 37,3597,2136,1025,2051,3009,3383,3549,1121,1016,3261, +1301, 251,2446,2599,2153, 872,3246, 637, 334,3705, 831, 884, 921,3065,3140,4092, +2198,1944, 246,2964, 108,2045,1152,1921,2308,1031, 203,3173,4170,1907,3890, 810, +1401,2003,1690, 506, 647,1242,2828,1761,1649,3208,2249,1589,3709,2931,5156,1708, + 498, 666,2613, 834,3817,1231, 184,2851,1124, 883,3197,2261,3710,1765,1553,2658, +1178,2639,2351, 93,1193, 942,2538,2141,4402, 235,1821, 870,1591,2192,1709,1871, +3341,1618,4126,2595,2334, 603, 651, 69, 701, 268,2662,3411,2555,1380,1606, 503, + 448, 254,2371,2646, 574,1187,2309,1770, 322,2235,1292,1801, 305, 566,1133, 229, +2067,2057, 706, 167, 483,2002,2672,3295,1820,3561,3067, 316, 378,2746,3452,1112, + 136,1981, 507,1651,2917,1117, 285,4591, 182,2580,3522,1304, 335,3303,1835,2504, +1795,1792,2248, 674,1018,2106,2449,1857,2292,2845, 976,3047,1781,2600,2727,1389, +1281, 52,3152, 153, 265,3950, 672,3485,3951,4463, 430,1183, 365, 278,2169, 27, +1407,1336,2304, 209,1340,1730,2202,1852,2403,2883, 979,1737,1062, 631,2829,2542, +3876,2592, 825,2086,2226,3048,3625, 352,1417,3724, 542, 991, 431,1351,3938,1861, +2294, 826,1361,2927,3142,3503,1738, 463,2462,2723, 582,1916,1595,2808, 400,3845, +3891,2868,3621,2254, 58,2492,1123, 910,2160,2614,1372,1603,1196,1072,3385,1700, +3267,1980, 696, 480,2430, 920, 799,1570,2920,1951,2041,4047,2540,1321,4223,2469, +3562,2228,1271,2602, 401,2833,3351,2575,5157, 907,2312,1256, 410, 263,3507,1582, + 996, 678,1849,2316,1480, 908,3545,2237, 703,2322, 667,1826,2849,1531,2604,2999, +2407,3146,2151,2630,1786,3711, 469,3542, 497,3899,2409, 858, 837,4446,3393,1274, + 786, 620,1845,2001,3311, 484, 308,3367,1204,1815,3691,2332,1532,2557,1842,2020, +2724,1927,2333,4440, 567, 22,1673,2728,4475,1987,1858,1144,1597, 101,1832,3601, + 12, 974,3783,4391, 951,1412, 1,3720, 453,4608,4041, 528,1041,1027,3230,2628, +1129, 875,1051,3291,1203,2262,1069,2860,2799,2149,2615,3278, 144,1758,3040, 31, + 475,1680, 366,2685,3184, 311,1642,4008,2466,5036,1593,1493,2809, 216,1420,1668, + 233, 304,2128,3284, 232,1429,1768,1040,2008,3407,2740,2967,2543, 242,2133, 778, +1565,2022,2620, 505,2189,2756,1098,2273, 372,1614, 708, 553,2846,2094,2278, 169, +3626,2835,4161, 228,2674,3165, 809,1454,1309, 466,1705,1095, 900,3423, 880,2667, +3751,5258,2317,3109,2571,4317,2766,1503,1342, 866,4447,1118, 63,2076, 314,1881, +1348,1061, 172, 978,3515,1747, 532, 511,3970, 6, 601, 905,2699,3300,1751, 276, +1467,3725,2668, 65,4239,2544,2779,2556,1604, 578,2451,1802, 992,2331,2624,1320, +3446, 713,1513,1013, 103,2786,2447,1661, 886,1702, 916, 654,3574,2031,1556, 751, +2178,2821,2179,1498,1538,2176, 271, 914,2251,2080,1325, 638,1953,2937,3877,2432, +2754, 95,3265,1716, 260,1227,4083, 775, 106,1357,3254, 426,1607, 555,2480, 772, +1985, 244,2546, 474, 495,1046,2611,1851,2061, 71,2089,1675,2590, 742,3758,2843, +3222,1433, 267,2180,2576,2826,2233,2092,3913,2435, 956,1745,3075, 856,2113,1116, + 451, 3,1988,2896,1398, 993,2463,1878,2049,1341,2718,2721,2870,2108, 712,2904, +4363,2753,2324, 277,2872,2349,2649, 384, 987, 435, 691,3000, 922, 164,3939, 652, +1500,1184,4153,2482,3373,2165,4848,2335,3775,3508,3154,2806,2830,1554,2102,1664, +2530,1434,2408, 893,1547,2623,3447,2832,2242,2532,3169,2856,3223,2078, 49,3770, +3469, 462, 318, 656,2259,3250,3069, 679,1629,2758, 344,1138,1104,3120,1836,1283, +3115,2154,1437,4448, 934, 759,1999, 794,2862,1038, 533,2560,1722,2342, 855,2626, +1197,1663,4476,3127, 85,4240,2528, 25,1111,1181,3673, 407,3470,4561,2679,2713, + 768,1925,2841,3986,1544,1165, 932, 373,1240,2146,1930,2673, 721,4766, 354,4333, + 391,2963, 187, 61,3364,1442,1102, 330,1940,1767, 341,3809,4118, 393,2496,2062, +2211, 105, 331, 300, 439, 913,1332, 626, 379,3304,1557, 328, 689,3952, 309,1555, + 931, 317,2517,3027, 325, 569, 686,2107,3084, 60,1042,1333,2794, 264,3177,4014, +1628, 258,3712, 7,4464,1176,1043,1778, 683, 114,1975, 78,1492, 383,1886, 510, + 386, 645,5291,2891,2069,3305,4138,3867,2939,2603,2493,1935,1066,1848,3588,1015, +1282,1289,4609, 697,1453,3044,2666,3611,1856,2412, 54, 719,1330, 568,3778,2459, +1748, 788, 492, 551,1191,1000, 488,3394,3763, 282,1799, 348,2016,1523,3155,2390, +1049, 382,2019,1788,1170, 729,2968,3523, 897,3926,2785,2938,3292, 350,2319,3238, +1718,1717,2655,3453,3143,4465, 161,2889,2980,2009,1421, 56,1908,1640,2387,2232, +1917,1874,2477,4921, 148, 83,3438, 592,4245,2882,1822,1055, 741, 115,1496,1624, + 381,1638,4592,1020, 516,3214, 458, 947,4575,1432, 211,1514,2926,1865,2142, 189, + 852,1221,1400,1486, 882,2299,4036, 351, 28,1122, 700,6479,6480,6481,6482,6483, #last 512 +) + diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/gb2312freq.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/gb2312freq.py new file mode 100644 index 0000000..697837b --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/gb2312freq.py @@ -0,0 +1,283 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# GB2312 most frequently used character table +# +# Char to FreqOrder table , from hz6763 + +# 512 --> 0.79 -- 0.79 +# 1024 --> 0.92 -- 0.13 +# 2048 --> 0.98 -- 0.06 +# 6768 --> 1.00 -- 0.02 +# +# Ideal Distribution Ratio = 0.79135/(1-0.79135) = 3.79 +# Random Distribution Ration = 512 / (3755 - 512) = 0.157 +# +# Typical Distribution Ratio about 25% of Ideal one, still much higher that RDR + +GB2312_TYPICAL_DISTRIBUTION_RATIO = 0.9 + +GB2312_TABLE_SIZE = 3760 + +GB2312_CHAR_TO_FREQ_ORDER = ( +1671, 749,1443,2364,3924,3807,2330,3921,1704,3463,2691,1511,1515, 572,3191,2205, +2361, 224,2558, 479,1711, 963,3162, 440,4060,1905,2966,2947,3580,2647,3961,3842, +2204, 869,4207, 970,2678,5626,2944,2956,1479,4048, 514,3595, 588,1346,2820,3409, + 249,4088,1746,1873,2047,1774, 581,1813, 358,1174,3590,1014,1561,4844,2245, 670, +1636,3112, 889,1286, 953, 556,2327,3060,1290,3141, 613, 185,3477,1367, 850,3820, +1715,2428,2642,2303,2732,3041,2562,2648,3566,3946,1349, 388,3098,2091,1360,3585, + 152,1687,1539, 738,1559, 59,1232,2925,2267,1388,1249,1741,1679,2960, 151,1566, +1125,1352,4271, 924,4296, 385,3166,4459, 310,1245,2850, 70,3285,2729,3534,3575, +2398,3298,3466,1960,2265, 217,3647, 864,1909,2084,4401,2773,1010,3269,5152, 853, +3051,3121,1244,4251,1895, 364,1499,1540,2313,1180,3655,2268, 562, 715,2417,3061, + 544, 336,3768,2380,1752,4075, 950, 280,2425,4382, 183,2759,3272, 333,4297,2155, +1688,2356,1444,1039,4540, 736,1177,3349,2443,2368,2144,2225, 565, 196,1482,3406, + 927,1335,4147, 692, 878,1311,1653,3911,3622,1378,4200,1840,2969,3149,2126,1816, +2534,1546,2393,2760, 737,2494, 13, 447, 245,2747, 38,2765,2129,2589,1079, 606, + 360, 471,3755,2890, 404, 848, 699,1785,1236, 370,2221,1023,3746,2074,2026,2023, +2388,1581,2119, 812,1141,3091,2536,1519, 804,2053, 406,1596,1090, 784, 548,4414, +1806,2264,2936,1100, 343,4114,5096, 622,3358, 743,3668,1510,1626,5020,3567,2513, +3195,4115,5627,2489,2991, 24,2065,2697,1087,2719, 48,1634, 315, 68, 985,2052, + 198,2239,1347,1107,1439, 597,2366,2172, 871,3307, 919,2487,2790,1867, 236,2570, +1413,3794, 906,3365,3381,1701,1982,1818,1524,2924,1205, 616,2586,2072,2004, 575, + 253,3099, 32,1365,1182, 197,1714,2454,1201, 554,3388,3224,2748, 756,2587, 250, +2567,1507,1517,3529,1922,2761,2337,3416,1961,1677,2452,2238,3153, 615, 911,1506, +1474,2495,1265,1906,2749,3756,3280,2161, 898,2714,1759,3450,2243,2444, 563, 26, +3286,2266,3769,3344,2707,3677, 611,1402, 531,1028,2871,4548,1375, 261,2948, 835, +1190,4134, 353, 840,2684,1900,3082,1435,2109,1207,1674, 329,1872,2781,4055,2686, +2104, 608,3318,2423,2957,2768,1108,3739,3512,3271,3985,2203,1771,3520,1418,2054, +1681,1153, 225,1627,2929, 162,2050,2511,3687,1954, 124,1859,2431,1684,3032,2894, + 585,4805,3969,2869,2704,2088,2032,2095,3656,2635,4362,2209, 256, 518,2042,2105, +3777,3657, 643,2298,1148,1779, 190, 989,3544, 414, 11,2135,2063,2979,1471, 403, +3678, 126, 770,1563, 671,2499,3216,2877, 600,1179, 307,2805,4937,1268,1297,2694, + 252,4032,1448,1494,1331,1394, 127,2256, 222,1647,1035,1481,3056,1915,1048, 873, +3651, 210, 33,1608,2516, 200,1520, 415, 102, 0,3389,1287, 817, 91,3299,2940, + 836,1814, 549,2197,1396,1669,2987,3582,2297,2848,4528,1070, 687, 20,1819, 121, +1552,1364,1461,1968,2617,3540,2824,2083, 177, 948,4938,2291, 110,4549,2066, 648, +3359,1755,2110,2114,4642,4845,1693,3937,3308,1257,1869,2123, 208,1804,3159,2992, +2531,2549,3361,2418,1350,2347,2800,2568,1291,2036,2680, 72, 842,1990, 212,1233, +1154,1586, 75,2027,3410,4900,1823,1337,2710,2676, 728,2810,1522,3026,4995, 157, + 755,1050,4022, 710, 785,1936,2194,2085,1406,2777,2400, 150,1250,4049,1206, 807, +1910, 534, 529,3309,1721,1660, 274, 39,2827, 661,2670,1578, 925,3248,3815,1094, +4278,4901,4252, 41,1150,3747,2572,2227,4501,3658,4902,3813,3357,3617,2884,2258, + 887, 538,4187,3199,1294,2439,3042,2329,2343,2497,1255, 107, 543,1527, 521,3478, +3568, 194,5062, 15, 961,3870,1241,1192,2664, 66,5215,3260,2111,1295,1127,2152, +3805,4135, 901,1164,1976, 398,1278, 530,1460, 748, 904,1054,1966,1426, 53,2909, + 509, 523,2279,1534, 536,1019, 239,1685, 460,2353, 673,1065,2401,3600,4298,2272, +1272,2363, 284,1753,3679,4064,1695, 81, 815,2677,2757,2731,1386, 859, 500,4221, +2190,2566, 757,1006,2519,2068,1166,1455, 337,2654,3203,1863,1682,1914,3025,1252, +1409,1366, 847, 714,2834,2038,3209, 964,2970,1901, 885,2553,1078,1756,3049, 301, +1572,3326, 688,2130,1996,2429,1805,1648,2930,3421,2750,3652,3088, 262,1158,1254, + 389,1641,1812, 526,1719, 923,2073,1073,1902, 468, 489,4625,1140, 857,2375,3070, +3319,2863, 380, 116,1328,2693,1161,2244, 273,1212,1884,2769,3011,1775,1142, 461, +3066,1200,2147,2212, 790, 702,2695,4222,1601,1058, 434,2338,5153,3640, 67,2360, +4099,2502, 618,3472,1329, 416,1132, 830,2782,1807,2653,3211,3510,1662, 192,2124, + 296,3979,1739,1611,3684, 23, 118, 324, 446,1239,1225, 293,2520,3814,3795,2535, +3116, 17,1074, 467,2692,2201, 387,2922, 45,1326,3055,1645,3659,2817, 958, 243, +1903,2320,1339,2825,1784,3289, 356, 576, 865,2315,2381,3377,3916,1088,3122,1713, +1655, 935, 628,4689,1034,1327, 441, 800, 720, 894,1979,2183,1528,5289,2702,1071, +4046,3572,2399,1571,3281, 79, 761,1103, 327, 134, 758,1899,1371,1615, 879, 442, + 215,2605,2579, 173,2048,2485,1057,2975,3317,1097,2253,3801,4263,1403,1650,2946, + 814,4968,3487,1548,2644,1567,1285, 2, 295,2636, 97, 946,3576, 832, 141,4257, +3273, 760,3821,3521,3156,2607, 949,1024,1733,1516,1803,1920,2125,2283,2665,3180, +1501,2064,3560,2171,1592, 803,3518,1416, 732,3897,4258,1363,1362,2458, 119,1427, + 602,1525,2608,1605,1639,3175, 694,3064, 10, 465, 76,2000,4846,4208, 444,3781, +1619,3353,2206,1273,3796, 740,2483, 320,1723,2377,3660,2619,1359,1137,1762,1724, +2345,2842,1850,1862, 912, 821,1866, 612,2625,1735,2573,3369,1093, 844, 89, 937, + 930,1424,3564,2413,2972,1004,3046,3019,2011, 711,3171,1452,4178, 428, 801,1943, + 432, 445,2811, 206,4136,1472, 730, 349, 73, 397,2802,2547, 998,1637,1167, 789, + 396,3217, 154,1218, 716,1120,1780,2819,4826,1931,3334,3762,2139,1215,2627, 552, +3664,3628,3232,1405,2383,3111,1356,2652,3577,3320,3101,1703, 640,1045,1370,1246, +4996, 371,1575,2436,1621,2210, 984,4033,1734,2638, 16,4529, 663,2755,3255,1451, +3917,2257,1253,1955,2234,1263,2951, 214,1229, 617, 485, 359,1831,1969, 473,2310, + 750,2058, 165, 80,2864,2419, 361,4344,2416,2479,1134, 796,3726,1266,2943, 860, +2715, 938, 390,2734,1313,1384, 248, 202, 877,1064,2854, 522,3907, 279,1602, 297, +2357, 395,3740, 137,2075, 944,4089,2584,1267,3802, 62,1533,2285, 178, 176, 780, +2440, 201,3707, 590, 478,1560,4354,2117,1075, 30, 74,4643,4004,1635,1441,2745, + 776,2596, 238,1077,1692,1912,2844, 605, 499,1742,3947, 241,3053, 980,1749, 936, +2640,4511,2582, 515,1543,2162,5322,2892,2993, 890,2148,1924, 665,1827,3581,1032, + 968,3163, 339,1044,1896, 270, 583,1791,1720,4367,1194,3488,3669, 43,2523,1657, + 163,2167, 290,1209,1622,3378, 550, 634,2508,2510, 695,2634,2384,2512,1476,1414, + 220,1469,2341,2138,2852,3183,2900,4939,2865,3502,1211,3680, 854,3227,1299,2976, +3172, 186,2998,1459, 443,1067,3251,1495, 321,1932,3054, 909, 753,1410,1828, 436, +2441,1119,1587,3164,2186,1258, 227, 231,1425,1890,3200,3942, 247, 959, 725,5254, +2741, 577,2158,2079, 929, 120, 174, 838,2813, 591,1115, 417,2024, 40,3240,1536, +1037, 291,4151,2354, 632,1298,2406,2500,3535,1825,1846,3451, 205,1171, 345,4238, + 18,1163, 811, 685,2208,1217, 425,1312,1508,1175,4308,2552,1033, 587,1381,3059, +2984,3482, 340,1316,4023,3972, 792,3176, 519, 777,4690, 918, 933,4130,2981,3741, + 90,3360,2911,2200,5184,4550, 609,3079,2030, 272,3379,2736, 363,3881,1130,1447, + 286, 779, 357,1169,3350,3137,1630,1220,2687,2391, 747,1277,3688,2618,2682,2601, +1156,3196,5290,4034,3102,1689,3596,3128, 874, 219,2783, 798, 508,1843,2461, 269, +1658,1776,1392,1913,2983,3287,2866,2159,2372, 829,4076, 46,4253,2873,1889,1894, + 915,1834,1631,2181,2318, 298, 664,2818,3555,2735, 954,3228,3117, 527,3511,2173, + 681,2712,3033,2247,2346,3467,1652, 155,2164,3382, 113,1994, 450, 899, 494, 994, +1237,2958,1875,2336,1926,3727, 545,1577,1550, 633,3473, 204,1305,3072,2410,1956, +2471, 707,2134, 841,2195,2196,2663,3843,1026,4940, 990,3252,4997, 368,1092, 437, +3212,3258,1933,1829, 675,2977,2893, 412, 943,3723,4644,3294,3283,2230,2373,5154, +2389,2241,2661,2323,1404,2524, 593, 787, 677,3008,1275,2059, 438,2709,2609,2240, +2269,2246,1446, 36,1568,1373,3892,1574,2301,1456,3962, 693,2276,5216,2035,1143, +2720,1919,1797,1811,2763,4137,2597,1830,1699,1488,1198,2090, 424,1694, 312,3634, +3390,4179,3335,2252,1214, 561,1059,3243,2295,2561, 975,5155,2321,2751,3772, 472, +1537,3282,3398,1047,2077,2348,2878,1323,3340,3076, 690,2906, 51, 369, 170,3541, +1060,2187,2688,3670,2541,1083,1683, 928,3918, 459, 109,4427, 599,3744,4286, 143, +2101,2730,2490, 82,1588,3036,2121, 281,1860, 477,4035,1238,2812,3020,2716,3312, +1530,2188,2055,1317, 843, 636,1808,1173,3495, 649, 181,1002, 147,3641,1159,2414, +3750,2289,2795, 813,3123,2610,1136,4368, 5,3391,4541,2174, 420, 429,1728, 754, +1228,2115,2219, 347,2223,2733, 735,1518,3003,2355,3134,1764,3948,3329,1888,2424, +1001,1234,1972,3321,3363,1672,1021,1450,1584, 226, 765, 655,2526,3404,3244,2302, +3665, 731, 594,2184, 319,1576, 621, 658,2656,4299,2099,3864,1279,2071,2598,2739, + 795,3086,3699,3908,1707,2352,2402,1382,3136,2475,1465,4847,3496,3865,1085,3004, +2591,1084, 213,2287,1963,3565,2250, 822, 793,4574,3187,1772,1789,3050, 595,1484, +1959,2770,1080,2650, 456, 422,2996, 940,3322,4328,4345,3092,2742, 965,2784, 739, +4124, 952,1358,2498,2949,2565, 332,2698,2378, 660,2260,2473,4194,3856,2919, 535, +1260,2651,1208,1428,1300,1949,1303,2942, 433,2455,2450,1251,1946, 614,1269, 641, +1306,1810,2737,3078,2912, 564,2365,1419,1415,1497,4460,2367,2185,1379,3005,1307, +3218,2175,1897,3063, 682,1157,4040,4005,1712,1160,1941,1399, 394, 402,2952,1573, +1151,2986,2404, 862, 299,2033,1489,3006, 346, 171,2886,3401,1726,2932, 168,2533, + 47,2507,1030,3735,1145,3370,1395,1318,1579,3609,4560,2857,4116,1457,2529,1965, + 504,1036,2690,2988,2405, 745,5871, 849,2397,2056,3081, 863,2359,3857,2096, 99, +1397,1769,2300,4428,1643,3455,1978,1757,3718,1440, 35,4879,3742,1296,4228,2280, + 160,5063,1599,2013, 166, 520,3479,1646,3345,3012, 490,1937,1545,1264,2182,2505, +1096,1188,1369,1436,2421,1667,2792,2460,1270,2122, 727,3167,2143, 806,1706,1012, +1800,3037, 960,2218,1882, 805, 139,2456,1139,1521, 851,1052,3093,3089, 342,2039, + 744,5097,1468,1502,1585,2087, 223, 939, 326,2140,2577, 892,2481,1623,4077, 982, +3708, 135,2131, 87,2503,3114,2326,1106, 876,1616, 547,2997,2831,2093,3441,4530, +4314, 9,3256,4229,4148, 659,1462,1986,1710,2046,2913,2231,4090,4880,5255,3392, +3274,1368,3689,4645,1477, 705,3384,3635,1068,1529,2941,1458,3782,1509, 100,1656, +2548, 718,2339, 408,1590,2780,3548,1838,4117,3719,1345,3530, 717,3442,2778,3220, +2898,1892,4590,3614,3371,2043,1998,1224,3483, 891, 635, 584,2559,3355, 733,1766, +1729,1172,3789,1891,2307, 781,2982,2271,1957,1580,5773,2633,2005,4195,3097,1535, +3213,1189,1934,5693,3262, 586,3118,1324,1598, 517,1564,2217,1868,1893,4445,3728, +2703,3139,1526,1787,1992,3882,2875,1549,1199,1056,2224,1904,2711,5098,4287, 338, +1993,3129,3489,2689,1809,2815,1997, 957,1855,3898,2550,3275,3057,1105,1319, 627, +1505,1911,1883,3526, 698,3629,3456,1833,1431, 746, 77,1261,2017,2296,1977,1885, + 125,1334,1600, 525,1798,1109,2222,1470,1945, 559,2236,1186,3443,2476,1929,1411, +2411,3135,1777,3372,2621,1841,1613,3229, 668,1430,1839,2643,2916, 195,1989,2671, +2358,1387, 629,3205,2293,5256,4439, 123,1310, 888,1879,4300,3021,3605,1003,1162, +3192,2910,2010, 140,2395,2859, 55,1082,2012,2901, 662, 419,2081,1438, 680,2774, +4654,3912,1620,1731,1625,5035,4065,2328, 512,1344, 802,5443,2163,2311,2537, 524, +3399, 98,1155,2103,1918,2606,3925,2816,1393,2465,1504,3773,2177,3963,1478,4346, + 180,1113,4655,3461,2028,1698, 833,2696,1235,1322,1594,4408,3623,3013,3225,2040, +3022, 541,2881, 607,3632,2029,1665,1219, 639,1385,1686,1099,2803,3231,1938,3188, +2858, 427, 676,2772,1168,2025, 454,3253,2486,3556, 230,1950, 580, 791,1991,1280, +1086,1974,2034, 630, 257,3338,2788,4903,1017, 86,4790, 966,2789,1995,1696,1131, + 259,3095,4188,1308, 179,1463,5257, 289,4107,1248, 42,3413,1725,2288, 896,1947, + 774,4474,4254, 604,3430,4264, 392,2514,2588, 452, 237,1408,3018, 988,4531,1970, +3034,3310, 540,2370,1562,1288,2990, 502,4765,1147, 4,1853,2708, 207, 294,2814, +4078,2902,2509, 684, 34,3105,3532,2551, 644, 709,2801,2344, 573,1727,3573,3557, +2021,1081,3100,4315,2100,3681, 199,2263,1837,2385, 146,3484,1195,2776,3949, 997, +1939,3973,1008,1091,1202,1962,1847,1149,4209,5444,1076, 493, 117,5400,2521, 972, +1490,2934,1796,4542,2374,1512,2933,2657, 413,2888,1135,2762,2314,2156,1355,2369, + 766,2007,2527,2170,3124,2491,2593,2632,4757,2437, 234,3125,3591,1898,1750,1376, +1942,3468,3138, 570,2127,2145,3276,4131, 962, 132,1445,4196, 19, 941,3624,3480, +3366,1973,1374,4461,3431,2629, 283,2415,2275, 808,2887,3620,2112,2563,1353,3610, + 955,1089,3103,1053, 96, 88,4097, 823,3808,1583, 399, 292,4091,3313, 421,1128, + 642,4006, 903,2539,1877,2082, 596, 29,4066,1790, 722,2157, 130, 995,1569, 769, +1485, 464, 513,2213, 288,1923,1101,2453,4316, 133, 486,2445, 50, 625, 487,2207, + 57, 423, 481,2962, 159,3729,1558, 491, 303, 482, 501, 240,2837, 112,3648,2392, +1783, 362, 8,3433,3422, 610,2793,3277,1390,1284,1654, 21,3823, 734, 367, 623, + 193, 287, 374,1009,1483, 816, 476, 313,2255,2340,1262,2150,2899,1146,2581, 782, +2116,1659,2018,1880, 255,3586,3314,1110,2867,2137,2564, 986,2767,5185,2006, 650, + 158, 926, 762, 881,3157,2717,2362,3587, 306,3690,3245,1542,3077,2427,1691,2478, +2118,2985,3490,2438, 539,2305, 983, 129,1754, 355,4201,2386, 827,2923, 104,1773, +2838,2771, 411,2905,3919, 376, 767, 122,1114, 828,2422,1817,3506, 266,3460,1007, +1609,4998, 945,2612,4429,2274, 726,1247,1964,2914,2199,2070,4002,4108, 657,3323, +1422, 579, 455,2764,4737,1222,2895,1670, 824,1223,1487,2525, 558, 861,3080, 598, +2659,2515,1967, 752,2583,2376,2214,4180, 977, 704,2464,4999,2622,4109,1210,2961, + 819,1541, 142,2284, 44, 418, 457,1126,3730,4347,4626,1644,1876,3671,1864, 302, +1063,5694, 624, 723,1984,3745,1314,1676,2488,1610,1449,3558,3569,2166,2098, 409, +1011,2325,3704,2306, 818,1732,1383,1824,1844,3757, 999,2705,3497,1216,1423,2683, +2426,2954,2501,2726,2229,1475,2554,5064,1971,1794,1666,2014,1343, 783, 724, 191, +2434,1354,2220,5065,1763,2752,2472,4152, 131, 175,2885,3434, 92,1466,4920,2616, +3871,3872,3866, 128,1551,1632, 669,1854,3682,4691,4125,1230, 188,2973,3290,1302, +1213, 560,3266, 917, 763,3909,3249,1760, 868,1958, 764,1782,2097, 145,2277,3774, +4462, 64,1491,3062, 971,2132,3606,2442, 221,1226,1617, 218, 323,1185,3207,3147, + 571, 619,1473,1005,1744,2281, 449,1887,2396,3685, 275, 375,3816,1743,3844,3731, + 845,1983,2350,4210,1377, 773, 967,3499,3052,3743,2725,4007,1697,1022,3943,1464, +3264,2855,2722,1952,1029,2839,2467, 84,4383,2215, 820,1391,2015,2448,3672, 377, +1948,2168, 797,2545,3536,2578,2645, 94,2874,1678, 405,1259,3071, 771, 546,1315, + 470,1243,3083, 895,2468, 981, 969,2037, 846,4181, 653,1276,2928, 14,2594, 557, +3007,2474, 156, 902,1338,1740,2574, 537,2518, 973,2282,2216,2433,1928, 138,2903, +1293,2631,1612, 646,3457, 839,2935, 111, 496,2191,2847, 589,3186, 149,3994,2060, +4031,2641,4067,3145,1870, 37,3597,2136,1025,2051,3009,3383,3549,1121,1016,3261, +1301, 251,2446,2599,2153, 872,3246, 637, 334,3705, 831, 884, 921,3065,3140,4092, +2198,1944, 246,2964, 108,2045,1152,1921,2308,1031, 203,3173,4170,1907,3890, 810, +1401,2003,1690, 506, 647,1242,2828,1761,1649,3208,2249,1589,3709,2931,5156,1708, + 498, 666,2613, 834,3817,1231, 184,2851,1124, 883,3197,2261,3710,1765,1553,2658, +1178,2639,2351, 93,1193, 942,2538,2141,4402, 235,1821, 870,1591,2192,1709,1871, +3341,1618,4126,2595,2334, 603, 651, 69, 701, 268,2662,3411,2555,1380,1606, 503, + 448, 254,2371,2646, 574,1187,2309,1770, 322,2235,1292,1801, 305, 566,1133, 229, +2067,2057, 706, 167, 483,2002,2672,3295,1820,3561,3067, 316, 378,2746,3452,1112, + 136,1981, 507,1651,2917,1117, 285,4591, 182,2580,3522,1304, 335,3303,1835,2504, +1795,1792,2248, 674,1018,2106,2449,1857,2292,2845, 976,3047,1781,2600,2727,1389, +1281, 52,3152, 153, 265,3950, 672,3485,3951,4463, 430,1183, 365, 278,2169, 27, +1407,1336,2304, 209,1340,1730,2202,1852,2403,2883, 979,1737,1062, 631,2829,2542, +3876,2592, 825,2086,2226,3048,3625, 352,1417,3724, 542, 991, 431,1351,3938,1861, +2294, 826,1361,2927,3142,3503,1738, 463,2462,2723, 582,1916,1595,2808, 400,3845, +3891,2868,3621,2254, 58,2492,1123, 910,2160,2614,1372,1603,1196,1072,3385,1700, +3267,1980, 696, 480,2430, 920, 799,1570,2920,1951,2041,4047,2540,1321,4223,2469, +3562,2228,1271,2602, 401,2833,3351,2575,5157, 907,2312,1256, 410, 263,3507,1582, + 996, 678,1849,2316,1480, 908,3545,2237, 703,2322, 667,1826,2849,1531,2604,2999, +2407,3146,2151,2630,1786,3711, 469,3542, 497,3899,2409, 858, 837,4446,3393,1274, + 786, 620,1845,2001,3311, 484, 308,3367,1204,1815,3691,2332,1532,2557,1842,2020, +2724,1927,2333,4440, 567, 22,1673,2728,4475,1987,1858,1144,1597, 101,1832,3601, + 12, 974,3783,4391, 951,1412, 1,3720, 453,4608,4041, 528,1041,1027,3230,2628, +1129, 875,1051,3291,1203,2262,1069,2860,2799,2149,2615,3278, 144,1758,3040, 31, + 475,1680, 366,2685,3184, 311,1642,4008,2466,5036,1593,1493,2809, 216,1420,1668, + 233, 304,2128,3284, 232,1429,1768,1040,2008,3407,2740,2967,2543, 242,2133, 778, +1565,2022,2620, 505,2189,2756,1098,2273, 372,1614, 708, 553,2846,2094,2278, 169, +3626,2835,4161, 228,2674,3165, 809,1454,1309, 466,1705,1095, 900,3423, 880,2667, +3751,5258,2317,3109,2571,4317,2766,1503,1342, 866,4447,1118, 63,2076, 314,1881, +1348,1061, 172, 978,3515,1747, 532, 511,3970, 6, 601, 905,2699,3300,1751, 276, +1467,3725,2668, 65,4239,2544,2779,2556,1604, 578,2451,1802, 992,2331,2624,1320, +3446, 713,1513,1013, 103,2786,2447,1661, 886,1702, 916, 654,3574,2031,1556, 751, +2178,2821,2179,1498,1538,2176, 271, 914,2251,2080,1325, 638,1953,2937,3877,2432, +2754, 95,3265,1716, 260,1227,4083, 775, 106,1357,3254, 426,1607, 555,2480, 772, +1985, 244,2546, 474, 495,1046,2611,1851,2061, 71,2089,1675,2590, 742,3758,2843, +3222,1433, 267,2180,2576,2826,2233,2092,3913,2435, 956,1745,3075, 856,2113,1116, + 451, 3,1988,2896,1398, 993,2463,1878,2049,1341,2718,2721,2870,2108, 712,2904, +4363,2753,2324, 277,2872,2349,2649, 384, 987, 435, 691,3000, 922, 164,3939, 652, +1500,1184,4153,2482,3373,2165,4848,2335,3775,3508,3154,2806,2830,1554,2102,1664, +2530,1434,2408, 893,1547,2623,3447,2832,2242,2532,3169,2856,3223,2078, 49,3770, +3469, 462, 318, 656,2259,3250,3069, 679,1629,2758, 344,1138,1104,3120,1836,1283, +3115,2154,1437,4448, 934, 759,1999, 794,2862,1038, 533,2560,1722,2342, 855,2626, +1197,1663,4476,3127, 85,4240,2528, 25,1111,1181,3673, 407,3470,4561,2679,2713, + 768,1925,2841,3986,1544,1165, 932, 373,1240,2146,1930,2673, 721,4766, 354,4333, + 391,2963, 187, 61,3364,1442,1102, 330,1940,1767, 341,3809,4118, 393,2496,2062, +2211, 105, 331, 300, 439, 913,1332, 626, 379,3304,1557, 328, 689,3952, 309,1555, + 931, 317,2517,3027, 325, 569, 686,2107,3084, 60,1042,1333,2794, 264,3177,4014, +1628, 258,3712, 7,4464,1176,1043,1778, 683, 114,1975, 78,1492, 383,1886, 510, + 386, 645,5291,2891,2069,3305,4138,3867,2939,2603,2493,1935,1066,1848,3588,1015, +1282,1289,4609, 697,1453,3044,2666,3611,1856,2412, 54, 719,1330, 568,3778,2459, +1748, 788, 492, 551,1191,1000, 488,3394,3763, 282,1799, 348,2016,1523,3155,2390, +1049, 382,2019,1788,1170, 729,2968,3523, 897,3926,2785,2938,3292, 350,2319,3238, +1718,1717,2655,3453,3143,4465, 161,2889,2980,2009,1421, 56,1908,1640,2387,2232, +1917,1874,2477,4921, 148, 83,3438, 592,4245,2882,1822,1055, 741, 115,1496,1624, + 381,1638,4592,1020, 516,3214, 458, 947,4575,1432, 211,1514,2926,1865,2142, 189, + 852,1221,1400,1486, 882,2299,4036, 351, 28,1122, 700,6479,6480,6481,6482,6483, #last 512 +) + diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/gb2312freq.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/gb2312freq.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6c84df962fd1492805e163bd31749cb73f98ff0c GIT binary patch literal 38399 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 literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/gb2312prober 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/gb2312prober 2.py new file mode 100644 index 0000000..8446d2d --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/gb2312prober 2.py @@ -0,0 +1,46 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .mbcharsetprober import MultiByteCharSetProber +from .codingstatemachine import CodingStateMachine +from .chardistribution import GB2312DistributionAnalysis +from .mbcssm import GB2312_SM_MODEL + +class GB2312Prober(MultiByteCharSetProber): + def __init__(self): + super(GB2312Prober, self).__init__() + self.coding_sm = CodingStateMachine(GB2312_SM_MODEL) + self.distribution_analyzer = GB2312DistributionAnalysis() + self.reset() + + @property + def charset_name(self): + return "GB2312" + + @property + def language(self): + return "Chinese" diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/gb2312prober 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/gb2312prober 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c858e2378941227f41bb451ba686abd3da2dda12 GIT binary patch literal 1610 zcmd5+&2G~`5T3R3*Q(G81P8n~$iT|T|vl9+^4Mvs63pcIe@5Nvx; zcu@L~_|EpBXhGSAr0wh$6dfqLkaWpzgAyMzgTwuUfi~Fa(H!-x zI;qlPX|!=`w%2Q9Je0!^gR}Rzwf4E4)*N^=aY|xBQVJM4AtwNd2g+wk7z|O;vZi-! zwjqiGCUDG{SlH;3m}62%kAUy=sRvV!*%0Uhwm1}dWgD==ULJQ@PkVL|?HyYb=fMVt zX>-7Nt(vICCNn9et~5#+@um^)ioA4e8Iz`r7!p1rmEE97rp(cmYHY|x8HJ85j%!pg z3Fr-08AGG6ZuElK4;N_@PG&`>8WZMqn0=k*S4Wfmz0v;Ra=E}MBECBOcDYAaUWFgS zTGzX}GME;{?#bZHTzq1e6}eDVHfzE$?dCZLuZR z{4!k2FQ1t55(fu_ERmym!L_V;TQWZE3t1(bFwYg|U$n$dky|MF!= zw^oK+U(ZMkgXxHk&US0njr?aRN2`Rox{b&M$iFPtfK>RXO83jM9f~_V#}$908(oib gdJLu*4{j&!`YtP5%%`}0!GSvtpET3 literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/gb2312prober.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/gb2312prober.py new file mode 100644 index 0000000..8446d2d --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/gb2312prober.py @@ -0,0 +1,46 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .mbcharsetprober import MultiByteCharSetProber +from .codingstatemachine import CodingStateMachine +from .chardistribution import GB2312DistributionAnalysis +from .mbcssm import GB2312_SM_MODEL + +class GB2312Prober(MultiByteCharSetProber): + def __init__(self): + super(GB2312Prober, self).__init__() + self.coding_sm = CodingStateMachine(GB2312_SM_MODEL) + self.distribution_analyzer = GB2312DistributionAnalysis() + self.reset() + + @property + def charset_name(self): + return "GB2312" + + @property + def language(self): + return "Chinese" diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/gb2312prober.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/gb2312prober.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2f425bea6d337c07eeef559b0293c96cc475700a GIT binary patch literal 1610 zcmd5+&2rN)5MJ5&X*-2gi?ACej_ z3e;ySRD+AOi4}fq=3~{k`Fk`!m}k1mV@y#E)5(Rdl$(1*bMMajM~D4$ZLrbf1?qYA zrb>&I(Z;RmZPv(mD2E@;-@eD)jnD10;lQJbGZGV$Qozs&IRQvKP(D+_V2F~IHN7jd z4N)90ffL5W!p4BaoRUI%1pJ^+J(zjShCm;%#i7V6+khSR^0>=-wq+O5-myh73br{+ zn*%Ot)kG~enMo;irBTX=H;s5#>5QfWsWXYV?#E|D0FObT%(F< zKyR?h7#f9jqnE^fxJ;XHIxjNSm@u!y?CUJQJf0pNj1P}it0m45@#N^+#Q|M;6@Ch9 zUGMA4U|JOW{gW4?Bx08pxl~m)Z^8-XJX09vV@_mkQ~$hPMIGArDT!g2AnuEv*cBUo z8Ls7*PfU4<0|q)G9?;_A|>0aw1UpSk9V zZV52XP?1*oBF)t^8m~bGoQ!pqGF~Z>4=iOl&lUxlHpg}WrJc$eR}r^nbeGh>eA&^B zl_A&H6B5HrswR e;SBXGx3O*UTS9_O(W%SYtH*RW+mn03-riqHJ9+Q` literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/hebrewprober 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/hebrewprober 2.py new file mode 100644 index 0000000..b0e1bf4 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/hebrewprober 2.py @@ -0,0 +1,292 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Shy Shalom +# Portions created by the Initial Developer are Copyright (C) 2005 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetprober import CharSetProber +from .enums import ProbingState + +# This prober doesn't actually recognize a language or a charset. +# It is a helper prober for the use of the Hebrew model probers + +### General ideas of the Hebrew charset recognition ### +# +# Four main charsets exist in Hebrew: +# "ISO-8859-8" - Visual Hebrew +# "windows-1255" - Logical Hebrew +# "ISO-8859-8-I" - Logical Hebrew +# "x-mac-hebrew" - ?? Logical Hebrew ?? +# +# Both "ISO" charsets use a completely identical set of code points, whereas +# "windows-1255" and "x-mac-hebrew" are two different proper supersets of +# these code points. windows-1255 defines additional characters in the range +# 0x80-0x9F as some misc punctuation marks as well as some Hebrew-specific +# diacritics and additional 'Yiddish' ligature letters in the range 0xc0-0xd6. +# x-mac-hebrew defines similar additional code points but with a different +# mapping. +# +# As far as an average Hebrew text with no diacritics is concerned, all four +# charsets are identical with respect to code points. Meaning that for the +# main Hebrew alphabet, all four map the same values to all 27 Hebrew letters +# (including final letters). +# +# The dominant difference between these charsets is their directionality. +# "Visual" directionality means that the text is ordered as if the renderer is +# not aware of a BIDI rendering algorithm. The renderer sees the text and +# draws it from left to right. The text itself when ordered naturally is read +# backwards. A buffer of Visual Hebrew generally looks like so: +# "[last word of first line spelled backwards] [whole line ordered backwards +# and spelled backwards] [first word of first line spelled backwards] +# [end of line] [last word of second line] ... etc' " +# adding punctuation marks, numbers and English text to visual text is +# naturally also "visual" and from left to right. +# +# "Logical" directionality means the text is ordered "naturally" according to +# the order it is read. It is the responsibility of the renderer to display +# the text from right to left. A BIDI algorithm is used to place general +# punctuation marks, numbers and English text in the text. +# +# Texts in x-mac-hebrew are almost impossible to find on the Internet. From +# what little evidence I could find, it seems that its general directionality +# is Logical. +# +# To sum up all of the above, the Hebrew probing mechanism knows about two +# charsets: +# Visual Hebrew - "ISO-8859-8" - backwards text - Words and sentences are +# backwards while line order is natural. For charset recognition purposes +# the line order is unimportant (In fact, for this implementation, even +# word order is unimportant). +# Logical Hebrew - "windows-1255" - normal, naturally ordered text. +# +# "ISO-8859-8-I" is a subset of windows-1255 and doesn't need to be +# specifically identified. +# "x-mac-hebrew" is also identified as windows-1255. A text in x-mac-hebrew +# that contain special punctuation marks or diacritics is displayed with +# some unconverted characters showing as question marks. This problem might +# be corrected using another model prober for x-mac-hebrew. Due to the fact +# that x-mac-hebrew texts are so rare, writing another model prober isn't +# worth the effort and performance hit. +# +#### The Prober #### +# +# The prober is divided between two SBCharSetProbers and a HebrewProber, +# all of which are managed, created, fed data, inquired and deleted by the +# SBCSGroupProber. The two SBCharSetProbers identify that the text is in +# fact some kind of Hebrew, Logical or Visual. The final decision about which +# one is it is made by the HebrewProber by combining final-letter scores +# with the scores of the two SBCharSetProbers to produce a final answer. +# +# The SBCSGroupProber is responsible for stripping the original text of HTML +# tags, English characters, numbers, low-ASCII punctuation characters, spaces +# and new lines. It reduces any sequence of such characters to a single space. +# The buffer fed to each prober in the SBCS group prober is pure text in +# high-ASCII. +# The two SBCharSetProbers (model probers) share the same language model: +# Win1255Model. +# The first SBCharSetProber uses the model normally as any other +# SBCharSetProber does, to recognize windows-1255, upon which this model was +# built. The second SBCharSetProber is told to make the pair-of-letter +# lookup in the language model backwards. This in practice exactly simulates +# a visual Hebrew model using the windows-1255 logical Hebrew model. +# +# The HebrewProber is not using any language model. All it does is look for +# final-letter evidence suggesting the text is either logical Hebrew or visual +# Hebrew. Disjointed from the model probers, the results of the HebrewProber +# alone are meaningless. HebrewProber always returns 0.00 as confidence +# since it never identifies a charset by itself. Instead, the pointer to the +# HebrewProber is passed to the model probers as a helper "Name Prober". +# When the Group prober receives a positive identification from any prober, +# it asks for the name of the charset identified. If the prober queried is a +# Hebrew model prober, the model prober forwards the call to the +# HebrewProber to make the final decision. In the HebrewProber, the +# decision is made according to the final-letters scores maintained and Both +# model probers scores. The answer is returned in the form of the name of the +# charset identified, either "windows-1255" or "ISO-8859-8". + +class HebrewProber(CharSetProber): + # windows-1255 / ISO-8859-8 code points of interest + FINAL_KAF = 0xea + NORMAL_KAF = 0xeb + FINAL_MEM = 0xed + NORMAL_MEM = 0xee + FINAL_NUN = 0xef + NORMAL_NUN = 0xf0 + FINAL_PE = 0xf3 + NORMAL_PE = 0xf4 + FINAL_TSADI = 0xf5 + NORMAL_TSADI = 0xf6 + + # Minimum Visual vs Logical final letter score difference. + # If the difference is below this, don't rely solely on the final letter score + # distance. + MIN_FINAL_CHAR_DISTANCE = 5 + + # Minimum Visual vs Logical model score difference. + # If the difference is below this, don't rely at all on the model score + # distance. + MIN_MODEL_DISTANCE = 0.01 + + VISUAL_HEBREW_NAME = "ISO-8859-8" + LOGICAL_HEBREW_NAME = "windows-1255" + + def __init__(self): + super(HebrewProber, self).__init__() + self._final_char_logical_score = None + self._final_char_visual_score = None + self._prev = None + self._before_prev = None + self._logical_prober = None + self._visual_prober = None + self.reset() + + def reset(self): + self._final_char_logical_score = 0 + self._final_char_visual_score = 0 + # The two last characters seen in the previous buffer, + # mPrev and mBeforePrev are initialized to space in order to simulate + # a word delimiter at the beginning of the data + self._prev = ' ' + self._before_prev = ' ' + # These probers are owned by the group prober. + + def set_model_probers(self, logicalProber, visualProber): + self._logical_prober = logicalProber + self._visual_prober = visualProber + + def is_final(self, c): + return c in [self.FINAL_KAF, self.FINAL_MEM, self.FINAL_NUN, + self.FINAL_PE, self.FINAL_TSADI] + + def is_non_final(self, c): + # The normal Tsadi is not a good Non-Final letter due to words like + # 'lechotet' (to chat) containing an apostrophe after the tsadi. This + # apostrophe is converted to a space in FilterWithoutEnglishLetters + # causing the Non-Final tsadi to appear at an end of a word even + # though this is not the case in the original text. + # The letters Pe and Kaf rarely display a related behavior of not being + # a good Non-Final letter. Words like 'Pop', 'Winamp' and 'Mubarak' + # for example legally end with a Non-Final Pe or Kaf. However, the + # benefit of these letters as Non-Final letters outweighs the damage + # since these words are quite rare. + return c in [self.NORMAL_KAF, self.NORMAL_MEM, + self.NORMAL_NUN, self.NORMAL_PE] + + def feed(self, byte_str): + # Final letter analysis for logical-visual decision. + # Look for evidence that the received buffer is either logical Hebrew + # or visual Hebrew. + # The following cases are checked: + # 1) A word longer than 1 letter, ending with a final letter. This is + # an indication that the text is laid out "naturally" since the + # final letter really appears at the end. +1 for logical score. + # 2) A word longer than 1 letter, ending with a Non-Final letter. In + # normal Hebrew, words ending with Kaf, Mem, Nun, Pe or Tsadi, + # should not end with the Non-Final form of that letter. Exceptions + # to this rule are mentioned above in isNonFinal(). This is an + # indication that the text is laid out backwards. +1 for visual + # score + # 3) A word longer than 1 letter, starting with a final letter. Final + # letters should not appear at the beginning of a word. This is an + # indication that the text is laid out backwards. +1 for visual + # score. + # + # The visual score and logical score are accumulated throughout the + # text and are finally checked against each other in GetCharSetName(). + # No checking for final letters in the middle of words is done since + # that case is not an indication for either Logical or Visual text. + # + # We automatically filter out all 7-bit characters (replace them with + # spaces) so the word boundary detection works properly. [MAP] + + if self.state == ProbingState.NOT_ME: + # Both model probers say it's not them. No reason to continue. + return ProbingState.NOT_ME + + byte_str = self.filter_high_byte_only(byte_str) + + for cur in byte_str: + if cur == ' ': + # We stand on a space - a word just ended + if self._before_prev != ' ': + # next-to-last char was not a space so self._prev is not a + # 1 letter word + if self.is_final(self._prev): + # case (1) [-2:not space][-1:final letter][cur:space] + self._final_char_logical_score += 1 + elif self.is_non_final(self._prev): + # case (2) [-2:not space][-1:Non-Final letter][ + # cur:space] + self._final_char_visual_score += 1 + else: + # Not standing on a space + if ((self._before_prev == ' ') and + (self.is_final(self._prev)) and (cur != ' ')): + # case (3) [-2:space][-1:final letter][cur:not space] + self._final_char_visual_score += 1 + self._before_prev = self._prev + self._prev = cur + + # Forever detecting, till the end or until both model probers return + # ProbingState.NOT_ME (handled above) + return ProbingState.DETECTING + + @property + def charset_name(self): + # Make the decision: is it Logical or Visual? + # If the final letter score distance is dominant enough, rely on it. + finalsub = self._final_char_logical_score - self._final_char_visual_score + if finalsub >= self.MIN_FINAL_CHAR_DISTANCE: + return self.LOGICAL_HEBREW_NAME + if finalsub <= -self.MIN_FINAL_CHAR_DISTANCE: + return self.VISUAL_HEBREW_NAME + + # It's not dominant enough, try to rely on the model scores instead. + modelsub = (self._logical_prober.get_confidence() + - self._visual_prober.get_confidence()) + if modelsub > self.MIN_MODEL_DISTANCE: + return self.LOGICAL_HEBREW_NAME + if modelsub < -self.MIN_MODEL_DISTANCE: + return self.VISUAL_HEBREW_NAME + + # Still no good, back to final letter distance, maybe it'll save the + # day. + if finalsub < 0.0: + return self.VISUAL_HEBREW_NAME + + # (finalsub > 0 - Logical) or (don't know what to do) default to + # Logical. + return self.LOGICAL_HEBREW_NAME + + @property + def language(self): + return 'Hebrew' + + @property + def state(self): + # Remain active as long as any of the model probers are active. + if (self._logical_prober.state == ProbingState.NOT_ME) and \ + (self._visual_prober.state == ProbingState.NOT_ME): + return ProbingState.NOT_ME + return ProbingState.DETECTING diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/hebrewprober 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/hebrewprober 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8ed31cb33c76a09c156fc4da4b6146919d41572c GIT binary patch literal 4331 zcmd5<&2Jl35T9Lt#rblYk2YXcq;4ox!$&D;;t@s}R331@u0|%}k!3FU*^uQIwhg9H(V1Dz~j%g*Xwe2^anSJ|q-pp_2&Bh*# z4S)a5h4-oyePaCoCXet{CJz4$Y7%W5R5r+fY*N#t?HH9~EXT+-sAiB8r@KUVh~6p3 z$w^Qto8;R)gGm-djWJo;tOO-jtp%+OH_+-)RzvpudP!B3tDv~*ZUpY0p4PL=zk>V*@;k@_kUv2F1o;aj!KD7d^t~%T-n@G;9A>Fd zTAf>1IQPojLI}_8dA`%y3+LuvI(M!LzhfYxOFY6GOcehNy2X~7)G!e-1eIl*y{8#= zpk~;InqfC;hCQj7G;V1OckeGrG>h30JONgQowgfTh?yE9~8O{#kj06sf9upvd=wucT zvyi7&3Iu_&(oDoF7BY4KJOWsM!6Sru1aHLCMiqO(=y~EW3%9zSxTW_k6`~7G%(Rd) z7C}Y$gNvidYxx6DSvVI4z){FKc9h@pwX?orSvzYaqn(A^!?wj)e=`G2NvIiL zTP6iZ5q9QF5!ehIjkgVY{|ESW`Q2~nHUm*kZ%qFzf+H8Rtr!LOMN9}y;?6*Uk2m-v zGU>c&r)cL>xjNK0M>O#UAM`ROjX68_$-gLb_ywX>~0Bl(!RDnWhs-0i}U<82FT-W)I|HG3^ z==h|WGBf6wF=}RFljfu`8Jmq|j1$a_8e?%e;9x&$hd}FdW;C=w4Vq;LMS00MOHgo1 zF2@*W-Rd^7#c;V0g3R=B|bb%bAkuB~LKI$#RrwQYS zRUh|MQb$XYzr{LRDxWNp``}nr$mx|r(blzb>FT0oFBeMdi^Zk9n&NBMR<9J6xN2O@ zU$XKy?BXH=WRmr77fRRvtCr(S`k6W(1=W^c^BmW&x^kk)J$TN_>T>>C?-387L^`gp zvmvEh4igpz04k_B=!tN~`IT+=AC|)>m{5Ge$QUVO!brtNnMQnk)JSQ#Ah$3CE1!ka&5B>|RO;?AHY^0@$$YfOTVS&k~l`H7MRdyrprOFea-10^`!Y A-~a#s literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/hebrewprober.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/hebrewprober.py new file mode 100644 index 0000000..b0e1bf4 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/hebrewprober.py @@ -0,0 +1,292 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Shy Shalom +# Portions created by the Initial Developer are Copyright (C) 2005 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetprober import CharSetProber +from .enums import ProbingState + +# This prober doesn't actually recognize a language or a charset. +# It is a helper prober for the use of the Hebrew model probers + +### General ideas of the Hebrew charset recognition ### +# +# Four main charsets exist in Hebrew: +# "ISO-8859-8" - Visual Hebrew +# "windows-1255" - Logical Hebrew +# "ISO-8859-8-I" - Logical Hebrew +# "x-mac-hebrew" - ?? Logical Hebrew ?? +# +# Both "ISO" charsets use a completely identical set of code points, whereas +# "windows-1255" and "x-mac-hebrew" are two different proper supersets of +# these code points. windows-1255 defines additional characters in the range +# 0x80-0x9F as some misc punctuation marks as well as some Hebrew-specific +# diacritics and additional 'Yiddish' ligature letters in the range 0xc0-0xd6. +# x-mac-hebrew defines similar additional code points but with a different +# mapping. +# +# As far as an average Hebrew text with no diacritics is concerned, all four +# charsets are identical with respect to code points. Meaning that for the +# main Hebrew alphabet, all four map the same values to all 27 Hebrew letters +# (including final letters). +# +# The dominant difference between these charsets is their directionality. +# "Visual" directionality means that the text is ordered as if the renderer is +# not aware of a BIDI rendering algorithm. The renderer sees the text and +# draws it from left to right. The text itself when ordered naturally is read +# backwards. A buffer of Visual Hebrew generally looks like so: +# "[last word of first line spelled backwards] [whole line ordered backwards +# and spelled backwards] [first word of first line spelled backwards] +# [end of line] [last word of second line] ... etc' " +# adding punctuation marks, numbers and English text to visual text is +# naturally also "visual" and from left to right. +# +# "Logical" directionality means the text is ordered "naturally" according to +# the order it is read. It is the responsibility of the renderer to display +# the text from right to left. A BIDI algorithm is used to place general +# punctuation marks, numbers and English text in the text. +# +# Texts in x-mac-hebrew are almost impossible to find on the Internet. From +# what little evidence I could find, it seems that its general directionality +# is Logical. +# +# To sum up all of the above, the Hebrew probing mechanism knows about two +# charsets: +# Visual Hebrew - "ISO-8859-8" - backwards text - Words and sentences are +# backwards while line order is natural. For charset recognition purposes +# the line order is unimportant (In fact, for this implementation, even +# word order is unimportant). +# Logical Hebrew - "windows-1255" - normal, naturally ordered text. +# +# "ISO-8859-8-I" is a subset of windows-1255 and doesn't need to be +# specifically identified. +# "x-mac-hebrew" is also identified as windows-1255. A text in x-mac-hebrew +# that contain special punctuation marks or diacritics is displayed with +# some unconverted characters showing as question marks. This problem might +# be corrected using another model prober for x-mac-hebrew. Due to the fact +# that x-mac-hebrew texts are so rare, writing another model prober isn't +# worth the effort and performance hit. +# +#### The Prober #### +# +# The prober is divided between two SBCharSetProbers and a HebrewProber, +# all of which are managed, created, fed data, inquired and deleted by the +# SBCSGroupProber. The two SBCharSetProbers identify that the text is in +# fact some kind of Hebrew, Logical or Visual. The final decision about which +# one is it is made by the HebrewProber by combining final-letter scores +# with the scores of the two SBCharSetProbers to produce a final answer. +# +# The SBCSGroupProber is responsible for stripping the original text of HTML +# tags, English characters, numbers, low-ASCII punctuation characters, spaces +# and new lines. It reduces any sequence of such characters to a single space. +# The buffer fed to each prober in the SBCS group prober is pure text in +# high-ASCII. +# The two SBCharSetProbers (model probers) share the same language model: +# Win1255Model. +# The first SBCharSetProber uses the model normally as any other +# SBCharSetProber does, to recognize windows-1255, upon which this model was +# built. The second SBCharSetProber is told to make the pair-of-letter +# lookup in the language model backwards. This in practice exactly simulates +# a visual Hebrew model using the windows-1255 logical Hebrew model. +# +# The HebrewProber is not using any language model. All it does is look for +# final-letter evidence suggesting the text is either logical Hebrew or visual +# Hebrew. Disjointed from the model probers, the results of the HebrewProber +# alone are meaningless. HebrewProber always returns 0.00 as confidence +# since it never identifies a charset by itself. Instead, the pointer to the +# HebrewProber is passed to the model probers as a helper "Name Prober". +# When the Group prober receives a positive identification from any prober, +# it asks for the name of the charset identified. If the prober queried is a +# Hebrew model prober, the model prober forwards the call to the +# HebrewProber to make the final decision. In the HebrewProber, the +# decision is made according to the final-letters scores maintained and Both +# model probers scores. The answer is returned in the form of the name of the +# charset identified, either "windows-1255" or "ISO-8859-8". + +class HebrewProber(CharSetProber): + # windows-1255 / ISO-8859-8 code points of interest + FINAL_KAF = 0xea + NORMAL_KAF = 0xeb + FINAL_MEM = 0xed + NORMAL_MEM = 0xee + FINAL_NUN = 0xef + NORMAL_NUN = 0xf0 + FINAL_PE = 0xf3 + NORMAL_PE = 0xf4 + FINAL_TSADI = 0xf5 + NORMAL_TSADI = 0xf6 + + # Minimum Visual vs Logical final letter score difference. + # If the difference is below this, don't rely solely on the final letter score + # distance. + MIN_FINAL_CHAR_DISTANCE = 5 + + # Minimum Visual vs Logical model score difference. + # If the difference is below this, don't rely at all on the model score + # distance. + MIN_MODEL_DISTANCE = 0.01 + + VISUAL_HEBREW_NAME = "ISO-8859-8" + LOGICAL_HEBREW_NAME = "windows-1255" + + def __init__(self): + super(HebrewProber, self).__init__() + self._final_char_logical_score = None + self._final_char_visual_score = None + self._prev = None + self._before_prev = None + self._logical_prober = None + self._visual_prober = None + self.reset() + + def reset(self): + self._final_char_logical_score = 0 + self._final_char_visual_score = 0 + # The two last characters seen in the previous buffer, + # mPrev and mBeforePrev are initialized to space in order to simulate + # a word delimiter at the beginning of the data + self._prev = ' ' + self._before_prev = ' ' + # These probers are owned by the group prober. + + def set_model_probers(self, logicalProber, visualProber): + self._logical_prober = logicalProber + self._visual_prober = visualProber + + def is_final(self, c): + return c in [self.FINAL_KAF, self.FINAL_MEM, self.FINAL_NUN, + self.FINAL_PE, self.FINAL_TSADI] + + def is_non_final(self, c): + # The normal Tsadi is not a good Non-Final letter due to words like + # 'lechotet' (to chat) containing an apostrophe after the tsadi. This + # apostrophe is converted to a space in FilterWithoutEnglishLetters + # causing the Non-Final tsadi to appear at an end of a word even + # though this is not the case in the original text. + # The letters Pe and Kaf rarely display a related behavior of not being + # a good Non-Final letter. Words like 'Pop', 'Winamp' and 'Mubarak' + # for example legally end with a Non-Final Pe or Kaf. However, the + # benefit of these letters as Non-Final letters outweighs the damage + # since these words are quite rare. + return c in [self.NORMAL_KAF, self.NORMAL_MEM, + self.NORMAL_NUN, self.NORMAL_PE] + + def feed(self, byte_str): + # Final letter analysis for logical-visual decision. + # Look for evidence that the received buffer is either logical Hebrew + # or visual Hebrew. + # The following cases are checked: + # 1) A word longer than 1 letter, ending with a final letter. This is + # an indication that the text is laid out "naturally" since the + # final letter really appears at the end. +1 for logical score. + # 2) A word longer than 1 letter, ending with a Non-Final letter. In + # normal Hebrew, words ending with Kaf, Mem, Nun, Pe or Tsadi, + # should not end with the Non-Final form of that letter. Exceptions + # to this rule are mentioned above in isNonFinal(). This is an + # indication that the text is laid out backwards. +1 for visual + # score + # 3) A word longer than 1 letter, starting with a final letter. Final + # letters should not appear at the beginning of a word. This is an + # indication that the text is laid out backwards. +1 for visual + # score. + # + # The visual score and logical score are accumulated throughout the + # text and are finally checked against each other in GetCharSetName(). + # No checking for final letters in the middle of words is done since + # that case is not an indication for either Logical or Visual text. + # + # We automatically filter out all 7-bit characters (replace them with + # spaces) so the word boundary detection works properly. [MAP] + + if self.state == ProbingState.NOT_ME: + # Both model probers say it's not them. No reason to continue. + return ProbingState.NOT_ME + + byte_str = self.filter_high_byte_only(byte_str) + + for cur in byte_str: + if cur == ' ': + # We stand on a space - a word just ended + if self._before_prev != ' ': + # next-to-last char was not a space so self._prev is not a + # 1 letter word + if self.is_final(self._prev): + # case (1) [-2:not space][-1:final letter][cur:space] + self._final_char_logical_score += 1 + elif self.is_non_final(self._prev): + # case (2) [-2:not space][-1:Non-Final letter][ + # cur:space] + self._final_char_visual_score += 1 + else: + # Not standing on a space + if ((self._before_prev == ' ') and + (self.is_final(self._prev)) and (cur != ' ')): + # case (3) [-2:space][-1:final letter][cur:not space] + self._final_char_visual_score += 1 + self._before_prev = self._prev + self._prev = cur + + # Forever detecting, till the end or until both model probers return + # ProbingState.NOT_ME (handled above) + return ProbingState.DETECTING + + @property + def charset_name(self): + # Make the decision: is it Logical or Visual? + # If the final letter score distance is dominant enough, rely on it. + finalsub = self._final_char_logical_score - self._final_char_visual_score + if finalsub >= self.MIN_FINAL_CHAR_DISTANCE: + return self.LOGICAL_HEBREW_NAME + if finalsub <= -self.MIN_FINAL_CHAR_DISTANCE: + return self.VISUAL_HEBREW_NAME + + # It's not dominant enough, try to rely on the model scores instead. + modelsub = (self._logical_prober.get_confidence() + - self._visual_prober.get_confidence()) + if modelsub > self.MIN_MODEL_DISTANCE: + return self.LOGICAL_HEBREW_NAME + if modelsub < -self.MIN_MODEL_DISTANCE: + return self.VISUAL_HEBREW_NAME + + # Still no good, back to final letter distance, maybe it'll save the + # day. + if finalsub < 0.0: + return self.VISUAL_HEBREW_NAME + + # (finalsub > 0 - Logical) or (don't know what to do) default to + # Logical. + return self.LOGICAL_HEBREW_NAME + + @property + def language(self): + return 'Hebrew' + + @property + def state(self): + # Remain active as long as any of the model probers are active. + if (self._logical_prober.state == ProbingState.NOT_ME) and \ + (self._visual_prober.state == ProbingState.NOT_ME): + return ProbingState.NOT_ME + return ProbingState.DETECTING diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/hebrewprober.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/hebrewprober.pyc new file mode 100644 index 0000000000000000000000000000000000000000..69103711c12860a139dc8a40632951eceb857952 GIT binary patch literal 4331 zcmd5<&2Jl35T9Lt#rblYk2YXcq;6VD!$&D;;|Sb~+~T|4VIYiIW* zX-X?0wc>vOB*cMp4;;861ULSM9=L+|kP6%o%x~V>F|EY4vHiv~vv1$doB7SW*~G(< z!JFTn|DZIS(Ug1zn5h9Kj^hWuavYUp!Dy z52`Jv#;|Z&?S@}tA*!`QPfb5^b=!}&dKa<2(+Rz80gJQh)%g~!$l+3VsgB@GjY1bM z5Ua34=tZ8=AcRqo*Q)3FpM*pabA?XmZ!;zf+tsj8Z?{}8j0%lT!QE^&ZoN{UJ+(S} zW_Nd6HI-85&g`t6;!h(etQ0zaXT}dARc*CqPM>?#s@PD;aJD^;P*}j8T~8I(1nSzX zlbu}~rhLjH8e>Angpuw0_96!_g7eJBw`xTS^-Vj!SBaA=n_ zC25=D9!`3sZbE318Yx;&GdO?IIuWBTVY9J!dSCn$U%VoGQlcZLdlvdJfr zN#{%_Lz|z;)q%b_qDeOSpqDvW%-MWE!3CMa=Nm81&w6}u)@Vz*kM3V2(3?wR5k4g2 z+LETt0^PtK2fL-!#z~`Fp1pGrO^uD@QpihddBs^OswrmceoJ|wv*tI}oYh_BIqjge zE9KY5>8Go)6z8WQqCyL77KKnKMU>VKbK)H^+_f#B?HO9Aj?S7)iZxFP9d$YFsH^ zw2LtsvF)vEJsf@uaN+>szGC`+VGCBVG%G-=Hory9IJH-F#Z*H?Fp%3voQ)EQR)e0 z{NXJOJGSIqO!q#=Se9~RKLZYR%6^u~zH0ekRVvjkK~c-<||H3WAzz15q|wMd|V46Ij|6`vqKj3FJkP6Ci+-4QSfv zzjR%eYWzHlVheX-{Gy|F?Uym(BnYhE%P8TV*y{u^^%0K 0.77094 +# 256 --> 0.85710 +# 512 --> 0.92635 +# 1024 --> 0.97130 +# 2048 --> 0.99431 +# +# Ideal Distribution Ratio = 0.92635 / (1-0.92635) = 12.58 +# Random Distribution Ration = 512 / (2965+62+83+86-512) = 0.191 +# +# Typical Distribution Ratio, 25% of IDR + +JIS_TYPICAL_DISTRIBUTION_RATIO = 3.0 + +# Char to FreqOrder table , +JIS_TABLE_SIZE = 4368 + +JIS_CHAR_TO_FREQ_ORDER = ( + 40, 1, 6, 182, 152, 180, 295,2127, 285, 381,3295,4304,3068,4606,3165,3510, # 16 +3511,1822,2785,4607,1193,2226,5070,4608, 171,2996,1247, 18, 179,5071, 856,1661, # 32 +1262,5072, 619, 127,3431,3512,3230,1899,1700, 232, 228,1294,1298, 284, 283,2041, # 48 +2042,1061,1062, 48, 49, 44, 45, 433, 434,1040,1041, 996, 787,2997,1255,4305, # 64 +2108,4609,1684,1648,5073,5074,5075,5076,5077,5078,3687,5079,4610,5080,3927,3928, # 80 +5081,3296,3432, 290,2285,1471,2187,5082,2580,2825,1303,2140,1739,1445,2691,3375, # 96 +1691,3297,4306,4307,4611, 452,3376,1182,2713,3688,3069,4308,5083,5084,5085,5086, # 112 +5087,5088,5089,5090,5091,5092,5093,5094,5095,5096,5097,5098,5099,5100,5101,5102, # 128 +5103,5104,5105,5106,5107,5108,5109,5110,5111,5112,4097,5113,5114,5115,5116,5117, # 144 +5118,5119,5120,5121,5122,5123,5124,5125,5126,5127,5128,5129,5130,5131,5132,5133, # 160 +5134,5135,5136,5137,5138,5139,5140,5141,5142,5143,5144,5145,5146,5147,5148,5149, # 176 +5150,5151,5152,4612,5153,5154,5155,5156,5157,5158,5159,5160,5161,5162,5163,5164, # 192 +5165,5166,5167,5168,5169,5170,5171,5172,5173,5174,5175,1472, 598, 618, 820,1205, # 208 +1309,1412,1858,1307,1692,5176,5177,5178,5179,5180,5181,5182,1142,1452,1234,1172, # 224 +1875,2043,2149,1793,1382,2973, 925,2404,1067,1241, 960,1377,2935,1491, 919,1217, # 240 +1865,2030,1406,1499,2749,4098,5183,5184,5185,5186,5187,5188,2561,4099,3117,1804, # 256 +2049,3689,4309,3513,1663,5189,3166,3118,3298,1587,1561,3433,5190,3119,1625,2998, # 272 +3299,4613,1766,3690,2786,4614,5191,5192,5193,5194,2161, 26,3377, 2,3929, 20, # 288 +3691, 47,4100, 50, 17, 16, 35, 268, 27, 243, 42, 155, 24, 154, 29, 184, # 304 + 4, 91, 14, 92, 53, 396, 33, 289, 9, 37, 64, 620, 21, 39, 321, 5, # 320 + 12, 11, 52, 13, 3, 208, 138, 0, 7, 60, 526, 141, 151,1069, 181, 275, # 336 +1591, 83, 132,1475, 126, 331, 829, 15, 69, 160, 59, 22, 157, 55,1079, 312, # 352 + 109, 38, 23, 25, 10, 19, 79,5195, 61, 382,1124, 8, 30,5196,5197,5198, # 368 +5199,5200,5201,5202,5203,5204,5205,5206, 89, 62, 74, 34,2416, 112, 139, 196, # 384 + 271, 149, 84, 607, 131, 765, 46, 88, 153, 683, 76, 874, 101, 258, 57, 80, # 400 + 32, 364, 121,1508, 169,1547, 68, 235, 145,2999, 41, 360,3027, 70, 63, 31, # 416 + 43, 259, 262,1383, 99, 533, 194, 66, 93, 846, 217, 192, 56, 106, 58, 565, # 432 + 280, 272, 311, 256, 146, 82, 308, 71, 100, 128, 214, 655, 110, 261, 104,1140, # 448 + 54, 51, 36, 87, 67,3070, 185,2618,2936,2020, 28,1066,2390,2059,5207,5208, # 464 +5209,5210,5211,5212,5213,5214,5215,5216,4615,5217,5218,5219,5220,5221,5222,5223, # 480 +5224,5225,5226,5227,5228,5229,5230,5231,5232,5233,5234,5235,5236,3514,5237,5238, # 496 +5239,5240,5241,5242,5243,5244,2297,2031,4616,4310,3692,5245,3071,5246,3598,5247, # 512 +4617,3231,3515,5248,4101,4311,4618,3808,4312,4102,5249,4103,4104,3599,5250,5251, # 528 +5252,5253,5254,5255,5256,5257,5258,5259,5260,5261,5262,5263,5264,5265,5266,5267, # 544 +5268,5269,5270,5271,5272,5273,5274,5275,5276,5277,5278,5279,5280,5281,5282,5283, # 560 +5284,5285,5286,5287,5288,5289,5290,5291,5292,5293,5294,5295,5296,5297,5298,5299, # 576 +5300,5301,5302,5303,5304,5305,5306,5307,5308,5309,5310,5311,5312,5313,5314,5315, # 592 +5316,5317,5318,5319,5320,5321,5322,5323,5324,5325,5326,5327,5328,5329,5330,5331, # 608 +5332,5333,5334,5335,5336,5337,5338,5339,5340,5341,5342,5343,5344,5345,5346,5347, # 624 +5348,5349,5350,5351,5352,5353,5354,5355,5356,5357,5358,5359,5360,5361,5362,5363, # 640 +5364,5365,5366,5367,5368,5369,5370,5371,5372,5373,5374,5375,5376,5377,5378,5379, # 656 +5380,5381, 363, 642,2787,2878,2788,2789,2316,3232,2317,3434,2011, 165,1942,3930, # 672 +3931,3932,3933,5382,4619,5383,4620,5384,5385,5386,5387,5388,5389,5390,5391,5392, # 688 +5393,5394,5395,5396,5397,5398,5399,5400,5401,5402,5403,5404,5405,5406,5407,5408, # 704 +5409,5410,5411,5412,5413,5414,5415,5416,5417,5418,5419,5420,5421,5422,5423,5424, # 720 +5425,5426,5427,5428,5429,5430,5431,5432,5433,5434,5435,5436,5437,5438,5439,5440, # 736 +5441,5442,5443,5444,5445,5446,5447,5448,5449,5450,5451,5452,5453,5454,5455,5456, # 752 +5457,5458,5459,5460,5461,5462,5463,5464,5465,5466,5467,5468,5469,5470,5471,5472, # 768 +5473,5474,5475,5476,5477,5478,5479,5480,5481,5482,5483,5484,5485,5486,5487,5488, # 784 +5489,5490,5491,5492,5493,5494,5495,5496,5497,5498,5499,5500,5501,5502,5503,5504, # 800 +5505,5506,5507,5508,5509,5510,5511,5512,5513,5514,5515,5516,5517,5518,5519,5520, # 816 +5521,5522,5523,5524,5525,5526,5527,5528,5529,5530,5531,5532,5533,5534,5535,5536, # 832 +5537,5538,5539,5540,5541,5542,5543,5544,5545,5546,5547,5548,5549,5550,5551,5552, # 848 +5553,5554,5555,5556,5557,5558,5559,5560,5561,5562,5563,5564,5565,5566,5567,5568, # 864 +5569,5570,5571,5572,5573,5574,5575,5576,5577,5578,5579,5580,5581,5582,5583,5584, # 880 +5585,5586,5587,5588,5589,5590,5591,5592,5593,5594,5595,5596,5597,5598,5599,5600, # 896 +5601,5602,5603,5604,5605,5606,5607,5608,5609,5610,5611,5612,5613,5614,5615,5616, # 912 +5617,5618,5619,5620,5621,5622,5623,5624,5625,5626,5627,5628,5629,5630,5631,5632, # 928 +5633,5634,5635,5636,5637,5638,5639,5640,5641,5642,5643,5644,5645,5646,5647,5648, # 944 +5649,5650,5651,5652,5653,5654,5655,5656,5657,5658,5659,5660,5661,5662,5663,5664, # 960 +5665,5666,5667,5668,5669,5670,5671,5672,5673,5674,5675,5676,5677,5678,5679,5680, # 976 +5681,5682,5683,5684,5685,5686,5687,5688,5689,5690,5691,5692,5693,5694,5695,5696, # 992 +5697,5698,5699,5700,5701,5702,5703,5704,5705,5706,5707,5708,5709,5710,5711,5712, # 1008 +5713,5714,5715,5716,5717,5718,5719,5720,5721,5722,5723,5724,5725,5726,5727,5728, # 1024 +5729,5730,5731,5732,5733,5734,5735,5736,5737,5738,5739,5740,5741,5742,5743,5744, # 1040 +5745,5746,5747,5748,5749,5750,5751,5752,5753,5754,5755,5756,5757,5758,5759,5760, # 1056 +5761,5762,5763,5764,5765,5766,5767,5768,5769,5770,5771,5772,5773,5774,5775,5776, # 1072 +5777,5778,5779,5780,5781,5782,5783,5784,5785,5786,5787,5788,5789,5790,5791,5792, # 1088 +5793,5794,5795,5796,5797,5798,5799,5800,5801,5802,5803,5804,5805,5806,5807,5808, # 1104 +5809,5810,5811,5812,5813,5814,5815,5816,5817,5818,5819,5820,5821,5822,5823,5824, # 1120 +5825,5826,5827,5828,5829,5830,5831,5832,5833,5834,5835,5836,5837,5838,5839,5840, # 1136 +5841,5842,5843,5844,5845,5846,5847,5848,5849,5850,5851,5852,5853,5854,5855,5856, # 1152 +5857,5858,5859,5860,5861,5862,5863,5864,5865,5866,5867,5868,5869,5870,5871,5872, # 1168 +5873,5874,5875,5876,5877,5878,5879,5880,5881,5882,5883,5884,5885,5886,5887,5888, # 1184 +5889,5890,5891,5892,5893,5894,5895,5896,5897,5898,5899,5900,5901,5902,5903,5904, # 1200 +5905,5906,5907,5908,5909,5910,5911,5912,5913,5914,5915,5916,5917,5918,5919,5920, # 1216 +5921,5922,5923,5924,5925,5926,5927,5928,5929,5930,5931,5932,5933,5934,5935,5936, # 1232 +5937,5938,5939,5940,5941,5942,5943,5944,5945,5946,5947,5948,5949,5950,5951,5952, # 1248 +5953,5954,5955,5956,5957,5958,5959,5960,5961,5962,5963,5964,5965,5966,5967,5968, # 1264 +5969,5970,5971,5972,5973,5974,5975,5976,5977,5978,5979,5980,5981,5982,5983,5984, # 1280 +5985,5986,5987,5988,5989,5990,5991,5992,5993,5994,5995,5996,5997,5998,5999,6000, # 1296 +6001,6002,6003,6004,6005,6006,6007,6008,6009,6010,6011,6012,6013,6014,6015,6016, # 1312 +6017,6018,6019,6020,6021,6022,6023,6024,6025,6026,6027,6028,6029,6030,6031,6032, # 1328 +6033,6034,6035,6036,6037,6038,6039,6040,6041,6042,6043,6044,6045,6046,6047,6048, # 1344 +6049,6050,6051,6052,6053,6054,6055,6056,6057,6058,6059,6060,6061,6062,6063,6064, # 1360 +6065,6066,6067,6068,6069,6070,6071,6072,6073,6074,6075,6076,6077,6078,6079,6080, # 1376 +6081,6082,6083,6084,6085,6086,6087,6088,6089,6090,6091,6092,6093,6094,6095,6096, # 1392 +6097,6098,6099,6100,6101,6102,6103,6104,6105,6106,6107,6108,6109,6110,6111,6112, # 1408 +6113,6114,2044,2060,4621, 997,1235, 473,1186,4622, 920,3378,6115,6116, 379,1108, # 1424 +4313,2657,2735,3934,6117,3809, 636,3233, 573,1026,3693,3435,2974,3300,2298,4105, # 1440 + 854,2937,2463, 393,2581,2417, 539, 752,1280,2750,2480, 140,1161, 440, 708,1569, # 1456 + 665,2497,1746,1291,1523,3000, 164,1603, 847,1331, 537,1997, 486, 508,1693,2418, # 1472 +1970,2227, 878,1220, 299,1030, 969, 652,2751, 624,1137,3301,2619, 65,3302,2045, # 1488 +1761,1859,3120,1930,3694,3516, 663,1767, 852, 835,3695, 269, 767,2826,2339,1305, # 1504 + 896,1150, 770,1616,6118, 506,1502,2075,1012,2519, 775,2520,2975,2340,2938,4314, # 1520 +3028,2086,1224,1943,2286,6119,3072,4315,2240,1273,1987,3935,1557, 175, 597, 985, # 1536 +3517,2419,2521,1416,3029, 585, 938,1931,1007,1052,1932,1685,6120,3379,4316,4623, # 1552 + 804, 599,3121,1333,2128,2539,1159,1554,2032,3810, 687,2033,2904, 952, 675,1467, # 1568 +3436,6121,2241,1096,1786,2440,1543,1924, 980,1813,2228, 781,2692,1879, 728,1918, # 1584 +3696,4624, 548,1950,4625,1809,1088,1356,3303,2522,1944, 502, 972, 373, 513,2827, # 1600 + 586,2377,2391,1003,1976,1631,6122,2464,1084, 648,1776,4626,2141, 324, 962,2012, # 1616 +2177,2076,1384, 742,2178,1448,1173,1810, 222, 102, 301, 445, 125,2420, 662,2498, # 1632 + 277, 200,1476,1165,1068, 224,2562,1378,1446, 450,1880, 659, 791, 582,4627,2939, # 1648 +3936,1516,1274, 555,2099,3697,1020,1389,1526,3380,1762,1723,1787,2229, 412,2114, # 1664 +1900,2392,3518, 512,2597, 427,1925,2341,3122,1653,1686,2465,2499, 697, 330, 273, # 1680 + 380,2162, 951, 832, 780, 991,1301,3073, 965,2270,3519, 668,2523,2636,1286, 535, # 1696 +1407, 518, 671, 957,2658,2378, 267, 611,2197,3030,6123, 248,2299, 967,1799,2356, # 1712 + 850,1418,3437,1876,1256,1480,2828,1718,6124,6125,1755,1664,2405,6126,4628,2879, # 1728 +2829, 499,2179, 676,4629, 557,2329,2214,2090, 325,3234, 464, 811,3001, 992,2342, # 1744 +2481,1232,1469, 303,2242, 466,1070,2163, 603,1777,2091,4630,2752,4631,2714, 322, # 1760 +2659,1964,1768, 481,2188,1463,2330,2857,3600,2092,3031,2421,4632,2318,2070,1849, # 1776 +2598,4633,1302,2254,1668,1701,2422,3811,2905,3032,3123,2046,4106,1763,1694,4634, # 1792 +1604, 943,1724,1454, 917, 868,2215,1169,2940, 552,1145,1800,1228,1823,1955, 316, # 1808 +1080,2510, 361,1807,2830,4107,2660,3381,1346,1423,1134,4108,6127, 541,1263,1229, # 1824 +1148,2540, 545, 465,1833,2880,3438,1901,3074,2482, 816,3937, 713,1788,2500, 122, # 1840 +1575, 195,1451,2501,1111,6128, 859, 374,1225,2243,2483,4317, 390,1033,3439,3075, # 1856 +2524,1687, 266, 793,1440,2599, 946, 779, 802, 507, 897,1081, 528,2189,1292, 711, # 1872 +1866,1725,1167,1640, 753, 398,2661,1053, 246, 348,4318, 137,1024,3440,1600,2077, # 1888 +2129, 825,4319, 698, 238, 521, 187,2300,1157,2423,1641,1605,1464,1610,1097,2541, # 1904 +1260,1436, 759,2255,1814,2150, 705,3235, 409,2563,3304, 561,3033,2005,2564, 726, # 1920 +1956,2343,3698,4109, 949,3812,3813,3520,1669, 653,1379,2525, 881,2198, 632,2256, # 1936 +1027, 778,1074, 733,1957, 514,1481,2466, 554,2180, 702,3938,1606,1017,1398,6129, # 1952 +1380,3521, 921, 993,1313, 594, 449,1489,1617,1166, 768,1426,1360, 495,1794,3601, # 1968 +1177,3602,1170,4320,2344, 476, 425,3167,4635,3168,1424, 401,2662,1171,3382,1998, # 1984 +1089,4110, 477,3169, 474,6130,1909, 596,2831,1842, 494, 693,1051,1028,1207,3076, # 2000 + 606,2115, 727,2790,1473,1115, 743,3522, 630, 805,1532,4321,2021, 366,1057, 838, # 2016 + 684,1114,2142,4322,2050,1492,1892,1808,2271,3814,2424,1971,1447,1373,3305,1090, # 2032 +1536,3939,3523,3306,1455,2199, 336, 369,2331,1035, 584,2393, 902, 718,2600,6131, # 2048 +2753, 463,2151,1149,1611,2467, 715,1308,3124,1268, 343,1413,3236,1517,1347,2663, # 2064 +2093,3940,2022,1131,1553,2100,2941,1427,3441,2942,1323,2484,6132,1980, 872,2368, # 2080 +2441,2943, 320,2369,2116,1082, 679,1933,3941,2791,3815, 625,1143,2023, 422,2200, # 2096 +3816,6133, 730,1695, 356,2257,1626,2301,2858,2637,1627,1778, 937, 883,2906,2693, # 2112 +3002,1769,1086, 400,1063,1325,3307,2792,4111,3077, 456,2345,1046, 747,6134,1524, # 2128 + 884,1094,3383,1474,2164,1059, 974,1688,2181,2258,1047, 345,1665,1187, 358, 875, # 2144 +3170, 305, 660,3524,2190,1334,1135,3171,1540,1649,2542,1527, 927, 968,2793, 885, # 2160 +1972,1850, 482, 500,2638,1218,1109,1085,2543,1654,2034, 876, 78,2287,1482,1277, # 2176 + 861,1675,1083,1779, 724,2754, 454, 397,1132,1612,2332, 893, 672,1237, 257,2259, # 2192 +2370, 135,3384, 337,2244, 547, 352, 340, 709,2485,1400, 788,1138,2511, 540, 772, # 2208 +1682,2260,2272,2544,2013,1843,1902,4636,1999,1562,2288,4637,2201,1403,1533, 407, # 2224 + 576,3308,1254,2071, 978,3385, 170, 136,1201,3125,2664,3172,2394, 213, 912, 873, # 2240 +3603,1713,2202, 699,3604,3699, 813,3442, 493, 531,1054, 468,2907,1483, 304, 281, # 2256 +4112,1726,1252,2094, 339,2319,2130,2639, 756,1563,2944, 748, 571,2976,1588,2425, # 2272 +2715,1851,1460,2426,1528,1392,1973,3237, 288,3309, 685,3386, 296, 892,2716,2216, # 2288 +1570,2245, 722,1747,2217, 905,3238,1103,6135,1893,1441,1965, 251,1805,2371,3700, # 2304 +2601,1919,1078, 75,2182,1509,1592,1270,2640,4638,2152,6136,3310,3817, 524, 706, # 2320 +1075, 292,3818,1756,2602, 317, 98,3173,3605,3525,1844,2218,3819,2502, 814, 567, # 2336 + 385,2908,1534,6137, 534,1642,3239, 797,6138,1670,1529, 953,4323, 188,1071, 538, # 2352 + 178, 729,3240,2109,1226,1374,2000,2357,2977, 731,2468,1116,2014,2051,6139,1261, # 2368 +1593, 803,2859,2736,3443, 556, 682, 823,1541,6140,1369,2289,1706,2794, 845, 462, # 2384 +2603,2665,1361, 387, 162,2358,1740, 739,1770,1720,1304,1401,3241,1049, 627,1571, # 2400 +2427,3526,1877,3942,1852,1500, 431,1910,1503, 677, 297,2795, 286,1433,1038,1198, # 2416 +2290,1133,1596,4113,4639,2469,1510,1484,3943,6141,2442, 108, 712,4640,2372, 866, # 2432 +3701,2755,3242,1348, 834,1945,1408,3527,2395,3243,1811, 824, 994,1179,2110,1548, # 2448 +1453, 790,3003, 690,4324,4325,2832,2909,3820,1860,3821, 225,1748, 310, 346,1780, # 2464 +2470, 821,1993,2717,2796, 828, 877,3528,2860,2471,1702,2165,2910,2486,1789, 453, # 2480 + 359,2291,1676, 73,1164,1461,1127,3311, 421, 604, 314,1037, 589, 116,2487, 737, # 2496 + 837,1180, 111, 244, 735,6142,2261,1861,1362, 986, 523, 418, 581,2666,3822, 103, # 2512 + 855, 503,1414,1867,2488,1091, 657,1597, 979, 605,1316,4641,1021,2443,2078,2001, # 2528 +1209, 96, 587,2166,1032, 260,1072,2153, 173, 94, 226,3244, 819,2006,4642,4114, # 2544 +2203, 231,1744, 782, 97,2667, 786,3387, 887, 391, 442,2219,4326,1425,6143,2694, # 2560 + 633,1544,1202, 483,2015, 592,2052,1958,2472,1655, 419, 129,4327,3444,3312,1714, # 2576 +1257,3078,4328,1518,1098, 865,1310,1019,1885,1512,1734, 469,2444, 148, 773, 436, # 2592 +1815,1868,1128,1055,4329,1245,2756,3445,2154,1934,1039,4643, 579,1238, 932,2320, # 2608 + 353, 205, 801, 115,2428, 944,2321,1881, 399,2565,1211, 678, 766,3944, 335,2101, # 2624 +1459,1781,1402,3945,2737,2131,1010, 844, 981,1326,1013, 550,1816,1545,2620,1335, # 2640 +1008, 371,2881, 936,1419,1613,3529,1456,1395,2273,1834,2604,1317,2738,2503, 416, # 2656 +1643,4330, 806,1126, 229, 591,3946,1314,1981,1576,1837,1666, 347,1790, 977,3313, # 2672 + 764,2861,1853, 688,2429,1920,1462, 77, 595, 415,2002,3034, 798,1192,4115,6144, # 2688 +2978,4331,3035,2695,2582,2072,2566, 430,2430,1727, 842,1396,3947,3702, 613, 377, # 2704 + 278, 236,1417,3388,3314,3174, 757,1869, 107,3530,6145,1194, 623,2262, 207,1253, # 2720 +2167,3446,3948, 492,1117,1935, 536,1838,2757,1246,4332, 696,2095,2406,1393,1572, # 2736 +3175,1782, 583, 190, 253,1390,2230, 830,3126,3389, 934,3245,1703,1749,2979,1870, # 2752 +2545,1656,2204, 869,2346,4116,3176,1817, 496,1764,4644, 942,1504, 404,1903,1122, # 2768 +1580,3606,2945,1022, 515, 372,1735, 955,2431,3036,6146,2797,1110,2302,2798, 617, # 2784 +6147, 441, 762,1771,3447,3607,3608,1904, 840,3037, 86, 939,1385, 572,1370,2445, # 2800 +1336, 114,3703, 898, 294, 203,3315, 703,1583,2274, 429, 961,4333,1854,1951,3390, # 2816 +2373,3704,4334,1318,1381, 966,1911,2322,1006,1155, 309, 989, 458,2718,1795,1372, # 2832 +1203, 252,1689,1363,3177, 517,1936, 168,1490, 562, 193,3823,1042,4117,1835, 551, # 2848 + 470,4645, 395, 489,3448,1871,1465,2583,2641, 417,1493, 279,1295, 511,1236,1119, # 2864 + 72,1231,1982,1812,3004, 871,1564, 984,3449,1667,2696,2096,4646,2347,2833,1673, # 2880 +3609, 695,3246,2668, 807,1183,4647, 890, 388,2333,1801,1457,2911,1765,1477,1031, # 2896 +3316,3317,1278,3391,2799,2292,2526, 163,3450,4335,2669,1404,1802,6148,2323,2407, # 2912 +1584,1728,1494,1824,1269, 298, 909,3318,1034,1632, 375, 776,1683,2061, 291, 210, # 2928 +1123, 809,1249,1002,2642,3038, 206,1011,2132, 144, 975, 882,1565, 342, 667, 754, # 2944 +1442,2143,1299,2303,2062, 447, 626,2205,1221,2739,2912,1144,1214,2206,2584, 760, # 2960 +1715, 614, 950,1281,2670,2621, 810, 577,1287,2546,4648, 242,2168, 250,2643, 691, # 2976 + 123,2644, 647, 313,1029, 689,1357,2946,1650, 216, 771,1339,1306, 808,2063, 549, # 2992 + 913,1371,2913,2914,6149,1466,1092,1174,1196,1311,2605,2396,1783,1796,3079, 406, # 3008 +2671,2117,3949,4649, 487,1825,2220,6150,2915, 448,2348,1073,6151,2397,1707, 130, # 3024 + 900,1598, 329, 176,1959,2527,1620,6152,2275,4336,3319,1983,2191,3705,3610,2155, # 3040 +3706,1912,1513,1614,6153,1988, 646, 392,2304,1589,3320,3039,1826,1239,1352,1340, # 3056 +2916, 505,2567,1709,1437,2408,2547, 906,6154,2672, 384,1458,1594,1100,1329, 710, # 3072 + 423,3531,2064,2231,2622,1989,2673,1087,1882, 333, 841,3005,1296,2882,2379, 580, # 3088 +1937,1827,1293,2585, 601, 574, 249,1772,4118,2079,1120, 645, 901,1176,1690, 795, # 3104 +2207, 478,1434, 516,1190,1530, 761,2080, 930,1264, 355, 435,1552, 644,1791, 987, # 3120 + 220,1364,1163,1121,1538, 306,2169,1327,1222, 546,2645, 218, 241, 610,1704,3321, # 3136 +1984,1839,1966,2528, 451,6155,2586,3707,2568, 907,3178, 254,2947, 186,1845,4650, # 3152 + 745, 432,1757, 428,1633, 888,2246,2221,2489,3611,2118,1258,1265, 956,3127,1784, # 3168 +4337,2490, 319, 510, 119, 457,3612, 274,2035,2007,4651,1409,3128, 970,2758, 590, # 3184 +2800, 661,2247,4652,2008,3950,1420,1549,3080,3322,3951,1651,1375,2111, 485,2491, # 3200 +1429,1156,6156,2548,2183,1495, 831,1840,2529,2446, 501,1657, 307,1894,3247,1341, # 3216 + 666, 899,2156,1539,2549,1559, 886, 349,2208,3081,2305,1736,3824,2170,2759,1014, # 3232 +1913,1386, 542,1397,2948, 490, 368, 716, 362, 159, 282,2569,1129,1658,1288,1750, # 3248 +2674, 276, 649,2016, 751,1496, 658,1818,1284,1862,2209,2087,2512,3451, 622,2834, # 3264 + 376, 117,1060,2053,1208,1721,1101,1443, 247,1250,3179,1792,3952,2760,2398,3953, # 3280 +6157,2144,3708, 446,2432,1151,2570,3452,2447,2761,2835,1210,2448,3082, 424,2222, # 3296 +1251,2449,2119,2836, 504,1581,4338, 602, 817, 857,3825,2349,2306, 357,3826,1470, # 3312 +1883,2883, 255, 958, 929,2917,3248, 302,4653,1050,1271,1751,2307,1952,1430,2697, # 3328 +2719,2359, 354,3180, 777, 158,2036,4339,1659,4340,4654,2308,2949,2248,1146,2232, # 3344 +3532,2720,1696,2623,3827,6158,3129,1550,2698,1485,1297,1428, 637, 931,2721,2145, # 3360 + 914,2550,2587, 81,2450, 612, 827,2646,1242,4655,1118,2884, 472,1855,3181,3533, # 3376 +3534, 569,1353,2699,1244,1758,2588,4119,2009,2762,2171,3709,1312,1531,6159,1152, # 3392 +1938, 134,1830, 471,3710,2276,1112,1535,3323,3453,3535, 982,1337,2950, 488, 826, # 3408 + 674,1058,1628,4120,2017, 522,2399, 211, 568,1367,3454, 350, 293,1872,1139,3249, # 3424 +1399,1946,3006,1300,2360,3324, 588, 736,6160,2606, 744, 669,3536,3828,6161,1358, # 3440 + 199, 723, 848, 933, 851,1939,1505,1514,1338,1618,1831,4656,1634,3613, 443,2740, # 3456 +3829, 717,1947, 491,1914,6162,2551,1542,4121,1025,6163,1099,1223, 198,3040,2722, # 3472 + 370, 410,1905,2589, 998,1248,3182,2380, 519,1449,4122,1710, 947, 928,1153,4341, # 3488 +2277, 344,2624,1511, 615, 105, 161,1212,1076,1960,3130,2054,1926,1175,1906,2473, # 3504 + 414,1873,2801,6164,2309, 315,1319,3325, 318,2018,2146,2157, 963, 631, 223,4342, # 3520 +4343,2675, 479,3711,1197,2625,3712,2676,2361,6165,4344,4123,6166,2451,3183,1886, # 3536 +2184,1674,1330,1711,1635,1506, 799, 219,3250,3083,3954,1677,3713,3326,2081,3614, # 3552 +1652,2073,4657,1147,3041,1752, 643,1961, 147,1974,3955,6167,1716,2037, 918,3007, # 3568 +1994, 120,1537, 118, 609,3184,4345, 740,3455,1219, 332,1615,3830,6168,1621,2980, # 3584 +1582, 783, 212, 553,2350,3714,1349,2433,2082,4124, 889,6169,2310,1275,1410, 973, # 3600 + 166,1320,3456,1797,1215,3185,2885,1846,2590,2763,4658, 629, 822,3008, 763, 940, # 3616 +1990,2862, 439,2409,1566,1240,1622, 926,1282,1907,2764, 654,2210,1607, 327,1130, # 3632 +3956,1678,1623,6170,2434,2192, 686, 608,3831,3715, 903,3957,3042,6171,2741,1522, # 3648 +1915,1105,1555,2552,1359, 323,3251,4346,3457, 738,1354,2553,2311,2334,1828,2003, # 3664 +3832,1753,2351,1227,6172,1887,4125,1478,6173,2410,1874,1712,1847, 520,1204,2607, # 3680 + 264,4659, 836,2677,2102, 600,4660,3833,2278,3084,6174,4347,3615,1342, 640, 532, # 3696 + 543,2608,1888,2400,2591,1009,4348,1497, 341,1737,3616,2723,1394, 529,3252,1321, # 3712 + 983,4661,1515,2120, 971,2592, 924, 287,1662,3186,4349,2700,4350,1519, 908,1948, # 3728 +2452, 156, 796,1629,1486,2223,2055, 694,4126,1259,1036,3392,1213,2249,2742,1889, # 3744 +1230,3958,1015, 910, 408, 559,3617,4662, 746, 725, 935,4663,3959,3009,1289, 563, # 3760 + 867,4664,3960,1567,2981,2038,2626, 988,2263,2381,4351, 143,2374, 704,1895,6175, # 3776 +1188,3716,2088, 673,3085,2362,4352, 484,1608,1921,2765,2918, 215, 904,3618,3537, # 3792 + 894, 509, 976,3043,2701,3961,4353,2837,2982, 498,6176,6177,1102,3538,1332,3393, # 3808 +1487,1636,1637, 233, 245,3962, 383, 650, 995,3044, 460,1520,1206,2352, 749,3327, # 3824 + 530, 700, 389,1438,1560,1773,3963,2264, 719,2951,2724,3834, 870,1832,1644,1000, # 3840 + 839,2474,3717, 197,1630,3394, 365,2886,3964,1285,2133, 734, 922, 818,1106, 732, # 3856 + 480,2083,1774,3458, 923,2279,1350, 221,3086, 85,2233,2234,3835,1585,3010,2147, # 3872 +1387,1705,2382,1619,2475, 133, 239,2802,1991,1016,2084,2383, 411,2838,1113, 651, # 3888 +1985,1160,3328, 990,1863,3087,1048,1276,2647, 265,2627,1599,3253,2056, 150, 638, # 3904 +2019, 656, 853, 326,1479, 680,1439,4354,1001,1759, 413,3459,3395,2492,1431, 459, # 3920 +4355,1125,3329,2265,1953,1450,2065,2863, 849, 351,2678,3131,3254,3255,1104,1577, # 3936 + 227,1351,1645,2453,2193,1421,2887, 812,2121, 634, 95,2435, 201,2312,4665,1646, # 3952 +1671,2743,1601,2554,2702,2648,2280,1315,1366,2089,3132,1573,3718,3965,1729,1189, # 3968 + 328,2679,1077,1940,1136, 558,1283, 964,1195, 621,2074,1199,1743,3460,3619,1896, # 3984 +1916,1890,3836,2952,1154,2112,1064, 862, 378,3011,2066,2113,2803,1568,2839,6178, # 4000 +3088,2919,1941,1660,2004,1992,2194, 142, 707,1590,1708,1624,1922,1023,1836,1233, # 4016 +1004,2313, 789, 741,3620,6179,1609,2411,1200,4127,3719,3720,4666,2057,3721, 593, # 4032 +2840, 367,2920,1878,6180,3461,1521, 628,1168, 692,2211,2649, 300, 720,2067,2571, # 4048 +2953,3396, 959,2504,3966,3539,3462,1977, 701,6181, 954,1043, 800, 681, 183,3722, # 4064 +1803,1730,3540,4128,2103, 815,2314, 174, 467, 230,2454,1093,2134, 755,3541,3397, # 4080 +1141,1162,6182,1738,2039, 270,3256,2513,1005,1647,2185,3837, 858,1679,1897,1719, # 4096 +2954,2324,1806, 402, 670, 167,4129,1498,2158,2104, 750,6183, 915, 189,1680,1551, # 4112 + 455,4356,1501,2455, 405,1095,2955, 338,1586,1266,1819, 570, 641,1324, 237,1556, # 4128 +2650,1388,3723,6184,1368,2384,1343,1978,3089,2436, 879,3724, 792,1191, 758,3012, # 4144 +1411,2135,1322,4357, 240,4667,1848,3725,1574,6185, 420,3045,1546,1391, 714,4358, # 4160 +1967, 941,1864, 863, 664, 426, 560,1731,2680,1785,2864,1949,2363, 403,3330,1415, # 4176 +1279,2136,1697,2335, 204, 721,2097,3838, 90,6186,2085,2505, 191,3967, 124,2148, # 4192 +1376,1798,1178,1107,1898,1405, 860,4359,1243,1272,2375,2983,1558,2456,1638, 113, # 4208 +3621, 578,1923,2609, 880, 386,4130, 784,2186,2266,1422,2956,2172,1722, 497, 263, # 4224 +2514,1267,2412,2610, 177,2703,3542, 774,1927,1344, 616,1432,1595,1018, 172,4360, # 4240 +2325, 911,4361, 438,1468,3622, 794,3968,2024,2173,1681,1829,2957, 945, 895,3090, # 4256 + 575,2212,2476, 475,2401,2681, 785,2744,1745,2293,2555,1975,3133,2865, 394,4668, # 4272 +3839, 635,4131, 639, 202,1507,2195,2766,1345,1435,2572,3726,1908,1184,1181,2457, # 4288 +3727,3134,4362, 843,2611, 437, 916,4669, 234, 769,1884,3046,3047,3623, 833,6187, # 4304 +1639,2250,2402,1355,1185,2010,2047, 999, 525,1732,1290,1488,2612, 948,1578,3728, # 4320 +2413,2477,1216,2725,2159, 334,3840,1328,3624,2921,1525,4132, 564,1056, 891,4363, # 4336 +1444,1698,2385,2251,3729,1365,2281,2235,1717,6188, 864,3841,2515, 444, 527,2767, # 4352 +2922,3625, 544, 461,6189, 566, 209,2437,3398,2098,1065,2068,3331,3626,3257,2137, # 4368 #last 512 +) + + diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/jisfreq 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/jisfreq 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b6a3096d9e6688431274271aee0e9ad88a4575c3 GIT binary patch literal 44543 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 H?;ZFbTbX3H literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/jisfreq.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/jisfreq.py new file mode 100644 index 0000000..83fc082 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/jisfreq.py @@ -0,0 +1,325 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# Sampling from about 20M text materials include literature and computer technology +# +# Japanese frequency table, applied to both S-JIS and EUC-JP +# They are sorted in order. + +# 128 --> 0.77094 +# 256 --> 0.85710 +# 512 --> 0.92635 +# 1024 --> 0.97130 +# 2048 --> 0.99431 +# +# Ideal Distribution Ratio = 0.92635 / (1-0.92635) = 12.58 +# Random Distribution Ration = 512 / (2965+62+83+86-512) = 0.191 +# +# Typical Distribution Ratio, 25% of IDR + +JIS_TYPICAL_DISTRIBUTION_RATIO = 3.0 + +# Char to FreqOrder table , +JIS_TABLE_SIZE = 4368 + +JIS_CHAR_TO_FREQ_ORDER = ( + 40, 1, 6, 182, 152, 180, 295,2127, 285, 381,3295,4304,3068,4606,3165,3510, # 16 +3511,1822,2785,4607,1193,2226,5070,4608, 171,2996,1247, 18, 179,5071, 856,1661, # 32 +1262,5072, 619, 127,3431,3512,3230,1899,1700, 232, 228,1294,1298, 284, 283,2041, # 48 +2042,1061,1062, 48, 49, 44, 45, 433, 434,1040,1041, 996, 787,2997,1255,4305, # 64 +2108,4609,1684,1648,5073,5074,5075,5076,5077,5078,3687,5079,4610,5080,3927,3928, # 80 +5081,3296,3432, 290,2285,1471,2187,5082,2580,2825,1303,2140,1739,1445,2691,3375, # 96 +1691,3297,4306,4307,4611, 452,3376,1182,2713,3688,3069,4308,5083,5084,5085,5086, # 112 +5087,5088,5089,5090,5091,5092,5093,5094,5095,5096,5097,5098,5099,5100,5101,5102, # 128 +5103,5104,5105,5106,5107,5108,5109,5110,5111,5112,4097,5113,5114,5115,5116,5117, # 144 +5118,5119,5120,5121,5122,5123,5124,5125,5126,5127,5128,5129,5130,5131,5132,5133, # 160 +5134,5135,5136,5137,5138,5139,5140,5141,5142,5143,5144,5145,5146,5147,5148,5149, # 176 +5150,5151,5152,4612,5153,5154,5155,5156,5157,5158,5159,5160,5161,5162,5163,5164, # 192 +5165,5166,5167,5168,5169,5170,5171,5172,5173,5174,5175,1472, 598, 618, 820,1205, # 208 +1309,1412,1858,1307,1692,5176,5177,5178,5179,5180,5181,5182,1142,1452,1234,1172, # 224 +1875,2043,2149,1793,1382,2973, 925,2404,1067,1241, 960,1377,2935,1491, 919,1217, # 240 +1865,2030,1406,1499,2749,4098,5183,5184,5185,5186,5187,5188,2561,4099,3117,1804, # 256 +2049,3689,4309,3513,1663,5189,3166,3118,3298,1587,1561,3433,5190,3119,1625,2998, # 272 +3299,4613,1766,3690,2786,4614,5191,5192,5193,5194,2161, 26,3377, 2,3929, 20, # 288 +3691, 47,4100, 50, 17, 16, 35, 268, 27, 243, 42, 155, 24, 154, 29, 184, # 304 + 4, 91, 14, 92, 53, 396, 33, 289, 9, 37, 64, 620, 21, 39, 321, 5, # 320 + 12, 11, 52, 13, 3, 208, 138, 0, 7, 60, 526, 141, 151,1069, 181, 275, # 336 +1591, 83, 132,1475, 126, 331, 829, 15, 69, 160, 59, 22, 157, 55,1079, 312, # 352 + 109, 38, 23, 25, 10, 19, 79,5195, 61, 382,1124, 8, 30,5196,5197,5198, # 368 +5199,5200,5201,5202,5203,5204,5205,5206, 89, 62, 74, 34,2416, 112, 139, 196, # 384 + 271, 149, 84, 607, 131, 765, 46, 88, 153, 683, 76, 874, 101, 258, 57, 80, # 400 + 32, 364, 121,1508, 169,1547, 68, 235, 145,2999, 41, 360,3027, 70, 63, 31, # 416 + 43, 259, 262,1383, 99, 533, 194, 66, 93, 846, 217, 192, 56, 106, 58, 565, # 432 + 280, 272, 311, 256, 146, 82, 308, 71, 100, 128, 214, 655, 110, 261, 104,1140, # 448 + 54, 51, 36, 87, 67,3070, 185,2618,2936,2020, 28,1066,2390,2059,5207,5208, # 464 +5209,5210,5211,5212,5213,5214,5215,5216,4615,5217,5218,5219,5220,5221,5222,5223, # 480 +5224,5225,5226,5227,5228,5229,5230,5231,5232,5233,5234,5235,5236,3514,5237,5238, # 496 +5239,5240,5241,5242,5243,5244,2297,2031,4616,4310,3692,5245,3071,5246,3598,5247, # 512 +4617,3231,3515,5248,4101,4311,4618,3808,4312,4102,5249,4103,4104,3599,5250,5251, # 528 +5252,5253,5254,5255,5256,5257,5258,5259,5260,5261,5262,5263,5264,5265,5266,5267, # 544 +5268,5269,5270,5271,5272,5273,5274,5275,5276,5277,5278,5279,5280,5281,5282,5283, # 560 +5284,5285,5286,5287,5288,5289,5290,5291,5292,5293,5294,5295,5296,5297,5298,5299, # 576 +5300,5301,5302,5303,5304,5305,5306,5307,5308,5309,5310,5311,5312,5313,5314,5315, # 592 +5316,5317,5318,5319,5320,5321,5322,5323,5324,5325,5326,5327,5328,5329,5330,5331, # 608 +5332,5333,5334,5335,5336,5337,5338,5339,5340,5341,5342,5343,5344,5345,5346,5347, # 624 +5348,5349,5350,5351,5352,5353,5354,5355,5356,5357,5358,5359,5360,5361,5362,5363, # 640 +5364,5365,5366,5367,5368,5369,5370,5371,5372,5373,5374,5375,5376,5377,5378,5379, # 656 +5380,5381, 363, 642,2787,2878,2788,2789,2316,3232,2317,3434,2011, 165,1942,3930, # 672 +3931,3932,3933,5382,4619,5383,4620,5384,5385,5386,5387,5388,5389,5390,5391,5392, # 688 +5393,5394,5395,5396,5397,5398,5399,5400,5401,5402,5403,5404,5405,5406,5407,5408, # 704 +5409,5410,5411,5412,5413,5414,5415,5416,5417,5418,5419,5420,5421,5422,5423,5424, # 720 +5425,5426,5427,5428,5429,5430,5431,5432,5433,5434,5435,5436,5437,5438,5439,5440, # 736 +5441,5442,5443,5444,5445,5446,5447,5448,5449,5450,5451,5452,5453,5454,5455,5456, # 752 +5457,5458,5459,5460,5461,5462,5463,5464,5465,5466,5467,5468,5469,5470,5471,5472, # 768 +5473,5474,5475,5476,5477,5478,5479,5480,5481,5482,5483,5484,5485,5486,5487,5488, # 784 +5489,5490,5491,5492,5493,5494,5495,5496,5497,5498,5499,5500,5501,5502,5503,5504, # 800 +5505,5506,5507,5508,5509,5510,5511,5512,5513,5514,5515,5516,5517,5518,5519,5520, # 816 +5521,5522,5523,5524,5525,5526,5527,5528,5529,5530,5531,5532,5533,5534,5535,5536, # 832 +5537,5538,5539,5540,5541,5542,5543,5544,5545,5546,5547,5548,5549,5550,5551,5552, # 848 +5553,5554,5555,5556,5557,5558,5559,5560,5561,5562,5563,5564,5565,5566,5567,5568, # 864 +5569,5570,5571,5572,5573,5574,5575,5576,5577,5578,5579,5580,5581,5582,5583,5584, # 880 +5585,5586,5587,5588,5589,5590,5591,5592,5593,5594,5595,5596,5597,5598,5599,5600, # 896 +5601,5602,5603,5604,5605,5606,5607,5608,5609,5610,5611,5612,5613,5614,5615,5616, # 912 +5617,5618,5619,5620,5621,5622,5623,5624,5625,5626,5627,5628,5629,5630,5631,5632, # 928 +5633,5634,5635,5636,5637,5638,5639,5640,5641,5642,5643,5644,5645,5646,5647,5648, # 944 +5649,5650,5651,5652,5653,5654,5655,5656,5657,5658,5659,5660,5661,5662,5663,5664, # 960 +5665,5666,5667,5668,5669,5670,5671,5672,5673,5674,5675,5676,5677,5678,5679,5680, # 976 +5681,5682,5683,5684,5685,5686,5687,5688,5689,5690,5691,5692,5693,5694,5695,5696, # 992 +5697,5698,5699,5700,5701,5702,5703,5704,5705,5706,5707,5708,5709,5710,5711,5712, # 1008 +5713,5714,5715,5716,5717,5718,5719,5720,5721,5722,5723,5724,5725,5726,5727,5728, # 1024 +5729,5730,5731,5732,5733,5734,5735,5736,5737,5738,5739,5740,5741,5742,5743,5744, # 1040 +5745,5746,5747,5748,5749,5750,5751,5752,5753,5754,5755,5756,5757,5758,5759,5760, # 1056 +5761,5762,5763,5764,5765,5766,5767,5768,5769,5770,5771,5772,5773,5774,5775,5776, # 1072 +5777,5778,5779,5780,5781,5782,5783,5784,5785,5786,5787,5788,5789,5790,5791,5792, # 1088 +5793,5794,5795,5796,5797,5798,5799,5800,5801,5802,5803,5804,5805,5806,5807,5808, # 1104 +5809,5810,5811,5812,5813,5814,5815,5816,5817,5818,5819,5820,5821,5822,5823,5824, # 1120 +5825,5826,5827,5828,5829,5830,5831,5832,5833,5834,5835,5836,5837,5838,5839,5840, # 1136 +5841,5842,5843,5844,5845,5846,5847,5848,5849,5850,5851,5852,5853,5854,5855,5856, # 1152 +5857,5858,5859,5860,5861,5862,5863,5864,5865,5866,5867,5868,5869,5870,5871,5872, # 1168 +5873,5874,5875,5876,5877,5878,5879,5880,5881,5882,5883,5884,5885,5886,5887,5888, # 1184 +5889,5890,5891,5892,5893,5894,5895,5896,5897,5898,5899,5900,5901,5902,5903,5904, # 1200 +5905,5906,5907,5908,5909,5910,5911,5912,5913,5914,5915,5916,5917,5918,5919,5920, # 1216 +5921,5922,5923,5924,5925,5926,5927,5928,5929,5930,5931,5932,5933,5934,5935,5936, # 1232 +5937,5938,5939,5940,5941,5942,5943,5944,5945,5946,5947,5948,5949,5950,5951,5952, # 1248 +5953,5954,5955,5956,5957,5958,5959,5960,5961,5962,5963,5964,5965,5966,5967,5968, # 1264 +5969,5970,5971,5972,5973,5974,5975,5976,5977,5978,5979,5980,5981,5982,5983,5984, # 1280 +5985,5986,5987,5988,5989,5990,5991,5992,5993,5994,5995,5996,5997,5998,5999,6000, # 1296 +6001,6002,6003,6004,6005,6006,6007,6008,6009,6010,6011,6012,6013,6014,6015,6016, # 1312 +6017,6018,6019,6020,6021,6022,6023,6024,6025,6026,6027,6028,6029,6030,6031,6032, # 1328 +6033,6034,6035,6036,6037,6038,6039,6040,6041,6042,6043,6044,6045,6046,6047,6048, # 1344 +6049,6050,6051,6052,6053,6054,6055,6056,6057,6058,6059,6060,6061,6062,6063,6064, # 1360 +6065,6066,6067,6068,6069,6070,6071,6072,6073,6074,6075,6076,6077,6078,6079,6080, # 1376 +6081,6082,6083,6084,6085,6086,6087,6088,6089,6090,6091,6092,6093,6094,6095,6096, # 1392 +6097,6098,6099,6100,6101,6102,6103,6104,6105,6106,6107,6108,6109,6110,6111,6112, # 1408 +6113,6114,2044,2060,4621, 997,1235, 473,1186,4622, 920,3378,6115,6116, 379,1108, # 1424 +4313,2657,2735,3934,6117,3809, 636,3233, 573,1026,3693,3435,2974,3300,2298,4105, # 1440 + 854,2937,2463, 393,2581,2417, 539, 752,1280,2750,2480, 140,1161, 440, 708,1569, # 1456 + 665,2497,1746,1291,1523,3000, 164,1603, 847,1331, 537,1997, 486, 508,1693,2418, # 1472 +1970,2227, 878,1220, 299,1030, 969, 652,2751, 624,1137,3301,2619, 65,3302,2045, # 1488 +1761,1859,3120,1930,3694,3516, 663,1767, 852, 835,3695, 269, 767,2826,2339,1305, # 1504 + 896,1150, 770,1616,6118, 506,1502,2075,1012,2519, 775,2520,2975,2340,2938,4314, # 1520 +3028,2086,1224,1943,2286,6119,3072,4315,2240,1273,1987,3935,1557, 175, 597, 985, # 1536 +3517,2419,2521,1416,3029, 585, 938,1931,1007,1052,1932,1685,6120,3379,4316,4623, # 1552 + 804, 599,3121,1333,2128,2539,1159,1554,2032,3810, 687,2033,2904, 952, 675,1467, # 1568 +3436,6121,2241,1096,1786,2440,1543,1924, 980,1813,2228, 781,2692,1879, 728,1918, # 1584 +3696,4624, 548,1950,4625,1809,1088,1356,3303,2522,1944, 502, 972, 373, 513,2827, # 1600 + 586,2377,2391,1003,1976,1631,6122,2464,1084, 648,1776,4626,2141, 324, 962,2012, # 1616 +2177,2076,1384, 742,2178,1448,1173,1810, 222, 102, 301, 445, 125,2420, 662,2498, # 1632 + 277, 200,1476,1165,1068, 224,2562,1378,1446, 450,1880, 659, 791, 582,4627,2939, # 1648 +3936,1516,1274, 555,2099,3697,1020,1389,1526,3380,1762,1723,1787,2229, 412,2114, # 1664 +1900,2392,3518, 512,2597, 427,1925,2341,3122,1653,1686,2465,2499, 697, 330, 273, # 1680 + 380,2162, 951, 832, 780, 991,1301,3073, 965,2270,3519, 668,2523,2636,1286, 535, # 1696 +1407, 518, 671, 957,2658,2378, 267, 611,2197,3030,6123, 248,2299, 967,1799,2356, # 1712 + 850,1418,3437,1876,1256,1480,2828,1718,6124,6125,1755,1664,2405,6126,4628,2879, # 1728 +2829, 499,2179, 676,4629, 557,2329,2214,2090, 325,3234, 464, 811,3001, 992,2342, # 1744 +2481,1232,1469, 303,2242, 466,1070,2163, 603,1777,2091,4630,2752,4631,2714, 322, # 1760 +2659,1964,1768, 481,2188,1463,2330,2857,3600,2092,3031,2421,4632,2318,2070,1849, # 1776 +2598,4633,1302,2254,1668,1701,2422,3811,2905,3032,3123,2046,4106,1763,1694,4634, # 1792 +1604, 943,1724,1454, 917, 868,2215,1169,2940, 552,1145,1800,1228,1823,1955, 316, # 1808 +1080,2510, 361,1807,2830,4107,2660,3381,1346,1423,1134,4108,6127, 541,1263,1229, # 1824 +1148,2540, 545, 465,1833,2880,3438,1901,3074,2482, 816,3937, 713,1788,2500, 122, # 1840 +1575, 195,1451,2501,1111,6128, 859, 374,1225,2243,2483,4317, 390,1033,3439,3075, # 1856 +2524,1687, 266, 793,1440,2599, 946, 779, 802, 507, 897,1081, 528,2189,1292, 711, # 1872 +1866,1725,1167,1640, 753, 398,2661,1053, 246, 348,4318, 137,1024,3440,1600,2077, # 1888 +2129, 825,4319, 698, 238, 521, 187,2300,1157,2423,1641,1605,1464,1610,1097,2541, # 1904 +1260,1436, 759,2255,1814,2150, 705,3235, 409,2563,3304, 561,3033,2005,2564, 726, # 1920 +1956,2343,3698,4109, 949,3812,3813,3520,1669, 653,1379,2525, 881,2198, 632,2256, # 1936 +1027, 778,1074, 733,1957, 514,1481,2466, 554,2180, 702,3938,1606,1017,1398,6129, # 1952 +1380,3521, 921, 993,1313, 594, 449,1489,1617,1166, 768,1426,1360, 495,1794,3601, # 1968 +1177,3602,1170,4320,2344, 476, 425,3167,4635,3168,1424, 401,2662,1171,3382,1998, # 1984 +1089,4110, 477,3169, 474,6130,1909, 596,2831,1842, 494, 693,1051,1028,1207,3076, # 2000 + 606,2115, 727,2790,1473,1115, 743,3522, 630, 805,1532,4321,2021, 366,1057, 838, # 2016 + 684,1114,2142,4322,2050,1492,1892,1808,2271,3814,2424,1971,1447,1373,3305,1090, # 2032 +1536,3939,3523,3306,1455,2199, 336, 369,2331,1035, 584,2393, 902, 718,2600,6131, # 2048 +2753, 463,2151,1149,1611,2467, 715,1308,3124,1268, 343,1413,3236,1517,1347,2663, # 2064 +2093,3940,2022,1131,1553,2100,2941,1427,3441,2942,1323,2484,6132,1980, 872,2368, # 2080 +2441,2943, 320,2369,2116,1082, 679,1933,3941,2791,3815, 625,1143,2023, 422,2200, # 2096 +3816,6133, 730,1695, 356,2257,1626,2301,2858,2637,1627,1778, 937, 883,2906,2693, # 2112 +3002,1769,1086, 400,1063,1325,3307,2792,4111,3077, 456,2345,1046, 747,6134,1524, # 2128 + 884,1094,3383,1474,2164,1059, 974,1688,2181,2258,1047, 345,1665,1187, 358, 875, # 2144 +3170, 305, 660,3524,2190,1334,1135,3171,1540,1649,2542,1527, 927, 968,2793, 885, # 2160 +1972,1850, 482, 500,2638,1218,1109,1085,2543,1654,2034, 876, 78,2287,1482,1277, # 2176 + 861,1675,1083,1779, 724,2754, 454, 397,1132,1612,2332, 893, 672,1237, 257,2259, # 2192 +2370, 135,3384, 337,2244, 547, 352, 340, 709,2485,1400, 788,1138,2511, 540, 772, # 2208 +1682,2260,2272,2544,2013,1843,1902,4636,1999,1562,2288,4637,2201,1403,1533, 407, # 2224 + 576,3308,1254,2071, 978,3385, 170, 136,1201,3125,2664,3172,2394, 213, 912, 873, # 2240 +3603,1713,2202, 699,3604,3699, 813,3442, 493, 531,1054, 468,2907,1483, 304, 281, # 2256 +4112,1726,1252,2094, 339,2319,2130,2639, 756,1563,2944, 748, 571,2976,1588,2425, # 2272 +2715,1851,1460,2426,1528,1392,1973,3237, 288,3309, 685,3386, 296, 892,2716,2216, # 2288 +1570,2245, 722,1747,2217, 905,3238,1103,6135,1893,1441,1965, 251,1805,2371,3700, # 2304 +2601,1919,1078, 75,2182,1509,1592,1270,2640,4638,2152,6136,3310,3817, 524, 706, # 2320 +1075, 292,3818,1756,2602, 317, 98,3173,3605,3525,1844,2218,3819,2502, 814, 567, # 2336 + 385,2908,1534,6137, 534,1642,3239, 797,6138,1670,1529, 953,4323, 188,1071, 538, # 2352 + 178, 729,3240,2109,1226,1374,2000,2357,2977, 731,2468,1116,2014,2051,6139,1261, # 2368 +1593, 803,2859,2736,3443, 556, 682, 823,1541,6140,1369,2289,1706,2794, 845, 462, # 2384 +2603,2665,1361, 387, 162,2358,1740, 739,1770,1720,1304,1401,3241,1049, 627,1571, # 2400 +2427,3526,1877,3942,1852,1500, 431,1910,1503, 677, 297,2795, 286,1433,1038,1198, # 2416 +2290,1133,1596,4113,4639,2469,1510,1484,3943,6141,2442, 108, 712,4640,2372, 866, # 2432 +3701,2755,3242,1348, 834,1945,1408,3527,2395,3243,1811, 824, 994,1179,2110,1548, # 2448 +1453, 790,3003, 690,4324,4325,2832,2909,3820,1860,3821, 225,1748, 310, 346,1780, # 2464 +2470, 821,1993,2717,2796, 828, 877,3528,2860,2471,1702,2165,2910,2486,1789, 453, # 2480 + 359,2291,1676, 73,1164,1461,1127,3311, 421, 604, 314,1037, 589, 116,2487, 737, # 2496 + 837,1180, 111, 244, 735,6142,2261,1861,1362, 986, 523, 418, 581,2666,3822, 103, # 2512 + 855, 503,1414,1867,2488,1091, 657,1597, 979, 605,1316,4641,1021,2443,2078,2001, # 2528 +1209, 96, 587,2166,1032, 260,1072,2153, 173, 94, 226,3244, 819,2006,4642,4114, # 2544 +2203, 231,1744, 782, 97,2667, 786,3387, 887, 391, 442,2219,4326,1425,6143,2694, # 2560 + 633,1544,1202, 483,2015, 592,2052,1958,2472,1655, 419, 129,4327,3444,3312,1714, # 2576 +1257,3078,4328,1518,1098, 865,1310,1019,1885,1512,1734, 469,2444, 148, 773, 436, # 2592 +1815,1868,1128,1055,4329,1245,2756,3445,2154,1934,1039,4643, 579,1238, 932,2320, # 2608 + 353, 205, 801, 115,2428, 944,2321,1881, 399,2565,1211, 678, 766,3944, 335,2101, # 2624 +1459,1781,1402,3945,2737,2131,1010, 844, 981,1326,1013, 550,1816,1545,2620,1335, # 2640 +1008, 371,2881, 936,1419,1613,3529,1456,1395,2273,1834,2604,1317,2738,2503, 416, # 2656 +1643,4330, 806,1126, 229, 591,3946,1314,1981,1576,1837,1666, 347,1790, 977,3313, # 2672 + 764,2861,1853, 688,2429,1920,1462, 77, 595, 415,2002,3034, 798,1192,4115,6144, # 2688 +2978,4331,3035,2695,2582,2072,2566, 430,2430,1727, 842,1396,3947,3702, 613, 377, # 2704 + 278, 236,1417,3388,3314,3174, 757,1869, 107,3530,6145,1194, 623,2262, 207,1253, # 2720 +2167,3446,3948, 492,1117,1935, 536,1838,2757,1246,4332, 696,2095,2406,1393,1572, # 2736 +3175,1782, 583, 190, 253,1390,2230, 830,3126,3389, 934,3245,1703,1749,2979,1870, # 2752 +2545,1656,2204, 869,2346,4116,3176,1817, 496,1764,4644, 942,1504, 404,1903,1122, # 2768 +1580,3606,2945,1022, 515, 372,1735, 955,2431,3036,6146,2797,1110,2302,2798, 617, # 2784 +6147, 441, 762,1771,3447,3607,3608,1904, 840,3037, 86, 939,1385, 572,1370,2445, # 2800 +1336, 114,3703, 898, 294, 203,3315, 703,1583,2274, 429, 961,4333,1854,1951,3390, # 2816 +2373,3704,4334,1318,1381, 966,1911,2322,1006,1155, 309, 989, 458,2718,1795,1372, # 2832 +1203, 252,1689,1363,3177, 517,1936, 168,1490, 562, 193,3823,1042,4117,1835, 551, # 2848 + 470,4645, 395, 489,3448,1871,1465,2583,2641, 417,1493, 279,1295, 511,1236,1119, # 2864 + 72,1231,1982,1812,3004, 871,1564, 984,3449,1667,2696,2096,4646,2347,2833,1673, # 2880 +3609, 695,3246,2668, 807,1183,4647, 890, 388,2333,1801,1457,2911,1765,1477,1031, # 2896 +3316,3317,1278,3391,2799,2292,2526, 163,3450,4335,2669,1404,1802,6148,2323,2407, # 2912 +1584,1728,1494,1824,1269, 298, 909,3318,1034,1632, 375, 776,1683,2061, 291, 210, # 2928 +1123, 809,1249,1002,2642,3038, 206,1011,2132, 144, 975, 882,1565, 342, 667, 754, # 2944 +1442,2143,1299,2303,2062, 447, 626,2205,1221,2739,2912,1144,1214,2206,2584, 760, # 2960 +1715, 614, 950,1281,2670,2621, 810, 577,1287,2546,4648, 242,2168, 250,2643, 691, # 2976 + 123,2644, 647, 313,1029, 689,1357,2946,1650, 216, 771,1339,1306, 808,2063, 549, # 2992 + 913,1371,2913,2914,6149,1466,1092,1174,1196,1311,2605,2396,1783,1796,3079, 406, # 3008 +2671,2117,3949,4649, 487,1825,2220,6150,2915, 448,2348,1073,6151,2397,1707, 130, # 3024 + 900,1598, 329, 176,1959,2527,1620,6152,2275,4336,3319,1983,2191,3705,3610,2155, # 3040 +3706,1912,1513,1614,6153,1988, 646, 392,2304,1589,3320,3039,1826,1239,1352,1340, # 3056 +2916, 505,2567,1709,1437,2408,2547, 906,6154,2672, 384,1458,1594,1100,1329, 710, # 3072 + 423,3531,2064,2231,2622,1989,2673,1087,1882, 333, 841,3005,1296,2882,2379, 580, # 3088 +1937,1827,1293,2585, 601, 574, 249,1772,4118,2079,1120, 645, 901,1176,1690, 795, # 3104 +2207, 478,1434, 516,1190,1530, 761,2080, 930,1264, 355, 435,1552, 644,1791, 987, # 3120 + 220,1364,1163,1121,1538, 306,2169,1327,1222, 546,2645, 218, 241, 610,1704,3321, # 3136 +1984,1839,1966,2528, 451,6155,2586,3707,2568, 907,3178, 254,2947, 186,1845,4650, # 3152 + 745, 432,1757, 428,1633, 888,2246,2221,2489,3611,2118,1258,1265, 956,3127,1784, # 3168 +4337,2490, 319, 510, 119, 457,3612, 274,2035,2007,4651,1409,3128, 970,2758, 590, # 3184 +2800, 661,2247,4652,2008,3950,1420,1549,3080,3322,3951,1651,1375,2111, 485,2491, # 3200 +1429,1156,6156,2548,2183,1495, 831,1840,2529,2446, 501,1657, 307,1894,3247,1341, # 3216 + 666, 899,2156,1539,2549,1559, 886, 349,2208,3081,2305,1736,3824,2170,2759,1014, # 3232 +1913,1386, 542,1397,2948, 490, 368, 716, 362, 159, 282,2569,1129,1658,1288,1750, # 3248 +2674, 276, 649,2016, 751,1496, 658,1818,1284,1862,2209,2087,2512,3451, 622,2834, # 3264 + 376, 117,1060,2053,1208,1721,1101,1443, 247,1250,3179,1792,3952,2760,2398,3953, # 3280 +6157,2144,3708, 446,2432,1151,2570,3452,2447,2761,2835,1210,2448,3082, 424,2222, # 3296 +1251,2449,2119,2836, 504,1581,4338, 602, 817, 857,3825,2349,2306, 357,3826,1470, # 3312 +1883,2883, 255, 958, 929,2917,3248, 302,4653,1050,1271,1751,2307,1952,1430,2697, # 3328 +2719,2359, 354,3180, 777, 158,2036,4339,1659,4340,4654,2308,2949,2248,1146,2232, # 3344 +3532,2720,1696,2623,3827,6158,3129,1550,2698,1485,1297,1428, 637, 931,2721,2145, # 3360 + 914,2550,2587, 81,2450, 612, 827,2646,1242,4655,1118,2884, 472,1855,3181,3533, # 3376 +3534, 569,1353,2699,1244,1758,2588,4119,2009,2762,2171,3709,1312,1531,6159,1152, # 3392 +1938, 134,1830, 471,3710,2276,1112,1535,3323,3453,3535, 982,1337,2950, 488, 826, # 3408 + 674,1058,1628,4120,2017, 522,2399, 211, 568,1367,3454, 350, 293,1872,1139,3249, # 3424 +1399,1946,3006,1300,2360,3324, 588, 736,6160,2606, 744, 669,3536,3828,6161,1358, # 3440 + 199, 723, 848, 933, 851,1939,1505,1514,1338,1618,1831,4656,1634,3613, 443,2740, # 3456 +3829, 717,1947, 491,1914,6162,2551,1542,4121,1025,6163,1099,1223, 198,3040,2722, # 3472 + 370, 410,1905,2589, 998,1248,3182,2380, 519,1449,4122,1710, 947, 928,1153,4341, # 3488 +2277, 344,2624,1511, 615, 105, 161,1212,1076,1960,3130,2054,1926,1175,1906,2473, # 3504 + 414,1873,2801,6164,2309, 315,1319,3325, 318,2018,2146,2157, 963, 631, 223,4342, # 3520 +4343,2675, 479,3711,1197,2625,3712,2676,2361,6165,4344,4123,6166,2451,3183,1886, # 3536 +2184,1674,1330,1711,1635,1506, 799, 219,3250,3083,3954,1677,3713,3326,2081,3614, # 3552 +1652,2073,4657,1147,3041,1752, 643,1961, 147,1974,3955,6167,1716,2037, 918,3007, # 3568 +1994, 120,1537, 118, 609,3184,4345, 740,3455,1219, 332,1615,3830,6168,1621,2980, # 3584 +1582, 783, 212, 553,2350,3714,1349,2433,2082,4124, 889,6169,2310,1275,1410, 973, # 3600 + 166,1320,3456,1797,1215,3185,2885,1846,2590,2763,4658, 629, 822,3008, 763, 940, # 3616 +1990,2862, 439,2409,1566,1240,1622, 926,1282,1907,2764, 654,2210,1607, 327,1130, # 3632 +3956,1678,1623,6170,2434,2192, 686, 608,3831,3715, 903,3957,3042,6171,2741,1522, # 3648 +1915,1105,1555,2552,1359, 323,3251,4346,3457, 738,1354,2553,2311,2334,1828,2003, # 3664 +3832,1753,2351,1227,6172,1887,4125,1478,6173,2410,1874,1712,1847, 520,1204,2607, # 3680 + 264,4659, 836,2677,2102, 600,4660,3833,2278,3084,6174,4347,3615,1342, 640, 532, # 3696 + 543,2608,1888,2400,2591,1009,4348,1497, 341,1737,3616,2723,1394, 529,3252,1321, # 3712 + 983,4661,1515,2120, 971,2592, 924, 287,1662,3186,4349,2700,4350,1519, 908,1948, # 3728 +2452, 156, 796,1629,1486,2223,2055, 694,4126,1259,1036,3392,1213,2249,2742,1889, # 3744 +1230,3958,1015, 910, 408, 559,3617,4662, 746, 725, 935,4663,3959,3009,1289, 563, # 3760 + 867,4664,3960,1567,2981,2038,2626, 988,2263,2381,4351, 143,2374, 704,1895,6175, # 3776 +1188,3716,2088, 673,3085,2362,4352, 484,1608,1921,2765,2918, 215, 904,3618,3537, # 3792 + 894, 509, 976,3043,2701,3961,4353,2837,2982, 498,6176,6177,1102,3538,1332,3393, # 3808 +1487,1636,1637, 233, 245,3962, 383, 650, 995,3044, 460,1520,1206,2352, 749,3327, # 3824 + 530, 700, 389,1438,1560,1773,3963,2264, 719,2951,2724,3834, 870,1832,1644,1000, # 3840 + 839,2474,3717, 197,1630,3394, 365,2886,3964,1285,2133, 734, 922, 818,1106, 732, # 3856 + 480,2083,1774,3458, 923,2279,1350, 221,3086, 85,2233,2234,3835,1585,3010,2147, # 3872 +1387,1705,2382,1619,2475, 133, 239,2802,1991,1016,2084,2383, 411,2838,1113, 651, # 3888 +1985,1160,3328, 990,1863,3087,1048,1276,2647, 265,2627,1599,3253,2056, 150, 638, # 3904 +2019, 656, 853, 326,1479, 680,1439,4354,1001,1759, 413,3459,3395,2492,1431, 459, # 3920 +4355,1125,3329,2265,1953,1450,2065,2863, 849, 351,2678,3131,3254,3255,1104,1577, # 3936 + 227,1351,1645,2453,2193,1421,2887, 812,2121, 634, 95,2435, 201,2312,4665,1646, # 3952 +1671,2743,1601,2554,2702,2648,2280,1315,1366,2089,3132,1573,3718,3965,1729,1189, # 3968 + 328,2679,1077,1940,1136, 558,1283, 964,1195, 621,2074,1199,1743,3460,3619,1896, # 3984 +1916,1890,3836,2952,1154,2112,1064, 862, 378,3011,2066,2113,2803,1568,2839,6178, # 4000 +3088,2919,1941,1660,2004,1992,2194, 142, 707,1590,1708,1624,1922,1023,1836,1233, # 4016 +1004,2313, 789, 741,3620,6179,1609,2411,1200,4127,3719,3720,4666,2057,3721, 593, # 4032 +2840, 367,2920,1878,6180,3461,1521, 628,1168, 692,2211,2649, 300, 720,2067,2571, # 4048 +2953,3396, 959,2504,3966,3539,3462,1977, 701,6181, 954,1043, 800, 681, 183,3722, # 4064 +1803,1730,3540,4128,2103, 815,2314, 174, 467, 230,2454,1093,2134, 755,3541,3397, # 4080 +1141,1162,6182,1738,2039, 270,3256,2513,1005,1647,2185,3837, 858,1679,1897,1719, # 4096 +2954,2324,1806, 402, 670, 167,4129,1498,2158,2104, 750,6183, 915, 189,1680,1551, # 4112 + 455,4356,1501,2455, 405,1095,2955, 338,1586,1266,1819, 570, 641,1324, 237,1556, # 4128 +2650,1388,3723,6184,1368,2384,1343,1978,3089,2436, 879,3724, 792,1191, 758,3012, # 4144 +1411,2135,1322,4357, 240,4667,1848,3725,1574,6185, 420,3045,1546,1391, 714,4358, # 4160 +1967, 941,1864, 863, 664, 426, 560,1731,2680,1785,2864,1949,2363, 403,3330,1415, # 4176 +1279,2136,1697,2335, 204, 721,2097,3838, 90,6186,2085,2505, 191,3967, 124,2148, # 4192 +1376,1798,1178,1107,1898,1405, 860,4359,1243,1272,2375,2983,1558,2456,1638, 113, # 4208 +3621, 578,1923,2609, 880, 386,4130, 784,2186,2266,1422,2956,2172,1722, 497, 263, # 4224 +2514,1267,2412,2610, 177,2703,3542, 774,1927,1344, 616,1432,1595,1018, 172,4360, # 4240 +2325, 911,4361, 438,1468,3622, 794,3968,2024,2173,1681,1829,2957, 945, 895,3090, # 4256 + 575,2212,2476, 475,2401,2681, 785,2744,1745,2293,2555,1975,3133,2865, 394,4668, # 4272 +3839, 635,4131, 639, 202,1507,2195,2766,1345,1435,2572,3726,1908,1184,1181,2457, # 4288 +3727,3134,4362, 843,2611, 437, 916,4669, 234, 769,1884,3046,3047,3623, 833,6187, # 4304 +1639,2250,2402,1355,1185,2010,2047, 999, 525,1732,1290,1488,2612, 948,1578,3728, # 4320 +2413,2477,1216,2725,2159, 334,3840,1328,3624,2921,1525,4132, 564,1056, 891,4363, # 4336 +1444,1698,2385,2251,3729,1365,2281,2235,1717,6188, 864,3841,2515, 444, 527,2767, # 4352 +2922,3625, 544, 461,6189, 566, 209,2437,3398,2098,1065,2068,3331,3626,3257,2137, # 4368 #last 512 +) + + diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/jisfreq.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/jisfreq.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d5b29ff10e5aec27bff9de750ab75784df77d9b5 GIT binary patch literal 44543 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 J;Qze?{{u`lWF7zj literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/jpcntx 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/jpcntx 2.py new file mode 100644 index 0000000..20044e4 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/jpcntx 2.py @@ -0,0 +1,233 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + + +# This is hiragana 2-char sequence table, the number in each cell represents its frequency category +jp2CharContext = ( +(0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1), +(2,4,0,4,0,3,0,4,0,3,4,4,4,2,4,3,3,4,3,2,3,3,4,2,3,3,3,2,4,1,4,3,3,1,5,4,3,4,3,4,3,5,3,0,3,5,4,2,0,3,1,0,3,3,0,3,3,0,1,1,0,4,3,0,3,3,0,4,0,2,0,3,5,5,5,5,4,0,4,1,0,3,4), +(0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2), +(0,4,0,5,0,5,0,4,0,4,5,4,4,3,5,3,5,1,5,3,4,3,4,4,3,4,3,3,4,3,5,4,4,3,5,5,3,5,5,5,3,5,5,3,4,5,5,3,1,3,2,0,3,4,0,4,2,0,4,2,1,5,3,2,3,5,0,4,0,2,0,5,4,4,5,4,5,0,4,0,0,4,4), +(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), +(0,3,0,4,0,3,0,3,0,4,5,4,3,3,3,3,4,3,5,4,4,3,5,4,4,3,4,3,4,4,4,4,5,3,4,4,3,4,5,5,4,5,5,1,4,5,4,3,0,3,3,1,3,3,0,4,4,0,3,3,1,5,3,3,3,5,0,4,0,3,0,4,4,3,4,3,3,0,4,1,1,3,4), +(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), +(0,4,0,3,0,3,0,4,0,3,4,4,3,2,2,1,2,1,3,1,3,3,3,3,3,4,3,1,3,3,5,3,3,0,4,3,0,5,4,3,3,5,4,4,3,4,4,5,0,1,2,0,1,2,0,2,2,0,1,0,0,5,2,2,1,4,0,3,0,1,0,4,4,3,5,4,3,0,2,1,0,4,3), +(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), +(0,3,0,5,0,4,0,2,1,4,4,2,4,1,4,2,4,2,4,3,3,3,4,3,3,3,3,1,4,2,3,3,3,1,4,4,1,1,1,4,3,3,2,0,2,4,3,2,0,3,3,0,3,1,1,0,0,0,3,3,0,4,2,2,3,4,0,4,0,3,0,4,4,5,3,4,4,0,3,0,0,1,4), +(1,4,0,4,0,4,0,4,0,3,5,4,4,3,4,3,5,4,3,3,4,3,5,4,4,4,4,3,4,2,4,3,3,1,5,4,3,2,4,5,4,5,5,4,4,5,4,4,0,3,2,2,3,3,0,4,3,1,3,2,1,4,3,3,4,5,0,3,0,2,0,4,5,5,4,5,4,0,4,0,0,5,4), +(0,5,0,5,0,4,0,3,0,4,4,3,4,3,3,3,4,0,4,4,4,3,4,3,4,3,3,1,4,2,4,3,4,0,5,4,1,4,5,4,4,5,3,2,4,3,4,3,2,4,1,3,3,3,2,3,2,0,4,3,3,4,3,3,3,4,0,4,0,3,0,4,5,4,4,4,3,0,4,1,0,1,3), +(0,3,1,4,0,3,0,2,0,3,4,4,3,1,4,2,3,3,4,3,4,3,4,3,4,4,3,2,3,1,5,4,4,1,4,4,3,5,4,4,3,5,5,4,3,4,4,3,1,2,3,1,2,2,0,3,2,0,3,1,0,5,3,3,3,4,3,3,3,3,4,4,4,4,5,4,2,0,3,3,2,4,3), +(0,2,0,3,0,1,0,1,0,0,3,2,0,0,2,0,1,0,2,1,3,3,3,1,2,3,1,0,1,0,4,2,1,1,3,3,0,4,3,3,1,4,3,3,0,3,3,2,0,0,0,0,1,0,0,2,0,0,0,0,0,4,1,0,2,3,2,2,2,1,3,3,3,4,4,3,2,0,3,1,0,3,3), +(0,4,0,4,0,3,0,3,0,4,4,4,3,3,3,3,3,3,4,3,4,2,4,3,4,3,3,2,4,3,4,5,4,1,4,5,3,5,4,5,3,5,4,0,3,5,5,3,1,3,3,2,2,3,0,3,4,1,3,3,2,4,3,3,3,4,0,4,0,3,0,4,5,4,4,5,3,0,4,1,0,3,4), +(0,2,0,3,0,3,0,0,0,2,2,2,1,0,1,0,0,0,3,0,3,0,3,0,1,3,1,0,3,1,3,3,3,1,3,3,3,0,1,3,1,3,4,0,0,3,1,1,0,3,2,0,0,0,0,1,3,0,1,0,0,3,3,2,0,3,0,0,0,0,0,3,4,3,4,3,3,0,3,0,0,2,3), +(2,3,0,3,0,2,0,1,0,3,3,4,3,1,3,1,1,1,3,1,4,3,4,3,3,3,0,0,3,1,5,4,3,1,4,3,2,5,5,4,4,4,4,3,3,4,4,4,0,2,1,1,3,2,0,1,2,0,0,1,0,4,1,3,3,3,0,3,0,1,0,4,4,4,5,5,3,0,2,0,0,4,4), +(0,2,0,1,0,3,1,3,0,2,3,3,3,0,3,1,0,0,3,0,3,2,3,1,3,2,1,1,0,0,4,2,1,0,2,3,1,4,3,2,0,4,4,3,1,3,1,3,0,1,0,0,1,0,0,0,1,0,0,0,0,4,1,1,1,2,0,3,0,0,0,3,4,2,4,3,2,0,1,0,0,3,3), +(0,1,0,4,0,5,0,4,0,2,4,4,2,3,3,2,3,3,5,3,3,3,4,3,4,2,3,0,4,3,3,3,4,1,4,3,2,1,5,5,3,4,5,1,3,5,4,2,0,3,3,0,1,3,0,4,2,0,1,3,1,4,3,3,3,3,0,3,0,1,0,3,4,4,4,5,5,0,3,0,1,4,5), +(0,2,0,3,0,3,0,0,0,2,3,1,3,0,4,0,1,1,3,0,3,4,3,2,3,1,0,3,3,2,3,1,3,0,2,3,0,2,1,4,1,2,2,0,0,3,3,0,0,2,0,0,0,1,0,0,0,0,2,2,0,3,2,1,3,3,0,2,0,2,0,0,3,3,1,2,4,0,3,0,2,2,3), +(2,4,0,5,0,4,0,4,0,2,4,4,4,3,4,3,3,3,1,2,4,3,4,3,4,4,5,0,3,3,3,3,2,0,4,3,1,4,3,4,1,4,4,3,3,4,4,3,1,2,3,0,4,2,0,4,1,0,3,3,0,4,3,3,3,4,0,4,0,2,0,3,5,3,4,5,2,0,3,0,0,4,5), +(0,3,0,4,0,1,0,1,0,1,3,2,2,1,3,0,3,0,2,0,2,0,3,0,2,0,0,0,1,0,1,1,0,0,3,1,0,0,0,4,0,3,1,0,2,1,3,0,0,0,0,0,0,3,0,0,0,0,0,0,0,4,2,2,3,1,0,3,0,0,0,1,4,4,4,3,0,0,4,0,0,1,4), +(1,4,1,5,0,3,0,3,0,4,5,4,4,3,5,3,3,4,4,3,4,1,3,3,3,3,2,1,4,1,5,4,3,1,4,4,3,5,4,4,3,5,4,3,3,4,4,4,0,3,3,1,2,3,0,3,1,0,3,3,0,5,4,4,4,4,4,4,3,3,5,4,4,3,3,5,4,0,3,2,0,4,4), +(0,2,0,3,0,1,0,0,0,1,3,3,3,2,4,1,3,0,3,1,3,0,2,2,1,1,0,0,2,0,4,3,1,0,4,3,0,4,4,4,1,4,3,1,1,3,3,1,0,2,0,0,1,3,0,0,0,0,2,0,0,4,3,2,4,3,5,4,3,3,3,4,3,3,4,3,3,0,2,1,0,3,3), +(0,2,0,4,0,3,0,2,0,2,5,5,3,4,4,4,4,1,4,3,3,0,4,3,4,3,1,3,3,2,4,3,0,3,4,3,0,3,4,4,2,4,4,0,4,5,3,3,2,2,1,1,1,2,0,1,5,0,3,3,2,4,3,3,3,4,0,3,0,2,0,4,4,3,5,5,0,0,3,0,2,3,3), +(0,3,0,4,0,3,0,1,0,3,4,3,3,1,3,3,3,0,3,1,3,0,4,3,3,1,1,0,3,0,3,3,0,0,4,4,0,1,5,4,3,3,5,0,3,3,4,3,0,2,0,1,1,1,0,1,3,0,1,2,1,3,3,2,3,3,0,3,0,1,0,1,3,3,4,4,1,0,1,2,2,1,3), +(0,1,0,4,0,4,0,3,0,1,3,3,3,2,3,1,1,0,3,0,3,3,4,3,2,4,2,0,1,0,4,3,2,0,4,3,0,5,3,3,2,4,4,4,3,3,3,4,0,1,3,0,0,1,0,0,1,0,0,0,0,4,2,3,3,3,0,3,0,0,0,4,4,4,5,3,2,0,3,3,0,3,5), +(0,2,0,3,0,0,0,3,0,1,3,0,2,0,0,0,1,0,3,1,1,3,3,0,0,3,0,0,3,0,2,3,1,0,3,1,0,3,3,2,0,4,2,2,0,2,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,2,1,2,0,1,0,1,0,0,0,1,3,1,2,0,0,0,1,0,0,1,4), +(0,3,0,3,0,5,0,1,0,2,4,3,1,3,3,2,1,1,5,2,1,0,5,1,2,0,0,0,3,3,2,2,3,2,4,3,0,0,3,3,1,3,3,0,2,5,3,4,0,3,3,0,1,2,0,2,2,0,3,2,0,2,2,3,3,3,0,2,0,1,0,3,4,4,2,5,4,0,3,0,0,3,5), +(0,3,0,3,0,3,0,1,0,3,3,3,3,0,3,0,2,0,2,1,1,0,2,0,1,0,0,0,2,1,0,0,1,0,3,2,0,0,3,3,1,2,3,1,0,3,3,0,0,1,0,0,0,0,0,2,0,0,0,0,0,2,3,1,2,3,0,3,0,1,0,3,2,1,0,4,3,0,1,1,0,3,3), +(0,4,0,5,0,3,0,3,0,4,5,5,4,3,5,3,4,3,5,3,3,2,5,3,4,4,4,3,4,3,4,5,5,3,4,4,3,4,4,5,4,4,4,3,4,5,5,4,2,3,4,2,3,4,0,3,3,1,4,3,2,4,3,3,5,5,0,3,0,3,0,5,5,5,5,4,4,0,4,0,1,4,4), +(0,4,0,4,0,3,0,3,0,3,5,4,4,2,3,2,5,1,3,2,5,1,4,2,3,2,3,3,4,3,3,3,3,2,5,4,1,3,3,5,3,4,4,0,4,4,3,1,1,3,1,0,2,3,0,2,3,0,3,0,0,4,3,1,3,4,0,3,0,2,0,4,4,4,3,4,5,0,4,0,0,3,4), +(0,3,0,3,0,3,1,2,0,3,4,4,3,3,3,0,2,2,4,3,3,1,3,3,3,1,1,0,3,1,4,3,2,3,4,4,2,4,4,4,3,4,4,3,2,4,4,3,1,3,3,1,3,3,0,4,1,0,2,2,1,4,3,2,3,3,5,4,3,3,5,4,4,3,3,0,4,0,3,2,2,4,4), +(0,2,0,1,0,0,0,0,0,1,2,1,3,0,0,0,0,0,2,0,1,2,1,0,0,1,0,0,0,0,3,0,0,1,0,1,1,3,1,0,0,0,1,1,0,1,1,0,0,0,0,0,2,0,0,0,0,0,0,0,0,1,1,2,2,0,3,4,0,0,0,1,1,0,0,1,0,0,0,0,0,1,1), +(0,1,0,0,0,1,0,0,0,0,4,0,4,1,4,0,3,0,4,0,3,0,4,0,3,0,3,0,4,1,5,1,4,0,0,3,0,5,0,5,2,0,1,0,0,0,2,1,4,0,1,3,0,0,3,0,0,3,1,1,4,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0), +(1,4,0,5,0,3,0,2,0,3,5,4,4,3,4,3,5,3,4,3,3,0,4,3,3,3,3,3,3,2,4,4,3,1,3,4,4,5,4,4,3,4,4,1,3,5,4,3,3,3,1,2,2,3,3,1,3,1,3,3,3,5,3,3,4,5,0,3,0,3,0,3,4,3,4,4,3,0,3,0,2,4,3), +(0,1,0,4,0,0,0,0,0,1,4,0,4,1,4,2,4,0,3,0,1,0,1,0,0,0,0,0,2,0,3,1,1,1,0,3,0,0,0,1,2,1,0,0,1,1,1,1,0,1,0,0,0,1,0,0,3,0,0,0,0,3,2,0,2,2,0,1,0,0,0,2,3,2,3,3,0,0,0,0,2,1,0), +(0,5,1,5,0,3,0,3,0,5,4,4,5,1,5,3,3,0,4,3,4,3,5,3,4,3,3,2,4,3,4,3,3,0,3,3,1,4,4,3,4,4,4,3,4,5,5,3,2,3,1,1,3,3,1,3,1,1,3,3,2,4,5,3,3,5,0,4,0,3,0,4,4,3,5,3,3,0,3,4,0,4,3), +(0,5,0,5,0,3,0,2,0,4,4,3,5,2,4,3,3,3,4,4,4,3,5,3,5,3,3,1,4,0,4,3,3,0,3,3,0,4,4,4,4,5,4,3,3,5,5,3,2,3,1,2,3,2,0,1,0,0,3,2,2,4,4,3,1,5,0,4,0,3,0,4,3,1,3,2,1,0,3,3,0,3,3), +(0,4,0,5,0,5,0,4,0,4,5,5,5,3,4,3,3,2,5,4,4,3,5,3,5,3,4,0,4,3,4,4,3,2,4,4,3,4,5,4,4,5,5,0,3,5,5,4,1,3,3,2,3,3,1,3,1,0,4,3,1,4,4,3,4,5,0,4,0,2,0,4,3,4,4,3,3,0,4,0,0,5,5), +(0,4,0,4,0,5,0,1,1,3,3,4,4,3,4,1,3,0,5,1,3,0,3,1,3,1,1,0,3,0,3,3,4,0,4,3,0,4,4,4,3,4,4,0,3,5,4,1,0,3,0,0,2,3,0,3,1,0,3,1,0,3,2,1,3,5,0,3,0,1,0,3,2,3,3,4,4,0,2,2,0,4,4), +(2,4,0,5,0,4,0,3,0,4,5,5,4,3,5,3,5,3,5,3,5,2,5,3,4,3,3,4,3,4,5,3,2,1,5,4,3,2,3,4,5,3,4,1,2,5,4,3,0,3,3,0,3,2,0,2,3,0,4,1,0,3,4,3,3,5,0,3,0,1,0,4,5,5,5,4,3,0,4,2,0,3,5), +(0,5,0,4,0,4,0,2,0,5,4,3,4,3,4,3,3,3,4,3,4,2,5,3,5,3,4,1,4,3,4,4,4,0,3,5,0,4,4,4,4,5,3,1,3,4,5,3,3,3,3,3,3,3,0,2,2,0,3,3,2,4,3,3,3,5,3,4,1,3,3,5,3,2,0,0,0,0,4,3,1,3,3), +(0,1,0,3,0,3,0,1,0,1,3,3,3,2,3,3,3,0,3,0,0,0,3,1,3,0,0,0,2,2,2,3,0,0,3,2,0,1,2,4,1,3,3,0,0,3,3,3,0,1,0,0,2,1,0,0,3,0,3,1,0,3,0,0,1,3,0,2,0,1,0,3,3,1,3,3,0,0,1,1,0,3,3), +(0,2,0,3,0,2,1,4,0,2,2,3,1,1,3,1,1,0,2,0,3,1,2,3,1,3,0,0,1,0,4,3,2,3,3,3,1,4,2,3,3,3,3,1,0,3,1,4,0,1,1,0,1,2,0,1,1,0,1,1,0,3,1,3,2,2,0,1,0,0,0,2,3,3,3,1,0,0,0,0,0,2,3), +(0,5,0,4,0,5,0,2,0,4,5,5,3,3,4,3,3,1,5,4,4,2,4,4,4,3,4,2,4,3,5,5,4,3,3,4,3,3,5,5,4,5,5,1,3,4,5,3,1,4,3,1,3,3,0,3,3,1,4,3,1,4,5,3,3,5,0,4,0,3,0,5,3,3,1,4,3,0,4,0,1,5,3), +(0,5,0,5,0,4,0,2,0,4,4,3,4,3,3,3,3,3,5,4,4,4,4,4,4,5,3,3,5,2,4,4,4,3,4,4,3,3,4,4,5,5,3,3,4,3,4,3,3,4,3,3,3,3,1,2,2,1,4,3,3,5,4,4,3,4,0,4,0,3,0,4,4,4,4,4,1,0,4,2,0,2,4), +(0,4,0,4,0,3,0,1,0,3,5,2,3,0,3,0,2,1,4,2,3,3,4,1,4,3,3,2,4,1,3,3,3,0,3,3,0,0,3,3,3,5,3,3,3,3,3,2,0,2,0,0,2,0,0,2,0,0,1,0,0,3,1,2,2,3,0,3,0,2,0,4,4,3,3,4,1,0,3,0,0,2,4), +(0,0,0,4,0,0,0,0,0,0,1,0,1,0,2,0,0,0,0,0,1,0,2,0,1,0,0,0,0,0,3,1,3,0,3,2,0,0,0,1,0,3,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,4,0,2,0,0,0,0,0,0,2), +(0,2,1,3,0,2,0,2,0,3,3,3,3,1,3,1,3,3,3,3,3,3,4,2,2,1,2,1,4,0,4,3,1,3,3,3,2,4,3,5,4,3,3,3,3,3,3,3,0,1,3,0,2,0,0,1,0,0,1,0,0,4,2,0,2,3,0,3,3,0,3,3,4,2,3,1,4,0,1,2,0,2,3), +(0,3,0,3,0,1,0,3,0,2,3,3,3,0,3,1,2,0,3,3,2,3,3,2,3,2,3,1,3,0,4,3,2,0,3,3,1,4,3,3,2,3,4,3,1,3,3,1,1,0,1,1,0,1,0,1,0,1,0,0,0,4,1,1,0,3,0,3,1,0,2,3,3,3,3,3,1,0,0,2,0,3,3), +(0,0,0,0,0,0,0,0,0,0,3,0,2,0,3,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,3,0,3,0,3,1,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,2,0,2,3,0,0,0,0,0,0,0,0,3), +(0,2,0,3,1,3,0,3,0,2,3,3,3,1,3,1,3,1,3,1,3,3,3,1,3,0,2,3,1,1,4,3,3,2,3,3,1,2,2,4,1,3,3,0,1,4,2,3,0,1,3,0,3,0,0,1,3,0,2,0,0,3,3,2,1,3,0,3,0,2,0,3,4,4,4,3,1,0,3,0,0,3,3), +(0,2,0,1,0,2,0,0,0,1,3,2,2,1,3,0,1,1,3,0,3,2,3,1,2,0,2,0,1,1,3,3,3,0,3,3,1,1,2,3,2,3,3,1,2,3,2,0,0,1,0,0,0,0,0,0,3,0,1,0,0,2,1,2,1,3,0,3,0,0,0,3,4,4,4,3,2,0,2,0,0,2,4), +(0,0,0,1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,2,2,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,3,1,0,0,0,0,0,0,0,3), +(0,3,0,3,0,2,0,3,0,3,3,3,2,3,2,2,2,0,3,1,3,3,3,2,3,3,0,0,3,0,3,2,2,0,2,3,1,4,3,4,3,3,2,3,1,5,4,4,0,3,1,2,1,3,0,3,1,1,2,0,2,3,1,3,1,3,0,3,0,1,0,3,3,4,4,2,1,0,2,1,0,2,4), +(0,1,0,3,0,1,0,2,0,1,4,2,5,1,4,0,2,0,2,1,3,1,4,0,2,1,0,0,2,1,4,1,1,0,3,3,0,5,1,3,2,3,3,1,0,3,2,3,0,1,0,0,0,0,0,0,1,0,0,0,0,4,0,1,0,3,0,2,0,1,0,3,3,3,4,3,3,0,0,0,0,2,3), +(0,0,0,1,0,0,0,0,0,0,2,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,1,0,0,1,0,0,0,0,0,3), +(0,1,0,3,0,4,0,3,0,2,4,3,1,0,3,2,2,1,3,1,2,2,3,1,1,1,2,1,3,0,1,2,0,1,3,2,1,3,0,5,5,1,0,0,1,3,2,1,0,3,0,0,1,0,0,0,0,0,3,4,0,1,1,1,3,2,0,2,0,1,0,2,3,3,1,2,3,0,1,0,1,0,4), +(0,0,0,1,0,3,0,3,0,2,2,1,0,0,4,0,3,0,3,1,3,0,3,0,3,0,1,0,3,0,3,1,3,0,3,3,0,0,1,2,1,1,1,0,1,2,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,2,2,1,2,0,0,2,0,0,0,0,2,3,3,3,3,0,0,0,0,1,4), +(0,0,0,3,0,3,0,0,0,0,3,1,1,0,3,0,1,0,2,0,1,0,0,0,0,0,0,0,1,0,3,0,2,0,2,3,0,0,2,2,3,1,2,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,2,0,0,0,0,2,3), +(2,4,0,5,0,5,0,4,0,3,4,3,3,3,4,3,3,3,4,3,4,4,5,4,5,5,5,2,3,0,5,5,4,1,5,4,3,1,5,4,3,4,4,3,3,4,3,3,0,3,2,0,2,3,0,3,0,0,3,3,0,5,3,2,3,3,0,3,0,3,0,3,4,5,4,5,3,0,4,3,0,3,4), +(0,3,0,3,0,3,0,3,0,3,3,4,3,2,3,2,3,0,4,3,3,3,3,3,3,3,3,0,3,2,4,3,3,1,3,4,3,4,4,4,3,4,4,3,2,4,4,1,0,2,0,0,1,1,0,2,0,0,3,1,0,5,3,2,1,3,0,3,0,1,2,4,3,2,4,3,3,0,3,2,0,4,4), +(0,3,0,3,0,1,0,0,0,1,4,3,3,2,3,1,3,1,4,2,3,2,4,2,3,4,3,0,2,2,3,3,3,0,3,3,3,0,3,4,1,3,3,0,3,4,3,3,0,1,1,0,1,0,0,0,4,0,3,0,0,3,1,2,1,3,0,4,0,1,0,4,3,3,4,3,3,0,2,0,0,3,3), +(0,3,0,4,0,1,0,3,0,3,4,3,3,0,3,3,3,1,3,1,3,3,4,3,3,3,0,0,3,1,5,3,3,1,3,3,2,5,4,3,3,4,5,3,2,5,3,4,0,1,0,0,0,0,0,2,0,0,1,1,0,4,2,2,1,3,0,3,0,2,0,4,4,3,5,3,2,0,1,1,0,3,4), +(0,5,0,4,0,5,0,2,0,4,4,3,3,2,3,3,3,1,4,3,4,1,5,3,4,3,4,0,4,2,4,3,4,1,5,4,0,4,4,4,4,5,4,1,3,5,4,2,1,4,1,1,3,2,0,3,1,0,3,2,1,4,3,3,3,4,0,4,0,3,0,4,4,4,3,3,3,0,4,2,0,3,4), +(1,4,0,4,0,3,0,1,0,3,3,3,1,1,3,3,2,2,3,3,1,0,3,2,2,1,2,0,3,1,2,1,2,0,3,2,0,2,2,3,3,4,3,0,3,3,1,2,0,1,1,3,1,2,0,0,3,0,1,1,0,3,2,2,3,3,0,3,0,0,0,2,3,3,4,3,3,0,1,0,0,1,4), +(0,4,0,4,0,4,0,0,0,3,4,4,3,1,4,2,3,2,3,3,3,1,4,3,4,0,3,0,4,2,3,3,2,2,5,4,2,1,3,4,3,4,3,1,3,3,4,2,0,2,1,0,3,3,0,0,2,0,3,1,0,4,4,3,4,3,0,4,0,1,0,2,4,4,4,4,4,0,3,2,0,3,3), +(0,0,0,1,0,4,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,3,2,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,2), +(0,2,0,3,0,4,0,4,0,1,3,3,3,0,4,0,2,1,2,1,1,1,2,0,3,1,1,0,1,0,3,1,0,0,3,3,2,0,1,1,0,0,0,0,0,1,0,2,0,2,2,0,3,1,0,0,1,0,1,1,0,1,2,0,3,0,0,0,0,1,0,0,3,3,4,3,1,0,1,0,3,0,2), +(0,0,0,3,0,5,0,0,0,0,1,0,2,0,3,1,0,1,3,0,0,0,2,0,0,0,1,0,0,0,1,1,0,0,4,0,0,0,2,3,0,1,4,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,1,0,0,0,0,0,0,0,2,0,0,3,0,0,0,0,0,3), +(0,2,0,5,0,5,0,1,0,2,4,3,3,2,5,1,3,2,3,3,3,0,4,1,2,0,3,0,4,0,2,2,1,1,5,3,0,0,1,4,2,3,2,0,3,3,3,2,0,2,4,1,1,2,0,1,1,0,3,1,0,1,3,1,2,3,0,2,0,0,0,1,3,5,4,4,4,0,3,0,0,1,3), +(0,4,0,5,0,4,0,4,0,4,5,4,3,3,4,3,3,3,4,3,4,4,5,3,4,5,4,2,4,2,3,4,3,1,4,4,1,3,5,4,4,5,5,4,4,5,5,5,2,3,3,1,4,3,1,3,3,0,3,3,1,4,3,4,4,4,0,3,0,4,0,3,3,4,4,5,0,0,4,3,0,4,5), +(0,4,0,4,0,3,0,3,0,3,4,4,4,3,3,2,4,3,4,3,4,3,5,3,4,3,2,1,4,2,4,4,3,1,3,4,2,4,5,5,3,4,5,4,1,5,4,3,0,3,2,2,3,2,1,3,1,0,3,3,3,5,3,3,3,5,4,4,2,3,3,4,3,3,3,2,1,0,3,2,1,4,3), +(0,4,0,5,0,4,0,3,0,3,5,5,3,2,4,3,4,0,5,4,4,1,4,4,4,3,3,3,4,3,5,5,2,3,3,4,1,2,5,5,3,5,5,2,3,5,5,4,0,3,2,0,3,3,1,1,5,1,4,1,0,4,3,2,3,5,0,4,0,3,0,5,4,3,4,3,0,0,4,1,0,4,4), +(1,3,0,4,0,2,0,2,0,2,5,5,3,3,3,3,3,0,4,2,3,4,4,4,3,4,0,0,3,4,5,4,3,3,3,3,2,5,5,4,5,5,5,4,3,5,5,5,1,3,1,0,1,0,0,3,2,0,4,2,0,5,2,3,2,4,1,3,0,3,0,4,5,4,5,4,3,0,4,2,0,5,4), +(0,3,0,4,0,5,0,3,0,3,4,4,3,2,3,2,3,3,3,3,3,2,4,3,3,2,2,0,3,3,3,3,3,1,3,3,3,0,4,4,3,4,4,1,1,4,4,2,0,3,1,0,1,1,0,4,1,0,2,3,1,3,3,1,3,4,0,3,0,1,0,3,1,3,0,0,1,0,2,0,0,4,4), +(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), +(0,3,0,3,0,2,0,3,0,1,5,4,3,3,3,1,4,2,1,2,3,4,4,2,4,4,5,0,3,1,4,3,4,0,4,3,3,3,2,3,2,5,3,4,3,2,2,3,0,0,3,0,2,1,0,1,2,0,0,0,0,2,1,1,3,1,0,2,0,4,0,3,4,4,4,5,2,0,2,0,0,1,3), +(0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,1,0,0,1,1,0,0,0,4,2,1,1,0,1,0,3,2,0,0,3,1,1,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,1,0,0,0,2,0,0,0,1,4,0,4,2,1,0,0,0,0,0,1), +(0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,1,0,0,0,0,0,0,1,0,1,0,0,0,0,3,1,0,0,0,2,0,2,1,0,0,1,2,1,0,1,1,0,0,3,0,0,0,0,0,0,0,0,0,0,0,1,3,1,0,0,0,0,0,1,0,0,2,1,0,0,0,0,0,0,0,0,2), +(0,4,0,4,0,4,0,3,0,4,4,3,4,2,4,3,2,0,4,4,4,3,5,3,5,3,3,2,4,2,4,3,4,3,1,4,0,2,3,4,4,4,3,3,3,4,4,4,3,4,1,3,4,3,2,1,2,1,3,3,3,4,4,3,3,5,0,4,0,3,0,4,3,3,3,2,1,0,3,0,0,3,3), +(0,4,0,3,0,3,0,3,0,3,5,5,3,3,3,3,4,3,4,3,3,3,4,4,4,3,3,3,3,4,3,5,3,3,1,3,2,4,5,5,5,5,4,3,4,5,5,3,2,2,3,3,3,3,2,3,3,1,2,3,2,4,3,3,3,4,0,4,0,2,0,4,3,2,2,1,2,0,3,0,0,4,1), +) + +class JapaneseContextAnalysis(object): + NUM_OF_CATEGORY = 6 + DONT_KNOW = -1 + ENOUGH_REL_THRESHOLD = 100 + MAX_REL_THRESHOLD = 1000 + MINIMUM_DATA_THRESHOLD = 4 + + def __init__(self): + self._total_rel = None + self._rel_sample = None + self._need_to_skip_char_num = None + self._last_char_order = None + self._done = None + self.reset() + + def reset(self): + self._total_rel = 0 # total sequence received + # category counters, each integer counts sequence in its category + self._rel_sample = [0] * self.NUM_OF_CATEGORY + # if last byte in current buffer is not the last byte of a character, + # we need to know how many bytes to skip in next buffer + self._need_to_skip_char_num = 0 + self._last_char_order = -1 # The order of previous char + # If this flag is set to True, detection is done and conclusion has + # been made + self._done = False + + def feed(self, byte_str, num_bytes): + if self._done: + return + + # The buffer we got is byte oriented, and a character may span in more than one + # buffers. In case the last one or two byte in last buffer is not + # complete, we record how many byte needed to complete that character + # and skip these bytes here. We can choose to record those bytes as + # well and analyse the character once it is complete, but since a + # character will not make much difference, by simply skipping + # this character will simply our logic and improve performance. + i = self._need_to_skip_char_num + while i < num_bytes: + order, char_len = self.get_order(byte_str[i:i + 2]) + i += char_len + if i > num_bytes: + self._need_to_skip_char_num = i - num_bytes + self._last_char_order = -1 + else: + if (order != -1) and (self._last_char_order != -1): + self._total_rel += 1 + if self._total_rel > self.MAX_REL_THRESHOLD: + self._done = True + break + self._rel_sample[jp2CharContext[self._last_char_order][order]] += 1 + self._last_char_order = order + + def got_enough_data(self): + return self._total_rel > self.ENOUGH_REL_THRESHOLD + + def get_confidence(self): + # This is just one way to calculate confidence. It works well for me. + if self._total_rel > self.MINIMUM_DATA_THRESHOLD: + return (self._total_rel - self._rel_sample[0]) / self._total_rel + else: + return self.DONT_KNOW + + def get_order(self, byte_str): + return -1, 1 + +class SJISContextAnalysis(JapaneseContextAnalysis): + def __init__(self): + super(SJISContextAnalysis, self).__init__() + self._charset_name = "SHIFT_JIS" + + @property + def charset_name(self): + return self._charset_name + + def get_order(self, byte_str): + if not byte_str: + return -1, 1 + # find out current char's byte length + first_char = byte_str[0] + if (0x81 <= first_char <= 0x9F) or (0xE0 <= first_char <= 0xFC): + char_len = 2 + if (first_char == 0x87) or (0xFA <= first_char <= 0xFC): + self._charset_name = "CP932" + else: + char_len = 1 + + # return its order if it is hiragana + if len(byte_str) > 1: + second_char = byte_str[1] + if (first_char == 202) and (0x9F <= second_char <= 0xF1): + return second_char - 0x9F, char_len + + return -1, char_len + +class EUCJPContextAnalysis(JapaneseContextAnalysis): + def get_order(self, byte_str): + if not byte_str: + return -1, 1 + # find out current char's byte length + first_char = byte_str[0] + if (first_char == 0x8E) or (0xA1 <= first_char <= 0xFE): + char_len = 2 + elif first_char == 0x8F: + char_len = 3 + else: + char_len = 1 + + # return its order if it is hiragana + if len(byte_str) > 1: + second_char = byte_str[1] + if (first_char == 0xA4) and (0xA1 <= second_char <= 0xF3): + return second_char - 0xA1, char_len + + return -1, char_len + + diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/jpcntx.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/jpcntx.py new file mode 100644 index 0000000..20044e4 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/jpcntx.py @@ -0,0 +1,233 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + + +# This is hiragana 2-char sequence table, the number in each cell represents its frequency category +jp2CharContext = ( +(0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1), +(2,4,0,4,0,3,0,4,0,3,4,4,4,2,4,3,3,4,3,2,3,3,4,2,3,3,3,2,4,1,4,3,3,1,5,4,3,4,3,4,3,5,3,0,3,5,4,2,0,3,1,0,3,3,0,3,3,0,1,1,0,4,3,0,3,3,0,4,0,2,0,3,5,5,5,5,4,0,4,1,0,3,4), +(0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2), +(0,4,0,5,0,5,0,4,0,4,5,4,4,3,5,3,5,1,5,3,4,3,4,4,3,4,3,3,4,3,5,4,4,3,5,5,3,5,5,5,3,5,5,3,4,5,5,3,1,3,2,0,3,4,0,4,2,0,4,2,1,5,3,2,3,5,0,4,0,2,0,5,4,4,5,4,5,0,4,0,0,4,4), +(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), +(0,3,0,4,0,3,0,3,0,4,5,4,3,3,3,3,4,3,5,4,4,3,5,4,4,3,4,3,4,4,4,4,5,3,4,4,3,4,5,5,4,5,5,1,4,5,4,3,0,3,3,1,3,3,0,4,4,0,3,3,1,5,3,3,3,5,0,4,0,3,0,4,4,3,4,3,3,0,4,1,1,3,4), +(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), +(0,4,0,3,0,3,0,4,0,3,4,4,3,2,2,1,2,1,3,1,3,3,3,3,3,4,3,1,3,3,5,3,3,0,4,3,0,5,4,3,3,5,4,4,3,4,4,5,0,1,2,0,1,2,0,2,2,0,1,0,0,5,2,2,1,4,0,3,0,1,0,4,4,3,5,4,3,0,2,1,0,4,3), +(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), +(0,3,0,5,0,4,0,2,1,4,4,2,4,1,4,2,4,2,4,3,3,3,4,3,3,3,3,1,4,2,3,3,3,1,4,4,1,1,1,4,3,3,2,0,2,4,3,2,0,3,3,0,3,1,1,0,0,0,3,3,0,4,2,2,3,4,0,4,0,3,0,4,4,5,3,4,4,0,3,0,0,1,4), +(1,4,0,4,0,4,0,4,0,3,5,4,4,3,4,3,5,4,3,3,4,3,5,4,4,4,4,3,4,2,4,3,3,1,5,4,3,2,4,5,4,5,5,4,4,5,4,4,0,3,2,2,3,3,0,4,3,1,3,2,1,4,3,3,4,5,0,3,0,2,0,4,5,5,4,5,4,0,4,0,0,5,4), +(0,5,0,5,0,4,0,3,0,4,4,3,4,3,3,3,4,0,4,4,4,3,4,3,4,3,3,1,4,2,4,3,4,0,5,4,1,4,5,4,4,5,3,2,4,3,4,3,2,4,1,3,3,3,2,3,2,0,4,3,3,4,3,3,3,4,0,4,0,3,0,4,5,4,4,4,3,0,4,1,0,1,3), +(0,3,1,4,0,3,0,2,0,3,4,4,3,1,4,2,3,3,4,3,4,3,4,3,4,4,3,2,3,1,5,4,4,1,4,4,3,5,4,4,3,5,5,4,3,4,4,3,1,2,3,1,2,2,0,3,2,0,3,1,0,5,3,3,3,4,3,3,3,3,4,4,4,4,5,4,2,0,3,3,2,4,3), +(0,2,0,3,0,1,0,1,0,0,3,2,0,0,2,0,1,0,2,1,3,3,3,1,2,3,1,0,1,0,4,2,1,1,3,3,0,4,3,3,1,4,3,3,0,3,3,2,0,0,0,0,1,0,0,2,0,0,0,0,0,4,1,0,2,3,2,2,2,1,3,3,3,4,4,3,2,0,3,1,0,3,3), +(0,4,0,4,0,3,0,3,0,4,4,4,3,3,3,3,3,3,4,3,4,2,4,3,4,3,3,2,4,3,4,5,4,1,4,5,3,5,4,5,3,5,4,0,3,5,5,3,1,3,3,2,2,3,0,3,4,1,3,3,2,4,3,3,3,4,0,4,0,3,0,4,5,4,4,5,3,0,4,1,0,3,4), +(0,2,0,3,0,3,0,0,0,2,2,2,1,0,1,0,0,0,3,0,3,0,3,0,1,3,1,0,3,1,3,3,3,1,3,3,3,0,1,3,1,3,4,0,0,3,1,1,0,3,2,0,0,0,0,1,3,0,1,0,0,3,3,2,0,3,0,0,0,0,0,3,4,3,4,3,3,0,3,0,0,2,3), +(2,3,0,3,0,2,0,1,0,3,3,4,3,1,3,1,1,1,3,1,4,3,4,3,3,3,0,0,3,1,5,4,3,1,4,3,2,5,5,4,4,4,4,3,3,4,4,4,0,2,1,1,3,2,0,1,2,0,0,1,0,4,1,3,3,3,0,3,0,1,0,4,4,4,5,5,3,0,2,0,0,4,4), +(0,2,0,1,0,3,1,3,0,2,3,3,3,0,3,1,0,0,3,0,3,2,3,1,3,2,1,1,0,0,4,2,1,0,2,3,1,4,3,2,0,4,4,3,1,3,1,3,0,1,0,0,1,0,0,0,1,0,0,0,0,4,1,1,1,2,0,3,0,0,0,3,4,2,4,3,2,0,1,0,0,3,3), +(0,1,0,4,0,5,0,4,0,2,4,4,2,3,3,2,3,3,5,3,3,3,4,3,4,2,3,0,4,3,3,3,4,1,4,3,2,1,5,5,3,4,5,1,3,5,4,2,0,3,3,0,1,3,0,4,2,0,1,3,1,4,3,3,3,3,0,3,0,1,0,3,4,4,4,5,5,0,3,0,1,4,5), +(0,2,0,3,0,3,0,0,0,2,3,1,3,0,4,0,1,1,3,0,3,4,3,2,3,1,0,3,3,2,3,1,3,0,2,3,0,2,1,4,1,2,2,0,0,3,3,0,0,2,0,0,0,1,0,0,0,0,2,2,0,3,2,1,3,3,0,2,0,2,0,0,3,3,1,2,4,0,3,0,2,2,3), +(2,4,0,5,0,4,0,4,0,2,4,4,4,3,4,3,3,3,1,2,4,3,4,3,4,4,5,0,3,3,3,3,2,0,4,3,1,4,3,4,1,4,4,3,3,4,4,3,1,2,3,0,4,2,0,4,1,0,3,3,0,4,3,3,3,4,0,4,0,2,0,3,5,3,4,5,2,0,3,0,0,4,5), +(0,3,0,4,0,1,0,1,0,1,3,2,2,1,3,0,3,0,2,0,2,0,3,0,2,0,0,0,1,0,1,1,0,0,3,1,0,0,0,4,0,3,1,0,2,1,3,0,0,0,0,0,0,3,0,0,0,0,0,0,0,4,2,2,3,1,0,3,0,0,0,1,4,4,4,3,0,0,4,0,0,1,4), +(1,4,1,5,0,3,0,3,0,4,5,4,4,3,5,3,3,4,4,3,4,1,3,3,3,3,2,1,4,1,5,4,3,1,4,4,3,5,4,4,3,5,4,3,3,4,4,4,0,3,3,1,2,3,0,3,1,0,3,3,0,5,4,4,4,4,4,4,3,3,5,4,4,3,3,5,4,0,3,2,0,4,4), +(0,2,0,3,0,1,0,0,0,1,3,3,3,2,4,1,3,0,3,1,3,0,2,2,1,1,0,0,2,0,4,3,1,0,4,3,0,4,4,4,1,4,3,1,1,3,3,1,0,2,0,0,1,3,0,0,0,0,2,0,0,4,3,2,4,3,5,4,3,3,3,4,3,3,4,3,3,0,2,1,0,3,3), +(0,2,0,4,0,3,0,2,0,2,5,5,3,4,4,4,4,1,4,3,3,0,4,3,4,3,1,3,3,2,4,3,0,3,4,3,0,3,4,4,2,4,4,0,4,5,3,3,2,2,1,1,1,2,0,1,5,0,3,3,2,4,3,3,3,4,0,3,0,2,0,4,4,3,5,5,0,0,3,0,2,3,3), +(0,3,0,4,0,3,0,1,0,3,4,3,3,1,3,3,3,0,3,1,3,0,4,3,3,1,1,0,3,0,3,3,0,0,4,4,0,1,5,4,3,3,5,0,3,3,4,3,0,2,0,1,1,1,0,1,3,0,1,2,1,3,3,2,3,3,0,3,0,1,0,1,3,3,4,4,1,0,1,2,2,1,3), +(0,1,0,4,0,4,0,3,0,1,3,3,3,2,3,1,1,0,3,0,3,3,4,3,2,4,2,0,1,0,4,3,2,0,4,3,0,5,3,3,2,4,4,4,3,3,3,4,0,1,3,0,0,1,0,0,1,0,0,0,0,4,2,3,3,3,0,3,0,0,0,4,4,4,5,3,2,0,3,3,0,3,5), +(0,2,0,3,0,0,0,3,0,1,3,0,2,0,0,0,1,0,3,1,1,3,3,0,0,3,0,0,3,0,2,3,1,0,3,1,0,3,3,2,0,4,2,2,0,2,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,2,1,2,0,1,0,1,0,0,0,1,3,1,2,0,0,0,1,0,0,1,4), +(0,3,0,3,0,5,0,1,0,2,4,3,1,3,3,2,1,1,5,2,1,0,5,1,2,0,0,0,3,3,2,2,3,2,4,3,0,0,3,3,1,3,3,0,2,5,3,4,0,3,3,0,1,2,0,2,2,0,3,2,0,2,2,3,3,3,0,2,0,1,0,3,4,4,2,5,4,0,3,0,0,3,5), +(0,3,0,3,0,3,0,1,0,3,3,3,3,0,3,0,2,0,2,1,1,0,2,0,1,0,0,0,2,1,0,0,1,0,3,2,0,0,3,3,1,2,3,1,0,3,3,0,0,1,0,0,0,0,0,2,0,0,0,0,0,2,3,1,2,3,0,3,0,1,0,3,2,1,0,4,3,0,1,1,0,3,3), +(0,4,0,5,0,3,0,3,0,4,5,5,4,3,5,3,4,3,5,3,3,2,5,3,4,4,4,3,4,3,4,5,5,3,4,4,3,4,4,5,4,4,4,3,4,5,5,4,2,3,4,2,3,4,0,3,3,1,4,3,2,4,3,3,5,5,0,3,0,3,0,5,5,5,5,4,4,0,4,0,1,4,4), +(0,4,0,4,0,3,0,3,0,3,5,4,4,2,3,2,5,1,3,2,5,1,4,2,3,2,3,3,4,3,3,3,3,2,5,4,1,3,3,5,3,4,4,0,4,4,3,1,1,3,1,0,2,3,0,2,3,0,3,0,0,4,3,1,3,4,0,3,0,2,0,4,4,4,3,4,5,0,4,0,0,3,4), +(0,3,0,3,0,3,1,2,0,3,4,4,3,3,3,0,2,2,4,3,3,1,3,3,3,1,1,0,3,1,4,3,2,3,4,4,2,4,4,4,3,4,4,3,2,4,4,3,1,3,3,1,3,3,0,4,1,0,2,2,1,4,3,2,3,3,5,4,3,3,5,4,4,3,3,0,4,0,3,2,2,4,4), +(0,2,0,1,0,0,0,0,0,1,2,1,3,0,0,0,0,0,2,0,1,2,1,0,0,1,0,0,0,0,3,0,0,1,0,1,1,3,1,0,0,0,1,1,0,1,1,0,0,0,0,0,2,0,0,0,0,0,0,0,0,1,1,2,2,0,3,4,0,0,0,1,1,0,0,1,0,0,0,0,0,1,1), +(0,1,0,0,0,1,0,0,0,0,4,0,4,1,4,0,3,0,4,0,3,0,4,0,3,0,3,0,4,1,5,1,4,0,0,3,0,5,0,5,2,0,1,0,0,0,2,1,4,0,1,3,0,0,3,0,0,3,1,1,4,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0), +(1,4,0,5,0,3,0,2,0,3,5,4,4,3,4,3,5,3,4,3,3,0,4,3,3,3,3,3,3,2,4,4,3,1,3,4,4,5,4,4,3,4,4,1,3,5,4,3,3,3,1,2,2,3,3,1,3,1,3,3,3,5,3,3,4,5,0,3,0,3,0,3,4,3,4,4,3,0,3,0,2,4,3), +(0,1,0,4,0,0,0,0,0,1,4,0,4,1,4,2,4,0,3,0,1,0,1,0,0,0,0,0,2,0,3,1,1,1,0,3,0,0,0,1,2,1,0,0,1,1,1,1,0,1,0,0,0,1,0,0,3,0,0,0,0,3,2,0,2,2,0,1,0,0,0,2,3,2,3,3,0,0,0,0,2,1,0), +(0,5,1,5,0,3,0,3,0,5,4,4,5,1,5,3,3,0,4,3,4,3,5,3,4,3,3,2,4,3,4,3,3,0,3,3,1,4,4,3,4,4,4,3,4,5,5,3,2,3,1,1,3,3,1,3,1,1,3,3,2,4,5,3,3,5,0,4,0,3,0,4,4,3,5,3,3,0,3,4,0,4,3), +(0,5,0,5,0,3,0,2,0,4,4,3,5,2,4,3,3,3,4,4,4,3,5,3,5,3,3,1,4,0,4,3,3,0,3,3,0,4,4,4,4,5,4,3,3,5,5,3,2,3,1,2,3,2,0,1,0,0,3,2,2,4,4,3,1,5,0,4,0,3,0,4,3,1,3,2,1,0,3,3,0,3,3), +(0,4,0,5,0,5,0,4,0,4,5,5,5,3,4,3,3,2,5,4,4,3,5,3,5,3,4,0,4,3,4,4,3,2,4,4,3,4,5,4,4,5,5,0,3,5,5,4,1,3,3,2,3,3,1,3,1,0,4,3,1,4,4,3,4,5,0,4,0,2,0,4,3,4,4,3,3,0,4,0,0,5,5), +(0,4,0,4,0,5,0,1,1,3,3,4,4,3,4,1,3,0,5,1,3,0,3,1,3,1,1,0,3,0,3,3,4,0,4,3,0,4,4,4,3,4,4,0,3,5,4,1,0,3,0,0,2,3,0,3,1,0,3,1,0,3,2,1,3,5,0,3,0,1,0,3,2,3,3,4,4,0,2,2,0,4,4), +(2,4,0,5,0,4,0,3,0,4,5,5,4,3,5,3,5,3,5,3,5,2,5,3,4,3,3,4,3,4,5,3,2,1,5,4,3,2,3,4,5,3,4,1,2,5,4,3,0,3,3,0,3,2,0,2,3,0,4,1,0,3,4,3,3,5,0,3,0,1,0,4,5,5,5,4,3,0,4,2,0,3,5), +(0,5,0,4,0,4,0,2,0,5,4,3,4,3,4,3,3,3,4,3,4,2,5,3,5,3,4,1,4,3,4,4,4,0,3,5,0,4,4,4,4,5,3,1,3,4,5,3,3,3,3,3,3,3,0,2,2,0,3,3,2,4,3,3,3,5,3,4,1,3,3,5,3,2,0,0,0,0,4,3,1,3,3), +(0,1,0,3,0,3,0,1,0,1,3,3,3,2,3,3,3,0,3,0,0,0,3,1,3,0,0,0,2,2,2,3,0,0,3,2,0,1,2,4,1,3,3,0,0,3,3,3,0,1,0,0,2,1,0,0,3,0,3,1,0,3,0,0,1,3,0,2,0,1,0,3,3,1,3,3,0,0,1,1,0,3,3), +(0,2,0,3,0,2,1,4,0,2,2,3,1,1,3,1,1,0,2,0,3,1,2,3,1,3,0,0,1,0,4,3,2,3,3,3,1,4,2,3,3,3,3,1,0,3,1,4,0,1,1,0,1,2,0,1,1,0,1,1,0,3,1,3,2,2,0,1,0,0,0,2,3,3,3,1,0,0,0,0,0,2,3), +(0,5,0,4,0,5,0,2,0,4,5,5,3,3,4,3,3,1,5,4,4,2,4,4,4,3,4,2,4,3,5,5,4,3,3,4,3,3,5,5,4,5,5,1,3,4,5,3,1,4,3,1,3,3,0,3,3,1,4,3,1,4,5,3,3,5,0,4,0,3,0,5,3,3,1,4,3,0,4,0,1,5,3), +(0,5,0,5,0,4,0,2,0,4,4,3,4,3,3,3,3,3,5,4,4,4,4,4,4,5,3,3,5,2,4,4,4,3,4,4,3,3,4,4,5,5,3,3,4,3,4,3,3,4,3,3,3,3,1,2,2,1,4,3,3,5,4,4,3,4,0,4,0,3,0,4,4,4,4,4,1,0,4,2,0,2,4), +(0,4,0,4,0,3,0,1,0,3,5,2,3,0,3,0,2,1,4,2,3,3,4,1,4,3,3,2,4,1,3,3,3,0,3,3,0,0,3,3,3,5,3,3,3,3,3,2,0,2,0,0,2,0,0,2,0,0,1,0,0,3,1,2,2,3,0,3,0,2,0,4,4,3,3,4,1,0,3,0,0,2,4), +(0,0,0,4,0,0,0,0,0,0,1,0,1,0,2,0,0,0,0,0,1,0,2,0,1,0,0,0,0,0,3,1,3,0,3,2,0,0,0,1,0,3,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,4,0,2,0,0,0,0,0,0,2), +(0,2,1,3,0,2,0,2,0,3,3,3,3,1,3,1,3,3,3,3,3,3,4,2,2,1,2,1,4,0,4,3,1,3,3,3,2,4,3,5,4,3,3,3,3,3,3,3,0,1,3,0,2,0,0,1,0,0,1,0,0,4,2,0,2,3,0,3,3,0,3,3,4,2,3,1,4,0,1,2,0,2,3), +(0,3,0,3,0,1,0,3,0,2,3,3,3,0,3,1,2,0,3,3,2,3,3,2,3,2,3,1,3,0,4,3,2,0,3,3,1,4,3,3,2,3,4,3,1,3,3,1,1,0,1,1,0,1,0,1,0,1,0,0,0,4,1,1,0,3,0,3,1,0,2,3,3,3,3,3,1,0,0,2,0,3,3), +(0,0,0,0,0,0,0,0,0,0,3,0,2,0,3,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,3,0,3,0,3,1,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,2,0,2,3,0,0,0,0,0,0,0,0,3), +(0,2,0,3,1,3,0,3,0,2,3,3,3,1,3,1,3,1,3,1,3,3,3,1,3,0,2,3,1,1,4,3,3,2,3,3,1,2,2,4,1,3,3,0,1,4,2,3,0,1,3,0,3,0,0,1,3,0,2,0,0,3,3,2,1,3,0,3,0,2,0,3,4,4,4,3,1,0,3,0,0,3,3), +(0,2,0,1,0,2,0,0,0,1,3,2,2,1,3,0,1,1,3,0,3,2,3,1,2,0,2,0,1,1,3,3,3,0,3,3,1,1,2,3,2,3,3,1,2,3,2,0,0,1,0,0,0,0,0,0,3,0,1,0,0,2,1,2,1,3,0,3,0,0,0,3,4,4,4,3,2,0,2,0,0,2,4), +(0,0,0,1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,2,2,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,3,1,0,0,0,0,0,0,0,3), +(0,3,0,3,0,2,0,3,0,3,3,3,2,3,2,2,2,0,3,1,3,3,3,2,3,3,0,0,3,0,3,2,2,0,2,3,1,4,3,4,3,3,2,3,1,5,4,4,0,3,1,2,1,3,0,3,1,1,2,0,2,3,1,3,1,3,0,3,0,1,0,3,3,4,4,2,1,0,2,1,0,2,4), +(0,1,0,3,0,1,0,2,0,1,4,2,5,1,4,0,2,0,2,1,3,1,4,0,2,1,0,0,2,1,4,1,1,0,3,3,0,5,1,3,2,3,3,1,0,3,2,3,0,1,0,0,0,0,0,0,1,0,0,0,0,4,0,1,0,3,0,2,0,1,0,3,3,3,4,3,3,0,0,0,0,2,3), +(0,0,0,1,0,0,0,0,0,0,2,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,1,0,0,1,0,0,0,0,0,3), +(0,1,0,3,0,4,0,3,0,2,4,3,1,0,3,2,2,1,3,1,2,2,3,1,1,1,2,1,3,0,1,2,0,1,3,2,1,3,0,5,5,1,0,0,1,3,2,1,0,3,0,0,1,0,0,0,0,0,3,4,0,1,1,1,3,2,0,2,0,1,0,2,3,3,1,2,3,0,1,0,1,0,4), +(0,0,0,1,0,3,0,3,0,2,2,1,0,0,4,0,3,0,3,1,3,0,3,0,3,0,1,0,3,0,3,1,3,0,3,3,0,0,1,2,1,1,1,0,1,2,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,2,2,1,2,0,0,2,0,0,0,0,2,3,3,3,3,0,0,0,0,1,4), +(0,0,0,3,0,3,0,0,0,0,3,1,1,0,3,0,1,0,2,0,1,0,0,0,0,0,0,0,1,0,3,0,2,0,2,3,0,0,2,2,3,1,2,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,2,0,0,0,0,2,3), +(2,4,0,5,0,5,0,4,0,3,4,3,3,3,4,3,3,3,4,3,4,4,5,4,5,5,5,2,3,0,5,5,4,1,5,4,3,1,5,4,3,4,4,3,3,4,3,3,0,3,2,0,2,3,0,3,0,0,3,3,0,5,3,2,3,3,0,3,0,3,0,3,4,5,4,5,3,0,4,3,0,3,4), +(0,3,0,3,0,3,0,3,0,3,3,4,3,2,3,2,3,0,4,3,3,3,3,3,3,3,3,0,3,2,4,3,3,1,3,4,3,4,4,4,3,4,4,3,2,4,4,1,0,2,0,0,1,1,0,2,0,0,3,1,0,5,3,2,1,3,0,3,0,1,2,4,3,2,4,3,3,0,3,2,0,4,4), +(0,3,0,3,0,1,0,0,0,1,4,3,3,2,3,1,3,1,4,2,3,2,4,2,3,4,3,0,2,2,3,3,3,0,3,3,3,0,3,4,1,3,3,0,3,4,3,3,0,1,1,0,1,0,0,0,4,0,3,0,0,3,1,2,1,3,0,4,0,1,0,4,3,3,4,3,3,0,2,0,0,3,3), +(0,3,0,4,0,1,0,3,0,3,4,3,3,0,3,3,3,1,3,1,3,3,4,3,3,3,0,0,3,1,5,3,3,1,3,3,2,5,4,3,3,4,5,3,2,5,3,4,0,1,0,0,0,0,0,2,0,0,1,1,0,4,2,2,1,3,0,3,0,2,0,4,4,3,5,3,2,0,1,1,0,3,4), +(0,5,0,4,0,5,0,2,0,4,4,3,3,2,3,3,3,1,4,3,4,1,5,3,4,3,4,0,4,2,4,3,4,1,5,4,0,4,4,4,4,5,4,1,3,5,4,2,1,4,1,1,3,2,0,3,1,0,3,2,1,4,3,3,3,4,0,4,0,3,0,4,4,4,3,3,3,0,4,2,0,3,4), +(1,4,0,4,0,3,0,1,0,3,3,3,1,1,3,3,2,2,3,3,1,0,3,2,2,1,2,0,3,1,2,1,2,0,3,2,0,2,2,3,3,4,3,0,3,3,1,2,0,1,1,3,1,2,0,0,3,0,1,1,0,3,2,2,3,3,0,3,0,0,0,2,3,3,4,3,3,0,1,0,0,1,4), +(0,4,0,4,0,4,0,0,0,3,4,4,3,1,4,2,3,2,3,3,3,1,4,3,4,0,3,0,4,2,3,3,2,2,5,4,2,1,3,4,3,4,3,1,3,3,4,2,0,2,1,0,3,3,0,0,2,0,3,1,0,4,4,3,4,3,0,4,0,1,0,2,4,4,4,4,4,0,3,2,0,3,3), +(0,0,0,1,0,4,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,3,2,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,2), +(0,2,0,3,0,4,0,4,0,1,3,3,3,0,4,0,2,1,2,1,1,1,2,0,3,1,1,0,1,0,3,1,0,0,3,3,2,0,1,1,0,0,0,0,0,1,0,2,0,2,2,0,3,1,0,0,1,0,1,1,0,1,2,0,3,0,0,0,0,1,0,0,3,3,4,3,1,0,1,0,3,0,2), +(0,0,0,3,0,5,0,0,0,0,1,0,2,0,3,1,0,1,3,0,0,0,2,0,0,0,1,0,0,0,1,1,0,0,4,0,0,0,2,3,0,1,4,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,1,0,0,0,0,0,0,0,2,0,0,3,0,0,0,0,0,3), +(0,2,0,5,0,5,0,1,0,2,4,3,3,2,5,1,3,2,3,3,3,0,4,1,2,0,3,0,4,0,2,2,1,1,5,3,0,0,1,4,2,3,2,0,3,3,3,2,0,2,4,1,1,2,0,1,1,0,3,1,0,1,3,1,2,3,0,2,0,0,0,1,3,5,4,4,4,0,3,0,0,1,3), +(0,4,0,5,0,4,0,4,0,4,5,4,3,3,4,3,3,3,4,3,4,4,5,3,4,5,4,2,4,2,3,4,3,1,4,4,1,3,5,4,4,5,5,4,4,5,5,5,2,3,3,1,4,3,1,3,3,0,3,3,1,4,3,4,4,4,0,3,0,4,0,3,3,4,4,5,0,0,4,3,0,4,5), +(0,4,0,4,0,3,0,3,0,3,4,4,4,3,3,2,4,3,4,3,4,3,5,3,4,3,2,1,4,2,4,4,3,1,3,4,2,4,5,5,3,4,5,4,1,5,4,3,0,3,2,2,3,2,1,3,1,0,3,3,3,5,3,3,3,5,4,4,2,3,3,4,3,3,3,2,1,0,3,2,1,4,3), +(0,4,0,5,0,4,0,3,0,3,5,5,3,2,4,3,4,0,5,4,4,1,4,4,4,3,3,3,4,3,5,5,2,3,3,4,1,2,5,5,3,5,5,2,3,5,5,4,0,3,2,0,3,3,1,1,5,1,4,1,0,4,3,2,3,5,0,4,0,3,0,5,4,3,4,3,0,0,4,1,0,4,4), +(1,3,0,4,0,2,0,2,0,2,5,5,3,3,3,3,3,0,4,2,3,4,4,4,3,4,0,0,3,4,5,4,3,3,3,3,2,5,5,4,5,5,5,4,3,5,5,5,1,3,1,0,1,0,0,3,2,0,4,2,0,5,2,3,2,4,1,3,0,3,0,4,5,4,5,4,3,0,4,2,0,5,4), +(0,3,0,4,0,5,0,3,0,3,4,4,3,2,3,2,3,3,3,3,3,2,4,3,3,2,2,0,3,3,3,3,3,1,3,3,3,0,4,4,3,4,4,1,1,4,4,2,0,3,1,0,1,1,0,4,1,0,2,3,1,3,3,1,3,4,0,3,0,1,0,3,1,3,0,0,1,0,2,0,0,4,4), +(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), +(0,3,0,3,0,2,0,3,0,1,5,4,3,3,3,1,4,2,1,2,3,4,4,2,4,4,5,0,3,1,4,3,4,0,4,3,3,3,2,3,2,5,3,4,3,2,2,3,0,0,3,0,2,1,0,1,2,0,0,0,0,2,1,1,3,1,0,2,0,4,0,3,4,4,4,5,2,0,2,0,0,1,3), +(0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,1,0,0,1,1,0,0,0,4,2,1,1,0,1,0,3,2,0,0,3,1,1,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,1,0,0,0,2,0,0,0,1,4,0,4,2,1,0,0,0,0,0,1), +(0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,1,0,0,0,0,0,0,1,0,1,0,0,0,0,3,1,0,0,0,2,0,2,1,0,0,1,2,1,0,1,1,0,0,3,0,0,0,0,0,0,0,0,0,0,0,1,3,1,0,0,0,0,0,1,0,0,2,1,0,0,0,0,0,0,0,0,2), +(0,4,0,4,0,4,0,3,0,4,4,3,4,2,4,3,2,0,4,4,4,3,5,3,5,3,3,2,4,2,4,3,4,3,1,4,0,2,3,4,4,4,3,3,3,4,4,4,3,4,1,3,4,3,2,1,2,1,3,3,3,4,4,3,3,5,0,4,0,3,0,4,3,3,3,2,1,0,3,0,0,3,3), +(0,4,0,3,0,3,0,3,0,3,5,5,3,3,3,3,4,3,4,3,3,3,4,4,4,3,3,3,3,4,3,5,3,3,1,3,2,4,5,5,5,5,4,3,4,5,5,3,2,2,3,3,3,3,2,3,3,1,2,3,2,4,3,3,3,4,0,4,0,2,0,4,3,2,2,1,2,0,3,0,0,4,1), +) + +class JapaneseContextAnalysis(object): + NUM_OF_CATEGORY = 6 + DONT_KNOW = -1 + ENOUGH_REL_THRESHOLD = 100 + MAX_REL_THRESHOLD = 1000 + MINIMUM_DATA_THRESHOLD = 4 + + def __init__(self): + self._total_rel = None + self._rel_sample = None + self._need_to_skip_char_num = None + self._last_char_order = None + self._done = None + self.reset() + + def reset(self): + self._total_rel = 0 # total sequence received + # category counters, each integer counts sequence in its category + self._rel_sample = [0] * self.NUM_OF_CATEGORY + # if last byte in current buffer is not the last byte of a character, + # we need to know how many bytes to skip in next buffer + self._need_to_skip_char_num = 0 + self._last_char_order = -1 # The order of previous char + # If this flag is set to True, detection is done and conclusion has + # been made + self._done = False + + def feed(self, byte_str, num_bytes): + if self._done: + return + + # The buffer we got is byte oriented, and a character may span in more than one + # buffers. In case the last one or two byte in last buffer is not + # complete, we record how many byte needed to complete that character + # and skip these bytes here. We can choose to record those bytes as + # well and analyse the character once it is complete, but since a + # character will not make much difference, by simply skipping + # this character will simply our logic and improve performance. + i = self._need_to_skip_char_num + while i < num_bytes: + order, char_len = self.get_order(byte_str[i:i + 2]) + i += char_len + if i > num_bytes: + self._need_to_skip_char_num = i - num_bytes + self._last_char_order = -1 + else: + if (order != -1) and (self._last_char_order != -1): + self._total_rel += 1 + if self._total_rel > self.MAX_REL_THRESHOLD: + self._done = True + break + self._rel_sample[jp2CharContext[self._last_char_order][order]] += 1 + self._last_char_order = order + + def got_enough_data(self): + return self._total_rel > self.ENOUGH_REL_THRESHOLD + + def get_confidence(self): + # This is just one way to calculate confidence. It works well for me. + if self._total_rel > self.MINIMUM_DATA_THRESHOLD: + return (self._total_rel - self._rel_sample[0]) / self._total_rel + else: + return self.DONT_KNOW + + def get_order(self, byte_str): + return -1, 1 + +class SJISContextAnalysis(JapaneseContextAnalysis): + def __init__(self): + super(SJISContextAnalysis, self).__init__() + self._charset_name = "SHIFT_JIS" + + @property + def charset_name(self): + return self._charset_name + + def get_order(self, byte_str): + if not byte_str: + return -1, 1 + # find out current char's byte length + first_char = byte_str[0] + if (0x81 <= first_char <= 0x9F) or (0xE0 <= first_char <= 0xFC): + char_len = 2 + if (first_char == 0x87) or (0xFA <= first_char <= 0xFC): + self._charset_name = "CP932" + else: + char_len = 1 + + # return its order if it is hiragana + if len(byte_str) > 1: + second_char = byte_str[1] + if (first_char == 202) and (0x9F <= second_char <= 0xF1): + return second_char - 0x9F, char_len + + return -1, char_len + +class EUCJPContextAnalysis(JapaneseContextAnalysis): + def get_order(self, byte_str): + if not byte_str: + return -1, 1 + # find out current char's byte length + first_char = byte_str[0] + if (first_char == 0x8E) or (0xA1 <= first_char <= 0xFE): + char_len = 2 + elif first_char == 0x8F: + char_len = 3 + else: + char_len = 1 + + # return its order if it is hiragana + if len(byte_str) > 1: + second_char = byte_str[1] + if (first_char == 0xA4) and (0xA1 <= second_char <= 0xF3): + return second_char - 0xA1, char_len + + return -1, char_len + + diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/jpcntx.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/jpcntx.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2af6a20d2950e18ec8d226c5012e58ae273645fc GIT binary patch literal 25988 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 F{tcI)7aRZp literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/langcyrillicmodel 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/langcyrillicmodel 2.py new file mode 100644 index 0000000..e5f9a1f --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/langcyrillicmodel 2.py @@ -0,0 +1,333 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# KOI8-R language model +# Character Mapping Table: +KOI8R_char_to_order_map = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 +191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, # 80 +207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, # 90 +223,224,225, 68,226,227,228,229,230,231,232,233,234,235,236,237, # a0 +238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253, # b0 + 27, 3, 21, 28, 13, 2, 39, 19, 26, 4, 23, 11, 8, 12, 5, 1, # c0 + 15, 16, 9, 7, 6, 14, 24, 10, 17, 18, 20, 25, 30, 29, 22, 54, # d0 + 59, 37, 44, 58, 41, 48, 53, 46, 55, 42, 60, 36, 49, 38, 31, 34, # e0 + 35, 43, 45, 32, 40, 52, 56, 33, 61, 62, 51, 57, 47, 63, 50, 70, # f0 +) + +win1251_char_to_order_map = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 +191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, +207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, +223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, +239,240,241,242,243,244,245,246, 68,247,248,249,250,251,252,253, + 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, + 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, + 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, + 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16, +) + +latin5_char_to_order_map = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 +191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, +207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, +223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, + 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, + 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, + 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, + 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16, +239, 68,240,241,242,243,244,245,246,247,248,249,250,251,252,255, +) + +macCyrillic_char_to_order_map = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 + 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, + 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, +191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, +207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, +223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, +239,240,241,242,243,244,245,246,247,248,249,250,251,252, 68, 16, + 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, + 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27,255, +) + +IBM855_char_to_order_map = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 +191,192,193,194, 68,195,196,197,198,199,200,201,202,203,204,205, +206,207,208,209,210,211,212,213,214,215,216,217, 27, 59, 54, 70, + 3, 37, 21, 44, 28, 58, 13, 41, 2, 48, 39, 53, 19, 46,218,219, +220,221,222,223,224, 26, 55, 4, 42,225,226,227,228, 23, 60,229, +230,231,232,233,234,235, 11, 36,236,237,238,239,240,241,242,243, + 8, 49, 12, 38, 5, 31, 1, 34, 15,244,245,246,247, 35, 16,248, + 43, 9, 45, 7, 32, 6, 40, 14, 52, 24, 56, 10, 33, 17, 61,249, +250, 18, 62, 20, 51, 25, 57, 30, 47, 29, 63, 22, 50,251,252,255, +) + +IBM866_char_to_order_map = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 + 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, + 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, + 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, +191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, +207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, +223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, + 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16, +239, 68,240,241,242,243,244,245,246,247,248,249,250,251,252,255, +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 97.6601% +# first 1024 sequences: 2.3389% +# rest sequences: 0.1237% +# negative sequences: 0.0009% +RussianLangModel = ( +0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,1,3,3,3,3,1,3,3,3,2,3,2,3,3, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,2,2,2,2,2,0,0,2, +3,3,3,2,3,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,3,2,3,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,2,2,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,2,3,3,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,0,0,3,3,3,3,3,3,3,3,3,3,3,2,1, +0,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,3,3,3,2,1, +0,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,2,2,2,3,1,3,3,1,3,3,3,3,2,2,3,0,2,2,2,3,3,2,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,3,3,3,3,3,2,2,3,2,3,3,3,2,1,2,2,0,1,2,2,2,2,2,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,3,0,2,2,3,3,2,1,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,3,3,1,2,3,2,2,3,2,3,3,3,3,2,2,3,0,3,2,2,3,1,1,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,2,3,3,3,3,2,2,2,0,3,3,3,2,2,2,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,2,3,2,3,3,3,3,3,3,2,3,2,2,0,1,3,2,1,2,2,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,2,1,1,3,0,1,1,1,1,2,1,1,0,2,2,2,1,2,0,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,3,3,2,2,2,2,1,3,2,3,2,3,2,1,2,2,0,1,1,2,1,2,1,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,2,2,3,2,3,3,3,2,2,2,2,0,2,2,2,2,3,1,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +3,2,3,2,2,3,3,3,3,3,3,3,3,3,1,3,2,0,0,3,3,3,3,2,3,3,3,3,2,3,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,3,3,2,2,3,3,0,2,1,0,3,2,3,2,3,0,0,1,2,0,0,1,0,1,2,1,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,3,0,2,3,3,3,3,2,3,3,3,3,1,2,2,0,0,2,3,2,2,2,3,2,3,2,2,3,0,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,3,0,2,3,2,3,0,1,2,3,3,2,0,2,3,0,0,2,3,2,2,0,1,3,1,3,2,2,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,3,0,2,3,3,3,3,3,3,3,3,2,1,3,2,0,0,2,2,3,3,3,2,3,3,0,2,2,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,2,3,3,2,2,2,3,3,0,0,1,1,1,1,1,2,0,0,1,1,1,1,0,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,2,3,3,3,3,3,3,3,0,3,2,3,3,2,3,2,0,2,1,0,1,1,0,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,3,3,3,2,2,2,2,3,1,3,2,3,1,1,2,1,0,2,2,2,2,1,3,1,0, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +2,2,3,3,3,3,3,1,2,2,1,3,1,0,3,0,0,3,0,0,0,1,1,0,1,2,1,0,0,0,0,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,2,1,1,3,3,3,2,2,1,2,2,3,1,1,2,0,0,2,2,1,3,0,0,2,1,1,2,1,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,3,3,3,3,1,2,2,2,1,2,1,3,3,1,1,2,1,2,1,2,2,0,2,0,0,1,1,0,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,3,3,2,1,3,2,2,3,2,0,3,2,0,3,0,1,0,1,1,0,0,1,1,1,1,0,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,2,3,3,3,2,2,2,3,3,1,2,1,2,1,0,1,0,1,1,0,1,0,0,2,1,1,1,0,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +3,1,1,2,1,2,3,3,2,2,1,2,2,3,0,2,1,0,0,2,2,3,2,1,2,2,2,2,2,3,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,1,1,0,1,1,2,2,1,1,3,0,0,1,3,1,1,1,0,0,0,1,0,1,1,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,1,3,3,3,2,0,0,0,2,1,0,1,0,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,1,0,0,2,3,2,2,2,1,2,2,2,1,2,1,0,0,1,1,1,0,2,0,1,1,1,0,0,1,1, +1,0,0,0,0,0,1,2,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,3,0,0,0,0,1,0,0,0,0,3,0,1,2,1,0,0,0,0,0,0,0,1,1,0,0,1,1, +1,0,1,0,1,2,0,0,1,1,2,1,0,1,1,1,1,0,1,1,1,1,0,1,0,0,1,0,0,1,1,0, +2,2,3,2,2,2,3,1,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,0,1,0,1,1,1,0,2,1, +1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,1,0,1,1,0, +3,3,3,2,2,2,2,3,2,2,1,1,2,2,2,2,1,1,3,1,2,1,2,0,0,1,1,0,1,0,2,1, +1,1,1,1,1,2,1,0,1,1,1,1,0,1,0,0,1,1,0,0,1,0,1,0,0,1,0,0,0,1,1,0, +2,0,0,1,0,3,2,2,2,2,1,2,1,2,1,2,0,0,0,2,1,2,2,1,1,2,2,0,1,1,0,2, +1,1,1,1,1,0,1,1,1,2,1,1,1,2,1,0,1,2,1,1,1,1,0,1,1,1,0,0,1,0,0,1, +1,3,2,2,2,1,1,1,2,3,0,0,0,0,2,0,2,2,1,0,0,0,0,0,0,1,0,0,0,0,1,1, +1,0,1,1,0,1,0,1,1,0,1,1,0,2,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0, +2,3,2,3,2,1,2,2,2,2,1,0,0,0,2,0,0,1,1,0,0,0,0,0,0,0,1,1,0,0,2,1, +1,1,2,1,0,2,0,0,1,0,1,0,0,1,0,0,1,1,0,1,1,0,0,0,0,0,1,0,0,0,0,0, +3,0,0,1,0,2,2,2,3,2,2,2,2,2,2,2,0,0,0,2,1,2,1,1,1,2,2,0,0,0,1,2, +1,1,1,1,1,0,1,2,1,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0,0,1, +2,3,2,3,3,2,0,1,1,1,0,0,1,0,2,0,1,1,3,1,0,0,0,0,0,0,0,1,0,0,2,1, +1,1,1,1,1,1,1,0,1,0,1,1,1,1,0,1,1,1,0,0,1,1,0,1,0,0,0,0,0,0,1,0, +2,3,3,3,3,1,2,2,2,2,0,1,1,0,2,1,1,1,2,1,0,1,1,0,0,1,0,1,0,0,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,2,0,0,1,1,2,2,1,0,0,2,0,1,1,3,0,0,1,0,0,0,0,0,1,0,1,2,1, +1,1,2,0,1,1,1,0,1,0,1,1,0,1,0,1,1,1,1,0,1,0,0,0,0,0,0,1,0,1,1,0, +1,3,2,3,2,1,0,0,2,2,2,0,1,0,2,0,1,1,1,0,1,0,0,0,3,0,1,1,0,0,2,1, +1,1,1,0,1,1,0,0,0,0,1,1,0,1,0,0,2,1,1,0,1,0,0,0,1,0,1,0,0,1,1,0, +3,1,2,1,1,2,2,2,2,2,2,1,2,2,1,1,0,0,0,2,2,2,0,0,0,1,2,1,0,1,0,1, +2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2,1,1,1,0,1,0,1,1,0,1,1,1,0,0,1, +3,0,0,0,0,2,0,1,1,1,1,1,1,1,0,1,0,0,0,1,1,1,0,1,0,1,1,0,0,1,0,1, +1,1,0,0,1,0,0,0,1,0,1,1,0,0,1,0,1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,1, +1,3,3,2,2,0,0,0,2,2,0,0,0,1,2,0,1,1,2,0,0,0,0,0,0,0,0,1,0,0,2,1, +0,1,1,0,0,1,1,0,0,0,1,1,0,1,1,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,1,0, +2,3,2,3,2,0,0,0,0,1,1,0,0,0,2,0,2,0,2,0,0,0,0,0,1,0,0,1,0,0,1,1, +1,1,2,0,1,2,1,0,1,1,2,1,1,1,1,1,2,1,1,0,1,0,0,1,1,1,1,1,0,1,1,0, +1,3,2,2,2,1,0,0,2,2,1,0,1,2,2,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,1, +0,0,1,1,0,1,1,0,0,1,1,0,1,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,1,0,2,3,1,2,2,2,2,2,2,1,1,0,0,0,1,0,1,0,2,1,1,1,0,0,0,0,1, +1,1,0,1,1,0,1,1,1,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0, +2,0,2,0,0,1,0,3,2,1,2,1,2,2,0,1,0,0,0,2,1,0,0,2,1,1,1,1,0,2,0,2, +2,1,1,1,1,1,1,1,1,1,1,1,1,2,1,0,1,1,1,1,0,0,0,1,1,1,1,0,1,0,0,1, +1,2,2,2,2,1,0,0,1,0,0,0,0,0,2,0,1,1,1,1,0,0,0,0,1,0,1,2,0,0,2,0, +1,0,1,1,1,2,1,0,1,0,1,1,0,0,1,0,1,1,1,0,1,0,0,0,1,0,0,1,0,1,1,0, +2,1,2,2,2,0,3,0,1,1,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +0,0,0,1,1,1,0,0,1,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0, +1,2,2,3,2,2,0,0,1,1,2,0,1,2,1,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,1, +0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,1,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0, +2,2,1,1,2,1,2,2,2,2,2,1,2,2,0,1,0,0,0,1,2,2,2,1,2,1,1,1,1,1,2,1, +1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,0,1,1,1,0,0,0,0,1,1,1,0,1,1,0,0,1, +1,2,2,2,2,0,1,0,2,2,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0, +0,0,1,0,0,1,0,0,0,0,1,0,1,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,2,2,0,0,0,2,2,2,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1, +0,1,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,2,2,0,0,0,0,1,0,0,1,1,2,0,0,0,0,1,0,1,0,0,1,0,0,2,0,0,0,1, +0,0,1,0,0,1,0,0,0,1,1,0,0,0,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,2,1,1,2,0,2,1,1,1,1,0,2,2,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1, +0,0,1,0,1,1,0,0,0,0,1,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +1,0,2,1,2,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0, +0,0,1,0,1,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0, +1,0,0,0,0,2,0,1,2,1,0,1,1,1,0,1,0,0,0,1,0,1,0,0,1,0,1,0,0,0,0,1, +0,0,0,0,0,1,0,0,1,1,0,0,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1, +2,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +1,0,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +1,1,1,0,1,0,1,0,0,1,1,1,1,0,0,0,1,0,0,0,0,1,0,0,0,1,0,1,0,0,0,0, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +1,1,0,1,1,0,1,0,1,0,0,0,0,1,1,0,1,1,0,0,0,0,0,1,0,1,1,0,1,0,0,0, +0,1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0, +) + +Koi8rModel = { + 'char_to_order_map': KOI8R_char_to_order_map, + 'precedence_matrix': RussianLangModel, + 'typical_positive_ratio': 0.976601, + 'keep_english_letter': False, + 'charset_name': "KOI8-R", + 'language': 'Russian', +} + +Win1251CyrillicModel = { + 'char_to_order_map': win1251_char_to_order_map, + 'precedence_matrix': RussianLangModel, + 'typical_positive_ratio': 0.976601, + 'keep_english_letter': False, + 'charset_name': "windows-1251", + 'language': 'Russian', +} + +Latin5CyrillicModel = { + 'char_to_order_map': latin5_char_to_order_map, + 'precedence_matrix': RussianLangModel, + 'typical_positive_ratio': 0.976601, + 'keep_english_letter': False, + 'charset_name': "ISO-8859-5", + 'language': 'Russian', +} + +MacCyrillicModel = { + 'char_to_order_map': macCyrillic_char_to_order_map, + 'precedence_matrix': RussianLangModel, + 'typical_positive_ratio': 0.976601, + 'keep_english_letter': False, + 'charset_name': "MacCyrillic", + 'language': 'Russian', +} + +Ibm866Model = { + 'char_to_order_map': IBM866_char_to_order_map, + 'precedence_matrix': RussianLangModel, + 'typical_positive_ratio': 0.976601, + 'keep_english_letter': False, + 'charset_name': "IBM866", + 'language': 'Russian', +} + +Ibm855Model = { + 'char_to_order_map': IBM855_char_to_order_map, + 'precedence_matrix': RussianLangModel, + 'typical_positive_ratio': 0.976601, + 'keep_english_letter': False, + 'charset_name': "IBM855", + 'language': 'Russian', +} diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/langcyrillicmodel 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/langcyrillicmodel 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..99293f9706ad482419c51aaa4143cee6b7898595 GIT binary patch literal 30731 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 literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/langcyrillicmodel.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/langcyrillicmodel.py new file mode 100644 index 0000000..e5f9a1f --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/langcyrillicmodel.py @@ -0,0 +1,333 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# KOI8-R language model +# Character Mapping Table: +KOI8R_char_to_order_map = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 +191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, # 80 +207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, # 90 +223,224,225, 68,226,227,228,229,230,231,232,233,234,235,236,237, # a0 +238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253, # b0 + 27, 3, 21, 28, 13, 2, 39, 19, 26, 4, 23, 11, 8, 12, 5, 1, # c0 + 15, 16, 9, 7, 6, 14, 24, 10, 17, 18, 20, 25, 30, 29, 22, 54, # d0 + 59, 37, 44, 58, 41, 48, 53, 46, 55, 42, 60, 36, 49, 38, 31, 34, # e0 + 35, 43, 45, 32, 40, 52, 56, 33, 61, 62, 51, 57, 47, 63, 50, 70, # f0 +) + +win1251_char_to_order_map = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 +191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, +207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, +223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, +239,240,241,242,243,244,245,246, 68,247,248,249,250,251,252,253, + 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, + 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, + 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, + 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16, +) + +latin5_char_to_order_map = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 +191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, +207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, +223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, + 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, + 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, + 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, + 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16, +239, 68,240,241,242,243,244,245,246,247,248,249,250,251,252,255, +) + +macCyrillic_char_to_order_map = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 + 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, + 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, +191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, +207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, +223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, +239,240,241,242,243,244,245,246,247,248,249,250,251,252, 68, 16, + 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, + 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27,255, +) + +IBM855_char_to_order_map = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 +191,192,193,194, 68,195,196,197,198,199,200,201,202,203,204,205, +206,207,208,209,210,211,212,213,214,215,216,217, 27, 59, 54, 70, + 3, 37, 21, 44, 28, 58, 13, 41, 2, 48, 39, 53, 19, 46,218,219, +220,221,222,223,224, 26, 55, 4, 42,225,226,227,228, 23, 60,229, +230,231,232,233,234,235, 11, 36,236,237,238,239,240,241,242,243, + 8, 49, 12, 38, 5, 31, 1, 34, 15,244,245,246,247, 35, 16,248, + 43, 9, 45, 7, 32, 6, 40, 14, 52, 24, 56, 10, 33, 17, 61,249, +250, 18, 62, 20, 51, 25, 57, 30, 47, 29, 63, 22, 50,251,252,255, +) + +IBM866_char_to_order_map = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 + 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, + 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, + 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, +191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, +207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, +223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, + 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16, +239, 68,240,241,242,243,244,245,246,247,248,249,250,251,252,255, +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 97.6601% +# first 1024 sequences: 2.3389% +# rest sequences: 0.1237% +# negative sequences: 0.0009% +RussianLangModel = ( +0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,1,3,3,3,3,1,3,3,3,2,3,2,3,3, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,2,2,2,2,2,0,0,2, +3,3,3,2,3,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,3,2,3,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,2,2,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,2,3,3,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,0,0,3,3,3,3,3,3,3,3,3,3,3,2,1, +0,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,3,3,3,2,1, +0,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,2,2,2,3,1,3,3,1,3,3,3,3,2,2,3,0,2,2,2,3,3,2,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,3,3,3,3,3,2,2,3,2,3,3,3,2,1,2,2,0,1,2,2,2,2,2,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,3,0,2,2,3,3,2,1,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,3,3,1,2,3,2,2,3,2,3,3,3,3,2,2,3,0,3,2,2,3,1,1,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,2,3,3,3,3,2,2,2,0,3,3,3,2,2,2,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,2,3,2,3,3,3,3,3,3,2,3,2,2,0,1,3,2,1,2,2,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,2,1,1,3,0,1,1,1,1,2,1,1,0,2,2,2,1,2,0,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,3,3,2,2,2,2,1,3,2,3,2,3,2,1,2,2,0,1,1,2,1,2,1,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,2,2,3,2,3,3,3,2,2,2,2,0,2,2,2,2,3,1,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +3,2,3,2,2,3,3,3,3,3,3,3,3,3,1,3,2,0,0,3,3,3,3,2,3,3,3,3,2,3,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,3,3,2,2,3,3,0,2,1,0,3,2,3,2,3,0,0,1,2,0,0,1,0,1,2,1,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,3,0,2,3,3,3,3,2,3,3,3,3,1,2,2,0,0,2,3,2,2,2,3,2,3,2,2,3,0,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,3,0,2,3,2,3,0,1,2,3,3,2,0,2,3,0,0,2,3,2,2,0,1,3,1,3,2,2,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,3,0,2,3,3,3,3,3,3,3,3,2,1,3,2,0,0,2,2,3,3,3,2,3,3,0,2,2,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,2,3,3,2,2,2,3,3,0,0,1,1,1,1,1,2,0,0,1,1,1,1,0,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,2,3,3,3,3,3,3,3,0,3,2,3,3,2,3,2,0,2,1,0,1,1,0,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,3,3,3,2,2,2,2,3,1,3,2,3,1,1,2,1,0,2,2,2,2,1,3,1,0, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +2,2,3,3,3,3,3,1,2,2,1,3,1,0,3,0,0,3,0,0,0,1,1,0,1,2,1,0,0,0,0,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,2,1,1,3,3,3,2,2,1,2,2,3,1,1,2,0,0,2,2,1,3,0,0,2,1,1,2,1,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,3,3,3,3,1,2,2,2,1,2,1,3,3,1,1,2,1,2,1,2,2,0,2,0,0,1,1,0,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,3,3,2,1,3,2,2,3,2,0,3,2,0,3,0,1,0,1,1,0,0,1,1,1,1,0,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,2,3,3,3,2,2,2,3,3,1,2,1,2,1,0,1,0,1,1,0,1,0,0,2,1,1,1,0,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +3,1,1,2,1,2,3,3,2,2,1,2,2,3,0,2,1,0,0,2,2,3,2,1,2,2,2,2,2,3,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,1,1,0,1,1,2,2,1,1,3,0,0,1,3,1,1,1,0,0,0,1,0,1,1,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,1,3,3,3,2,0,0,0,2,1,0,1,0,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,1,0,0,2,3,2,2,2,1,2,2,2,1,2,1,0,0,1,1,1,0,2,0,1,1,1,0,0,1,1, +1,0,0,0,0,0,1,2,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,3,0,0,0,0,1,0,0,0,0,3,0,1,2,1,0,0,0,0,0,0,0,1,1,0,0,1,1, +1,0,1,0,1,2,0,0,1,1,2,1,0,1,1,1,1,0,1,1,1,1,0,1,0,0,1,0,0,1,1,0, +2,2,3,2,2,2,3,1,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,0,1,0,1,1,1,0,2,1, +1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,1,0,1,1,0, +3,3,3,2,2,2,2,3,2,2,1,1,2,2,2,2,1,1,3,1,2,1,2,0,0,1,1,0,1,0,2,1, +1,1,1,1,1,2,1,0,1,1,1,1,0,1,0,0,1,1,0,0,1,0,1,0,0,1,0,0,0,1,1,0, +2,0,0,1,0,3,2,2,2,2,1,2,1,2,1,2,0,0,0,2,1,2,2,1,1,2,2,0,1,1,0,2, +1,1,1,1,1,0,1,1,1,2,1,1,1,2,1,0,1,2,1,1,1,1,0,1,1,1,0,0,1,0,0,1, +1,3,2,2,2,1,1,1,2,3,0,0,0,0,2,0,2,2,1,0,0,0,0,0,0,1,0,0,0,0,1,1, +1,0,1,1,0,1,0,1,1,0,1,1,0,2,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0, +2,3,2,3,2,1,2,2,2,2,1,0,0,0,2,0,0,1,1,0,0,0,0,0,0,0,1,1,0,0,2,1, +1,1,2,1,0,2,0,0,1,0,1,0,0,1,0,0,1,1,0,1,1,0,0,0,0,0,1,0,0,0,0,0, +3,0,0,1,0,2,2,2,3,2,2,2,2,2,2,2,0,0,0,2,1,2,1,1,1,2,2,0,0,0,1,2, +1,1,1,1,1,0,1,2,1,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0,0,1, +2,3,2,3,3,2,0,1,1,1,0,0,1,0,2,0,1,1,3,1,0,0,0,0,0,0,0,1,0,0,2,1, +1,1,1,1,1,1,1,0,1,0,1,1,1,1,0,1,1,1,0,0,1,1,0,1,0,0,0,0,0,0,1,0, +2,3,3,3,3,1,2,2,2,2,0,1,1,0,2,1,1,1,2,1,0,1,1,0,0,1,0,1,0,0,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,2,0,0,1,1,2,2,1,0,0,2,0,1,1,3,0,0,1,0,0,0,0,0,1,0,1,2,1, +1,1,2,0,1,1,1,0,1,0,1,1,0,1,0,1,1,1,1,0,1,0,0,0,0,0,0,1,0,1,1,0, +1,3,2,3,2,1,0,0,2,2,2,0,1,0,2,0,1,1,1,0,1,0,0,0,3,0,1,1,0,0,2,1, +1,1,1,0,1,1,0,0,0,0,1,1,0,1,0,0,2,1,1,0,1,0,0,0,1,0,1,0,0,1,1,0, +3,1,2,1,1,2,2,2,2,2,2,1,2,2,1,1,0,0,0,2,2,2,0,0,0,1,2,1,0,1,0,1, +2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2,1,1,1,0,1,0,1,1,0,1,1,1,0,0,1, +3,0,0,0,0,2,0,1,1,1,1,1,1,1,0,1,0,0,0,1,1,1,0,1,0,1,1,0,0,1,0,1, +1,1,0,0,1,0,0,0,1,0,1,1,0,0,1,0,1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,1, +1,3,3,2,2,0,0,0,2,2,0,0,0,1,2,0,1,1,2,0,0,0,0,0,0,0,0,1,0,0,2,1, +0,1,1,0,0,1,1,0,0,0,1,1,0,1,1,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,1,0, +2,3,2,3,2,0,0,0,0,1,1,0,0,0,2,0,2,0,2,0,0,0,0,0,1,0,0,1,0,0,1,1, +1,1,2,0,1,2,1,0,1,1,2,1,1,1,1,1,2,1,1,0,1,0,0,1,1,1,1,1,0,1,1,0, +1,3,2,2,2,1,0,0,2,2,1,0,1,2,2,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,1, +0,0,1,1,0,1,1,0,0,1,1,0,1,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,1,0,2,3,1,2,2,2,2,2,2,1,1,0,0,0,1,0,1,0,2,1,1,1,0,0,0,0,1, +1,1,0,1,1,0,1,1,1,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0, +2,0,2,0,0,1,0,3,2,1,2,1,2,2,0,1,0,0,0,2,1,0,0,2,1,1,1,1,0,2,0,2, +2,1,1,1,1,1,1,1,1,1,1,1,1,2,1,0,1,1,1,1,0,0,0,1,1,1,1,0,1,0,0,1, +1,2,2,2,2,1,0,0,1,0,0,0,0,0,2,0,1,1,1,1,0,0,0,0,1,0,1,2,0,0,2,0, +1,0,1,1,1,2,1,0,1,0,1,1,0,0,1,0,1,1,1,0,1,0,0,0,1,0,0,1,0,1,1,0, +2,1,2,2,2,0,3,0,1,1,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +0,0,0,1,1,1,0,0,1,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0, +1,2,2,3,2,2,0,0,1,1,2,0,1,2,1,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,1, +0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,1,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0, +2,2,1,1,2,1,2,2,2,2,2,1,2,2,0,1,0,0,0,1,2,2,2,1,2,1,1,1,1,1,2,1, +1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,0,1,1,1,0,0,0,0,1,1,1,0,1,1,0,0,1, +1,2,2,2,2,0,1,0,2,2,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0, +0,0,1,0,0,1,0,0,0,0,1,0,1,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,2,2,0,0,0,2,2,2,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1, +0,1,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,2,2,0,0,0,0,1,0,0,1,1,2,0,0,0,0,1,0,1,0,0,1,0,0,2,0,0,0,1, +0,0,1,0,0,1,0,0,0,1,1,0,0,0,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,2,1,1,2,0,2,1,1,1,1,0,2,2,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1, +0,0,1,0,1,1,0,0,0,0,1,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +1,0,2,1,2,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0, +0,0,1,0,1,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0, +1,0,0,0,0,2,0,1,2,1,0,1,1,1,0,1,0,0,0,1,0,1,0,0,1,0,1,0,0,0,0,1, +0,0,0,0,0,1,0,0,1,1,0,0,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1, +2,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +1,0,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +1,1,1,0,1,0,1,0,0,1,1,1,1,0,0,0,1,0,0,0,0,1,0,0,0,1,0,1,0,0,0,0, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +1,1,0,1,1,0,1,0,1,0,0,0,0,1,1,0,1,1,0,0,0,0,0,1,0,1,1,0,1,0,0,0, +0,1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0, +) + +Koi8rModel = { + 'char_to_order_map': KOI8R_char_to_order_map, + 'precedence_matrix': RussianLangModel, + 'typical_positive_ratio': 0.976601, + 'keep_english_letter': False, + 'charset_name': "KOI8-R", + 'language': 'Russian', +} + +Win1251CyrillicModel = { + 'char_to_order_map': win1251_char_to_order_map, + 'precedence_matrix': RussianLangModel, + 'typical_positive_ratio': 0.976601, + 'keep_english_letter': False, + 'charset_name': "windows-1251", + 'language': 'Russian', +} + +Latin5CyrillicModel = { + 'char_to_order_map': latin5_char_to_order_map, + 'precedence_matrix': RussianLangModel, + 'typical_positive_ratio': 0.976601, + 'keep_english_letter': False, + 'charset_name': "ISO-8859-5", + 'language': 'Russian', +} + +MacCyrillicModel = { + 'char_to_order_map': macCyrillic_char_to_order_map, + 'precedence_matrix': RussianLangModel, + 'typical_positive_ratio': 0.976601, + 'keep_english_letter': False, + 'charset_name': "MacCyrillic", + 'language': 'Russian', +} + +Ibm866Model = { + 'char_to_order_map': IBM866_char_to_order_map, + 'precedence_matrix': RussianLangModel, + 'typical_positive_ratio': 0.976601, + 'keep_english_letter': False, + 'charset_name': "IBM866", + 'language': 'Russian', +} + +Ibm855Model = { + 'char_to_order_map': IBM855_char_to_order_map, + 'precedence_matrix': RussianLangModel, + 'typical_positive_ratio': 0.976601, + 'keep_english_letter': False, + 'charset_name': "IBM855", + 'language': 'Russian', +} diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/langcyrillicmodel.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/langcyrillicmodel.pyc new file mode 100644 index 0000000000000000000000000000000000000000..46f7d7542a136395d6d5bcdfce5c3a5d074bb488 GIT binary patch literal 30731 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 L{?-3Z7#8n8H<9P3 literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/langgreekmodel 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/langgreekmodel 2.py new file mode 100644 index 0000000..5332221 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/langgreekmodel 2.py @@ -0,0 +1,225 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# 255: Control characters that usually does not exist in any text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 + +# Character Mapping Table: +Latin7_char_to_order_map = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 82,100,104, 94, 98,101,116,102,111,187,117, 92, 88,113, 85, # 40 + 79,118,105, 83, 67,114,119, 95, 99,109,188,253,253,253,253,253, # 50 +253, 72, 70, 80, 81, 60, 96, 93, 89, 68,120, 97, 77, 86, 69, 55, # 60 + 78,115, 65, 66, 58, 76,106,103, 87,107,112,253,253,253,253,253, # 70 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 80 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 90 +253,233, 90,253,253,253,253,253,253,253,253,253,253, 74,253,253, # a0 +253,253,253,253,247,248, 61, 36, 46, 71, 73,253, 54,253,108,123, # b0 +110, 31, 51, 43, 41, 34, 91, 40, 52, 47, 44, 53, 38, 49, 59, 39, # c0 + 35, 48,250, 37, 33, 45, 56, 50, 84, 57,120,121, 17, 18, 22, 15, # d0 +124, 1, 29, 20, 21, 3, 32, 13, 25, 5, 11, 16, 10, 6, 30, 4, # e0 + 9, 8, 14, 7, 2, 12, 28, 23, 42, 24, 64, 75, 19, 26, 27,253, # f0 +) + +win1253_char_to_order_map = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 82,100,104, 94, 98,101,116,102,111,187,117, 92, 88,113, 85, # 40 + 79,118,105, 83, 67,114,119, 95, 99,109,188,253,253,253,253,253, # 50 +253, 72, 70, 80, 81, 60, 96, 93, 89, 68,120, 97, 77, 86, 69, 55, # 60 + 78,115, 65, 66, 58, 76,106,103, 87,107,112,253,253,253,253,253, # 70 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 80 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 90 +253,233, 61,253,253,253,253,253,253,253,253,253,253, 74,253,253, # a0 +253,253,253,253,247,253,253, 36, 46, 71, 73,253, 54,253,108,123, # b0 +110, 31, 51, 43, 41, 34, 91, 40, 52, 47, 44, 53, 38, 49, 59, 39, # c0 + 35, 48,250, 37, 33, 45, 56, 50, 84, 57,120,121, 17, 18, 22, 15, # d0 +124, 1, 29, 20, 21, 3, 32, 13, 25, 5, 11, 16, 10, 6, 30, 4, # e0 + 9, 8, 14, 7, 2, 12, 28, 23, 42, 24, 64, 75, 19, 26, 27,253, # f0 +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 98.2851% +# first 1024 sequences:1.7001% +# rest sequences: 0.0359% +# negative sequences: 0.0148% +GreekLangModel = ( +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,2,2,3,3,3,3,3,3,3,3,1,3,3,3,0,2,2,3,3,0,3,0,3,2,0,3,3,3,0, +3,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,0,3,3,0,3,2,3,3,0,3,2,3,3,3,0,0,3,0,3,0,3,3,2,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, +0,2,3,2,2,3,3,3,3,3,3,3,3,0,3,3,3,3,0,2,3,3,0,3,3,3,3,2,3,3,3,0, +2,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,0,2,1,3,3,3,3,2,3,3,2,3,3,2,0, +0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,0,3,3,3,3,3,3,0,3,3,0,3,3,3,3,3,3,3,3,3,3,0,3,2,3,3,0, +2,0,1,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,2,3,0,0,0,0,3,3,0,3,1,3,3,3,0,3,3,0,3,3,3,3,0,0,0,0, +2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,0,3,0,3,3,3,3,3,0,3,2,2,2,3,0,2,3,3,3,3,3,2,3,3,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,3,2,2,2,3,3,3,3,0,3,1,3,3,3,3,2,3,3,3,3,3,3,3,2,2,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,2,0,3,0,0,0,3,3,2,3,3,3,3,3,0,0,3,2,3,0,2,3,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,3,3,3,3,0,0,3,3,0,2,3,0,3,0,3,3,3,0,0,3,0,3,0,2,2,3,3,0,0, +0,0,1,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,2,0,3,2,3,3,3,3,0,3,3,3,3,3,0,3,3,2,3,2,3,3,2,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,2,3,2,3,3,3,3,3,3,0,2,3,2,3,2,2,2,3,2,3,3,2,3,0,2,2,2,3,0, +2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,0,0,0,3,3,3,2,3,3,0,0,3,0,3,0,0,0,3,2,0,3,0,3,0,0,2,0,2,0, +0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,0,3,3,3,3,3,3,0,3,3,0,3,0,0,0,3,3,0,3,3,3,0,0,1,2,3,0, +3,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,2,0,0,3,2,2,3,3,0,3,3,3,3,3,2,1,3,0,3,2,3,3,2,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,3,0,2,3,3,3,3,3,3,0,0,3,0,3,0,0,0,3,3,0,3,2,3,0,0,3,3,3,0, +3,0,0,0,2,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,0,3,3,3,3,3,3,0,0,3,0,3,0,0,0,3,2,0,3,2,3,0,0,3,2,3,0, +2,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,1,2,2,3,3,3,3,3,3,0,2,3,0,3,0,0,0,3,3,0,3,0,2,0,0,2,3,1,0, +2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,3,3,3,3,0,3,0,3,3,2,3,0,3,3,3,3,3,3,0,3,3,3,0,2,3,0,0,3,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,3,3,3,0,0,3,0,0,0,3,3,0,3,0,2,3,3,0,0,3,0,3,0,3,3,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,0,0,0,3,3,3,3,3,3,0,0,3,0,2,0,0,0,3,3,0,3,0,3,0,0,2,0,2,0, +0,0,0,0,1,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,3,0,3,0,2,0,3,2,0,3,2,3,2,3,0,0,3,2,3,2,3,3,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,0,0,2,3,3,3,3,3,0,0,0,3,0,2,1,0,0,3,2,2,2,0,3,0,0,2,2,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,3,3,3,2,0,3,0,3,0,3,3,0,2,1,2,3,3,0,0,3,0,3,0,3,3,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,3,3,3,0,3,3,3,3,3,3,0,2,3,0,3,0,0,0,2,1,0,2,2,3,0,0,2,2,2,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,0,0,2,3,3,3,2,3,0,0,1,3,0,2,0,0,0,0,3,0,1,0,2,0,0,1,1,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,1,0,3,0,0,0,3,2,0,3,2,3,3,3,0,0,3,0,3,2,2,2,1,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,3,3,3,0,0,3,0,0,0,0,2,0,2,3,3,2,2,2,2,3,0,2,0,2,2,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,2,0,0,0,0,0,0,2,3,0,2,0,2,3,2,0,0,3,0,3,0,3,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,3,2,3,3,2,2,3,0,2,0,3,0,0,0,2,0,0,0,0,1,2,0,2,0,2,0, +0,2,0,2,0,2,2,0,0,1,0,2,2,2,0,2,2,2,0,2,2,2,0,0,2,0,0,1,0,0,0,0, +0,2,0,3,3,2,0,0,0,0,0,0,1,3,0,2,0,2,2,2,0,0,2,0,3,0,0,2,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,2,3,2,0,2,2,0,2,0,2,2,0,2,0,2,2,2,0,0,0,0,0,0,2,3,0,0,0,2, +0,1,2,0,0,0,0,2,2,0,0,0,2,1,0,2,2,0,0,0,0,0,0,1,0,2,0,0,0,0,0,0, +0,0,2,1,0,2,3,2,2,3,2,3,2,0,0,3,3,3,0,0,3,2,0,0,0,1,1,0,2,0,2,2, +0,2,0,2,0,2,2,0,0,2,0,2,2,2,0,2,2,2,2,0,0,2,0,0,0,2,0,1,0,0,0,0, +0,3,0,3,3,2,2,0,3,0,0,0,2,2,0,2,2,2,1,2,0,0,1,2,2,0,0,3,0,0,0,2, +0,1,2,0,0,0,1,2,0,0,0,0,0,0,0,2,2,0,1,0,0,2,0,0,0,2,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,3,3,2,2,0,0,0,2,0,2,3,3,0,2,0,0,0,0,0,0,2,2,2,0,2,2,0,2,0,2, +0,2,2,0,0,2,2,2,2,1,0,0,2,2,0,2,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0, +0,2,0,3,2,3,0,0,0,3,0,0,2,2,0,2,0,2,2,2,0,0,2,0,0,0,0,0,0,0,0,2, +0,0,2,2,0,0,2,2,2,0,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,2,0,0,3,2,0,2,2,2,2,2,0,0,0,2,0,0,0,0,2,0,1,0,0,2,0,1,0,0,0, +0,2,2,2,0,2,2,0,1,2,0,2,2,2,0,2,2,2,2,1,2,2,0,0,2,0,0,0,0,0,0,0, +0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +0,2,0,2,0,2,2,0,0,0,0,1,2,1,0,0,2,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,3,2,3,0,0,2,0,0,0,2,2,0,2,0,0,0,1,0,0,2,0,2,0,2,2,0,0,0,0, +0,0,2,0,0,0,0,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0, +0,2,2,3,2,2,0,0,0,0,0,0,1,3,0,2,0,2,2,0,0,0,1,0,2,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,0,2,0,3,2,0,2,0,0,0,0,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +0,0,2,0,0,0,0,1,1,0,0,2,1,2,0,2,2,0,1,0,0,1,0,0,0,2,0,0,0,0,0,0, +0,3,0,2,2,2,0,0,2,0,0,0,2,0,0,0,2,3,0,2,0,0,0,0,0,0,2,2,0,0,0,2, +0,1,2,0,0,0,1,2,2,1,0,0,0,2,0,0,2,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,1,2,0,2,2,0,2,0,0,2,0,0,0,0,1,2,1,0,2,1,0,0,0,0,0,0,0,0,0,0, +0,0,2,0,0,0,3,1,2,2,0,2,0,0,0,0,2,0,0,0,2,0,0,3,0,0,0,0,2,2,2,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,1,0,2,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,2, +0,2,2,0,0,2,2,2,2,2,0,1,2,0,0,0,2,2,0,1,0,2,0,0,2,2,0,0,0,0,0,0, +0,0,0,0,1,0,0,0,0,0,0,0,3,0,0,2,0,0,0,0,0,0,0,0,2,0,2,0,0,0,0,2, +0,1,2,0,0,0,0,2,2,1,0,1,0,1,0,2,2,2,1,0,0,0,0,0,0,1,0,0,0,0,0,0, +0,2,0,1,2,0,0,0,0,0,0,0,0,0,0,2,0,0,2,2,0,0,0,0,1,0,0,0,0,0,0,2, +0,2,2,0,0,0,0,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,2,0,0,0, +0,2,2,2,2,0,0,0,3,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0,1, +0,0,2,0,0,0,0,1,2,0,0,0,0,0,0,2,2,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0, +0,2,0,2,2,2,0,0,2,0,0,0,0,0,0,0,2,2,2,0,0,0,2,0,0,0,0,0,0,0,0,2, +0,0,1,0,0,0,0,2,1,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0, +0,3,0,2,0,0,0,0,0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,2, +0,0,2,0,0,0,0,2,2,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,0,2,2,1,0,0,0,0,0,0,2,0,0,2,0,2,2,2,0,0,0,0,0,0,2,0,0,0,0,2, +0,0,2,0,0,2,0,2,2,0,0,0,0,2,0,2,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0, +0,0,3,0,0,0,2,2,0,2,2,0,0,0,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,2,0,0,0,0,0, +0,2,2,2,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1, +0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,2,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +0,2,0,0,0,2,0,0,0,0,0,1,0,0,0,0,2,2,0,0,0,1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,2,0,0,0, +0,2,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,2,0,2,0,0,0, +0,0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,0,0,0,1,2,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +) + +Latin7GreekModel = { + 'char_to_order_map': Latin7_char_to_order_map, + 'precedence_matrix': GreekLangModel, + 'typical_positive_ratio': 0.982851, + 'keep_english_letter': False, + 'charset_name': "ISO-8859-7", + 'language': 'Greek', +} + +Win1253GreekModel = { + 'char_to_order_map': win1253_char_to_order_map, + 'precedence_matrix': GreekLangModel, + 'typical_positive_ratio': 0.982851, + 'keep_english_letter': False, + 'charset_name': "windows-1253", + 'language': 'Greek', +} diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/langgreekmodel 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/langgreekmodel 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9506df443aa7d9f0cc7c98aaa0df2af36568bbc4 GIT binary patch literal 24686 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 literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/langgreekmodel.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/langgreekmodel.py new file mode 100644 index 0000000..5332221 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/langgreekmodel.py @@ -0,0 +1,225 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# 255: Control characters that usually does not exist in any text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 + +# Character Mapping Table: +Latin7_char_to_order_map = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 82,100,104, 94, 98,101,116,102,111,187,117, 92, 88,113, 85, # 40 + 79,118,105, 83, 67,114,119, 95, 99,109,188,253,253,253,253,253, # 50 +253, 72, 70, 80, 81, 60, 96, 93, 89, 68,120, 97, 77, 86, 69, 55, # 60 + 78,115, 65, 66, 58, 76,106,103, 87,107,112,253,253,253,253,253, # 70 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 80 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 90 +253,233, 90,253,253,253,253,253,253,253,253,253,253, 74,253,253, # a0 +253,253,253,253,247,248, 61, 36, 46, 71, 73,253, 54,253,108,123, # b0 +110, 31, 51, 43, 41, 34, 91, 40, 52, 47, 44, 53, 38, 49, 59, 39, # c0 + 35, 48,250, 37, 33, 45, 56, 50, 84, 57,120,121, 17, 18, 22, 15, # d0 +124, 1, 29, 20, 21, 3, 32, 13, 25, 5, 11, 16, 10, 6, 30, 4, # e0 + 9, 8, 14, 7, 2, 12, 28, 23, 42, 24, 64, 75, 19, 26, 27,253, # f0 +) + +win1253_char_to_order_map = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 82,100,104, 94, 98,101,116,102,111,187,117, 92, 88,113, 85, # 40 + 79,118,105, 83, 67,114,119, 95, 99,109,188,253,253,253,253,253, # 50 +253, 72, 70, 80, 81, 60, 96, 93, 89, 68,120, 97, 77, 86, 69, 55, # 60 + 78,115, 65, 66, 58, 76,106,103, 87,107,112,253,253,253,253,253, # 70 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 80 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 90 +253,233, 61,253,253,253,253,253,253,253,253,253,253, 74,253,253, # a0 +253,253,253,253,247,253,253, 36, 46, 71, 73,253, 54,253,108,123, # b0 +110, 31, 51, 43, 41, 34, 91, 40, 52, 47, 44, 53, 38, 49, 59, 39, # c0 + 35, 48,250, 37, 33, 45, 56, 50, 84, 57,120,121, 17, 18, 22, 15, # d0 +124, 1, 29, 20, 21, 3, 32, 13, 25, 5, 11, 16, 10, 6, 30, 4, # e0 + 9, 8, 14, 7, 2, 12, 28, 23, 42, 24, 64, 75, 19, 26, 27,253, # f0 +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 98.2851% +# first 1024 sequences:1.7001% +# rest sequences: 0.0359% +# negative sequences: 0.0148% +GreekLangModel = ( +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,2,2,3,3,3,3,3,3,3,3,1,3,3,3,0,2,2,3,3,0,3,0,3,2,0,3,3,3,0, +3,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,0,3,3,0,3,2,3,3,0,3,2,3,3,3,0,0,3,0,3,0,3,3,2,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, +0,2,3,2,2,3,3,3,3,3,3,3,3,0,3,3,3,3,0,2,3,3,0,3,3,3,3,2,3,3,3,0, +2,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,0,2,1,3,3,3,3,2,3,3,2,3,3,2,0, +0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,0,3,3,3,3,3,3,0,3,3,0,3,3,3,3,3,3,3,3,3,3,0,3,2,3,3,0, +2,0,1,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,2,3,0,0,0,0,3,3,0,3,1,3,3,3,0,3,3,0,3,3,3,3,0,0,0,0, +2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,0,3,0,3,3,3,3,3,0,3,2,2,2,3,0,2,3,3,3,3,3,2,3,3,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,3,2,2,2,3,3,3,3,0,3,1,3,3,3,3,2,3,3,3,3,3,3,3,2,2,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,2,0,3,0,0,0,3,3,2,3,3,3,3,3,0,0,3,2,3,0,2,3,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,3,3,3,3,0,0,3,3,0,2,3,0,3,0,3,3,3,0,0,3,0,3,0,2,2,3,3,0,0, +0,0,1,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,2,0,3,2,3,3,3,3,0,3,3,3,3,3,0,3,3,2,3,2,3,3,2,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,2,3,2,3,3,3,3,3,3,0,2,3,2,3,2,2,2,3,2,3,3,2,3,0,2,2,2,3,0, +2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,0,0,0,3,3,3,2,3,3,0,0,3,0,3,0,0,0,3,2,0,3,0,3,0,0,2,0,2,0, +0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,0,3,3,3,3,3,3,0,3,3,0,3,0,0,0,3,3,0,3,3,3,0,0,1,2,3,0, +3,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,2,0,0,3,2,2,3,3,0,3,3,3,3,3,2,1,3,0,3,2,3,3,2,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,3,0,2,3,3,3,3,3,3,0,0,3,0,3,0,0,0,3,3,0,3,2,3,0,0,3,3,3,0, +3,0,0,0,2,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,0,3,3,3,3,3,3,0,0,3,0,3,0,0,0,3,2,0,3,2,3,0,0,3,2,3,0, +2,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,1,2,2,3,3,3,3,3,3,0,2,3,0,3,0,0,0,3,3,0,3,0,2,0,0,2,3,1,0, +2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,3,3,3,3,0,3,0,3,3,2,3,0,3,3,3,3,3,3,0,3,3,3,0,2,3,0,0,3,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,3,3,3,0,0,3,0,0,0,3,3,0,3,0,2,3,3,0,0,3,0,3,0,3,3,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,0,0,0,3,3,3,3,3,3,0,0,3,0,2,0,0,0,3,3,0,3,0,3,0,0,2,0,2,0, +0,0,0,0,1,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,3,0,3,0,2,0,3,2,0,3,2,3,2,3,0,0,3,2,3,2,3,3,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,0,0,2,3,3,3,3,3,0,0,0,3,0,2,1,0,0,3,2,2,2,0,3,0,0,2,2,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,3,3,3,2,0,3,0,3,0,3,3,0,2,1,2,3,3,0,0,3,0,3,0,3,3,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,3,3,3,0,3,3,3,3,3,3,0,2,3,0,3,0,0,0,2,1,0,2,2,3,0,0,2,2,2,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,0,0,2,3,3,3,2,3,0,0,1,3,0,2,0,0,0,0,3,0,1,0,2,0,0,1,1,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,1,0,3,0,0,0,3,2,0,3,2,3,3,3,0,0,3,0,3,2,2,2,1,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,3,3,3,0,0,3,0,0,0,0,2,0,2,3,3,2,2,2,2,3,0,2,0,2,2,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,2,0,0,0,0,0,0,2,3,0,2,0,2,3,2,0,0,3,0,3,0,3,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,3,2,3,3,2,2,3,0,2,0,3,0,0,0,2,0,0,0,0,1,2,0,2,0,2,0, +0,2,0,2,0,2,2,0,0,1,0,2,2,2,0,2,2,2,0,2,2,2,0,0,2,0,0,1,0,0,0,0, +0,2,0,3,3,2,0,0,0,0,0,0,1,3,0,2,0,2,2,2,0,0,2,0,3,0,0,2,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,2,3,2,0,2,2,0,2,0,2,2,0,2,0,2,2,2,0,0,0,0,0,0,2,3,0,0,0,2, +0,1,2,0,0,0,0,2,2,0,0,0,2,1,0,2,2,0,0,0,0,0,0,1,0,2,0,0,0,0,0,0, +0,0,2,1,0,2,3,2,2,3,2,3,2,0,0,3,3,3,0,0,3,2,0,0,0,1,1,0,2,0,2,2, +0,2,0,2,0,2,2,0,0,2,0,2,2,2,0,2,2,2,2,0,0,2,0,0,0,2,0,1,0,0,0,0, +0,3,0,3,3,2,2,0,3,0,0,0,2,2,0,2,2,2,1,2,0,0,1,2,2,0,0,3,0,0,0,2, +0,1,2,0,0,0,1,2,0,0,0,0,0,0,0,2,2,0,1,0,0,2,0,0,0,2,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,3,3,2,2,0,0,0,2,0,2,3,3,0,2,0,0,0,0,0,0,2,2,2,0,2,2,0,2,0,2, +0,2,2,0,0,2,2,2,2,1,0,0,2,2,0,2,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0, +0,2,0,3,2,3,0,0,0,3,0,0,2,2,0,2,0,2,2,2,0,0,2,0,0,0,0,0,0,0,0,2, +0,0,2,2,0,0,2,2,2,0,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,2,0,0,3,2,0,2,2,2,2,2,0,0,0,2,0,0,0,0,2,0,1,0,0,2,0,1,0,0,0, +0,2,2,2,0,2,2,0,1,2,0,2,2,2,0,2,2,2,2,1,2,2,0,0,2,0,0,0,0,0,0,0, +0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +0,2,0,2,0,2,2,0,0,0,0,1,2,1,0,0,2,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,3,2,3,0,0,2,0,0,0,2,2,0,2,0,0,0,1,0,0,2,0,2,0,2,2,0,0,0,0, +0,0,2,0,0,0,0,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0, +0,2,2,3,2,2,0,0,0,0,0,0,1,3,0,2,0,2,2,0,0,0,1,0,2,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,0,2,0,3,2,0,2,0,0,0,0,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +0,0,2,0,0,0,0,1,1,0,0,2,1,2,0,2,2,0,1,0,0,1,0,0,0,2,0,0,0,0,0,0, +0,3,0,2,2,2,0,0,2,0,0,0,2,0,0,0,2,3,0,2,0,0,0,0,0,0,2,2,0,0,0,2, +0,1,2,0,0,0,1,2,2,1,0,0,0,2,0,0,2,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,1,2,0,2,2,0,2,0,0,2,0,0,0,0,1,2,1,0,2,1,0,0,0,0,0,0,0,0,0,0, +0,0,2,0,0,0,3,1,2,2,0,2,0,0,0,0,2,0,0,0,2,0,0,3,0,0,0,0,2,2,2,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,1,0,2,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,2, +0,2,2,0,0,2,2,2,2,2,0,1,2,0,0,0,2,2,0,1,0,2,0,0,2,2,0,0,0,0,0,0, +0,0,0,0,1,0,0,0,0,0,0,0,3,0,0,2,0,0,0,0,0,0,0,0,2,0,2,0,0,0,0,2, +0,1,2,0,0,0,0,2,2,1,0,1,0,1,0,2,2,2,1,0,0,0,0,0,0,1,0,0,0,0,0,0, +0,2,0,1,2,0,0,0,0,0,0,0,0,0,0,2,0,0,2,2,0,0,0,0,1,0,0,0,0,0,0,2, +0,2,2,0,0,0,0,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,2,0,0,0, +0,2,2,2,2,0,0,0,3,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0,1, +0,0,2,0,0,0,0,1,2,0,0,0,0,0,0,2,2,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0, +0,2,0,2,2,2,0,0,2,0,0,0,0,0,0,0,2,2,2,0,0,0,2,0,0,0,0,0,0,0,0,2, +0,0,1,0,0,0,0,2,1,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0, +0,3,0,2,0,0,0,0,0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,2, +0,0,2,0,0,0,0,2,2,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,0,2,2,1,0,0,0,0,0,0,2,0,0,2,0,2,2,2,0,0,0,0,0,0,2,0,0,0,0,2, +0,0,2,0,0,2,0,2,2,0,0,0,0,2,0,2,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0, +0,0,3,0,0,0,2,2,0,2,2,0,0,0,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,2,0,0,0,0,0, +0,2,2,2,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1, +0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,2,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +0,2,0,0,0,2,0,0,0,0,0,1,0,0,0,0,2,2,0,0,0,1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,2,0,0,0, +0,2,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,2,0,2,0,0,0, +0,0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,0,0,0,1,2,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +) + +Latin7GreekModel = { + 'char_to_order_map': Latin7_char_to_order_map, + 'precedence_matrix': GreekLangModel, + 'typical_positive_ratio': 0.982851, + 'keep_english_letter': False, + 'charset_name': "ISO-8859-7", + 'language': 'Greek', +} + +Win1253GreekModel = { + 'char_to_order_map': win1253_char_to_order_map, + 'precedence_matrix': GreekLangModel, + 'typical_positive_ratio': 0.982851, + 'keep_english_letter': False, + 'charset_name': "windows-1253", + 'language': 'Greek', +} diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/langgreekmodel.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/langgreekmodel.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5c454274887364fe67e79863d54edf848e9aacd2 GIT binary patch literal 24686 zcmeI4X>%NB6@}ZDqktjo`wj^p7DZlS*?}0smJP>&I1mt!Vd81aV~?fDOk1{qZxHtV z5AZ*LFZ>(w399%2MTMpBQNmL>yl>MJ%~+nGxO{S#bI*J4?Vi@ClIn%O+;;f-A5K4U zzIgth*A&IQwLRXdq4$eot;Sy#YX^$nuZp#UMSrm<>&W+t)$(A`d%9TdeZT1ap!ODu z-VbZdDd3TSn6cjvI2Z7lfKkA;fKEUxrhg^i z_W=(C+!yeLfG-Bz6Y$M|Zv=cb;IjeO1G)hZ2Yfl;a{(s<&IXJFJ{9okfR6>73Ahxn z9`Ja;<$z(pGXeEgDf$lu{59Zj0jC4*2)Hxg{(uJqRs#kB-wxOacz3|@fR6-xDByho zUkg|YxGP{K;G+R20zMFMG~nX_9}KuX;7GvV1KuC--hkzRQvt^U9t*fTU_0Qo0j~>q zQ^2bOz7udD;GF?)2zX<_Lcn_hZVPy8z%2o<2&iw_qJKDGG2mSRhXP(6@Unnc1>72N zFyNH|?+AEvz=s3g5^!(8=L23J@V0=r2h@LyDtbPDu{-Kio1M*3uN-x*bcc!#N9Fml zS8kjy>rgf7Utj;tAAkGj?~ecU$tuRHwuk-m-9cx#Iqp~et+F%fR{hN?&bVBb!%n%e zKIo4xb_Qitm7{UY^5D5gmQS5Jarg4cD!Pqh$7R*o=w2zS82$cHSzfMUxIuSg{c3l; z90%`Of1|f~ZM=N+*oot3mx_9sJD((doZ5muc96{_F&#^v?`#x?>>SyI9>m$K5-lFn;^|o}YY+|HBoA!;Ae+ah zc5HJ0A=vJ5sJpHi_8)@(>)Tm&f3tghO-EUc>mhhL9z5AOvWd12K?G9YRh8X;2u}5@ zYwUEXsJ|rZOYA;OV-fm=M88T1OA*biAgCTGL|T~ND-3-P(ci)u@3OAA+BNhS5^mVlj+a9Z zCf9%pOSE-4sBJ}dKqg8_QKqci)D1^g6mw0*4oYn!6|=G%>oS5_jEZFxxnwmPKvuC- ztzwqFvE%RhwCq^SW-GA@_LsWxK!W=3r=+V+~Pew+{(flp#ujT6lA2 zF^nt&h9RMtO`cUT0lAR5;Y^+~S#2Nd(zDtbyEJYVy(q!LjHmuAhHF_=u#lhes56mg zR3^eAYnFO}XO>)xAwU8Zs~|Da&{CPGVmf5aW>U;6i=mB-i-i=mib26rg2}N^!P-q0 zmH%I>d4GGb7u^R2YQtjY8U@!zpbUz|l+aHIEk{|%rq}H5!FCzOEbB#C#hB7YH32I4 zV#r=hMQ+<4v&~D~gDjKlaGQ-R7ELN97t69FWFep885xQ!)mjXfT4FP{bfkffw3xYc zr34iuh%vOt+5K69G84_Z^pd5_B%yP81TlvaDNq~m!iji6W-n2p-h zrw4)5>QJE;i!2tOZem!?weY5BF<{ElL8%QXM!UFX(Wxa=tC#@ZJX$t_&Bm0*OKsO~ z5LHMIurj%pou4JL5?hldvQblH#^(n(QY^x1Q6>R-ek`qtc^SrH=4wD{*@jIn3iqU3 zD?^H`skC(^(3U(!9$S+r1F|(@oU6T1o9!NoZPKKag+lfww%Cwa%)$7~p%@FpH5IFn z3t0jJPNQNjEDgh0j8FGah{os3r zb|4EkyE^uQvMrH>wnjE(iJVF(MnXKU0$C_+V|Jt|%QfH(Ta)q3Rl6(RHvzSMW!NakmWcyj5FT6oqF6;SrA8U6p>+P!Xp)UC(bxkgse_G+mNpv;s>U_r4MdiE(JL4~Z8 zO9IP|Bw-dj_LurZSuEQh36yoDxz>icMn)7KF(X64N>NfVDkic_icLyI*%a6rrb3oP z>Mjw_5?0IMN|?)&)v}yR1r}xS5TJt>X=NwM>RB5p-fl#ZX9w9cM6uISWr(JvCW>*_ zr9P`BWxb@@NOdn2$fjav;8H;hscaT<3kqbEEtYZ_f&H~OP0L}=RG??4u};WFnMapl zu-K#~B9R?Xloq_KfF)RVa|hz3$coXB^=B34HXmu7+C5|kWu<5hJ;h9qY|2WVW=Gm0 zP$40e7CT7wjGkF3J)=zIvX^YxMEzw|EWvV+mt`(xB#6mk<19yHT&rm7rjFFYI1&n$ z$)^$)%U%WX08_q+UG>ZbU|v?Y>+TVi6sKjCsgQ-M3SwpSr!06zwsUb&A(pbFr$lq7saj&FC`P+buv)Z+Ub9qlmLt(4 z)@)gYxzy4D7Fk(#uUXdI>_PBaP;AB7iniCB*;HZjw1(A!A~LOU1~H=`pR%$76RD)g z*Wj7Xw%M!FWh%z0Hiwd!9 ze_4tpvaS-AKlRtt(%%&pse6Eb!(=NE zZENjXs(H4yZR{1##>dT$MFMNr-A_?Uy)cKhrbISto*cU594@A`^s?C z-|AN7%2s!@a$$2&zg&B~vOZktJ#}gQTX$VJdgRHY$G5k)s!LT>ojiW+;*t8F^^KLs zR)+oIa(`o7bq9mxV<%V7u00wd{q1a(^~?_gwox^RtKKq{9 uyE-U8aeLjxxPH-nQNJ|1;m_isrfhLw@o;ngrJh|}SU7O&fBqbPf%k7az{Owy literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/langhebrewmodel 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/langhebrewmodel 2.py new file mode 100644 index 0000000..58f4c87 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/langhebrewmodel 2.py @@ -0,0 +1,200 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Simon Montagu +# Portions created by the Initial Developer are Copyright (C) 2005 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# Shoshannah Forbes - original C code (?) +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# 255: Control characters that usually does not exist in any text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 + +# Windows-1255 language model +# Character Mapping Table: +WIN1255_CHAR_TO_ORDER_MAP = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 69, 91, 79, 80, 92, 89, 97, 90, 68,111,112, 82, 73, 95, 85, # 40 + 78,121, 86, 71, 67,102,107, 84,114,103,115,253,253,253,253,253, # 50 +253, 50, 74, 60, 61, 42, 76, 70, 64, 53,105, 93, 56, 65, 54, 49, # 60 + 66,110, 51, 43, 44, 63, 81, 77, 98, 75,108,253,253,253,253,253, # 70 +124,202,203,204,205, 40, 58,206,207,208,209,210,211,212,213,214, +215, 83, 52, 47, 46, 72, 32, 94,216,113,217,109,218,219,220,221, + 34,116,222,118,100,223,224,117,119,104,125,225,226, 87, 99,227, +106,122,123,228, 55,229,230,101,231,232,120,233, 48, 39, 57,234, + 30, 59, 41, 88, 33, 37, 36, 31, 29, 35,235, 62, 28,236,126,237, +238, 38, 45,239,240,241,242,243,127,244,245,246,247,248,249,250, + 9, 8, 20, 16, 3, 2, 24, 14, 22, 1, 25, 15, 4, 11, 6, 23, + 12, 19, 13, 26, 18, 27, 21, 17, 7, 10, 5,251,252,128, 96,253, +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 98.4004% +# first 1024 sequences: 1.5981% +# rest sequences: 0.087% +# negative sequences: 0.0015% +HEBREW_LANG_MODEL = ( +0,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,2,3,2,1,2,0,1,0,0, +3,0,3,1,0,0,1,3,2,0,1,1,2,0,2,2,2,1,1,1,1,2,1,1,1,2,0,0,2,2,0,1, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2, +1,2,1,2,1,2,0,0,2,0,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2, +1,2,1,3,1,1,0,0,2,0,0,0,1,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,0,1,2,2,1,3, +1,2,1,1,2,2,0,0,2,2,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,1,0,1,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,2,2,2,2,3,2, +1,2,1,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,2,3,2,2,3,2,2,2,1,2,2,2,2, +1,2,1,1,2,2,0,1,2,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,0,2,2,2,2,2, +0,2,0,2,2,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,0,2,2,2, +0,2,1,2,2,2,0,0,2,1,0,0,0,0,1,0,1,0,0,0,0,0,0,2,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,2,1,2,3,2,2,2, +1,2,1,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,0, +3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,1,0,2,0,2, +0,2,1,2,2,2,0,0,1,2,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,2,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,2,3,2,2,3,2,1,2,1,1,1, +0,1,1,1,1,1,3,0,1,0,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,1,1,0,0,1,0,0,1,0,0,0,0, +0,0,1,0,0,0,0,0,2,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2, +0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,2,3,3,3,2,1,2,3,3,2,3,3,3,3,2,3,2,1,2,0,2,1,2, +0,2,0,2,2,2,0,0,1,2,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0, +3,3,3,3,3,3,3,3,3,2,3,3,3,1,2,2,3,3,2,3,2,3,2,2,3,1,2,2,0,2,2,2, +0,2,1,2,2,2,0,0,1,2,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,1,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,2,2,2,3,3,3,3,1,3,2,2,2, +0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,3,3,3,2,3,2,2,2,1,2,2,0,2,2,2,2, +0,2,0,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,1,3,2,3,3,2,3,3,2,2,1,2,2,2,2,2,2, +0,2,1,2,1,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,2,3,2,3,3,2,3,3,3,3,2,3,2,3,3,3,3,3,2,2,2,2,2,2,2,1, +0,2,0,1,2,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,2,1,2,3,3,3,3,3,3,3,2,3,2,3,2,1,2,3,0,2,1,2,2, +0,2,1,1,2,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,2,0, +3,3,3,3,3,3,3,3,3,2,3,3,3,3,2,1,3,1,2,2,2,1,2,3,3,1,2,1,2,2,2,2, +0,1,1,1,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,0,2,3,3,3,1,3,3,3,1,2,2,2,2,1,1,2,2,2,2,2,2, +0,2,0,1,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,2,3,3,3,2,2,3,3,3,2,1,2,3,2,3,2,2,2,2,1,2,1,1,1,2,2, +0,2,1,1,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,1,0,0,0,0,0, +1,0,1,0,0,0,0,0,2,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,2,3,3,2,3,1,2,2,2,2,3,2,3,1,1,2,2,1,2,2,1,1,0,2,2,2,2, +0,1,0,1,2,2,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,0,0,1,1,0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,2,0, +0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,1,0,1,0,1,1,0,1,1,0,0,0,1,1,0,1,1,1,0,0,0,0,0,0,1,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,0,0,1,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +3,2,2,1,2,2,2,2,2,2,2,1,2,2,1,2,2,1,1,1,1,1,1,1,1,2,1,1,0,3,3,3, +0,3,0,2,2,2,2,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +2,2,2,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,2,1,2,2,2,1,1,1,2,0,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,0,2,2,0,0,0,0,0,0, +0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,1,0,2,1,0, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +0,3,1,1,2,2,2,2,2,1,2,2,2,1,1,2,2,2,2,2,2,2,1,2,2,1,0,1,1,1,1,0, +0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,1,1,1,1,2,1,1,2,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0, +0,0,2,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,0,0,1,1,0,0,0,0,0,0,1,0,0, +2,1,1,2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,1,2,1,2,1,1,1,1,0,0,0,0, +0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,2,1,2,2,2,2,2,2,2,2,2,2,1,2,1,2,1,1,2,1,1,1,2,1,2,1,2,0,1,0,1, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,1,2,2,2,1,2,2,2,2,2,2,2,2,1,2,1,1,1,1,1,1,2,1,2,1,1,0,1,0,1, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,1,2,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2, +0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,1,1,1,1,1,1,1,0,1,1,0,1,0,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,2,0,1,1,1,0,1,0,0,0,1,1,0,1,1,0,0,0,0,0,1,1,0,0, +0,1,1,1,2,1,2,2,2,0,2,0,2,0,1,1,2,1,1,1,1,2,1,0,1,1,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,1,0,0,0,0,0,1,0,1,2,2,0,1,0,0,1,1,2,2,1,2,0,2,0,0,0,1,2,0,1, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,2,0,2,1,2,0,2,0,0,1,1,1,1,1,1,0,1,0,0,0,1,0,0,1, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,1,0,0,0,0,0,1,0,2,1,1,0,1,0,0,1,1,1,2,2,0,0,1,0,0,0,1,0,0,1, +1,1,2,1,0,1,1,1,0,1,0,1,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,2,2,1, +0,2,0,1,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,1,0,0,1,0,1,1,1,1,0,0,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,1,1,1,1,1,1,1,1,2,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,1,1,1,0,1,1,0,1,0,0,0,1,1,0,1, +2,0,1,0,1,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,1,1,1,0,1,0,0,1,1,2,1,1,2,0,1,0,0,0,1,1,0,1, +1,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,0,0,2,1,1,2,0,2,0,0,0,1,1,0,1, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,2,1,1,0,1,0,0,2,2,1,2,1,1,0,1,0,0,0,1,1,0,1, +2,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,2,2,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,1,0,1, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,2,2,0,0,0,0,2,1,1,1,0,2,1,1,0,0,0,2,1,0,1, +1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,1,1,0,2,1,1,0,1,0,0,0,1,1,0,1, +2,2,1,1,1,0,1,1,0,1,1,0,1,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,2,1,1,0,1,0,0,1,1,0,1,2,1,0,2,0,0,0,1,1,0,1, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0, +0,1,0,0,2,0,2,1,1,0,1,0,1,0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,1,1,1,0,1,0,0,1,0,0,0,1,0,0,1, +1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,0,0,0,0,0,1,0,1,1,0,0,1,0,0,2,1,1,1,1,1,0,1,0,0,0,0,1,0,1, +0,1,1,1,2,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,2,1,0,0,0,0,0,1,1,1,1,1,0,1,0,0,0,1,1,0,0, +) + +Win1255HebrewModel = { + 'char_to_order_map': WIN1255_CHAR_TO_ORDER_MAP, + 'precedence_matrix': HEBREW_LANG_MODEL, + 'typical_positive_ratio': 0.984004, + 'keep_english_letter': False, + 'charset_name': "windows-1255", + 'language': 'Hebrew', +} diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/langhebrewmodel 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/langhebrewmodel 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..50bbbf3572c815979382f48dd09747a6b1e86fa2 GIT binary patch literal 23497 zcmeI4`Fm9L6~+f?vBlb2yYF_hsTIO*Ye7K>i)Cv7sc0DoW(Wfz2{V^qtZn_Ty0^Cd zsqXu3SGzB^RlA~g-WT=r^gQ2tpF5KwAw0svhxe@aoRgd6x0(Okg$sXj`{~ADytgvD)nzxR@J{%seij;omZ)Ur(=D$QvY7( zzwcM-Kd7wQH@{N9y|QcI$DJn4mxY&v7ll*8kZ^;rL)a55k9q z&kLUxz9f89_@wX&;UmI_gpUh<6s{6JDEvwIn($}gFT$n5BH>x#ufpGizYEU^Ul*Pi zUJ(8v{8RXs@NeNi!kdLR3GWmx66Oo%3GWr&D!f~mC%jL1oA3tV0%3vh9^oy*JA?~` z_X`&b9}wOpyj?h7SSY+v_^)uAaFfvaSILxj@NlhF&Bm+at$L$XJyx5rccRre*r+$g z4mLWjtkt}Ew5(Pqr5=UAA&%CWju}Ze-Q5+ObBa^)@#Sv>GQfooci;Hgcji z(%3#w>0IRWkB*l+{?h8D|4$BPSFK7Uzo@765vSCzE0lQnkec2g>=1SeHwxDaHDRBy zK^PY%gkfQeP!;wF+l49NI$@KrUN|Hi6?O|PVMJ&P#X~Mr%C*93VU2K^uvOS7tQA%Y zdVl-=lQ?(2TlKU%ggb@1gu8_S;Y#5i;a=fB;eO!(;X∾bGws;Zb3iutFFV77Lq& zON9NxW5RLaap9Qogz%*Bl<>6h`j6;y=STD@eL-&%ZW8oP4pch7H2f3$^e+zo_9zSg zmMNPY@~E})FDI+cP_O*1vNBwYaxzhyP6-V{Q%8ZL0gk48JdFnSIXUb$t0wcIJS4jX z6?Vf6%3WAGM1x6k2w;*js|QOxoYRF{d1hBwv4YofG7DOfl2RcVlVp6kDz(Cl`Iyv- z)7j)!Tr%Xb7Pa_L;Xwqfh=u?rDOQ*>b}Js_RfEa;M6En&P$Z`o#D`*Ee7UMbGAZoQ zAI19ahsn|e@Np)5Rs^gt9rX?H<(`CqlQC%!e8nbR`g64&yKsYWHB9f3o5z-Hgs(?c zq7^AUZr;Z-AIJT;RqB48nE*GXjJ3k)2%tg=X6Q@+MVB5A;b-(%OPRZP7W!EMq9~%N zjqst^7hkR_PIi07hoGXXRr{FC*Q2XLc<@kRA8Qd!B|AzW)N(8O;X}F1;3T1f zfED|qLQ1h2$}ritgkp1&-HMF}kQ@|dsPzi8vceaVi8_U7>JW~m0@M;sB?liS`}U}~ z1`UGGCLj;xfozgz<+V`GBZZ}BR`v0IVQEf60LA91Ll8xU`w_6>YHWlLRU9R+tfF7o zx2);uL$aH4E21Hp8@K{9rM!^?B%|2ZKFpxHiWVokGbwDDQXag-NvO@OAccOZgW+RH z`xx9N(QvDj+3#ffg|&)J2Dd6s=1eK&3FzXbLwlPcKp87IC79ue#nJAQ8Lh+(NMT=m z9LGc2v~n`QM=d@S6;>R_DFI>gT+?M`qdYgaf&j~uRj&0jLWPG+`NBzTa)?wEA5XIi zW$e*MReWs5unPMI(|e?RxdA_%Xizo*$=n5>^E{+gNU_P)f=S?vD4yoyq(UVQfLqYXV}agsE^NOw-PEGyF^7Q#nU^`$318j9!UU| zO2Oy6)O@Lw@U0PQLziGOP$&z5bJ;9D$=unTJ*+_LOG}jRDEm@x6E~oYruK!DT$3_V zQYth}rS#j!BiXX}8lE8ce$+B4o$U)Id2>;5zi<*(Wi6+WhoTFLvT!h)u1!57B-7<= zSFFWushPuqHpvTSDi9iwGPjl2^67H#=K$+-s}Kl>AnE`O$fFg$IiVPwwYVSA)aKlU zJQVBGnJ%sk4X903gedJ(ie#cGAJP7(nRtdLQeH)TE@8%Lo*=FHSBI4ee*u3`Qp=*YR_Exv9+rFu~ZO4Y8t(iXlbz^O`^I5AGtGYR+>eC;#x^2AP7}bYZc0Ob9 zRkSBNYH*^}oUCPy!O2={@X+{Z=d)qkgCi4z_2WlIZdq|?>5>CWmrqSiW=FCtyJGpt z!%I4UM#ctr4^A{E7B$D(S#5N5(Yg&o?VWq%^1te2qw^84twDY8YrT;T>O)=+`!ipU tX^h1aQ~vDN)g9}^Xyd9&J7csj*Cpl^{avuID0=S47R;YN@BG*P{txAR(zyTt literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/langhebrewmodel.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/langhebrewmodel.py new file mode 100644 index 0000000..58f4c87 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/langhebrewmodel.py @@ -0,0 +1,200 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Simon Montagu +# Portions created by the Initial Developer are Copyright (C) 2005 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# Shoshannah Forbes - original C code (?) +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# 255: Control characters that usually does not exist in any text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 + +# Windows-1255 language model +# Character Mapping Table: +WIN1255_CHAR_TO_ORDER_MAP = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 69, 91, 79, 80, 92, 89, 97, 90, 68,111,112, 82, 73, 95, 85, # 40 + 78,121, 86, 71, 67,102,107, 84,114,103,115,253,253,253,253,253, # 50 +253, 50, 74, 60, 61, 42, 76, 70, 64, 53,105, 93, 56, 65, 54, 49, # 60 + 66,110, 51, 43, 44, 63, 81, 77, 98, 75,108,253,253,253,253,253, # 70 +124,202,203,204,205, 40, 58,206,207,208,209,210,211,212,213,214, +215, 83, 52, 47, 46, 72, 32, 94,216,113,217,109,218,219,220,221, + 34,116,222,118,100,223,224,117,119,104,125,225,226, 87, 99,227, +106,122,123,228, 55,229,230,101,231,232,120,233, 48, 39, 57,234, + 30, 59, 41, 88, 33, 37, 36, 31, 29, 35,235, 62, 28,236,126,237, +238, 38, 45,239,240,241,242,243,127,244,245,246,247,248,249,250, + 9, 8, 20, 16, 3, 2, 24, 14, 22, 1, 25, 15, 4, 11, 6, 23, + 12, 19, 13, 26, 18, 27, 21, 17, 7, 10, 5,251,252,128, 96,253, +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 98.4004% +# first 1024 sequences: 1.5981% +# rest sequences: 0.087% +# negative sequences: 0.0015% +HEBREW_LANG_MODEL = ( +0,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,2,3,2,1,2,0,1,0,0, +3,0,3,1,0,0,1,3,2,0,1,1,2,0,2,2,2,1,1,1,1,2,1,1,1,2,0,0,2,2,0,1, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2, +1,2,1,2,1,2,0,0,2,0,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2, +1,2,1,3,1,1,0,0,2,0,0,0,1,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,0,1,2,2,1,3, +1,2,1,1,2,2,0,0,2,2,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,1,0,1,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,2,2,2,2,3,2, +1,2,1,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,2,3,2,2,3,2,2,2,1,2,2,2,2, +1,2,1,1,2,2,0,1,2,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,0,2,2,2,2,2, +0,2,0,2,2,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,0,2,2,2, +0,2,1,2,2,2,0,0,2,1,0,0,0,0,1,0,1,0,0,0,0,0,0,2,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,2,1,2,3,2,2,2, +1,2,1,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,0, +3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,1,0,2,0,2, +0,2,1,2,2,2,0,0,1,2,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,2,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,2,3,2,2,3,2,1,2,1,1,1, +0,1,1,1,1,1,3,0,1,0,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,1,1,0,0,1,0,0,1,0,0,0,0, +0,0,1,0,0,0,0,0,2,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2, +0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,2,3,3,3,2,1,2,3,3,2,3,3,3,3,2,3,2,1,2,0,2,1,2, +0,2,0,2,2,2,0,0,1,2,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0, +3,3,3,3,3,3,3,3,3,2,3,3,3,1,2,2,3,3,2,3,2,3,2,2,3,1,2,2,0,2,2,2, +0,2,1,2,2,2,0,0,1,2,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,1,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,2,2,2,3,3,3,3,1,3,2,2,2, +0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,3,3,3,2,3,2,2,2,1,2,2,0,2,2,2,2, +0,2,0,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,1,3,2,3,3,2,3,3,2,2,1,2,2,2,2,2,2, +0,2,1,2,1,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,2,3,2,3,3,2,3,3,3,3,2,3,2,3,3,3,3,3,2,2,2,2,2,2,2,1, +0,2,0,1,2,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,2,1,2,3,3,3,3,3,3,3,2,3,2,3,2,1,2,3,0,2,1,2,2, +0,2,1,1,2,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,2,0, +3,3,3,3,3,3,3,3,3,2,3,3,3,3,2,1,3,1,2,2,2,1,2,3,3,1,2,1,2,2,2,2, +0,1,1,1,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,0,2,3,3,3,1,3,3,3,1,2,2,2,2,1,1,2,2,2,2,2,2, +0,2,0,1,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,2,3,3,3,2,2,3,3,3,2,1,2,3,2,3,2,2,2,2,1,2,1,1,1,2,2, +0,2,1,1,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,1,0,0,0,0,0, +1,0,1,0,0,0,0,0,2,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,2,3,3,2,3,1,2,2,2,2,3,2,3,1,1,2,2,1,2,2,1,1,0,2,2,2,2, +0,1,0,1,2,2,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,0,0,1,1,0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,2,0, +0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,1,0,1,0,1,1,0,1,1,0,0,0,1,1,0,1,1,1,0,0,0,0,0,0,1,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,0,0,1,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +3,2,2,1,2,2,2,2,2,2,2,1,2,2,1,2,2,1,1,1,1,1,1,1,1,2,1,1,0,3,3,3, +0,3,0,2,2,2,2,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +2,2,2,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,2,1,2,2,2,1,1,1,2,0,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,0,2,2,0,0,0,0,0,0, +0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,1,0,2,1,0, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +0,3,1,1,2,2,2,2,2,1,2,2,2,1,1,2,2,2,2,2,2,2,1,2,2,1,0,1,1,1,1,0, +0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,1,1,1,1,2,1,1,2,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0, +0,0,2,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,0,0,1,1,0,0,0,0,0,0,1,0,0, +2,1,1,2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,1,2,1,2,1,1,1,1,0,0,0,0, +0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,2,1,2,2,2,2,2,2,2,2,2,2,1,2,1,2,1,1,2,1,1,1,2,1,2,1,2,0,1,0,1, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,1,2,2,2,1,2,2,2,2,2,2,2,2,1,2,1,1,1,1,1,1,2,1,2,1,1,0,1,0,1, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,1,2,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2, +0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,1,1,1,1,1,1,1,0,1,1,0,1,0,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,2,0,1,1,1,0,1,0,0,0,1,1,0,1,1,0,0,0,0,0,1,1,0,0, +0,1,1,1,2,1,2,2,2,0,2,0,2,0,1,1,2,1,1,1,1,2,1,0,1,1,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,1,0,0,0,0,0,1,0,1,2,2,0,1,0,0,1,1,2,2,1,2,0,2,0,0,0,1,2,0,1, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,2,0,2,1,2,0,2,0,0,1,1,1,1,1,1,0,1,0,0,0,1,0,0,1, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,1,0,0,0,0,0,1,0,2,1,1,0,1,0,0,1,1,1,2,2,0,0,1,0,0,0,1,0,0,1, +1,1,2,1,0,1,1,1,0,1,0,1,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,2,2,1, +0,2,0,1,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,1,0,0,1,0,1,1,1,1,0,0,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,1,1,1,1,1,1,1,1,2,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,1,1,1,0,1,1,0,1,0,0,0,1,1,0,1, +2,0,1,0,1,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,1,1,1,0,1,0,0,1,1,2,1,1,2,0,1,0,0,0,1,1,0,1, +1,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,0,0,2,1,1,2,0,2,0,0,0,1,1,0,1, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,2,1,1,0,1,0,0,2,2,1,2,1,1,0,1,0,0,0,1,1,0,1, +2,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,2,2,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,1,0,1, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,2,2,0,0,0,0,2,1,1,1,0,2,1,1,0,0,0,2,1,0,1, +1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,1,1,0,2,1,1,0,1,0,0,0,1,1,0,1, +2,2,1,1,1,0,1,1,0,1,1,0,1,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,2,1,1,0,1,0,0,1,1,0,1,2,1,0,2,0,0,0,1,1,0,1, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0, +0,1,0,0,2,0,2,1,1,0,1,0,1,0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,1,1,1,0,1,0,0,1,0,0,0,1,0,0,1, +1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,0,0,0,0,0,1,0,1,1,0,0,1,0,0,2,1,1,1,1,1,0,1,0,0,0,0,1,0,1, +0,1,1,1,2,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,2,1,0,0,0,0,0,1,1,1,1,1,0,1,0,0,0,1,1,0,0, +) + +Win1255HebrewModel = { + 'char_to_order_map': WIN1255_CHAR_TO_ORDER_MAP, + 'precedence_matrix': HEBREW_LANG_MODEL, + 'typical_positive_ratio': 0.984004, + 'keep_english_letter': False, + 'charset_name': "windows-1255", + 'language': 'Hebrew', +} diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/langhebrewmodel.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/langhebrewmodel.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a7a72db93f8f56c9ed6089c1395509787af715df GIT binary patch literal 23497 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 RXBW(yH)s1zzZSkI`!^fXEsy{J literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/langhungarianmodel.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/langhungarianmodel.py new file mode 100644 index 0000000..bb7c095 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/langhungarianmodel.py @@ -0,0 +1,225 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# 255: Control characters that usually does not exist in any text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 + +# Character Mapping Table: +Latin2_HungarianCharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 28, 40, 54, 45, 32, 50, 49, 38, 39, 53, 36, 41, 34, 35, 47, + 46, 71, 43, 33, 37, 57, 48, 64, 68, 55, 52,253,253,253,253,253, +253, 2, 18, 26, 17, 1, 27, 12, 20, 9, 22, 7, 6, 13, 4, 8, + 23, 67, 10, 5, 3, 21, 19, 65, 62, 16, 11,253,253,253,253,253, +159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174, +175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190, +191,192,193,194,195,196,197, 75,198,199,200,201,202,203,204,205, + 79,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220, +221, 51, 81,222, 78,223,224,225,226, 44,227,228,229, 61,230,231, +232,233,234, 58,235, 66, 59,236,237,238, 60, 69, 63,239,240,241, + 82, 14, 74,242, 70, 80,243, 72,244, 15, 83, 77, 84, 30, 76, 85, +245,246,247, 25, 73, 42, 24,248,249,250, 31, 56, 29,251,252,253, +) + +win1250HungarianCharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 28, 40, 54, 45, 32, 50, 49, 38, 39, 53, 36, 41, 34, 35, 47, + 46, 72, 43, 33, 37, 57, 48, 64, 68, 55, 52,253,253,253,253,253, +253, 2, 18, 26, 17, 1, 27, 12, 20, 9, 22, 7, 6, 13, 4, 8, + 23, 67, 10, 5, 3, 21, 19, 65, 62, 16, 11,253,253,253,253,253, +161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176, +177,178,179,180, 78,181, 69,182,183,184,185,186,187,188,189,190, +191,192,193,194,195,196,197, 76,198,199,200,201,202,203,204,205, + 81,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220, +221, 51, 83,222, 80,223,224,225,226, 44,227,228,229, 61,230,231, +232,233,234, 58,235, 66, 59,236,237,238, 60, 70, 63,239,240,241, + 84, 14, 75,242, 71, 82,243, 73,244, 15, 85, 79, 86, 30, 77, 87, +245,246,247, 25, 74, 42, 24,248,249,250, 31, 56, 29,251,252,253, +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 94.7368% +# first 1024 sequences:5.2623% +# rest sequences: 0.8894% +# negative sequences: 0.0009% +HungarianLangModel = ( +0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, +3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,2,2,3,3,1,1,2,2,2,2,2,1,2, +3,2,2,3,3,3,3,3,2,3,3,3,3,3,3,1,2,3,3,3,3,2,3,3,1,1,3,3,0,1,1,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0, +3,2,1,3,3,3,3,3,2,3,3,3,3,3,1,1,2,3,3,3,3,3,3,3,1,1,3,2,0,1,1,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,1,1,2,3,3,3,1,3,3,3,3,3,1,3,3,2,2,0,3,2,3, +0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,3,3,3,2,3,3,2,3,3,3,3,3,2,3,3,2,2,3,2,3,2,0,3,2,2, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0, +3,3,3,3,3,3,2,3,3,3,3,3,2,3,3,3,1,2,3,2,2,3,1,2,3,3,2,2,0,3,3,3, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,3,2,3,3,3,3,2,3,3,3,3,0,2,3,2, +0,0,0,1,1,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,1,1,1,3,3,2,1,3,2,2,3,2,1,3,2,2,1,0,3,3,1, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,2,2,3,3,3,3,3,1,2,3,3,3,3,1,2,1,3,3,3,3,2,2,3,1,1,3,2,0,1,1,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,2,1,3,3,3,3,3,2,2,1,3,3,3,0,1,1,2, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,2,3,3,3,2,0,3,2,3, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,1,0, +3,3,3,3,3,3,2,3,3,3,2,3,2,3,3,3,1,3,2,2,2,3,1,1,3,3,1,1,0,3,3,2, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,2,3,3,3,2,3,2,3,3,3,2,3,3,3,3,3,1,2,3,2,2,0,2,2,2, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,2,2,2,3,1,3,3,2,2,1,3,3,3,1,1,3,1,2,3,2,3,2,2,2,1,0,2,2,2, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, +3,1,1,3,3,3,3,3,1,2,3,3,3,3,1,2,1,3,3,3,2,2,3,2,1,0,3,2,0,1,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,1,3,3,3,3,3,1,2,3,3,3,3,1,1,0,3,3,3,3,0,2,3,0,0,2,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,2,3,3,2,2,2,2,3,3,0,1,2,3,2,3,2,2,3,2,1,2,0,2,2,2, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, +3,3,3,3,3,3,1,2,3,3,3,2,1,2,3,3,2,2,2,3,2,3,3,1,3,3,1,1,0,2,3,2, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,1,2,2,2,2,3,3,3,1,1,1,3,3,1,1,3,1,1,3,2,1,2,3,1,1,0,2,2,2, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,2,1,2,1,1,3,3,1,1,1,1,3,3,1,1,2,2,1,2,1,1,2,2,1,1,0,2,2,1, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,1,1,2,1,1,3,3,1,0,1,1,3,3,2,0,1,1,2,3,1,0,2,2,1,0,0,1,3,2, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,2,1,3,3,3,3,3,1,2,3,2,3,3,2,1,1,3,2,3,2,1,2,2,0,1,2,1,0,0,1,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,2,2,2,2,3,1,2,2,1,1,3,3,0,3,2,1,2,3,2,1,3,3,1,1,0,2,1,3, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,2,2,2,3,2,3,3,3,2,1,1,3,3,1,1,1,2,2,3,2,3,2,2,2,1,0,2,2,1, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +1,0,0,3,3,3,3,3,0,0,3,3,2,3,0,0,0,2,3,3,1,0,1,2,0,0,1,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,2,3,3,3,3,3,1,2,3,3,2,2,1,1,0,3,3,2,2,1,2,2,1,0,2,2,0,1,1,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,2,2,1,3,1,2,3,3,2,2,1,1,2,2,1,1,1,1,3,2,1,1,1,1,2,1,0,1,2,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +2,3,3,1,1,1,1,1,3,3,3,0,1,1,3,3,1,1,1,1,1,2,2,0,3,1,1,2,0,2,1,1, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,1,0,1,2,1,2,2,0,1,2,3,1,2,0,0,0,2,1,1,1,1,1,2,0,0,1,1,0,0,0,0, +1,2,1,2,2,2,1,2,1,2,0,2,0,2,2,1,1,2,1,1,2,1,1,1,0,1,0,0,0,1,1,0, +1,1,1,2,3,2,3,3,0,1,2,2,3,1,0,1,0,2,1,2,2,0,1,1,0,0,1,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,3,3,2,2,1,0,0,3,2,3,2,0,0,0,1,1,3,0,0,1,1,0,0,2,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,1,2,2,3,3,1,0,1,3,2,3,1,1,1,0,1,1,1,1,1,3,1,0,0,2,2,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,1,1,2,2,2,1,0,1,2,3,3,2,0,0,0,2,1,1,1,2,1,1,1,0,1,1,1,0,0,0, +1,2,2,2,2,2,1,1,1,2,0,2,1,1,1,1,1,2,1,1,1,1,1,1,0,1,1,1,0,0,1,1, +3,2,2,1,0,0,1,1,2,2,0,3,0,1,2,1,1,0,0,1,1,1,0,1,1,1,1,0,2,1,1,1, +2,2,1,1,1,2,1,2,1,1,1,1,1,1,1,2,1,1,1,2,3,1,1,1,1,1,1,1,1,1,0,1, +2,3,3,0,1,0,0,0,3,3,1,0,0,1,2,2,1,0,0,0,0,2,0,0,1,1,1,0,2,1,1,1, +2,1,1,1,1,1,1,2,1,1,0,1,1,0,1,1,1,0,1,2,1,1,0,1,1,1,1,1,1,1,0,1, +2,3,3,0,1,0,0,0,2,2,0,0,0,0,1,2,2,0,0,0,0,1,0,0,1,1,0,0,2,0,1,0, +2,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,2,0,1,1,1,1,1,0,1, +3,2,2,0,1,0,1,0,2,3,2,0,0,1,2,2,1,0,0,1,1,1,0,0,2,1,0,1,2,2,1,1, +2,1,1,1,1,1,1,2,1,1,1,1,1,1,0,2,1,0,1,1,0,1,1,1,0,1,1,2,1,1,0,1, +2,2,2,0,0,1,0,0,2,2,1,1,0,0,2,1,1,0,0,0,1,2,0,0,2,1,0,0,2,1,1,1, +2,1,1,1,1,2,1,2,1,1,1,2,2,1,1,2,1,1,1,2,1,1,1,1,1,1,1,1,1,1,0,1, +1,2,3,0,0,0,1,0,3,2,1,0,0,1,2,1,1,0,0,0,0,2,1,0,1,1,0,0,2,1,2,1, +1,1,0,0,0,1,0,1,1,1,1,1,2,0,0,1,0,0,0,2,0,0,1,1,1,1,1,1,1,1,0,1, +3,0,0,2,1,2,2,1,0,0,2,1,2,2,0,0,0,2,1,1,1,0,1,1,0,0,1,1,2,0,0,0, +1,2,1,2,2,1,1,2,1,2,0,1,1,1,1,1,1,1,1,1,2,1,1,0,0,1,1,1,1,0,0,1, +1,3,2,0,0,0,1,0,2,2,2,0,0,0,2,2,1,0,0,0,0,3,1,1,1,1,0,0,2,1,1,1, +2,1,0,1,1,1,0,1,1,1,1,1,1,1,0,2,1,0,0,1,0,1,1,0,1,1,1,1,1,1,0,1, +2,3,2,0,0,0,1,0,2,2,0,0,0,0,2,1,1,0,0,0,0,2,1,0,1,1,0,0,2,1,1,0, +2,1,1,1,1,2,1,2,1,2,0,1,1,1,0,2,1,1,1,2,1,1,1,1,0,1,1,1,1,1,0,1, +3,1,1,2,2,2,3,2,1,1,2,2,1,1,0,1,0,2,2,1,1,1,1,1,0,0,1,1,0,1,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,0,0,0,0,0,2,2,0,0,0,0,2,2,1,0,0,0,1,1,0,0,1,2,0,0,2,1,1,1, +2,2,1,1,1,2,1,2,1,1,0,1,1,1,1,2,1,1,1,2,1,1,1,1,0,1,2,1,1,1,0,1, +1,0,0,1,2,3,2,1,0,0,2,0,1,1,0,0,0,1,1,1,1,0,1,1,0,0,1,0,0,0,0,0, +1,2,1,2,1,2,1,1,1,2,0,2,1,1,1,0,1,2,0,0,1,1,1,0,0,0,0,0,0,0,0,0, +2,3,2,0,0,0,0,0,1,1,2,1,0,0,1,1,1,0,0,0,0,2,0,0,1,1,0,0,2,1,1,1, +2,1,1,1,1,1,1,2,1,0,1,1,1,1,0,2,1,1,1,1,1,1,0,1,0,1,1,1,1,1,0,1, +1,2,2,0,1,1,1,0,2,2,2,0,0,0,3,2,1,0,0,0,1,1,0,0,1,1,0,1,1,1,0,0, +1,1,0,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,0,0,1,1,1,0,1,0,1, +2,1,0,2,1,1,2,2,1,1,2,1,1,1,0,0,0,1,1,0,1,1,1,1,0,0,1,1,1,0,0,0, +1,2,2,2,2,2,1,1,1,2,0,2,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,0,0,1,0, +1,2,3,0,0,0,1,0,2,2,0,0,0,0,2,2,0,0,0,0,0,1,0,0,1,0,0,0,2,0,1,0, +2,1,1,1,1,1,0,2,0,0,0,1,2,1,1,1,1,0,1,2,0,1,0,1,0,1,1,1,0,1,0,1, +2,2,2,0,0,0,1,0,2,1,2,0,0,0,1,1,2,0,0,0,0,1,0,0,1,1,0,0,2,1,0,1, +2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,0,1,1,1,1,1,0,1, +1,2,2,0,0,0,1,0,2,2,2,0,0,0,1,1,0,0,0,0,0,1,1,0,2,0,0,1,1,1,0,1, +1,0,1,1,1,1,1,1,0,1,1,1,1,0,0,1,0,0,1,1,0,1,0,1,1,1,1,1,0,0,0,1, +1,0,0,1,0,1,2,1,0,0,1,1,1,2,0,0,0,1,1,0,1,0,1,1,0,0,1,0,0,0,0,0, +0,2,1,2,1,1,1,1,1,2,0,2,0,1,1,0,1,2,1,0,1,1,1,0,0,0,0,0,0,1,0,0, +2,1,1,0,1,2,0,0,1,1,1,0,0,0,1,1,0,0,0,0,0,1,0,0,1,0,0,0,2,1,0,1, +2,2,1,1,1,1,1,2,1,1,0,1,1,1,1,2,1,1,1,2,1,1,0,1,0,1,1,1,1,1,0,1, +1,2,2,0,0,0,0,0,1,1,0,0,0,0,2,1,0,0,0,0,0,2,0,0,2,2,0,0,2,0,0,1, +2,1,1,1,1,1,1,1,0,1,1,0,1,1,0,1,0,0,0,1,1,1,1,0,0,1,1,1,1,0,0,1, +1,1,2,0,0,3,1,0,2,1,1,1,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,1,0,1,0, +1,2,1,0,1,1,1,2,1,1,0,1,1,1,1,1,0,0,0,1,1,1,1,1,0,1,0,0,0,1,0,0, +2,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,2,0,0,0, +2,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,2,1,1,0,0,1,1,1,1,1,0,1, +2,1,1,1,2,1,1,1,0,1,1,2,1,0,0,0,0,1,1,1,1,0,1,0,0,0,0,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,1,0,1,1,1,1,1,0,0,1,1,2,1,0,0,0,1,1,0,0,0,1,1,0,0,1,0,1,0,0,0, +1,2,1,1,1,1,1,1,1,1,0,1,0,1,1,1,1,1,1,0,1,1,1,0,0,0,0,0,0,1,0,0, +2,0,0,0,1,1,1,1,0,0,1,1,0,0,0,0,0,1,1,1,2,0,0,1,0,0,1,0,1,0,0,0, +0,1,1,1,1,1,1,1,1,2,0,1,1,1,1,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0, +1,0,0,1,1,1,1,1,0,0,2,1,0,1,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0, +0,1,1,1,1,1,1,0,1,1,0,1,0,1,1,0,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0,0, +1,0,0,1,1,1,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +0,1,1,1,1,1,0,0,1,1,0,1,0,1,0,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0, +0,0,0,1,0,0,0,0,0,0,1,1,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,1,1,1,0,1,0,0,1,1,0,1,0,1,1,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0, +2,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,0,0,1,0,0,1,0,1,0,1,1,1,0,0,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,1,1,1,1,0,0,0,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0, +0,1,1,1,1,1,1,0,1,1,0,1,0,1,0,0,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0, +) + +Latin2HungarianModel = { + 'char_to_order_map': Latin2_HungarianCharToOrderMap, + 'precedence_matrix': HungarianLangModel, + 'typical_positive_ratio': 0.947368, + 'keep_english_letter': True, + 'charset_name': "ISO-8859-2", + 'language': 'Hungarian', +} + +Win1250HungarianModel = { + 'char_to_order_map': win1250HungarianCharToOrderMap, + 'precedence_matrix': HungarianLangModel, + 'typical_positive_ratio': 0.947368, + 'keep_english_letter': True, + 'charset_name': "windows-1250", + 'language': 'Hungarian', +} diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/langhungarianmodel.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/langhungarianmodel.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cf38f19269538fef483c78a6d0459261b98894e7 GIT binary patch literal 24981 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 RyI|hDIXiCtweSVmzX2s}EcXBa literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/langthaimodel 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/langthaimodel 2.py new file mode 100644 index 0000000..15f94c2 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/langthaimodel 2.py @@ -0,0 +1,199 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# 255: Control characters that usually does not exist in any text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 + +# The following result for thai was collected from a limited sample (1M). + +# Character Mapping Table: +TIS620CharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,182,106,107,100,183,184,185,101, 94,186,187,108,109,110,111, # 40 +188,189,190, 89, 95,112,113,191,192,193,194,253,253,253,253,253, # 50 +253, 64, 72, 73,114, 74,115,116,102, 81,201,117, 90,103, 78, 82, # 60 + 96,202, 91, 79, 84,104,105, 97, 98, 92,203,253,253,253,253,253, # 70 +209,210,211,212,213, 88,214,215,216,217,218,219,220,118,221,222, +223,224, 99, 85, 83,225,226,227,228,229,230,231,232,233,234,235, +236, 5, 30,237, 24,238, 75, 8, 26, 52, 34, 51,119, 47, 58, 57, + 49, 53, 55, 43, 20, 19, 44, 14, 48, 3, 17, 25, 39, 62, 31, 54, + 45, 9, 16, 2, 61, 15,239, 12, 42, 46, 18, 21, 76, 4, 66, 63, + 22, 10, 1, 36, 23, 13, 40, 27, 32, 35, 86,240,241,242,243,244, + 11, 28, 41, 29, 33,245, 50, 37, 6, 7, 67, 77, 38, 93,246,247, + 68, 56, 59, 65, 69, 60, 70, 80, 71, 87,248,249,250,251,252,253, +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 92.6386% +# first 1024 sequences:7.3177% +# rest sequences: 1.0230% +# negative sequences: 0.0436% +ThaiLangModel = ( +0,1,3,3,3,3,0,0,3,3,0,3,3,0,3,3,3,3,3,3,3,3,0,0,3,3,3,0,3,3,3,3, +0,3,3,0,0,0,1,3,0,3,3,2,3,3,0,1,2,3,3,3,3,0,2,0,2,0,0,3,2,1,2,2, +3,0,3,3,2,3,0,0,3,3,0,3,3,0,3,3,3,3,3,3,3,3,3,0,3,2,3,0,2,2,2,3, +0,2,3,0,0,0,0,1,0,1,2,3,1,1,3,2,2,0,1,1,0,0,1,0,0,0,0,0,0,0,1,1, +3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,3,3,2,3,2,3,3,2,2,2, +3,1,2,3,0,3,3,2,2,1,2,3,3,1,2,0,1,3,0,1,0,0,1,0,0,0,0,0,0,0,1,1, +3,3,2,2,3,3,3,3,1,2,3,3,3,3,3,2,2,2,2,3,3,2,2,3,3,2,2,3,2,3,2,2, +3,3,1,2,3,1,2,2,3,3,1,0,2,1,0,0,3,1,2,1,0,0,1,0,0,0,0,0,0,1,0,1, +3,3,3,3,3,3,2,2,3,3,3,3,2,3,2,2,3,3,2,2,3,2,2,2,2,1,1,3,1,2,1,1, +3,2,1,0,2,1,0,1,0,1,1,0,1,1,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0, +3,3,3,2,3,2,3,3,2,2,3,2,3,3,2,3,1,1,2,3,2,2,2,3,2,2,2,2,2,1,2,1, +2,2,1,1,3,3,2,1,0,1,2,2,0,1,3,0,0,0,1,1,0,0,0,0,0,2,3,0,0,2,1,1, +3,3,2,3,3,2,0,0,3,3,0,3,3,0,2,2,3,1,2,2,1,1,1,0,2,2,2,0,2,2,1,1, +0,2,1,0,2,0,0,2,0,1,0,0,1,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,2,3,3,2,0,0,3,3,0,2,3,0,2,1,2,2,2,2,1,2,0,0,2,2,2,0,2,2,1,1, +0,2,1,0,2,0,0,2,0,1,1,0,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0, +3,3,2,3,2,3,2,0,2,2,1,3,2,1,3,2,1,2,3,2,2,3,0,2,3,2,2,1,2,2,2,2, +1,2,2,0,0,0,0,2,0,1,2,0,1,1,1,0,1,0,3,1,1,0,0,0,0,0,0,0,0,0,1,0, +3,3,2,3,3,2,3,2,2,2,3,2,2,3,2,2,1,2,3,2,2,3,1,3,2,2,2,3,2,2,2,3, +3,2,1,3,0,1,1,1,0,2,1,1,1,1,1,0,1,0,1,1,0,0,0,0,0,0,0,0,0,2,0,0, +1,0,0,3,0,3,3,3,3,3,0,0,3,0,2,2,3,3,3,3,3,0,0,0,1,1,3,0,0,0,0,2, +0,0,1,0,0,0,0,0,0,0,2,3,0,0,0,3,0,2,0,0,0,0,0,3,0,0,0,0,0,0,0,0, +2,0,3,3,3,3,0,0,2,3,0,0,3,0,3,3,2,3,3,3,3,3,0,0,3,3,3,0,0,0,3,3, +0,0,3,0,0,0,0,2,0,0,2,1,1,3,0,0,1,0,0,2,3,0,1,0,0,0,0,0,0,0,1,0, +3,3,3,3,2,3,3,3,3,3,3,3,1,2,1,3,3,2,2,1,2,2,2,3,1,1,2,0,2,1,2,1, +2,2,1,0,0,0,1,1,0,1,0,1,1,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0, +3,0,2,1,2,3,3,3,0,2,0,2,2,0,2,1,3,2,2,1,2,1,0,0,2,2,1,0,2,1,2,2, +0,1,1,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,2,1,3,3,1,1,3,0,2,3,1,1,3,2,1,1,2,0,2,2,3,2,1,1,1,1,1,2, +3,0,0,1,3,1,2,1,2,0,3,0,0,0,1,0,3,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0, +3,3,1,1,3,2,3,3,3,1,3,2,1,3,2,1,3,2,2,2,2,1,3,3,1,2,1,3,1,2,3,0, +2,1,1,3,2,2,2,1,2,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2, +3,3,2,3,2,3,3,2,3,2,3,2,3,3,2,1,0,3,2,2,2,1,2,2,2,1,2,2,1,2,1,1, +2,2,2,3,0,1,3,1,1,1,1,0,1,1,0,2,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,2,3,2,2,1,1,3,2,3,2,3,2,0,3,2,2,1,2,0,2,2,2,1,2,2,2,2,1, +3,2,1,2,2,1,0,2,0,1,0,0,1,1,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,2,3,1,2,3,3,2,2,3,0,1,1,2,0,3,3,2,2,3,0,1,1,3,0,0,0,0, +3,1,0,3,3,0,2,0,2,1,0,0,3,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,2,3,2,3,3,0,1,3,1,1,2,1,2,1,1,3,1,1,0,2,3,1,1,1,1,1,1,1,1, +3,1,1,2,2,2,2,1,1,1,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +3,2,2,1,1,2,1,3,3,2,3,2,2,3,2,2,3,1,2,2,1,2,0,3,2,1,2,2,2,2,2,1, +3,2,1,2,2,2,1,1,1,1,0,0,1,1,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,1,3,3,0,2,1,0,3,2,0,0,3,1,0,1,1,0,1,0,0,0,0,0,1, +1,0,0,1,0,3,2,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,2,2,2,3,0,0,1,3,0,3,2,0,3,2,2,3,3,3,3,3,1,0,2,2,2,0,2,2,1,2, +0,2,3,0,0,0,0,1,0,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +3,0,2,3,1,3,3,2,3,3,0,3,3,0,3,2,2,3,2,3,3,3,0,0,2,2,3,0,1,1,1,3, +0,0,3,0,0,0,2,2,0,1,3,0,1,2,2,2,3,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1, +3,2,3,3,2,0,3,3,2,2,3,1,3,2,1,3,2,0,1,2,2,0,2,3,2,1,0,3,0,0,0,0, +3,0,0,2,3,1,3,0,0,3,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,3,2,2,2,1,2,0,1,3,1,1,3,1,3,0,0,2,1,1,1,1,2,1,1,1,0,2,1,0,1, +1,2,0,0,0,3,1,1,0,0,0,0,1,0,1,0,0,1,0,1,0,0,0,0,0,3,1,0,0,0,1,0, +3,3,3,3,2,2,2,2,2,1,3,1,1,1,2,0,1,1,2,1,2,1,3,2,0,0,3,1,1,1,1,1, +3,1,0,2,3,0,0,0,3,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,2,3,0,3,3,0,2,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,2,3,1,3,0,0,1,2,0,0,2,0,3,3,2,3,3,3,2,3,0,0,2,2,2,0,0,0,2,2, +0,0,1,0,0,0,0,3,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +0,0,0,3,0,2,0,0,0,0,0,0,0,0,0,0,1,2,3,1,3,3,0,0,1,0,3,0,0,0,0,0, +0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,1,2,3,1,2,3,1,0,3,0,2,2,1,0,2,1,1,2,0,1,0,0,1,1,1,1,0,1,0,0, +1,0,0,0,0,1,1,0,3,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,2,1,0,1,1,1,3,1,2,2,2,2,2,2,1,1,1,1,0,3,1,0,1,3,1,1,1,1, +1,1,0,2,0,1,3,1,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,1, +3,0,2,2,1,3,3,2,3,3,0,1,1,0,2,2,1,2,1,3,3,1,0,0,3,2,0,0,0,0,2,1, +0,1,0,0,0,0,1,2,0,1,1,3,1,1,2,2,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +0,0,3,0,0,1,0,0,0,3,0,0,3,0,3,1,0,1,1,1,3,2,0,0,0,3,0,0,0,0,2,0, +0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0, +3,3,1,3,2,1,3,3,1,2,2,0,1,2,1,0,1,2,0,0,0,0,0,3,0,0,0,3,0,0,0,0, +3,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,1,2,0,3,3,3,2,2,0,1,1,0,1,3,0,0,0,2,2,0,0,0,0,3,1,0,1,0,0,0, +0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,2,3,1,2,0,0,2,1,0,3,1,0,1,2,0,1,1,1,1,3,0,0,3,1,1,0,2,2,1,1, +0,2,0,0,0,0,0,1,0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,0,3,1,2,0,0,2,2,0,1,2,0,1,0,1,3,1,2,1,0,0,0,2,0,3,0,0,0,1,0, +0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,1,1,2,2,0,0,0,2,0,2,1,0,1,1,0,1,1,1,2,1,0,0,1,1,1,0,2,1,1,1, +0,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,1, +0,0,0,2,0,1,3,1,1,1,1,0,0,0,0,3,2,0,1,0,0,0,1,2,0,0,0,1,0,0,0,0, +0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,3,3,3,3,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,2,3,2,2,0,0,0,1,0,0,0,0,2,3,2,1,2,2,3,0,0,0,2,3,1,0,0,0,1,1, +0,0,1,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0, +3,3,2,2,0,1,0,0,0,0,2,0,2,0,1,0,0,0,1,1,0,0,0,2,1,0,1,0,1,1,0,0, +0,1,0,2,0,0,1,0,3,0,1,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,1,0,0,1,0,0,0,0,0,1,1,2,0,0,0,0,1,0,0,1,3,1,0,0,0,0,1,1,0,0, +0,1,0,0,0,0,3,0,0,0,0,0,0,3,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0, +3,3,1,1,1,1,2,3,0,0,2,1,1,1,1,1,0,2,1,1,0,0,0,2,1,0,1,2,1,1,0,1, +2,1,0,3,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,3,1,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1, +0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,2,0,0,0,0,0,0,1,2,1,0,1,1,0,2,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,2,0,0,0,1,3,0,1,0,0,0,2,0,0,0,0,0,0,0,1,2,0,0,0,0,0, +3,3,0,0,1,1,2,0,0,1,2,1,0,1,1,1,0,1,1,0,0,2,1,1,0,1,0,0,1,1,1,0, +0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,1,0,0,0,0,1,0,0,0,0,3,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0, +2,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,0,0,1,1,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,1,0,1,2,0,1,2,0,0,1,1,0,2,0,1,0,0,1,0,0,0,0,1,0,0,0,2,0,0,0,0, +1,0,0,1,0,1,1,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,1,0,0,0,0,0,0,0,1,1,0,1,1,0,2,1,3,0,0,0,0,1,1,0,0,0,0,0,0,0,3, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,1,0,1,0,0,2,0,0,2,0,0,1,1,2,0,0,1,1,0,0,0,1,0,0,0,1,1,0,0,0, +1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +1,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,1,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,3,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,0,0, +1,0,0,0,0,0,0,0,0,1,0,0,0,0,2,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,1,1,0,0,2,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +) + +TIS620ThaiModel = { + 'char_to_order_map': TIS620CharToOrderMap, + 'precedence_matrix': ThaiLangModel, + 'typical_positive_ratio': 0.926386, + 'keep_english_letter': False, + 'charset_name': "TIS-620", + 'language': 'Thai', +} diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/langthaimodel 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/langthaimodel 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6067dd46841fd92626a0eb08be09a6fd008537a0 GIT binary patch literal 23476 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 Lmo7Qr-M{|>zHZNp literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/langturkishmodel 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/langturkishmodel 2.py new file mode 100644 index 0000000..a427a45 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/langturkishmodel 2.py @@ -0,0 +1,193 @@ +# -*- coding: utf-8 -*- +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Özgür Baskın - Turkish Language Model +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# 255: Control characters that usually does not exist in any text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 + +# Character Mapping Table: +Latin5_TurkishCharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +255, 23, 37, 47, 39, 29, 52, 36, 45, 53, 60, 16, 49, 20, 46, 42, + 48, 69, 44, 35, 31, 51, 38, 62, 65, 43, 56,255,255,255,255,255, +255, 1, 21, 28, 12, 2, 18, 27, 25, 3, 24, 10, 5, 13, 4, 15, + 26, 64, 7, 8, 9, 14, 32, 57, 58, 11, 22,255,255,255,255,255, +180,179,178,177,176,175,174,173,172,171,170,169,168,167,166,165, +164,163,162,161,160,159,101,158,157,156,155,154,153,152,151,106, +150,149,148,147,146,145,144,100,143,142,141,140,139,138,137,136, + 94, 80, 93,135,105,134,133, 63,132,131,130,129,128,127,126,125, +124,104, 73, 99, 79, 85,123, 54,122, 98, 92,121,120, 91,103,119, + 68,118,117, 97,116,115, 50, 90,114,113,112,111, 55, 41, 40, 86, + 89, 70, 59, 78, 71, 82, 88, 33, 77, 66, 84, 83,110, 75, 61, 96, + 30, 67,109, 74, 87,102, 34, 95, 81,108, 76, 72, 17, 6, 19,107, +) + +TurkishLangModel = ( +3,2,3,3,3,1,3,3,3,3,3,3,3,3,2,1,1,3,3,1,3,3,0,3,3,3,3,3,0,3,1,3, +3,2,1,0,0,1,1,0,0,0,1,0,0,1,1,1,1,0,0,0,0,0,0,0,2,2,0,0,1,0,0,1, +3,2,2,3,3,0,3,3,3,3,3,3,3,2,3,1,0,3,3,1,3,3,0,3,3,3,3,3,0,3,0,3, +3,1,1,0,1,0,1,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,2,2,0,0,0,1,0,1, +3,3,2,3,3,0,3,3,3,3,3,3,3,2,3,1,1,3,3,0,3,3,1,2,3,3,3,3,0,3,0,3, +3,1,1,0,0,0,1,0,0,0,0,1,1,0,1,2,1,0,0,0,1,0,0,0,0,2,0,0,0,0,0,1, +3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,1,3,3,2,0,3,2,1,2,2,1,3,3,0,0,0,2, +2,2,0,1,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,1,0,0,1, +3,3,3,2,3,3,1,2,3,3,3,3,3,3,3,1,3,2,1,0,3,2,0,1,2,3,3,2,1,0,0,2, +2,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,2,0,0,0, +1,0,1,3,3,1,3,3,3,3,3,3,3,1,2,0,0,2,3,0,2,3,0,0,2,2,2,3,0,3,0,1, +2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,0,3,2,0,2,3,2,3,3,1,0,0,2, +3,2,0,0,1,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,1,1,1,0,2,0,0,1, +3,3,3,2,3,3,2,3,3,3,3,2,3,3,3,0,3,3,0,0,2,1,0,0,2,3,2,2,0,0,0,2, +2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,0,1,0,2,0,0,1, +3,3,3,2,3,3,3,3,3,3,3,2,3,3,3,0,3,2,0,1,3,2,1,1,3,2,3,2,1,0,0,2, +2,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, +3,3,3,2,3,3,3,3,3,3,3,2,3,3,3,0,3,2,2,0,2,3,0,0,2,2,2,2,0,0,0,2, +3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,1,0,0,0, +3,3,3,3,3,3,3,2,2,2,2,3,2,3,3,0,3,3,1,1,2,2,0,0,2,2,3,2,0,0,1,3, +0,3,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,1, +3,3,3,2,3,3,3,2,1,2,2,3,2,3,3,0,3,2,0,0,1,1,0,1,1,2,1,2,0,0,0,1, +0,3,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0, +3,3,3,2,3,3,2,3,2,2,2,3,3,3,3,1,3,1,1,0,3,2,1,1,3,3,2,3,1,0,0,1, +1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,0,1, +3,2,2,3,3,0,3,3,3,3,3,3,3,2,2,1,0,3,3,1,3,3,0,1,3,3,2,3,0,3,0,3, +2,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0, +2,2,2,3,3,0,3,3,3,3,3,3,3,3,3,0,0,3,2,0,3,3,0,3,2,3,3,3,0,3,1,3, +2,0,0,0,0,0,0,0,0,0,0,1,0,1,2,0,1,0,0,0,0,0,0,0,2,2,0,0,1,0,0,1, +3,3,3,1,2,3,3,1,0,0,1,0,0,3,3,2,3,0,0,2,0,0,2,0,2,0,0,0,2,0,2,0, +0,3,1,0,1,0,0,0,2,2,1,0,1,1,2,1,2,2,2,0,2,1,1,0,0,0,2,0,0,0,0,0, +1,2,1,3,3,0,3,3,3,3,3,2,3,0,0,0,0,2,3,0,2,3,1,0,2,3,1,3,0,3,0,2, +3,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,1,3,3,2,2,3,2,2,0,1,2,3,0,1,2,1,0,1,0,0,0,1,0,2,2,0,0,0,1, +1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0, +3,3,3,1,3,3,1,1,3,3,1,1,3,3,1,0,2,1,2,0,2,1,0,0,1,1,2,1,0,0,0,2, +2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,1,0,2,1,3,0,0,2,0,0,3,3,0,3,0,0,1,0,1,2,0,0,1,1,2,2,0,1,0, +0,1,2,1,1,0,1,0,1,1,1,1,1,0,1,1,1,2,2,1,2,0,1,0,0,0,0,0,0,1,0,0, +3,3,3,2,3,2,3,3,0,2,2,2,3,3,3,0,3,0,0,0,2,2,0,1,2,1,1,1,0,0,0,1, +0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, +3,3,3,3,3,3,2,1,2,2,3,3,3,3,2,0,2,0,0,0,2,2,0,0,2,1,3,3,0,0,1,1, +1,1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0, +1,1,2,3,3,0,3,3,3,3,3,3,2,2,0,2,0,2,3,2,3,2,2,2,2,2,2,2,1,3,2,3, +2,0,2,1,2,2,2,2,1,1,2,2,1,2,2,1,2,0,0,2,1,1,0,2,1,0,0,1,0,0,0,1, +2,3,3,1,1,1,0,1,1,1,2,3,2,1,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0, +0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,2,2,2,3,2,3,2,2,1,3,3,3,0,2,1,2,0,2,1,0,0,1,1,1,1,1,0,0,1, +2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,2,0,1,0,0,0, +3,3,3,2,3,3,3,3,3,2,3,1,2,3,3,1,2,0,0,0,0,0,0,0,3,2,1,1,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0, +3,3,3,2,2,3,3,2,1,1,1,1,1,3,3,0,3,1,0,0,1,1,0,0,3,1,2,1,0,0,0,0, +0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0, +3,3,3,2,2,3,2,2,2,3,2,1,1,3,3,0,3,0,0,0,0,1,0,0,3,1,1,2,0,0,0,1, +1,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +1,1,1,3,3,0,3,3,3,3,3,2,2,2,1,2,0,2,1,2,2,1,1,0,1,2,2,2,2,2,2,2, +0,0,2,1,2,1,2,1,0,1,1,3,1,2,1,1,2,0,0,2,0,1,0,1,0,1,0,0,0,1,0,1, +3,3,3,1,3,3,3,0,1,1,0,2,2,3,1,0,3,0,0,0,1,0,0,0,1,0,0,1,0,1,0,0, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,2,0,0,2,2,1,0,0,1,0,0,3,3,1,3,0,0,1,1,0,2,0,3,0,0,0,2,0,1,1, +0,1,2,0,1,2,2,0,2,2,2,2,1,0,2,1,1,0,2,0,2,1,2,0,0,0,0,0,0,0,0,0, +3,3,3,1,3,2,3,2,0,2,2,2,1,3,2,0,2,1,2,0,1,2,0,0,1,0,2,2,0,0,0,2, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0, +3,3,3,0,3,3,1,1,2,3,1,0,3,2,3,0,3,0,0,0,1,0,0,0,1,0,1,0,0,0,0,0, +1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,3,3,0,3,3,2,3,3,2,2,0,0,0,0,1,2,0,1,3,0,0,0,3,1,1,0,3,0,2, +2,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,1,2,2,1,0,3,1,1,1,1,3,3,2,3,0,0,1,0,1,2,0,2,2,0,2,2,0,2,1, +0,2,2,1,1,1,1,0,2,1,1,0,1,1,1,1,2,1,2,1,2,0,1,0,1,0,0,0,0,0,0,0, +3,3,3,0,1,1,3,0,0,1,1,0,0,2,2,0,3,0,0,1,1,0,1,0,0,0,0,0,2,0,0,0, +0,3,1,0,1,0,1,0,2,0,0,1,0,1,0,1,1,1,2,1,1,0,2,0,0,0,0,0,0,0,0,0, +3,3,3,0,2,0,2,0,1,1,1,0,0,3,3,0,2,0,0,1,0,0,2,1,1,0,1,0,1,0,1,0, +0,2,0,1,2,0,2,0,2,1,1,0,1,0,2,1,1,0,2,1,1,0,1,0,0,0,1,1,0,0,0,0, +3,2,3,0,1,0,0,0,0,0,0,0,0,1,2,0,1,0,0,1,0,0,1,0,0,0,0,0,2,0,0,0, +0,0,1,1,0,0,1,0,1,0,0,1,0,0,0,2,1,0,1,0,2,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,0,0,2,3,0,0,1,0,1,0,2,3,2,3,0,0,1,3,0,2,1,0,0,0,0,2,0,1,0, +0,2,1,0,0,1,1,0,2,1,0,0,1,0,0,1,1,0,1,1,2,0,1,0,0,0,0,1,0,0,0,0, +3,2,2,0,0,1,1,0,0,0,0,0,0,3,1,1,1,0,0,0,0,0,1,0,0,0,0,0,2,0,1,0, +0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0, +0,0,0,3,3,0,2,3,2,2,1,2,2,1,1,2,0,1,3,2,2,2,0,0,2,2,0,0,0,1,2,1, +3,0,2,1,1,0,1,1,1,0,1,2,2,2,1,1,2,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0, +0,1,1,2,3,0,3,3,3,2,2,2,2,1,0,1,0,1,0,1,2,2,0,0,2,2,1,3,1,1,2,1, +0,0,1,1,2,0,1,1,0,0,1,2,0,2,1,1,2,0,0,1,0,0,0,1,0,1,0,1,0,0,0,0, +3,3,2,0,0,3,1,0,0,0,0,0,0,3,2,1,2,0,0,1,0,0,2,0,0,0,0,0,2,0,1,0, +0,2,1,1,0,0,1,0,1,2,0,0,1,1,0,0,2,1,1,1,1,0,2,0,0,0,0,0,0,0,0,0, +3,3,2,0,0,1,0,0,0,0,1,0,0,3,3,2,2,0,0,1,0,0,2,0,1,0,0,0,2,0,1,0, +0,0,1,1,0,0,2,0,2,1,0,0,1,1,2,1,2,0,2,1,2,1,1,1,0,0,1,1,0,0,0,0, +3,3,2,0,0,2,2,0,0,0,1,1,0,2,2,1,3,1,0,1,0,1,2,0,0,0,0,0,1,0,1,0, +0,1,1,0,0,0,0,0,1,0,0,1,0,0,0,1,1,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,2,0,0,0,1,0,0,1,0,0,2,3,1,2,0,0,1,0,0,2,0,0,0,1,0,2,0,2,0, +0,1,1,2,2,1,2,0,2,1,1,0,0,1,1,0,1,1,1,1,2,1,1,0,0,0,0,0,0,0,0,0, +3,3,3,0,2,1,2,1,0,0,1,1,0,3,3,1,2,0,0,1,0,0,2,0,2,0,1,1,2,0,0,0, +0,0,1,1,1,1,2,0,1,1,0,1,1,1,1,0,0,0,1,1,1,0,1,0,0,0,1,0,0,0,0,0, +3,3,3,0,2,2,3,2,0,0,1,0,0,2,3,1,0,0,0,0,0,0,2,0,2,0,0,0,2,0,0,0, +0,1,1,0,0,0,1,0,0,1,0,1,1,0,1,0,1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0, +3,2,3,0,0,0,0,0,0,0,1,0,0,2,2,2,2,0,0,1,0,0,2,0,0,0,0,0,2,0,1,0, +0,0,2,1,1,0,1,0,2,1,1,0,0,1,1,2,1,0,2,0,2,0,1,0,0,0,2,0,0,0,0,0, +0,0,0,2,2,0,2,1,1,1,1,2,2,0,0,1,0,1,0,0,1,3,0,0,0,0,1,0,0,2,1,0, +0,0,1,0,1,0,0,0,0,0,2,1,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, +2,0,0,2,3,0,2,3,1,2,2,0,2,0,0,2,0,2,1,1,1,2,1,0,0,1,2,1,1,2,1,0, +1,0,2,0,1,0,1,1,0,0,2,2,1,2,1,1,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,0,2,1,2,0,0,0,1,0,0,3,2,0,1,0,0,1,0,0,2,0,0,0,1,2,1,0,1,0, +0,0,0,0,1,0,1,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,1,0,0,0,0,0,0,0,0,0, +0,0,0,2,2,0,2,2,1,1,0,1,1,1,1,1,0,0,1,2,1,1,1,0,1,0,0,0,1,1,1,1, +0,0,2,1,0,1,1,1,0,1,1,2,1,2,1,1,2,0,1,1,2,1,0,2,0,0,0,0,0,0,0,0, +3,2,2,0,0,2,0,0,0,0,0,0,0,2,2,0,2,0,0,1,0,0,2,0,0,0,0,0,2,0,0,0, +0,2,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0, +0,0,0,3,2,0,2,2,0,1,1,0,1,0,0,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0, +2,0,1,0,1,0,1,1,0,0,1,2,0,1,0,1,1,0,0,1,0,1,0,2,0,0,0,0,0,0,0,0, +2,2,2,0,1,1,0,0,0,1,0,0,0,1,2,0,1,0,0,1,0,0,1,0,0,0,0,1,2,0,1,0, +0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,1,0,1,0,2,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,2,1,0,1,1,1,0,0,0,0,1,2,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, +1,1,2,0,1,0,0,0,1,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,2,0,0,0,0,0,1, +0,0,1,2,2,0,2,1,2,1,1,2,2,0,0,0,0,1,0,0,1,1,0,0,2,0,0,0,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, +2,2,2,0,0,0,1,0,0,0,0,0,0,2,2,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,0,1,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,1,0,0,0,0,0,0,0,0,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +) + +Latin5TurkishModel = { + 'char_to_order_map': Latin5_TurkishCharToOrderMap, + 'precedence_matrix': TurkishLangModel, + 'typical_positive_ratio': 0.970290, + 'keep_english_letter': True, + 'charset_name': "ISO-8859-9", + 'language': 'Turkish', +} diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/langturkishmodel 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/langturkishmodel 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..61d4b057cc2459b8e1a4b4d5d9db960ff90211fb GIT binary patch literal 23493 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 f`m)l6Q}k(B*7bYE{$14*}}# literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/langturkishmodel.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/langturkishmodel.py new file mode 100644 index 0000000..a427a45 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/langturkishmodel.py @@ -0,0 +1,193 @@ +# -*- coding: utf-8 -*- +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Özgür Baskın - Turkish Language Model +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# 255: Control characters that usually does not exist in any text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 + +# Character Mapping Table: +Latin5_TurkishCharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +255, 23, 37, 47, 39, 29, 52, 36, 45, 53, 60, 16, 49, 20, 46, 42, + 48, 69, 44, 35, 31, 51, 38, 62, 65, 43, 56,255,255,255,255,255, +255, 1, 21, 28, 12, 2, 18, 27, 25, 3, 24, 10, 5, 13, 4, 15, + 26, 64, 7, 8, 9, 14, 32, 57, 58, 11, 22,255,255,255,255,255, +180,179,178,177,176,175,174,173,172,171,170,169,168,167,166,165, +164,163,162,161,160,159,101,158,157,156,155,154,153,152,151,106, +150,149,148,147,146,145,144,100,143,142,141,140,139,138,137,136, + 94, 80, 93,135,105,134,133, 63,132,131,130,129,128,127,126,125, +124,104, 73, 99, 79, 85,123, 54,122, 98, 92,121,120, 91,103,119, + 68,118,117, 97,116,115, 50, 90,114,113,112,111, 55, 41, 40, 86, + 89, 70, 59, 78, 71, 82, 88, 33, 77, 66, 84, 83,110, 75, 61, 96, + 30, 67,109, 74, 87,102, 34, 95, 81,108, 76, 72, 17, 6, 19,107, +) + +TurkishLangModel = ( +3,2,3,3,3,1,3,3,3,3,3,3,3,3,2,1,1,3,3,1,3,3,0,3,3,3,3,3,0,3,1,3, +3,2,1,0,0,1,1,0,0,0,1,0,0,1,1,1,1,0,0,0,0,0,0,0,2,2,0,0,1,0,0,1, +3,2,2,3,3,0,3,3,3,3,3,3,3,2,3,1,0,3,3,1,3,3,0,3,3,3,3,3,0,3,0,3, +3,1,1,0,1,0,1,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,2,2,0,0,0,1,0,1, +3,3,2,3,3,0,3,3,3,3,3,3,3,2,3,1,1,3,3,0,3,3,1,2,3,3,3,3,0,3,0,3, +3,1,1,0,0,0,1,0,0,0,0,1,1,0,1,2,1,0,0,0,1,0,0,0,0,2,0,0,0,0,0,1, +3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,1,3,3,2,0,3,2,1,2,2,1,3,3,0,0,0,2, +2,2,0,1,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,1,0,0,1, +3,3,3,2,3,3,1,2,3,3,3,3,3,3,3,1,3,2,1,0,3,2,0,1,2,3,3,2,1,0,0,2, +2,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,2,0,0,0, +1,0,1,3,3,1,3,3,3,3,3,3,3,1,2,0,0,2,3,0,2,3,0,0,2,2,2,3,0,3,0,1, +2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,0,3,2,0,2,3,2,3,3,1,0,0,2, +3,2,0,0,1,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,1,1,1,0,2,0,0,1, +3,3,3,2,3,3,2,3,3,3,3,2,3,3,3,0,3,3,0,0,2,1,0,0,2,3,2,2,0,0,0,2, +2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,0,1,0,2,0,0,1, +3,3,3,2,3,3,3,3,3,3,3,2,3,3,3,0,3,2,0,1,3,2,1,1,3,2,3,2,1,0,0,2, +2,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, +3,3,3,2,3,3,3,3,3,3,3,2,3,3,3,0,3,2,2,0,2,3,0,0,2,2,2,2,0,0,0,2, +3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,1,0,0,0, +3,3,3,3,3,3,3,2,2,2,2,3,2,3,3,0,3,3,1,1,2,2,0,0,2,2,3,2,0,0,1,3, +0,3,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,1, +3,3,3,2,3,3,3,2,1,2,2,3,2,3,3,0,3,2,0,0,1,1,0,1,1,2,1,2,0,0,0,1, +0,3,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0, +3,3,3,2,3,3,2,3,2,2,2,3,3,3,3,1,3,1,1,0,3,2,1,1,3,3,2,3,1,0,0,1, +1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,0,1, +3,2,2,3,3,0,3,3,3,3,3,3,3,2,2,1,0,3,3,1,3,3,0,1,3,3,2,3,0,3,0,3, +2,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0, +2,2,2,3,3,0,3,3,3,3,3,3,3,3,3,0,0,3,2,0,3,3,0,3,2,3,3,3,0,3,1,3, +2,0,0,0,0,0,0,0,0,0,0,1,0,1,2,0,1,0,0,0,0,0,0,0,2,2,0,0,1,0,0,1, +3,3,3,1,2,3,3,1,0,0,1,0,0,3,3,2,3,0,0,2,0,0,2,0,2,0,0,0,2,0,2,0, +0,3,1,0,1,0,0,0,2,2,1,0,1,1,2,1,2,2,2,0,2,1,1,0,0,0,2,0,0,0,0,0, +1,2,1,3,3,0,3,3,3,3,3,2,3,0,0,0,0,2,3,0,2,3,1,0,2,3,1,3,0,3,0,2, +3,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,1,3,3,2,2,3,2,2,0,1,2,3,0,1,2,1,0,1,0,0,0,1,0,2,2,0,0,0,1, +1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0, +3,3,3,1,3,3,1,1,3,3,1,1,3,3,1,0,2,1,2,0,2,1,0,0,1,1,2,1,0,0,0,2, +2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,1,0,2,1,3,0,0,2,0,0,3,3,0,3,0,0,1,0,1,2,0,0,1,1,2,2,0,1,0, +0,1,2,1,1,0,1,0,1,1,1,1,1,0,1,1,1,2,2,1,2,0,1,0,0,0,0,0,0,1,0,0, +3,3,3,2,3,2,3,3,0,2,2,2,3,3,3,0,3,0,0,0,2,2,0,1,2,1,1,1,0,0,0,1, +0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, +3,3,3,3,3,3,2,1,2,2,3,3,3,3,2,0,2,0,0,0,2,2,0,0,2,1,3,3,0,0,1,1, +1,1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0, +1,1,2,3,3,0,3,3,3,3,3,3,2,2,0,2,0,2,3,2,3,2,2,2,2,2,2,2,1,3,2,3, +2,0,2,1,2,2,2,2,1,1,2,2,1,2,2,1,2,0,0,2,1,1,0,2,1,0,0,1,0,0,0,1, +2,3,3,1,1,1,0,1,1,1,2,3,2,1,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0, +0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,2,2,2,3,2,3,2,2,1,3,3,3,0,2,1,2,0,2,1,0,0,1,1,1,1,1,0,0,1, +2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,2,0,1,0,0,0, +3,3,3,2,3,3,3,3,3,2,3,1,2,3,3,1,2,0,0,0,0,0,0,0,3,2,1,1,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0, +3,3,3,2,2,3,3,2,1,1,1,1,1,3,3,0,3,1,0,0,1,1,0,0,3,1,2,1,0,0,0,0, +0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0, +3,3,3,2,2,3,2,2,2,3,2,1,1,3,3,0,3,0,0,0,0,1,0,0,3,1,1,2,0,0,0,1, +1,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +1,1,1,3,3,0,3,3,3,3,3,2,2,2,1,2,0,2,1,2,2,1,1,0,1,2,2,2,2,2,2,2, +0,0,2,1,2,1,2,1,0,1,1,3,1,2,1,1,2,0,0,2,0,1,0,1,0,1,0,0,0,1,0,1, +3,3,3,1,3,3,3,0,1,1,0,2,2,3,1,0,3,0,0,0,1,0,0,0,1,0,0,1,0,1,0,0, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,2,0,0,2,2,1,0,0,1,0,0,3,3,1,3,0,0,1,1,0,2,0,3,0,0,0,2,0,1,1, +0,1,2,0,1,2,2,0,2,2,2,2,1,0,2,1,1,0,2,0,2,1,2,0,0,0,0,0,0,0,0,0, +3,3,3,1,3,2,3,2,0,2,2,2,1,3,2,0,2,1,2,0,1,2,0,0,1,0,2,2,0,0,0,2, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0, +3,3,3,0,3,3,1,1,2,3,1,0,3,2,3,0,3,0,0,0,1,0,0,0,1,0,1,0,0,0,0,0, +1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,3,3,0,3,3,2,3,3,2,2,0,0,0,0,1,2,0,1,3,0,0,0,3,1,1,0,3,0,2, +2,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,1,2,2,1,0,3,1,1,1,1,3,3,2,3,0,0,1,0,1,2,0,2,2,0,2,2,0,2,1, +0,2,2,1,1,1,1,0,2,1,1,0,1,1,1,1,2,1,2,1,2,0,1,0,1,0,0,0,0,0,0,0, +3,3,3,0,1,1,3,0,0,1,1,0,0,2,2,0,3,0,0,1,1,0,1,0,0,0,0,0,2,0,0,0, +0,3,1,0,1,0,1,0,2,0,0,1,0,1,0,1,1,1,2,1,1,0,2,0,0,0,0,0,0,0,0,0, +3,3,3,0,2,0,2,0,1,1,1,0,0,3,3,0,2,0,0,1,0,0,2,1,1,0,1,0,1,0,1,0, +0,2,0,1,2,0,2,0,2,1,1,0,1,0,2,1,1,0,2,1,1,0,1,0,0,0,1,1,0,0,0,0, +3,2,3,0,1,0,0,0,0,0,0,0,0,1,2,0,1,0,0,1,0,0,1,0,0,0,0,0,2,0,0,0, +0,0,1,1,0,0,1,0,1,0,0,1,0,0,0,2,1,0,1,0,2,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,0,0,2,3,0,0,1,0,1,0,2,3,2,3,0,0,1,3,0,2,1,0,0,0,0,2,0,1,0, +0,2,1,0,0,1,1,0,2,1,0,0,1,0,0,1,1,0,1,1,2,0,1,0,0,0,0,1,0,0,0,0, +3,2,2,0,0,1,1,0,0,0,0,0,0,3,1,1,1,0,0,0,0,0,1,0,0,0,0,0,2,0,1,0, +0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0, +0,0,0,3,3,0,2,3,2,2,1,2,2,1,1,2,0,1,3,2,2,2,0,0,2,2,0,0,0,1,2,1, +3,0,2,1,1,0,1,1,1,0,1,2,2,2,1,1,2,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0, +0,1,1,2,3,0,3,3,3,2,2,2,2,1,0,1,0,1,0,1,2,2,0,0,2,2,1,3,1,1,2,1, +0,0,1,1,2,0,1,1,0,0,1,2,0,2,1,1,2,0,0,1,0,0,0,1,0,1,0,1,0,0,0,0, +3,3,2,0,0,3,1,0,0,0,0,0,0,3,2,1,2,0,0,1,0,0,2,0,0,0,0,0,2,0,1,0, +0,2,1,1,0,0,1,0,1,2,0,0,1,1,0,0,2,1,1,1,1,0,2,0,0,0,0,0,0,0,0,0, +3,3,2,0,0,1,0,0,0,0,1,0,0,3,3,2,2,0,0,1,0,0,2,0,1,0,0,0,2,0,1,0, +0,0,1,1,0,0,2,0,2,1,0,0,1,1,2,1,2,0,2,1,2,1,1,1,0,0,1,1,0,0,0,0, +3,3,2,0,0,2,2,0,0,0,1,1,0,2,2,1,3,1,0,1,0,1,2,0,0,0,0,0,1,0,1,0, +0,1,1,0,0,0,0,0,1,0,0,1,0,0,0,1,1,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,2,0,0,0,1,0,0,1,0,0,2,3,1,2,0,0,1,0,0,2,0,0,0,1,0,2,0,2,0, +0,1,1,2,2,1,2,0,2,1,1,0,0,1,1,0,1,1,1,1,2,1,1,0,0,0,0,0,0,0,0,0, +3,3,3,0,2,1,2,1,0,0,1,1,0,3,3,1,2,0,0,1,0,0,2,0,2,0,1,1,2,0,0,0, +0,0,1,1,1,1,2,0,1,1,0,1,1,1,1,0,0,0,1,1,1,0,1,0,0,0,1,0,0,0,0,0, +3,3,3,0,2,2,3,2,0,0,1,0,0,2,3,1,0,0,0,0,0,0,2,0,2,0,0,0,2,0,0,0, +0,1,1,0,0,0,1,0,0,1,0,1,1,0,1,0,1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0, +3,2,3,0,0,0,0,0,0,0,1,0,0,2,2,2,2,0,0,1,0,0,2,0,0,0,0,0,2,0,1,0, +0,0,2,1,1,0,1,0,2,1,1,0,0,1,1,2,1,0,2,0,2,0,1,0,0,0,2,0,0,0,0,0, +0,0,0,2,2,0,2,1,1,1,1,2,2,0,0,1,0,1,0,0,1,3,0,0,0,0,1,0,0,2,1,0, +0,0,1,0,1,0,0,0,0,0,2,1,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, +2,0,0,2,3,0,2,3,1,2,2,0,2,0,0,2,0,2,1,1,1,2,1,0,0,1,2,1,1,2,1,0, +1,0,2,0,1,0,1,1,0,0,2,2,1,2,1,1,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,0,2,1,2,0,0,0,1,0,0,3,2,0,1,0,0,1,0,0,2,0,0,0,1,2,1,0,1,0, +0,0,0,0,1,0,1,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,1,0,0,0,0,0,0,0,0,0, +0,0,0,2,2,0,2,2,1,1,0,1,1,1,1,1,0,0,1,2,1,1,1,0,1,0,0,0,1,1,1,1, +0,0,2,1,0,1,1,1,0,1,1,2,1,2,1,1,2,0,1,1,2,1,0,2,0,0,0,0,0,0,0,0, +3,2,2,0,0,2,0,0,0,0,0,0,0,2,2,0,2,0,0,1,0,0,2,0,0,0,0,0,2,0,0,0, +0,2,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0, +0,0,0,3,2,0,2,2,0,1,1,0,1,0,0,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0, +2,0,1,0,1,0,1,1,0,0,1,2,0,1,0,1,1,0,0,1,0,1,0,2,0,0,0,0,0,0,0,0, +2,2,2,0,1,1,0,0,0,1,0,0,0,1,2,0,1,0,0,1,0,0,1,0,0,0,0,1,2,0,1,0, +0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,1,0,1,0,2,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,2,1,0,1,1,1,0,0,0,0,1,2,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, +1,1,2,0,1,0,0,0,1,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,2,0,0,0,0,0,1, +0,0,1,2,2,0,2,1,2,1,1,2,2,0,0,0,0,1,0,0,1,1,0,0,2,0,0,0,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, +2,2,2,0,0,0,1,0,0,0,0,0,0,2,2,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,0,1,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,1,0,0,0,0,0,0,0,0,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +) + +Latin5TurkishModel = { + 'char_to_order_map': Latin5_TurkishCharToOrderMap, + 'precedence_matrix': TurkishLangModel, + 'typical_positive_ratio': 0.970290, + 'keep_english_letter': True, + 'charset_name': "ISO-8859-9", + 'language': 'Turkish', +} diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/langturkishmodel.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/langturkishmodel.pyc new file mode 100644 index 0000000000000000000000000000000000000000..80ced4230fcdf6e59aa59bc75481ec12dbe0f806 GIT binary patch literal 23493 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 literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/latin1prober 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/latin1prober 2.py new file mode 100644 index 0000000..7d1e8c2 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/latin1prober 2.py @@ -0,0 +1,145 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetprober import CharSetProber +from .enums import ProbingState + +FREQ_CAT_NUM = 4 + +UDF = 0 # undefined +OTH = 1 # other +ASC = 2 # ascii capital letter +ASS = 3 # ascii small letter +ACV = 4 # accent capital vowel +ACO = 5 # accent capital other +ASV = 6 # accent small vowel +ASO = 7 # accent small other +CLASS_NUM = 8 # total classes + +Latin1_CharToClass = ( + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 00 - 07 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 08 - 0F + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 10 - 17 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 18 - 1F + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 20 - 27 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 28 - 2F + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 30 - 37 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 38 - 3F + OTH, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 40 - 47 + ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 48 - 4F + ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 50 - 57 + ASC, ASC, ASC, OTH, OTH, OTH, OTH, OTH, # 58 - 5F + OTH, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 60 - 67 + ASS, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 68 - 6F + ASS, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 70 - 77 + ASS, ASS, ASS, OTH, OTH, OTH, OTH, OTH, # 78 - 7F + OTH, UDF, OTH, ASO, OTH, OTH, OTH, OTH, # 80 - 87 + OTH, OTH, ACO, OTH, ACO, UDF, ACO, UDF, # 88 - 8F + UDF, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 90 - 97 + OTH, OTH, ASO, OTH, ASO, UDF, ASO, ACO, # 98 - 9F + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # A0 - A7 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # A8 - AF + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # B0 - B7 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # B8 - BF + ACV, ACV, ACV, ACV, ACV, ACV, ACO, ACO, # C0 - C7 + ACV, ACV, ACV, ACV, ACV, ACV, ACV, ACV, # C8 - CF + ACO, ACO, ACV, ACV, ACV, ACV, ACV, OTH, # D0 - D7 + ACV, ACV, ACV, ACV, ACV, ACO, ACO, ACO, # D8 - DF + ASV, ASV, ASV, ASV, ASV, ASV, ASO, ASO, # E0 - E7 + ASV, ASV, ASV, ASV, ASV, ASV, ASV, ASV, # E8 - EF + ASO, ASO, ASV, ASV, ASV, ASV, ASV, OTH, # F0 - F7 + ASV, ASV, ASV, ASV, ASV, ASO, ASO, ASO, # F8 - FF +) + +# 0 : illegal +# 1 : very unlikely +# 2 : normal +# 3 : very likely +Latin1ClassModel = ( +# UDF OTH ASC ASS ACV ACO ASV ASO + 0, 0, 0, 0, 0, 0, 0, 0, # UDF + 0, 3, 3, 3, 3, 3, 3, 3, # OTH + 0, 3, 3, 3, 3, 3, 3, 3, # ASC + 0, 3, 3, 3, 1, 1, 3, 3, # ASS + 0, 3, 3, 3, 1, 2, 1, 2, # ACV + 0, 3, 3, 3, 3, 3, 3, 3, # ACO + 0, 3, 1, 3, 1, 1, 1, 3, # ASV + 0, 3, 1, 3, 1, 1, 3, 3, # ASO +) + + +class Latin1Prober(CharSetProber): + def __init__(self): + super(Latin1Prober, self).__init__() + self._last_char_class = None + self._freq_counter = None + self.reset() + + def reset(self): + self._last_char_class = OTH + self._freq_counter = [0] * FREQ_CAT_NUM + CharSetProber.reset(self) + + @property + def charset_name(self): + return "ISO-8859-1" + + @property + def language(self): + return "" + + def feed(self, byte_str): + byte_str = self.filter_with_english_letters(byte_str) + for c in byte_str: + char_class = Latin1_CharToClass[c] + freq = Latin1ClassModel[(self._last_char_class * CLASS_NUM) + + char_class] + if freq == 0: + self._state = ProbingState.NOT_ME + break + self._freq_counter[freq] += 1 + self._last_char_class = char_class + + return self.state + + def get_confidence(self): + if self.state == ProbingState.NOT_ME: + return 0.01 + + total = sum(self._freq_counter) + if total < 0.01: + confidence = 0.0 + else: + confidence = ((self._freq_counter[3] - self._freq_counter[1] * 20.0) + / total) + if confidence < 0.0: + confidence = 0.0 + # lower the confidence of latin1 so that other more accurate + # detector can take priority. + confidence = confidence * 0.73 + return confidence diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/latin1prober 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/latin1prober 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5ea4a1b6e6c72ea038ccf9304040d91babf9b9c7 GIT binary patch literal 4117 zcmdT`TW=dh6h5=Q#CGB&v}tHSR6JTp!HrVXf(lJ=QZ8zouuiC0wJeTz>}=Sqo!v=F zO2R|icm4^#0rAGq;E5lAc;`E394E>JkcgDvojIO4d**U(-`UI`<Ku5r=U!Y${2DnL{3tLi7A8BHkwI8o0X)yt`o~10h{Mx+-aDm z(P0*h5S>DY338dj9FshgAtnV7!wVlZO&HJE?FKl&%RWX=KL^psZCsA{a-PGOz=I5F zB)=m!20p;?m}U;Az=EuZ0S8ndMPyE+cKNtLe` zXj6^EH$8FnyS+V^uhK+MSwB+ORT0m?o~*gp^BoLePc|O>rl_OHI5ffY48a_mV#${l z(i;_CSC?=R{}}em^6IB9J4-_3p}Y8nUz=a`>uXCco7+VvmoFhEa*I4--sPHyFVsO# z`Q`-Ej2{_?15S*?HiS+3YNsVkKWi*c-@EtT`_nU436{MgI*I)`91xCv+}zSA$CR?i z$Qd~P9NiEChifYeeQJ;98x2V?_LboXt}n0pON%n}0T)I~?pdhgX@xB%aVmJXzGpP# z62K@x*6>x2!5oJ@qnwR!Oz5&uOz^m^b-?kNPV!aMm@2ChdO?lg$pYERHoVyZ+$A6m zFt7mu9Z@9Mx0900z$|`|?S~0sgk4XRe843Nu@b-C7eI-cvZ5$ZQ>aZ7Hz9okBKs(9 z*b|Gohl_9=n0cD8uNzWp>YeW=e){CM=dT_x*2vFRShjngb!V>gBj}_lukvNllxNr01qqlImbOU5u ZjXQZKuTDIfo9e$jw~F`{KlbFae*v>X5GMct literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/latin1prober.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/latin1prober.py new file mode 100644 index 0000000..7d1e8c2 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/latin1prober.py @@ -0,0 +1,145 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetprober import CharSetProber +from .enums import ProbingState + +FREQ_CAT_NUM = 4 + +UDF = 0 # undefined +OTH = 1 # other +ASC = 2 # ascii capital letter +ASS = 3 # ascii small letter +ACV = 4 # accent capital vowel +ACO = 5 # accent capital other +ASV = 6 # accent small vowel +ASO = 7 # accent small other +CLASS_NUM = 8 # total classes + +Latin1_CharToClass = ( + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 00 - 07 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 08 - 0F + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 10 - 17 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 18 - 1F + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 20 - 27 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 28 - 2F + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 30 - 37 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 38 - 3F + OTH, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 40 - 47 + ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 48 - 4F + ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 50 - 57 + ASC, ASC, ASC, OTH, OTH, OTH, OTH, OTH, # 58 - 5F + OTH, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 60 - 67 + ASS, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 68 - 6F + ASS, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 70 - 77 + ASS, ASS, ASS, OTH, OTH, OTH, OTH, OTH, # 78 - 7F + OTH, UDF, OTH, ASO, OTH, OTH, OTH, OTH, # 80 - 87 + OTH, OTH, ACO, OTH, ACO, UDF, ACO, UDF, # 88 - 8F + UDF, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 90 - 97 + OTH, OTH, ASO, OTH, ASO, UDF, ASO, ACO, # 98 - 9F + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # A0 - A7 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # A8 - AF + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # B0 - B7 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # B8 - BF + ACV, ACV, ACV, ACV, ACV, ACV, ACO, ACO, # C0 - C7 + ACV, ACV, ACV, ACV, ACV, ACV, ACV, ACV, # C8 - CF + ACO, ACO, ACV, ACV, ACV, ACV, ACV, OTH, # D0 - D7 + ACV, ACV, ACV, ACV, ACV, ACO, ACO, ACO, # D8 - DF + ASV, ASV, ASV, ASV, ASV, ASV, ASO, ASO, # E0 - E7 + ASV, ASV, ASV, ASV, ASV, ASV, ASV, ASV, # E8 - EF + ASO, ASO, ASV, ASV, ASV, ASV, ASV, OTH, # F0 - F7 + ASV, ASV, ASV, ASV, ASV, ASO, ASO, ASO, # F8 - FF +) + +# 0 : illegal +# 1 : very unlikely +# 2 : normal +# 3 : very likely +Latin1ClassModel = ( +# UDF OTH ASC ASS ACV ACO ASV ASO + 0, 0, 0, 0, 0, 0, 0, 0, # UDF + 0, 3, 3, 3, 3, 3, 3, 3, # OTH + 0, 3, 3, 3, 3, 3, 3, 3, # ASC + 0, 3, 3, 3, 1, 1, 3, 3, # ASS + 0, 3, 3, 3, 1, 2, 1, 2, # ACV + 0, 3, 3, 3, 3, 3, 3, 3, # ACO + 0, 3, 1, 3, 1, 1, 1, 3, # ASV + 0, 3, 1, 3, 1, 1, 3, 3, # ASO +) + + +class Latin1Prober(CharSetProber): + def __init__(self): + super(Latin1Prober, self).__init__() + self._last_char_class = None + self._freq_counter = None + self.reset() + + def reset(self): + self._last_char_class = OTH + self._freq_counter = [0] * FREQ_CAT_NUM + CharSetProber.reset(self) + + @property + def charset_name(self): + return "ISO-8859-1" + + @property + def language(self): + return "" + + def feed(self, byte_str): + byte_str = self.filter_with_english_letters(byte_str) + for c in byte_str: + char_class = Latin1_CharToClass[c] + freq = Latin1ClassModel[(self._last_char_class * CLASS_NUM) + + char_class] + if freq == 0: + self._state = ProbingState.NOT_ME + break + self._freq_counter[freq] += 1 + self._last_char_class = char_class + + return self.state + + def get_confidence(self): + if self.state == ProbingState.NOT_ME: + return 0.01 + + total = sum(self._freq_counter) + if total < 0.01: + confidence = 0.0 + else: + confidence = ((self._freq_counter[3] - self._freq_counter[1] * 20.0) + / total) + if confidence < 0.0: + confidence = 0.0 + # lower the confidence of latin1 so that other more accurate + # detector can take priority. + confidence = confidence * 0.73 + return confidence diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/latin1prober.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/latin1prober.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1809487aa1f3762341f70be8d5964d8da74580db GIT binary patch literal 4117 zcmdT`TW=dh6h5=Q#CEQ4Jo9cLKEDUiyEh_Qz}+1i{l+T8`f)Qcak?WWP1GURf z6Fw7uk@T^KL(z^g2h*W%ag%|79au5Y(Gv}Np`GMg&d|5m|CqcL8>1E}Z-Rme@+K*O zjG~sJV2oZ7y(Id^o1$Qx>g7q~Vu+liG7~cnQr&1Ib!{Fb-F2N<_88ba594;-G>i_j zV1(!tI!utu6y})ZnT#+gfEZqQzhT07-flO*0bcegdio`ZMsDMB#Fz6N#snT@NF(_j zxiRnoj>j}}Fa;K5MGSC|lR<&pdYR8}vMSv9T2=IP0mPsw+JpKIZ8~fO#v9CiY-{oShjD0p-()eVbz^O&m>V@x<2PYMzlmWgHuYPH z-twE>?bzr<_DXcBjkPW>Pj%EPgy|Rc)w!ED-~VuK-YUVe7eptqKZgUt(T^J)jdDyWdyJfc z<4@5IA#mW9i=+{IDQd*+?M7SoFh0u=z`;Op+ zL$mvcX-5PlxTp6r^!n_6mi7P~ioSO!dBpet;NS!pp$D$PrGfQHe> zvSq%~4RmC4jMJxjf4N?l1Y=(rj^Ntrn!j>ahCblJXvsYbbv!Mzr6f)T@78yXhFk&| z1;`q{>JgaZuxFIB5snF+7m5iUx3ms8KGPY#ikej8s)SxpV|cPaws9NY>;Uc(5c?R| zfPjuD671UbM9o@J6sTF$rs=DYz5% zMcso%I1bD_P21OXsWr9s57R$?_S^GUw;5~XXDck*z0bO_)PDTauYZ;w|9;zg=?dPt zl7*Ks5{ON=JK|6YGV4ZmsOh3ISnqY?Rv75GsV{)jCRjOOP;+pp7vS{WcS&WPNjR?P z%&HOo&y-Y|qq<*+8Msi0IV63*(+##GOr@Gh5fLd=Ih1d+>+(m5%g4EIFu4YDsK1QP zD{|%A;yc_Y7KpZyDEybX^4 literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/mbcharsetprober 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/mbcharsetprober 2.py new file mode 100644 index 0000000..6256ecf --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/mbcharsetprober 2.py @@ -0,0 +1,91 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# Proofpoint, Inc. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetprober import CharSetProber +from .enums import ProbingState, MachineState + + +class MultiByteCharSetProber(CharSetProber): + """ + MultiByteCharSetProber + """ + + def __init__(self, lang_filter=None): + super(MultiByteCharSetProber, self).__init__(lang_filter=lang_filter) + self.distribution_analyzer = None + self.coding_sm = None + self._last_char = [0, 0] + + def reset(self): + super(MultiByteCharSetProber, self).reset() + if self.coding_sm: + self.coding_sm.reset() + if self.distribution_analyzer: + self.distribution_analyzer.reset() + self._last_char = [0, 0] + + @property + def charset_name(self): + raise NotImplementedError + + @property + def language(self): + raise NotImplementedError + + def feed(self, byte_str): + for i in range(len(byte_str)): + coding_state = self.coding_sm.next_state(byte_str[i]) + if coding_state == MachineState.ERROR: + self.logger.debug('%s %s prober hit error at byte %s', + self.charset_name, self.language, i) + self._state = ProbingState.NOT_ME + break + elif coding_state == MachineState.ITS_ME: + self._state = ProbingState.FOUND_IT + break + elif coding_state == MachineState.START: + char_len = self.coding_sm.get_current_charlen() + if i == 0: + self._last_char[1] = byte_str[0] + self.distribution_analyzer.feed(self._last_char, char_len) + else: + self.distribution_analyzer.feed(byte_str[i - 1:i + 1], + char_len) + + self._last_char[0] = byte_str[-1] + + if self.state == ProbingState.DETECTING: + if (self.distribution_analyzer.got_enough_data() and + (self.get_confidence() > self.SHORTCUT_THRESHOLD)): + self._state = ProbingState.FOUND_IT + + return self.state + + def get_confidence(self): + return self.distribution_analyzer.get_confidence() diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/mbcharsetprober 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/mbcharsetprober 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..13ba17ba8568ae355abf23b6bf037095ad254826 GIT binary patch literal 3171 zcmd5;U2hXt5S?9bOcDYi2?U~k$W*H8hk`-0swx30ByNdR9JDrS8>ziod#{}}>s@E} zIwc5R3XlC!eeJ*KZ)kr&d(LcY0+ntkmPP)xHj3gdJ zlfs>Y*xZYXu62)!yl;!9&*3Eq_LFSXb&<0=@Gu(eC7G=T*0JK@EOp8KLucQxZ~~l` z?xU4m2rI-3xVyf@XXwN$cn}ah5CWa83t$s1#?NTC0*~%Iv2)pi#C25`CG0lmX}kfk z*ud}YXmn~oC~S=7CR%wH!r}4cIlk!27^t9oh?U2nV$=X!r66>e_GRSjIDiTwNn0Iv z7BY>pkr^hbvqgfgG|xb|If!yLwMEF4j$n;RvcwtV0(3fgX5A$yaZ>Caq}XC}&` z^zfN2+yZ6>d5jF0a^e>Gb{dt=43MoVNi+tZvjh%C!-THCw27aTg)oV?Y>9r&)U6iKR?rpWpM~^wA z%^cV)&Wjci#MZSYeQKq3Q{6e&r-vbT*GFh2y%lf6TfpCdJB{rm`ro4SkLbU|5(Ir* zlj37W847a3(M*#t4y0)7MDW@Ka)#$9FGv&f!aR4XJP=OEJX9&5R#*TI8QhQN> zkr$`TS0$FCZDg`&Vn3xgA zDgqp&&(`<9%L`>36avZtZKKV9*|tU{W-1eYC_$>+AB0vlgn3+7p)1PeM6JMiAldQc~LQ5(y#W9ZLJefQFSj< z=f|(e6EHQ?XZLFL4da3TZ^H(Z`{NIb{(&Et5a- zYi{5r<@Ew-wXTM4YBOaMW$4U4bq3t&Y{(?*(smf`gpRpR^U(;z&hN*zKO2STp@qv7 ztY=-*+3A^wZB;8ns&4nX9OZ`ka_4bp%WU`5Ot*J0>^W9C(3rujC{XBnLJ$_YK}k-J zo1wL_zNGl{c-dq2;M;eB=nh(W9fGIUy0`2t zfp?d@Ks8E^tauy#JKlMJ#a~7LlDGO6jv^CrBjVw00vnET=;*Oj9XSp3PZ?K*#I%c6 zag^6-@-#fUvyhf?XW@1-W|GIVlwIC&jEVDsF(Gw5`$L{s`WmVVS08uy+9qe1^+SJW zUA6!7!om{%0IlS1uh;7SQhi~5Iam%B-s|XHS#QX1+;c*#tV-Kvvq`D7tL3hjjML+r Urr~y#uePx# literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/mbcharsetprober.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/mbcharsetprober.py new file mode 100644 index 0000000..6256ecf --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/mbcharsetprober.py @@ -0,0 +1,91 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# Proofpoint, Inc. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetprober import CharSetProber +from .enums import ProbingState, MachineState + + +class MultiByteCharSetProber(CharSetProber): + """ + MultiByteCharSetProber + """ + + def __init__(self, lang_filter=None): + super(MultiByteCharSetProber, self).__init__(lang_filter=lang_filter) + self.distribution_analyzer = None + self.coding_sm = None + self._last_char = [0, 0] + + def reset(self): + super(MultiByteCharSetProber, self).reset() + if self.coding_sm: + self.coding_sm.reset() + if self.distribution_analyzer: + self.distribution_analyzer.reset() + self._last_char = [0, 0] + + @property + def charset_name(self): + raise NotImplementedError + + @property + def language(self): + raise NotImplementedError + + def feed(self, byte_str): + for i in range(len(byte_str)): + coding_state = self.coding_sm.next_state(byte_str[i]) + if coding_state == MachineState.ERROR: + self.logger.debug('%s %s prober hit error at byte %s', + self.charset_name, self.language, i) + self._state = ProbingState.NOT_ME + break + elif coding_state == MachineState.ITS_ME: + self._state = ProbingState.FOUND_IT + break + elif coding_state == MachineState.START: + char_len = self.coding_sm.get_current_charlen() + if i == 0: + self._last_char[1] = byte_str[0] + self.distribution_analyzer.feed(self._last_char, char_len) + else: + self.distribution_analyzer.feed(byte_str[i - 1:i + 1], + char_len) + + self._last_char[0] = byte_str[-1] + + if self.state == ProbingState.DETECTING: + if (self.distribution_analyzer.got_enough_data() and + (self.get_confidence() > self.SHORTCUT_THRESHOLD)): + self._state = ProbingState.FOUND_IT + + return self.state + + def get_confidence(self): + return self.distribution_analyzer.get_confidence() diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/mbcharsetprober.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/mbcharsetprober.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ce517525814198f6b4c8c1aca4770636d1ee40a0 GIT binary patch literal 3171 zcmd5;U2hvj6rEjfoR20=leB3gKI9@H{6OoL0u@qQK@&qG(M`2>1z3X7+B$koqJ{~f3B@O{q62gJvIAP@c&D+ zf+E7>s6?reqdJaq*mqUps!>ICDr)4Zj)&2TGLGsyD)Q7zrB0Okp|hZ(1=XroVI+1S z>J)YjV)ro2TgE=hv#!bOE{9hk*pJge%ZAp-z{9Y27^kKj*v5*7lf=gNr`Eh?;S4w} z-A5~05JnL%;C5UUEz*gX@W3N_AOt#7Re(*j7+;ib2_D@gV&}4D6;(x9Q9-M|MB_Dx zl^T9;MrdjpHzH^s^)~ zdC?e*8`05l@a)t6%^TgDx2Dr$JG9o`zV-9r4g3aaqum(C<7;tR*f2@1eRBJAzY}ms znm#sZl;sT~h>UHFy3`6|$Fg&-kEa25*GFgty;aVRvy8tUcN*JS^uI^vU(r9o5(Ir% zQTfM=G8E*5qp2ie=&8IZ6W%Km$QhnlUXUi{g?aYNJP=O6Jd`P*mKy*L7~Fsu0|r(~ zAz&uwBZ{oPYiI=(LxS*c6Dj!K*RMk*;mBq6pBg=f@1m^+h zV|b23dR09-+B$uEP2T=har*q5)9W&g)i4MI7g&uiJlX^o^1Hti6Z9Rf*dTr1p|+`p z8yMP0snx@b!Q+IKYRotbn?lNSZ!CHZRi)Ydiu($9)&xwlENuqCL13BdBpVDs?EHRYx|2b09$K(Y z!FrZ8{y|$mY>HYM5_P}b;wU%N*9VXNJ-y!+Gp+VlLEEy@fkyWxd5%Jt6N0eF4MK8q z-1Lo!O``=iC7-UwPG@A?#briw}q7$=O+K(fX_Ke-cQ0u`#(B6IA z*6jyD6P<7OB%(r}f{?KT_8ey`t{P>5&(1NqO3({dyavYk;M;eB=q_4u9fGIUwzKZ6 zf_GOPPc%x7Y&bjaJI;A`!`(#xlC$|1jv^CrBjVw00vnET@a0%4kDMC%bH-HxF?G;N zj&l4uPs7=rg|v)23%8Tjqb!;v?DCGIb(HnA4yeo7AMnJI*HBfs`q=3!o19^m5B-yM z(f-d13rqL|w1T_6TB*9L)#asiZ{1sd&zHNh+>l?p=LA?;mbOVJqe5y|%3UrQ^W&SO T;ZB*ad+*an-V-l4+m*ioBOcCC literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/mbcsgroupprober 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/mbcsgroupprober 2.py new file mode 100644 index 0000000..530abe7 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/mbcsgroupprober 2.py @@ -0,0 +1,54 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# Proofpoint, Inc. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetgroupprober import CharSetGroupProber +from .utf8prober import UTF8Prober +from .sjisprober import SJISProber +from .eucjpprober import EUCJPProber +from .gb2312prober import GB2312Prober +from .euckrprober import EUCKRProber +from .cp949prober import CP949Prober +from .big5prober import Big5Prober +from .euctwprober import EUCTWProber + + +class MBCSGroupProber(CharSetGroupProber): + def __init__(self, lang_filter=None): + super(MBCSGroupProber, self).__init__(lang_filter=lang_filter) + self.probers = [ + UTF8Prober(), + SJISProber(), + EUCJPProber(), + GB2312Prober(), + EUCKRProber(), + CP949Prober(), + Big5Prober(), + EUCTWProber() + ] + self.reset() diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/mbcsgroupprober 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/mbcsgroupprober 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dd3ef3ae6aa92803a29b8931c5ec391904e78b36 GIT binary patch literal 1477 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 literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/mbcssm.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/mbcssm.py new file mode 100644 index 0000000..8360d0f --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/mbcssm.py @@ -0,0 +1,572 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .enums import MachineState + +# BIG5 + +BIG5_CLS = ( + 1,1,1,1,1,1,1,1, # 00 - 07 #allow 0x00 as legal value + 1,1,1,1,1,1,0,0, # 08 - 0f + 1,1,1,1,1,1,1,1, # 10 - 17 + 1,1,1,0,1,1,1,1, # 18 - 1f + 1,1,1,1,1,1,1,1, # 20 - 27 + 1,1,1,1,1,1,1,1, # 28 - 2f + 1,1,1,1,1,1,1,1, # 30 - 37 + 1,1,1,1,1,1,1,1, # 38 - 3f + 2,2,2,2,2,2,2,2, # 40 - 47 + 2,2,2,2,2,2,2,2, # 48 - 4f + 2,2,2,2,2,2,2,2, # 50 - 57 + 2,2,2,2,2,2,2,2, # 58 - 5f + 2,2,2,2,2,2,2,2, # 60 - 67 + 2,2,2,2,2,2,2,2, # 68 - 6f + 2,2,2,2,2,2,2,2, # 70 - 77 + 2,2,2,2,2,2,2,1, # 78 - 7f + 4,4,4,4,4,4,4,4, # 80 - 87 + 4,4,4,4,4,4,4,4, # 88 - 8f + 4,4,4,4,4,4,4,4, # 90 - 97 + 4,4,4,4,4,4,4,4, # 98 - 9f + 4,3,3,3,3,3,3,3, # a0 - a7 + 3,3,3,3,3,3,3,3, # a8 - af + 3,3,3,3,3,3,3,3, # b0 - b7 + 3,3,3,3,3,3,3,3, # b8 - bf + 3,3,3,3,3,3,3,3, # c0 - c7 + 3,3,3,3,3,3,3,3, # c8 - cf + 3,3,3,3,3,3,3,3, # d0 - d7 + 3,3,3,3,3,3,3,3, # d8 - df + 3,3,3,3,3,3,3,3, # e0 - e7 + 3,3,3,3,3,3,3,3, # e8 - ef + 3,3,3,3,3,3,3,3, # f0 - f7 + 3,3,3,3,3,3,3,0 # f8 - ff +) + +BIG5_ST = ( + MachineState.ERROR,MachineState.START,MachineState.START, 3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07 + MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,#08-0f + MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START#10-17 +) + +BIG5_CHAR_LEN_TABLE = (0, 1, 1, 2, 0) + +BIG5_SM_MODEL = {'class_table': BIG5_CLS, + 'class_factor': 5, + 'state_table': BIG5_ST, + 'char_len_table': BIG5_CHAR_LEN_TABLE, + 'name': 'Big5'} + +# CP949 + +CP949_CLS = ( + 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,0,0, # 00 - 0f + 1,1,1,1,1,1,1,1, 1,1,1,0,1,1,1,1, # 10 - 1f + 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, # 20 - 2f + 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, # 30 - 3f + 1,4,4,4,4,4,4,4, 4,4,4,4,4,4,4,4, # 40 - 4f + 4,4,5,5,5,5,5,5, 5,5,5,1,1,1,1,1, # 50 - 5f + 1,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5, # 60 - 6f + 5,5,5,5,5,5,5,5, 5,5,5,1,1,1,1,1, # 70 - 7f + 0,6,6,6,6,6,6,6, 6,6,6,6,6,6,6,6, # 80 - 8f + 6,6,6,6,6,6,6,6, 6,6,6,6,6,6,6,6, # 90 - 9f + 6,7,7,7,7,7,7,7, 7,7,7,7,7,8,8,8, # a0 - af + 7,7,7,7,7,7,7,7, 7,7,7,7,7,7,7,7, # b0 - bf + 7,7,7,7,7,7,9,2, 2,3,2,2,2,2,2,2, # c0 - cf + 2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2, # d0 - df + 2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2, # e0 - ef + 2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,0, # f0 - ff +) + +CP949_ST = ( +#cls= 0 1 2 3 4 5 6 7 8 9 # previous state = + MachineState.ERROR,MachineState.START, 3,MachineState.ERROR,MachineState.START,MachineState.START, 4, 5,MachineState.ERROR, 6, # MachineState.START + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, # MachineState.ERROR + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME, # MachineState.ITS_ME + MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START, # 3 + MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START, # 4 + MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START, # 5 + MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START, # 6 +) + +CP949_CHAR_LEN_TABLE = (0, 1, 2, 0, 1, 1, 2, 2, 0, 2) + +CP949_SM_MODEL = {'class_table': CP949_CLS, + 'class_factor': 10, + 'state_table': CP949_ST, + 'char_len_table': CP949_CHAR_LEN_TABLE, + 'name': 'CP949'} + +# EUC-JP + +EUCJP_CLS = ( + 4,4,4,4,4,4,4,4, # 00 - 07 + 4,4,4,4,4,4,5,5, # 08 - 0f + 4,4,4,4,4,4,4,4, # 10 - 17 + 4,4,4,5,4,4,4,4, # 18 - 1f + 4,4,4,4,4,4,4,4, # 20 - 27 + 4,4,4,4,4,4,4,4, # 28 - 2f + 4,4,4,4,4,4,4,4, # 30 - 37 + 4,4,4,4,4,4,4,4, # 38 - 3f + 4,4,4,4,4,4,4,4, # 40 - 47 + 4,4,4,4,4,4,4,4, # 48 - 4f + 4,4,4,4,4,4,4,4, # 50 - 57 + 4,4,4,4,4,4,4,4, # 58 - 5f + 4,4,4,4,4,4,4,4, # 60 - 67 + 4,4,4,4,4,4,4,4, # 68 - 6f + 4,4,4,4,4,4,4,4, # 70 - 77 + 4,4,4,4,4,4,4,4, # 78 - 7f + 5,5,5,5,5,5,5,5, # 80 - 87 + 5,5,5,5,5,5,1,3, # 88 - 8f + 5,5,5,5,5,5,5,5, # 90 - 97 + 5,5,5,5,5,5,5,5, # 98 - 9f + 5,2,2,2,2,2,2,2, # a0 - a7 + 2,2,2,2,2,2,2,2, # a8 - af + 2,2,2,2,2,2,2,2, # b0 - b7 + 2,2,2,2,2,2,2,2, # b8 - bf + 2,2,2,2,2,2,2,2, # c0 - c7 + 2,2,2,2,2,2,2,2, # c8 - cf + 2,2,2,2,2,2,2,2, # d0 - d7 + 2,2,2,2,2,2,2,2, # d8 - df + 0,0,0,0,0,0,0,0, # e0 - e7 + 0,0,0,0,0,0,0,0, # e8 - ef + 0,0,0,0,0,0,0,0, # f0 - f7 + 0,0,0,0,0,0,0,5 # f8 - ff +) + +EUCJP_ST = ( + 3, 4, 3, 5,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.START,MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#10-17 + MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 3,MachineState.ERROR,#18-1f + 3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START#20-27 +) + +EUCJP_CHAR_LEN_TABLE = (2, 2, 2, 3, 1, 0) + +EUCJP_SM_MODEL = {'class_table': EUCJP_CLS, + 'class_factor': 6, + 'state_table': EUCJP_ST, + 'char_len_table': EUCJP_CHAR_LEN_TABLE, + 'name': 'EUC-JP'} + +# EUC-KR + +EUCKR_CLS = ( + 1,1,1,1,1,1,1,1, # 00 - 07 + 1,1,1,1,1,1,0,0, # 08 - 0f + 1,1,1,1,1,1,1,1, # 10 - 17 + 1,1,1,0,1,1,1,1, # 18 - 1f + 1,1,1,1,1,1,1,1, # 20 - 27 + 1,1,1,1,1,1,1,1, # 28 - 2f + 1,1,1,1,1,1,1,1, # 30 - 37 + 1,1,1,1,1,1,1,1, # 38 - 3f + 1,1,1,1,1,1,1,1, # 40 - 47 + 1,1,1,1,1,1,1,1, # 48 - 4f + 1,1,1,1,1,1,1,1, # 50 - 57 + 1,1,1,1,1,1,1,1, # 58 - 5f + 1,1,1,1,1,1,1,1, # 60 - 67 + 1,1,1,1,1,1,1,1, # 68 - 6f + 1,1,1,1,1,1,1,1, # 70 - 77 + 1,1,1,1,1,1,1,1, # 78 - 7f + 0,0,0,0,0,0,0,0, # 80 - 87 + 0,0,0,0,0,0,0,0, # 88 - 8f + 0,0,0,0,0,0,0,0, # 90 - 97 + 0,0,0,0,0,0,0,0, # 98 - 9f + 0,2,2,2,2,2,2,2, # a0 - a7 + 2,2,2,2,2,3,3,3, # a8 - af + 2,2,2,2,2,2,2,2, # b0 - b7 + 2,2,2,2,2,2,2,2, # b8 - bf + 2,2,2,2,2,2,2,2, # c0 - c7 + 2,3,2,2,2,2,2,2, # c8 - cf + 2,2,2,2,2,2,2,2, # d0 - d7 + 2,2,2,2,2,2,2,2, # d8 - df + 2,2,2,2,2,2,2,2, # e0 - e7 + 2,2,2,2,2,2,2,2, # e8 - ef + 2,2,2,2,2,2,2,2, # f0 - f7 + 2,2,2,2,2,2,2,0 # f8 - ff +) + +EUCKR_ST = ( + MachineState.ERROR,MachineState.START, 3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07 + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START #08-0f +) + +EUCKR_CHAR_LEN_TABLE = (0, 1, 2, 0) + +EUCKR_SM_MODEL = {'class_table': EUCKR_CLS, + 'class_factor': 4, + 'state_table': EUCKR_ST, + 'char_len_table': EUCKR_CHAR_LEN_TABLE, + 'name': 'EUC-KR'} + +# EUC-TW + +EUCTW_CLS = ( + 2,2,2,2,2,2,2,2, # 00 - 07 + 2,2,2,2,2,2,0,0, # 08 - 0f + 2,2,2,2,2,2,2,2, # 10 - 17 + 2,2,2,0,2,2,2,2, # 18 - 1f + 2,2,2,2,2,2,2,2, # 20 - 27 + 2,2,2,2,2,2,2,2, # 28 - 2f + 2,2,2,2,2,2,2,2, # 30 - 37 + 2,2,2,2,2,2,2,2, # 38 - 3f + 2,2,2,2,2,2,2,2, # 40 - 47 + 2,2,2,2,2,2,2,2, # 48 - 4f + 2,2,2,2,2,2,2,2, # 50 - 57 + 2,2,2,2,2,2,2,2, # 58 - 5f + 2,2,2,2,2,2,2,2, # 60 - 67 + 2,2,2,2,2,2,2,2, # 68 - 6f + 2,2,2,2,2,2,2,2, # 70 - 77 + 2,2,2,2,2,2,2,2, # 78 - 7f + 0,0,0,0,0,0,0,0, # 80 - 87 + 0,0,0,0,0,0,6,0, # 88 - 8f + 0,0,0,0,0,0,0,0, # 90 - 97 + 0,0,0,0,0,0,0,0, # 98 - 9f + 0,3,4,4,4,4,4,4, # a0 - a7 + 5,5,1,1,1,1,1,1, # a8 - af + 1,1,1,1,1,1,1,1, # b0 - b7 + 1,1,1,1,1,1,1,1, # b8 - bf + 1,1,3,1,3,3,3,3, # c0 - c7 + 3,3,3,3,3,3,3,3, # c8 - cf + 3,3,3,3,3,3,3,3, # d0 - d7 + 3,3,3,3,3,3,3,3, # d8 - df + 3,3,3,3,3,3,3,3, # e0 - e7 + 3,3,3,3,3,3,3,3, # e8 - ef + 3,3,3,3,3,3,3,3, # f0 - f7 + 3,3,3,3,3,3,3,0 # f8 - ff +) + +EUCTW_ST = ( + MachineState.ERROR,MachineState.ERROR,MachineState.START, 3, 3, 3, 4,MachineState.ERROR,#00-07 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.START,MachineState.ERROR,#10-17 + MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#18-1f + 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.START,MachineState.START,#20-27 + MachineState.START,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START #28-2f +) + +EUCTW_CHAR_LEN_TABLE = (0, 0, 1, 2, 2, 2, 3) + +EUCTW_SM_MODEL = {'class_table': EUCTW_CLS, + 'class_factor': 7, + 'state_table': EUCTW_ST, + 'char_len_table': EUCTW_CHAR_LEN_TABLE, + 'name': 'x-euc-tw'} + +# GB2312 + +GB2312_CLS = ( + 1,1,1,1,1,1,1,1, # 00 - 07 + 1,1,1,1,1,1,0,0, # 08 - 0f + 1,1,1,1,1,1,1,1, # 10 - 17 + 1,1,1,0,1,1,1,1, # 18 - 1f + 1,1,1,1,1,1,1,1, # 20 - 27 + 1,1,1,1,1,1,1,1, # 28 - 2f + 3,3,3,3,3,3,3,3, # 30 - 37 + 3,3,1,1,1,1,1,1, # 38 - 3f + 2,2,2,2,2,2,2,2, # 40 - 47 + 2,2,2,2,2,2,2,2, # 48 - 4f + 2,2,2,2,2,2,2,2, # 50 - 57 + 2,2,2,2,2,2,2,2, # 58 - 5f + 2,2,2,2,2,2,2,2, # 60 - 67 + 2,2,2,2,2,2,2,2, # 68 - 6f + 2,2,2,2,2,2,2,2, # 70 - 77 + 2,2,2,2,2,2,2,4, # 78 - 7f + 5,6,6,6,6,6,6,6, # 80 - 87 + 6,6,6,6,6,6,6,6, # 88 - 8f + 6,6,6,6,6,6,6,6, # 90 - 97 + 6,6,6,6,6,6,6,6, # 98 - 9f + 6,6,6,6,6,6,6,6, # a0 - a7 + 6,6,6,6,6,6,6,6, # a8 - af + 6,6,6,6,6,6,6,6, # b0 - b7 + 6,6,6,6,6,6,6,6, # b8 - bf + 6,6,6,6,6,6,6,6, # c0 - c7 + 6,6,6,6,6,6,6,6, # c8 - cf + 6,6,6,6,6,6,6,6, # d0 - d7 + 6,6,6,6,6,6,6,6, # d8 - df + 6,6,6,6,6,6,6,6, # e0 - e7 + 6,6,6,6,6,6,6,6, # e8 - ef + 6,6,6,6,6,6,6,6, # f0 - f7 + 6,6,6,6,6,6,6,0 # f8 - ff +) + +GB2312_ST = ( + MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START, 3,MachineState.ERROR,#00-07 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.START,#10-17 + 4,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#18-1f + MachineState.ERROR,MachineState.ERROR, 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,#20-27 + MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START #28-2f +) + +# To be accurate, the length of class 6 can be either 2 or 4. +# But it is not necessary to discriminate between the two since +# it is used for frequency analysis only, and we are validating +# each code range there as well. So it is safe to set it to be +# 2 here. +GB2312_CHAR_LEN_TABLE = (0, 1, 1, 1, 1, 1, 2) + +GB2312_SM_MODEL = {'class_table': GB2312_CLS, + 'class_factor': 7, + 'state_table': GB2312_ST, + 'char_len_table': GB2312_CHAR_LEN_TABLE, + 'name': 'GB2312'} + +# Shift_JIS + +SJIS_CLS = ( + 1,1,1,1,1,1,1,1, # 00 - 07 + 1,1,1,1,1,1,0,0, # 08 - 0f + 1,1,1,1,1,1,1,1, # 10 - 17 + 1,1,1,0,1,1,1,1, # 18 - 1f + 1,1,1,1,1,1,1,1, # 20 - 27 + 1,1,1,1,1,1,1,1, # 28 - 2f + 1,1,1,1,1,1,1,1, # 30 - 37 + 1,1,1,1,1,1,1,1, # 38 - 3f + 2,2,2,2,2,2,2,2, # 40 - 47 + 2,2,2,2,2,2,2,2, # 48 - 4f + 2,2,2,2,2,2,2,2, # 50 - 57 + 2,2,2,2,2,2,2,2, # 58 - 5f + 2,2,2,2,2,2,2,2, # 60 - 67 + 2,2,2,2,2,2,2,2, # 68 - 6f + 2,2,2,2,2,2,2,2, # 70 - 77 + 2,2,2,2,2,2,2,1, # 78 - 7f + 3,3,3,3,3,2,2,3, # 80 - 87 + 3,3,3,3,3,3,3,3, # 88 - 8f + 3,3,3,3,3,3,3,3, # 90 - 97 + 3,3,3,3,3,3,3,3, # 98 - 9f + #0xa0 is illegal in sjis encoding, but some pages does + #contain such byte. We need to be more error forgiven. + 2,2,2,2,2,2,2,2, # a0 - a7 + 2,2,2,2,2,2,2,2, # a8 - af + 2,2,2,2,2,2,2,2, # b0 - b7 + 2,2,2,2,2,2,2,2, # b8 - bf + 2,2,2,2,2,2,2,2, # c0 - c7 + 2,2,2,2,2,2,2,2, # c8 - cf + 2,2,2,2,2,2,2,2, # d0 - d7 + 2,2,2,2,2,2,2,2, # d8 - df + 3,3,3,3,3,3,3,3, # e0 - e7 + 3,3,3,3,3,4,4,4, # e8 - ef + 3,3,3,3,3,3,3,3, # f0 - f7 + 3,3,3,3,3,0,0,0) # f8 - ff + + +SJIS_ST = ( + MachineState.ERROR,MachineState.START,MachineState.START, 3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START #10-17 +) + +SJIS_CHAR_LEN_TABLE = (0, 1, 1, 2, 0, 0) + +SJIS_SM_MODEL = {'class_table': SJIS_CLS, + 'class_factor': 6, + 'state_table': SJIS_ST, + 'char_len_table': SJIS_CHAR_LEN_TABLE, + 'name': 'Shift_JIS'} + +# UCS2-BE + +UCS2BE_CLS = ( + 0,0,0,0,0,0,0,0, # 00 - 07 + 0,0,1,0,0,2,0,0, # 08 - 0f + 0,0,0,0,0,0,0,0, # 10 - 17 + 0,0,0,3,0,0,0,0, # 18 - 1f + 0,0,0,0,0,0,0,0, # 20 - 27 + 0,3,3,3,3,3,0,0, # 28 - 2f + 0,0,0,0,0,0,0,0, # 30 - 37 + 0,0,0,0,0,0,0,0, # 38 - 3f + 0,0,0,0,0,0,0,0, # 40 - 47 + 0,0,0,0,0,0,0,0, # 48 - 4f + 0,0,0,0,0,0,0,0, # 50 - 57 + 0,0,0,0,0,0,0,0, # 58 - 5f + 0,0,0,0,0,0,0,0, # 60 - 67 + 0,0,0,0,0,0,0,0, # 68 - 6f + 0,0,0,0,0,0,0,0, # 70 - 77 + 0,0,0,0,0,0,0,0, # 78 - 7f + 0,0,0,0,0,0,0,0, # 80 - 87 + 0,0,0,0,0,0,0,0, # 88 - 8f + 0,0,0,0,0,0,0,0, # 90 - 97 + 0,0,0,0,0,0,0,0, # 98 - 9f + 0,0,0,0,0,0,0,0, # a0 - a7 + 0,0,0,0,0,0,0,0, # a8 - af + 0,0,0,0,0,0,0,0, # b0 - b7 + 0,0,0,0,0,0,0,0, # b8 - bf + 0,0,0,0,0,0,0,0, # c0 - c7 + 0,0,0,0,0,0,0,0, # c8 - cf + 0,0,0,0,0,0,0,0, # d0 - d7 + 0,0,0,0,0,0,0,0, # d8 - df + 0,0,0,0,0,0,0,0, # e0 - e7 + 0,0,0,0,0,0,0,0, # e8 - ef + 0,0,0,0,0,0,0,0, # f0 - f7 + 0,0,0,0,0,0,4,5 # f8 - ff +) + +UCS2BE_ST = ( + 5, 7, 7,MachineState.ERROR, 4, 3,MachineState.ERROR,MachineState.ERROR,#00-07 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f + MachineState.ITS_ME,MachineState.ITS_ME, 6, 6, 6, 6,MachineState.ERROR,MachineState.ERROR,#10-17 + 6, 6, 6, 6, 6,MachineState.ITS_ME, 6, 6,#18-1f + 6, 6, 6, 6, 5, 7, 7,MachineState.ERROR,#20-27 + 5, 8, 6, 6,MachineState.ERROR, 6, 6, 6,#28-2f + 6, 6, 6, 6,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START #30-37 +) + +UCS2BE_CHAR_LEN_TABLE = (2, 2, 2, 0, 2, 2) + +UCS2BE_SM_MODEL = {'class_table': UCS2BE_CLS, + 'class_factor': 6, + 'state_table': UCS2BE_ST, + 'char_len_table': UCS2BE_CHAR_LEN_TABLE, + 'name': 'UTF-16BE'} + +# UCS2-LE + +UCS2LE_CLS = ( + 0,0,0,0,0,0,0,0, # 00 - 07 + 0,0,1,0,0,2,0,0, # 08 - 0f + 0,0,0,0,0,0,0,0, # 10 - 17 + 0,0,0,3,0,0,0,0, # 18 - 1f + 0,0,0,0,0,0,0,0, # 20 - 27 + 0,3,3,3,3,3,0,0, # 28 - 2f + 0,0,0,0,0,0,0,0, # 30 - 37 + 0,0,0,0,0,0,0,0, # 38 - 3f + 0,0,0,0,0,0,0,0, # 40 - 47 + 0,0,0,0,0,0,0,0, # 48 - 4f + 0,0,0,0,0,0,0,0, # 50 - 57 + 0,0,0,0,0,0,0,0, # 58 - 5f + 0,0,0,0,0,0,0,0, # 60 - 67 + 0,0,0,0,0,0,0,0, # 68 - 6f + 0,0,0,0,0,0,0,0, # 70 - 77 + 0,0,0,0,0,0,0,0, # 78 - 7f + 0,0,0,0,0,0,0,0, # 80 - 87 + 0,0,0,0,0,0,0,0, # 88 - 8f + 0,0,0,0,0,0,0,0, # 90 - 97 + 0,0,0,0,0,0,0,0, # 98 - 9f + 0,0,0,0,0,0,0,0, # a0 - a7 + 0,0,0,0,0,0,0,0, # a8 - af + 0,0,0,0,0,0,0,0, # b0 - b7 + 0,0,0,0,0,0,0,0, # b8 - bf + 0,0,0,0,0,0,0,0, # c0 - c7 + 0,0,0,0,0,0,0,0, # c8 - cf + 0,0,0,0,0,0,0,0, # d0 - d7 + 0,0,0,0,0,0,0,0, # d8 - df + 0,0,0,0,0,0,0,0, # e0 - e7 + 0,0,0,0,0,0,0,0, # e8 - ef + 0,0,0,0,0,0,0,0, # f0 - f7 + 0,0,0,0,0,0,4,5 # f8 - ff +) + +UCS2LE_ST = ( + 6, 6, 7, 6, 4, 3,MachineState.ERROR,MachineState.ERROR,#00-07 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f + MachineState.ITS_ME,MachineState.ITS_ME, 5, 5, 5,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,#10-17 + 5, 5, 5,MachineState.ERROR, 5,MachineState.ERROR, 6, 6,#18-1f + 7, 6, 8, 8, 5, 5, 5,MachineState.ERROR,#20-27 + 5, 5, 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 5, 5,#28-2f + 5, 5, 5,MachineState.ERROR, 5,MachineState.ERROR,MachineState.START,MachineState.START #30-37 +) + +UCS2LE_CHAR_LEN_TABLE = (2, 2, 2, 2, 2, 2) + +UCS2LE_SM_MODEL = {'class_table': UCS2LE_CLS, + 'class_factor': 6, + 'state_table': UCS2LE_ST, + 'char_len_table': UCS2LE_CHAR_LEN_TABLE, + 'name': 'UTF-16LE'} + +# UTF-8 + +UTF8_CLS = ( + 1,1,1,1,1,1,1,1, # 00 - 07 #allow 0x00 as a legal value + 1,1,1,1,1,1,0,0, # 08 - 0f + 1,1,1,1,1,1,1,1, # 10 - 17 + 1,1,1,0,1,1,1,1, # 18 - 1f + 1,1,1,1,1,1,1,1, # 20 - 27 + 1,1,1,1,1,1,1,1, # 28 - 2f + 1,1,1,1,1,1,1,1, # 30 - 37 + 1,1,1,1,1,1,1,1, # 38 - 3f + 1,1,1,1,1,1,1,1, # 40 - 47 + 1,1,1,1,1,1,1,1, # 48 - 4f + 1,1,1,1,1,1,1,1, # 50 - 57 + 1,1,1,1,1,1,1,1, # 58 - 5f + 1,1,1,1,1,1,1,1, # 60 - 67 + 1,1,1,1,1,1,1,1, # 68 - 6f + 1,1,1,1,1,1,1,1, # 70 - 77 + 1,1,1,1,1,1,1,1, # 78 - 7f + 2,2,2,2,3,3,3,3, # 80 - 87 + 4,4,4,4,4,4,4,4, # 88 - 8f + 4,4,4,4,4,4,4,4, # 90 - 97 + 4,4,4,4,4,4,4,4, # 98 - 9f + 5,5,5,5,5,5,5,5, # a0 - a7 + 5,5,5,5,5,5,5,5, # a8 - af + 5,5,5,5,5,5,5,5, # b0 - b7 + 5,5,5,5,5,5,5,5, # b8 - bf + 0,0,6,6,6,6,6,6, # c0 - c7 + 6,6,6,6,6,6,6,6, # c8 - cf + 6,6,6,6,6,6,6,6, # d0 - d7 + 6,6,6,6,6,6,6,6, # d8 - df + 7,8,8,8,8,8,8,8, # e0 - e7 + 8,8,8,8,8,9,8,8, # e8 - ef + 10,11,11,11,11,11,11,11, # f0 - f7 + 12,13,13,13,14,15,0,0 # f8 - ff +) + +UTF8_ST = ( + MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 12, 10,#00-07 + 9, 11, 8, 7, 6, 5, 4, 3,#08-0f + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#10-17 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#18-1f + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#20-27 + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#28-2f + MachineState.ERROR,MachineState.ERROR, 5, 5, 5, 5,MachineState.ERROR,MachineState.ERROR,#30-37 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#38-3f + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 5, 5, 5,MachineState.ERROR,MachineState.ERROR,#40-47 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#48-4f + MachineState.ERROR,MachineState.ERROR, 7, 7, 7, 7,MachineState.ERROR,MachineState.ERROR,#50-57 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#58-5f + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 7, 7,MachineState.ERROR,MachineState.ERROR,#60-67 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#68-6f + MachineState.ERROR,MachineState.ERROR, 9, 9, 9, 9,MachineState.ERROR,MachineState.ERROR,#70-77 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#78-7f + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 9,MachineState.ERROR,MachineState.ERROR,#80-87 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#88-8f + MachineState.ERROR,MachineState.ERROR, 12, 12, 12, 12,MachineState.ERROR,MachineState.ERROR,#90-97 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#98-9f + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 12,MachineState.ERROR,MachineState.ERROR,#a0-a7 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#a8-af + MachineState.ERROR,MachineState.ERROR, 12, 12, 12,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#b0-b7 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#b8-bf + MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,#c0-c7 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR #c8-cf +) + +UTF8_CHAR_LEN_TABLE = (0, 1, 0, 0, 0, 0, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6) + +UTF8_SM_MODEL = {'class_table': UTF8_CLS, + 'class_factor': 16, + 'state_table': UTF8_ST, + 'char_len_table': UTF8_CHAR_LEN_TABLE, + 'name': 'UTF-8'} diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/mbcssm.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/mbcssm.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8906c1efcbfbb75134ef15116a55ef634042b47f GIT binary patch literal 19168 zcmeHOZFAE`5MCw0d4WJEP@udu5QqsF=LG`H&`xn`D3AbSo9T=`)MIjXBF1@XECTf3 z^;EiYldMRH=`0!Rd0*a^oDB84%aN90m(v z2S8+CQ4E6^fyFxZjN%8@#<1}yh-0v5j)0f~b5t{V2z)beuO_g4*ijSXn!avkd^u{; zaoY8(xaKK8MDNXyDZ1Hx5sJeJT}^@#uG5dKwJm&D7$o2y7Z)UDfW;{(U;`X z@1#qQfw%$YIJuFWhNbkIG*iD+XE}~5bWB~2LJrgM!p#$c&XlA4Wg`pbaS+pBo?v2d zz7*^DL9vcKM9c|E%qdCC1PB~-Qj6U{tVdZL#e}Z!TGyBW6CH6A%u{R^dW!7AE0JB; zLw2D-Z+EYy@ZG6Ui$VTk!NX)?^al_*FfTBp=Y5P~4>5W{GK%~XqZdKk0rOG_ zqmk>i-7dW)iZi`k*AJZs-svub$b)%>=W)rm`mu-RaYfDp1BB-BBM6-QBxOT^5p>*{ zkW7)m=+&>U%eswWGUXrltz&wPQjozEXryYuHmqU_V?c=(GNk=p>=M>^0OnN?b6{R$ zl5p-?io_lw>6#=7*A0<01!5k|>+U3wC%kx~l@i8^oUSuzoD;w0gjCm{)9%H*5+tM2 z7~})revm*_A#0dYM|OG0RMpwK0b&8nX=V#a(AdHrVryEmh0BK6%7VBH=FPUHp+}4> z3tUxrFTi^ct}>i~oDI$+5xXv$KE=55UY;SGUUXdBJa71Dc6;Mm8>a6e_X47im5D%4 z2YPSs^8O-I@VM{ZZHq#{OGI@gZKs%b-$}>D*T+l5SMIENfY!Qch78cvgmQKfpJ*+7vV|-a_AxA0YOCwk zX1#3J?7D?@um-3YqGAvW`zRKx&04EfwQFyib$qyVM#{!UZPnh|VXYQnNG%(mnqhUl zwo`4^H=QPeELdyzY!WtW8+9v#f;CLV2oK}9U_p3SkgH0+=3-b$e^EM%r*R6(Keg3S>T5l>(a&wD?qE=ZhS~Mq%W^avCLB?7q zsF=W_MOUYB4_;;gd1AtPFAx+Y!Nh$Rcnr|x*e^Pa11c??m6eDH_8YIoelI9jaKcE7 zLqr7SoGj(TVCLc|=H4_#c9YD*67qp8aduwZBFrk)78m8<^pq_Di6T*MCwNcMp9Sx9 zx-58uq>3(4x*WzEGj-qMRIjSvxWq}2cCA{9^s=M2%~LdSuu@fSFZXBJt3}r(9s_ha zHXY_XF@23hsL1I>;)KkZp%;|Mv1;|CQo;ubPB;Bokh`;dvkrKb1BpY53{M}!@$M4X z@ubzyO-X+)p@3C^b(E+Yc!W)E!pseF6zNt%iTYOg_)@R~yRvDn+Vw zMErf5Tgl{+(>eGRr>T@MXLI)9B-5W?Ql?h*{};)<_$ZJpBiA`C>~Aw!MpDvcN17rN zrbtB?Gah;KQhJdppQA&WkxJcox@R8+HuOE?sa+%|OZ7~m5&(PJ)0279tI8jOVpJJV z>G?rpqbLBDc>0014Q7NojIv6lW+;?(kUt8%RD`)45RRZusy`-~^7xT9(e@$h~slIoVSQjY$=M zDl9w_vpF2h$BXKl?>AZ{g0ji_!n3FMs!Pjd?kko`uSzVHE00SRK4J8%Qm(EPZ6b|z z%N6^SD=+=_xKv#(zN}Ur7nX}Q%}DC3R99a8T3qIHNqnA(FG1InH3T{BRRSn% zVel~2^Vc4XtT`}Fm){tIakK(3FG@NL))WkNg~E_l0H*T04udrXLtUXTq~*d;*vR8s zj6*@?R1xTmss)hfxR$HuLJ_fLJo&{yvQB8(U3L-)ZI7w)5i8cWZy$ZOqNSom=?yY1e*d+xGp159_n|Z*4PQ z$!}ZRIcpP-`!$=n`TL76%@Q^7|LSgiQ*7Fl4V+xd;RtF6|?o$XJ&${uZOiTBO= z&lmCPt#!PaOdP>KUg_bL8Oj;6#^PXRV9Xfi*VrD2nIp5tBkxs6Fmf+DGec8o%dC+z z7WNf2muP-*tt2~>@U}NDd4f<8cOV!Z literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/sbcharsetprober 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/sbcharsetprober 2.py new file mode 100644 index 0000000..0adb51d --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/sbcharsetprober 2.py @@ -0,0 +1,132 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetprober import CharSetProber +from .enums import CharacterCategory, ProbingState, SequenceLikelihood + + +class SingleByteCharSetProber(CharSetProber): + SAMPLE_SIZE = 64 + SB_ENOUGH_REL_THRESHOLD = 1024 # 0.25 * SAMPLE_SIZE^2 + POSITIVE_SHORTCUT_THRESHOLD = 0.95 + NEGATIVE_SHORTCUT_THRESHOLD = 0.05 + + def __init__(self, model, reversed=False, name_prober=None): + super(SingleByteCharSetProber, self).__init__() + self._model = model + # TRUE if we need to reverse every pair in the model lookup + self._reversed = reversed + # Optional auxiliary prober for name decision + self._name_prober = name_prober + self._last_order = None + self._seq_counters = None + self._total_seqs = None + self._total_char = None + self._freq_char = None + self.reset() + + def reset(self): + super(SingleByteCharSetProber, self).reset() + # char order of last character + self._last_order = 255 + self._seq_counters = [0] * SequenceLikelihood.get_num_categories() + self._total_seqs = 0 + self._total_char = 0 + # characters that fall in our sampling range + self._freq_char = 0 + + @property + def charset_name(self): + if self._name_prober: + return self._name_prober.charset_name + else: + return self._model['charset_name'] + + @property + def language(self): + if self._name_prober: + return self._name_prober.language + else: + return self._model.get('language') + + def feed(self, byte_str): + if not self._model['keep_english_letter']: + byte_str = self.filter_international_words(byte_str) + if not byte_str: + return self.state + char_to_order_map = self._model['char_to_order_map'] + for i, c in enumerate(byte_str): + # XXX: Order is in range 1-64, so one would think we want 0-63 here, + # but that leads to 27 more test failures than before. + order = char_to_order_map[c] + # XXX: This was SYMBOL_CAT_ORDER before, with a value of 250, but + # CharacterCategory.SYMBOL is actually 253, so we use CONTROL + # to make it closer to the original intent. The only difference + # is whether or not we count digits and control characters for + # _total_char purposes. + if order < CharacterCategory.CONTROL: + self._total_char += 1 + if order < self.SAMPLE_SIZE: + self._freq_char += 1 + if self._last_order < self.SAMPLE_SIZE: + self._total_seqs += 1 + if not self._reversed: + i = (self._last_order * self.SAMPLE_SIZE) + order + model = self._model['precedence_matrix'][i] + else: # reverse the order of the letters in the lookup + i = (order * self.SAMPLE_SIZE) + self._last_order + model = self._model['precedence_matrix'][i] + self._seq_counters[model] += 1 + self._last_order = order + + charset_name = self._model['charset_name'] + if self.state == ProbingState.DETECTING: + if self._total_seqs > self.SB_ENOUGH_REL_THRESHOLD: + confidence = self.get_confidence() + if confidence > self.POSITIVE_SHORTCUT_THRESHOLD: + self.logger.debug('%s confidence = %s, we have a winner', + charset_name, confidence) + self._state = ProbingState.FOUND_IT + elif confidence < self.NEGATIVE_SHORTCUT_THRESHOLD: + self.logger.debug('%s confidence = %s, below negative ' + 'shortcut threshhold %s', charset_name, + confidence, + self.NEGATIVE_SHORTCUT_THRESHOLD) + self._state = ProbingState.NOT_ME + + return self.state + + def get_confidence(self): + r = 0.01 + if self._total_seqs > 0: + r = ((1.0 * self._seq_counters[SequenceLikelihood.POSITIVE]) / + self._total_seqs / self._model['typical_positive_ratio']) + r = r * self._freq_char / self._total_char + if r >= 1.0: + r = 0.99 + return r diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/sbcharsetprober 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/sbcharsetprober 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a55888d879bb4398815b4aec01659bd9927fa958 GIT binary patch literal 4050 zcmd5Xfw$A_7K^JzlS~*>!d& zNmG)i^iRM)=nKDrSAGUBNIU?QctwKmoN<~)6kdtfdpvXI%*?r;%sqMo8|o*ohH6MeBV zM%@B6t7AASQ~*^5b_!sw-%gvx-b<5JlUDgsdwPU!cdSY0+SUX~x??ASWvVa^nifcV z28gEF*fep+EQM<(3j0aYwHFu-qR8CZvF6C}M`XJNx~vaih(&@#D;^68aUdGRfgBLW zfc27y0^|gX0hv~cWPltK`LN}LOvewVlhmCMvMK5oWpI-GX7vOv3vV!>JW`9bIJ8<@Hlkinx+bzk9;Rl?q?zf8 zg>>9rH+m@6w7j>G#KyAZI%;QDCu!HDVtAdI4c$pLV;DJe6gIK#i1A0}9e9W>@d>?@ zxA2ttOHF2MRrq6&nW!gt#~QQzlrz5n8OExZl7MUrquMYHx8PB=t#(@LB@sBxYQeD9 z-53N9KkU7KW%d0Jc6PSxz*>9tgYEtme1f>vstv>8 zw8q?ajjd&?JOaZ`HSY~~eAeUJc(XD9sk5r+;ZcWAhl7OQr~dFMCeQH)cr6=U95+w| zy$=d()-q$^zs^hG6K(*Xa0Bs)rUYFh{0nEZzfqNS?X!l(`2Hy#u?BtSL&7dFR>zy` zy5oW~G?~xg>9gQAHCT2bc+YWD2Q#>U_gQtYaoLC*3E~t_5Q|P7 z5PT+kRVD~M(ZZgh7|V*XOM>^Dw@96w+4JbZp9J9@?fh52(U%_WEA!F% z9BurpMtjbSt}w*~ZVxud9>$!f{k+?G;c(~1FTy>RVZ$nWbi+8r^ z)GcXMIP|qmTxrwm?V)ryvNTLh$8@g)aR_P>hFO=2F^~%NUQf1pz z`t2=KX;-$xI7Suv_+JQDO_Xd`ViUA&2>Ps_q_(qZE4GiK*zco+;k@b#*zKb3MT~l3 z1ddU}0b}e-V$|Ag)Z@%md+Djz-wiUmNs-xoY0@}*%`G=t{_>Kfb}7}(n|JRm)pc`m zr7o%7)dxxctT0y%IDn)@n6J0$bFIb3ZP%RL()Gsj{o8l6UtiL#JAS=+XL)Jfa^2v< za;O&j5>WS+n~SZ*&v4nDWxq9dzxB)(PF_(G1h520Y1gc72GXo7EZ=X;>&2F9R#2hQ zFY;lH`t6(lby#D$rSI0OlDoNZ$ziMLBXwp|pVf$740TdqM=q6)#^+{Kj4PeWp$NyK z@<}7sGp2hNTuMJrYD%3^V`?0~Gr7{(G-lIy7#3AomA$e$t!C7e$8=}ZB=D1}Bs7yM zho_{@xr)J7=BzF$5{Zec0+Jzzmn1(9=YVq%W6+$Si$#Kwj6!sdk!ZD%cFyr8x33_b z3v%BGhs|pRIi-M>;6zQf^W*--~Q?0quCI*Q^0`e$*koXXLp8S2aY~WvXEm% z!?D98VEXd+zt2|LyItEN4Gaq+Hb3w>i67_U?4MHcrKJ%MNRNei{WriF6iFGgNHFWP z_ZEyeiKkKJPHfb`OAD-BFU=kNW@NPXDuUg@vLpcQ$%>669M^!W66vDOgl%b$@W&AE?F lP6eC_Gf9I!ySX&L(i9&bF~uU+oH0Lng~esLPpOx4e*;`nh$;X8 literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/sbcharsetprober.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/sbcharsetprober.py new file mode 100644 index 0000000..0adb51d --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/sbcharsetprober.py @@ -0,0 +1,132 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetprober import CharSetProber +from .enums import CharacterCategory, ProbingState, SequenceLikelihood + + +class SingleByteCharSetProber(CharSetProber): + SAMPLE_SIZE = 64 + SB_ENOUGH_REL_THRESHOLD = 1024 # 0.25 * SAMPLE_SIZE^2 + POSITIVE_SHORTCUT_THRESHOLD = 0.95 + NEGATIVE_SHORTCUT_THRESHOLD = 0.05 + + def __init__(self, model, reversed=False, name_prober=None): + super(SingleByteCharSetProber, self).__init__() + self._model = model + # TRUE if we need to reverse every pair in the model lookup + self._reversed = reversed + # Optional auxiliary prober for name decision + self._name_prober = name_prober + self._last_order = None + self._seq_counters = None + self._total_seqs = None + self._total_char = None + self._freq_char = None + self.reset() + + def reset(self): + super(SingleByteCharSetProber, self).reset() + # char order of last character + self._last_order = 255 + self._seq_counters = [0] * SequenceLikelihood.get_num_categories() + self._total_seqs = 0 + self._total_char = 0 + # characters that fall in our sampling range + self._freq_char = 0 + + @property + def charset_name(self): + if self._name_prober: + return self._name_prober.charset_name + else: + return self._model['charset_name'] + + @property + def language(self): + if self._name_prober: + return self._name_prober.language + else: + return self._model.get('language') + + def feed(self, byte_str): + if not self._model['keep_english_letter']: + byte_str = self.filter_international_words(byte_str) + if not byte_str: + return self.state + char_to_order_map = self._model['char_to_order_map'] + for i, c in enumerate(byte_str): + # XXX: Order is in range 1-64, so one would think we want 0-63 here, + # but that leads to 27 more test failures than before. + order = char_to_order_map[c] + # XXX: This was SYMBOL_CAT_ORDER before, with a value of 250, but + # CharacterCategory.SYMBOL is actually 253, so we use CONTROL + # to make it closer to the original intent. The only difference + # is whether or not we count digits and control characters for + # _total_char purposes. + if order < CharacterCategory.CONTROL: + self._total_char += 1 + if order < self.SAMPLE_SIZE: + self._freq_char += 1 + if self._last_order < self.SAMPLE_SIZE: + self._total_seqs += 1 + if not self._reversed: + i = (self._last_order * self.SAMPLE_SIZE) + order + model = self._model['precedence_matrix'][i] + else: # reverse the order of the letters in the lookup + i = (order * self.SAMPLE_SIZE) + self._last_order + model = self._model['precedence_matrix'][i] + self._seq_counters[model] += 1 + self._last_order = order + + charset_name = self._model['charset_name'] + if self.state == ProbingState.DETECTING: + if self._total_seqs > self.SB_ENOUGH_REL_THRESHOLD: + confidence = self.get_confidence() + if confidence > self.POSITIVE_SHORTCUT_THRESHOLD: + self.logger.debug('%s confidence = %s, we have a winner', + charset_name, confidence) + self._state = ProbingState.FOUND_IT + elif confidence < self.NEGATIVE_SHORTCUT_THRESHOLD: + self.logger.debug('%s confidence = %s, below negative ' + 'shortcut threshhold %s', charset_name, + confidence, + self.NEGATIVE_SHORTCUT_THRESHOLD) + self._state = ProbingState.NOT_ME + + return self.state + + def get_confidence(self): + r = 0.01 + if self._total_seqs > 0: + r = ((1.0 * self._seq_counters[SequenceLikelihood.POSITIVE]) / + self._total_seqs / self._model['typical_positive_ratio']) + r = r * self._freq_char / self._total_char + if r >= 1.0: + r = 0.99 + return r diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/sbcharsetprober.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/sbcharsetprober.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6c0862f9464b5bf709652698831b171006f94c66 GIT binary patch literal 4050 zcmd5cpdj&z1m8L1G>s^{60i4o=FFLyb3ezqKW0h~e*EC8E{#7q z{CbGhVlg07yGRDe36T$5PRMlfU^-2`DIuGoUQq@o$!}Iq;Ii-|29zfX`to@+AAI*M zf4-mZ0?RAJT3EoFg#Z>`MY~X>M?;U*sdi3?57#48XC&6b}aA z+hI;H<#1X~1ga@EX;j%Lw!pVq*Zy_mRv`j%<3fVnN$p~Gqa()$z}{AXO6-qwi7Y_$h->=u_ZpCpYj%- zGJmPbjI9cP3^Eh-1@Bm6mLGG*_dmf{6;l$BZDCX!rQsGlsC>+W@&+7IbE7}8ofhk@F;OKx4ogEK` zikgg)Br(_Qal|lvL;QYhU2%U=sL!$CpJy-$aNKmkjLqZC*b51oC_P0B?4AFrg(2Kc z(LS{Dgeo}dqD~xab^;@z>D0hES=3VV*L z*^4qk=!q8g6vbFplwA_M=e$Mg5NZp9VJk9MDXtyv9 z-8Hz~9-opQB6@Rl-9r@f>7aoJP7)Kmse}N*ECf@sRQx9a^1Tq0Wa$KDzaF71 zWGomsK`oiv!+jSI@8d)=EIyr%m!@fVg1R2f@m0AS8*i$|-0C82EYfG=;|n-?QttA& z{0~pknn&p`EXvR^I7@5!1I#JfC)$H#PPo&u^t}+Dq2XCBz`HnYiuQA)__#73t@8M%tjU2(y8Xj78m& zR)s@f+r*VNz1|r~ha*d))O1ac8x-Je8a|MOkiCl2E@qW(68A${t$a|qm|d!Do64ZG zWh$M@b{NN~Lht_z;i`#}?MiHdjtxPd4U*J$H*LiZP!tCPlrWrEeFnQ-)IEz)Ka9XJ zia215eMyX3yN!CBxoR&x75lqEW;ZD^yDv=|XRn2oM$2DWmeek#y7}?ld&_m*Tx!=P z)w}v2>7NzmssRU(vrmTOi}q0uk$ zVU7CjkN@ki#!5@ytyd*?bK#Q1R?$c5%%(o85xp4dq``XD5rbhFD+zj2vmseQa_n j;8d7N8uZ!Cr2&?v`1pt^7P;Y!`QZyJF3WvNJ)ip<_rryf literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/sbcsgroupprober 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/sbcsgroupprober 2.py new file mode 100644 index 0000000..98e95dc --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/sbcsgroupprober 2.py @@ -0,0 +1,73 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetgroupprober import CharSetGroupProber +from .sbcharsetprober import SingleByteCharSetProber +from .langcyrillicmodel import (Win1251CyrillicModel, Koi8rModel, + Latin5CyrillicModel, MacCyrillicModel, + Ibm866Model, Ibm855Model) +from .langgreekmodel import Latin7GreekModel, Win1253GreekModel +from .langbulgarianmodel import Latin5BulgarianModel, Win1251BulgarianModel +# from .langhungarianmodel import Latin2HungarianModel, Win1250HungarianModel +from .langthaimodel import TIS620ThaiModel +from .langhebrewmodel import Win1255HebrewModel +from .hebrewprober import HebrewProber +from .langturkishmodel import Latin5TurkishModel + + +class SBCSGroupProber(CharSetGroupProber): + def __init__(self): + super(SBCSGroupProber, self).__init__() + self.probers = [ + SingleByteCharSetProber(Win1251CyrillicModel), + SingleByteCharSetProber(Koi8rModel), + SingleByteCharSetProber(Latin5CyrillicModel), + SingleByteCharSetProber(MacCyrillicModel), + SingleByteCharSetProber(Ibm866Model), + SingleByteCharSetProber(Ibm855Model), + SingleByteCharSetProber(Latin7GreekModel), + SingleByteCharSetProber(Win1253GreekModel), + SingleByteCharSetProber(Latin5BulgarianModel), + SingleByteCharSetProber(Win1251BulgarianModel), + # TODO: Restore Hungarian encodings (iso-8859-2 and windows-1250) + # after we retrain model. + # SingleByteCharSetProber(Latin2HungarianModel), + # SingleByteCharSetProber(Win1250HungarianModel), + SingleByteCharSetProber(TIS620ThaiModel), + SingleByteCharSetProber(Latin5TurkishModel), + ] + hebrew_prober = HebrewProber() + logical_hebrew_prober = SingleByteCharSetProber(Win1255HebrewModel, + False, hebrew_prober) + visual_hebrew_prober = SingleByteCharSetProber(Win1255HebrewModel, True, + hebrew_prober) + hebrew_prober.set_model_probers(logical_hebrew_prober, visual_hebrew_prober) + self.probers.extend([hebrew_prober, logical_hebrew_prober, + visual_hebrew_prober]) + + self.reset() diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/sbcsgroupprober 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/sbcsgroupprober 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..977967188936554cf315f1c92afa9b10a6a4bc68 GIT binary patch literal 2070 zcmd5+&2Jk;6o0cDf5wg-CvgH2cT3Q2+~BkaKqV=Z3R+d`AjBM4t?kKr-I=wS9lN+n zPvH;a%DsOEH~sD{kPA58pG!2Kdp z#eg$lBzqt|P(Eq4AlLicXO)M;BNP0v}2g&&~)Q>iKfr~2g{CqwU($vxL?L2*?ow$eMcd<#c!CkjD>YvBsyUJ}; zJ{ze=r>8EskOu=R_dK*4inKdEe5!?bC!oQuXX;EsmtJODU(>IapqzUZesd( zEv^MEG+#U$o<2Cfn8v9~;HGcxtid;8q{Zu7wgv_{ByU9WZ-v#o*e9x1LP{ zHT#9eCuVj4R~}sXlsCgIW^I^t$>6jJ8t^+L!=Wt-yW!gKqIX1Pm#6{Dh0q}Z#8i<) zQJSSDib85sNZ<*5BGj{x{6m6rSRq3GVT}j@I3(nSG|Z5OWXNSY zbk{Ed3RV=LuaNuGIUB zbx2_U1XoT3*q&Eo|9DC@)HY1PS7f|7rhUu0IHwbgEPL>nGm&L2u#>AXLT*J;Iz1rah8lXcd5nCzeCm#5Gf|1 zYtRK$QDsqVvmoQBxbvLD4Y)1f$id*{=4=Fan<1$k;+(;Povco|$(xS1m$BW&-D}RD ls|7TVfR-a*d2&6AQ!u)a?Q=7HfeZR}P9&z~ie*wAO*wFw0 literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/sbcsgroupprober.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/sbcsgroupprober.py new file mode 100644 index 0000000..98e95dc --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/sbcsgroupprober.py @@ -0,0 +1,73 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetgroupprober import CharSetGroupProber +from .sbcharsetprober import SingleByteCharSetProber +from .langcyrillicmodel import (Win1251CyrillicModel, Koi8rModel, + Latin5CyrillicModel, MacCyrillicModel, + Ibm866Model, Ibm855Model) +from .langgreekmodel import Latin7GreekModel, Win1253GreekModel +from .langbulgarianmodel import Latin5BulgarianModel, Win1251BulgarianModel +# from .langhungarianmodel import Latin2HungarianModel, Win1250HungarianModel +from .langthaimodel import TIS620ThaiModel +from .langhebrewmodel import Win1255HebrewModel +from .hebrewprober import HebrewProber +from .langturkishmodel import Latin5TurkishModel + + +class SBCSGroupProber(CharSetGroupProber): + def __init__(self): + super(SBCSGroupProber, self).__init__() + self.probers = [ + SingleByteCharSetProber(Win1251CyrillicModel), + SingleByteCharSetProber(Koi8rModel), + SingleByteCharSetProber(Latin5CyrillicModel), + SingleByteCharSetProber(MacCyrillicModel), + SingleByteCharSetProber(Ibm866Model), + SingleByteCharSetProber(Ibm855Model), + SingleByteCharSetProber(Latin7GreekModel), + SingleByteCharSetProber(Win1253GreekModel), + SingleByteCharSetProber(Latin5BulgarianModel), + SingleByteCharSetProber(Win1251BulgarianModel), + # TODO: Restore Hungarian encodings (iso-8859-2 and windows-1250) + # after we retrain model. + # SingleByteCharSetProber(Latin2HungarianModel), + # SingleByteCharSetProber(Win1250HungarianModel), + SingleByteCharSetProber(TIS620ThaiModel), + SingleByteCharSetProber(Latin5TurkishModel), + ] + hebrew_prober = HebrewProber() + logical_hebrew_prober = SingleByteCharSetProber(Win1255HebrewModel, + False, hebrew_prober) + visual_hebrew_prober = SingleByteCharSetProber(Win1255HebrewModel, True, + hebrew_prober) + hebrew_prober.set_model_probers(logical_hebrew_prober, visual_hebrew_prober) + self.probers.extend([hebrew_prober, logical_hebrew_prober, + visual_hebrew_prober]) + + self.reset() diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/sbcsgroupprober.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/sbcsgroupprober.pyc new file mode 100644 index 0000000000000000000000000000000000000000..00c464e735757c2b15e6440877e348a023c96595 GIT binary patch literal 2070 zcmd5+-EJF26h5;X|Hh6TCvgH2_m-gDIKfFTT7(jbQb8lMj)a(tuGaQsz3$A~%#Pg} zrB~s_cn2PXJ6?cuX1r+v61U*pIX=HL=jYq;|7_OZ|Mud|7&bp2|G&nS|BhsWF9Qjn z7;pxRWDleV$_MT{*$24=ssy|Qstmjgssg+MstUXcss_9Ust&yFythDZgK7Y8fNBD7 zI&BH$4yYFJ7N|Dxw$qkD?tM;vau3u#@O>v&K^}nW0`EGx2J#Tp5%43F>mV51 zFqmw^uK;%dKk-js(tu&FiG`&MNsox>Ai12zdMM0GJzp+<(DRYd&UT2lVVWgUT&#`Q zcx@cY6ugh*$29Ao4EmRAol2RGU(Y8(nmQW3o2SpT6ZcU3J~nAKcXD;U8KBoWJ z;#$x`^YyFY*~#(sG)`Rt_kD9`4Zam4E#5t_H8992A9j;E?NYd2>bGe=bqUZ3!;8z| zgYMs>kxsh6l~ZK`2!x1194Pl79NG-Wjx(=3>sf@u+xH0bQ84Q7|l{@@PnfZ2mv26sMu@N62W z*)KFcF|z}>_2Aa0ycupWYs0Kd2B%HXfZrh*4sB7`4cCUN-Vv2uq6RD%LWcwpQ$-R* zX_lHO3aL>cfhY8dP|rg04++X)g$VhFH6jGykdPPBFhd%WA(w^yJo0ddwA6BY)16nzWPCdAM&;=K{s#KvfWE4hY(%h%b#OD66QT1USp<`xXUQ*L-t>=0{nPb&WoE{h z^V4_JWBesqa2+ht#gjD4O)TY;lk>AH9+JwgXoW@0buh+zV0%uc z*uTJ)69Km8)!09tQjK*`UuF$!YqJ)sdp#P?W^h@oL=@S}B%)?6C5m?Ik466Hl@icC z$CVSb%IvE5DHTBVQ+sg64>}W~77T$2Tjs2;Wfq(kH!{wW@#ZeI`1yCp8UiB4ByNCtQr!lozn?3crtm_enkN+34j@PCD literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/sjisprober 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/sjisprober 2.py new file mode 100644 index 0000000..9e29623 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/sjisprober 2.py @@ -0,0 +1,92 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .mbcharsetprober import MultiByteCharSetProber +from .codingstatemachine import CodingStateMachine +from .chardistribution import SJISDistributionAnalysis +from .jpcntx import SJISContextAnalysis +from .mbcssm import SJIS_SM_MODEL +from .enums import ProbingState, MachineState + + +class SJISProber(MultiByteCharSetProber): + def __init__(self): + super(SJISProber, self).__init__() + self.coding_sm = CodingStateMachine(SJIS_SM_MODEL) + self.distribution_analyzer = SJISDistributionAnalysis() + self.context_analyzer = SJISContextAnalysis() + self.reset() + + def reset(self): + super(SJISProber, self).reset() + self.context_analyzer.reset() + + @property + def charset_name(self): + return self.context_analyzer.charset_name + + @property + def language(self): + return "Japanese" + + def feed(self, byte_str): + for i in range(len(byte_str)): + coding_state = self.coding_sm.next_state(byte_str[i]) + if coding_state == MachineState.ERROR: + self.logger.debug('%s %s prober hit error at byte %s', + self.charset_name, self.language, i) + self._state = ProbingState.NOT_ME + break + elif coding_state == MachineState.ITS_ME: + self._state = ProbingState.FOUND_IT + break + elif coding_state == MachineState.START: + char_len = self.coding_sm.get_current_charlen() + if i == 0: + self._last_char[1] = byte_str[0] + self.context_analyzer.feed(self._last_char[2 - char_len:], + char_len) + self.distribution_analyzer.feed(self._last_char, char_len) + else: + self.context_analyzer.feed(byte_str[i + 1 - char_len:i + 3 + - char_len], char_len) + self.distribution_analyzer.feed(byte_str[i - 1:i + 1], + char_len) + + self._last_char[0] = byte_str[-1] + + if self.state == ProbingState.DETECTING: + if (self.context_analyzer.got_enough_data() and + (self.get_confidence() > self.SHORTCUT_THRESHOLD)): + self._state = ProbingState.FOUND_IT + + return self.state + + def get_confidence(self): + context_conf = self.context_analyzer.get_confidence() + distrib_conf = self.distribution_analyzer.get_confidence() + return max(context_conf, distrib_conf) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/sjisprober 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/sjisprober 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..69c43f4bd1f9a5a0937500890c9956da93bb4974 GIT binary patch literal 3443 zcmd5;-ESL35TCpAN1TtQNl4NFQWMcimY}#*D?q3qTHDZ6jZ>Xnp<05|#kY3Oy*oR% z>yT8fganWLC4J*R;FZ6Jci=a(b{Z7kQ~P#qcXoDfzGu9@mgfKbQUFTYmbrwrA6u%?YcloiPAE4%XVF)WRB7bbt`sVqGX=Z z1?nzPx=7tcV9TT&>N^z8(XT|m5IyfMQBh%waMdyiHS$qgDgx=b*wGL+LWR` z%8WWO|J_`gZU*hWU~j+Cd{T9RF^d4q!R(WQn0{AyFf0Op*YbI$XFmN9Lq7&k#Oj51 zA%53oo%6&aRbYLyPN4syEWO#XL{UM=$`lo4GDm*9TEcZbRu&I7W*tL60x)g=A%A!$T>%rwBWomjD>#_LVr{hzf#k+~2+0^8$Im^x> z{uixq1Ka;&1y-*&Gs!s(vw%LURFvzp2m0)9BEElxXBd|%I`i}ihGt$_^fRH^`r>-5 z6qXQ=bLKqk10svW3#%1o4YDw`!TN3pw+tq4V`%1<+>4^I(1_Kxq=J@s|Ko5RX7EvK z83}=R!BE0m5@v%*I8gV_$;6^@5OdlPbNvpUPg>5@O&v}Scp5)^>AZHujz}IJy+X=x zX$w2Av5+h>EYb^?@>GaQG(=jGyfT~<46+DvP60V*o`wsI3Kr?<(c0|vlAQjHc>Bu5 z?Pb{pHQWdsT;*)^y1;iLLGpM1W}YzLVu}@tJi5=bRT|nuK!LnK*RBH~13J9>-rL@g7%H*NAc{#4OUcP?BpqZBF}m{CAJJl`{Gr8CxC%i6lgx*^=ZnSFJW1T+TyAB8B?Ay{ifH(Cv9-ExD4`Z{f@_dwUhi3Z#H4}R=h-^)b z+4!-?;2->|?_*|@EF49lHV`E$^ErT}ie)H@0rI0!KD&#MHhq8JN8JGFXfRN@AR~1! z8TcGN{t5$jFrjJfcY?j9OzlN7-R-m)%bD)m{b#L4u-lPq+MNe}$8c2!H$iWb=PJV+ z$pUN%M?n&5i?PXs1G2AFj0>AF8+9b%H!K03$ zKL%hY#e-CVsI*a!Ahk=E;7K-LAnaz{gVZ)IX8uPE#9n-58lF`7Z8gjUJ=={1c=tuW z)3!knm#$Lg{yB!`5Fk-smHPp4jzB6}5LjOg(or-?6gnd&ka8|mh*dOD=JZ^^u%SdT zZ{?HOB{evlU2b4#wnxdSlq-d0{3|=HD#wikRC+M2;x_g8z>|cKZTuu{q_!WI&d|1a z+)thB0&Q=|svM4cnK`k|Ag^(~M(@aOBe_9klT=G$kz6Dl(mSCnG3kA4>aRZpyP~wK J&g{S8{R=Ls1AG7g literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/sjisprober.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/sjisprober.py new file mode 100644 index 0000000..9e29623 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/sjisprober.py @@ -0,0 +1,92 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .mbcharsetprober import MultiByteCharSetProber +from .codingstatemachine import CodingStateMachine +from .chardistribution import SJISDistributionAnalysis +from .jpcntx import SJISContextAnalysis +from .mbcssm import SJIS_SM_MODEL +from .enums import ProbingState, MachineState + + +class SJISProber(MultiByteCharSetProber): + def __init__(self): + super(SJISProber, self).__init__() + self.coding_sm = CodingStateMachine(SJIS_SM_MODEL) + self.distribution_analyzer = SJISDistributionAnalysis() + self.context_analyzer = SJISContextAnalysis() + self.reset() + + def reset(self): + super(SJISProber, self).reset() + self.context_analyzer.reset() + + @property + def charset_name(self): + return self.context_analyzer.charset_name + + @property + def language(self): + return "Japanese" + + def feed(self, byte_str): + for i in range(len(byte_str)): + coding_state = self.coding_sm.next_state(byte_str[i]) + if coding_state == MachineState.ERROR: + self.logger.debug('%s %s prober hit error at byte %s', + self.charset_name, self.language, i) + self._state = ProbingState.NOT_ME + break + elif coding_state == MachineState.ITS_ME: + self._state = ProbingState.FOUND_IT + break + elif coding_state == MachineState.START: + char_len = self.coding_sm.get_current_charlen() + if i == 0: + self._last_char[1] = byte_str[0] + self.context_analyzer.feed(self._last_char[2 - char_len:], + char_len) + self.distribution_analyzer.feed(self._last_char, char_len) + else: + self.context_analyzer.feed(byte_str[i + 1 - char_len:i + 3 + - char_len], char_len) + self.distribution_analyzer.feed(byte_str[i - 1:i + 1], + char_len) + + self._last_char[0] = byte_str[-1] + + if self.state == ProbingState.DETECTING: + if (self.context_analyzer.got_enough_data() and + (self.get_confidence() > self.SHORTCUT_THRESHOLD)): + self._state = ProbingState.FOUND_IT + + return self.state + + def get_confidence(self): + context_conf = self.context_analyzer.get_confidence() + distrib_conf = self.distribution_analyzer.get_confidence() + return max(context_conf, distrib_conf) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/sjisprober.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/sjisprober.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c6b6e070266620d273d65b3b73b975367c683df5 GIT binary patch literal 3443 zcmd5;ZEqVz5S~51#d&F(gd`0hH5IL735r`javrajLT`R7-HW_}0$3cW38z z9g?b*kl-V~q~G`n{3gBw&&=9sQ23tOw{yF*vwQPCQ}}CP_V~}Qf9lfYSHSyQ4D$;> zghx?Alq%{dQoQyk@hB}&r{LBFN{W=0s8e$5A|+)?E7YmDb%~N0N~_eVx^b>@MskXF=F6wT0YM86Wf=qylFrB-bgOvDPH#=x!t?2Z!~KRU6xaS-M$ZJ*`C zeVx1gW$ZVGQJnQ#Hne&->>k9Kc6(Q_*Lt$k+KP?M@ zKDPheT$pSIt=(XEZ)^K$%>%~H126~EPYPo4UE#s92>e~g=c%6g^dk)O1V9t37utpR z9glU+lLF}?>zj1~{g-4}m@dl{6@{!qQAs8<NT-Rk~@nB;%FwA2Bi$~FGT;|ch zV>K&VAY0_ifelJz%Z%lDh3w39US-T+Rt|v0mME)Po8v1>eEE2!bHBpN8Gs;&v)BfK z&kXoQMpps4VwS+9zUXZgsOXF(f{;z|3KucY_OhH1Go0?o$8v47b>`x$jZS(syh(sL z#H>Eb<0BZqeiY{Q-Y|)DZtDF}JvtopU)}B9zO{e*&dJG<9awAc-}(9A7JmJ#-mZ`0 z(aktBHcXP6U);af?D&k55gh3(8s_ybTrSeKZU(U#iQj!bI`LV&8yJR7O=?9gs(Jj+ zTj4sk|Hlff-on%*XEe+L`m9n>uFoFmv%iV>{w1DaT&U>G(`Oild1cX0g=XuE>#Dl4R^z?$9{+)RH()sO0 z*#N*RSyX6(0 zGn*UqvdGA@x;cESGPk=52juMAG}i!cm`yw`Ic*-qc2np1Fy9RA=00jB_F@pZni{k5 z;{tEaE<(EP`+Gj>21tkfzRm?1>HTrv z=kW2D7_fs0O>?gu>~71{T_n?;c8jr`>Au^0-rNdy+Hy^+{m^e)uFBvh=#KMTXLuu7 zfGy!DNJ8Tl>)T2-QI4rcbeZ@W~@K7fzF2G{y`9hpy42uuMD$Z z9Oi7N}2l?7=}ZDM13{x2gEr7sc1pqd^Jdi(KylQjF>>mxlkci(LmXgGXcYf62-ie zPi7a?;Ba=ij$zmyWmT max_prober_confidence: + max_prober_confidence = prober_confidence + max_prober = prober + if max_prober and (max_prober_confidence > self.MINIMUM_THRESHOLD): + charset_name = max_prober.charset_name + lower_charset_name = max_prober.charset_name.lower() + confidence = max_prober.get_confidence() + # Use Windows encoding name instead of ISO-8859 if we saw any + # extra Windows-specific bytes + if lower_charset_name.startswith('iso-8859'): + if self._has_win_bytes: + charset_name = self.ISO_WIN_MAP.get(lower_charset_name, + charset_name) + self.result = {'encoding': charset_name, + 'confidence': confidence, + 'language': max_prober.language} + + # Log all prober confidences if none met MINIMUM_THRESHOLD + if self.logger.getEffectiveLevel() == logging.DEBUG: + if self.result['encoding'] is None: + self.logger.debug('no probers hit minimum threshold') + for group_prober in self._charset_probers: + if not group_prober: + continue + if isinstance(group_prober, CharSetGroupProber): + for prober in group_prober.probers: + self.logger.debug('%s %s confidence = %s', + prober.charset_name, + prober.language, + prober.get_confidence()) + else: + self.logger.debug('%s %s confidence = %s', + prober.charset_name, + prober.language, + prober.get_confidence()) + return self.result diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/universaldetector 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/universaldetector 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4f70bb4aae8c46d484e4eef637952b9734fd3f3f GIT binary patch literal 7403 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 PBaeW|yvPmg( literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/universaldetector.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/universaldetector.py new file mode 100644 index 0000000..7b4e92d --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/universaldetector.py @@ -0,0 +1,286 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### +""" +Module containing the UniversalDetector detector class, which is the primary +class a user of ``chardet`` should use. + +:author: Mark Pilgrim (initial port to Python) +:author: Shy Shalom (original C code) +:author: Dan Blanchard (major refactoring for 3.0) +:author: Ian Cordasco +""" + + +import codecs +import logging +import re + +from .charsetgroupprober import CharSetGroupProber +from .enums import InputState, LanguageFilter, ProbingState +from .escprober import EscCharSetProber +from .latin1prober import Latin1Prober +from .mbcsgroupprober import MBCSGroupProber +from .sbcsgroupprober import SBCSGroupProber + + +class UniversalDetector(object): + """ + The ``UniversalDetector`` class underlies the ``chardet.detect`` function + and coordinates all of the different charset probers. + + To get a ``dict`` containing an encoding and its confidence, you can simply + run: + + .. code:: + + u = UniversalDetector() + u.feed(some_bytes) + u.close() + detected = u.result + + """ + + MINIMUM_THRESHOLD = 0.20 + HIGH_BYTE_DETECTOR = re.compile(b'[\x80-\xFF]') + ESC_DETECTOR = re.compile(b'(\033|~{)') + WIN_BYTE_DETECTOR = re.compile(b'[\x80-\x9F]') + ISO_WIN_MAP = {'iso-8859-1': 'Windows-1252', + 'iso-8859-2': 'Windows-1250', + 'iso-8859-5': 'Windows-1251', + 'iso-8859-6': 'Windows-1256', + 'iso-8859-7': 'Windows-1253', + 'iso-8859-8': 'Windows-1255', + 'iso-8859-9': 'Windows-1254', + 'iso-8859-13': 'Windows-1257'} + + def __init__(self, lang_filter=LanguageFilter.ALL): + self._esc_charset_prober = None + self._charset_probers = [] + self.result = None + self.done = None + self._got_data = None + self._input_state = None + self._last_char = None + self.lang_filter = lang_filter + self.logger = logging.getLogger(__name__) + self._has_win_bytes = None + self.reset() + + def reset(self): + """ + Reset the UniversalDetector and all of its probers back to their + initial states. This is called by ``__init__``, so you only need to + call this directly in between analyses of different documents. + """ + self.result = {'encoding': None, 'confidence': 0.0, 'language': None} + self.done = False + self._got_data = False + self._has_win_bytes = False + self._input_state = InputState.PURE_ASCII + self._last_char = b'' + if self._esc_charset_prober: + self._esc_charset_prober.reset() + for prober in self._charset_probers: + prober.reset() + + def feed(self, byte_str): + """ + Takes a chunk of a document and feeds it through all of the relevant + charset probers. + + After calling ``feed``, you can check the value of the ``done`` + attribute to see if you need to continue feeding the + ``UniversalDetector`` more data, or if it has made a prediction + (in the ``result`` attribute). + + .. note:: + You should always call ``close`` when you're done feeding in your + document if ``done`` is not already ``True``. + """ + if self.done: + return + + if not len(byte_str): + return + + if not isinstance(byte_str, bytearray): + byte_str = bytearray(byte_str) + + # First check for known BOMs, since these are guaranteed to be correct + if not self._got_data: + # If the data starts with BOM, we know it is UTF + if byte_str.startswith(codecs.BOM_UTF8): + # EF BB BF UTF-8 with BOM + self.result = {'encoding': "UTF-8-SIG", + 'confidence': 1.0, + 'language': ''} + elif byte_str.startswith((codecs.BOM_UTF32_LE, + codecs.BOM_UTF32_BE)): + # FF FE 00 00 UTF-32, little-endian BOM + # 00 00 FE FF UTF-32, big-endian BOM + self.result = {'encoding': "UTF-32", + 'confidence': 1.0, + 'language': ''} + elif byte_str.startswith(b'\xFE\xFF\x00\x00'): + # FE FF 00 00 UCS-4, unusual octet order BOM (3412) + self.result = {'encoding': "X-ISO-10646-UCS-4-3412", + 'confidence': 1.0, + 'language': ''} + elif byte_str.startswith(b'\x00\x00\xFF\xFE'): + # 00 00 FF FE UCS-4, unusual octet order BOM (2143) + self.result = {'encoding': "X-ISO-10646-UCS-4-2143", + 'confidence': 1.0, + 'language': ''} + elif byte_str.startswith((codecs.BOM_LE, codecs.BOM_BE)): + # FF FE UTF-16, little endian BOM + # FE FF UTF-16, big endian BOM + self.result = {'encoding': "UTF-16", + 'confidence': 1.0, + 'language': ''} + + self._got_data = True + if self.result['encoding'] is not None: + self.done = True + return + + # If none of those matched and we've only see ASCII so far, check + # for high bytes and escape sequences + if self._input_state == InputState.PURE_ASCII: + if self.HIGH_BYTE_DETECTOR.search(byte_str): + self._input_state = InputState.HIGH_BYTE + elif self._input_state == InputState.PURE_ASCII and \ + self.ESC_DETECTOR.search(self._last_char + byte_str): + self._input_state = InputState.ESC_ASCII + + self._last_char = byte_str[-1:] + + # If we've seen escape sequences, use the EscCharSetProber, which + # uses a simple state machine to check for known escape sequences in + # HZ and ISO-2022 encodings, since those are the only encodings that + # use such sequences. + if self._input_state == InputState.ESC_ASCII: + if not self._esc_charset_prober: + self._esc_charset_prober = EscCharSetProber(self.lang_filter) + if self._esc_charset_prober.feed(byte_str) == ProbingState.FOUND_IT: + self.result = {'encoding': + self._esc_charset_prober.charset_name, + 'confidence': + self._esc_charset_prober.get_confidence(), + 'language': + self._esc_charset_prober.language} + self.done = True + # If we've seen high bytes (i.e., those with values greater than 127), + # we need to do more complicated checks using all our multi-byte and + # single-byte probers that are left. The single-byte probers + # use character bigram distributions to determine the encoding, whereas + # the multi-byte probers use a combination of character unigram and + # bigram distributions. + elif self._input_state == InputState.HIGH_BYTE: + if not self._charset_probers: + self._charset_probers = [MBCSGroupProber(self.lang_filter)] + # If we're checking non-CJK encodings, use single-byte prober + if self.lang_filter & LanguageFilter.NON_CJK: + self._charset_probers.append(SBCSGroupProber()) + self._charset_probers.append(Latin1Prober()) + for prober in self._charset_probers: + if prober.feed(byte_str) == ProbingState.FOUND_IT: + self.result = {'encoding': prober.charset_name, + 'confidence': prober.get_confidence(), + 'language': prober.language} + self.done = True + break + if self.WIN_BYTE_DETECTOR.search(byte_str): + self._has_win_bytes = True + + def close(self): + """ + Stop analyzing the current document and come up with a final + prediction. + + :returns: The ``result`` attribute, a ``dict`` with the keys + `encoding`, `confidence`, and `language`. + """ + # Don't bother with checks if we're already done + if self.done: + return self.result + self.done = True + + if not self._got_data: + self.logger.debug('no data received!') + + # Default to ASCII if it is all we've seen so far + elif self._input_state == InputState.PURE_ASCII: + self.result = {'encoding': 'ascii', + 'confidence': 1.0, + 'language': ''} + + # If we have seen non-ASCII, return the best that met MINIMUM_THRESHOLD + elif self._input_state == InputState.HIGH_BYTE: + prober_confidence = None + max_prober_confidence = 0.0 + max_prober = None + for prober in self._charset_probers: + if not prober: + continue + prober_confidence = prober.get_confidence() + if prober_confidence > max_prober_confidence: + max_prober_confidence = prober_confidence + max_prober = prober + if max_prober and (max_prober_confidence > self.MINIMUM_THRESHOLD): + charset_name = max_prober.charset_name + lower_charset_name = max_prober.charset_name.lower() + confidence = max_prober.get_confidence() + # Use Windows encoding name instead of ISO-8859 if we saw any + # extra Windows-specific bytes + if lower_charset_name.startswith('iso-8859'): + if self._has_win_bytes: + charset_name = self.ISO_WIN_MAP.get(lower_charset_name, + charset_name) + self.result = {'encoding': charset_name, + 'confidence': confidence, + 'language': max_prober.language} + + # Log all prober confidences if none met MINIMUM_THRESHOLD + if self.logger.getEffectiveLevel() == logging.DEBUG: + if self.result['encoding'] is None: + self.logger.debug('no probers hit minimum threshold') + for group_prober in self._charset_probers: + if not group_prober: + continue + if isinstance(group_prober, CharSetGroupProber): + for prober in group_prober.probers: + self.logger.debug('%s %s confidence = %s', + prober.charset_name, + prober.language, + prober.get_confidence()) + else: + self.logger.debug('%s %s confidence = %s', + prober.charset_name, + prober.language, + prober.get_confidence()) + return self.result diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/universaldetector.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/universaldetector.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cb9d481a56b5821cf3663f8b636b48957bd1f549 GIT binary patch literal 7403 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 PM;-)|d669!PMiHN)xfc} literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/utf8prober 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/utf8prober 2.py new file mode 100644 index 0000000..6c3196c --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/utf8prober 2.py @@ -0,0 +1,82 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetprober import CharSetProber +from .enums import ProbingState, MachineState +from .codingstatemachine import CodingStateMachine +from .mbcssm import UTF8_SM_MODEL + + + +class UTF8Prober(CharSetProber): + ONE_CHAR_PROB = 0.5 + + def __init__(self): + super(UTF8Prober, self).__init__() + self.coding_sm = CodingStateMachine(UTF8_SM_MODEL) + self._num_mb_chars = None + self.reset() + + def reset(self): + super(UTF8Prober, self).reset() + self.coding_sm.reset() + self._num_mb_chars = 0 + + @property + def charset_name(self): + return "utf-8" + + @property + def language(self): + return "" + + def feed(self, byte_str): + for c in byte_str: + coding_state = self.coding_sm.next_state(c) + if coding_state == MachineState.ERROR: + self._state = ProbingState.NOT_ME + break + elif coding_state == MachineState.ITS_ME: + self._state = ProbingState.FOUND_IT + break + elif coding_state == MachineState.START: + if self.coding_sm.get_current_charlen() >= 2: + self._num_mb_chars += 1 + + if self.state == ProbingState.DETECTING: + if self.get_confidence() > self.SHORTCUT_THRESHOLD: + self._state = ProbingState.FOUND_IT + + return self.state + + def get_confidence(self): + unlike = 0.99 + if self._num_mb_chars < 6: + unlike *= self.ONE_CHAR_PROB ** self._num_mb_chars + return 1.0 - unlike + else: + return unlike diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/utf8prober 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/utf8prober 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bb2b0aa1126473161bf6a53de0e5692c864d773d GIT binary patch literal 2892 zcmd5;Pj4GV6o0e3{+B;Zl(YyC0wg5l1Hp|7YAQiPYr9RP#Exb+LRcz;;~hKe?5>^N zacHXKRPNl$x9Df!$~iYq@CiWT3-I0>I}vI*C##*eGjHC`%=`Cyuf8T@Y zyAT) zz{8`~XaVYYpbHSXtPxtL$U|>7ECFgwV&$pUsIl~`C0ulX4WBL?s8Rhu+9}xlHHUSYwi8uH$|czrZ9v#$IilMJMQ< z+DSL7^+$22v%EGK*TUoB;KdjH^}7e__fAhw%+MHf|K5*>ckvmdwV*bR#%ocUn{FJh zJ!&-by?tVFQztqNM_G-|5o%MLnEu9?L*w)DsU&lLiY+GvL9B`;Q4w#Nbqy!qVpcMr zJF_vmmyGI>b$t%IRz!^we zk>^m;se(Cagce=fu%{=n8=(v*IES7#D(xnE9Z!~1YJzj=-v3bw9X<2L&C!PfChn$# zNq3;X#QsbdQi*&*jUDtmcAozNX960}eui_0a~$IoqZ6?}z_|-&hz1A^E*v?KJtSlp z7C3f`uy>50V5dtw{fwu}Z%$Wu+Cm5}KSwBnfpJuT>=j9S!+8R_`;MB2<5z&|;`=RS z%mOdD$p2sP@ov%2G_?dr9%L8)+4J}UQaihVVdtWHt%$U?sK1Oo&L)QAR6jQgVZdlf zA`ClCDce$#Ck+L5s~xD_CU>nQceewdxMbxg?fq6mZ3q0bA3TzQSw;2$1F1L3GM(ZV zu_V?hC$L3IE-HkEjb_lS2ivWu=GN?|QQD6}o%Xb$`r>c3Wl-M_RInwRIM``a$#mM&!@X;&wp1-X z!Io2Q6h+ag6f1=#Z^^5ywyer@^eJrHA}x_&^H}4BBIi7|xlPGr?;f1+iM`G7<%B() j9Q5)$;d=@f-Wy>8cGOqaiw{3Q4fx`*EZz~zV%hr_wv2`8 literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/utf8prober.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/utf8prober.py new file mode 100644 index 0000000..6c3196c --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/utf8prober.py @@ -0,0 +1,82 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetprober import CharSetProber +from .enums import ProbingState, MachineState +from .codingstatemachine import CodingStateMachine +from .mbcssm import UTF8_SM_MODEL + + + +class UTF8Prober(CharSetProber): + ONE_CHAR_PROB = 0.5 + + def __init__(self): + super(UTF8Prober, self).__init__() + self.coding_sm = CodingStateMachine(UTF8_SM_MODEL) + self._num_mb_chars = None + self.reset() + + def reset(self): + super(UTF8Prober, self).reset() + self.coding_sm.reset() + self._num_mb_chars = 0 + + @property + def charset_name(self): + return "utf-8" + + @property + def language(self): + return "" + + def feed(self, byte_str): + for c in byte_str: + coding_state = self.coding_sm.next_state(c) + if coding_state == MachineState.ERROR: + self._state = ProbingState.NOT_ME + break + elif coding_state == MachineState.ITS_ME: + self._state = ProbingState.FOUND_IT + break + elif coding_state == MachineState.START: + if self.coding_sm.get_current_charlen() >= 2: + self._num_mb_chars += 1 + + if self.state == ProbingState.DETECTING: + if self.get_confidence() > self.SHORTCUT_THRESHOLD: + self._state = ProbingState.FOUND_IT + + return self.state + + def get_confidence(self): + unlike = 0.99 + if self._num_mb_chars < 6: + unlike *= self.ONE_CHAR_PROB ** self._num_mb_chars + return 1.0 - unlike + else: + return unlike diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/utf8prober.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/utf8prober.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d0f0c736fdeb1a0c8ea7d4acf897946bbb75b0fa GIT binary patch literal 2892 zcmd5;-EJF26h5KW$HBNj@{@=f73O5CsR%N1t3QHi%XGOhQmDVWIYU7d4B=roLS*a+Ej8c+z zlPreb)wU7nAPbVp*Hog>8+1AG(H`jNiyfh*m6=3#IjfrRq>`-S8(z_%u41f zOl^$rC8N4zU7y3wi)hgr8BmspaBr4+w4I~?VtYu6&l|S|9qbcqIh~bkF@J3d3Nj8b z@*HY9Q7|Ws(4s5r_VgrnE0o~`=g`werJY2t;>mJKO>nN<`#(ydqo>}uJ^E0<#GSN1 z?)3E+*q`b`Dv?j9v4eiY&gn03E@1Qd&v4;zj$@o+bRrfAxG2Cmq5(of0gfEV9uYDO ziX6Ko*gHm0u+wFpe$LaCH>aySZ6O4gpCJ^%z&I*G_KKw4!7KsYnxkgn_!Z!~_MvrCvx(t2)u%=w3>Ym* zgkh&CWlKu(q@lp}T7lYaa@R_7cRTQjOICi`+V?iqcECUT!DAViWn}j;kh?Q+vF!6@I;I;2vQzmEhED3%a7=Y)Gj?}>MuC2>zI*=!?c zkmnlMxJF^5Trge^_(E_5kgZb8QV>k}%MVc`#BdexwvWUQ30TQkUjOy8KVIB@{pUtR zE}hiFzcv_ktykzG(DIt9vGrK0J=uC<=Ll%o;o~%pj&9tT@?AX74z`?X0f-VB@UEyh zH5yKeE}@rF9NtPL!*CqqP=1I4T)ia0Hj83a!+LGbB^LyiGd1gHPUJt)M4;~ZNuL12x6n=w1GWI|iu!n%DfXxR?4%j=%A(KOPGhSL4 zKM2CxTze?3tP2I|ReSVcP0<2c@VcxDownc01JvbExP6}Z<8;qqe(dYjdWbmy literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/version.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/version.py new file mode 100644 index 0000000..bb2a34a --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/version.py @@ -0,0 +1,9 @@ +""" +This module exists only to simplify retrieving the version number of chardet +from within setup.py and from chardet subpackages. + +:author: Dan Blanchard (dan.blanchard@gmail.com) +""" + +__version__ = "3.0.4" +VERSION = __version__.split('.') diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/version.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/chardet/version.pyc new file mode 100644 index 0000000000000000000000000000000000000000..31d54d372015a34771bb5e3a186d1b57daab6f1b GIT binary patch literal 478 zcmYLGK~BRk5Oi87D2O+($8sPp6oG^QAp{35MFPa32O>9i5|_jd_9hUnJc$?ZCO*J6 z1Yv2%GwZRuyB>aThi_kJPYLVSfc6Utze6Ayn-d0X9xxTK<$%cn`ye@Fa>(w-Yb)a? zLHLks52clLp+LQ9j~=WkT0je4msO$D7Mwz-RijM?m@8!tg}Ym|J%OSHi$$Axvk3u@oj+{K<=~ z6uO8KTkeK_o$8)OljslwV$rPY1~-Vuv9w7X<5tJ}I!Ui?clw{mt!cOiA_+ z-jL*#(~UsI8{v3r3rVf=tm5)znY|yT`;*1~v~3$)BI5D%HJ{MR41eI2uJ*L?D2ih5 p;P_}Zzgwlch#O_3b-Zt%_hr#&aFd=q{T=@Kh`3+<%V;nPegIFuhoAre literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/colorama/__init__ 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/colorama/__init__ 2.py new file mode 100644 index 0000000..34c263c --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/colorama/__init__ 2.py @@ -0,0 +1,6 @@ +# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. +from .initialise import init, deinit, reinit, colorama_text +from .ansi import Fore, Back, Style, Cursor +from .ansitowin32 import AnsiToWin32 + +__version__ = '0.4.3' diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/colorama/__init__ 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/colorama/__init__ 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..08e728f558c4d6b0f8c10d6bd239689aad2d1f1a GIT binary patch literal 530 zcmYLF%TB{E5Zokv(SpP`aLR?cP$VvZcpnimAS55KLKBL?j)T1v%GYt_d-wr%%gc%< z-tp}0uCvdT{>S_7%>;f{O8N@a6jTZ>1C@bmfoeg*iWF=cTnAJK zTo+UqTn|(a+!CmzZ$$>S4{iWzKrtmQL)nIlyh9~SLXfuzkipajk@>RvJBIJ$3b7M! zeJEU^v3kY-tWzJVMfzbedBipeFK}+Fh0)P-h(6?81_uNObu^d$+SKFC$jZ@hYdAj3 z*&X`?T-FrU#7a^Gk`pDrip&TWRSL3@+^u8-$?eK6U$Q@6qJLq3+5086o>d_lUu&Hc z2mcTo3PlsltiVdliXiU1ElDh8Ee@q9kR2SnT+zub>#O>1!}8q=(s yI$~k%`oZx@JilUUv8iHR`XGLvOlZxcX+3P_$c^ndUq0Jvk7tWK!&TS5<2^x1Uji1uC7=>;DX0`&1}X#B0@Z?q6)D&@xDKce zxGtzJxE`n;xGhjy----uAKU=cfMQDAhO!Med521vgdlGbAcLt5BJ*YScMRXh9b#wR z`cSw+W3|HntScX?P5MPKd&V{iZ*Xm^jnU<6h(6?81_uP^bu_pB&eW5G$jb3(I+|SP z?2df`E^7*FVkId8$%&F*MP>w>Dg{|c?pCsa&SzslWMG$juOA?DkBg&Vj#rt%=KYrMstk+9?Ld2uV+vAwlq87KJG0mQ- xBNo=~9UL8AE6LPmQ^mUULHs_M(3(fndep3u8#{Kse6`gn&lY)xVKPj1(=V4{abo}g literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/colorama/ansi 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/colorama/ansi 2.py new file mode 100644 index 0000000..7877658 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/colorama/ansi 2.py @@ -0,0 +1,102 @@ +# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. +''' +This module generates ANSI character codes to printing colors to terminals. +See: http://en.wikipedia.org/wiki/ANSI_escape_code +''' + +CSI = '\033[' +OSC = '\033]' +BEL = '\007' + + +def code_to_chars(code): + return CSI + str(code) + 'm' + +def set_title(title): + return OSC + '2;' + title + BEL + +def clear_screen(mode=2): + return CSI + str(mode) + 'J' + +def clear_line(mode=2): + return CSI + str(mode) + 'K' + + +class AnsiCodes(object): + def __init__(self): + # the subclasses declare class attributes which are numbers. + # Upon instantiation we define instance attributes, which are the same + # as the class attributes but wrapped with the ANSI escape sequence + for name in dir(self): + if not name.startswith('_'): + value = getattr(self, name) + setattr(self, name, code_to_chars(value)) + + +class AnsiCursor(object): + def UP(self, n=1): + return CSI + str(n) + 'A' + def DOWN(self, n=1): + return CSI + str(n) + 'B' + def FORWARD(self, n=1): + return CSI + str(n) + 'C' + def BACK(self, n=1): + return CSI + str(n) + 'D' + def POS(self, x=1, y=1): + return CSI + str(y) + ';' + str(x) + 'H' + + +class AnsiFore(AnsiCodes): + BLACK = 30 + RED = 31 + GREEN = 32 + YELLOW = 33 + BLUE = 34 + MAGENTA = 35 + CYAN = 36 + WHITE = 37 + RESET = 39 + + # These are fairly well supported, but not part of the standard. + LIGHTBLACK_EX = 90 + LIGHTRED_EX = 91 + LIGHTGREEN_EX = 92 + LIGHTYELLOW_EX = 93 + LIGHTBLUE_EX = 94 + LIGHTMAGENTA_EX = 95 + LIGHTCYAN_EX = 96 + LIGHTWHITE_EX = 97 + + +class AnsiBack(AnsiCodes): + BLACK = 40 + RED = 41 + GREEN = 42 + YELLOW = 43 + BLUE = 44 + MAGENTA = 45 + CYAN = 46 + WHITE = 47 + RESET = 49 + + # These are fairly well supported, but not part of the standard. + LIGHTBLACK_EX = 100 + LIGHTRED_EX = 101 + LIGHTGREEN_EX = 102 + LIGHTYELLOW_EX = 103 + LIGHTBLUE_EX = 104 + LIGHTMAGENTA_EX = 105 + LIGHTCYAN_EX = 106 + LIGHTWHITE_EX = 107 + + +class AnsiStyle(AnsiCodes): + BRIGHT = 1 + DIM = 2 + NORMAL = 22 + RESET_ALL = 0 + +Fore = AnsiFore() +Back = AnsiBack() +Style = AnsiStyle() +Cursor = AnsiCursor() diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/colorama/ansi 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/colorama/ansi 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..61ccae63f2cef46b380f6aa9ce93093c447a30be GIT binary patch literal 5184 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 literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/colorama/ansitowin32 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/colorama/ansitowin32 2.py new file mode 100644 index 0000000..359c92b --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/colorama/ansitowin32 2.py @@ -0,0 +1,257 @@ +# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. +import re +import sys +import os + +from .ansi import AnsiFore, AnsiBack, AnsiStyle, Style +from .winterm import WinTerm, WinColor, WinStyle +from .win32 import windll, winapi_test + + +winterm = None +if windll is not None: + winterm = WinTerm() + + +class StreamWrapper(object): + ''' + Wraps a stream (such as stdout), acting as a transparent proxy for all + attribute access apart from method 'write()', which is delegated to our + Converter instance. + ''' + def __init__(self, wrapped, converter): + # double-underscore everything to prevent clashes with names of + # attributes on the wrapped stream object. + self.__wrapped = wrapped + self.__convertor = converter + + def __getattr__(self, name): + return getattr(self.__wrapped, name) + + def __enter__(self, *args, **kwargs): + # special method lookup bypasses __getattr__/__getattribute__, see + # https://stackoverflow.com/questions/12632894/why-doesnt-getattr-work-with-exit + # thus, contextlib magic methods are not proxied via __getattr__ + return self.__wrapped.__enter__(*args, **kwargs) + + def __exit__(self, *args, **kwargs): + return self.__wrapped.__exit__(*args, **kwargs) + + def write(self, text): + self.__convertor.write(text) + + def isatty(self): + stream = self.__wrapped + if 'PYCHARM_HOSTED' in os.environ: + if stream is not None and (stream is sys.__stdout__ or stream is sys.__stderr__): + return True + try: + stream_isatty = stream.isatty + except AttributeError: + return False + else: + return stream_isatty() + + @property + def closed(self): + stream = self.__wrapped + try: + return stream.closed + except AttributeError: + return True + + +class AnsiToWin32(object): + ''' + Implements a 'write()' method which, on Windows, will strip ANSI character + sequences from the text, and if outputting to a tty, will convert them into + win32 function calls. + ''' + ANSI_CSI_RE = re.compile('\001?\033\\[((?:\\d|;)*)([a-zA-Z])\002?') # Control Sequence Introducer + ANSI_OSC_RE = re.compile('\001?\033\\]((?:.|;)*?)(\x07)\002?') # Operating System Command + + def __init__(self, wrapped, convert=None, strip=None, autoreset=False): + # The wrapped stream (normally sys.stdout or sys.stderr) + self.wrapped = wrapped + + # should we reset colors to defaults after every .write() + self.autoreset = autoreset + + # create the proxy wrapping our output stream + self.stream = StreamWrapper(wrapped, self) + + on_windows = os.name == 'nt' + # We test if the WinAPI works, because even if we are on Windows + # we may be using a terminal that doesn't support the WinAPI + # (e.g. Cygwin Terminal). In this case it's up to the terminal + # to support the ANSI codes. + conversion_supported = on_windows and winapi_test() + + # should we strip ANSI sequences from our output? + if strip is None: + strip = conversion_supported or (not self.stream.closed and not self.stream.isatty()) + self.strip = strip + + # should we should convert ANSI sequences into win32 calls? + if convert is None: + convert = conversion_supported and not self.stream.closed and self.stream.isatty() + self.convert = convert + + # dict of ansi codes to win32 functions and parameters + self.win32_calls = self.get_win32_calls() + + # are we wrapping stderr? + self.on_stderr = self.wrapped is sys.stderr + + def should_wrap(self): + ''' + True if this class is actually needed. If false, then the output + stream will not be affected, nor will win32 calls be issued, so + wrapping stdout is not actually required. This will generally be + False on non-Windows platforms, unless optional functionality like + autoreset has been requested using kwargs to init() + ''' + return self.convert or self.strip or self.autoreset + + def get_win32_calls(self): + if self.convert and winterm: + return { + AnsiStyle.RESET_ALL: (winterm.reset_all, ), + AnsiStyle.BRIGHT: (winterm.style, WinStyle.BRIGHT), + AnsiStyle.DIM: (winterm.style, WinStyle.NORMAL), + AnsiStyle.NORMAL: (winterm.style, WinStyle.NORMAL), + AnsiFore.BLACK: (winterm.fore, WinColor.BLACK), + AnsiFore.RED: (winterm.fore, WinColor.RED), + AnsiFore.GREEN: (winterm.fore, WinColor.GREEN), + AnsiFore.YELLOW: (winterm.fore, WinColor.YELLOW), + AnsiFore.BLUE: (winterm.fore, WinColor.BLUE), + AnsiFore.MAGENTA: (winterm.fore, WinColor.MAGENTA), + AnsiFore.CYAN: (winterm.fore, WinColor.CYAN), + AnsiFore.WHITE: (winterm.fore, WinColor.GREY), + AnsiFore.RESET: (winterm.fore, ), + AnsiFore.LIGHTBLACK_EX: (winterm.fore, WinColor.BLACK, True), + AnsiFore.LIGHTRED_EX: (winterm.fore, WinColor.RED, True), + AnsiFore.LIGHTGREEN_EX: (winterm.fore, WinColor.GREEN, True), + AnsiFore.LIGHTYELLOW_EX: (winterm.fore, WinColor.YELLOW, True), + AnsiFore.LIGHTBLUE_EX: (winterm.fore, WinColor.BLUE, True), + AnsiFore.LIGHTMAGENTA_EX: (winterm.fore, WinColor.MAGENTA, True), + AnsiFore.LIGHTCYAN_EX: (winterm.fore, WinColor.CYAN, True), + AnsiFore.LIGHTWHITE_EX: (winterm.fore, WinColor.GREY, True), + AnsiBack.BLACK: (winterm.back, WinColor.BLACK), + AnsiBack.RED: (winterm.back, WinColor.RED), + AnsiBack.GREEN: (winterm.back, WinColor.GREEN), + AnsiBack.YELLOW: (winterm.back, WinColor.YELLOW), + AnsiBack.BLUE: (winterm.back, WinColor.BLUE), + AnsiBack.MAGENTA: (winterm.back, WinColor.MAGENTA), + AnsiBack.CYAN: (winterm.back, WinColor.CYAN), + AnsiBack.WHITE: (winterm.back, WinColor.GREY), + AnsiBack.RESET: (winterm.back, ), + AnsiBack.LIGHTBLACK_EX: (winterm.back, WinColor.BLACK, True), + AnsiBack.LIGHTRED_EX: (winterm.back, WinColor.RED, True), + AnsiBack.LIGHTGREEN_EX: (winterm.back, WinColor.GREEN, True), + AnsiBack.LIGHTYELLOW_EX: (winterm.back, WinColor.YELLOW, True), + AnsiBack.LIGHTBLUE_EX: (winterm.back, WinColor.BLUE, True), + AnsiBack.LIGHTMAGENTA_EX: (winterm.back, WinColor.MAGENTA, True), + AnsiBack.LIGHTCYAN_EX: (winterm.back, WinColor.CYAN, True), + AnsiBack.LIGHTWHITE_EX: (winterm.back, WinColor.GREY, True), + } + return dict() + + def write(self, text): + if self.strip or self.convert: + self.write_and_convert(text) + else: + self.wrapped.write(text) + self.wrapped.flush() + if self.autoreset: + self.reset_all() + + + def reset_all(self): + if self.convert: + self.call_win32('m', (0,)) + elif not self.strip and not self.stream.closed: + self.wrapped.write(Style.RESET_ALL) + + + def write_and_convert(self, text): + ''' + Write the given text to our wrapped stream, stripping any ANSI + sequences from the text, and optionally converting them into win32 + calls. + ''' + cursor = 0 + text = self.convert_osc(text) + for match in self.ANSI_CSI_RE.finditer(text): + start, end = match.span() + self.write_plain_text(text, cursor, start) + self.convert_ansi(*match.groups()) + cursor = end + self.write_plain_text(text, cursor, len(text)) + + + def write_plain_text(self, text, start, end): + if start < end: + self.wrapped.write(text[start:end]) + self.wrapped.flush() + + + def convert_ansi(self, paramstring, command): + if self.convert: + params = self.extract_params(command, paramstring) + self.call_win32(command, params) + + + def extract_params(self, command, paramstring): + if command in 'Hf': + params = tuple(int(p) if len(p) != 0 else 1 for p in paramstring.split(';')) + while len(params) < 2: + # defaults: + params = params + (1,) + else: + params = tuple(int(p) for p in paramstring.split(';') if len(p) != 0) + if len(params) == 0: + # defaults: + if command in 'JKm': + params = (0,) + elif command in 'ABCD': + params = (1,) + + return params + + + def call_win32(self, command, params): + if command == 'm': + for param in params: + if param in self.win32_calls: + func_args = self.win32_calls[param] + func = func_args[0] + args = func_args[1:] + kwargs = dict(on_stderr=self.on_stderr) + func(*args, **kwargs) + elif command in 'J': + winterm.erase_screen(params[0], on_stderr=self.on_stderr) + elif command in 'K': + winterm.erase_line(params[0], on_stderr=self.on_stderr) + elif command in 'Hf': # cursor position - absolute + winterm.set_cursor_position(params, on_stderr=self.on_stderr) + elif command in 'ABCD': # cursor position - relative + n = params[0] + # A - up, B - down, C - forward, D - back + x, y = {'A': (0, -n), 'B': (0, n), 'C': (n, 0), 'D': (-n, 0)}[command] + winterm.cursor_adjust(x, y, on_stderr=self.on_stderr) + + + def convert_osc(self, text): + for match in self.ANSI_OSC_RE.finditer(text): + start, end = match.span() + text = text[:start] + text[end:] + paramstring, command = match.groups() + if command in '\x07': # \x07 = BEL + params = paramstring.split(";") + # 0 - change title and icon (we will only change title) + # 1 - change icon (we don't support this) + # 2 - change title + if params[0] in '02': + winterm.set_title(params[1]) + return text diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/colorama/ansitowin32 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/colorama/ansitowin32 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d57a9b7495224b588b70144dc0fd24d6b0ef903c GIT binary patch literal 11113 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 literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/colorama/ansitowin32.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/colorama/ansitowin32.py new file mode 100644 index 0000000..359c92b --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/colorama/ansitowin32.py @@ -0,0 +1,257 @@ +# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. +import re +import sys +import os + +from .ansi import AnsiFore, AnsiBack, AnsiStyle, Style +from .winterm import WinTerm, WinColor, WinStyle +from .win32 import windll, winapi_test + + +winterm = None +if windll is not None: + winterm = WinTerm() + + +class StreamWrapper(object): + ''' + Wraps a stream (such as stdout), acting as a transparent proxy for all + attribute access apart from method 'write()', which is delegated to our + Converter instance. + ''' + def __init__(self, wrapped, converter): + # double-underscore everything to prevent clashes with names of + # attributes on the wrapped stream object. + self.__wrapped = wrapped + self.__convertor = converter + + def __getattr__(self, name): + return getattr(self.__wrapped, name) + + def __enter__(self, *args, **kwargs): + # special method lookup bypasses __getattr__/__getattribute__, see + # https://stackoverflow.com/questions/12632894/why-doesnt-getattr-work-with-exit + # thus, contextlib magic methods are not proxied via __getattr__ + return self.__wrapped.__enter__(*args, **kwargs) + + def __exit__(self, *args, **kwargs): + return self.__wrapped.__exit__(*args, **kwargs) + + def write(self, text): + self.__convertor.write(text) + + def isatty(self): + stream = self.__wrapped + if 'PYCHARM_HOSTED' in os.environ: + if stream is not None and (stream is sys.__stdout__ or stream is sys.__stderr__): + return True + try: + stream_isatty = stream.isatty + except AttributeError: + return False + else: + return stream_isatty() + + @property + def closed(self): + stream = self.__wrapped + try: + return stream.closed + except AttributeError: + return True + + +class AnsiToWin32(object): + ''' + Implements a 'write()' method which, on Windows, will strip ANSI character + sequences from the text, and if outputting to a tty, will convert them into + win32 function calls. + ''' + ANSI_CSI_RE = re.compile('\001?\033\\[((?:\\d|;)*)([a-zA-Z])\002?') # Control Sequence Introducer + ANSI_OSC_RE = re.compile('\001?\033\\]((?:.|;)*?)(\x07)\002?') # Operating System Command + + def __init__(self, wrapped, convert=None, strip=None, autoreset=False): + # The wrapped stream (normally sys.stdout or sys.stderr) + self.wrapped = wrapped + + # should we reset colors to defaults after every .write() + self.autoreset = autoreset + + # create the proxy wrapping our output stream + self.stream = StreamWrapper(wrapped, self) + + on_windows = os.name == 'nt' + # We test if the WinAPI works, because even if we are on Windows + # we may be using a terminal that doesn't support the WinAPI + # (e.g. Cygwin Terminal). In this case it's up to the terminal + # to support the ANSI codes. + conversion_supported = on_windows and winapi_test() + + # should we strip ANSI sequences from our output? + if strip is None: + strip = conversion_supported or (not self.stream.closed and not self.stream.isatty()) + self.strip = strip + + # should we should convert ANSI sequences into win32 calls? + if convert is None: + convert = conversion_supported and not self.stream.closed and self.stream.isatty() + self.convert = convert + + # dict of ansi codes to win32 functions and parameters + self.win32_calls = self.get_win32_calls() + + # are we wrapping stderr? + self.on_stderr = self.wrapped is sys.stderr + + def should_wrap(self): + ''' + True if this class is actually needed. If false, then the output + stream will not be affected, nor will win32 calls be issued, so + wrapping stdout is not actually required. This will generally be + False on non-Windows platforms, unless optional functionality like + autoreset has been requested using kwargs to init() + ''' + return self.convert or self.strip or self.autoreset + + def get_win32_calls(self): + if self.convert and winterm: + return { + AnsiStyle.RESET_ALL: (winterm.reset_all, ), + AnsiStyle.BRIGHT: (winterm.style, WinStyle.BRIGHT), + AnsiStyle.DIM: (winterm.style, WinStyle.NORMAL), + AnsiStyle.NORMAL: (winterm.style, WinStyle.NORMAL), + AnsiFore.BLACK: (winterm.fore, WinColor.BLACK), + AnsiFore.RED: (winterm.fore, WinColor.RED), + AnsiFore.GREEN: (winterm.fore, WinColor.GREEN), + AnsiFore.YELLOW: (winterm.fore, WinColor.YELLOW), + AnsiFore.BLUE: (winterm.fore, WinColor.BLUE), + AnsiFore.MAGENTA: (winterm.fore, WinColor.MAGENTA), + AnsiFore.CYAN: (winterm.fore, WinColor.CYAN), + AnsiFore.WHITE: (winterm.fore, WinColor.GREY), + AnsiFore.RESET: (winterm.fore, ), + AnsiFore.LIGHTBLACK_EX: (winterm.fore, WinColor.BLACK, True), + AnsiFore.LIGHTRED_EX: (winterm.fore, WinColor.RED, True), + AnsiFore.LIGHTGREEN_EX: (winterm.fore, WinColor.GREEN, True), + AnsiFore.LIGHTYELLOW_EX: (winterm.fore, WinColor.YELLOW, True), + AnsiFore.LIGHTBLUE_EX: (winterm.fore, WinColor.BLUE, True), + AnsiFore.LIGHTMAGENTA_EX: (winterm.fore, WinColor.MAGENTA, True), + AnsiFore.LIGHTCYAN_EX: (winterm.fore, WinColor.CYAN, True), + AnsiFore.LIGHTWHITE_EX: (winterm.fore, WinColor.GREY, True), + AnsiBack.BLACK: (winterm.back, WinColor.BLACK), + AnsiBack.RED: (winterm.back, WinColor.RED), + AnsiBack.GREEN: (winterm.back, WinColor.GREEN), + AnsiBack.YELLOW: (winterm.back, WinColor.YELLOW), + AnsiBack.BLUE: (winterm.back, WinColor.BLUE), + AnsiBack.MAGENTA: (winterm.back, WinColor.MAGENTA), + AnsiBack.CYAN: (winterm.back, WinColor.CYAN), + AnsiBack.WHITE: (winterm.back, WinColor.GREY), + AnsiBack.RESET: (winterm.back, ), + AnsiBack.LIGHTBLACK_EX: (winterm.back, WinColor.BLACK, True), + AnsiBack.LIGHTRED_EX: (winterm.back, WinColor.RED, True), + AnsiBack.LIGHTGREEN_EX: (winterm.back, WinColor.GREEN, True), + AnsiBack.LIGHTYELLOW_EX: (winterm.back, WinColor.YELLOW, True), + AnsiBack.LIGHTBLUE_EX: (winterm.back, WinColor.BLUE, True), + AnsiBack.LIGHTMAGENTA_EX: (winterm.back, WinColor.MAGENTA, True), + AnsiBack.LIGHTCYAN_EX: (winterm.back, WinColor.CYAN, True), + AnsiBack.LIGHTWHITE_EX: (winterm.back, WinColor.GREY, True), + } + return dict() + + def write(self, text): + if self.strip or self.convert: + self.write_and_convert(text) + else: + self.wrapped.write(text) + self.wrapped.flush() + if self.autoreset: + self.reset_all() + + + def reset_all(self): + if self.convert: + self.call_win32('m', (0,)) + elif not self.strip and not self.stream.closed: + self.wrapped.write(Style.RESET_ALL) + + + def write_and_convert(self, text): + ''' + Write the given text to our wrapped stream, stripping any ANSI + sequences from the text, and optionally converting them into win32 + calls. + ''' + cursor = 0 + text = self.convert_osc(text) + for match in self.ANSI_CSI_RE.finditer(text): + start, end = match.span() + self.write_plain_text(text, cursor, start) + self.convert_ansi(*match.groups()) + cursor = end + self.write_plain_text(text, cursor, len(text)) + + + def write_plain_text(self, text, start, end): + if start < end: + self.wrapped.write(text[start:end]) + self.wrapped.flush() + + + def convert_ansi(self, paramstring, command): + if self.convert: + params = self.extract_params(command, paramstring) + self.call_win32(command, params) + + + def extract_params(self, command, paramstring): + if command in 'Hf': + params = tuple(int(p) if len(p) != 0 else 1 for p in paramstring.split(';')) + while len(params) < 2: + # defaults: + params = params + (1,) + else: + params = tuple(int(p) for p in paramstring.split(';') if len(p) != 0) + if len(params) == 0: + # defaults: + if command in 'JKm': + params = (0,) + elif command in 'ABCD': + params = (1,) + + return params + + + def call_win32(self, command, params): + if command == 'm': + for param in params: + if param in self.win32_calls: + func_args = self.win32_calls[param] + func = func_args[0] + args = func_args[1:] + kwargs = dict(on_stderr=self.on_stderr) + func(*args, **kwargs) + elif command in 'J': + winterm.erase_screen(params[0], on_stderr=self.on_stderr) + elif command in 'K': + winterm.erase_line(params[0], on_stderr=self.on_stderr) + elif command in 'Hf': # cursor position - absolute + winterm.set_cursor_position(params, on_stderr=self.on_stderr) + elif command in 'ABCD': # cursor position - relative + n = params[0] + # A - up, B - down, C - forward, D - back + x, y = {'A': (0, -n), 'B': (0, n), 'C': (n, 0), 'D': (-n, 0)}[command] + winterm.cursor_adjust(x, y, on_stderr=self.on_stderr) + + + def convert_osc(self, text): + for match in self.ANSI_OSC_RE.finditer(text): + start, end = match.span() + text = text[:start] + text[end:] + paramstring, command = match.groups() + if command in '\x07': # \x07 = BEL + params = paramstring.split(";") + # 0 - change title and icon (we will only change title) + # 1 - change icon (we don't support this) + # 2 - change title + if params[0] in '02': + winterm.set_title(params[1]) + return text diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/colorama/ansitowin32.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/colorama/ansitowin32.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1e7363d761c11fa40e5a858c9d8cb8b27860bd99 GIT binary patch literal 11113 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 literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/colorama/initialise 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/colorama/initialise 2.py new file mode 100644 index 0000000..430d066 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/colorama/initialise 2.py @@ -0,0 +1,80 @@ +# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. +import atexit +import contextlib +import sys + +from .ansitowin32 import AnsiToWin32 + + +orig_stdout = None +orig_stderr = None + +wrapped_stdout = None +wrapped_stderr = None + +atexit_done = False + + +def reset_all(): + if AnsiToWin32 is not None: # Issue #74: objects might become None at exit + AnsiToWin32(orig_stdout).reset_all() + + +def init(autoreset=False, convert=None, strip=None, wrap=True): + + if not wrap and any([autoreset, convert, strip]): + raise ValueError('wrap=False conflicts with any other arg=True') + + global wrapped_stdout, wrapped_stderr + global orig_stdout, orig_stderr + + orig_stdout = sys.stdout + orig_stderr = sys.stderr + + if sys.stdout is None: + wrapped_stdout = None + else: + sys.stdout = wrapped_stdout = \ + wrap_stream(orig_stdout, convert, strip, autoreset, wrap) + if sys.stderr is None: + wrapped_stderr = None + else: + sys.stderr = wrapped_stderr = \ + wrap_stream(orig_stderr, convert, strip, autoreset, wrap) + + global atexit_done + if not atexit_done: + atexit.register(reset_all) + atexit_done = True + + +def deinit(): + if orig_stdout is not None: + sys.stdout = orig_stdout + if orig_stderr is not None: + sys.stderr = orig_stderr + + +@contextlib.contextmanager +def colorama_text(*args, **kwargs): + init(*args, **kwargs) + try: + yield + finally: + deinit() + + +def reinit(): + if wrapped_stdout is not None: + sys.stdout = wrapped_stdout + if wrapped_stderr is not None: + sys.stderr = wrapped_stderr + + +def wrap_stream(stream, convert, strip, autoreset, wrap): + if wrap: + wrapper = AnsiToWin32(stream, + convert=convert, strip=strip, autoreset=autoreset) + if wrapper.should_wrap(): + stream = wrapper.stream + return stream diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/colorama/initialise 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/colorama/initialise 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b38d5514fbfea034d29f5ece2ce235f4eec9c93e GIT binary patch literal 2683 zcmc&$-EJF26h5=-zjf_6O$mRBR7(iS5)`MT5)vYms+0>ZEVM~mlnbn>cjBzG*>z{e z4yn=`(o4iU@Fv_L#N+S)aK5v4tRQZYH#;Y1e$LFs9jWDbKt};3{Dzc;bXK9G3Mn?wHJItT$cD&>Oq292N-Fe*w`-xx zYxp&7N~-jRjW;N%$!v#=qRA#Db#$-z$lH`OWNM3&NR&IUJ?J&r%k*!42B~7T2jOqA zc$B;Juy~&4d!Jr^TfpOwxw#LpNVq$?to%iMwNHt1D&bkJ3rawXPoyB`_puKFU_6jeeXT``icAQDTbsC=O#}I+aDEKVfC5r zr+MmAou$rvGQEgHK6ZF#JfJOkT+zs3EhE=NY>LJ@V7WNCXpT(@XG^_om z8K2ffVBPQJTQq5t-++(GcfhJ;yb$1l`>@J)KW@WHroU-g2Yj2Q&`>}9vgBQVx zsY#Y30WC4aeQWd?f5D9<%dMCtKc;?|fM+o49SsVlB6+WV^DT5{Yi2+P| z?39CN$YcBoC;$YpFSxl6SzIUaFTC(o1SFoR=PWsquXyNtR+m)`#_=}9+bnuQYHY?? zQL_E?9O?>+b)nE^rTm>6oP*%s=ywZf3c ztleY?(jN10S7sqDD`X!oc)}MbS7^S!x#aT|jv}qX*HyZ#(nR>eE1?JUn&{<2WD(c$ z1Gx_eF|L;Q4#aI1y$~9=^7eHn#VkvPs5Og9iHcWd-VRpYw2t3`A#$)RnRW&5nvjiA ztiR>v5OPvA6{&5`yN>F?*BG^1t_m));AED*kU}Dtf#%;HzBtEk4}qj)ktCdy7-1In zmC`J?R1B6&S&wlWtrAmiiNzsjI@e>a{_kN0il%tE!fLHl1kJuUE0S4ezQm_G#94|} Uu*r427Dx-D>h?}l--@F8KgbJCnE(I) literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/colorama/initialise.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/colorama/initialise.py new file mode 100644 index 0000000..430d066 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/colorama/initialise.py @@ -0,0 +1,80 @@ +# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. +import atexit +import contextlib +import sys + +from .ansitowin32 import AnsiToWin32 + + +orig_stdout = None +orig_stderr = None + +wrapped_stdout = None +wrapped_stderr = None + +atexit_done = False + + +def reset_all(): + if AnsiToWin32 is not None: # Issue #74: objects might become None at exit + AnsiToWin32(orig_stdout).reset_all() + + +def init(autoreset=False, convert=None, strip=None, wrap=True): + + if not wrap and any([autoreset, convert, strip]): + raise ValueError('wrap=False conflicts with any other arg=True') + + global wrapped_stdout, wrapped_stderr + global orig_stdout, orig_stderr + + orig_stdout = sys.stdout + orig_stderr = sys.stderr + + if sys.stdout is None: + wrapped_stdout = None + else: + sys.stdout = wrapped_stdout = \ + wrap_stream(orig_stdout, convert, strip, autoreset, wrap) + if sys.stderr is None: + wrapped_stderr = None + else: + sys.stderr = wrapped_stderr = \ + wrap_stream(orig_stderr, convert, strip, autoreset, wrap) + + global atexit_done + if not atexit_done: + atexit.register(reset_all) + atexit_done = True + + +def deinit(): + if orig_stdout is not None: + sys.stdout = orig_stdout + if orig_stderr is not None: + sys.stderr = orig_stderr + + +@contextlib.contextmanager +def colorama_text(*args, **kwargs): + init(*args, **kwargs) + try: + yield + finally: + deinit() + + +def reinit(): + if wrapped_stdout is not None: + sys.stdout = wrapped_stdout + if wrapped_stderr is not None: + sys.stderr = wrapped_stderr + + +def wrap_stream(stream, convert, strip, autoreset, wrap): + if wrap: + wrapper = AnsiToWin32(stream, + convert=convert, strip=strip, autoreset=autoreset) + if wrapper.should_wrap(): + stream = wrapper.stream + return stream diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/colorama/initialise.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/colorama/initialise.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dcd64a1d2650b43d07ebf58764f76d4370d87f9c GIT binary patch literal 2683 zcmc&$OK;mo5S}IVq9a+36ZZuJF;El`(57Ku#yhyIkFdg#yT4`}Bbz2KtPLNs?g`=0+Y`r^t<* zP}p?Pb3Q31-bXxPjWfQdv#f=+YvC+++hdzfwKwglw(YYbON@2x!ML5g8V=q(I(u;V z^1;#7)zlBY_fL*4&ky+-QkMi&U`+;ibFnjmz#svr0S{<1+BtOaQKszSx9yJDIl2ft7sO`fKgC{L5UFSKPzHP z7$XKqmqaNe%=3|i=%PmU2k=7IC}%(;fHmI@+wz8GD)H(b+t(KM3$tIuY-?#&`A;)G zZ3}^Qe~_=!ut9zsJ}Tb?tCsOXfIIFpmX}tKkH6EIGY9=5Kg-g-cL$fLKR?j<)j{FU zjXltIaC~YfrnSQc9&quT2cw?rY+}B(wy-knuAB#E^I*p~W!X2@-XH__W8vU7FM<j(3{vNfmDma!#ec+9D5xjC5E}X_ z5AlajjrATW%}1tVv495~C#QGFU=BvmP$4ts|6vFU!M_<&#~9+UhDEeZVFT`3VaPMq zZZZUEk9oK&vk|N}A1iNK$9G|f9GsU-yM}i|$i^tv z-*a;aIjM?@)E?(uQ?=l0jM^<%1s7RxGD}}dA(6{K^KTDdT;jKfKr&~MB%G8OVHWn4 z(k!=B43j78)53vG8Q@mVbwNWa9W?znqWRjV$@Tm@QmSPp` Ta2>A%(!!{`w;xq^qp121M*>Vr literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/colorama/win32 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/colorama/win32 2.py new file mode 100644 index 0000000..c2d8360 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/colorama/win32 2.py @@ -0,0 +1,152 @@ +# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. + +# from winbase.h +STDOUT = -11 +STDERR = -12 + +try: + import ctypes + from ctypes import LibraryLoader + windll = LibraryLoader(ctypes.WinDLL) + from ctypes import wintypes +except (AttributeError, ImportError): + windll = None + SetConsoleTextAttribute = lambda *_: None + winapi_test = lambda *_: None +else: + from ctypes import byref, Structure, c_char, POINTER + + COORD = wintypes._COORD + + class CONSOLE_SCREEN_BUFFER_INFO(Structure): + """struct in wincon.h.""" + _fields_ = [ + ("dwSize", COORD), + ("dwCursorPosition", COORD), + ("wAttributes", wintypes.WORD), + ("srWindow", wintypes.SMALL_RECT), + ("dwMaximumWindowSize", COORD), + ] + def __str__(self): + return '(%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d)' % ( + self.dwSize.Y, self.dwSize.X + , self.dwCursorPosition.Y, self.dwCursorPosition.X + , self.wAttributes + , self.srWindow.Top, self.srWindow.Left, self.srWindow.Bottom, self.srWindow.Right + , self.dwMaximumWindowSize.Y, self.dwMaximumWindowSize.X + ) + + _GetStdHandle = windll.kernel32.GetStdHandle + _GetStdHandle.argtypes = [ + wintypes.DWORD, + ] + _GetStdHandle.restype = wintypes.HANDLE + + _GetConsoleScreenBufferInfo = windll.kernel32.GetConsoleScreenBufferInfo + _GetConsoleScreenBufferInfo.argtypes = [ + wintypes.HANDLE, + POINTER(CONSOLE_SCREEN_BUFFER_INFO), + ] + _GetConsoleScreenBufferInfo.restype = wintypes.BOOL + + _SetConsoleTextAttribute = windll.kernel32.SetConsoleTextAttribute + _SetConsoleTextAttribute.argtypes = [ + wintypes.HANDLE, + wintypes.WORD, + ] + _SetConsoleTextAttribute.restype = wintypes.BOOL + + _SetConsoleCursorPosition = windll.kernel32.SetConsoleCursorPosition + _SetConsoleCursorPosition.argtypes = [ + wintypes.HANDLE, + COORD, + ] + _SetConsoleCursorPosition.restype = wintypes.BOOL + + _FillConsoleOutputCharacterA = windll.kernel32.FillConsoleOutputCharacterA + _FillConsoleOutputCharacterA.argtypes = [ + wintypes.HANDLE, + c_char, + wintypes.DWORD, + COORD, + POINTER(wintypes.DWORD), + ] + _FillConsoleOutputCharacterA.restype = wintypes.BOOL + + _FillConsoleOutputAttribute = windll.kernel32.FillConsoleOutputAttribute + _FillConsoleOutputAttribute.argtypes = [ + wintypes.HANDLE, + wintypes.WORD, + wintypes.DWORD, + COORD, + POINTER(wintypes.DWORD), + ] + _FillConsoleOutputAttribute.restype = wintypes.BOOL + + _SetConsoleTitleW = windll.kernel32.SetConsoleTitleW + _SetConsoleTitleW.argtypes = [ + wintypes.LPCWSTR + ] + _SetConsoleTitleW.restype = wintypes.BOOL + + def _winapi_test(handle): + csbi = CONSOLE_SCREEN_BUFFER_INFO() + success = _GetConsoleScreenBufferInfo( + handle, byref(csbi)) + return bool(success) + + def winapi_test(): + return any(_winapi_test(h) for h in + (_GetStdHandle(STDOUT), _GetStdHandle(STDERR))) + + def GetConsoleScreenBufferInfo(stream_id=STDOUT): + handle = _GetStdHandle(stream_id) + csbi = CONSOLE_SCREEN_BUFFER_INFO() + success = _GetConsoleScreenBufferInfo( + handle, byref(csbi)) + return csbi + + def SetConsoleTextAttribute(stream_id, attrs): + handle = _GetStdHandle(stream_id) + return _SetConsoleTextAttribute(handle, attrs) + + def SetConsoleCursorPosition(stream_id, position, adjust=True): + position = COORD(*position) + # If the position is out of range, do nothing. + if position.Y <= 0 or position.X <= 0: + return + # Adjust for Windows' SetConsoleCursorPosition: + # 1. being 0-based, while ANSI is 1-based. + # 2. expecting (x,y), while ANSI uses (y,x). + adjusted_position = COORD(position.Y - 1, position.X - 1) + if adjust: + # Adjust for viewport's scroll position + sr = GetConsoleScreenBufferInfo(STDOUT).srWindow + adjusted_position.Y += sr.Top + adjusted_position.X += sr.Left + # Resume normal processing + handle = _GetStdHandle(stream_id) + return _SetConsoleCursorPosition(handle, adjusted_position) + + def FillConsoleOutputCharacter(stream_id, char, length, start): + handle = _GetStdHandle(stream_id) + char = c_char(char.encode()) + length = wintypes.DWORD(length) + num_written = wintypes.DWORD(0) + # Note that this is hard-coded for ANSI (vs wide) bytes. + success = _FillConsoleOutputCharacterA( + handle, char, length, start, byref(num_written)) + return num_written.value + + def FillConsoleOutputAttribute(stream_id, attr, length, start): + ''' FillConsoleOutputAttribute( hConsole, csbi.wAttributes, dwConSize, coordScreen, &cCharsWritten )''' + handle = _GetStdHandle(stream_id) + attribute = wintypes.WORD(attr) + length = wintypes.DWORD(length) + num_written = wintypes.DWORD(0) + # Note that this is hard-coded for ANSI (vs wide) bytes. + return _FillConsoleOutputAttribute( + handle, attribute, length, start, byref(num_written)) + + def SetConsoleTitle(title): + return _SetConsoleTitleW(title) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/colorama/win32 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/colorama/win32 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d626efde60c3750864734ced931c73e92987c32a GIT binary patch literal 5862 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 literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/colorama/winterm 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/colorama/winterm 2.py new file mode 100644 index 0000000..0fdb4ec --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/colorama/winterm 2.py @@ -0,0 +1,169 @@ +# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. +from . import win32 + + +# from wincon.h +class WinColor(object): + BLACK = 0 + BLUE = 1 + GREEN = 2 + CYAN = 3 + RED = 4 + MAGENTA = 5 + YELLOW = 6 + GREY = 7 + +# from wincon.h +class WinStyle(object): + NORMAL = 0x00 # dim text, dim background + BRIGHT = 0x08 # bright text, dim background + BRIGHT_BACKGROUND = 0x80 # dim text, bright background + +class WinTerm(object): + + def __init__(self): + self._default = win32.GetConsoleScreenBufferInfo(win32.STDOUT).wAttributes + self.set_attrs(self._default) + self._default_fore = self._fore + self._default_back = self._back + self._default_style = self._style + # In order to emulate LIGHT_EX in windows, we borrow the BRIGHT style. + # So that LIGHT_EX colors and BRIGHT style do not clobber each other, + # we track them separately, since LIGHT_EX is overwritten by Fore/Back + # and BRIGHT is overwritten by Style codes. + self._light = 0 + + def get_attrs(self): + return self._fore + self._back * 16 + (self._style | self._light) + + def set_attrs(self, value): + self._fore = value & 7 + self._back = (value >> 4) & 7 + self._style = value & (WinStyle.BRIGHT | WinStyle.BRIGHT_BACKGROUND) + + def reset_all(self, on_stderr=None): + self.set_attrs(self._default) + self.set_console(attrs=self._default) + self._light = 0 + + def fore(self, fore=None, light=False, on_stderr=False): + if fore is None: + fore = self._default_fore + self._fore = fore + # Emulate LIGHT_EX with BRIGHT Style + if light: + self._light |= WinStyle.BRIGHT + else: + self._light &= ~WinStyle.BRIGHT + self.set_console(on_stderr=on_stderr) + + def back(self, back=None, light=False, on_stderr=False): + if back is None: + back = self._default_back + self._back = back + # Emulate LIGHT_EX with BRIGHT_BACKGROUND Style + if light: + self._light |= WinStyle.BRIGHT_BACKGROUND + else: + self._light &= ~WinStyle.BRIGHT_BACKGROUND + self.set_console(on_stderr=on_stderr) + + def style(self, style=None, on_stderr=False): + if style is None: + style = self._default_style + self._style = style + self.set_console(on_stderr=on_stderr) + + def set_console(self, attrs=None, on_stderr=False): + if attrs is None: + attrs = self.get_attrs() + handle = win32.STDOUT + if on_stderr: + handle = win32.STDERR + win32.SetConsoleTextAttribute(handle, attrs) + + def get_position(self, handle): + position = win32.GetConsoleScreenBufferInfo(handle).dwCursorPosition + # Because Windows coordinates are 0-based, + # and win32.SetConsoleCursorPosition expects 1-based. + position.X += 1 + position.Y += 1 + return position + + def set_cursor_position(self, position=None, on_stderr=False): + if position is None: + # I'm not currently tracking the position, so there is no default. + # position = self.get_position() + return + handle = win32.STDOUT + if on_stderr: + handle = win32.STDERR + win32.SetConsoleCursorPosition(handle, position) + + def cursor_adjust(self, x, y, on_stderr=False): + handle = win32.STDOUT + if on_stderr: + handle = win32.STDERR + position = self.get_position(handle) + adjusted_position = (position.Y + y, position.X + x) + win32.SetConsoleCursorPosition(handle, adjusted_position, adjust=False) + + def erase_screen(self, mode=0, on_stderr=False): + # 0 should clear from the cursor to the end of the screen. + # 1 should clear from the cursor to the beginning of the screen. + # 2 should clear the entire screen, and move cursor to (1,1) + handle = win32.STDOUT + if on_stderr: + handle = win32.STDERR + csbi = win32.GetConsoleScreenBufferInfo(handle) + # get the number of character cells in the current buffer + cells_in_screen = csbi.dwSize.X * csbi.dwSize.Y + # get number of character cells before current cursor position + cells_before_cursor = csbi.dwSize.X * csbi.dwCursorPosition.Y + csbi.dwCursorPosition.X + if mode == 0: + from_coord = csbi.dwCursorPosition + cells_to_erase = cells_in_screen - cells_before_cursor + elif mode == 1: + from_coord = win32.COORD(0, 0) + cells_to_erase = cells_before_cursor + elif mode == 2: + from_coord = win32.COORD(0, 0) + cells_to_erase = cells_in_screen + else: + # invalid mode + return + # fill the entire screen with blanks + win32.FillConsoleOutputCharacter(handle, ' ', cells_to_erase, from_coord) + # now set the buffer's attributes accordingly + win32.FillConsoleOutputAttribute(handle, self.get_attrs(), cells_to_erase, from_coord) + if mode == 2: + # put the cursor where needed + win32.SetConsoleCursorPosition(handle, (1, 1)) + + def erase_line(self, mode=0, on_stderr=False): + # 0 should clear from the cursor to the end of the line. + # 1 should clear from the cursor to the beginning of the line. + # 2 should clear the entire line. + handle = win32.STDOUT + if on_stderr: + handle = win32.STDERR + csbi = win32.GetConsoleScreenBufferInfo(handle) + if mode == 0: + from_coord = csbi.dwCursorPosition + cells_to_erase = csbi.dwSize.X - csbi.dwCursorPosition.X + elif mode == 1: + from_coord = win32.COORD(0, csbi.dwCursorPosition.Y) + cells_to_erase = csbi.dwCursorPosition.X + elif mode == 2: + from_coord = win32.COORD(0, csbi.dwCursorPosition.Y) + cells_to_erase = csbi.dwSize.X + else: + # invalid mode + return + # fill the entire screen with blanks + win32.FillConsoleOutputCharacter(handle, ' ', cells_to_erase, from_coord) + # now set the buffer's attributes accordingly + win32.FillConsoleOutputAttribute(handle, self.get_attrs(), cells_to_erase, from_coord) + + def set_title(self, title): + win32.SetConsoleTitle(title) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/colorama/winterm 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/colorama/winterm 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..055f91320dbdfb61b2008eeb22d79246c956786a GIT binary patch literal 6935 zcmd5>T~i##744b*U>6oGLb5=Xl91R+)^X&OEGNo`Yzr2I6{E$~Ky0Xrx0an*G-%i% zGYuG*s7gh=gOE-3Us#!MeQfyp!pg>ysFwB8Qd?B5&H1+B_;k0huyf@k3!FnljhET)BDrz&X@1?@7~$I zd++%8(Civx?%z9ldIvu{gXVg3KiIz=3=-1~!`t(VOUWl2R7vR^`U5YDn?1tY-Rm|1 zy7A+^clM7pL8fWR6f4g8f5UZIGsmI-?R9w_uYA|K0C_*g{Z*=lD2P%rD%jrL-Wlhj56Rt<*HxP*vVsAP>n-F4uZAtc;j zzkfhv2%Qee%Zl)q6;QY?ZUs_IqN-7pA=j3D z(~1U36#8qu*!Kqu2mQVuKOXcWVb9w7;_Ak_nLy8@d1K;W`@r~#b!X4-cMn2i7=aSs zbh>z+i0gLxQS2K|)JZ#84Vl{6?)ILYeuE~tf>;c}5E z4SuPi~;tViEUXwYxPC=Z6^#YNw@~|5o_@f0& zzXr2@h9c2UIg`%i3vjxF4reJcba~mO`M^Q8;4pz8jEH&}Jo265ht}7HJe*Tsg%CHU zr}nJJTOM(VEJ$3*XaFa~1{seQCK;leL_TKVe^42D+-eAi#4Xx3+u>L7#zl)O4f0Tr-s#|tmb6+8> z^(~mDuTw}M%yAZfzW`@$E1J&sDnLwkdVq2f#H8`CwAkmD5Z_N{5EQ--f+AU9ICzPm zLOKEM28Od6hoHo%@~9~L>#Km!TQF-GC8JX)u-Ko7mj+*;i5l5Nt2VBQ+KL3l+^6bLtt52?C~CiO+twgGEi5Y zNZ@411l8_KWONZhkzz{|$*G&=mju%uM^I6kX}w_*;~ljQ;v|YciITts(ZI0dXCgOc zUl%%RhIvV;_S1eN-h&v$nb{1@*+4sG=X9YC7{ATV578xOC-Q!92H!~>EhXPpY!=ug zB~b^07g3TMgpGNqC}E@iIckQ{FX!QTV9yYdNrVtlU>z}%S73}J9zuf*&_7a5l;Q4$ z;*gbeckZr4Kv?-XDwdTe0#HOS5R?qi&e^k`UOiN_KxC>^{y{ zKyyLl7;b0qy$psCFAmRXJ-aa0v>hnYWwC*x?!4|uLMeo2nwYK4Tlm;?Z7jjFwXp=Z zYl9RD=@@`V)+LEoS}CimT(Ps-F{WKtsY0!!X0UE_C`Ua*K>v&M9aASb_u{>>nmwtg zftDVw^!U42gCoAYgD}soWyNl9OSgh_``1O?O41FHjZO>0aiB)jgVi`+gDXYlP>TaL zz7&-SY`bTk(Mmh`E$LU2w@b3sfTgnA@XTV5;c{gsH)leWIXSCXr9{!}l%9LOji(&K zJ6a3A^eqd8kGG)|Dz;Wv^`ac?9|d8Up6pi-%>IFCJ?+Nb9`2|vew=M)TDCxvTkaMu zrRkHnu=8_1ODfw-wgbcbtLKMd(g|>QkXr;phqt}BS;i`a?-cm zOw{q?F5Cz&jxG~63`Sx{`XLe8iP%(3UBSKP&SCGY;_Oy)rtw!~p$Pp=r{;=>oQq!n z!4Ut4hh$v;EcJ`jK@iI%cF}*x`?4DBp5gspWe(hNAs@8vR3YP`|5n{xI;$62TR2U5WzoC`PL8u{}gi6;TXOT~c6e?wxCocNRCMd}i zqK;gW@J2xJWvpo1dk&5&zL+Nm>w!V`$szK5--wQ#1(}gu88ICYTfTxR>6KBtF-=>= z-~wwuq>y+dml(I$e3ODFBssQfeud`QK{L;_d-Oflc-y3xC>~KfhRC@vvTxVShk2cs z+=M8*)mpVsE!9fX6Vns*a=lWm)W>U;`dt0GJ(VDGz<3JDPNMByzh~rs80;kjhkFG+ YOVaiS_P=yK;QGmR%~bK)#I@3Y0S7>*Y5)KL literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/colorama/winterm.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/colorama/winterm.py new file mode 100644 index 0000000..0fdb4ec --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/colorama/winterm.py @@ -0,0 +1,169 @@ +# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. +from . import win32 + + +# from wincon.h +class WinColor(object): + BLACK = 0 + BLUE = 1 + GREEN = 2 + CYAN = 3 + RED = 4 + MAGENTA = 5 + YELLOW = 6 + GREY = 7 + +# from wincon.h +class WinStyle(object): + NORMAL = 0x00 # dim text, dim background + BRIGHT = 0x08 # bright text, dim background + BRIGHT_BACKGROUND = 0x80 # dim text, bright background + +class WinTerm(object): + + def __init__(self): + self._default = win32.GetConsoleScreenBufferInfo(win32.STDOUT).wAttributes + self.set_attrs(self._default) + self._default_fore = self._fore + self._default_back = self._back + self._default_style = self._style + # In order to emulate LIGHT_EX in windows, we borrow the BRIGHT style. + # So that LIGHT_EX colors and BRIGHT style do not clobber each other, + # we track them separately, since LIGHT_EX is overwritten by Fore/Back + # and BRIGHT is overwritten by Style codes. + self._light = 0 + + def get_attrs(self): + return self._fore + self._back * 16 + (self._style | self._light) + + def set_attrs(self, value): + self._fore = value & 7 + self._back = (value >> 4) & 7 + self._style = value & (WinStyle.BRIGHT | WinStyle.BRIGHT_BACKGROUND) + + def reset_all(self, on_stderr=None): + self.set_attrs(self._default) + self.set_console(attrs=self._default) + self._light = 0 + + def fore(self, fore=None, light=False, on_stderr=False): + if fore is None: + fore = self._default_fore + self._fore = fore + # Emulate LIGHT_EX with BRIGHT Style + if light: + self._light |= WinStyle.BRIGHT + else: + self._light &= ~WinStyle.BRIGHT + self.set_console(on_stderr=on_stderr) + + def back(self, back=None, light=False, on_stderr=False): + if back is None: + back = self._default_back + self._back = back + # Emulate LIGHT_EX with BRIGHT_BACKGROUND Style + if light: + self._light |= WinStyle.BRIGHT_BACKGROUND + else: + self._light &= ~WinStyle.BRIGHT_BACKGROUND + self.set_console(on_stderr=on_stderr) + + def style(self, style=None, on_stderr=False): + if style is None: + style = self._default_style + self._style = style + self.set_console(on_stderr=on_stderr) + + def set_console(self, attrs=None, on_stderr=False): + if attrs is None: + attrs = self.get_attrs() + handle = win32.STDOUT + if on_stderr: + handle = win32.STDERR + win32.SetConsoleTextAttribute(handle, attrs) + + def get_position(self, handle): + position = win32.GetConsoleScreenBufferInfo(handle).dwCursorPosition + # Because Windows coordinates are 0-based, + # and win32.SetConsoleCursorPosition expects 1-based. + position.X += 1 + position.Y += 1 + return position + + def set_cursor_position(self, position=None, on_stderr=False): + if position is None: + # I'm not currently tracking the position, so there is no default. + # position = self.get_position() + return + handle = win32.STDOUT + if on_stderr: + handle = win32.STDERR + win32.SetConsoleCursorPosition(handle, position) + + def cursor_adjust(self, x, y, on_stderr=False): + handle = win32.STDOUT + if on_stderr: + handle = win32.STDERR + position = self.get_position(handle) + adjusted_position = (position.Y + y, position.X + x) + win32.SetConsoleCursorPosition(handle, adjusted_position, adjust=False) + + def erase_screen(self, mode=0, on_stderr=False): + # 0 should clear from the cursor to the end of the screen. + # 1 should clear from the cursor to the beginning of the screen. + # 2 should clear the entire screen, and move cursor to (1,1) + handle = win32.STDOUT + if on_stderr: + handle = win32.STDERR + csbi = win32.GetConsoleScreenBufferInfo(handle) + # get the number of character cells in the current buffer + cells_in_screen = csbi.dwSize.X * csbi.dwSize.Y + # get number of character cells before current cursor position + cells_before_cursor = csbi.dwSize.X * csbi.dwCursorPosition.Y + csbi.dwCursorPosition.X + if mode == 0: + from_coord = csbi.dwCursorPosition + cells_to_erase = cells_in_screen - cells_before_cursor + elif mode == 1: + from_coord = win32.COORD(0, 0) + cells_to_erase = cells_before_cursor + elif mode == 2: + from_coord = win32.COORD(0, 0) + cells_to_erase = cells_in_screen + else: + # invalid mode + return + # fill the entire screen with blanks + win32.FillConsoleOutputCharacter(handle, ' ', cells_to_erase, from_coord) + # now set the buffer's attributes accordingly + win32.FillConsoleOutputAttribute(handle, self.get_attrs(), cells_to_erase, from_coord) + if mode == 2: + # put the cursor where needed + win32.SetConsoleCursorPosition(handle, (1, 1)) + + def erase_line(self, mode=0, on_stderr=False): + # 0 should clear from the cursor to the end of the line. + # 1 should clear from the cursor to the beginning of the line. + # 2 should clear the entire line. + handle = win32.STDOUT + if on_stderr: + handle = win32.STDERR + csbi = win32.GetConsoleScreenBufferInfo(handle) + if mode == 0: + from_coord = csbi.dwCursorPosition + cells_to_erase = csbi.dwSize.X - csbi.dwCursorPosition.X + elif mode == 1: + from_coord = win32.COORD(0, csbi.dwCursorPosition.Y) + cells_to_erase = csbi.dwCursorPosition.X + elif mode == 2: + from_coord = win32.COORD(0, csbi.dwCursorPosition.Y) + cells_to_erase = csbi.dwSize.X + else: + # invalid mode + return + # fill the entire screen with blanks + win32.FillConsoleOutputCharacter(handle, ' ', cells_to_erase, from_coord) + # now set the buffer's attributes accordingly + win32.FillConsoleOutputAttribute(handle, self.get_attrs(), cells_to_erase, from_coord) + + def set_title(self, title): + win32.SetConsoleTitle(title) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/colorama/winterm.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/colorama/winterm.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9daaad658c643d26581430fe1ff0a44e590b20ef GIT binary patch literal 6935 zcmd5>T~i##744b*U>6oGLb5=Xl91R+)^X(3hhybKwgn3!O3;#OP;9m;-dc8M(V$_6 z%rqceqAC^fmWTX}v_kZy`%X{yozv&uzTGPPb9(aS z-#`7TuhO3a{ysuUegom**HNKTdyeWj%JE#~yK3Mlub@tqdacw}r=YyzNL$LZMdg)8 z+KEhCQeH)EG^!Xna3C5KrUY>m4Da7F71X{6hOH=!;>;rUSwcyE0^utf0=qgcP2=pY z>R`5l>R|Mu>XemNQk@CT->E2XLUpQ2Z!|b`fMO>OT-NxlL6L$c1Z9c|h{hy@7}Me99p7EQ9y|_7uLeGzr=FWc8``zx&*B=k=-r2r; z|M>XO>>6Vp+&_AL2R}Q*=4Nw0*uNbN6VnUB+xH%P((Y)gq;wDcp%=x?KH=@{^_l?P z`0?IH`^TCf)3juU73ciF(YkDy zhpmnDRnbq&n3L)hvs_Z%lr(Gd2(#Pfv@~awcS%OLOz$Bp`s4@;*R6$;Y(W^Mb{&zf zdhMv)f_eo{DN^p1L>8%c*e=Vn3DH)hUX}W!)M2wD71*p0B{)r6T(&Wdszy(4gL6nY*l8WRWG2gXmVJA3}1cMuxG2$cAy z+r#rjT(>)jV&8D0ZraIe$kgt3um9rwGtqGQy9u4bTsr%rRmsyZ*m-Vjm@A@7;)jEr z!Q&ur8rFhgV7lFTnnX4$XWp4{YW!Eq)|sv;>%4#p*Uw6XUq@Y?qrw$+K`qUVmWxDb z@JsbI3QnN8X8IMAXaRk?#~gw7xFn;hg#^gt#$1 zwQoJ%@`y`hLE=hALpUKe$auU!Nl=M>2`gdvBN&zbeW~hF8uj>rbgA&e%J^$$~{Y3#0ly%+_EYB3VZ} z8v1$;Elb9mtmS0<9{b8N&{gFH362bf63^^tXpPT>_4hIRU6h3Wqa<`y-LmtJ`xarX zZ^1Nuok9X(j#XdiV_}_E}LE-x#D3S$+gEt5& zq!Z9?U^u&R2uhqPkBYLtz6}U{0JBz6k_tphLZ?q-`6c`-*!&We9Ge@dtG`yMx7+RG z1pW(e|0LZ<&_p2MBVK}Bh%^@d4|chowFlPLamlmsS-hK3!#6uBk) zy3kQG%u7nOpY|K`9>gfl%w}ZHGqh87&KBx`@tf@Y99?pDBJT%h@SVibQu0H^W`Rvo z5_KSW5hb}n*qDck5;p1|qGlNVavq)s_6!l3Li1!0RClp3CAXk zAsai6nXlcmaZ|j#=j|ROMy@#WI3UPtZjri4@e##6nnfcY_rk=NgusSXviqg5`#4_# z%>|KTxShfGG8o3ZI6SBI?ZQ~ocA!X?#RiJH^R6Qar4XKJVzxFP;A7LZu>{Z7#uD7F z4N@qiV*nmmmn2?krL3-U#m;Icn08&I3bm4&!@AL-9Q6VL{SVT2LY?5;i}%WE{-mOY zT6(zB<1bX-3rp}9~X5iNjF3`IxP&xff`W{R^xmPt`wC+Ee_cD zQdFj}?Vfo?EA8O7q+dQQscb*l4h-|Jz8{83H^AXRZV?O}-s-k}=DS@>FuD30#L*s(AW`heN#Axe zQP+=qa3j1pzD(FK7>OO}heT*6VpB171^1e}fW5Pdvs=xX#b1$yBJ?+%nkyc1E_(e7 zL;N2el5zdZ)Gty8K`fKlMgJl1%WAlLhWCGzIdI2?e9*d6h0M#n3qF8X9-Q%kzx~%& zWIn!ffj__y@cLqZ$esz|87JN(y#5)K4I=$!fMvp<$z}a>3W>5znr+bil(o+&$k06A zYHqqYG4&%hxpC-ah%pn2ciomyVKDUngjTWup+ zI&w+E8v((Wv7&A7IXJ5LVxAmq1_s$Dhsg7NBRX~#WX5)7#B@Mx`7=yOuZ-G_S=uTF z7g+l?g~TJd#JI)g`xHDO$+1=QD>Tmznt86>qwllE+a|q2@tEQXM9zh=eY<8p%y>JyK3S{O7wXsTsRWS&##2ak5^eALeIx(FU@sXs+*|Nj XlD0pz|E2R8*H5l%W{TIQu9f}`V@IL* literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/contextlib2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/contextlib2.py new file mode 100644 index 0000000..3aae8f4 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/contextlib2.py @@ -0,0 +1,518 @@ +"""contextlib2 - backports and enhancements to the contextlib module""" + +import abc +import sys +import warnings +from collections import deque +from functools import wraps + +__all__ = ["contextmanager", "closing", "nullcontext", + "AbstractContextManager", + "ContextDecorator", "ExitStack", + "redirect_stdout", "redirect_stderr", "suppress"] + +# Backwards compatibility +__all__ += ["ContextStack"] + + +# Backport abc.ABC +if sys.version_info[:2] >= (3, 4): + _abc_ABC = abc.ABC +else: + _abc_ABC = abc.ABCMeta('ABC', (object,), {'__slots__': ()}) + + +# Backport classic class MRO +def _classic_mro(C, result): + if C in result: + return + result.append(C) + for B in C.__bases__: + _classic_mro(B, result) + return result + + +# Backport _collections_abc._check_methods +def _check_methods(C, *methods): + try: + mro = C.__mro__ + except AttributeError: + mro = tuple(_classic_mro(C, [])) + + for method in methods: + for B in mro: + if method in B.__dict__: + if B.__dict__[method] is None: + return NotImplemented + break + else: + return NotImplemented + return True + + +class AbstractContextManager(_abc_ABC): + """An abstract base class for context managers.""" + + def __enter__(self): + """Return `self` upon entering the runtime context.""" + return self + + @abc.abstractmethod + def __exit__(self, exc_type, exc_value, traceback): + """Raise any exception triggered within the runtime context.""" + return None + + @classmethod + def __subclasshook__(cls, C): + """Check whether subclass is considered a subclass of this ABC.""" + if cls is AbstractContextManager: + return _check_methods(C, "__enter__", "__exit__") + return NotImplemented + + +class ContextDecorator(object): + """A base class or mixin that enables context managers to work as decorators.""" + + def refresh_cm(self): + """Returns the context manager used to actually wrap the call to the + decorated function. + + The default implementation just returns *self*. + + Overriding this method allows otherwise one-shot context managers + like _GeneratorContextManager to support use as decorators via + implicit recreation. + + DEPRECATED: refresh_cm was never added to the standard library's + ContextDecorator API + """ + warnings.warn("refresh_cm was never added to the standard library", + DeprecationWarning) + return self._recreate_cm() + + def _recreate_cm(self): + """Return a recreated instance of self. + + Allows an otherwise one-shot context manager like + _GeneratorContextManager to support use as + a decorator via implicit recreation. + + This is a private interface just for _GeneratorContextManager. + See issue #11647 for details. + """ + return self + + def __call__(self, func): + @wraps(func) + def inner(*args, **kwds): + with self._recreate_cm(): + return func(*args, **kwds) + return inner + + +class _GeneratorContextManager(ContextDecorator): + """Helper for @contextmanager decorator.""" + + def __init__(self, func, args, kwds): + self.gen = func(*args, **kwds) + self.func, self.args, self.kwds = func, args, kwds + # Issue 19330: ensure context manager instances have good docstrings + doc = getattr(func, "__doc__", None) + if doc is None: + doc = type(self).__doc__ + self.__doc__ = doc + # Unfortunately, this still doesn't provide good help output when + # inspecting the created context manager instances, since pydoc + # currently bypasses the instance docstring and shows the docstring + # for the class instead. + # See http://bugs.python.org/issue19404 for more details. + + def _recreate_cm(self): + # _GCM instances are one-shot context managers, so the + # CM must be recreated each time a decorated function is + # called + return self.__class__(self.func, self.args, self.kwds) + + def __enter__(self): + try: + return next(self.gen) + except StopIteration: + raise RuntimeError("generator didn't yield") + + def __exit__(self, type, value, traceback): + if type is None: + try: + next(self.gen) + except StopIteration: + return + else: + raise RuntimeError("generator didn't stop") + else: + if value is None: + # Need to force instantiation so we can reliably + # tell if we get the same exception back + value = type() + try: + self.gen.throw(type, value, traceback) + raise RuntimeError("generator didn't stop after throw()") + except StopIteration as exc: + # Suppress StopIteration *unless* it's the same exception that + # was passed to throw(). This prevents a StopIteration + # raised inside the "with" statement from being suppressed. + return exc is not value + except RuntimeError as exc: + # Don't re-raise the passed in exception + if exc is value: + return False + # Likewise, avoid suppressing if a StopIteration exception + # was passed to throw() and later wrapped into a RuntimeError + # (see PEP 479). + if _HAVE_EXCEPTION_CHAINING and exc.__cause__ is value: + return False + raise + except: + # only re-raise if it's *not* the exception that was + # passed to throw(), because __exit__() must not raise + # an exception unless __exit__() itself failed. But throw() + # has to raise the exception to signal propagation, so this + # fixes the impedance mismatch between the throw() protocol + # and the __exit__() protocol. + # + if sys.exc_info()[1] is not value: + raise + + +def contextmanager(func): + """@contextmanager decorator. + + Typical usage: + + @contextmanager + def some_generator(): + + try: + yield + finally: + + + This makes this: + + with some_generator() as : + + + equivalent to this: + + + try: + = + + finally: + + + """ + @wraps(func) + def helper(*args, **kwds): + return _GeneratorContextManager(func, args, kwds) + return helper + + +class closing(object): + """Context to automatically close something at the end of a block. + + Code like this: + + with closing(.open()) as f: + + + is equivalent to this: + + f = .open() + try: + + finally: + f.close() + + """ + def __init__(self, thing): + self.thing = thing + + def __enter__(self): + return self.thing + + def __exit__(self, *exc_info): + self.thing.close() + + +class _RedirectStream(object): + + _stream = None + + def __init__(self, new_target): + self._new_target = new_target + # We use a list of old targets to make this CM re-entrant + self._old_targets = [] + + def __enter__(self): + self._old_targets.append(getattr(sys, self._stream)) + setattr(sys, self._stream, self._new_target) + return self._new_target + + def __exit__(self, exctype, excinst, exctb): + setattr(sys, self._stream, self._old_targets.pop()) + + +class redirect_stdout(_RedirectStream): + """Context manager for temporarily redirecting stdout to another file. + + # How to send help() to stderr + with redirect_stdout(sys.stderr): + help(dir) + + # How to write help() to a file + with open('help.txt', 'w') as f: + with redirect_stdout(f): + help(pow) + """ + + _stream = "stdout" + + +class redirect_stderr(_RedirectStream): + """Context manager for temporarily redirecting stderr to another file.""" + + _stream = "stderr" + + +class suppress(object): + """Context manager to suppress specified exceptions + + After the exception is suppressed, execution proceeds with the next + statement following the with statement. + + with suppress(FileNotFoundError): + os.remove(somefile) + # Execution still resumes here if the file was already removed + """ + + def __init__(self, *exceptions): + self._exceptions = exceptions + + def __enter__(self): + pass + + def __exit__(self, exctype, excinst, exctb): + # Unlike isinstance and issubclass, CPython exception handling + # currently only looks at the concrete type hierarchy (ignoring + # the instance and subclass checking hooks). While Guido considers + # that a bug rather than a feature, it's a fairly hard one to fix + # due to various internal implementation details. suppress provides + # the simpler issubclass based semantics, rather than trying to + # exactly reproduce the limitations of the CPython interpreter. + # + # See http://bugs.python.org/issue12029 for more details + return exctype is not None and issubclass(exctype, self._exceptions) + + +# Context manipulation is Python 3 only +_HAVE_EXCEPTION_CHAINING = sys.version_info[0] >= 3 +if _HAVE_EXCEPTION_CHAINING: + def _make_context_fixer(frame_exc): + def _fix_exception_context(new_exc, old_exc): + # Context may not be correct, so find the end of the chain + while 1: + exc_context = new_exc.__context__ + if exc_context is old_exc: + # Context is already set correctly (see issue 20317) + return + if exc_context is None or exc_context is frame_exc: + break + new_exc = exc_context + # Change the end of the chain to point to the exception + # we expect it to reference + new_exc.__context__ = old_exc + return _fix_exception_context + + def _reraise_with_existing_context(exc_details): + try: + # bare "raise exc_details[1]" replaces our carefully + # set-up context + fixed_ctx = exc_details[1].__context__ + raise exc_details[1] + except BaseException: + exc_details[1].__context__ = fixed_ctx + raise +else: + # No exception context in Python 2 + def _make_context_fixer(frame_exc): + return lambda new_exc, old_exc: None + + # Use 3 argument raise in Python 2, + # but use exec to avoid SyntaxError in Python 3 + def _reraise_with_existing_context(exc_details): + exc_type, exc_value, exc_tb = exc_details + exec("raise exc_type, exc_value, exc_tb") + +# Handle old-style classes if they exist +try: + from types import InstanceType +except ImportError: + # Python 3 doesn't have old-style classes + _get_type = type +else: + # Need to handle old-style context managers on Python 2 + def _get_type(obj): + obj_type = type(obj) + if obj_type is InstanceType: + return obj.__class__ # Old-style class + return obj_type # New-style class + + +# Inspired by discussions on http://bugs.python.org/issue13585 +class ExitStack(object): + """Context manager for dynamic management of a stack of exit callbacks + + For example: + + with ExitStack() as stack: + files = [stack.enter_context(open(fname)) for fname in filenames] + # All opened files will automatically be closed at the end of + # the with statement, even if attempts to open files later + # in the list raise an exception + + """ + def __init__(self): + self._exit_callbacks = deque() + + def pop_all(self): + """Preserve the context stack by transferring it to a new instance""" + new_stack = type(self)() + new_stack._exit_callbacks = self._exit_callbacks + self._exit_callbacks = deque() + return new_stack + + def _push_cm_exit(self, cm, cm_exit): + """Helper to correctly register callbacks to __exit__ methods""" + def _exit_wrapper(*exc_details): + return cm_exit(cm, *exc_details) + _exit_wrapper.__self__ = cm + self.push(_exit_wrapper) + + def push(self, exit): + """Registers a callback with the standard __exit__ method signature + + Can suppress exceptions the same way __exit__ methods can. + + Also accepts any object with an __exit__ method (registering a call + to the method instead of the object itself) + """ + # We use an unbound method rather than a bound method to follow + # the standard lookup behaviour for special methods + _cb_type = _get_type(exit) + try: + exit_method = _cb_type.__exit__ + except AttributeError: + # Not a context manager, so assume its a callable + self._exit_callbacks.append(exit) + else: + self._push_cm_exit(exit, exit_method) + return exit # Allow use as a decorator + + def callback(self, callback, *args, **kwds): + """Registers an arbitrary callback and arguments. + + Cannot suppress exceptions. + """ + def _exit_wrapper(exc_type, exc, tb): + callback(*args, **kwds) + # We changed the signature, so using @wraps is not appropriate, but + # setting __wrapped__ may still help with introspection + _exit_wrapper.__wrapped__ = callback + self.push(_exit_wrapper) + return callback # Allow use as a decorator + + def enter_context(self, cm): + """Enters the supplied context manager + + If successful, also pushes its __exit__ method as a callback and + returns the result of the __enter__ method. + """ + # We look up the special methods on the type to match the with statement + _cm_type = _get_type(cm) + _exit = _cm_type.__exit__ + result = _cm_type.__enter__(cm) + self._push_cm_exit(cm, _exit) + return result + + def close(self): + """Immediately unwind the context stack""" + self.__exit__(None, None, None) + + def __enter__(self): + return self + + def __exit__(self, *exc_details): + received_exc = exc_details[0] is not None + + # We manipulate the exception state so it behaves as though + # we were actually nesting multiple with statements + frame_exc = sys.exc_info()[1] + _fix_exception_context = _make_context_fixer(frame_exc) + + # Callbacks are invoked in LIFO order to match the behaviour of + # nested context managers + suppressed_exc = False + pending_raise = False + while self._exit_callbacks: + cb = self._exit_callbacks.pop() + try: + if cb(*exc_details): + suppressed_exc = True + pending_raise = False + exc_details = (None, None, None) + except: + new_exc_details = sys.exc_info() + # simulate the stack of exceptions by setting the context + _fix_exception_context(new_exc_details[1], exc_details[1]) + pending_raise = True + exc_details = new_exc_details + if pending_raise: + _reraise_with_existing_context(exc_details) + return received_exc and suppressed_exc + + +# Preserve backwards compatibility +class ContextStack(ExitStack): + """Backwards compatibility alias for ExitStack""" + + def __init__(self): + warnings.warn("ContextStack has been renamed to ExitStack", + DeprecationWarning) + super(ContextStack, self).__init__() + + def register_exit(self, callback): + return self.push(callback) + + def register(self, callback, *args, **kwds): + return self.callback(callback, *args, **kwds) + + def preserve(self): + return self.pop_all() + + +class nullcontext(AbstractContextManager): + """Context manager that does no additional processing. + Used as a stand-in for a normal context manager, when a particular + block of code is only sometimes used with a normal context manager: + cm = optional_cm if condition else nullcontext() + with cm: + # Perform operation, using optional_cm if condition is True + """ + + def __init__(self, enter_result=None): + self.enter_result = enter_result + + def __enter__(self): + return self.enter_result + + def __exit__(self, *excinfo): + pass diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/contextlib2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/contextlib2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..22bb1c5da1cfa9735261a81599f29a6e8a154326 GIT binary patch literal 21825 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 literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/__init__.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/__init__.py new file mode 100644 index 0000000..e19aebd --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/__init__.py @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2012-2019 Vinay Sajip. +# Licensed to the Python Software Foundation under a contributor agreement. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +import logging + +__version__ = '0.3.0' + +class DistlibException(Exception): + pass + +try: + from logging import NullHandler +except ImportError: # pragma: no cover + class NullHandler(logging.Handler): + def handle(self, record): pass + def emit(self, record): pass + def createLock(self): self.lock = None + +logger = logging.getLogger(__name__) +logger.addHandler(NullHandler()) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/__init__.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5717b412fdc1abad935f0a20a200468d1107086e GIT binary patch literal 1623 zcmd5+OOMkq5FR(_6DnR6H%?qCq;0wsu@^uHSP7(64_PE22cmB5rs<|hu)SrAxGhKi z6u*fd0N=P(i^PRnaXRjJ{QABb&v-w(oy#9jKPI$kb^JevnD6K$eu8qM2uh72LDC~t zqbU@hz7bs!eTY0-_1w}rFJ1T)`6S*I56D+_I`5F4kq|;QND<8&ZgX?H*{4F#d!A{M zYSERTs71@MQbedyG$p|fm`<6^Q(q1XnHt2I~=W6OFOsL9*sWFhG=OKybY?XI>-uRCwYGG@aXY43fbf&UaCTt zI*@A)K^$jAX5)BJtwO&28pJTzhUhaL%ZBkqp1+sI`0NX}n~!JV^It-Yk4_R?&X(~X4&w=<@~Le=(JCpm+&O9=K5{^2&K0)-$wDak zXFehG3HdSYnFZrei_G3(JWX^7d!B{4xR`XIASPe&Vv&5i;P3*=`^ROWoRXKxxr>~m zw`XRYRf$%}niIh4VdVJr+36t@44FX4?{ChD-4ETBCN?^F&W{#l89s@f%)_d_w>L literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/__init__ 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/__init__ 2.py new file mode 100644 index 0000000..f7dbf4c --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/__init__ 2.py @@ -0,0 +1,6 @@ +"""Modules copied from Python 3 standard libraries, for internal use only. + +Individual classes and functions are found in d2._backport.misc. Intended +usage is to always import things missing from 3.1 from that module: the +built-in/stdlib objects will be used if found. +""" diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/__init__ 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/__init__ 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2c11751174e6568c8ccd4b2c26029d290d0bbada GIT binary patch literal 498 zcmYLF!EW0y40SqS9X#wGc+8=(l4ZbvVJljoJLJ$JK-)_X6J$$vm?@Gg(hj_@+qK`* zA1Iv^tpGkfQY7`r56@rnr~kkHRN3p9$bBJ3xq!{G2f;~pJ3Sd=pXK#B+Ri(IDz@k> z)G6*@J@6(5SOT#L)+7ra%VZKdI)geUz`!mAJ$etN8`X=L`lzbNZ>Hn6_*6h^ z8!N4+LbG?EL0r`)>W-g}*>Q1%T yiWXU^_p{5Z-?Y9TLkH8n3?7rRNGw9t+iH~77?8Ct+JQgG?>~?8oqrV0V%ZDw&6_L$ literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/__init__.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/__init__.py new file mode 100644 index 0000000..f7dbf4c --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/__init__.py @@ -0,0 +1,6 @@ +"""Modules copied from Python 3 standard libraries, for internal use only. + +Individual classes and functions are found in d2._backport.misc. Intended +usage is to always import things missing from 3.1 from that module: the +built-in/stdlib objects will be used if found. +""" diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/__init__.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c46da1c51f175de3732a4b9b4c1fc0638b01ec3e GIT binary patch literal 498 zcmYLF!A`?43@so5D&ik}+yR=6A&?Ltt{gxJIB_6Ko3!)Dk`lX}%HQ!#`~WUP5Xmpk zj_o{q=j$*ZKCfP@?DuTReIrJ>fX%WO!L96RvOUHQDX!pQ;6)5D z2VxVfNftbo$s}}i1a(Y+fn5s5Lq`r`@I#U3x4~kMwv%Y(4UzPeVyL@NF~%TXa#Gw$ z3%c9P^lRey9L4-ZB>+aK83+$j z1|u|T+k=q@!Uxd+(S(T)BOj_&x7vcV0a+79O<-^HThNd#IOu@>0E{uY0Ac}7aH}Td z4Bk~8kZl;X;cb2wBNtudH;SZ#+K_f2TY}LNFtG?Hc$;>e)&t34+J#XUGuJS)=Q4k| z%#Mrfx=6hEZhwjD2~oX>`9WD|Yl3m11CfjQ zV6R{%kNLig#=6KNQ_M7%w(Y!W8YgKz85^1NLdZVDl_3gn50#HX<2H&}Lv_SJcL}O; znQ;B$!4Wz=xUt)(*ny>d?sU;d6P(*FpjB4USmANhBq5X8#8QSlv~?WXU}mVoQmc7v zWjK#@I4)8lwFxI>C_YXnpC67l){~9Rs+!xWwf6Dmr~P&OCV99Qma4q3a%1B(y}$Kx z$Gm<+E+^4k=AzJ{P{yVz38Ul`%rH}iKPW3#GGS#JbP;xyIV2oV+qfYC#i=$Dy0=55 zhla)aQ8PHEZqf3fPmtLTDrMY-axRAidA%p47s>QOluh@&iDKx=!2Xp;D7X>{nDZs- z6)Jc4)a6mt`VqONKG+6Kn{W(p%rK%wG{Mf}8qTL}xQ@eDd>NST5E>XdSss>>+aRed zQW%MCtiBiIg$?eQ{vxgqNjcKE5Jwt}!R;~Eakh3<#$H3$L|S5*!KuvLy2>Y(_SmaR zxuZ3{AS%w{%yl=4@;H-Gbk=XmC*Or=5cTCYis_;Pw#*tRD_)EBFX7xhtSAx%k0MK< zg&CgnBXQABd{bHJC~oO@@+zbMNR0&{gB#F$jG`gY!GSfv`s)Bn;6;k`cmEZ~;~^bo z>7XrZwMu5T4n9N7S^w`jyUsqz3NcINGh&JfP_?`+>w3$+&sJHFU2giUL!;Mg_&E01 EUnbFgH~;_u literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/misc.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/misc.py new file mode 100644 index 0000000..cfb318d --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/misc.py @@ -0,0 +1,41 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2012 The Python Software Foundation. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +"""Backports for individual classes and functions.""" + +import os +import sys + +__all__ = ['cache_from_source', 'callable', 'fsencode'] + + +try: + from imp import cache_from_source +except ImportError: + def cache_from_source(py_file, debug=__debug__): + ext = debug and 'c' or 'o' + return py_file + ext + + +try: + callable = callable +except NameError: + from collections import Callable + + def callable(obj): + return isinstance(obj, Callable) + + +try: + fsencode = os.fsencode +except AttributeError: + def fsencode(filename): + if isinstance(filename, bytes): + return filename + elif isinstance(filename, str): + return filename.encode(sys.getfilesystemencoding()) + else: + raise TypeError("expect bytes or str, not %s" % + type(filename).__name__) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/misc.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/misc.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b118d493c607b03ffd9358c103a8345d31d2ed16 GIT binary patch literal 1616 zcmd5+&2AGh5FYO)X__V!XaT7RX@!IoA=+&z&8qJ0Cp(u~LB8Qb&C=kA`gTQq5+}_6CWZUs#Ukzg0uly6QU-tgZu$BWDAZupg#j+OfG;}fHT~x2|0t0 zRR?4nqBb1lk1=x5MgF8nI;ah42eKuImVk*xIK$ht>$Dz72GcG?UCdm=%%00UcbOd* z*>#b4@xA^M)f1w6m++&q(AEUwLI)}rYOcgANdulH#z+$+xd_IyoLg1oW<&kKZ(wg> zCQtaGjK{jjVpGgCm$vP^X_}1EdNMXL=Y^1chATr9;2tU;g~nYJvxe$~f$kDi;<3Wxs7XSOW)n*p^4QjKXoH!d3QMi#iIw3z z(c!pAh14dTl%e=CoqT&X-r5{(ZCBOYPOY^&+g}ei@tfq~epsqjbT9i%qy^mt(%E11WNGP}x37D%T>J=(? z@51F#)%rQPrassPOq*~DaLO>EMKr$0x5?E7q$_1Mj(&pI@Ey@rotkNpLN CZ+pc6 literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/shutil 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/shutil 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..069a75845f92aa61bb85b0a0001e5002f163bb6e GIT binary patch literal 28381 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 M>9m70x#nn+n9r}TpDKqRW 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 literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/shutil.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/shutil.py new file mode 100644 index 0000000..159e49e --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/shutil.py @@ -0,0 +1,761 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2012 The Python Software Foundation. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +"""Utility functions for copying and archiving files and directory trees. + +XXX The functions here don't copy the resource fork or other metadata on Mac. + +""" + +import os +import sys +import stat +from os.path import abspath +import fnmatch +import collections +import errno +from . import tarfile + +try: + import bz2 + _BZ2_SUPPORTED = True +except ImportError: + _BZ2_SUPPORTED = False + +try: + from pwd import getpwnam +except ImportError: + getpwnam = None + +try: + from grp import getgrnam +except ImportError: + getgrnam = None + +__all__ = ["copyfileobj", "copyfile", "copymode", "copystat", "copy", "copy2", + "copytree", "move", "rmtree", "Error", "SpecialFileError", + "ExecError", "make_archive", "get_archive_formats", + "register_archive_format", "unregister_archive_format", + "get_unpack_formats", "register_unpack_format", + "unregister_unpack_format", "unpack_archive", "ignore_patterns"] + +class Error(EnvironmentError): + pass + +class SpecialFileError(EnvironmentError): + """Raised when trying to do a kind of operation (e.g. copying) which is + not supported on a special file (e.g. a named pipe)""" + +class ExecError(EnvironmentError): + """Raised when a command could not be executed""" + +class ReadError(EnvironmentError): + """Raised when an archive cannot be read""" + +class RegistryError(Exception): + """Raised when a registry operation with the archiving + and unpacking registries fails""" + + +try: + WindowsError +except NameError: + WindowsError = None + +def copyfileobj(fsrc, fdst, length=16*1024): + """copy data from file-like object fsrc to file-like object fdst""" + while 1: + buf = fsrc.read(length) + if not buf: + break + fdst.write(buf) + +def _samefile(src, dst): + # Macintosh, Unix. + if hasattr(os.path, 'samefile'): + try: + return os.path.samefile(src, dst) + except OSError: + return False + + # All other platforms: check for same pathname. + return (os.path.normcase(os.path.abspath(src)) == + os.path.normcase(os.path.abspath(dst))) + +def copyfile(src, dst): + """Copy data from src to dst""" + if _samefile(src, dst): + raise Error("`%s` and `%s` are the same file" % (src, dst)) + + for fn in [src, dst]: + try: + st = os.stat(fn) + except OSError: + # File most likely does not exist + pass + else: + # XXX What about other special files? (sockets, devices...) + if stat.S_ISFIFO(st.st_mode): + raise SpecialFileError("`%s` is a named pipe" % fn) + + with open(src, 'rb') as fsrc: + with open(dst, 'wb') as fdst: + copyfileobj(fsrc, fdst) + +def copymode(src, dst): + """Copy mode bits from src to dst""" + if hasattr(os, 'chmod'): + st = os.stat(src) + mode = stat.S_IMODE(st.st_mode) + os.chmod(dst, mode) + +def copystat(src, dst): + """Copy all stat info (mode bits, atime, mtime, flags) from src to dst""" + st = os.stat(src) + mode = stat.S_IMODE(st.st_mode) + if hasattr(os, 'utime'): + os.utime(dst, (st.st_atime, st.st_mtime)) + if hasattr(os, 'chmod'): + os.chmod(dst, mode) + if hasattr(os, 'chflags') and hasattr(st, 'st_flags'): + try: + os.chflags(dst, st.st_flags) + except OSError as why: + if (not hasattr(errno, 'EOPNOTSUPP') or + why.errno != errno.EOPNOTSUPP): + raise + +def copy(src, dst): + """Copy data and mode bits ("cp src dst"). + + The destination may be a directory. + + """ + if os.path.isdir(dst): + dst = os.path.join(dst, os.path.basename(src)) + copyfile(src, dst) + copymode(src, dst) + +def copy2(src, dst): + """Copy data and all stat info ("cp -p src dst"). + + The destination may be a directory. + + """ + if os.path.isdir(dst): + dst = os.path.join(dst, os.path.basename(src)) + copyfile(src, dst) + copystat(src, dst) + +def ignore_patterns(*patterns): + """Function that can be used as copytree() ignore parameter. + + Patterns is a sequence of glob-style patterns + that are used to exclude files""" + def _ignore_patterns(path, names): + ignored_names = [] + for pattern in patterns: + ignored_names.extend(fnmatch.filter(names, pattern)) + return set(ignored_names) + return _ignore_patterns + +def copytree(src, dst, symlinks=False, ignore=None, copy_function=copy2, + ignore_dangling_symlinks=False): + """Recursively copy a directory tree. + + The destination directory must not already exist. + If exception(s) occur, an Error is raised with a list of reasons. + + If the optional symlinks flag is true, symbolic links in the + source tree result in symbolic links in the destination tree; if + it is false, the contents of the files pointed to by symbolic + links are copied. If the file pointed by the symlink doesn't + exist, an exception will be added in the list of errors raised in + an Error exception at the end of the copy process. + + You can set the optional ignore_dangling_symlinks flag to true if you + want to silence this exception. Notice that this has no effect on + platforms that don't support os.symlink. + + The optional ignore argument is a callable. If given, it + is called with the `src` parameter, which is the directory + being visited by copytree(), and `names` which is the list of + `src` contents, as returned by os.listdir(): + + callable(src, names) -> ignored_names + + Since copytree() is called recursively, the callable will be + called once for each directory that is copied. It returns a + list of names relative to the `src` directory that should + not be copied. + + The optional copy_function argument is a callable that will be used + to copy each file. It will be called with the source path and the + destination path as arguments. By default, copy2() is used, but any + function that supports the same signature (like copy()) can be used. + + """ + names = os.listdir(src) + if ignore is not None: + ignored_names = ignore(src, names) + else: + ignored_names = set() + + os.makedirs(dst) + errors = [] + for name in names: + if name in ignored_names: + continue + srcname = os.path.join(src, name) + dstname = os.path.join(dst, name) + try: + if os.path.islink(srcname): + linkto = os.readlink(srcname) + if symlinks: + os.symlink(linkto, dstname) + else: + # ignore dangling symlink if the flag is on + if not os.path.exists(linkto) and ignore_dangling_symlinks: + continue + # otherwise let the copy occurs. copy2 will raise an error + copy_function(srcname, dstname) + elif os.path.isdir(srcname): + copytree(srcname, dstname, symlinks, ignore, copy_function) + else: + # Will raise a SpecialFileError for unsupported file types + copy_function(srcname, dstname) + # catch the Error from the recursive copytree so that we can + # continue with other files + except Error as err: + errors.extend(err.args[0]) + except EnvironmentError as why: + errors.append((srcname, dstname, str(why))) + try: + copystat(src, dst) + except OSError as why: + if WindowsError is not None and isinstance(why, WindowsError): + # Copying file access times may fail on Windows + pass + else: + errors.extend((src, dst, str(why))) + if errors: + raise Error(errors) + +def rmtree(path, ignore_errors=False, onerror=None): + """Recursively delete a directory tree. + + If ignore_errors is set, errors are ignored; otherwise, if onerror + is set, it is called to handle the error with arguments (func, + path, exc_info) where func is os.listdir, os.remove, or os.rmdir; + path is the argument to that function that caused it to fail; and + exc_info is a tuple returned by sys.exc_info(). If ignore_errors + is false and onerror is None, an exception is raised. + + """ + if ignore_errors: + def onerror(*args): + pass + elif onerror is None: + def onerror(*args): + raise + try: + if os.path.islink(path): + # symlinks to directories are forbidden, see bug #1669 + raise OSError("Cannot call rmtree on a symbolic link") + except OSError: + onerror(os.path.islink, path, sys.exc_info()) + # can't continue even if onerror hook returns + return + names = [] + try: + names = os.listdir(path) + except os.error: + onerror(os.listdir, path, sys.exc_info()) + for name in names: + fullname = os.path.join(path, name) + try: + mode = os.lstat(fullname).st_mode + except os.error: + mode = 0 + if stat.S_ISDIR(mode): + rmtree(fullname, ignore_errors, onerror) + else: + try: + os.remove(fullname) + except os.error: + onerror(os.remove, fullname, sys.exc_info()) + try: + os.rmdir(path) + except os.error: + onerror(os.rmdir, path, sys.exc_info()) + + +def _basename(path): + # A basename() variant which first strips the trailing slash, if present. + # Thus we always get the last component of the path, even for directories. + return os.path.basename(path.rstrip(os.path.sep)) + +def move(src, dst): + """Recursively move a file or directory to another location. This is + similar to the Unix "mv" command. + + If the destination is a directory or a symlink to a directory, the source + is moved inside the directory. The destination path must not already + exist. + + If the destination already exists but is not a directory, it may be + overwritten depending on os.rename() semantics. + + If the destination is on our current filesystem, then rename() is used. + Otherwise, src is copied to the destination and then removed. + A lot more could be done here... A look at a mv.c shows a lot of + the issues this implementation glosses over. + + """ + real_dst = dst + if os.path.isdir(dst): + if _samefile(src, dst): + # We might be on a case insensitive filesystem, + # perform the rename anyway. + os.rename(src, dst) + return + + real_dst = os.path.join(dst, _basename(src)) + if os.path.exists(real_dst): + raise Error("Destination path '%s' already exists" % real_dst) + try: + os.rename(src, real_dst) + except OSError: + if os.path.isdir(src): + if _destinsrc(src, dst): + raise Error("Cannot move a directory '%s' into itself '%s'." % (src, dst)) + copytree(src, real_dst, symlinks=True) + rmtree(src) + else: + copy2(src, real_dst) + os.unlink(src) + +def _destinsrc(src, dst): + src = abspath(src) + dst = abspath(dst) + if not src.endswith(os.path.sep): + src += os.path.sep + if not dst.endswith(os.path.sep): + dst += os.path.sep + return dst.startswith(src) + +def _get_gid(name): + """Returns a gid, given a group name.""" + if getgrnam is None or name is None: + return None + try: + result = getgrnam(name) + except KeyError: + result = None + if result is not None: + return result[2] + return None + +def _get_uid(name): + """Returns an uid, given a user name.""" + if getpwnam is None or name is None: + return None + try: + result = getpwnam(name) + except KeyError: + result = None + if result is not None: + return result[2] + return None + +def _make_tarball(base_name, base_dir, compress="gzip", verbose=0, dry_run=0, + owner=None, group=None, logger=None): + """Create a (possibly compressed) tar file from all the files under + 'base_dir'. + + 'compress' must be "gzip" (the default), "bzip2", or None. + + 'owner' and 'group' can be used to define an owner and a group for the + archive that is being built. If not provided, the current owner and group + will be used. + + The output tar file will be named 'base_name' + ".tar", possibly plus + the appropriate compression extension (".gz", or ".bz2"). + + Returns the output filename. + """ + tar_compression = {'gzip': 'gz', None: ''} + compress_ext = {'gzip': '.gz'} + + if _BZ2_SUPPORTED: + tar_compression['bzip2'] = 'bz2' + compress_ext['bzip2'] = '.bz2' + + # flags for compression program, each element of list will be an argument + if compress is not None and compress not in compress_ext: + raise ValueError("bad value for 'compress', or compression format not " + "supported : {0}".format(compress)) + + archive_name = base_name + '.tar' + compress_ext.get(compress, '') + archive_dir = os.path.dirname(archive_name) + + if not os.path.exists(archive_dir): + if logger is not None: + logger.info("creating %s", archive_dir) + if not dry_run: + os.makedirs(archive_dir) + + # creating the tarball + if logger is not None: + logger.info('Creating tar archive') + + uid = _get_uid(owner) + gid = _get_gid(group) + + def _set_uid_gid(tarinfo): + if gid is not None: + tarinfo.gid = gid + tarinfo.gname = group + if uid is not None: + tarinfo.uid = uid + tarinfo.uname = owner + return tarinfo + + if not dry_run: + tar = tarfile.open(archive_name, 'w|%s' % tar_compression[compress]) + try: + tar.add(base_dir, filter=_set_uid_gid) + finally: + tar.close() + + return archive_name + +def _call_external_zip(base_dir, zip_filename, verbose=False, dry_run=False): + # XXX see if we want to keep an external call here + if verbose: + zipoptions = "-r" + else: + zipoptions = "-rq" + from distutils.errors import DistutilsExecError + from distutils.spawn import spawn + try: + spawn(["zip", zipoptions, zip_filename, base_dir], dry_run=dry_run) + except DistutilsExecError: + # XXX really should distinguish between "couldn't find + # external 'zip' command" and "zip failed". + raise ExecError("unable to create zip file '%s': " + "could neither import the 'zipfile' module nor " + "find a standalone zip utility") % zip_filename + +def _make_zipfile(base_name, base_dir, verbose=0, dry_run=0, logger=None): + """Create a zip file from all the files under 'base_dir'. + + The output zip file will be named 'base_name' + ".zip". Uses either the + "zipfile" Python module (if available) or the InfoZIP "zip" utility + (if installed and found on the default search path). If neither tool is + available, raises ExecError. Returns the name of the output zip + file. + """ + zip_filename = base_name + ".zip" + archive_dir = os.path.dirname(base_name) + + if not os.path.exists(archive_dir): + if logger is not None: + logger.info("creating %s", archive_dir) + if not dry_run: + os.makedirs(archive_dir) + + # If zipfile module is not available, try spawning an external 'zip' + # command. + try: + import zipfile + except ImportError: + zipfile = None + + if zipfile is None: + _call_external_zip(base_dir, zip_filename, verbose, dry_run) + else: + if logger is not None: + logger.info("creating '%s' and adding '%s' to it", + zip_filename, base_dir) + + if not dry_run: + zip = zipfile.ZipFile(zip_filename, "w", + compression=zipfile.ZIP_DEFLATED) + + for dirpath, dirnames, filenames in os.walk(base_dir): + for name in filenames: + path = os.path.normpath(os.path.join(dirpath, name)) + if os.path.isfile(path): + zip.write(path, path) + if logger is not None: + logger.info("adding '%s'", path) + zip.close() + + return zip_filename + +_ARCHIVE_FORMATS = { + 'gztar': (_make_tarball, [('compress', 'gzip')], "gzip'ed tar-file"), + 'bztar': (_make_tarball, [('compress', 'bzip2')], "bzip2'ed tar-file"), + 'tar': (_make_tarball, [('compress', None)], "uncompressed tar file"), + 'zip': (_make_zipfile, [], "ZIP file"), + } + +if _BZ2_SUPPORTED: + _ARCHIVE_FORMATS['bztar'] = (_make_tarball, [('compress', 'bzip2')], + "bzip2'ed tar-file") + +def get_archive_formats(): + """Returns a list of supported formats for archiving and unarchiving. + + Each element of the returned sequence is a tuple (name, description) + """ + formats = [(name, registry[2]) for name, registry in + _ARCHIVE_FORMATS.items()] + formats.sort() + return formats + +def register_archive_format(name, function, extra_args=None, description=''): + """Registers an archive format. + + name is the name of the format. function is the callable that will be + used to create archives. If provided, extra_args is a sequence of + (name, value) tuples that will be passed as arguments to the callable. + description can be provided to describe the format, and will be returned + by the get_archive_formats() function. + """ + if extra_args is None: + extra_args = [] + if not isinstance(function, collections.Callable): + raise TypeError('The %s object is not callable' % function) + if not isinstance(extra_args, (tuple, list)): + raise TypeError('extra_args needs to be a sequence') + for element in extra_args: + if not isinstance(element, (tuple, list)) or len(element) !=2: + raise TypeError('extra_args elements are : (arg_name, value)') + + _ARCHIVE_FORMATS[name] = (function, extra_args, description) + +def unregister_archive_format(name): + del _ARCHIVE_FORMATS[name] + +def make_archive(base_name, format, root_dir=None, base_dir=None, verbose=0, + dry_run=0, owner=None, group=None, logger=None): + """Create an archive file (eg. zip or tar). + + 'base_name' is the name of the file to create, minus any format-specific + extension; 'format' is the archive format: one of "zip", "tar", "bztar" + or "gztar". + + 'root_dir' is a directory that will be the root directory of the + archive; ie. we typically chdir into 'root_dir' before creating the + archive. 'base_dir' is the directory where we start archiving from; + ie. 'base_dir' will be the common prefix of all files and + directories in the archive. 'root_dir' and 'base_dir' both default + to the current directory. Returns the name of the archive file. + + 'owner' and 'group' are used when creating a tar archive. By default, + uses the current owner and group. + """ + save_cwd = os.getcwd() + if root_dir is not None: + if logger is not None: + logger.debug("changing into '%s'", root_dir) + base_name = os.path.abspath(base_name) + if not dry_run: + os.chdir(root_dir) + + if base_dir is None: + base_dir = os.curdir + + kwargs = {'dry_run': dry_run, 'logger': logger} + + try: + format_info = _ARCHIVE_FORMATS[format] + except KeyError: + raise ValueError("unknown archive format '%s'" % format) + + func = format_info[0] + for arg, val in format_info[1]: + kwargs[arg] = val + + if format != 'zip': + kwargs['owner'] = owner + kwargs['group'] = group + + try: + filename = func(base_name, base_dir, **kwargs) + finally: + if root_dir is not None: + if logger is not None: + logger.debug("changing back to '%s'", save_cwd) + os.chdir(save_cwd) + + return filename + + +def get_unpack_formats(): + """Returns a list of supported formats for unpacking. + + Each element of the returned sequence is a tuple + (name, extensions, description) + """ + formats = [(name, info[0], info[3]) for name, info in + _UNPACK_FORMATS.items()] + formats.sort() + return formats + +def _check_unpack_options(extensions, function, extra_args): + """Checks what gets registered as an unpacker.""" + # first make sure no other unpacker is registered for this extension + existing_extensions = {} + for name, info in _UNPACK_FORMATS.items(): + for ext in info[0]: + existing_extensions[ext] = name + + for extension in extensions: + if extension in existing_extensions: + msg = '%s is already registered for "%s"' + raise RegistryError(msg % (extension, + existing_extensions[extension])) + + if not isinstance(function, collections.Callable): + raise TypeError('The registered function must be a callable') + + +def register_unpack_format(name, extensions, function, extra_args=None, + description=''): + """Registers an unpack format. + + `name` is the name of the format. `extensions` is a list of extensions + corresponding to the format. + + `function` is the callable that will be + used to unpack archives. The callable will receive archives to unpack. + If it's unable to handle an archive, it needs to raise a ReadError + exception. + + If provided, `extra_args` is a sequence of + (name, value) tuples that will be passed as arguments to the callable. + description can be provided to describe the format, and will be returned + by the get_unpack_formats() function. + """ + if extra_args is None: + extra_args = [] + _check_unpack_options(extensions, function, extra_args) + _UNPACK_FORMATS[name] = extensions, function, extra_args, description + +def unregister_unpack_format(name): + """Removes the pack format from the registry.""" + del _UNPACK_FORMATS[name] + +def _ensure_directory(path): + """Ensure that the parent directory of `path` exists""" + dirname = os.path.dirname(path) + if not os.path.isdir(dirname): + os.makedirs(dirname) + +def _unpack_zipfile(filename, extract_dir): + """Unpack zip `filename` to `extract_dir` + """ + try: + import zipfile + except ImportError: + raise ReadError('zlib not supported, cannot unpack this archive.') + + if not zipfile.is_zipfile(filename): + raise ReadError("%s is not a zip file" % filename) + + zip = zipfile.ZipFile(filename) + try: + for info in zip.infolist(): + name = info.filename + + # don't extract absolute paths or ones with .. in them + if name.startswith('/') or '..' in name: + continue + + target = os.path.join(extract_dir, *name.split('/')) + if not target: + continue + + _ensure_directory(target) + if not name.endswith('/'): + # file + data = zip.read(info.filename) + f = open(target, 'wb') + try: + f.write(data) + finally: + f.close() + del data + finally: + zip.close() + +def _unpack_tarfile(filename, extract_dir): + """Unpack tar/tar.gz/tar.bz2 `filename` to `extract_dir` + """ + try: + tarobj = tarfile.open(filename) + except tarfile.TarError: + raise ReadError( + "%s is not a compressed or uncompressed tar file" % filename) + try: + tarobj.extractall(extract_dir) + finally: + tarobj.close() + +_UNPACK_FORMATS = { + 'gztar': (['.tar.gz', '.tgz'], _unpack_tarfile, [], "gzip'ed tar-file"), + 'tar': (['.tar'], _unpack_tarfile, [], "uncompressed tar file"), + 'zip': (['.zip'], _unpack_zipfile, [], "ZIP file") + } + +if _BZ2_SUPPORTED: + _UNPACK_FORMATS['bztar'] = (['.bz2'], _unpack_tarfile, [], + "bzip2'ed tar-file") + +def _find_unpack_format(filename): + for name, info in _UNPACK_FORMATS.items(): + for extension in info[0]: + if filename.endswith(extension): + return name + return None + +def unpack_archive(filename, extract_dir=None, format=None): + """Unpack an archive. + + `filename` is the name of the archive. + + `extract_dir` is the name of the target directory, where the archive + is unpacked. If not provided, the current working directory is used. + + `format` is the archive format: one of "zip", "tar", or "gztar". Or any + other registered format. If not provided, unpack_archive will use the + filename extension and see if an unpacker was registered for that + extension. + + In case none is found, a ValueError is raised. + """ + if extract_dir is None: + extract_dir = os.getcwd() + + if format is not None: + try: + format_info = _UNPACK_FORMATS[format] + except KeyError: + raise ValueError("Unknown unpack format '{0}'".format(format)) + + func = format_info[1] + func(filename, extract_dir, **dict(format_info[2])) + else: + # we need to look at the registered unpackers supported extensions + format = _find_unpack_format(filename) + if format is None: + raise ReadError("Unknown archive format '{0}'".format(filename)) + + func = _UNPACK_FORMATS[format][1] + kwargs = dict(_UNPACK_FORMATS[format][2]) + func(filename, extract_dir, **kwargs) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/shutil.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/shutil.pyc new file mode 100644 index 0000000000000000000000000000000000000000..91e85d314ac08419a993132e71b37112e9eb3cf4 GIT binary patch literal 28381 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

;0^s#V=iFup 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 v4A;h~i=6IYpUSc8@t#eEzM?VR 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 s2: + result = url1 + if result != url2: + logger.debug('Not replacing %r with %r', url1, url2) + else: + logger.debug('Replacing %r with %r', url1, url2) + return result + + def split_filename(self, filename, project_name): + """ + Attempt to split a filename in project name, version and Python version. + """ + return split_filename(filename, project_name) + + def convert_url_to_download_info(self, url, project_name): + """ + See if a URL is a candidate for a download URL for a project (the URL + has typically been scraped from an HTML page). + + If it is, a dictionary is returned with keys "name", "version", + "filename" and "url"; otherwise, None is returned. + """ + def same_project(name1, name2): + return normalize_name(name1) == normalize_name(name2) + + result = None + scheme, netloc, path, params, query, frag = urlparse(url) + if frag.lower().startswith('egg='): # pragma: no cover + logger.debug('%s: version hint in fragment: %r', + project_name, frag) + m = HASHER_HASH.match(frag) + if m: + algo, digest = m.groups() + else: + algo, digest = None, None + origpath = path + if path and path[-1] == '/': # pragma: no cover + path = path[:-1] + if path.endswith('.whl'): + try: + wheel = Wheel(path) + if not is_compatible(wheel, self.wheel_tags): + logger.debug('Wheel not compatible: %s', path) + else: + if project_name is None: + include = True + else: + include = same_project(wheel.name, project_name) + if include: + result = { + 'name': wheel.name, + 'version': wheel.version, + 'filename': wheel.filename, + 'url': urlunparse((scheme, netloc, origpath, + params, query, '')), + 'python-version': ', '.join( + ['.'.join(list(v[2:])) for v in wheel.pyver]), + } + except Exception as e: # pragma: no cover + logger.warning('invalid path for wheel: %s', path) + elif not path.endswith(self.downloadable_extensions): # pragma: no cover + logger.debug('Not downloadable: %s', path) + else: # downloadable extension + path = filename = posixpath.basename(path) + for ext in self.downloadable_extensions: + if path.endswith(ext): + path = path[:-len(ext)] + t = self.split_filename(path, project_name) + if not t: # pragma: no cover + logger.debug('No match for project/version: %s', path) + else: + name, version, pyver = t + if not project_name or same_project(project_name, name): + result = { + 'name': name, + 'version': version, + 'filename': filename, + 'url': urlunparse((scheme, netloc, origpath, + params, query, '')), + #'packagetype': 'sdist', + } + if pyver: # pragma: no cover + result['python-version'] = pyver + break + if result and algo: + result['%s_digest' % algo] = digest + return result + + def _get_digest(self, info): + """ + Get a digest from a dictionary by looking at a "digests" dictionary + or keys of the form 'algo_digest'. + + Returns a 2-tuple (algo, digest) if found, else None. Currently + looks only for SHA256, then MD5. + """ + result = None + if 'digests' in info: + digests = info['digests'] + for algo in ('sha256', 'md5'): + if algo in digests: + result = (algo, digests[algo]) + break + if not result: + for algo in ('sha256', 'md5'): + key = '%s_digest' % algo + if key in info: + result = (algo, info[key]) + break + return result + + def _update_version_data(self, result, info): + """ + Update a result dictionary (the final result from _get_project) with a + dictionary for a specific version, which typically holds information + gleaned from a filename or URL for an archive for the distribution. + """ + name = info.pop('name') + version = info.pop('version') + if version in result: + dist = result[version] + md = dist.metadata + else: + dist = make_dist(name, version, scheme=self.scheme) + md = dist.metadata + dist.digest = digest = self._get_digest(info) + url = info['url'] + result['digests'][url] = digest + if md.source_url != info['url']: + md.source_url = self.prefer_url(md.source_url, url) + result['urls'].setdefault(version, set()).add(url) + dist.locator = self + result[version] = dist + + def locate(self, requirement, prereleases=False): + """ + Find the most recent distribution which matches the given + requirement. + + :param requirement: A requirement of the form 'foo (1.0)' or perhaps + 'foo (>= 1.0, < 2.0, != 1.3)' + :param prereleases: If ``True``, allow pre-release versions + to be located. Otherwise, pre-release versions + are not returned. + :return: A :class:`Distribution` instance, or ``None`` if no such + distribution could be located. + """ + result = None + r = parse_requirement(requirement) + if r is None: # pragma: no cover + raise DistlibException('Not a valid requirement: %r' % requirement) + scheme = get_scheme(self.scheme) + self.matcher = matcher = scheme.matcher(r.requirement) + logger.debug('matcher: %s (%s)', matcher, type(matcher).__name__) + versions = self.get_project(r.name) + if len(versions) > 2: # urls and digests keys are present + # sometimes, versions are invalid + slist = [] + vcls = matcher.version_class + for k in versions: + if k in ('urls', 'digests'): + continue + try: + if not matcher.match(k): + logger.debug('%s did not match %r', matcher, k) + else: + if prereleases or not vcls(k).is_prerelease: + slist.append(k) + else: + logger.debug('skipping pre-release ' + 'version %s of %s', k, matcher.name) + except Exception: # pragma: no cover + logger.warning('error matching %s with %r', matcher, k) + pass # slist.append(k) + if len(slist) > 1: + slist = sorted(slist, key=scheme.key) + if slist: + logger.debug('sorted list: %s', slist) + version = slist[-1] + result = versions[version] + if result: + if r.extras: + result.extras = r.extras + result.download_urls = versions.get('urls', {}).get(version, set()) + d = {} + sd = versions.get('digests', {}) + for url in result.download_urls: + if url in sd: # pragma: no cover + d[url] = sd[url] + result.digests = d + self.matcher = None + return result + + +class PyPIRPCLocator(Locator): + """ + This locator uses XML-RPC to locate distributions. It therefore + cannot be used with simple mirrors (that only mirror file content). + """ + def __init__(self, url, **kwargs): + """ + Initialise an instance. + + :param url: The URL to use for XML-RPC. + :param kwargs: Passed to the superclass constructor. + """ + super(PyPIRPCLocator, self).__init__(**kwargs) + self.base_url = url + self.client = ServerProxy(url, timeout=3.0) + + def get_distribution_names(self): + """ + Return all the distribution names known to this locator. + """ + return set(self.client.list_packages()) + + def _get_project(self, name): + result = {'urls': {}, 'digests': {}} + versions = self.client.package_releases(name, True) + for v in versions: + urls = self.client.release_urls(name, v) + data = self.client.release_data(name, v) + metadata = Metadata(scheme=self.scheme) + metadata.name = data['name'] + metadata.version = data['version'] + metadata.license = data.get('license') + metadata.keywords = data.get('keywords', []) + metadata.summary = data.get('summary') + dist = Distribution(metadata) + if urls: + info = urls[0] + metadata.source_url = info['url'] + dist.digest = self._get_digest(info) + dist.locator = self + result[v] = dist + for info in urls: + url = info['url'] + digest = self._get_digest(info) + result['urls'].setdefault(v, set()).add(url) + result['digests'][url] = digest + return result + +class PyPIJSONLocator(Locator): + """ + This locator uses PyPI's JSON interface. It's very limited in functionality + and probably not worth using. + """ + def __init__(self, url, **kwargs): + super(PyPIJSONLocator, self).__init__(**kwargs) + self.base_url = ensure_slash(url) + + def get_distribution_names(self): + """ + Return all the distribution names known to this locator. + """ + raise NotImplementedError('Not available from this locator') + + def _get_project(self, name): + result = {'urls': {}, 'digests': {}} + url = urljoin(self.base_url, '%s/json' % quote(name)) + try: + resp = self.opener.open(url) + data = resp.read().decode() # for now + d = json.loads(data) + md = Metadata(scheme=self.scheme) + data = d['info'] + md.name = data['name'] + md.version = data['version'] + md.license = data.get('license') + md.keywords = data.get('keywords', []) + md.summary = data.get('summary') + dist = Distribution(md) + dist.locator = self + urls = d['urls'] + result[md.version] = dist + for info in d['urls']: + url = info['url'] + dist.download_urls.add(url) + dist.digests[url] = self._get_digest(info) + result['urls'].setdefault(md.version, set()).add(url) + result['digests'][url] = self._get_digest(info) + # Now get other releases + for version, infos in d['releases'].items(): + if version == md.version: + continue # already done + omd = Metadata(scheme=self.scheme) + omd.name = md.name + omd.version = version + odist = Distribution(omd) + odist.locator = self + result[version] = odist + for info in infos: + url = info['url'] + odist.download_urls.add(url) + odist.digests[url] = self._get_digest(info) + result['urls'].setdefault(version, set()).add(url) + result['digests'][url] = self._get_digest(info) +# for info in urls: +# md.source_url = info['url'] +# dist.digest = self._get_digest(info) +# dist.locator = self +# for info in urls: +# url = info['url'] +# result['urls'].setdefault(md.version, set()).add(url) +# result['digests'][url] = self._get_digest(info) + except Exception as e: + self.errors.put(text_type(e)) + logger.exception('JSON fetch failed: %s', e) + return result + + +class Page(object): + """ + This class represents a scraped HTML page. + """ + # The following slightly hairy-looking regex just looks for the contents of + # an anchor link, which has an attribute "href" either immediately preceded + # or immediately followed by a "rel" attribute. The attribute values can be + # declared with double quotes, single quotes or no quotes - which leads to + # the length of the expression. + _href = re.compile(""" +(rel\\s*=\\s*(?:"(?P[^"]*)"|'(?P[^']*)'|(?P[^>\\s\n]*))\\s+)? +href\\s*=\\s*(?:"(?P[^"]*)"|'(?P[^']*)'|(?P[^>\\s\n]*)) +(\\s+rel\\s*=\\s*(?:"(?P[^"]*)"|'(?P[^']*)'|(?P[^>\\s\n]*)))? +""", re.I | re.S | re.X) + _base = re.compile(r"""]+)""", re.I | re.S) + + def __init__(self, data, url): + """ + Initialise an instance with the Unicode page contents and the URL they + came from. + """ + self.data = data + self.base_url = self.url = url + m = self._base.search(self.data) + if m: + self.base_url = m.group(1) + + _clean_re = re.compile(r'[^a-z0-9$&+,/:;=?@.#%_\\|-]', re.I) + + @cached_property + def links(self): + """ + Return the URLs of all the links on a page together with information + about their "rel" attribute, for determining which ones to treat as + downloads and which ones to queue for further scraping. + """ + def clean(url): + "Tidy up an URL." + scheme, netloc, path, params, query, frag = urlparse(url) + return urlunparse((scheme, netloc, quote(path), + params, query, frag)) + + result = set() + for match in self._href.finditer(self.data): + d = match.groupdict('') + rel = (d['rel1'] or d['rel2'] or d['rel3'] or + d['rel4'] or d['rel5'] or d['rel6']) + url = d['url1'] or d['url2'] or d['url3'] + url = urljoin(self.base_url, url) + url = unescape(url) + url = self._clean_re.sub(lambda m: '%%%2x' % ord(m.group(0)), url) + result.add((url, rel)) + # We sort the result, hoping to bring the most recent versions + # to the front + result = sorted(result, key=lambda t: t[0], reverse=True) + return result + + +class SimpleScrapingLocator(Locator): + """ + A locator which scrapes HTML pages to locate downloads for a distribution. + This runs multiple threads to do the I/O; performance is at least as good + as pip's PackageFinder, which works in an analogous fashion. + """ + + # These are used to deal with various Content-Encoding schemes. + decoders = { + 'deflate': zlib.decompress, + 'gzip': lambda b: gzip.GzipFile(fileobj=BytesIO(d)).read(), + 'none': lambda b: b, + } + + def __init__(self, url, timeout=None, num_workers=10, **kwargs): + """ + Initialise an instance. + :param url: The root URL to use for scraping. + :param timeout: The timeout, in seconds, to be applied to requests. + This defaults to ``None`` (no timeout specified). + :param num_workers: The number of worker threads you want to do I/O, + This defaults to 10. + :param kwargs: Passed to the superclass. + """ + super(SimpleScrapingLocator, self).__init__(**kwargs) + self.base_url = ensure_slash(url) + self.timeout = timeout + self._page_cache = {} + self._seen = set() + self._to_fetch = queue.Queue() + self._bad_hosts = set() + self.skip_externals = False + self.num_workers = num_workers + self._lock = threading.RLock() + # See issue #45: we need to be resilient when the locator is used + # in a thread, e.g. with concurrent.futures. We can't use self._lock + # as it is for coordinating our internal threads - the ones created + # in _prepare_threads. + self._gplock = threading.RLock() + self.platform_check = False # See issue #112 + + def _prepare_threads(self): + """ + Threads are created only when get_project is called, and terminate + before it returns. They are there primarily to parallelise I/O (i.e. + fetching web pages). + """ + self._threads = [] + for i in range(self.num_workers): + t = threading.Thread(target=self._fetch) + t.setDaemon(True) + t.start() + self._threads.append(t) + + def _wait_threads(self): + """ + Tell all the threads to terminate (by sending a sentinel value) and + wait for them to do so. + """ + # Note that you need two loops, since you can't say which + # thread will get each sentinel + for t in self._threads: + self._to_fetch.put(None) # sentinel + for t in self._threads: + t.join() + self._threads = [] + + def _get_project(self, name): + result = {'urls': {}, 'digests': {}} + with self._gplock: + self.result = result + self.project_name = name + url = urljoin(self.base_url, '%s/' % quote(name)) + self._seen.clear() + self._page_cache.clear() + self._prepare_threads() + try: + logger.debug('Queueing %s', url) + self._to_fetch.put(url) + self._to_fetch.join() + finally: + self._wait_threads() + del self.result + return result + + platform_dependent = re.compile(r'\b(linux_(i\d86|x86_64|arm\w+)|' + r'win(32|_amd64)|macosx_?\d+)\b', re.I) + + def _is_platform_dependent(self, url): + """ + Does an URL refer to a platform-specific download? + """ + return self.platform_dependent.search(url) + + def _process_download(self, url): + """ + See if an URL is a suitable download for a project. + + If it is, register information in the result dictionary (for + _get_project) about the specific version it's for. + + Note that the return value isn't actually used other than as a boolean + value. + """ + if self.platform_check and self._is_platform_dependent(url): + info = None + else: + info = self.convert_url_to_download_info(url, self.project_name) + logger.debug('process_download: %s -> %s', url, info) + if info: + with self._lock: # needed because self.result is shared + self._update_version_data(self.result, info) + return info + + def _should_queue(self, link, referrer, rel): + """ + Determine whether a link URL from a referring page and with a + particular "rel" attribute should be queued for scraping. + """ + scheme, netloc, path, _, _, _ = urlparse(link) + if path.endswith(self.source_extensions + self.binary_extensions + + self.excluded_extensions): + result = False + elif self.skip_externals and not link.startswith(self.base_url): + result = False + elif not referrer.startswith(self.base_url): + result = False + elif rel not in ('homepage', 'download'): + result = False + elif scheme not in ('http', 'https', 'ftp'): + result = False + elif self._is_platform_dependent(link): + result = False + else: + host = netloc.split(':', 1)[0] + if host.lower() == 'localhost': + result = False + else: + result = True + logger.debug('should_queue: %s (%s) from %s -> %s', link, rel, + referrer, result) + return result + + def _fetch(self): + """ + Get a URL to fetch from the work queue, get the HTML page, examine its + links for download candidates and candidates for further scraping. + + This is a handy method to run in a thread. + """ + while True: + url = self._to_fetch.get() + try: + if url: + page = self.get_page(url) + if page is None: # e.g. after an error + continue + for link, rel in page.links: + if link not in self._seen: + try: + self._seen.add(link) + if (not self._process_download(link) and + self._should_queue(link, url, rel)): + logger.debug('Queueing %s from %s', link, url) + self._to_fetch.put(link) + except MetadataInvalidError: # e.g. invalid versions + pass + except Exception as e: # pragma: no cover + self.errors.put(text_type(e)) + finally: + # always do this, to avoid hangs :-) + self._to_fetch.task_done() + if not url: + #logger.debug('Sentinel seen, quitting.') + break + + def get_page(self, url): + """ + Get the HTML for an URL, possibly from an in-memory cache. + + XXX TODO Note: this cache is never actually cleared. It's assumed that + the data won't get stale over the lifetime of a locator instance (not + necessarily true for the default_locator). + """ + # http://peak.telecommunity.com/DevCenter/EasyInstall#package-index-api + scheme, netloc, path, _, _, _ = urlparse(url) + if scheme == 'file' and os.path.isdir(url2pathname(path)): + url = urljoin(ensure_slash(url), 'index.html') + + if url in self._page_cache: + result = self._page_cache[url] + logger.debug('Returning %s from cache: %s', url, result) + else: + host = netloc.split(':', 1)[0] + result = None + if host in self._bad_hosts: + logger.debug('Skipping %s due to bad host %s', url, host) + else: + req = Request(url, headers={'Accept-encoding': 'identity'}) + try: + logger.debug('Fetching %s', url) + resp = self.opener.open(req, timeout=self.timeout) + logger.debug('Fetched %s', url) + headers = resp.info() + content_type = headers.get('Content-Type', '') + if HTML_CONTENT_TYPE.match(content_type): + final_url = resp.geturl() + data = resp.read() + encoding = headers.get('Content-Encoding') + if encoding: + decoder = self.decoders[encoding] # fail if not found + data = decoder(data) + encoding = 'utf-8' + m = CHARSET.search(content_type) + if m: + encoding = m.group(1) + try: + data = data.decode(encoding) + except UnicodeError: # pragma: no cover + data = data.decode('latin-1') # fallback + result = Page(data, final_url) + self._page_cache[final_url] = result + except HTTPError as e: + if e.code != 404: + logger.exception('Fetch failed: %s: %s', url, e) + except URLError as e: # pragma: no cover + logger.exception('Fetch failed: %s: %s', url, e) + with self._lock: + self._bad_hosts.add(host) + except Exception as e: # pragma: no cover + logger.exception('Fetch failed: %s: %s', url, e) + finally: + self._page_cache[url] = result # even if None (failure) + return result + + _distname_re = re.compile(']*>([^<]+)<') + + def get_distribution_names(self): + """ + Return all the distribution names known to this locator. + """ + result = set() + page = self.get_page(self.base_url) + if not page: + raise DistlibException('Unable to get %s' % self.base_url) + for match in self._distname_re.finditer(page.data): + result.add(match.group(1)) + return result + +class DirectoryLocator(Locator): + """ + This class locates distributions in a directory tree. + """ + + def __init__(self, path, **kwargs): + """ + Initialise an instance. + :param path: The root of the directory tree to search. + :param kwargs: Passed to the superclass constructor, + except for: + * recursive - if True (the default), subdirectories are + recursed into. If False, only the top-level directory + is searched, + """ + self.recursive = kwargs.pop('recursive', True) + super(DirectoryLocator, self).__init__(**kwargs) + path = os.path.abspath(path) + if not os.path.isdir(path): # pragma: no cover + raise DistlibException('Not a directory: %r' % path) + self.base_dir = path + + def should_include(self, filename, parent): + """ + Should a filename be considered as a candidate for a distribution + archive? As well as the filename, the directory which contains it + is provided, though not used by the current implementation. + """ + return filename.endswith(self.downloadable_extensions) + + def _get_project(self, name): + result = {'urls': {}, 'digests': {}} + for root, dirs, files in os.walk(self.base_dir): + for fn in files: + if self.should_include(fn, root): + fn = os.path.join(root, fn) + url = urlunparse(('file', '', + pathname2url(os.path.abspath(fn)), + '', '', '')) + info = self.convert_url_to_download_info(url, name) + if info: + self._update_version_data(result, info) + if not self.recursive: + break + return result + + def get_distribution_names(self): + """ + Return all the distribution names known to this locator. + """ + result = set() + for root, dirs, files in os.walk(self.base_dir): + for fn in files: + if self.should_include(fn, root): + fn = os.path.join(root, fn) + url = urlunparse(('file', '', + pathname2url(os.path.abspath(fn)), + '', '', '')) + info = self.convert_url_to_download_info(url, None) + if info: + result.add(info['name']) + if not self.recursive: + break + return result + +class JSONLocator(Locator): + """ + This locator uses special extended metadata (not available on PyPI) and is + the basis of performant dependency resolution in distlib. Other locators + require archive downloads before dependencies can be determined! As you + might imagine, that can be slow. + """ + def get_distribution_names(self): + """ + Return all the distribution names known to this locator. + """ + raise NotImplementedError('Not available from this locator') + + def _get_project(self, name): + result = {'urls': {}, 'digests': {}} + data = get_project_data(name) + if data: + for info in data.get('files', []): + if info['ptype'] != 'sdist' or info['pyversion'] != 'source': + continue + # We don't store summary in project metadata as it makes + # the data bigger for no benefit during dependency + # resolution + dist = make_dist(data['name'], info['version'], + summary=data.get('summary', + 'Placeholder for summary'), + scheme=self.scheme) + md = dist.metadata + md.source_url = info['url'] + # TODO SHA256 digest + if 'digest' in info and info['digest']: + dist.digest = ('md5', info['digest']) + md.dependencies = info.get('requirements', {}) + dist.exports = info.get('exports', {}) + result[dist.version] = dist + result['urls'].setdefault(dist.version, set()).add(info['url']) + return result + +class DistPathLocator(Locator): + """ + This locator finds installed distributions in a path. It can be useful for + adding to an :class:`AggregatingLocator`. + """ + def __init__(self, distpath, **kwargs): + """ + Initialise an instance. + + :param distpath: A :class:`DistributionPath` instance to search. + """ + super(DistPathLocator, self).__init__(**kwargs) + assert isinstance(distpath, DistributionPath) + self.distpath = distpath + + def _get_project(self, name): + dist = self.distpath.get_distribution(name) + if dist is None: + result = {'urls': {}, 'digests': {}} + else: + result = { + dist.version: dist, + 'urls': {dist.version: set([dist.source_url])}, + 'digests': {dist.version: set([None])} + } + return result + + +class AggregatingLocator(Locator): + """ + This class allows you to chain and/or merge a list of locators. + """ + def __init__(self, *locators, **kwargs): + """ + Initialise an instance. + + :param locators: The list of locators to search. + :param kwargs: Passed to the superclass constructor, + except for: + * merge - if False (the default), the first successful + search from any of the locators is returned. If True, + the results from all locators are merged (this can be + slow). + """ + self.merge = kwargs.pop('merge', False) + self.locators = locators + super(AggregatingLocator, self).__init__(**kwargs) + + def clear_cache(self): + super(AggregatingLocator, self).clear_cache() + for locator in self.locators: + locator.clear_cache() + + def _set_scheme(self, value): + self._scheme = value + for locator in self.locators: + locator.scheme = value + + scheme = property(Locator.scheme.fget, _set_scheme) + + def _get_project(self, name): + result = {} + for locator in self.locators: + d = locator.get_project(name) + if d: + if self.merge: + files = result.get('urls', {}) + digests = result.get('digests', {}) + # next line could overwrite result['urls'], result['digests'] + result.update(d) + df = result.get('urls') + if files and df: + for k, v in files.items(): + if k in df: + df[k] |= v + else: + df[k] = v + dd = result.get('digests') + if digests and dd: + dd.update(digests) + else: + # See issue #18. If any dists are found and we're looking + # for specific constraints, we only return something if + # a match is found. For example, if a DirectoryLocator + # returns just foo (1.0) while we're looking for + # foo (>= 2.0), we'll pretend there was nothing there so + # that subsequent locators can be queried. Otherwise we + # would just return foo (1.0) which would then lead to a + # failure to find foo (>= 2.0), because other locators + # weren't searched. Note that this only matters when + # merge=False. + if self.matcher is None: + found = True + else: + found = False + for k in d: + if self.matcher.match(k): + found = True + break + if found: + result = d + break + return result + + def get_distribution_names(self): + """ + Return all the distribution names known to this locator. + """ + result = set() + for locator in self.locators: + try: + result |= locator.get_distribution_names() + except NotImplementedError: + pass + return result + + +# We use a legacy scheme simply because most of the dists on PyPI use legacy +# versions which don't conform to PEP 426 / PEP 440. +default_locator = AggregatingLocator( + JSONLocator(), + SimpleScrapingLocator('https://pypi.org/simple/', + timeout=3.0), + scheme='legacy') + +locate = default_locator.locate + +NAME_VERSION_RE = re.compile(r'(?P[\w-]+)\s*' + r'\(\s*(==\s*)?(?P[^)]+)\)$') + +class DependencyFinder(object): + """ + Locate dependencies for distributions. + """ + + def __init__(self, locator=None): + """ + Initialise an instance, using the specified locator + to locate distributions. + """ + self.locator = locator or default_locator + self.scheme = get_scheme(self.locator.scheme) + + def add_distribution(self, dist): + """ + Add a distribution to the finder. This will update internal information + about who provides what. + :param dist: The distribution to add. + """ + logger.debug('adding distribution %s', dist) + name = dist.key + self.dists_by_name[name] = dist + self.dists[(name, dist.version)] = dist + for p in dist.provides: + name, version = parse_name_and_version(p) + logger.debug('Add to provided: %s, %s, %s', name, version, dist) + self.provided.setdefault(name, set()).add((version, dist)) + + def remove_distribution(self, dist): + """ + Remove a distribution from the finder. This will update internal + information about who provides what. + :param dist: The distribution to remove. + """ + logger.debug('removing distribution %s', dist) + name = dist.key + del self.dists_by_name[name] + del self.dists[(name, dist.version)] + for p in dist.provides: + name, version = parse_name_and_version(p) + logger.debug('Remove from provided: %s, %s, %s', name, version, dist) + s = self.provided[name] + s.remove((version, dist)) + if not s: + del self.provided[name] + + def get_matcher(self, reqt): + """ + Get a version matcher for a requirement. + :param reqt: The requirement + :type reqt: str + :return: A version matcher (an instance of + :class:`distlib.version.Matcher`). + """ + try: + matcher = self.scheme.matcher(reqt) + except UnsupportedVersionError: # pragma: no cover + # XXX compat-mode if cannot read the version + name = reqt.split()[0] + matcher = self.scheme.matcher(name) + return matcher + + def find_providers(self, reqt): + """ + Find the distributions which can fulfill a requirement. + + :param reqt: The requirement. + :type reqt: str + :return: A set of distribution which can fulfill the requirement. + """ + matcher = self.get_matcher(reqt) + name = matcher.key # case-insensitive + result = set() + provided = self.provided + if name in provided: + for version, provider in provided[name]: + try: + match = matcher.match(version) + except UnsupportedVersionError: + match = False + + if match: + result.add(provider) + break + return result + + def try_to_replace(self, provider, other, problems): + """ + Attempt to replace one provider with another. This is typically used + when resolving dependencies from multiple sources, e.g. A requires + (B >= 1.0) while C requires (B >= 1.1). + + For successful replacement, ``provider`` must meet all the requirements + which ``other`` fulfills. + + :param provider: The provider we are trying to replace with. + :param other: The provider we're trying to replace. + :param problems: If False is returned, this will contain what + problems prevented replacement. This is currently + a tuple of the literal string 'cantreplace', + ``provider``, ``other`` and the set of requirements + that ``provider`` couldn't fulfill. + :return: True if we can replace ``other`` with ``provider``, else + False. + """ + rlist = self.reqts[other] + unmatched = set() + for s in rlist: + matcher = self.get_matcher(s) + if not matcher.match(provider.version): + unmatched.add(s) + if unmatched: + # can't replace other with provider + problems.add(('cantreplace', provider, other, + frozenset(unmatched))) + result = False + else: + # can replace other with provider + self.remove_distribution(other) + del self.reqts[other] + for s in rlist: + self.reqts.setdefault(provider, set()).add(s) + self.add_distribution(provider) + result = True + return result + + def find(self, requirement, meta_extras=None, prereleases=False): + """ + Find a distribution and all distributions it depends on. + + :param requirement: The requirement specifying the distribution to + find, or a Distribution instance. + :param meta_extras: A list of meta extras such as :test:, :build: and + so on. + :param prereleases: If ``True``, allow pre-release versions to be + returned - otherwise, don't return prereleases + unless they're all that's available. + + Return a set of :class:`Distribution` instances and a set of + problems. + + The distributions returned should be such that they have the + :attr:`required` attribute set to ``True`` if they were + from the ``requirement`` passed to ``find()``, and they have the + :attr:`build_time_dependency` attribute set to ``True`` unless they + are post-installation dependencies of the ``requirement``. + + The problems should be a tuple consisting of the string + ``'unsatisfied'`` and the requirement which couldn't be satisfied + by any distribution known to the locator. + """ + + self.provided = {} + self.dists = {} + self.dists_by_name = {} + self.reqts = {} + + meta_extras = set(meta_extras or []) + if ':*:' in meta_extras: + meta_extras.remove(':*:') + # :meta: and :run: are implicitly included + meta_extras |= set([':test:', ':build:', ':dev:']) + + if isinstance(requirement, Distribution): + dist = odist = requirement + logger.debug('passed %s as requirement', odist) + else: + dist = odist = self.locator.locate(requirement, + prereleases=prereleases) + if dist is None: + raise DistlibException('Unable to locate %r' % requirement) + logger.debug('located %s', odist) + dist.requested = True + problems = set() + todo = set([dist]) + install_dists = set([odist]) + while todo: + dist = todo.pop() + name = dist.key # case-insensitive + if name not in self.dists_by_name: + self.add_distribution(dist) + else: + #import pdb; pdb.set_trace() + other = self.dists_by_name[name] + if other != dist: + self.try_to_replace(dist, other, problems) + + ireqts = dist.run_requires | dist.meta_requires + sreqts = dist.build_requires + ereqts = set() + if meta_extras and dist in install_dists: + for key in ('test', 'build', 'dev'): + e = ':%s:' % key + if e in meta_extras: + ereqts |= getattr(dist, '%s_requires' % key) + all_reqts = ireqts | sreqts | ereqts + for r in all_reqts: + providers = self.find_providers(r) + if not providers: + logger.debug('No providers found for %r', r) + provider = self.locator.locate(r, prereleases=prereleases) + # If no provider is found and we didn't consider + # prereleases, consider them now. + if provider is None and not prereleases: + provider = self.locator.locate(r, prereleases=True) + if provider is None: + logger.debug('Cannot satisfy %r', r) + problems.add(('unsatisfied', r)) + else: + n, v = provider.key, provider.version + if (n, v) not in self.dists: + todo.add(provider) + providers.add(provider) + if r in ireqts and dist in install_dists: + install_dists.add(provider) + logger.debug('Adding %s to install_dists', + provider.name_and_version) + for p in providers: + name = p.key + if name not in self.dists_by_name: + self.reqts.setdefault(p, set()).add(r) + else: + other = self.dists_by_name[name] + if other != p: + # see if other can be replaced by p + self.try_to_replace(p, other, problems) + + dists = set(self.dists.values()) + for dist in dists: + dist.build_time_dependency = dist not in install_dists + if dist.build_time_dependency: + logger.debug('%s is a build-time dependency only.', + dist.name_and_version) + logger.debug('find done for %s', odist) + return dists, problems diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/locators.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/locators.pyc new file mode 100644 index 0000000000000000000000000000000000000000..815928d684f42d15cf5b7d2e42ebe59ec5a226f5 GIT binary patch literal 49881 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 QkA6x41U=puC=U1h|6*RO7XSbN literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/manifest 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/manifest 2.py new file mode 100644 index 0000000..ca0fe44 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/manifest 2.py @@ -0,0 +1,393 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2012-2013 Python Software Foundation. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +""" +Class representing the list of files in a distribution. + +Equivalent to distutils.filelist, but fixes some problems. +""" +import fnmatch +import logging +import os +import re +import sys + +from . import DistlibException +from .compat import fsdecode +from .util import convert_path + + +__all__ = ['Manifest'] + +logger = logging.getLogger(__name__) + +# a \ followed by some spaces + EOL +_COLLAPSE_PATTERN = re.compile('\\\\w*\n', re.M) +_COMMENTED_LINE = re.compile('#.*?(?=\n)|\n(?=$)', re.M | re.S) + +# +# Due to the different results returned by fnmatch.translate, we need +# to do slightly different processing for Python 2.7 and 3.2 ... this needed +# to be brought in for Python 3.6 onwards. +# +_PYTHON_VERSION = sys.version_info[:2] + +class Manifest(object): + """A list of files built by on exploring the filesystem and filtered by + applying various patterns to what we find there. + """ + + def __init__(self, base=None): + """ + Initialise an instance. + + :param base: The base directory to explore under. + """ + self.base = os.path.abspath(os.path.normpath(base or os.getcwd())) + self.prefix = self.base + os.sep + self.allfiles = None + self.files = set() + + # + # Public API + # + + def findall(self): + """Find all files under the base and set ``allfiles`` to the absolute + pathnames of files found. + """ + from stat import S_ISREG, S_ISDIR, S_ISLNK + + self.allfiles = allfiles = [] + root = self.base + stack = [root] + pop = stack.pop + push = stack.append + + while stack: + root = pop() + names = os.listdir(root) + + for name in names: + fullname = os.path.join(root, name) + + # Avoid excess stat calls -- just one will do, thank you! + stat = os.stat(fullname) + mode = stat.st_mode + if S_ISREG(mode): + allfiles.append(fsdecode(fullname)) + elif S_ISDIR(mode) and not S_ISLNK(mode): + push(fullname) + + def add(self, item): + """ + Add a file to the manifest. + + :param item: The pathname to add. This can be relative to the base. + """ + if not item.startswith(self.prefix): + item = os.path.join(self.base, item) + self.files.add(os.path.normpath(item)) + + def add_many(self, items): + """ + Add a list of files to the manifest. + + :param items: The pathnames to add. These can be relative to the base. + """ + for item in items: + self.add(item) + + def sorted(self, wantdirs=False): + """ + Return sorted files in directory order + """ + + def add_dir(dirs, d): + dirs.add(d) + logger.debug('add_dir added %s', d) + if d != self.base: + parent, _ = os.path.split(d) + assert parent not in ('', '/') + add_dir(dirs, parent) + + result = set(self.files) # make a copy! + if wantdirs: + dirs = set() + for f in result: + add_dir(dirs, os.path.dirname(f)) + result |= dirs + return [os.path.join(*path_tuple) for path_tuple in + sorted(os.path.split(path) for path in result)] + + def clear(self): + """Clear all collected files.""" + self.files = set() + self.allfiles = [] + + def process_directive(self, directive): + """ + Process a directive which either adds some files from ``allfiles`` to + ``files``, or removes some files from ``files``. + + :param directive: The directive to process. This should be in a format + compatible with distutils ``MANIFEST.in`` files: + + http://docs.python.org/distutils/sourcedist.html#commands + """ + # Parse the line: split it up, make sure the right number of words + # is there, and return the relevant words. 'action' is always + # defined: it's the first word of the line. Which of the other + # three are defined depends on the action; it'll be either + # patterns, (dir and patterns), or (dirpattern). + action, patterns, thedir, dirpattern = self._parse_directive(directive) + + # OK, now we know that the action is valid and we have the + # right number of words on the line for that action -- so we + # can proceed with minimal error-checking. + if action == 'include': + for pattern in patterns: + if not self._include_pattern(pattern, anchor=True): + logger.warning('no files found matching %r', pattern) + + elif action == 'exclude': + for pattern in patterns: + found = self._exclude_pattern(pattern, anchor=True) + #if not found: + # logger.warning('no previously-included files ' + # 'found matching %r', pattern) + + elif action == 'global-include': + for pattern in patterns: + if not self._include_pattern(pattern, anchor=False): + logger.warning('no files found matching %r ' + 'anywhere in distribution', pattern) + + elif action == 'global-exclude': + for pattern in patterns: + found = self._exclude_pattern(pattern, anchor=False) + #if not found: + # logger.warning('no previously-included files ' + # 'matching %r found anywhere in ' + # 'distribution', pattern) + + elif action == 'recursive-include': + for pattern in patterns: + if not self._include_pattern(pattern, prefix=thedir): + logger.warning('no files found matching %r ' + 'under directory %r', pattern, thedir) + + elif action == 'recursive-exclude': + for pattern in patterns: + found = self._exclude_pattern(pattern, prefix=thedir) + #if not found: + # logger.warning('no previously-included files ' + # 'matching %r found under directory %r', + # pattern, thedir) + + elif action == 'graft': + if not self._include_pattern(None, prefix=dirpattern): + logger.warning('no directories found matching %r', + dirpattern) + + elif action == 'prune': + if not self._exclude_pattern(None, prefix=dirpattern): + logger.warning('no previously-included directories found ' + 'matching %r', dirpattern) + else: # pragma: no cover + # This should never happen, as it should be caught in + # _parse_template_line + raise DistlibException( + 'invalid action %r' % action) + + # + # Private API + # + + def _parse_directive(self, directive): + """ + Validate a directive. + :param directive: The directive to validate. + :return: A tuple of action, patterns, thedir, dir_patterns + """ + words = directive.split() + if len(words) == 1 and words[0] not in ('include', 'exclude', + 'global-include', + 'global-exclude', + 'recursive-include', + 'recursive-exclude', + 'graft', 'prune'): + # no action given, let's use the default 'include' + words.insert(0, 'include') + + action = words[0] + patterns = thedir = dir_pattern = None + + if action in ('include', 'exclude', + 'global-include', 'global-exclude'): + if len(words) < 2: + raise DistlibException( + '%r expects ...' % action) + + patterns = [convert_path(word) for word in words[1:]] + + elif action in ('recursive-include', 'recursive-exclude'): + if len(words) < 3: + raise DistlibException( + '%r expects

9q4O7xu=AF z4=SnZC4V_H?qa9}7$s(e0bo#;65_6YFS(c1*(U<<5g}i0;&+{!*bbW636se3o|K2! z2206}vzFPyEMfU->OKxl24QuAf6CI2c**^}fxNurD`CCX4nE>T_G>>=ERI5su4ch+ zvGfC8{uP_x_wad3z%T0jJ2DdLG-h-dvU?bOoKD%pklsg;T00CU$sQcrtD845WAamF z*(goF@Ak`h(7Ux?&$kWrr h4xGYU;~4!wX`nP%I#wDfLY5xH*Mjg#1-9GyzW|lDrN96H literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/sysconfig 2.cfg b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/sysconfig 2.cfg new file mode 100644 index 0000000..1746bd0 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/sysconfig 2.cfg @@ -0,0 +1,84 @@ +[posix_prefix] +# Configuration directories. Some of these come straight out of the +# configure script. They are for implementing the other variables, not to +# be used directly in [resource_locations]. +confdir = /etc +datadir = /usr/share +libdir = /usr/lib +statedir = /var +# User resource directory +local = ~/.local/{distribution.name} + +stdlib = {base}/lib/python{py_version_short} +platstdlib = {platbase}/lib/python{py_version_short} +purelib = {base}/lib/python{py_version_short}/site-packages +platlib = {platbase}/lib/python{py_version_short}/site-packages +include = {base}/include/python{py_version_short}{abiflags} +platinclude = {platbase}/include/python{py_version_short}{abiflags} +data = {base} + +[posix_home] +stdlib = {base}/lib/python +platstdlib = {base}/lib/python +purelib = {base}/lib/python +platlib = {base}/lib/python +include = {base}/include/python +platinclude = {base}/include/python +scripts = {base}/bin +data = {base} + +[nt] +stdlib = {base}/Lib +platstdlib = {base}/Lib +purelib = {base}/Lib/site-packages +platlib = {base}/Lib/site-packages +include = {base}/Include +platinclude = {base}/Include +scripts = {base}/Scripts +data = {base} + +[os2] +stdlib = {base}/Lib +platstdlib = {base}/Lib +purelib = {base}/Lib/site-packages +platlib = {base}/Lib/site-packages +include = {base}/Include +platinclude = {base}/Include +scripts = {base}/Scripts +data = {base} + +[os2_home] +stdlib = {userbase}/lib/python{py_version_short} +platstdlib = {userbase}/lib/python{py_version_short} +purelib = {userbase}/lib/python{py_version_short}/site-packages +platlib = {userbase}/lib/python{py_version_short}/site-packages +include = {userbase}/include/python{py_version_short} +scripts = {userbase}/bin +data = {userbase} + +[nt_user] +stdlib = {userbase}/Python{py_version_nodot} +platstdlib = {userbase}/Python{py_version_nodot} +purelib = {userbase}/Python{py_version_nodot}/site-packages +platlib = {userbase}/Python{py_version_nodot}/site-packages +include = {userbase}/Python{py_version_nodot}/Include +scripts = {userbase}/Scripts +data = {userbase} + +[posix_user] +stdlib = {userbase}/lib/python{py_version_short} +platstdlib = {userbase}/lib/python{py_version_short} +purelib = {userbase}/lib/python{py_version_short}/site-packages +platlib = {userbase}/lib/python{py_version_short}/site-packages +include = {userbase}/include/python{py_version_short} +scripts = {userbase}/bin +data = {userbase} + +[osx_framework_user] +stdlib = {userbase}/lib/python +platstdlib = {userbase}/lib/python +purelib = {userbase}/lib/python/site-packages +platlib = {userbase}/lib/python/site-packages +include = {userbase}/include +scripts = {userbase}/bin +data = {userbase} diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/sysconfig 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/sysconfig 2.py new file mode 100644 index 0000000..b470a37 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/sysconfig 2.py @@ -0,0 +1,786 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2012 The Python Software Foundation. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +"""Access to Python's configuration information.""" + +import codecs +import os +import re +import sys +from os.path import pardir, realpath +try: + import configparser +except ImportError: + import ConfigParser as configparser + + +__all__ = [ + 'get_config_h_filename', + 'get_config_var', + 'get_config_vars', + 'get_makefile_filename', + 'get_path', + 'get_path_names', + 'get_paths', + 'get_platform', + 'get_python_version', + 'get_scheme_names', + 'parse_config_h', +] + + +def _safe_realpath(path): + try: + return realpath(path) + except OSError: + return path + + +if sys.executable: + _PROJECT_BASE = os.path.dirname(_safe_realpath(sys.executable)) +else: + # sys.executable can be empty if argv[0] has been changed and Python is + # unable to retrieve the real program name + _PROJECT_BASE = _safe_realpath(os.getcwd()) + +if os.name == "nt" and "pcbuild" in _PROJECT_BASE[-8:].lower(): + _PROJECT_BASE = _safe_realpath(os.path.join(_PROJECT_BASE, pardir)) +# PC/VS7.1 +if os.name == "nt" and "\\pc\\v" in _PROJECT_BASE[-10:].lower(): + _PROJECT_BASE = _safe_realpath(os.path.join(_PROJECT_BASE, pardir, pardir)) +# PC/AMD64 +if os.name == "nt" and "\\pcbuild\\amd64" in _PROJECT_BASE[-14:].lower(): + _PROJECT_BASE = _safe_realpath(os.path.join(_PROJECT_BASE, pardir, pardir)) + + +def is_python_build(): + for fn in ("Setup.dist", "Setup.local"): + if os.path.isfile(os.path.join(_PROJECT_BASE, "Modules", fn)): + return True + return False + +_PYTHON_BUILD = is_python_build() + +_cfg_read = False + +def _ensure_cfg_read(): + global _cfg_read + if not _cfg_read: + from ..resources import finder + backport_package = __name__.rsplit('.', 1)[0] + _finder = finder(backport_package) + _cfgfile = _finder.find('sysconfig.cfg') + assert _cfgfile, 'sysconfig.cfg exists' + with _cfgfile.as_stream() as s: + _SCHEMES.readfp(s) + if _PYTHON_BUILD: + for scheme in ('posix_prefix', 'posix_home'): + _SCHEMES.set(scheme, 'include', '{srcdir}/Include') + _SCHEMES.set(scheme, 'platinclude', '{projectbase}/.') + + _cfg_read = True + + +_SCHEMES = configparser.RawConfigParser() +_VAR_REPL = re.compile(r'\{([^{]*?)\}') + +def _expand_globals(config): + _ensure_cfg_read() + if config.has_section('globals'): + globals = config.items('globals') + else: + globals = tuple() + + sections = config.sections() + for section in sections: + if section == 'globals': + continue + for option, value in globals: + if config.has_option(section, option): + continue + config.set(section, option, value) + config.remove_section('globals') + + # now expanding local variables defined in the cfg file + # + for section in config.sections(): + variables = dict(config.items(section)) + + def _replacer(matchobj): + name = matchobj.group(1) + if name in variables: + return variables[name] + return matchobj.group(0) + + for option, value in config.items(section): + config.set(section, option, _VAR_REPL.sub(_replacer, value)) + +#_expand_globals(_SCHEMES) + +_PY_VERSION = '%s.%s.%s' % sys.version_info[:3] +_PY_VERSION_SHORT = '%s.%s' % sys.version_info[:2] +_PY_VERSION_SHORT_NO_DOT = '%s%s' % sys.version_info[:2] +_PREFIX = os.path.normpath(sys.prefix) +_EXEC_PREFIX = os.path.normpath(sys.exec_prefix) +_CONFIG_VARS = None +_USER_BASE = None + + +def _subst_vars(path, local_vars): + """In the string `path`, replace tokens like {some.thing} with the + corresponding value from the map `local_vars`. + + If there is no corresponding value, leave the token unchanged. + """ + def _replacer(matchobj): + name = matchobj.group(1) + if name in local_vars: + return local_vars[name] + elif name in os.environ: + return os.environ[name] + return matchobj.group(0) + return _VAR_REPL.sub(_replacer, path) + + +def _extend_dict(target_dict, other_dict): + target_keys = target_dict.keys() + for key, value in other_dict.items(): + if key in target_keys: + continue + target_dict[key] = value + + +def _expand_vars(scheme, vars): + res = {} + if vars is None: + vars = {} + _extend_dict(vars, get_config_vars()) + + for key, value in _SCHEMES.items(scheme): + if os.name in ('posix', 'nt'): + value = os.path.expanduser(value) + res[key] = os.path.normpath(_subst_vars(value, vars)) + return res + + +def format_value(value, vars): + def _replacer(matchobj): + name = matchobj.group(1) + if name in vars: + return vars[name] + return matchobj.group(0) + return _VAR_REPL.sub(_replacer, value) + + +def _get_default_scheme(): + if os.name == 'posix': + # the default scheme for posix is posix_prefix + return 'posix_prefix' + return os.name + + +def _getuserbase(): + env_base = os.environ.get("PYTHONUSERBASE", None) + + def joinuser(*args): + return os.path.expanduser(os.path.join(*args)) + + # what about 'os2emx', 'riscos' ? + if os.name == "nt": + base = os.environ.get("APPDATA") or "~" + if env_base: + return env_base + else: + return joinuser(base, "Python") + + if sys.platform == "darwin": + framework = get_config_var("PYTHONFRAMEWORK") + if framework: + if env_base: + return env_base + else: + return joinuser("~", "Library", framework, "%d.%d" % + sys.version_info[:2]) + + if env_base: + return env_base + else: + return joinuser("~", ".local") + + +def _parse_makefile(filename, vars=None): + """Parse a Makefile-style file. + + A dictionary containing name/value pairs is returned. If an + optional dictionary is passed in as the second argument, it is + used instead of a new dictionary. + """ + # Regexes needed for parsing Makefile (and similar syntaxes, + # like old-style Setup files). + _variable_rx = re.compile(r"([a-zA-Z][a-zA-Z0-9_]+)\s*=\s*(.*)") + _findvar1_rx = re.compile(r"\$\(([A-Za-z][A-Za-z0-9_]*)\)") + _findvar2_rx = re.compile(r"\${([A-Za-z][A-Za-z0-9_]*)}") + + if vars is None: + vars = {} + done = {} + notdone = {} + + with codecs.open(filename, encoding='utf-8', errors="surrogateescape") as f: + lines = f.readlines() + + for line in lines: + if line.startswith('#') or line.strip() == '': + continue + m = _variable_rx.match(line) + if m: + n, v = m.group(1, 2) + v = v.strip() + # `$$' is a literal `$' in make + tmpv = v.replace('$$', '') + + if "$" in tmpv: + notdone[n] = v + else: + try: + v = int(v) + except ValueError: + # insert literal `$' + done[n] = v.replace('$$', '$') + else: + done[n] = v + + # do variable interpolation here + variables = list(notdone.keys()) + + # Variables with a 'PY_' prefix in the makefile. These need to + # be made available without that prefix through sysconfig. + # Special care is needed to ensure that variable expansion works, even + # if the expansion uses the name without a prefix. + renamed_variables = ('CFLAGS', 'LDFLAGS', 'CPPFLAGS') + + while len(variables) > 0: + for name in tuple(variables): + value = notdone[name] + m = _findvar1_rx.search(value) or _findvar2_rx.search(value) + if m is not None: + n = m.group(1) + found = True + if n in done: + item = str(done[n]) + elif n in notdone: + # get it on a subsequent round + found = False + elif n in os.environ: + # do it like make: fall back to environment + item = os.environ[n] + + elif n in renamed_variables: + if (name.startswith('PY_') and + name[3:] in renamed_variables): + item = "" + + elif 'PY_' + n in notdone: + found = False + + else: + item = str(done['PY_' + n]) + + else: + done[n] = item = "" + + if found: + after = value[m.end():] + value = value[:m.start()] + item + after + if "$" in after: + notdone[name] = value + else: + try: + value = int(value) + except ValueError: + done[name] = value.strip() + else: + done[name] = value + variables.remove(name) + + if (name.startswith('PY_') and + name[3:] in renamed_variables): + + name = name[3:] + if name not in done: + done[name] = value + + else: + # bogus variable reference (e.g. "prefix=$/opt/python"); + # just drop it since we can't deal + done[name] = value + variables.remove(name) + + # strip spurious spaces + for k, v in done.items(): + if isinstance(v, str): + done[k] = v.strip() + + # save the results in the global dictionary + vars.update(done) + return vars + + +def get_makefile_filename(): + """Return the path of the Makefile.""" + if _PYTHON_BUILD: + return os.path.join(_PROJECT_BASE, "Makefile") + if hasattr(sys, 'abiflags'): + config_dir_name = 'config-%s%s' % (_PY_VERSION_SHORT, sys.abiflags) + else: + config_dir_name = 'config' + return os.path.join(get_path('stdlib'), config_dir_name, 'Makefile') + + +def _init_posix(vars): + """Initialize the module as appropriate for POSIX systems.""" + # load the installed Makefile: + makefile = get_makefile_filename() + try: + _parse_makefile(makefile, vars) + except IOError as e: + msg = "invalid Python installation: unable to open %s" % makefile + if hasattr(e, "strerror"): + msg = msg + " (%s)" % e.strerror + raise IOError(msg) + # load the installed pyconfig.h: + config_h = get_config_h_filename() + try: + with open(config_h) as f: + parse_config_h(f, vars) + except IOError as e: + msg = "invalid Python installation: unable to open %s" % config_h + if hasattr(e, "strerror"): + msg = msg + " (%s)" % e.strerror + raise IOError(msg) + # On AIX, there are wrong paths to the linker scripts in the Makefile + # -- these paths are relative to the Python source, but when installed + # the scripts are in another directory. + if _PYTHON_BUILD: + vars['LDSHARED'] = vars['BLDSHARED'] + + +def _init_non_posix(vars): + """Initialize the module as appropriate for NT""" + # set basic install directories + vars['LIBDEST'] = get_path('stdlib') + vars['BINLIBDEST'] = get_path('platstdlib') + vars['INCLUDEPY'] = get_path('include') + vars['SO'] = '.pyd' + vars['EXE'] = '.exe' + vars['VERSION'] = _PY_VERSION_SHORT_NO_DOT + vars['BINDIR'] = os.path.dirname(_safe_realpath(sys.executable)) + +# +# public APIs +# + + +def parse_config_h(fp, vars=None): + """Parse a config.h-style file. + + A dictionary containing name/value pairs is returned. If an + optional dictionary is passed in as the second argument, it is + used instead of a new dictionary. + """ + if vars is None: + vars = {} + define_rx = re.compile("#define ([A-Z][A-Za-z0-9_]+) (.*)\n") + undef_rx = re.compile("/[*] #undef ([A-Z][A-Za-z0-9_]+) [*]/\n") + + while True: + line = fp.readline() + if not line: + break + m = define_rx.match(line) + if m: + n, v = m.group(1, 2) + try: + v = int(v) + except ValueError: + pass + vars[n] = v + else: + m = undef_rx.match(line) + if m: + vars[m.group(1)] = 0 + return vars + + +def get_config_h_filename(): + """Return the path of pyconfig.h.""" + if _PYTHON_BUILD: + if os.name == "nt": + inc_dir = os.path.join(_PROJECT_BASE, "PC") + else: + inc_dir = _PROJECT_BASE + else: + inc_dir = get_path('platinclude') + return os.path.join(inc_dir, 'pyconfig.h') + + +def get_scheme_names(): + """Return a tuple containing the schemes names.""" + return tuple(sorted(_SCHEMES.sections())) + + +def get_path_names(): + """Return a tuple containing the paths names.""" + # xxx see if we want a static list + return _SCHEMES.options('posix_prefix') + + +def get_paths(scheme=_get_default_scheme(), vars=None, expand=True): + """Return a mapping containing an install scheme. + + ``scheme`` is the install scheme name. If not provided, it will + return the default scheme for the current platform. + """ + _ensure_cfg_read() + if expand: + return _expand_vars(scheme, vars) + else: + return dict(_SCHEMES.items(scheme)) + + +def get_path(name, scheme=_get_default_scheme(), vars=None, expand=True): + """Return a path corresponding to the scheme. + + ``scheme`` is the install scheme name. + """ + return get_paths(scheme, vars, expand)[name] + + +def get_config_vars(*args): + """With no arguments, return a dictionary of all configuration + variables relevant for the current platform. + + On Unix, this means every variable defined in Python's installed Makefile; + On Windows and Mac OS it's a much smaller set. + + With arguments, return a list of values that result from looking up + each argument in the configuration variable dictionary. + """ + global _CONFIG_VARS + if _CONFIG_VARS is None: + _CONFIG_VARS = {} + # Normalized versions of prefix and exec_prefix are handy to have; + # in fact, these are the standard versions used most places in the + # distutils2 module. + _CONFIG_VARS['prefix'] = _PREFIX + _CONFIG_VARS['exec_prefix'] = _EXEC_PREFIX + _CONFIG_VARS['py_version'] = _PY_VERSION + _CONFIG_VARS['py_version_short'] = _PY_VERSION_SHORT + _CONFIG_VARS['py_version_nodot'] = _PY_VERSION[0] + _PY_VERSION[2] + _CONFIG_VARS['base'] = _PREFIX + _CONFIG_VARS['platbase'] = _EXEC_PREFIX + _CONFIG_VARS['projectbase'] = _PROJECT_BASE + try: + _CONFIG_VARS['abiflags'] = sys.abiflags + except AttributeError: + # sys.abiflags may not be defined on all platforms. + _CONFIG_VARS['abiflags'] = '' + + if os.name in ('nt', 'os2'): + _init_non_posix(_CONFIG_VARS) + if os.name == 'posix': + _init_posix(_CONFIG_VARS) + # Setting 'userbase' is done below the call to the + # init function to enable using 'get_config_var' in + # the init-function. + if sys.version >= '2.6': + _CONFIG_VARS['userbase'] = _getuserbase() + + if 'srcdir' not in _CONFIG_VARS: + _CONFIG_VARS['srcdir'] = _PROJECT_BASE + else: + _CONFIG_VARS['srcdir'] = _safe_realpath(_CONFIG_VARS['srcdir']) + + # Convert srcdir into an absolute path if it appears necessary. + # Normally it is relative to the build directory. However, during + # testing, for example, we might be running a non-installed python + # from a different directory. + if _PYTHON_BUILD and os.name == "posix": + base = _PROJECT_BASE + try: + cwd = os.getcwd() + except OSError: + cwd = None + if (not os.path.isabs(_CONFIG_VARS['srcdir']) and + base != cwd): + # srcdir is relative and we are not in the same directory + # as the executable. Assume executable is in the build + # directory and make srcdir absolute. + srcdir = os.path.join(base, _CONFIG_VARS['srcdir']) + _CONFIG_VARS['srcdir'] = os.path.normpath(srcdir) + + if sys.platform == 'darwin': + kernel_version = os.uname()[2] # Kernel version (8.4.3) + major_version = int(kernel_version.split('.')[0]) + + if major_version < 8: + # On Mac OS X before 10.4, check if -arch and -isysroot + # are in CFLAGS or LDFLAGS and remove them if they are. + # This is needed when building extensions on a 10.3 system + # using a universal build of python. + for key in ('LDFLAGS', 'BASECFLAGS', + # a number of derived variables. These need to be + # patched up as well. + 'CFLAGS', 'PY_CFLAGS', 'BLDSHARED'): + flags = _CONFIG_VARS[key] + flags = re.sub(r'-arch\s+\w+\s', ' ', flags) + flags = re.sub('-isysroot [^ \t]*', ' ', flags) + _CONFIG_VARS[key] = flags + else: + # Allow the user to override the architecture flags using + # an environment variable. + # NOTE: This name was introduced by Apple in OSX 10.5 and + # is used by several scripting languages distributed with + # that OS release. + if 'ARCHFLAGS' in os.environ: + arch = os.environ['ARCHFLAGS'] + for key in ('LDFLAGS', 'BASECFLAGS', + # a number of derived variables. These need to be + # patched up as well. + 'CFLAGS', 'PY_CFLAGS', 'BLDSHARED'): + + flags = _CONFIG_VARS[key] + flags = re.sub(r'-arch\s+\w+\s', ' ', flags) + flags = flags + ' ' + arch + _CONFIG_VARS[key] = flags + + # If we're on OSX 10.5 or later and the user tries to + # compiles an extension using an SDK that is not present + # on the current machine it is better to not use an SDK + # than to fail. + # + # The major usecase for this is users using a Python.org + # binary installer on OSX 10.6: that installer uses + # the 10.4u SDK, but that SDK is not installed by default + # when you install Xcode. + # + CFLAGS = _CONFIG_VARS.get('CFLAGS', '') + m = re.search(r'-isysroot\s+(\S+)', CFLAGS) + if m is not None: + sdk = m.group(1) + if not os.path.exists(sdk): + for key in ('LDFLAGS', 'BASECFLAGS', + # a number of derived variables. These need to be + # patched up as well. + 'CFLAGS', 'PY_CFLAGS', 'BLDSHARED'): + + flags = _CONFIG_VARS[key] + flags = re.sub(r'-isysroot\s+\S+(\s|$)', ' ', flags) + _CONFIG_VARS[key] = flags + + if args: + vals = [] + for name in args: + vals.append(_CONFIG_VARS.get(name)) + return vals + else: + return _CONFIG_VARS + + +def get_config_var(name): + """Return the value of a single variable using the dictionary returned by + 'get_config_vars()'. + + Equivalent to get_config_vars().get(name) + """ + return get_config_vars().get(name) + + +def get_platform(): + """Return a string that identifies the current platform. + + This is used mainly to distinguish platform-specific build directories and + platform-specific built distributions. Typically includes the OS name + and version and the architecture (as supplied by 'os.uname()'), + although the exact information included depends on the OS; eg. for IRIX + the architecture isn't particularly important (IRIX only runs on SGI + hardware), but for Linux the kernel version isn't particularly + important. + + Examples of returned values: + linux-i586 + linux-alpha (?) + solaris-2.6-sun4u + irix-5.3 + irix64-6.2 + + Windows will return one of: + win-amd64 (64bit Windows on AMD64 (aka x86_64, Intel64, EM64T, etc) + win-ia64 (64bit Windows on Itanium) + win32 (all others - specifically, sys.platform is returned) + + For other non-POSIX platforms, currently just returns 'sys.platform'. + """ + if os.name == 'nt': + # sniff sys.version for architecture. + prefix = " bit (" + i = sys.version.find(prefix) + if i == -1: + return sys.platform + j = sys.version.find(")", i) + look = sys.version[i+len(prefix):j].lower() + if look == 'amd64': + return 'win-amd64' + if look == 'itanium': + return 'win-ia64' + return sys.platform + + if os.name != "posix" or not hasattr(os, 'uname'): + # XXX what about the architecture? NT is Intel or Alpha, + # Mac OS is M68k or PPC, etc. + return sys.platform + + # Try to distinguish various flavours of Unix + osname, host, release, version, machine = os.uname() + + # Convert the OS name to lowercase, remove '/' characters + # (to accommodate BSD/OS), and translate spaces (for "Power Macintosh") + osname = osname.lower().replace('/', '') + machine = machine.replace(' ', '_') + machine = machine.replace('/', '-') + + if osname[:5] == "linux": + # At least on Linux/Intel, 'machine' is the processor -- + # i386, etc. + # XXX what about Alpha, SPARC, etc? + return "%s-%s" % (osname, machine) + elif osname[:5] == "sunos": + if release[0] >= "5": # SunOS 5 == Solaris 2 + osname = "solaris" + release = "%d.%s" % (int(release[0]) - 3, release[2:]) + # fall through to standard osname-release-machine representation + elif osname[:4] == "irix": # could be "irix64"! + return "%s-%s" % (osname, release) + elif osname[:3] == "aix": + return "%s-%s.%s" % (osname, version, release) + elif osname[:6] == "cygwin": + osname = "cygwin" + rel_re = re.compile(r'[\d.]+') + m = rel_re.match(release) + if m: + release = m.group() + elif osname[:6] == "darwin": + # + # For our purposes, we'll assume that the system version from + # distutils' perspective is what MACOSX_DEPLOYMENT_TARGET is set + # to. This makes the compatibility story a bit more sane because the + # machine is going to compile and link as if it were + # MACOSX_DEPLOYMENT_TARGET. + cfgvars = get_config_vars() + macver = cfgvars.get('MACOSX_DEPLOYMENT_TARGET') + + if True: + # Always calculate the release of the running machine, + # needed to determine if we can build fat binaries or not. + + macrelease = macver + # Get the system version. Reading this plist is a documented + # way to get the system version (see the documentation for + # the Gestalt Manager) + try: + f = open('/System/Library/CoreServices/SystemVersion.plist') + except IOError: + # We're on a plain darwin box, fall back to the default + # behaviour. + pass + else: + try: + m = re.search(r'ProductUserVisibleVersion\s*' + r'(.*?)', f.read()) + finally: + f.close() + if m is not None: + macrelease = '.'.join(m.group(1).split('.')[:2]) + # else: fall back to the default behaviour + + if not macver: + macver = macrelease + + if macver: + release = macver + osname = "macosx" + + if ((macrelease + '.') >= '10.4.' and + '-arch' in get_config_vars().get('CFLAGS', '').strip()): + # The universal build will build fat binaries, but not on + # systems before 10.4 + # + # Try to detect 4-way universal builds, those have machine-type + # 'universal' instead of 'fat'. + + machine = 'fat' + cflags = get_config_vars().get('CFLAGS') + + archs = re.findall(r'-arch\s+(\S+)', cflags) + archs = tuple(sorted(set(archs))) + + if len(archs) == 1: + machine = archs[0] + elif archs == ('i386', 'ppc'): + machine = 'fat' + elif archs == ('i386', 'x86_64'): + machine = 'intel' + elif archs == ('i386', 'ppc', 'x86_64'): + machine = 'fat3' + elif archs == ('ppc64', 'x86_64'): + machine = 'fat64' + elif archs == ('i386', 'ppc', 'ppc64', 'x86_64'): + machine = 'universal' + else: + raise ValueError( + "Don't know machine value for archs=%r" % (archs,)) + + elif machine == 'i386': + # On OSX the machine type returned by uname is always the + # 32-bit variant, even if the executable architecture is + # the 64-bit variant + if sys.maxsize >= 2**32: + machine = 'x86_64' + + elif machine in ('PowerPC', 'Power_Macintosh'): + # Pick a sane name for the PPC architecture. + # See 'i386' case + if sys.maxsize >= 2**32: + machine = 'ppc64' + else: + machine = 'ppc' + + return "%s-%s-%s" % (osname, release, machine) + + +def get_python_version(): + return _PY_VERSION_SHORT + + +def _print_dict(title, data): + for index, (key, value) in enumerate(sorted(data.items())): + if index == 0: + print('%s: ' % (title)) + print('\t%s = "%s"' % (key, value)) + + +def _main(): + """Display all information sysconfig detains.""" + print('Platform: "%s"' % get_platform()) + print('Python version: "%s"' % get_python_version()) + print('Current installation scheme: "%s"' % _get_default_scheme()) + print() + _print_dict('Paths', get_paths()) + print() + _print_dict('Variables', get_config_vars()) + + +if __name__ == '__main__': + _main() diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/sysconfig 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/sysconfig 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3c4af31e44f2a6d0c01079d108632bb367f84200 GIT binary patch literal 22282 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 0: + for name in tuple(variables): + value = notdone[name] + m = _findvar1_rx.search(value) or _findvar2_rx.search(value) + if m is not None: + n = m.group(1) + found = True + if n in done: + item = str(done[n]) + elif n in notdone: + # get it on a subsequent round + found = False + elif n in os.environ: + # do it like make: fall back to environment + item = os.environ[n] + + elif n in renamed_variables: + if (name.startswith('PY_') and + name[3:] in renamed_variables): + item = "" + + elif 'PY_' + n in notdone: + found = False + + else: + item = str(done['PY_' + n]) + + else: + done[n] = item = "" + + if found: + after = value[m.end():] + value = value[:m.start()] + item + after + if "$" in after: + notdone[name] = value + else: + try: + value = int(value) + except ValueError: + done[name] = value.strip() + else: + done[name] = value + variables.remove(name) + + if (name.startswith('PY_') and + name[3:] in renamed_variables): + + name = name[3:] + if name not in done: + done[name] = value + + else: + # bogus variable reference (e.g. "prefix=$/opt/python"); + # just drop it since we can't deal + done[name] = value + variables.remove(name) + + # strip spurious spaces + for k, v in done.items(): + if isinstance(v, str): + done[k] = v.strip() + + # save the results in the global dictionary + vars.update(done) + return vars + + +def get_makefile_filename(): + """Return the path of the Makefile.""" + if _PYTHON_BUILD: + return os.path.join(_PROJECT_BASE, "Makefile") + if hasattr(sys, 'abiflags'): + config_dir_name = 'config-%s%s' % (_PY_VERSION_SHORT, sys.abiflags) + else: + config_dir_name = 'config' + return os.path.join(get_path('stdlib'), config_dir_name, 'Makefile') + + +def _init_posix(vars): + """Initialize the module as appropriate for POSIX systems.""" + # load the installed Makefile: + makefile = get_makefile_filename() + try: + _parse_makefile(makefile, vars) + except IOError as e: + msg = "invalid Python installation: unable to open %s" % makefile + if hasattr(e, "strerror"): + msg = msg + " (%s)" % e.strerror + raise IOError(msg) + # load the installed pyconfig.h: + config_h = get_config_h_filename() + try: + with open(config_h) as f: + parse_config_h(f, vars) + except IOError as e: + msg = "invalid Python installation: unable to open %s" % config_h + if hasattr(e, "strerror"): + msg = msg + " (%s)" % e.strerror + raise IOError(msg) + # On AIX, there are wrong paths to the linker scripts in the Makefile + # -- these paths are relative to the Python source, but when installed + # the scripts are in another directory. + if _PYTHON_BUILD: + vars['LDSHARED'] = vars['BLDSHARED'] + + +def _init_non_posix(vars): + """Initialize the module as appropriate for NT""" + # set basic install directories + vars['LIBDEST'] = get_path('stdlib') + vars['BINLIBDEST'] = get_path('platstdlib') + vars['INCLUDEPY'] = get_path('include') + vars['SO'] = '.pyd' + vars['EXE'] = '.exe' + vars['VERSION'] = _PY_VERSION_SHORT_NO_DOT + vars['BINDIR'] = os.path.dirname(_safe_realpath(sys.executable)) + +# +# public APIs +# + + +def parse_config_h(fp, vars=None): + """Parse a config.h-style file. + + A dictionary containing name/value pairs is returned. If an + optional dictionary is passed in as the second argument, it is + used instead of a new dictionary. + """ + if vars is None: + vars = {} + define_rx = re.compile("#define ([A-Z][A-Za-z0-9_]+) (.*)\n") + undef_rx = re.compile("/[*] #undef ([A-Z][A-Za-z0-9_]+) [*]/\n") + + while True: + line = fp.readline() + if not line: + break + m = define_rx.match(line) + if m: + n, v = m.group(1, 2) + try: + v = int(v) + except ValueError: + pass + vars[n] = v + else: + m = undef_rx.match(line) + if m: + vars[m.group(1)] = 0 + return vars + + +def get_config_h_filename(): + """Return the path of pyconfig.h.""" + if _PYTHON_BUILD: + if os.name == "nt": + inc_dir = os.path.join(_PROJECT_BASE, "PC") + else: + inc_dir = _PROJECT_BASE + else: + inc_dir = get_path('platinclude') + return os.path.join(inc_dir, 'pyconfig.h') + + +def get_scheme_names(): + """Return a tuple containing the schemes names.""" + return tuple(sorted(_SCHEMES.sections())) + + +def get_path_names(): + """Return a tuple containing the paths names.""" + # xxx see if we want a static list + return _SCHEMES.options('posix_prefix') + + +def get_paths(scheme=_get_default_scheme(), vars=None, expand=True): + """Return a mapping containing an install scheme. + + ``scheme`` is the install scheme name. If not provided, it will + return the default scheme for the current platform. + """ + _ensure_cfg_read() + if expand: + return _expand_vars(scheme, vars) + else: + return dict(_SCHEMES.items(scheme)) + + +def get_path(name, scheme=_get_default_scheme(), vars=None, expand=True): + """Return a path corresponding to the scheme. + + ``scheme`` is the install scheme name. + """ + return get_paths(scheme, vars, expand)[name] + + +def get_config_vars(*args): + """With no arguments, return a dictionary of all configuration + variables relevant for the current platform. + + On Unix, this means every variable defined in Python's installed Makefile; + On Windows and Mac OS it's a much smaller set. + + With arguments, return a list of values that result from looking up + each argument in the configuration variable dictionary. + """ + global _CONFIG_VARS + if _CONFIG_VARS is None: + _CONFIG_VARS = {} + # Normalized versions of prefix and exec_prefix are handy to have; + # in fact, these are the standard versions used most places in the + # distutils2 module. + _CONFIG_VARS['prefix'] = _PREFIX + _CONFIG_VARS['exec_prefix'] = _EXEC_PREFIX + _CONFIG_VARS['py_version'] = _PY_VERSION + _CONFIG_VARS['py_version_short'] = _PY_VERSION_SHORT + _CONFIG_VARS['py_version_nodot'] = _PY_VERSION[0] + _PY_VERSION[2] + _CONFIG_VARS['base'] = _PREFIX + _CONFIG_VARS['platbase'] = _EXEC_PREFIX + _CONFIG_VARS['projectbase'] = _PROJECT_BASE + try: + _CONFIG_VARS['abiflags'] = sys.abiflags + except AttributeError: + # sys.abiflags may not be defined on all platforms. + _CONFIG_VARS['abiflags'] = '' + + if os.name in ('nt', 'os2'): + _init_non_posix(_CONFIG_VARS) + if os.name == 'posix': + _init_posix(_CONFIG_VARS) + # Setting 'userbase' is done below the call to the + # init function to enable using 'get_config_var' in + # the init-function. + if sys.version >= '2.6': + _CONFIG_VARS['userbase'] = _getuserbase() + + if 'srcdir' not in _CONFIG_VARS: + _CONFIG_VARS['srcdir'] = _PROJECT_BASE + else: + _CONFIG_VARS['srcdir'] = _safe_realpath(_CONFIG_VARS['srcdir']) + + # Convert srcdir into an absolute path if it appears necessary. + # Normally it is relative to the build directory. However, during + # testing, for example, we might be running a non-installed python + # from a different directory. + if _PYTHON_BUILD and os.name == "posix": + base = _PROJECT_BASE + try: + cwd = os.getcwd() + except OSError: + cwd = None + if (not os.path.isabs(_CONFIG_VARS['srcdir']) and + base != cwd): + # srcdir is relative and we are not in the same directory + # as the executable. Assume executable is in the build + # directory and make srcdir absolute. + srcdir = os.path.join(base, _CONFIG_VARS['srcdir']) + _CONFIG_VARS['srcdir'] = os.path.normpath(srcdir) + + if sys.platform == 'darwin': + kernel_version = os.uname()[2] # Kernel version (8.4.3) + major_version = int(kernel_version.split('.')[0]) + + if major_version < 8: + # On Mac OS X before 10.4, check if -arch and -isysroot + # are in CFLAGS or LDFLAGS and remove them if they are. + # This is needed when building extensions on a 10.3 system + # using a universal build of python. + for key in ('LDFLAGS', 'BASECFLAGS', + # a number of derived variables. These need to be + # patched up as well. + 'CFLAGS', 'PY_CFLAGS', 'BLDSHARED'): + flags = _CONFIG_VARS[key] + flags = re.sub(r'-arch\s+\w+\s', ' ', flags) + flags = re.sub('-isysroot [^ \t]*', ' ', flags) + _CONFIG_VARS[key] = flags + else: + # Allow the user to override the architecture flags using + # an environment variable. + # NOTE: This name was introduced by Apple in OSX 10.5 and + # is used by several scripting languages distributed with + # that OS release. + if 'ARCHFLAGS' in os.environ: + arch = os.environ['ARCHFLAGS'] + for key in ('LDFLAGS', 'BASECFLAGS', + # a number of derived variables. These need to be + # patched up as well. + 'CFLAGS', 'PY_CFLAGS', 'BLDSHARED'): + + flags = _CONFIG_VARS[key] + flags = re.sub(r'-arch\s+\w+\s', ' ', flags) + flags = flags + ' ' + arch + _CONFIG_VARS[key] = flags + + # If we're on OSX 10.5 or later and the user tries to + # compiles an extension using an SDK that is not present + # on the current machine it is better to not use an SDK + # than to fail. + # + # The major usecase for this is users using a Python.org + # binary installer on OSX 10.6: that installer uses + # the 10.4u SDK, but that SDK is not installed by default + # when you install Xcode. + # + CFLAGS = _CONFIG_VARS.get('CFLAGS', '') + m = re.search(r'-isysroot\s+(\S+)', CFLAGS) + if m is not None: + sdk = m.group(1) + if not os.path.exists(sdk): + for key in ('LDFLAGS', 'BASECFLAGS', + # a number of derived variables. These need to be + # patched up as well. + 'CFLAGS', 'PY_CFLAGS', 'BLDSHARED'): + + flags = _CONFIG_VARS[key] + flags = re.sub(r'-isysroot\s+\S+(\s|$)', ' ', flags) + _CONFIG_VARS[key] = flags + + if args: + vals = [] + for name in args: + vals.append(_CONFIG_VARS.get(name)) + return vals + else: + return _CONFIG_VARS + + +def get_config_var(name): + """Return the value of a single variable using the dictionary returned by + 'get_config_vars()'. + + Equivalent to get_config_vars().get(name) + """ + return get_config_vars().get(name) + + +def get_platform(): + """Return a string that identifies the current platform. + + This is used mainly to distinguish platform-specific build directories and + platform-specific built distributions. Typically includes the OS name + and version and the architecture (as supplied by 'os.uname()'), + although the exact information included depends on the OS; eg. for IRIX + the architecture isn't particularly important (IRIX only runs on SGI + hardware), but for Linux the kernel version isn't particularly + important. + + Examples of returned values: + linux-i586 + linux-alpha (?) + solaris-2.6-sun4u + irix-5.3 + irix64-6.2 + + Windows will return one of: + win-amd64 (64bit Windows on AMD64 (aka x86_64, Intel64, EM64T, etc) + win-ia64 (64bit Windows on Itanium) + win32 (all others - specifically, sys.platform is returned) + + For other non-POSIX platforms, currently just returns 'sys.platform'. + """ + if os.name == 'nt': + # sniff sys.version for architecture. + prefix = " bit (" + i = sys.version.find(prefix) + if i == -1: + return sys.platform + j = sys.version.find(")", i) + look = sys.version[i+len(prefix):j].lower() + if look == 'amd64': + return 'win-amd64' + if look == 'itanium': + return 'win-ia64' + return sys.platform + + if os.name != "posix" or not hasattr(os, 'uname'): + # XXX what about the architecture? NT is Intel or Alpha, + # Mac OS is M68k or PPC, etc. + return sys.platform + + # Try to distinguish various flavours of Unix + osname, host, release, version, machine = os.uname() + + # Convert the OS name to lowercase, remove '/' characters + # (to accommodate BSD/OS), and translate spaces (for "Power Macintosh") + osname = osname.lower().replace('/', '') + machine = machine.replace(' ', '_') + machine = machine.replace('/', '-') + + if osname[:5] == "linux": + # At least on Linux/Intel, 'machine' is the processor -- + # i386, etc. + # XXX what about Alpha, SPARC, etc? + return "%s-%s" % (osname, machine) + elif osname[:5] == "sunos": + if release[0] >= "5": # SunOS 5 == Solaris 2 + osname = "solaris" + release = "%d.%s" % (int(release[0]) - 3, release[2:]) + # fall through to standard osname-release-machine representation + elif osname[:4] == "irix": # could be "irix64"! + return "%s-%s" % (osname, release) + elif osname[:3] == "aix": + return "%s-%s.%s" % (osname, version, release) + elif osname[:6] == "cygwin": + osname = "cygwin" + rel_re = re.compile(r'[\d.]+') + m = rel_re.match(release) + if m: + release = m.group() + elif osname[:6] == "darwin": + # + # For our purposes, we'll assume that the system version from + # distutils' perspective is what MACOSX_DEPLOYMENT_TARGET is set + # to. This makes the compatibility story a bit more sane because the + # machine is going to compile and link as if it were + # MACOSX_DEPLOYMENT_TARGET. + cfgvars = get_config_vars() + macver = cfgvars.get('MACOSX_DEPLOYMENT_TARGET') + + if True: + # Always calculate the release of the running machine, + # needed to determine if we can build fat binaries or not. + + macrelease = macver + # Get the system version. Reading this plist is a documented + # way to get the system version (see the documentation for + # the Gestalt Manager) + try: + f = open('/System/Library/CoreServices/SystemVersion.plist') + except IOError: + # We're on a plain darwin box, fall back to the default + # behaviour. + pass + else: + try: + m = re.search(r'ProductUserVisibleVersion\s*' + r'(.*?)', f.read()) + finally: + f.close() + if m is not None: + macrelease = '.'.join(m.group(1).split('.')[:2]) + # else: fall back to the default behaviour + + if not macver: + macver = macrelease + + if macver: + release = macver + osname = "macosx" + + if ((macrelease + '.') >= '10.4.' and + '-arch' in get_config_vars().get('CFLAGS', '').strip()): + # The universal build will build fat binaries, but not on + # systems before 10.4 + # + # Try to detect 4-way universal builds, those have machine-type + # 'universal' instead of 'fat'. + + machine = 'fat' + cflags = get_config_vars().get('CFLAGS') + + archs = re.findall(r'-arch\s+(\S+)', cflags) + archs = tuple(sorted(set(archs))) + + if len(archs) == 1: + machine = archs[0] + elif archs == ('i386', 'ppc'): + machine = 'fat' + elif archs == ('i386', 'x86_64'): + machine = 'intel' + elif archs == ('i386', 'ppc', 'x86_64'): + machine = 'fat3' + elif archs == ('ppc64', 'x86_64'): + machine = 'fat64' + elif archs == ('i386', 'ppc', 'ppc64', 'x86_64'): + machine = 'universal' + else: + raise ValueError( + "Don't know machine value for archs=%r" % (archs,)) + + elif machine == 'i386': + # On OSX the machine type returned by uname is always the + # 32-bit variant, even if the executable architecture is + # the 64-bit variant + if sys.maxsize >= 2**32: + machine = 'x86_64' + + elif machine in ('PowerPC', 'Power_Macintosh'): + # Pick a sane name for the PPC architecture. + # See 'i386' case + if sys.maxsize >= 2**32: + machine = 'ppc64' + else: + machine = 'ppc' + + return "%s-%s-%s" % (osname, release, machine) + + +def get_python_version(): + return _PY_VERSION_SHORT + + +def _print_dict(title, data): + for index, (key, value) in enumerate(sorted(data.items())): + if index == 0: + print('%s: ' % (title)) + print('\t%s = "%s"' % (key, value)) + + +def _main(): + """Display all information sysconfig detains.""" + print('Platform: "%s"' % get_platform()) + print('Python version: "%s"' % get_python_version()) + print('Current installation scheme: "%s"' % _get_default_scheme()) + print() + _print_dict('Paths', get_paths()) + print() + _print_dict('Variables', get_config_vars()) + + +if __name__ == '__main__': + _main() diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/sysconfig.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/sysconfig.pyc new file mode 100644 index 0000000000000000000000000000000000000000..86921e3e3893fb00d415c2933cc4debcdb34c993 GIT binary patch literal 22282 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 AA^-pY literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/tarfile 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/tarfile 2.py new file mode 100644 index 0000000..d66d856 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/tarfile 2.py @@ -0,0 +1,2607 @@ +#------------------------------------------------------------------- +# tarfile.py +#------------------------------------------------------------------- +# Copyright (C) 2002 Lars Gustaebel +# All rights reserved. +# +# Permission is hereby granted, free of charge, to any person +# obtaining a copy of this software and associated documentation +# files (the "Software"), to deal in the Software without +# restriction, including without limitation the rights to use, +# copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the +# Software is furnished to do so, subject to the following +# conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +# OTHER DEALINGS IN THE SOFTWARE. +# +from __future__ import print_function + +"""Read from and write to tar format archives. +""" + +__version__ = "$Revision$" + +version = "0.9.0" +__author__ = "Lars Gust\u00e4bel (lars@gustaebel.de)" +__date__ = "$Date: 2011-02-25 17:42:01 +0200 (Fri, 25 Feb 2011) $" +__cvsid__ = "$Id: tarfile.py 88586 2011-02-25 15:42:01Z marc-andre.lemburg $" +__credits__ = "Gustavo Niemeyer, Niels Gust\u00e4bel, Richard Townsend." + +#--------- +# Imports +#--------- +import sys +import os +import stat +import errno +import time +import struct +import copy +import re + +try: + import grp, pwd +except ImportError: + grp = pwd = None + +# os.symlink on Windows prior to 6.0 raises NotImplementedError +symlink_exception = (AttributeError, NotImplementedError) +try: + # WindowsError (1314) will be raised if the caller does not hold the + # SeCreateSymbolicLinkPrivilege privilege + symlink_exception += (WindowsError,) +except NameError: + pass + +# from tarfile import * +__all__ = ["TarFile", "TarInfo", "is_tarfile", "TarError"] + +if sys.version_info[0] < 3: + import __builtin__ as builtins +else: + import builtins + +_open = builtins.open # Since 'open' is TarFile.open + +#--------------------------------------------------------- +# tar constants +#--------------------------------------------------------- +NUL = b"\0" # the null character +BLOCKSIZE = 512 # length of processing blocks +RECORDSIZE = BLOCKSIZE * 20 # length of records +GNU_MAGIC = b"ustar \0" # magic gnu tar string +POSIX_MAGIC = b"ustar\x0000" # magic posix tar string + +LENGTH_NAME = 100 # maximum length of a filename +LENGTH_LINK = 100 # maximum length of a linkname +LENGTH_PREFIX = 155 # maximum length of the prefix field + +REGTYPE = b"0" # regular file +AREGTYPE = b"\0" # regular file +LNKTYPE = b"1" # link (inside tarfile) +SYMTYPE = b"2" # symbolic link +CHRTYPE = b"3" # character special device +BLKTYPE = b"4" # block special device +DIRTYPE = b"5" # directory +FIFOTYPE = b"6" # fifo special device +CONTTYPE = b"7" # contiguous file + +GNUTYPE_LONGNAME = b"L" # GNU tar longname +GNUTYPE_LONGLINK = b"K" # GNU tar longlink +GNUTYPE_SPARSE = b"S" # GNU tar sparse file + +XHDTYPE = b"x" # POSIX.1-2001 extended header +XGLTYPE = b"g" # POSIX.1-2001 global header +SOLARIS_XHDTYPE = b"X" # Solaris extended header + +USTAR_FORMAT = 0 # POSIX.1-1988 (ustar) format +GNU_FORMAT = 1 # GNU tar format +PAX_FORMAT = 2 # POSIX.1-2001 (pax) format +DEFAULT_FORMAT = GNU_FORMAT + +#--------------------------------------------------------- +# tarfile constants +#--------------------------------------------------------- +# File types that tarfile supports: +SUPPORTED_TYPES = (REGTYPE, AREGTYPE, LNKTYPE, + SYMTYPE, DIRTYPE, FIFOTYPE, + CONTTYPE, CHRTYPE, BLKTYPE, + GNUTYPE_LONGNAME, GNUTYPE_LONGLINK, + GNUTYPE_SPARSE) + +# File types that will be treated as a regular file. +REGULAR_TYPES = (REGTYPE, AREGTYPE, + CONTTYPE, GNUTYPE_SPARSE) + +# File types that are part of the GNU tar format. +GNU_TYPES = (GNUTYPE_LONGNAME, GNUTYPE_LONGLINK, + GNUTYPE_SPARSE) + +# Fields from a pax header that override a TarInfo attribute. +PAX_FIELDS = ("path", "linkpath", "size", "mtime", + "uid", "gid", "uname", "gname") + +# Fields from a pax header that are affected by hdrcharset. +PAX_NAME_FIELDS = set(("path", "linkpath", "uname", "gname")) + +# Fields in a pax header that are numbers, all other fields +# are treated as strings. +PAX_NUMBER_FIELDS = { + "atime": float, + "ctime": float, + "mtime": float, + "uid": int, + "gid": int, + "size": int +} + +#--------------------------------------------------------- +# Bits used in the mode field, values in octal. +#--------------------------------------------------------- +S_IFLNK = 0o120000 # symbolic link +S_IFREG = 0o100000 # regular file +S_IFBLK = 0o060000 # block device +S_IFDIR = 0o040000 # directory +S_IFCHR = 0o020000 # character device +S_IFIFO = 0o010000 # fifo + +TSUID = 0o4000 # set UID on execution +TSGID = 0o2000 # set GID on execution +TSVTX = 0o1000 # reserved + +TUREAD = 0o400 # read by owner +TUWRITE = 0o200 # write by owner +TUEXEC = 0o100 # execute/search by owner +TGREAD = 0o040 # read by group +TGWRITE = 0o020 # write by group +TGEXEC = 0o010 # execute/search by group +TOREAD = 0o004 # read by other +TOWRITE = 0o002 # write by other +TOEXEC = 0o001 # execute/search by other + +#--------------------------------------------------------- +# initialization +#--------------------------------------------------------- +if os.name in ("nt", "ce"): + ENCODING = "utf-8" +else: + ENCODING = sys.getfilesystemencoding() + +#--------------------------------------------------------- +# Some useful functions +#--------------------------------------------------------- + +def stn(s, length, encoding, errors): + """Convert a string to a null-terminated bytes object. + """ + s = s.encode(encoding, errors) + return s[:length] + (length - len(s)) * NUL + +def nts(s, encoding, errors): + """Convert a null-terminated bytes object to a string. + """ + p = s.find(b"\0") + if p != -1: + s = s[:p] + return s.decode(encoding, errors) + +def nti(s): + """Convert a number field to a python number. + """ + # There are two possible encodings for a number field, see + # itn() below. + if s[0] != chr(0o200): + try: + n = int(nts(s, "ascii", "strict") or "0", 8) + except ValueError: + raise InvalidHeaderError("invalid header") + else: + n = 0 + for i in range(len(s) - 1): + n <<= 8 + n += ord(s[i + 1]) + return n + +def itn(n, digits=8, format=DEFAULT_FORMAT): + """Convert a python number to a number field. + """ + # POSIX 1003.1-1988 requires numbers to be encoded as a string of + # octal digits followed by a null-byte, this allows values up to + # (8**(digits-1))-1. GNU tar allows storing numbers greater than + # that if necessary. A leading 0o200 byte indicates this particular + # encoding, the following digits-1 bytes are a big-endian + # representation. This allows values up to (256**(digits-1))-1. + if 0 <= n < 8 ** (digits - 1): + s = ("%0*o" % (digits - 1, n)).encode("ascii") + NUL + else: + if format != GNU_FORMAT or n >= 256 ** (digits - 1): + raise ValueError("overflow in number field") + + if n < 0: + # XXX We mimic GNU tar's behaviour with negative numbers, + # this could raise OverflowError. + n = struct.unpack("L", struct.pack("l", n))[0] + + s = bytearray() + for i in range(digits - 1): + s.insert(0, n & 0o377) + n >>= 8 + s.insert(0, 0o200) + return s + +def calc_chksums(buf): + """Calculate the checksum for a member's header by summing up all + characters except for the chksum field which is treated as if + it was filled with spaces. According to the GNU tar sources, + some tars (Sun and NeXT) calculate chksum with signed char, + which will be different if there are chars in the buffer with + the high bit set. So we calculate two checksums, unsigned and + signed. + """ + unsigned_chksum = 256 + sum(struct.unpack("148B", buf[:148]) + struct.unpack("356B", buf[156:512])) + signed_chksum = 256 + sum(struct.unpack("148b", buf[:148]) + struct.unpack("356b", buf[156:512])) + return unsigned_chksum, signed_chksum + +def copyfileobj(src, dst, length=None): + """Copy length bytes from fileobj src to fileobj dst. + If length is None, copy the entire content. + """ + if length == 0: + return + if length is None: + while True: + buf = src.read(16*1024) + if not buf: + break + dst.write(buf) + return + + BUFSIZE = 16 * 1024 + blocks, remainder = divmod(length, BUFSIZE) + for b in range(blocks): + buf = src.read(BUFSIZE) + if len(buf) < BUFSIZE: + raise IOError("end of file reached") + dst.write(buf) + + if remainder != 0: + buf = src.read(remainder) + if len(buf) < remainder: + raise IOError("end of file reached") + dst.write(buf) + return + +filemode_table = ( + ((S_IFLNK, "l"), + (S_IFREG, "-"), + (S_IFBLK, "b"), + (S_IFDIR, "d"), + (S_IFCHR, "c"), + (S_IFIFO, "p")), + + ((TUREAD, "r"),), + ((TUWRITE, "w"),), + ((TUEXEC|TSUID, "s"), + (TSUID, "S"), + (TUEXEC, "x")), + + ((TGREAD, "r"),), + ((TGWRITE, "w"),), + ((TGEXEC|TSGID, "s"), + (TSGID, "S"), + (TGEXEC, "x")), + + ((TOREAD, "r"),), + ((TOWRITE, "w"),), + ((TOEXEC|TSVTX, "t"), + (TSVTX, "T"), + (TOEXEC, "x")) +) + +def filemode(mode): + """Convert a file's mode to a string of the form + -rwxrwxrwx. + Used by TarFile.list() + """ + perm = [] + for table in filemode_table: + for bit, char in table: + if mode & bit == bit: + perm.append(char) + break + else: + perm.append("-") + return "".join(perm) + +class TarError(Exception): + """Base exception.""" + pass +class ExtractError(TarError): + """General exception for extract errors.""" + pass +class ReadError(TarError): + """Exception for unreadable tar archives.""" + pass +class CompressionError(TarError): + """Exception for unavailable compression methods.""" + pass +class StreamError(TarError): + """Exception for unsupported operations on stream-like TarFiles.""" + pass +class HeaderError(TarError): + """Base exception for header errors.""" + pass +class EmptyHeaderError(HeaderError): + """Exception for empty headers.""" + pass +class TruncatedHeaderError(HeaderError): + """Exception for truncated headers.""" + pass +class EOFHeaderError(HeaderError): + """Exception for end of file headers.""" + pass +class InvalidHeaderError(HeaderError): + """Exception for invalid headers.""" + pass +class SubsequentHeaderError(HeaderError): + """Exception for missing and invalid extended headers.""" + pass + +#--------------------------- +# internal stream interface +#--------------------------- +class _LowLevelFile(object): + """Low-level file object. Supports reading and writing. + It is used instead of a regular file object for streaming + access. + """ + + def __init__(self, name, mode): + mode = { + "r": os.O_RDONLY, + "w": os.O_WRONLY | os.O_CREAT | os.O_TRUNC, + }[mode] + if hasattr(os, "O_BINARY"): + mode |= os.O_BINARY + self.fd = os.open(name, mode, 0o666) + + def close(self): + os.close(self.fd) + + def read(self, size): + return os.read(self.fd, size) + + def write(self, s): + os.write(self.fd, s) + +class _Stream(object): + """Class that serves as an adapter between TarFile and + a stream-like object. The stream-like object only + needs to have a read() or write() method and is accessed + blockwise. Use of gzip or bzip2 compression is possible. + A stream-like object could be for example: sys.stdin, + sys.stdout, a socket, a tape device etc. + + _Stream is intended to be used only internally. + """ + + def __init__(self, name, mode, comptype, fileobj, bufsize): + """Construct a _Stream object. + """ + self._extfileobj = True + if fileobj is None: + fileobj = _LowLevelFile(name, mode) + self._extfileobj = False + + if comptype == '*': + # Enable transparent compression detection for the + # stream interface + fileobj = _StreamProxy(fileobj) + comptype = fileobj.getcomptype() + + self.name = name or "" + self.mode = mode + self.comptype = comptype + self.fileobj = fileobj + self.bufsize = bufsize + self.buf = b"" + self.pos = 0 + self.closed = False + + try: + if comptype == "gz": + try: + import zlib + except ImportError: + raise CompressionError("zlib module is not available") + self.zlib = zlib + self.crc = zlib.crc32(b"") + if mode == "r": + self._init_read_gz() + else: + self._init_write_gz() + + if comptype == "bz2": + try: + import bz2 + except ImportError: + raise CompressionError("bz2 module is not available") + if mode == "r": + self.dbuf = b"" + self.cmp = bz2.BZ2Decompressor() + else: + self.cmp = bz2.BZ2Compressor() + except: + if not self._extfileobj: + self.fileobj.close() + self.closed = True + raise + + def __del__(self): + if hasattr(self, "closed") and not self.closed: + self.close() + + def _init_write_gz(self): + """Initialize for writing with gzip compression. + """ + self.cmp = self.zlib.compressobj(9, self.zlib.DEFLATED, + -self.zlib.MAX_WBITS, + self.zlib.DEF_MEM_LEVEL, + 0) + timestamp = struct.pack(" self.bufsize: + self.fileobj.write(self.buf[:self.bufsize]) + self.buf = self.buf[self.bufsize:] + + def close(self): + """Close the _Stream object. No operation should be + done on it afterwards. + """ + if self.closed: + return + + if self.mode == "w" and self.comptype != "tar": + self.buf += self.cmp.flush() + + if self.mode == "w" and self.buf: + self.fileobj.write(self.buf) + self.buf = b"" + if self.comptype == "gz": + # The native zlib crc is an unsigned 32-bit integer, but + # the Python wrapper implicitly casts that to a signed C + # long. So, on a 32-bit box self.crc may "look negative", + # while the same crc on a 64-bit box may "look positive". + # To avoid irksome warnings from the `struct` module, force + # it to look positive on all boxes. + self.fileobj.write(struct.pack("= 0: + blocks, remainder = divmod(pos - self.pos, self.bufsize) + for i in range(blocks): + self.read(self.bufsize) + self.read(remainder) + else: + raise StreamError("seeking backwards is not allowed") + return self.pos + + def read(self, size=None): + """Return the next size number of bytes from the stream. + If size is not defined, return all bytes of the stream + up to EOF. + """ + if size is None: + t = [] + while True: + buf = self._read(self.bufsize) + if not buf: + break + t.append(buf) + buf = "".join(t) + else: + buf = self._read(size) + self.pos += len(buf) + return buf + + def _read(self, size): + """Return size bytes from the stream. + """ + if self.comptype == "tar": + return self.__read(size) + + c = len(self.dbuf) + while c < size: + buf = self.__read(self.bufsize) + if not buf: + break + try: + buf = self.cmp.decompress(buf) + except IOError: + raise ReadError("invalid compressed data") + self.dbuf += buf + c += len(buf) + buf = self.dbuf[:size] + self.dbuf = self.dbuf[size:] + return buf + + def __read(self, size): + """Return size bytes from stream. If internal buffer is empty, + read another block from the stream. + """ + c = len(self.buf) + while c < size: + buf = self.fileobj.read(self.bufsize) + if not buf: + break + self.buf += buf + c += len(buf) + buf = self.buf[:size] + self.buf = self.buf[size:] + return buf +# class _Stream + +class _StreamProxy(object): + """Small proxy class that enables transparent compression + detection for the Stream interface (mode 'r|*'). + """ + + def __init__(self, fileobj): + self.fileobj = fileobj + self.buf = self.fileobj.read(BLOCKSIZE) + + def read(self, size): + self.read = self.fileobj.read + return self.buf + + def getcomptype(self): + if self.buf.startswith(b"\037\213\010"): + return "gz" + if self.buf.startswith(b"BZh91"): + return "bz2" + return "tar" + + def close(self): + self.fileobj.close() +# class StreamProxy + +class _BZ2Proxy(object): + """Small proxy class that enables external file object + support for "r:bz2" and "w:bz2" modes. This is actually + a workaround for a limitation in bz2 module's BZ2File + class which (unlike gzip.GzipFile) has no support for + a file object argument. + """ + + blocksize = 16 * 1024 + + def __init__(self, fileobj, mode): + self.fileobj = fileobj + self.mode = mode + self.name = getattr(self.fileobj, "name", None) + self.init() + + def init(self): + import bz2 + self.pos = 0 + if self.mode == "r": + self.bz2obj = bz2.BZ2Decompressor() + self.fileobj.seek(0) + self.buf = b"" + else: + self.bz2obj = bz2.BZ2Compressor() + + def read(self, size): + x = len(self.buf) + while x < size: + raw = self.fileobj.read(self.blocksize) + if not raw: + break + data = self.bz2obj.decompress(raw) + self.buf += data + x += len(data) + + buf = self.buf[:size] + self.buf = self.buf[size:] + self.pos += len(buf) + return buf + + def seek(self, pos): + if pos < self.pos: + self.init() + self.read(pos - self.pos) + + def tell(self): + return self.pos + + def write(self, data): + self.pos += len(data) + raw = self.bz2obj.compress(data) + self.fileobj.write(raw) + + def close(self): + if self.mode == "w": + raw = self.bz2obj.flush() + self.fileobj.write(raw) +# class _BZ2Proxy + +#------------------------ +# Extraction file object +#------------------------ +class _FileInFile(object): + """A thin wrapper around an existing file object that + provides a part of its data as an individual file + object. + """ + + def __init__(self, fileobj, offset, size, blockinfo=None): + self.fileobj = fileobj + self.offset = offset + self.size = size + self.position = 0 + + if blockinfo is None: + blockinfo = [(0, size)] + + # Construct a map with data and zero blocks. + self.map_index = 0 + self.map = [] + lastpos = 0 + realpos = self.offset + for offset, size in blockinfo: + if offset > lastpos: + self.map.append((False, lastpos, offset, None)) + self.map.append((True, offset, offset + size, realpos)) + realpos += size + lastpos = offset + size + if lastpos < self.size: + self.map.append((False, lastpos, self.size, None)) + + def seekable(self): + if not hasattr(self.fileobj, "seekable"): + # XXX gzip.GzipFile and bz2.BZ2File + return True + return self.fileobj.seekable() + + def tell(self): + """Return the current file position. + """ + return self.position + + def seek(self, position): + """Seek to a position in the file. + """ + self.position = position + + def read(self, size=None): + """Read data from the file. + """ + if size is None: + size = self.size - self.position + else: + size = min(size, self.size - self.position) + + buf = b"" + while size > 0: + while True: + data, start, stop, offset = self.map[self.map_index] + if start <= self.position < stop: + break + else: + self.map_index += 1 + if self.map_index == len(self.map): + self.map_index = 0 + length = min(size, stop - self.position) + if data: + self.fileobj.seek(offset + (self.position - start)) + buf += self.fileobj.read(length) + else: + buf += NUL * length + size -= length + self.position += length + return buf +#class _FileInFile + + +class ExFileObject(object): + """File-like object for reading an archive member. + Is returned by TarFile.extractfile(). + """ + blocksize = 1024 + + def __init__(self, tarfile, tarinfo): + self.fileobj = _FileInFile(tarfile.fileobj, + tarinfo.offset_data, + tarinfo.size, + tarinfo.sparse) + self.name = tarinfo.name + self.mode = "r" + self.closed = False + self.size = tarinfo.size + + self.position = 0 + self.buffer = b"" + + def readable(self): + return True + + def writable(self): + return False + + def seekable(self): + return self.fileobj.seekable() + + def read(self, size=None): + """Read at most size bytes from the file. If size is not + present or None, read all data until EOF is reached. + """ + if self.closed: + raise ValueError("I/O operation on closed file") + + buf = b"" + if self.buffer: + if size is None: + buf = self.buffer + self.buffer = b"" + else: + buf = self.buffer[:size] + self.buffer = self.buffer[size:] + + if size is None: + buf += self.fileobj.read() + else: + buf += self.fileobj.read(size - len(buf)) + + self.position += len(buf) + return buf + + # XXX TextIOWrapper uses the read1() method. + read1 = read + + def readline(self, size=-1): + """Read one entire line from the file. If size is present + and non-negative, return a string with at most that + size, which may be an incomplete line. + """ + if self.closed: + raise ValueError("I/O operation on closed file") + + pos = self.buffer.find(b"\n") + 1 + if pos == 0: + # no newline found. + while True: + buf = self.fileobj.read(self.blocksize) + self.buffer += buf + if not buf or b"\n" in buf: + pos = self.buffer.find(b"\n") + 1 + if pos == 0: + # no newline found. + pos = len(self.buffer) + break + + if size != -1: + pos = min(size, pos) + + buf = self.buffer[:pos] + self.buffer = self.buffer[pos:] + self.position += len(buf) + return buf + + def readlines(self): + """Return a list with all remaining lines. + """ + result = [] + while True: + line = self.readline() + if not line: break + result.append(line) + return result + + def tell(self): + """Return the current file position. + """ + if self.closed: + raise ValueError("I/O operation on closed file") + + return self.position + + def seek(self, pos, whence=os.SEEK_SET): + """Seek to a position in the file. + """ + if self.closed: + raise ValueError("I/O operation on closed file") + + if whence == os.SEEK_SET: + self.position = min(max(pos, 0), self.size) + elif whence == os.SEEK_CUR: + if pos < 0: + self.position = max(self.position + pos, 0) + else: + self.position = min(self.position + pos, self.size) + elif whence == os.SEEK_END: + self.position = max(min(self.size + pos, self.size), 0) + else: + raise ValueError("Invalid argument") + + self.buffer = b"" + self.fileobj.seek(self.position) + + def close(self): + """Close the file object. + """ + self.closed = True + + def __iter__(self): + """Get an iterator over the file's lines. + """ + while True: + line = self.readline() + if not line: + break + yield line +#class ExFileObject + +#------------------ +# Exported Classes +#------------------ +class TarInfo(object): + """Informational class which holds the details about an + archive member given by a tar header block. + TarInfo objects are returned by TarFile.getmember(), + TarFile.getmembers() and TarFile.gettarinfo() and are + usually created internally. + """ + + __slots__ = ("name", "mode", "uid", "gid", "size", "mtime", + "chksum", "type", "linkname", "uname", "gname", + "devmajor", "devminor", + "offset", "offset_data", "pax_headers", "sparse", + "tarfile", "_sparse_structs", "_link_target") + + def __init__(self, name=""): + """Construct a TarInfo object. name is the optional name + of the member. + """ + self.name = name # member name + self.mode = 0o644 # file permissions + self.uid = 0 # user id + self.gid = 0 # group id + self.size = 0 # file size + self.mtime = 0 # modification time + self.chksum = 0 # header checksum + self.type = REGTYPE # member type + self.linkname = "" # link name + self.uname = "" # user name + self.gname = "" # group name + self.devmajor = 0 # device major number + self.devminor = 0 # device minor number + + self.offset = 0 # the tar header starts here + self.offset_data = 0 # the file's data starts here + + self.sparse = None # sparse member information + self.pax_headers = {} # pax header information + + # In pax headers the "name" and "linkname" field are called + # "path" and "linkpath". + def _getpath(self): + return self.name + def _setpath(self, name): + self.name = name + path = property(_getpath, _setpath) + + def _getlinkpath(self): + return self.linkname + def _setlinkpath(self, linkname): + self.linkname = linkname + linkpath = property(_getlinkpath, _setlinkpath) + + def __repr__(self): + return "<%s %r at %#x>" % (self.__class__.__name__,self.name,id(self)) + + def get_info(self): + """Return the TarInfo's attributes as a dictionary. + """ + info = { + "name": self.name, + "mode": self.mode & 0o7777, + "uid": self.uid, + "gid": self.gid, + "size": self.size, + "mtime": self.mtime, + "chksum": self.chksum, + "type": self.type, + "linkname": self.linkname, + "uname": self.uname, + "gname": self.gname, + "devmajor": self.devmajor, + "devminor": self.devminor + } + + if info["type"] == DIRTYPE and not info["name"].endswith("/"): + info["name"] += "/" + + return info + + def tobuf(self, format=DEFAULT_FORMAT, encoding=ENCODING, errors="surrogateescape"): + """Return a tar header as a string of 512 byte blocks. + """ + info = self.get_info() + + if format == USTAR_FORMAT: + return self.create_ustar_header(info, encoding, errors) + elif format == GNU_FORMAT: + return self.create_gnu_header(info, encoding, errors) + elif format == PAX_FORMAT: + return self.create_pax_header(info, encoding) + else: + raise ValueError("invalid format") + + def create_ustar_header(self, info, encoding, errors): + """Return the object as a ustar header block. + """ + info["magic"] = POSIX_MAGIC + + if len(info["linkname"]) > LENGTH_LINK: + raise ValueError("linkname is too long") + + if len(info["name"]) > LENGTH_NAME: + info["prefix"], info["name"] = self._posix_split_name(info["name"]) + + return self._create_header(info, USTAR_FORMAT, encoding, errors) + + def create_gnu_header(self, info, encoding, errors): + """Return the object as a GNU header block sequence. + """ + info["magic"] = GNU_MAGIC + + buf = b"" + if len(info["linkname"]) > LENGTH_LINK: + buf += self._create_gnu_long_header(info["linkname"], GNUTYPE_LONGLINK, encoding, errors) + + if len(info["name"]) > LENGTH_NAME: + buf += self._create_gnu_long_header(info["name"], GNUTYPE_LONGNAME, encoding, errors) + + return buf + self._create_header(info, GNU_FORMAT, encoding, errors) + + def create_pax_header(self, info, encoding): + """Return the object as a ustar header block. If it cannot be + represented this way, prepend a pax extended header sequence + with supplement information. + """ + info["magic"] = POSIX_MAGIC + pax_headers = self.pax_headers.copy() + + # Test string fields for values that exceed the field length or cannot + # be represented in ASCII encoding. + for name, hname, length in ( + ("name", "path", LENGTH_NAME), ("linkname", "linkpath", LENGTH_LINK), + ("uname", "uname", 32), ("gname", "gname", 32)): + + if hname in pax_headers: + # The pax header has priority. + continue + + # Try to encode the string as ASCII. + try: + info[name].encode("ascii", "strict") + except UnicodeEncodeError: + pax_headers[hname] = info[name] + continue + + if len(info[name]) > length: + pax_headers[hname] = info[name] + + # Test number fields for values that exceed the field limit or values + # that like to be stored as float. + for name, digits in (("uid", 8), ("gid", 8), ("size", 12), ("mtime", 12)): + if name in pax_headers: + # The pax header has priority. Avoid overflow. + info[name] = 0 + continue + + val = info[name] + if not 0 <= val < 8 ** (digits - 1) or isinstance(val, float): + pax_headers[name] = str(val) + info[name] = 0 + + # Create a pax extended header if necessary. + if pax_headers: + buf = self._create_pax_generic_header(pax_headers, XHDTYPE, encoding) + else: + buf = b"" + + return buf + self._create_header(info, USTAR_FORMAT, "ascii", "replace") + + @classmethod + def create_pax_global_header(cls, pax_headers): + """Return the object as a pax global header block sequence. + """ + return cls._create_pax_generic_header(pax_headers, XGLTYPE, "utf8") + + def _posix_split_name(self, name): + """Split a name longer than 100 chars into a prefix + and a name part. + """ + prefix = name[:LENGTH_PREFIX + 1] + while prefix and prefix[-1] != "/": + prefix = prefix[:-1] + + name = name[len(prefix):] + prefix = prefix[:-1] + + if not prefix or len(name) > LENGTH_NAME: + raise ValueError("name is too long") + return prefix, name + + @staticmethod + def _create_header(info, format, encoding, errors): + """Return a header block. info is a dictionary with file + information, format must be one of the *_FORMAT constants. + """ + parts = [ + stn(info.get("name", ""), 100, encoding, errors), + itn(info.get("mode", 0) & 0o7777, 8, format), + itn(info.get("uid", 0), 8, format), + itn(info.get("gid", 0), 8, format), + itn(info.get("size", 0), 12, format), + itn(info.get("mtime", 0), 12, format), + b" ", # checksum field + info.get("type", REGTYPE), + stn(info.get("linkname", ""), 100, encoding, errors), + info.get("magic", POSIX_MAGIC), + stn(info.get("uname", ""), 32, encoding, errors), + stn(info.get("gname", ""), 32, encoding, errors), + itn(info.get("devmajor", 0), 8, format), + itn(info.get("devminor", 0), 8, format), + stn(info.get("prefix", ""), 155, encoding, errors) + ] + + buf = struct.pack("%ds" % BLOCKSIZE, b"".join(parts)) + chksum = calc_chksums(buf[-BLOCKSIZE:])[0] + buf = buf[:-364] + ("%06o\0" % chksum).encode("ascii") + buf[-357:] + return buf + + @staticmethod + def _create_payload(payload): + """Return the string payload filled with zero bytes + up to the next 512 byte border. + """ + blocks, remainder = divmod(len(payload), BLOCKSIZE) + if remainder > 0: + payload += (BLOCKSIZE - remainder) * NUL + return payload + + @classmethod + def _create_gnu_long_header(cls, name, type, encoding, errors): + """Return a GNUTYPE_LONGNAME or GNUTYPE_LONGLINK sequence + for name. + """ + name = name.encode(encoding, errors) + NUL + + info = {} + info["name"] = "././@LongLink" + info["type"] = type + info["size"] = len(name) + info["magic"] = GNU_MAGIC + + # create extended header + name blocks. + return cls._create_header(info, USTAR_FORMAT, encoding, errors) + \ + cls._create_payload(name) + + @classmethod + def _create_pax_generic_header(cls, pax_headers, type, encoding): + """Return a POSIX.1-2008 extended or global header sequence + that contains a list of keyword, value pairs. The values + must be strings. + """ + # Check if one of the fields contains surrogate characters and thereby + # forces hdrcharset=BINARY, see _proc_pax() for more information. + binary = False + for keyword, value in pax_headers.items(): + try: + value.encode("utf8", "strict") + except UnicodeEncodeError: + binary = True + break + + records = b"" + if binary: + # Put the hdrcharset field at the beginning of the header. + records += b"21 hdrcharset=BINARY\n" + + for keyword, value in pax_headers.items(): + keyword = keyword.encode("utf8") + if binary: + # Try to restore the original byte representation of `value'. + # Needless to say, that the encoding must match the string. + value = value.encode(encoding, "surrogateescape") + else: + value = value.encode("utf8") + + l = len(keyword) + len(value) + 3 # ' ' + '=' + '\n' + n = p = 0 + while True: + n = l + len(str(p)) + if n == p: + break + p = n + records += bytes(str(p), "ascii") + b" " + keyword + b"=" + value + b"\n" + + # We use a hardcoded "././@PaxHeader" name like star does + # instead of the one that POSIX recommends. + info = {} + info["name"] = "././@PaxHeader" + info["type"] = type + info["size"] = len(records) + info["magic"] = POSIX_MAGIC + + # Create pax header + record blocks. + return cls._create_header(info, USTAR_FORMAT, "ascii", "replace") + \ + cls._create_payload(records) + + @classmethod + def frombuf(cls, buf, encoding, errors): + """Construct a TarInfo object from a 512 byte bytes object. + """ + if len(buf) == 0: + raise EmptyHeaderError("empty header") + if len(buf) != BLOCKSIZE: + raise TruncatedHeaderError("truncated header") + if buf.count(NUL) == BLOCKSIZE: + raise EOFHeaderError("end of file header") + + chksum = nti(buf[148:156]) + if chksum not in calc_chksums(buf): + raise InvalidHeaderError("bad checksum") + + obj = cls() + obj.name = nts(buf[0:100], encoding, errors) + obj.mode = nti(buf[100:108]) + obj.uid = nti(buf[108:116]) + obj.gid = nti(buf[116:124]) + obj.size = nti(buf[124:136]) + obj.mtime = nti(buf[136:148]) + obj.chksum = chksum + obj.type = buf[156:157] + obj.linkname = nts(buf[157:257], encoding, errors) + obj.uname = nts(buf[265:297], encoding, errors) + obj.gname = nts(buf[297:329], encoding, errors) + obj.devmajor = nti(buf[329:337]) + obj.devminor = nti(buf[337:345]) + prefix = nts(buf[345:500], encoding, errors) + + # Old V7 tar format represents a directory as a regular + # file with a trailing slash. + if obj.type == AREGTYPE and obj.name.endswith("/"): + obj.type = DIRTYPE + + # The old GNU sparse format occupies some of the unused + # space in the buffer for up to 4 sparse structures. + # Save the them for later processing in _proc_sparse(). + if obj.type == GNUTYPE_SPARSE: + pos = 386 + structs = [] + for i in range(4): + try: + offset = nti(buf[pos:pos + 12]) + numbytes = nti(buf[pos + 12:pos + 24]) + except ValueError: + break + structs.append((offset, numbytes)) + pos += 24 + isextended = bool(buf[482]) + origsize = nti(buf[483:495]) + obj._sparse_structs = (structs, isextended, origsize) + + # Remove redundant slashes from directories. + if obj.isdir(): + obj.name = obj.name.rstrip("/") + + # Reconstruct a ustar longname. + if prefix and obj.type not in GNU_TYPES: + obj.name = prefix + "/" + obj.name + return obj + + @classmethod + def fromtarfile(cls, tarfile): + """Return the next TarInfo object from TarFile object + tarfile. + """ + buf = tarfile.fileobj.read(BLOCKSIZE) + obj = cls.frombuf(buf, tarfile.encoding, tarfile.errors) + obj.offset = tarfile.fileobj.tell() - BLOCKSIZE + return obj._proc_member(tarfile) + + #-------------------------------------------------------------------------- + # The following are methods that are called depending on the type of a + # member. The entry point is _proc_member() which can be overridden in a + # subclass to add custom _proc_*() methods. A _proc_*() method MUST + # implement the following + # operations: + # 1. Set self.offset_data to the position where the data blocks begin, + # if there is data that follows. + # 2. Set tarfile.offset to the position where the next member's header will + # begin. + # 3. Return self or another valid TarInfo object. + def _proc_member(self, tarfile): + """Choose the right processing method depending on + the type and call it. + """ + if self.type in (GNUTYPE_LONGNAME, GNUTYPE_LONGLINK): + return self._proc_gnulong(tarfile) + elif self.type == GNUTYPE_SPARSE: + return self._proc_sparse(tarfile) + elif self.type in (XHDTYPE, XGLTYPE, SOLARIS_XHDTYPE): + return self._proc_pax(tarfile) + else: + return self._proc_builtin(tarfile) + + def _proc_builtin(self, tarfile): + """Process a builtin type or an unknown type which + will be treated as a regular file. + """ + self.offset_data = tarfile.fileobj.tell() + offset = self.offset_data + if self.isreg() or self.type not in SUPPORTED_TYPES: + # Skip the following data blocks. + offset += self._block(self.size) + tarfile.offset = offset + + # Patch the TarInfo object with saved global + # header information. + self._apply_pax_info(tarfile.pax_headers, tarfile.encoding, tarfile.errors) + + return self + + def _proc_gnulong(self, tarfile): + """Process the blocks that hold a GNU longname + or longlink member. + """ + buf = tarfile.fileobj.read(self._block(self.size)) + + # Fetch the next header and process it. + try: + next = self.fromtarfile(tarfile) + except HeaderError: + raise SubsequentHeaderError("missing or bad subsequent header") + + # Patch the TarInfo object from the next header with + # the longname information. + next.offset = self.offset + if self.type == GNUTYPE_LONGNAME: + next.name = nts(buf, tarfile.encoding, tarfile.errors) + elif self.type == GNUTYPE_LONGLINK: + next.linkname = nts(buf, tarfile.encoding, tarfile.errors) + + return next + + def _proc_sparse(self, tarfile): + """Process a GNU sparse header plus extra headers. + """ + # We already collected some sparse structures in frombuf(). + structs, isextended, origsize = self._sparse_structs + del self._sparse_structs + + # Collect sparse structures from extended header blocks. + while isextended: + buf = tarfile.fileobj.read(BLOCKSIZE) + pos = 0 + for i in range(21): + try: + offset = nti(buf[pos:pos + 12]) + numbytes = nti(buf[pos + 12:pos + 24]) + except ValueError: + break + if offset and numbytes: + structs.append((offset, numbytes)) + pos += 24 + isextended = bool(buf[504]) + self.sparse = structs + + self.offset_data = tarfile.fileobj.tell() + tarfile.offset = self.offset_data + self._block(self.size) + self.size = origsize + return self + + def _proc_pax(self, tarfile): + """Process an extended or global header as described in + POSIX.1-2008. + """ + # Read the header information. + buf = tarfile.fileobj.read(self._block(self.size)) + + # A pax header stores supplemental information for either + # the following file (extended) or all following files + # (global). + if self.type == XGLTYPE: + pax_headers = tarfile.pax_headers + else: + pax_headers = tarfile.pax_headers.copy() + + # Check if the pax header contains a hdrcharset field. This tells us + # the encoding of the path, linkpath, uname and gname fields. Normally, + # these fields are UTF-8 encoded but since POSIX.1-2008 tar + # implementations are allowed to store them as raw binary strings if + # the translation to UTF-8 fails. + match = re.search(br"\d+ hdrcharset=([^\n]+)\n", buf) + if match is not None: + pax_headers["hdrcharset"] = match.group(1).decode("utf8") + + # For the time being, we don't care about anything other than "BINARY". + # The only other value that is currently allowed by the standard is + # "ISO-IR 10646 2000 UTF-8" in other words UTF-8. + hdrcharset = pax_headers.get("hdrcharset") + if hdrcharset == "BINARY": + encoding = tarfile.encoding + else: + encoding = "utf8" + + # Parse pax header information. A record looks like that: + # "%d %s=%s\n" % (length, keyword, value). length is the size + # of the complete record including the length field itself and + # the newline. keyword and value are both UTF-8 encoded strings. + regex = re.compile(br"(\d+) ([^=]+)=") + pos = 0 + while True: + match = regex.match(buf, pos) + if not match: + break + + length, keyword = match.groups() + length = int(length) + value = buf[match.end(2) + 1:match.start(1) + length - 1] + + # Normally, we could just use "utf8" as the encoding and "strict" + # as the error handler, but we better not take the risk. For + # example, GNU tar <= 1.23 is known to store filenames it cannot + # translate to UTF-8 as raw strings (unfortunately without a + # hdrcharset=BINARY header). + # We first try the strict standard encoding, and if that fails we + # fall back on the user's encoding and error handler. + keyword = self._decode_pax_field(keyword, "utf8", "utf8", + tarfile.errors) + if keyword in PAX_NAME_FIELDS: + value = self._decode_pax_field(value, encoding, tarfile.encoding, + tarfile.errors) + else: + value = self._decode_pax_field(value, "utf8", "utf8", + tarfile.errors) + + pax_headers[keyword] = value + pos += length + + # Fetch the next header. + try: + next = self.fromtarfile(tarfile) + except HeaderError: + raise SubsequentHeaderError("missing or bad subsequent header") + + # Process GNU sparse information. + if "GNU.sparse.map" in pax_headers: + # GNU extended sparse format version 0.1. + self._proc_gnusparse_01(next, pax_headers) + + elif "GNU.sparse.size" in pax_headers: + # GNU extended sparse format version 0.0. + self._proc_gnusparse_00(next, pax_headers, buf) + + elif pax_headers.get("GNU.sparse.major") == "1" and pax_headers.get("GNU.sparse.minor") == "0": + # GNU extended sparse format version 1.0. + self._proc_gnusparse_10(next, pax_headers, tarfile) + + if self.type in (XHDTYPE, SOLARIS_XHDTYPE): + # Patch the TarInfo object with the extended header info. + next._apply_pax_info(pax_headers, tarfile.encoding, tarfile.errors) + next.offset = self.offset + + if "size" in pax_headers: + # If the extended header replaces the size field, + # we need to recalculate the offset where the next + # header starts. + offset = next.offset_data + if next.isreg() or next.type not in SUPPORTED_TYPES: + offset += next._block(next.size) + tarfile.offset = offset + + return next + + def _proc_gnusparse_00(self, next, pax_headers, buf): + """Process a GNU tar extended sparse header, version 0.0. + """ + offsets = [] + for match in re.finditer(br"\d+ GNU.sparse.offset=(\d+)\n", buf): + offsets.append(int(match.group(1))) + numbytes = [] + for match in re.finditer(br"\d+ GNU.sparse.numbytes=(\d+)\n", buf): + numbytes.append(int(match.group(1))) + next.sparse = list(zip(offsets, numbytes)) + + def _proc_gnusparse_01(self, next, pax_headers): + """Process a GNU tar extended sparse header, version 0.1. + """ + sparse = [int(x) for x in pax_headers["GNU.sparse.map"].split(",")] + next.sparse = list(zip(sparse[::2], sparse[1::2])) + + def _proc_gnusparse_10(self, next, pax_headers, tarfile): + """Process a GNU tar extended sparse header, version 1.0. + """ + fields = None + sparse = [] + buf = tarfile.fileobj.read(BLOCKSIZE) + fields, buf = buf.split(b"\n", 1) + fields = int(fields) + while len(sparse) < fields * 2: + if b"\n" not in buf: + buf += tarfile.fileobj.read(BLOCKSIZE) + number, buf = buf.split(b"\n", 1) + sparse.append(int(number)) + next.offset_data = tarfile.fileobj.tell() + next.sparse = list(zip(sparse[::2], sparse[1::2])) + + def _apply_pax_info(self, pax_headers, encoding, errors): + """Replace fields with supplemental information from a previous + pax extended or global header. + """ + for keyword, value in pax_headers.items(): + if keyword == "GNU.sparse.name": + setattr(self, "path", value) + elif keyword == "GNU.sparse.size": + setattr(self, "size", int(value)) + elif keyword == "GNU.sparse.realsize": + setattr(self, "size", int(value)) + elif keyword in PAX_FIELDS: + if keyword in PAX_NUMBER_FIELDS: + try: + value = PAX_NUMBER_FIELDS[keyword](value) + except ValueError: + value = 0 + if keyword == "path": + value = value.rstrip("/") + setattr(self, keyword, value) + + self.pax_headers = pax_headers.copy() + + def _decode_pax_field(self, value, encoding, fallback_encoding, fallback_errors): + """Decode a single field from a pax record. + """ + try: + return value.decode(encoding, "strict") + except UnicodeDecodeError: + return value.decode(fallback_encoding, fallback_errors) + + def _block(self, count): + """Round up a byte count by BLOCKSIZE and return it, + e.g. _block(834) => 1024. + """ + blocks, remainder = divmod(count, BLOCKSIZE) + if remainder: + blocks += 1 + return blocks * BLOCKSIZE + + def isreg(self): + return self.type in REGULAR_TYPES + def isfile(self): + return self.isreg() + def isdir(self): + return self.type == DIRTYPE + def issym(self): + return self.type == SYMTYPE + def islnk(self): + return self.type == LNKTYPE + def ischr(self): + return self.type == CHRTYPE + def isblk(self): + return self.type == BLKTYPE + def isfifo(self): + return self.type == FIFOTYPE + def issparse(self): + return self.sparse is not None + def isdev(self): + return self.type in (CHRTYPE, BLKTYPE, FIFOTYPE) +# class TarInfo + +class TarFile(object): + """The TarFile Class provides an interface to tar archives. + """ + + debug = 0 # May be set from 0 (no msgs) to 3 (all msgs) + + dereference = False # If true, add content of linked file to the + # tar file, else the link. + + ignore_zeros = False # If true, skips empty or invalid blocks and + # continues processing. + + errorlevel = 1 # If 0, fatal errors only appear in debug + # messages (if debug >= 0). If > 0, errors + # are passed to the caller as exceptions. + + format = DEFAULT_FORMAT # The format to use when creating an archive. + + encoding = ENCODING # Encoding for 8-bit character strings. + + errors = None # Error handler for unicode conversion. + + tarinfo = TarInfo # The default TarInfo class to use. + + fileobject = ExFileObject # The default ExFileObject class to use. + + def __init__(self, name=None, mode="r", fileobj=None, format=None, + tarinfo=None, dereference=None, ignore_zeros=None, encoding=None, + errors="surrogateescape", pax_headers=None, debug=None, errorlevel=None): + """Open an (uncompressed) tar archive `name'. `mode' is either 'r' to + read from an existing archive, 'a' to append data to an existing + file or 'w' to create a new file overwriting an existing one. `mode' + defaults to 'r'. + If `fileobj' is given, it is used for reading or writing data. If it + can be determined, `mode' is overridden by `fileobj's mode. + `fileobj' is not closed, when TarFile is closed. + """ + if len(mode) > 1 or mode not in "raw": + raise ValueError("mode must be 'r', 'a' or 'w'") + self.mode = mode + self._mode = {"r": "rb", "a": "r+b", "w": "wb"}[mode] + + if not fileobj: + if self.mode == "a" and not os.path.exists(name): + # Create nonexistent files in append mode. + self.mode = "w" + self._mode = "wb" + fileobj = bltn_open(name, self._mode) + self._extfileobj = False + else: + if name is None and hasattr(fileobj, "name"): + name = fileobj.name + if hasattr(fileobj, "mode"): + self._mode = fileobj.mode + self._extfileobj = True + self.name = os.path.abspath(name) if name else None + self.fileobj = fileobj + + # Init attributes. + if format is not None: + self.format = format + if tarinfo is not None: + self.tarinfo = tarinfo + if dereference is not None: + self.dereference = dereference + if ignore_zeros is not None: + self.ignore_zeros = ignore_zeros + if encoding is not None: + self.encoding = encoding + self.errors = errors + + if pax_headers is not None and self.format == PAX_FORMAT: + self.pax_headers = pax_headers + else: + self.pax_headers = {} + + if debug is not None: + self.debug = debug + if errorlevel is not None: + self.errorlevel = errorlevel + + # Init datastructures. + self.closed = False + self.members = [] # list of members as TarInfo objects + self._loaded = False # flag if all members have been read + self.offset = self.fileobj.tell() + # current position in the archive file + self.inodes = {} # dictionary caching the inodes of + # archive members already added + + try: + if self.mode == "r": + self.firstmember = None + self.firstmember = self.next() + + if self.mode == "a": + # Move to the end of the archive, + # before the first empty block. + while True: + self.fileobj.seek(self.offset) + try: + tarinfo = self.tarinfo.fromtarfile(self) + self.members.append(tarinfo) + except EOFHeaderError: + self.fileobj.seek(self.offset) + break + except HeaderError as e: + raise ReadError(str(e)) + + if self.mode in "aw": + self._loaded = True + + if self.pax_headers: + buf = self.tarinfo.create_pax_global_header(self.pax_headers.copy()) + self.fileobj.write(buf) + self.offset += len(buf) + except: + if not self._extfileobj: + self.fileobj.close() + self.closed = True + raise + + #-------------------------------------------------------------------------- + # Below are the classmethods which act as alternate constructors to the + # TarFile class. The open() method is the only one that is needed for + # public use; it is the "super"-constructor and is able to select an + # adequate "sub"-constructor for a particular compression using the mapping + # from OPEN_METH. + # + # This concept allows one to subclass TarFile without losing the comfort of + # the super-constructor. A sub-constructor is registered and made available + # by adding it to the mapping in OPEN_METH. + + @classmethod + def open(cls, name=None, mode="r", fileobj=None, bufsize=RECORDSIZE, **kwargs): + """Open a tar archive for reading, writing or appending. Return + an appropriate TarFile class. + + mode: + 'r' or 'r:*' open for reading with transparent compression + 'r:' open for reading exclusively uncompressed + 'r:gz' open for reading with gzip compression + 'r:bz2' open for reading with bzip2 compression + 'a' or 'a:' open for appending, creating the file if necessary + 'w' or 'w:' open for writing without compression + 'w:gz' open for writing with gzip compression + 'w:bz2' open for writing with bzip2 compression + + 'r|*' open a stream of tar blocks with transparent compression + 'r|' open an uncompressed stream of tar blocks for reading + 'r|gz' open a gzip compressed stream of tar blocks + 'r|bz2' open a bzip2 compressed stream of tar blocks + 'w|' open an uncompressed stream for writing + 'w|gz' open a gzip compressed stream for writing + 'w|bz2' open a bzip2 compressed stream for writing + """ + + if not name and not fileobj: + raise ValueError("nothing to open") + + if mode in ("r", "r:*"): + # Find out which *open() is appropriate for opening the file. + for comptype in cls.OPEN_METH: + func = getattr(cls, cls.OPEN_METH[comptype]) + if fileobj is not None: + saved_pos = fileobj.tell() + try: + return func(name, "r", fileobj, **kwargs) + except (ReadError, CompressionError) as e: + if fileobj is not None: + fileobj.seek(saved_pos) + continue + raise ReadError("file could not be opened successfully") + + elif ":" in mode: + filemode, comptype = mode.split(":", 1) + filemode = filemode or "r" + comptype = comptype or "tar" + + # Select the *open() function according to + # given compression. + if comptype in cls.OPEN_METH: + func = getattr(cls, cls.OPEN_METH[comptype]) + else: + raise CompressionError("unknown compression type %r" % comptype) + return func(name, filemode, fileobj, **kwargs) + + elif "|" in mode: + filemode, comptype = mode.split("|", 1) + filemode = filemode or "r" + comptype = comptype or "tar" + + if filemode not in "rw": + raise ValueError("mode must be 'r' or 'w'") + + stream = _Stream(name, filemode, comptype, fileobj, bufsize) + try: + t = cls(name, filemode, stream, **kwargs) + except: + stream.close() + raise + t._extfileobj = False + return t + + elif mode in "aw": + return cls.taropen(name, mode, fileobj, **kwargs) + + raise ValueError("undiscernible mode") + + @classmethod + def taropen(cls, name, mode="r", fileobj=None, **kwargs): + """Open uncompressed tar archive name for reading or writing. + """ + if len(mode) > 1 or mode not in "raw": + raise ValueError("mode must be 'r', 'a' or 'w'") + return cls(name, mode, fileobj, **kwargs) + + @classmethod + def gzopen(cls, name, mode="r", fileobj=None, compresslevel=9, **kwargs): + """Open gzip compressed tar archive name for reading or writing. + Appending is not allowed. + """ + if len(mode) > 1 or mode not in "rw": + raise ValueError("mode must be 'r' or 'w'") + + try: + import gzip + gzip.GzipFile + except (ImportError, AttributeError): + raise CompressionError("gzip module is not available") + + extfileobj = fileobj is not None + try: + fileobj = gzip.GzipFile(name, mode + "b", compresslevel, fileobj) + t = cls.taropen(name, mode, fileobj, **kwargs) + except IOError: + if not extfileobj and fileobj is not None: + fileobj.close() + if fileobj is None: + raise + raise ReadError("not a gzip file") + except: + if not extfileobj and fileobj is not None: + fileobj.close() + raise + t._extfileobj = extfileobj + return t + + @classmethod + def bz2open(cls, name, mode="r", fileobj=None, compresslevel=9, **kwargs): + """Open bzip2 compressed tar archive name for reading or writing. + Appending is not allowed. + """ + if len(mode) > 1 or mode not in "rw": + raise ValueError("mode must be 'r' or 'w'.") + + try: + import bz2 + except ImportError: + raise CompressionError("bz2 module is not available") + + if fileobj is not None: + fileobj = _BZ2Proxy(fileobj, mode) + else: + fileobj = bz2.BZ2File(name, mode, compresslevel=compresslevel) + + try: + t = cls.taropen(name, mode, fileobj, **kwargs) + except (IOError, EOFError): + fileobj.close() + raise ReadError("not a bzip2 file") + t._extfileobj = False + return t + + # All *open() methods are registered here. + OPEN_METH = { + "tar": "taropen", # uncompressed tar + "gz": "gzopen", # gzip compressed tar + "bz2": "bz2open" # bzip2 compressed tar + } + + #-------------------------------------------------------------------------- + # The public methods which TarFile provides: + + def close(self): + """Close the TarFile. In write-mode, two finishing zero blocks are + appended to the archive. + """ + if self.closed: + return + + if self.mode in "aw": + self.fileobj.write(NUL * (BLOCKSIZE * 2)) + self.offset += (BLOCKSIZE * 2) + # fill up the end with zero-blocks + # (like option -b20 for tar does) + blocks, remainder = divmod(self.offset, RECORDSIZE) + if remainder > 0: + self.fileobj.write(NUL * (RECORDSIZE - remainder)) + + if not self._extfileobj: + self.fileobj.close() + self.closed = True + + def getmember(self, name): + """Return a TarInfo object for member `name'. If `name' can not be + found in the archive, KeyError is raised. If a member occurs more + than once in the archive, its last occurrence is assumed to be the + most up-to-date version. + """ + tarinfo = self._getmember(name) + if tarinfo is None: + raise KeyError("filename %r not found" % name) + return tarinfo + + def getmembers(self): + """Return the members of the archive as a list of TarInfo objects. The + list has the same order as the members in the archive. + """ + self._check() + if not self._loaded: # if we want to obtain a list of + self._load() # all members, we first have to + # scan the whole archive. + return self.members + + def getnames(self): + """Return the members of the archive as a list of their names. It has + the same order as the list returned by getmembers(). + """ + return [tarinfo.name for tarinfo in self.getmembers()] + + def gettarinfo(self, name=None, arcname=None, fileobj=None): + """Create a TarInfo object for either the file `name' or the file + object `fileobj' (using os.fstat on its file descriptor). You can + modify some of the TarInfo's attributes before you add it using + addfile(). If given, `arcname' specifies an alternative name for the + file in the archive. + """ + self._check("aw") + + # When fileobj is given, replace name by + # fileobj's real name. + if fileobj is not None: + name = fileobj.name + + # Building the name of the member in the archive. + # Backward slashes are converted to forward slashes, + # Absolute paths are turned to relative paths. + if arcname is None: + arcname = name + drv, arcname = os.path.splitdrive(arcname) + arcname = arcname.replace(os.sep, "/") + arcname = arcname.lstrip("/") + + # Now, fill the TarInfo object with + # information specific for the file. + tarinfo = self.tarinfo() + tarinfo.tarfile = self + + # Use os.stat or os.lstat, depending on platform + # and if symlinks shall be resolved. + if fileobj is None: + if hasattr(os, "lstat") and not self.dereference: + statres = os.lstat(name) + else: + statres = os.stat(name) + else: + statres = os.fstat(fileobj.fileno()) + linkname = "" + + stmd = statres.st_mode + if stat.S_ISREG(stmd): + inode = (statres.st_ino, statres.st_dev) + if not self.dereference and statres.st_nlink > 1 and \ + inode in self.inodes and arcname != self.inodes[inode]: + # Is it a hardlink to an already + # archived file? + type = LNKTYPE + linkname = self.inodes[inode] + else: + # The inode is added only if its valid. + # For win32 it is always 0. + type = REGTYPE + if inode[0]: + self.inodes[inode] = arcname + elif stat.S_ISDIR(stmd): + type = DIRTYPE + elif stat.S_ISFIFO(stmd): + type = FIFOTYPE + elif stat.S_ISLNK(stmd): + type = SYMTYPE + linkname = os.readlink(name) + elif stat.S_ISCHR(stmd): + type = CHRTYPE + elif stat.S_ISBLK(stmd): + type = BLKTYPE + else: + return None + + # Fill the TarInfo object with all + # information we can get. + tarinfo.name = arcname + tarinfo.mode = stmd + tarinfo.uid = statres.st_uid + tarinfo.gid = statres.st_gid + if type == REGTYPE: + tarinfo.size = statres.st_size + else: + tarinfo.size = 0 + tarinfo.mtime = statres.st_mtime + tarinfo.type = type + tarinfo.linkname = linkname + if pwd: + try: + tarinfo.uname = pwd.getpwuid(tarinfo.uid)[0] + except KeyError: + pass + if grp: + try: + tarinfo.gname = grp.getgrgid(tarinfo.gid)[0] + except KeyError: + pass + + if type in (CHRTYPE, BLKTYPE): + if hasattr(os, "major") and hasattr(os, "minor"): + tarinfo.devmajor = os.major(statres.st_rdev) + tarinfo.devminor = os.minor(statres.st_rdev) + return tarinfo + + def list(self, verbose=True): + """Print a table of contents to sys.stdout. If `verbose' is False, only + the names of the members are printed. If it is True, an `ls -l'-like + output is produced. + """ + self._check() + + for tarinfo in self: + if verbose: + print(filemode(tarinfo.mode), end=' ') + print("%s/%s" % (tarinfo.uname or tarinfo.uid, + tarinfo.gname or tarinfo.gid), end=' ') + if tarinfo.ischr() or tarinfo.isblk(): + print("%10s" % ("%d,%d" \ + % (tarinfo.devmajor, tarinfo.devminor)), end=' ') + else: + print("%10d" % tarinfo.size, end=' ') + print("%d-%02d-%02d %02d:%02d:%02d" \ + % time.localtime(tarinfo.mtime)[:6], end=' ') + + print(tarinfo.name + ("/" if tarinfo.isdir() else ""), end=' ') + + if verbose: + if tarinfo.issym(): + print("->", tarinfo.linkname, end=' ') + if tarinfo.islnk(): + print("link to", tarinfo.linkname, end=' ') + print() + + def add(self, name, arcname=None, recursive=True, exclude=None, filter=None): + """Add the file `name' to the archive. `name' may be any type of file + (directory, fifo, symbolic link, etc.). If given, `arcname' + specifies an alternative name for the file in the archive. + Directories are added recursively by default. This can be avoided by + setting `recursive' to False. `exclude' is a function that should + return True for each filename to be excluded. `filter' is a function + that expects a TarInfo object argument and returns the changed + TarInfo object, if it returns None the TarInfo object will be + excluded from the archive. + """ + self._check("aw") + + if arcname is None: + arcname = name + + # Exclude pathnames. + if exclude is not None: + import warnings + warnings.warn("use the filter argument instead", + DeprecationWarning, 2) + if exclude(name): + self._dbg(2, "tarfile: Excluded %r" % name) + return + + # Skip if somebody tries to archive the archive... + if self.name is not None and os.path.abspath(name) == self.name: + self._dbg(2, "tarfile: Skipped %r" % name) + return + + self._dbg(1, name) + + # Create a TarInfo object from the file. + tarinfo = self.gettarinfo(name, arcname) + + if tarinfo is None: + self._dbg(1, "tarfile: Unsupported type %r" % name) + return + + # Change or exclude the TarInfo object. + if filter is not None: + tarinfo = filter(tarinfo) + if tarinfo is None: + self._dbg(2, "tarfile: Excluded %r" % name) + return + + # Append the tar header and data to the archive. + if tarinfo.isreg(): + f = bltn_open(name, "rb") + self.addfile(tarinfo, f) + f.close() + + elif tarinfo.isdir(): + self.addfile(tarinfo) + if recursive: + for f in os.listdir(name): + self.add(os.path.join(name, f), os.path.join(arcname, f), + recursive, exclude, filter=filter) + + else: + self.addfile(tarinfo) + + def addfile(self, tarinfo, fileobj=None): + """Add the TarInfo object `tarinfo' to the archive. If `fileobj' is + given, tarinfo.size bytes are read from it and added to the archive. + You can create TarInfo objects using gettarinfo(). + On Windows platforms, `fileobj' should always be opened with mode + 'rb' to avoid irritation about the file size. + """ + self._check("aw") + + tarinfo = copy.copy(tarinfo) + + buf = tarinfo.tobuf(self.format, self.encoding, self.errors) + self.fileobj.write(buf) + self.offset += len(buf) + + # If there's data to follow, append it. + if fileobj is not None: + copyfileobj(fileobj, self.fileobj, tarinfo.size) + blocks, remainder = divmod(tarinfo.size, BLOCKSIZE) + if remainder > 0: + self.fileobj.write(NUL * (BLOCKSIZE - remainder)) + blocks += 1 + self.offset += blocks * BLOCKSIZE + + self.members.append(tarinfo) + + def extractall(self, path=".", members=None): + """Extract all members from the archive to the current working + directory and set owner, modification time and permissions on + directories afterwards. `path' specifies a different directory + to extract to. `members' is optional and must be a subset of the + list returned by getmembers(). + """ + directories = [] + + if members is None: + members = self + + for tarinfo in members: + if tarinfo.isdir(): + # Extract directories with a safe mode. + directories.append(tarinfo) + tarinfo = copy.copy(tarinfo) + tarinfo.mode = 0o700 + # Do not set_attrs directories, as we will do that further down + self.extract(tarinfo, path, set_attrs=not tarinfo.isdir()) + + # Reverse sort directories. + directories.sort(key=lambda a: a.name) + directories.reverse() + + # Set correct owner, mtime and filemode on directories. + for tarinfo in directories: + dirpath = os.path.join(path, tarinfo.name) + try: + self.chown(tarinfo, dirpath) + self.utime(tarinfo, dirpath) + self.chmod(tarinfo, dirpath) + except ExtractError as e: + if self.errorlevel > 1: + raise + else: + self._dbg(1, "tarfile: %s" % e) + + def extract(self, member, path="", set_attrs=True): + """Extract a member from the archive to the current working directory, + using its full name. Its file information is extracted as accurately + as possible. `member' may be a filename or a TarInfo object. You can + specify a different directory using `path'. File attributes (owner, + mtime, mode) are set unless `set_attrs' is False. + """ + self._check("r") + + if isinstance(member, str): + tarinfo = self.getmember(member) + else: + tarinfo = member + + # Prepare the link target for makelink(). + if tarinfo.islnk(): + tarinfo._link_target = os.path.join(path, tarinfo.linkname) + + try: + self._extract_member(tarinfo, os.path.join(path, tarinfo.name), + set_attrs=set_attrs) + except EnvironmentError as e: + if self.errorlevel > 0: + raise + else: + if e.filename is None: + self._dbg(1, "tarfile: %s" % e.strerror) + else: + self._dbg(1, "tarfile: %s %r" % (e.strerror, e.filename)) + except ExtractError as e: + if self.errorlevel > 1: + raise + else: + self._dbg(1, "tarfile: %s" % e) + + def extractfile(self, member): + """Extract a member from the archive as a file object. `member' may be + a filename or a TarInfo object. If `member' is a regular file, a + file-like object is returned. If `member' is a link, a file-like + object is constructed from the link's target. If `member' is none of + the above, None is returned. + The file-like object is read-only and provides the following + methods: read(), readline(), readlines(), seek() and tell() + """ + self._check("r") + + if isinstance(member, str): + tarinfo = self.getmember(member) + else: + tarinfo = member + + if tarinfo.isreg(): + return self.fileobject(self, tarinfo) + + elif tarinfo.type not in SUPPORTED_TYPES: + # If a member's type is unknown, it is treated as a + # regular file. + return self.fileobject(self, tarinfo) + + elif tarinfo.islnk() or tarinfo.issym(): + if isinstance(self.fileobj, _Stream): + # A small but ugly workaround for the case that someone tries + # to extract a (sym)link as a file-object from a non-seekable + # stream of tar blocks. + raise StreamError("cannot extract (sym)link as file object") + else: + # A (sym)link's file object is its target's file object. + return self.extractfile(self._find_link_target(tarinfo)) + else: + # If there's no data associated with the member (directory, chrdev, + # blkdev, etc.), return None instead of a file object. + return None + + def _extract_member(self, tarinfo, targetpath, set_attrs=True): + """Extract the TarInfo object tarinfo to a physical + file called targetpath. + """ + # Fetch the TarInfo object for the given name + # and build the destination pathname, replacing + # forward slashes to platform specific separators. + targetpath = targetpath.rstrip("/") + targetpath = targetpath.replace("/", os.sep) + + # Create all upper directories. + upperdirs = os.path.dirname(targetpath) + if upperdirs and not os.path.exists(upperdirs): + # Create directories that are not part of the archive with + # default permissions. + os.makedirs(upperdirs) + + if tarinfo.islnk() or tarinfo.issym(): + self._dbg(1, "%s -> %s" % (tarinfo.name, tarinfo.linkname)) + else: + self._dbg(1, tarinfo.name) + + if tarinfo.isreg(): + self.makefile(tarinfo, targetpath) + elif tarinfo.isdir(): + self.makedir(tarinfo, targetpath) + elif tarinfo.isfifo(): + self.makefifo(tarinfo, targetpath) + elif tarinfo.ischr() or tarinfo.isblk(): + self.makedev(tarinfo, targetpath) + elif tarinfo.islnk() or tarinfo.issym(): + self.makelink(tarinfo, targetpath) + elif tarinfo.type not in SUPPORTED_TYPES: + self.makeunknown(tarinfo, targetpath) + else: + self.makefile(tarinfo, targetpath) + + if set_attrs: + self.chown(tarinfo, targetpath) + if not tarinfo.issym(): + self.chmod(tarinfo, targetpath) + self.utime(tarinfo, targetpath) + + #-------------------------------------------------------------------------- + # Below are the different file methods. They are called via + # _extract_member() when extract() is called. They can be replaced in a + # subclass to implement other functionality. + + def makedir(self, tarinfo, targetpath): + """Make a directory called targetpath. + """ + try: + # Use a safe mode for the directory, the real mode is set + # later in _extract_member(). + os.mkdir(targetpath, 0o700) + except EnvironmentError as e: + if e.errno != errno.EEXIST: + raise + + def makefile(self, tarinfo, targetpath): + """Make a file called targetpath. + """ + source = self.fileobj + source.seek(tarinfo.offset_data) + target = bltn_open(targetpath, "wb") + if tarinfo.sparse is not None: + for offset, size in tarinfo.sparse: + target.seek(offset) + copyfileobj(source, target, size) + else: + copyfileobj(source, target, tarinfo.size) + target.seek(tarinfo.size) + target.truncate() + target.close() + + def makeunknown(self, tarinfo, targetpath): + """Make a file from a TarInfo object with an unknown type + at targetpath. + """ + self.makefile(tarinfo, targetpath) + self._dbg(1, "tarfile: Unknown file type %r, " \ + "extracted as regular file." % tarinfo.type) + + def makefifo(self, tarinfo, targetpath): + """Make a fifo called targetpath. + """ + if hasattr(os, "mkfifo"): + os.mkfifo(targetpath) + else: + raise ExtractError("fifo not supported by system") + + def makedev(self, tarinfo, targetpath): + """Make a character or block device called targetpath. + """ + if not hasattr(os, "mknod") or not hasattr(os, "makedev"): + raise ExtractError("special devices not supported by system") + + mode = tarinfo.mode + if tarinfo.isblk(): + mode |= stat.S_IFBLK + else: + mode |= stat.S_IFCHR + + os.mknod(targetpath, mode, + os.makedev(tarinfo.devmajor, tarinfo.devminor)) + + def makelink(self, tarinfo, targetpath): + """Make a (symbolic) link called targetpath. If it cannot be created + (platform limitation), we try to make a copy of the referenced file + instead of a link. + """ + try: + # For systems that support symbolic and hard links. + if tarinfo.issym(): + os.symlink(tarinfo.linkname, targetpath) + else: + # See extract(). + if os.path.exists(tarinfo._link_target): + os.link(tarinfo._link_target, targetpath) + else: + self._extract_member(self._find_link_target(tarinfo), + targetpath) + except symlink_exception: + if tarinfo.issym(): + linkpath = os.path.join(os.path.dirname(tarinfo.name), + tarinfo.linkname) + else: + linkpath = tarinfo.linkname + else: + try: + self._extract_member(self._find_link_target(tarinfo), + targetpath) + except KeyError: + raise ExtractError("unable to resolve link inside archive") + + def chown(self, tarinfo, targetpath): + """Set owner of targetpath according to tarinfo. + """ + if pwd and hasattr(os, "geteuid") and os.geteuid() == 0: + # We have to be root to do so. + try: + g = grp.getgrnam(tarinfo.gname)[2] + except KeyError: + g = tarinfo.gid + try: + u = pwd.getpwnam(tarinfo.uname)[2] + except KeyError: + u = tarinfo.uid + try: + if tarinfo.issym() and hasattr(os, "lchown"): + os.lchown(targetpath, u, g) + else: + if sys.platform != "os2emx": + os.chown(targetpath, u, g) + except EnvironmentError as e: + raise ExtractError("could not change owner") + + def chmod(self, tarinfo, targetpath): + """Set file permissions of targetpath according to tarinfo. + """ + if hasattr(os, 'chmod'): + try: + os.chmod(targetpath, tarinfo.mode) + except EnvironmentError as e: + raise ExtractError("could not change mode") + + def utime(self, tarinfo, targetpath): + """Set modification time of targetpath according to tarinfo. + """ + if not hasattr(os, 'utime'): + return + try: + os.utime(targetpath, (tarinfo.mtime, tarinfo.mtime)) + except EnvironmentError as e: + raise ExtractError("could not change modification time") + + #-------------------------------------------------------------------------- + def next(self): + """Return the next member of the archive as a TarInfo object, when + TarFile is opened for reading. Return None if there is no more + available. + """ + self._check("ra") + if self.firstmember is not None: + m = self.firstmember + self.firstmember = None + return m + + # Read the next block. + self.fileobj.seek(self.offset) + tarinfo = None + while True: + try: + tarinfo = self.tarinfo.fromtarfile(self) + except EOFHeaderError as e: + if self.ignore_zeros: + self._dbg(2, "0x%X: %s" % (self.offset, e)) + self.offset += BLOCKSIZE + continue + except InvalidHeaderError as e: + if self.ignore_zeros: + self._dbg(2, "0x%X: %s" % (self.offset, e)) + self.offset += BLOCKSIZE + continue + elif self.offset == 0: + raise ReadError(str(e)) + except EmptyHeaderError: + if self.offset == 0: + raise ReadError("empty file") + except TruncatedHeaderError as e: + if self.offset == 0: + raise ReadError(str(e)) + except SubsequentHeaderError as e: + raise ReadError(str(e)) + break + + if tarinfo is not None: + self.members.append(tarinfo) + else: + self._loaded = True + + return tarinfo + + #-------------------------------------------------------------------------- + # Little helper methods: + + def _getmember(self, name, tarinfo=None, normalize=False): + """Find an archive member by name from bottom to top. + If tarinfo is given, it is used as the starting point. + """ + # Ensure that all members have been loaded. + members = self.getmembers() + + # Limit the member search list up to tarinfo. + if tarinfo is not None: + members = members[:members.index(tarinfo)] + + if normalize: + name = os.path.normpath(name) + + for member in reversed(members): + if normalize: + member_name = os.path.normpath(member.name) + else: + member_name = member.name + + if name == member_name: + return member + + def _load(self): + """Read through the entire archive file and look for readable + members. + """ + while True: + tarinfo = self.next() + if tarinfo is None: + break + self._loaded = True + + def _check(self, mode=None): + """Check if TarFile is still open, and if the operation's mode + corresponds to TarFile's mode. + """ + if self.closed: + raise IOError("%s is closed" % self.__class__.__name__) + if mode is not None and self.mode not in mode: + raise IOError("bad operation for mode %r" % self.mode) + + def _find_link_target(self, tarinfo): + """Find the target member of a symlink or hardlink member in the + archive. + """ + if tarinfo.issym(): + # Always search the entire archive. + linkname = os.path.dirname(tarinfo.name) + "/" + tarinfo.linkname + limit = None + else: + # Search the archive before the link, because a hard link is + # just a reference to an already archived file. + linkname = tarinfo.linkname + limit = tarinfo + + member = self._getmember(linkname, tarinfo=limit, normalize=True) + if member is None: + raise KeyError("linkname %r not found" % linkname) + return member + + def __iter__(self): + """Provide an iterator object. + """ + if self._loaded: + return iter(self.members) + else: + return TarIter(self) + + def _dbg(self, level, msg): + """Write debugging output to sys.stderr. + """ + if level <= self.debug: + print(msg, file=sys.stderr) + + def __enter__(self): + self._check() + return self + + def __exit__(self, type, value, traceback): + if type is None: + self.close() + else: + # An exception occurred. We must not call close() because + # it would try to write end-of-archive blocks and padding. + if not self._extfileobj: + self.fileobj.close() + self.closed = True +# class TarFile + +class TarIter(object): + """Iterator Class. + + for tarinfo in TarFile(...): + suite... + """ + + def __init__(self, tarfile): + """Construct a TarIter object. + """ + self.tarfile = tarfile + self.index = 0 + def __iter__(self): + """Return iterator object. + """ + return self + + def __next__(self): + """Return the next item using TarFile's next() method. + When all members have been read, set TarFile as _loaded. + """ + # Fix for SF #1100429: Under rare circumstances it can + # happen that getmembers() is called during iteration, + # which will cause TarIter to stop prematurely. + if not self.tarfile._loaded: + tarinfo = self.tarfile.next() + if not tarinfo: + self.tarfile._loaded = True + raise StopIteration + else: + try: + tarinfo = self.tarfile.members[self.index] + except IndexError: + raise StopIteration + self.index += 1 + return tarinfo + + next = __next__ # for Python 2.x + +#-------------------- +# exported functions +#-------------------- +def is_tarfile(name): + """Return True if name points to a tar archive that we + are able to handle, else return False. + """ + try: + t = open(name) + t.close() + return True + except TarError: + return False + +bltn_open = open +open = TarFile.open diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/tarfile 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/tarfile 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3f0fa08a038a774ef810b1d753148c31b145aab9 GIT binary patch literal 86781 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 literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/tarfile.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/tarfile.py new file mode 100644 index 0000000..d66d856 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/tarfile.py @@ -0,0 +1,2607 @@ +#------------------------------------------------------------------- +# tarfile.py +#------------------------------------------------------------------- +# Copyright (C) 2002 Lars Gustaebel +# All rights reserved. +# +# Permission is hereby granted, free of charge, to any person +# obtaining a copy of this software and associated documentation +# files (the "Software"), to deal in the Software without +# restriction, including without limitation the rights to use, +# copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the +# Software is furnished to do so, subject to the following +# conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +# OTHER DEALINGS IN THE SOFTWARE. +# +from __future__ import print_function + +"""Read from and write to tar format archives. +""" + +__version__ = "$Revision$" + +version = "0.9.0" +__author__ = "Lars Gust\u00e4bel (lars@gustaebel.de)" +__date__ = "$Date: 2011-02-25 17:42:01 +0200 (Fri, 25 Feb 2011) $" +__cvsid__ = "$Id: tarfile.py 88586 2011-02-25 15:42:01Z marc-andre.lemburg $" +__credits__ = "Gustavo Niemeyer, Niels Gust\u00e4bel, Richard Townsend." + +#--------- +# Imports +#--------- +import sys +import os +import stat +import errno +import time +import struct +import copy +import re + +try: + import grp, pwd +except ImportError: + grp = pwd = None + +# os.symlink on Windows prior to 6.0 raises NotImplementedError +symlink_exception = (AttributeError, NotImplementedError) +try: + # WindowsError (1314) will be raised if the caller does not hold the + # SeCreateSymbolicLinkPrivilege privilege + symlink_exception += (WindowsError,) +except NameError: + pass + +# from tarfile import * +__all__ = ["TarFile", "TarInfo", "is_tarfile", "TarError"] + +if sys.version_info[0] < 3: + import __builtin__ as builtins +else: + import builtins + +_open = builtins.open # Since 'open' is TarFile.open + +#--------------------------------------------------------- +# tar constants +#--------------------------------------------------------- +NUL = b"\0" # the null character +BLOCKSIZE = 512 # length of processing blocks +RECORDSIZE = BLOCKSIZE * 20 # length of records +GNU_MAGIC = b"ustar \0" # magic gnu tar string +POSIX_MAGIC = b"ustar\x0000" # magic posix tar string + +LENGTH_NAME = 100 # maximum length of a filename +LENGTH_LINK = 100 # maximum length of a linkname +LENGTH_PREFIX = 155 # maximum length of the prefix field + +REGTYPE = b"0" # regular file +AREGTYPE = b"\0" # regular file +LNKTYPE = b"1" # link (inside tarfile) +SYMTYPE = b"2" # symbolic link +CHRTYPE = b"3" # character special device +BLKTYPE = b"4" # block special device +DIRTYPE = b"5" # directory +FIFOTYPE = b"6" # fifo special device +CONTTYPE = b"7" # contiguous file + +GNUTYPE_LONGNAME = b"L" # GNU tar longname +GNUTYPE_LONGLINK = b"K" # GNU tar longlink +GNUTYPE_SPARSE = b"S" # GNU tar sparse file + +XHDTYPE = b"x" # POSIX.1-2001 extended header +XGLTYPE = b"g" # POSIX.1-2001 global header +SOLARIS_XHDTYPE = b"X" # Solaris extended header + +USTAR_FORMAT = 0 # POSIX.1-1988 (ustar) format +GNU_FORMAT = 1 # GNU tar format +PAX_FORMAT = 2 # POSIX.1-2001 (pax) format +DEFAULT_FORMAT = GNU_FORMAT + +#--------------------------------------------------------- +# tarfile constants +#--------------------------------------------------------- +# File types that tarfile supports: +SUPPORTED_TYPES = (REGTYPE, AREGTYPE, LNKTYPE, + SYMTYPE, DIRTYPE, FIFOTYPE, + CONTTYPE, CHRTYPE, BLKTYPE, + GNUTYPE_LONGNAME, GNUTYPE_LONGLINK, + GNUTYPE_SPARSE) + +# File types that will be treated as a regular file. +REGULAR_TYPES = (REGTYPE, AREGTYPE, + CONTTYPE, GNUTYPE_SPARSE) + +# File types that are part of the GNU tar format. +GNU_TYPES = (GNUTYPE_LONGNAME, GNUTYPE_LONGLINK, + GNUTYPE_SPARSE) + +# Fields from a pax header that override a TarInfo attribute. +PAX_FIELDS = ("path", "linkpath", "size", "mtime", + "uid", "gid", "uname", "gname") + +# Fields from a pax header that are affected by hdrcharset. +PAX_NAME_FIELDS = set(("path", "linkpath", "uname", "gname")) + +# Fields in a pax header that are numbers, all other fields +# are treated as strings. +PAX_NUMBER_FIELDS = { + "atime": float, + "ctime": float, + "mtime": float, + "uid": int, + "gid": int, + "size": int +} + +#--------------------------------------------------------- +# Bits used in the mode field, values in octal. +#--------------------------------------------------------- +S_IFLNK = 0o120000 # symbolic link +S_IFREG = 0o100000 # regular file +S_IFBLK = 0o060000 # block device +S_IFDIR = 0o040000 # directory +S_IFCHR = 0o020000 # character device +S_IFIFO = 0o010000 # fifo + +TSUID = 0o4000 # set UID on execution +TSGID = 0o2000 # set GID on execution +TSVTX = 0o1000 # reserved + +TUREAD = 0o400 # read by owner +TUWRITE = 0o200 # write by owner +TUEXEC = 0o100 # execute/search by owner +TGREAD = 0o040 # read by group +TGWRITE = 0o020 # write by group +TGEXEC = 0o010 # execute/search by group +TOREAD = 0o004 # read by other +TOWRITE = 0o002 # write by other +TOEXEC = 0o001 # execute/search by other + +#--------------------------------------------------------- +# initialization +#--------------------------------------------------------- +if os.name in ("nt", "ce"): + ENCODING = "utf-8" +else: + ENCODING = sys.getfilesystemencoding() + +#--------------------------------------------------------- +# Some useful functions +#--------------------------------------------------------- + +def stn(s, length, encoding, errors): + """Convert a string to a null-terminated bytes object. + """ + s = s.encode(encoding, errors) + return s[:length] + (length - len(s)) * NUL + +def nts(s, encoding, errors): + """Convert a null-terminated bytes object to a string. + """ + p = s.find(b"\0") + if p != -1: + s = s[:p] + return s.decode(encoding, errors) + +def nti(s): + """Convert a number field to a python number. + """ + # There are two possible encodings for a number field, see + # itn() below. + if s[0] != chr(0o200): + try: + n = int(nts(s, "ascii", "strict") or "0", 8) + except ValueError: + raise InvalidHeaderError("invalid header") + else: + n = 0 + for i in range(len(s) - 1): + n <<= 8 + n += ord(s[i + 1]) + return n + +def itn(n, digits=8, format=DEFAULT_FORMAT): + """Convert a python number to a number field. + """ + # POSIX 1003.1-1988 requires numbers to be encoded as a string of + # octal digits followed by a null-byte, this allows values up to + # (8**(digits-1))-1. GNU tar allows storing numbers greater than + # that if necessary. A leading 0o200 byte indicates this particular + # encoding, the following digits-1 bytes are a big-endian + # representation. This allows values up to (256**(digits-1))-1. + if 0 <= n < 8 ** (digits - 1): + s = ("%0*o" % (digits - 1, n)).encode("ascii") + NUL + else: + if format != GNU_FORMAT or n >= 256 ** (digits - 1): + raise ValueError("overflow in number field") + + if n < 0: + # XXX We mimic GNU tar's behaviour with negative numbers, + # this could raise OverflowError. + n = struct.unpack("L", struct.pack("l", n))[0] + + s = bytearray() + for i in range(digits - 1): + s.insert(0, n & 0o377) + n >>= 8 + s.insert(0, 0o200) + return s + +def calc_chksums(buf): + """Calculate the checksum for a member's header by summing up all + characters except for the chksum field which is treated as if + it was filled with spaces. According to the GNU tar sources, + some tars (Sun and NeXT) calculate chksum with signed char, + which will be different if there are chars in the buffer with + the high bit set. So we calculate two checksums, unsigned and + signed. + """ + unsigned_chksum = 256 + sum(struct.unpack("148B", buf[:148]) + struct.unpack("356B", buf[156:512])) + signed_chksum = 256 + sum(struct.unpack("148b", buf[:148]) + struct.unpack("356b", buf[156:512])) + return unsigned_chksum, signed_chksum + +def copyfileobj(src, dst, length=None): + """Copy length bytes from fileobj src to fileobj dst. + If length is None, copy the entire content. + """ + if length == 0: + return + if length is None: + while True: + buf = src.read(16*1024) + if not buf: + break + dst.write(buf) + return + + BUFSIZE = 16 * 1024 + blocks, remainder = divmod(length, BUFSIZE) + for b in range(blocks): + buf = src.read(BUFSIZE) + if len(buf) < BUFSIZE: + raise IOError("end of file reached") + dst.write(buf) + + if remainder != 0: + buf = src.read(remainder) + if len(buf) < remainder: + raise IOError("end of file reached") + dst.write(buf) + return + +filemode_table = ( + ((S_IFLNK, "l"), + (S_IFREG, "-"), + (S_IFBLK, "b"), + (S_IFDIR, "d"), + (S_IFCHR, "c"), + (S_IFIFO, "p")), + + ((TUREAD, "r"),), + ((TUWRITE, "w"),), + ((TUEXEC|TSUID, "s"), + (TSUID, "S"), + (TUEXEC, "x")), + + ((TGREAD, "r"),), + ((TGWRITE, "w"),), + ((TGEXEC|TSGID, "s"), + (TSGID, "S"), + (TGEXEC, "x")), + + ((TOREAD, "r"),), + ((TOWRITE, "w"),), + ((TOEXEC|TSVTX, "t"), + (TSVTX, "T"), + (TOEXEC, "x")) +) + +def filemode(mode): + """Convert a file's mode to a string of the form + -rwxrwxrwx. + Used by TarFile.list() + """ + perm = [] + for table in filemode_table: + for bit, char in table: + if mode & bit == bit: + perm.append(char) + break + else: + perm.append("-") + return "".join(perm) + +class TarError(Exception): + """Base exception.""" + pass +class ExtractError(TarError): + """General exception for extract errors.""" + pass +class ReadError(TarError): + """Exception for unreadable tar archives.""" + pass +class CompressionError(TarError): + """Exception for unavailable compression methods.""" + pass +class StreamError(TarError): + """Exception for unsupported operations on stream-like TarFiles.""" + pass +class HeaderError(TarError): + """Base exception for header errors.""" + pass +class EmptyHeaderError(HeaderError): + """Exception for empty headers.""" + pass +class TruncatedHeaderError(HeaderError): + """Exception for truncated headers.""" + pass +class EOFHeaderError(HeaderError): + """Exception for end of file headers.""" + pass +class InvalidHeaderError(HeaderError): + """Exception for invalid headers.""" + pass +class SubsequentHeaderError(HeaderError): + """Exception for missing and invalid extended headers.""" + pass + +#--------------------------- +# internal stream interface +#--------------------------- +class _LowLevelFile(object): + """Low-level file object. Supports reading and writing. + It is used instead of a regular file object for streaming + access. + """ + + def __init__(self, name, mode): + mode = { + "r": os.O_RDONLY, + "w": os.O_WRONLY | os.O_CREAT | os.O_TRUNC, + }[mode] + if hasattr(os, "O_BINARY"): + mode |= os.O_BINARY + self.fd = os.open(name, mode, 0o666) + + def close(self): + os.close(self.fd) + + def read(self, size): + return os.read(self.fd, size) + + def write(self, s): + os.write(self.fd, s) + +class _Stream(object): + """Class that serves as an adapter between TarFile and + a stream-like object. The stream-like object only + needs to have a read() or write() method and is accessed + blockwise. Use of gzip or bzip2 compression is possible. + A stream-like object could be for example: sys.stdin, + sys.stdout, a socket, a tape device etc. + + _Stream is intended to be used only internally. + """ + + def __init__(self, name, mode, comptype, fileobj, bufsize): + """Construct a _Stream object. + """ + self._extfileobj = True + if fileobj is None: + fileobj = _LowLevelFile(name, mode) + self._extfileobj = False + + if comptype == '*': + # Enable transparent compression detection for the + # stream interface + fileobj = _StreamProxy(fileobj) + comptype = fileobj.getcomptype() + + self.name = name or "" + self.mode = mode + self.comptype = comptype + self.fileobj = fileobj + self.bufsize = bufsize + self.buf = b"" + self.pos = 0 + self.closed = False + + try: + if comptype == "gz": + try: + import zlib + except ImportError: + raise CompressionError("zlib module is not available") + self.zlib = zlib + self.crc = zlib.crc32(b"") + if mode == "r": + self._init_read_gz() + else: + self._init_write_gz() + + if comptype == "bz2": + try: + import bz2 + except ImportError: + raise CompressionError("bz2 module is not available") + if mode == "r": + self.dbuf = b"" + self.cmp = bz2.BZ2Decompressor() + else: + self.cmp = bz2.BZ2Compressor() + except: + if not self._extfileobj: + self.fileobj.close() + self.closed = True + raise + + def __del__(self): + if hasattr(self, "closed") and not self.closed: + self.close() + + def _init_write_gz(self): + """Initialize for writing with gzip compression. + """ + self.cmp = self.zlib.compressobj(9, self.zlib.DEFLATED, + -self.zlib.MAX_WBITS, + self.zlib.DEF_MEM_LEVEL, + 0) + timestamp = struct.pack(" self.bufsize: + self.fileobj.write(self.buf[:self.bufsize]) + self.buf = self.buf[self.bufsize:] + + def close(self): + """Close the _Stream object. No operation should be + done on it afterwards. + """ + if self.closed: + return + + if self.mode == "w" and self.comptype != "tar": + self.buf += self.cmp.flush() + + if self.mode == "w" and self.buf: + self.fileobj.write(self.buf) + self.buf = b"" + if self.comptype == "gz": + # The native zlib crc is an unsigned 32-bit integer, but + # the Python wrapper implicitly casts that to a signed C + # long. So, on a 32-bit box self.crc may "look negative", + # while the same crc on a 64-bit box may "look positive". + # To avoid irksome warnings from the `struct` module, force + # it to look positive on all boxes. + self.fileobj.write(struct.pack("= 0: + blocks, remainder = divmod(pos - self.pos, self.bufsize) + for i in range(blocks): + self.read(self.bufsize) + self.read(remainder) + else: + raise StreamError("seeking backwards is not allowed") + return self.pos + + def read(self, size=None): + """Return the next size number of bytes from the stream. + If size is not defined, return all bytes of the stream + up to EOF. + """ + if size is None: + t = [] + while True: + buf = self._read(self.bufsize) + if not buf: + break + t.append(buf) + buf = "".join(t) + else: + buf = self._read(size) + self.pos += len(buf) + return buf + + def _read(self, size): + """Return size bytes from the stream. + """ + if self.comptype == "tar": + return self.__read(size) + + c = len(self.dbuf) + while c < size: + buf = self.__read(self.bufsize) + if not buf: + break + try: + buf = self.cmp.decompress(buf) + except IOError: + raise ReadError("invalid compressed data") + self.dbuf += buf + c += len(buf) + buf = self.dbuf[:size] + self.dbuf = self.dbuf[size:] + return buf + + def __read(self, size): + """Return size bytes from stream. If internal buffer is empty, + read another block from the stream. + """ + c = len(self.buf) + while c < size: + buf = self.fileobj.read(self.bufsize) + if not buf: + break + self.buf += buf + c += len(buf) + buf = self.buf[:size] + self.buf = self.buf[size:] + return buf +# class _Stream + +class _StreamProxy(object): + """Small proxy class that enables transparent compression + detection for the Stream interface (mode 'r|*'). + """ + + def __init__(self, fileobj): + self.fileobj = fileobj + self.buf = self.fileobj.read(BLOCKSIZE) + + def read(self, size): + self.read = self.fileobj.read + return self.buf + + def getcomptype(self): + if self.buf.startswith(b"\037\213\010"): + return "gz" + if self.buf.startswith(b"BZh91"): + return "bz2" + return "tar" + + def close(self): + self.fileobj.close() +# class StreamProxy + +class _BZ2Proxy(object): + """Small proxy class that enables external file object + support for "r:bz2" and "w:bz2" modes. This is actually + a workaround for a limitation in bz2 module's BZ2File + class which (unlike gzip.GzipFile) has no support for + a file object argument. + """ + + blocksize = 16 * 1024 + + def __init__(self, fileobj, mode): + self.fileobj = fileobj + self.mode = mode + self.name = getattr(self.fileobj, "name", None) + self.init() + + def init(self): + import bz2 + self.pos = 0 + if self.mode == "r": + self.bz2obj = bz2.BZ2Decompressor() + self.fileobj.seek(0) + self.buf = b"" + else: + self.bz2obj = bz2.BZ2Compressor() + + def read(self, size): + x = len(self.buf) + while x < size: + raw = self.fileobj.read(self.blocksize) + if not raw: + break + data = self.bz2obj.decompress(raw) + self.buf += data + x += len(data) + + buf = self.buf[:size] + self.buf = self.buf[size:] + self.pos += len(buf) + return buf + + def seek(self, pos): + if pos < self.pos: + self.init() + self.read(pos - self.pos) + + def tell(self): + return self.pos + + def write(self, data): + self.pos += len(data) + raw = self.bz2obj.compress(data) + self.fileobj.write(raw) + + def close(self): + if self.mode == "w": + raw = self.bz2obj.flush() + self.fileobj.write(raw) +# class _BZ2Proxy + +#------------------------ +# Extraction file object +#------------------------ +class _FileInFile(object): + """A thin wrapper around an existing file object that + provides a part of its data as an individual file + object. + """ + + def __init__(self, fileobj, offset, size, blockinfo=None): + self.fileobj = fileobj + self.offset = offset + self.size = size + self.position = 0 + + if blockinfo is None: + blockinfo = [(0, size)] + + # Construct a map with data and zero blocks. + self.map_index = 0 + self.map = [] + lastpos = 0 + realpos = self.offset + for offset, size in blockinfo: + if offset > lastpos: + self.map.append((False, lastpos, offset, None)) + self.map.append((True, offset, offset + size, realpos)) + realpos += size + lastpos = offset + size + if lastpos < self.size: + self.map.append((False, lastpos, self.size, None)) + + def seekable(self): + if not hasattr(self.fileobj, "seekable"): + # XXX gzip.GzipFile and bz2.BZ2File + return True + return self.fileobj.seekable() + + def tell(self): + """Return the current file position. + """ + return self.position + + def seek(self, position): + """Seek to a position in the file. + """ + self.position = position + + def read(self, size=None): + """Read data from the file. + """ + if size is None: + size = self.size - self.position + else: + size = min(size, self.size - self.position) + + buf = b"" + while size > 0: + while True: + data, start, stop, offset = self.map[self.map_index] + if start <= self.position < stop: + break + else: + self.map_index += 1 + if self.map_index == len(self.map): + self.map_index = 0 + length = min(size, stop - self.position) + if data: + self.fileobj.seek(offset + (self.position - start)) + buf += self.fileobj.read(length) + else: + buf += NUL * length + size -= length + self.position += length + return buf +#class _FileInFile + + +class ExFileObject(object): + """File-like object for reading an archive member. + Is returned by TarFile.extractfile(). + """ + blocksize = 1024 + + def __init__(self, tarfile, tarinfo): + self.fileobj = _FileInFile(tarfile.fileobj, + tarinfo.offset_data, + tarinfo.size, + tarinfo.sparse) + self.name = tarinfo.name + self.mode = "r" + self.closed = False + self.size = tarinfo.size + + self.position = 0 + self.buffer = b"" + + def readable(self): + return True + + def writable(self): + return False + + def seekable(self): + return self.fileobj.seekable() + + def read(self, size=None): + """Read at most size bytes from the file. If size is not + present or None, read all data until EOF is reached. + """ + if self.closed: + raise ValueError("I/O operation on closed file") + + buf = b"" + if self.buffer: + if size is None: + buf = self.buffer + self.buffer = b"" + else: + buf = self.buffer[:size] + self.buffer = self.buffer[size:] + + if size is None: + buf += self.fileobj.read() + else: + buf += self.fileobj.read(size - len(buf)) + + self.position += len(buf) + return buf + + # XXX TextIOWrapper uses the read1() method. + read1 = read + + def readline(self, size=-1): + """Read one entire line from the file. If size is present + and non-negative, return a string with at most that + size, which may be an incomplete line. + """ + if self.closed: + raise ValueError("I/O operation on closed file") + + pos = self.buffer.find(b"\n") + 1 + if pos == 0: + # no newline found. + while True: + buf = self.fileobj.read(self.blocksize) + self.buffer += buf + if not buf or b"\n" in buf: + pos = self.buffer.find(b"\n") + 1 + if pos == 0: + # no newline found. + pos = len(self.buffer) + break + + if size != -1: + pos = min(size, pos) + + buf = self.buffer[:pos] + self.buffer = self.buffer[pos:] + self.position += len(buf) + return buf + + def readlines(self): + """Return a list with all remaining lines. + """ + result = [] + while True: + line = self.readline() + if not line: break + result.append(line) + return result + + def tell(self): + """Return the current file position. + """ + if self.closed: + raise ValueError("I/O operation on closed file") + + return self.position + + def seek(self, pos, whence=os.SEEK_SET): + """Seek to a position in the file. + """ + if self.closed: + raise ValueError("I/O operation on closed file") + + if whence == os.SEEK_SET: + self.position = min(max(pos, 0), self.size) + elif whence == os.SEEK_CUR: + if pos < 0: + self.position = max(self.position + pos, 0) + else: + self.position = min(self.position + pos, self.size) + elif whence == os.SEEK_END: + self.position = max(min(self.size + pos, self.size), 0) + else: + raise ValueError("Invalid argument") + + self.buffer = b"" + self.fileobj.seek(self.position) + + def close(self): + """Close the file object. + """ + self.closed = True + + def __iter__(self): + """Get an iterator over the file's lines. + """ + while True: + line = self.readline() + if not line: + break + yield line +#class ExFileObject + +#------------------ +# Exported Classes +#------------------ +class TarInfo(object): + """Informational class which holds the details about an + archive member given by a tar header block. + TarInfo objects are returned by TarFile.getmember(), + TarFile.getmembers() and TarFile.gettarinfo() and are + usually created internally. + """ + + __slots__ = ("name", "mode", "uid", "gid", "size", "mtime", + "chksum", "type", "linkname", "uname", "gname", + "devmajor", "devminor", + "offset", "offset_data", "pax_headers", "sparse", + "tarfile", "_sparse_structs", "_link_target") + + def __init__(self, name=""): + """Construct a TarInfo object. name is the optional name + of the member. + """ + self.name = name # member name + self.mode = 0o644 # file permissions + self.uid = 0 # user id + self.gid = 0 # group id + self.size = 0 # file size + self.mtime = 0 # modification time + self.chksum = 0 # header checksum + self.type = REGTYPE # member type + self.linkname = "" # link name + self.uname = "" # user name + self.gname = "" # group name + self.devmajor = 0 # device major number + self.devminor = 0 # device minor number + + self.offset = 0 # the tar header starts here + self.offset_data = 0 # the file's data starts here + + self.sparse = None # sparse member information + self.pax_headers = {} # pax header information + + # In pax headers the "name" and "linkname" field are called + # "path" and "linkpath". + def _getpath(self): + return self.name + def _setpath(self, name): + self.name = name + path = property(_getpath, _setpath) + + def _getlinkpath(self): + return self.linkname + def _setlinkpath(self, linkname): + self.linkname = linkname + linkpath = property(_getlinkpath, _setlinkpath) + + def __repr__(self): + return "<%s %r at %#x>" % (self.__class__.__name__,self.name,id(self)) + + def get_info(self): + """Return the TarInfo's attributes as a dictionary. + """ + info = { + "name": self.name, + "mode": self.mode & 0o7777, + "uid": self.uid, + "gid": self.gid, + "size": self.size, + "mtime": self.mtime, + "chksum": self.chksum, + "type": self.type, + "linkname": self.linkname, + "uname": self.uname, + "gname": self.gname, + "devmajor": self.devmajor, + "devminor": self.devminor + } + + if info["type"] == DIRTYPE and not info["name"].endswith("/"): + info["name"] += "/" + + return info + + def tobuf(self, format=DEFAULT_FORMAT, encoding=ENCODING, errors="surrogateescape"): + """Return a tar header as a string of 512 byte blocks. + """ + info = self.get_info() + + if format == USTAR_FORMAT: + return self.create_ustar_header(info, encoding, errors) + elif format == GNU_FORMAT: + return self.create_gnu_header(info, encoding, errors) + elif format == PAX_FORMAT: + return self.create_pax_header(info, encoding) + else: + raise ValueError("invalid format") + + def create_ustar_header(self, info, encoding, errors): + """Return the object as a ustar header block. + """ + info["magic"] = POSIX_MAGIC + + if len(info["linkname"]) > LENGTH_LINK: + raise ValueError("linkname is too long") + + if len(info["name"]) > LENGTH_NAME: + info["prefix"], info["name"] = self._posix_split_name(info["name"]) + + return self._create_header(info, USTAR_FORMAT, encoding, errors) + + def create_gnu_header(self, info, encoding, errors): + """Return the object as a GNU header block sequence. + """ + info["magic"] = GNU_MAGIC + + buf = b"" + if len(info["linkname"]) > LENGTH_LINK: + buf += self._create_gnu_long_header(info["linkname"], GNUTYPE_LONGLINK, encoding, errors) + + if len(info["name"]) > LENGTH_NAME: + buf += self._create_gnu_long_header(info["name"], GNUTYPE_LONGNAME, encoding, errors) + + return buf + self._create_header(info, GNU_FORMAT, encoding, errors) + + def create_pax_header(self, info, encoding): + """Return the object as a ustar header block. If it cannot be + represented this way, prepend a pax extended header sequence + with supplement information. + """ + info["magic"] = POSIX_MAGIC + pax_headers = self.pax_headers.copy() + + # Test string fields for values that exceed the field length or cannot + # be represented in ASCII encoding. + for name, hname, length in ( + ("name", "path", LENGTH_NAME), ("linkname", "linkpath", LENGTH_LINK), + ("uname", "uname", 32), ("gname", "gname", 32)): + + if hname in pax_headers: + # The pax header has priority. + continue + + # Try to encode the string as ASCII. + try: + info[name].encode("ascii", "strict") + except UnicodeEncodeError: + pax_headers[hname] = info[name] + continue + + if len(info[name]) > length: + pax_headers[hname] = info[name] + + # Test number fields for values that exceed the field limit or values + # that like to be stored as float. + for name, digits in (("uid", 8), ("gid", 8), ("size", 12), ("mtime", 12)): + if name in pax_headers: + # The pax header has priority. Avoid overflow. + info[name] = 0 + continue + + val = info[name] + if not 0 <= val < 8 ** (digits - 1) or isinstance(val, float): + pax_headers[name] = str(val) + info[name] = 0 + + # Create a pax extended header if necessary. + if pax_headers: + buf = self._create_pax_generic_header(pax_headers, XHDTYPE, encoding) + else: + buf = b"" + + return buf + self._create_header(info, USTAR_FORMAT, "ascii", "replace") + + @classmethod + def create_pax_global_header(cls, pax_headers): + """Return the object as a pax global header block sequence. + """ + return cls._create_pax_generic_header(pax_headers, XGLTYPE, "utf8") + + def _posix_split_name(self, name): + """Split a name longer than 100 chars into a prefix + and a name part. + """ + prefix = name[:LENGTH_PREFIX + 1] + while prefix and prefix[-1] != "/": + prefix = prefix[:-1] + + name = name[len(prefix):] + prefix = prefix[:-1] + + if not prefix or len(name) > LENGTH_NAME: + raise ValueError("name is too long") + return prefix, name + + @staticmethod + def _create_header(info, format, encoding, errors): + """Return a header block. info is a dictionary with file + information, format must be one of the *_FORMAT constants. + """ + parts = [ + stn(info.get("name", ""), 100, encoding, errors), + itn(info.get("mode", 0) & 0o7777, 8, format), + itn(info.get("uid", 0), 8, format), + itn(info.get("gid", 0), 8, format), + itn(info.get("size", 0), 12, format), + itn(info.get("mtime", 0), 12, format), + b" ", # checksum field + info.get("type", REGTYPE), + stn(info.get("linkname", ""), 100, encoding, errors), + info.get("magic", POSIX_MAGIC), + stn(info.get("uname", ""), 32, encoding, errors), + stn(info.get("gname", ""), 32, encoding, errors), + itn(info.get("devmajor", 0), 8, format), + itn(info.get("devminor", 0), 8, format), + stn(info.get("prefix", ""), 155, encoding, errors) + ] + + buf = struct.pack("%ds" % BLOCKSIZE, b"".join(parts)) + chksum = calc_chksums(buf[-BLOCKSIZE:])[0] + buf = buf[:-364] + ("%06o\0" % chksum).encode("ascii") + buf[-357:] + return buf + + @staticmethod + def _create_payload(payload): + """Return the string payload filled with zero bytes + up to the next 512 byte border. + """ + blocks, remainder = divmod(len(payload), BLOCKSIZE) + if remainder > 0: + payload += (BLOCKSIZE - remainder) * NUL + return payload + + @classmethod + def _create_gnu_long_header(cls, name, type, encoding, errors): + """Return a GNUTYPE_LONGNAME or GNUTYPE_LONGLINK sequence + for name. + """ + name = name.encode(encoding, errors) + NUL + + info = {} + info["name"] = "././@LongLink" + info["type"] = type + info["size"] = len(name) + info["magic"] = GNU_MAGIC + + # create extended header + name blocks. + return cls._create_header(info, USTAR_FORMAT, encoding, errors) + \ + cls._create_payload(name) + + @classmethod + def _create_pax_generic_header(cls, pax_headers, type, encoding): + """Return a POSIX.1-2008 extended or global header sequence + that contains a list of keyword, value pairs. The values + must be strings. + """ + # Check if one of the fields contains surrogate characters and thereby + # forces hdrcharset=BINARY, see _proc_pax() for more information. + binary = False + for keyword, value in pax_headers.items(): + try: + value.encode("utf8", "strict") + except UnicodeEncodeError: + binary = True + break + + records = b"" + if binary: + # Put the hdrcharset field at the beginning of the header. + records += b"21 hdrcharset=BINARY\n" + + for keyword, value in pax_headers.items(): + keyword = keyword.encode("utf8") + if binary: + # Try to restore the original byte representation of `value'. + # Needless to say, that the encoding must match the string. + value = value.encode(encoding, "surrogateescape") + else: + value = value.encode("utf8") + + l = len(keyword) + len(value) + 3 # ' ' + '=' + '\n' + n = p = 0 + while True: + n = l + len(str(p)) + if n == p: + break + p = n + records += bytes(str(p), "ascii") + b" " + keyword + b"=" + value + b"\n" + + # We use a hardcoded "././@PaxHeader" name like star does + # instead of the one that POSIX recommends. + info = {} + info["name"] = "././@PaxHeader" + info["type"] = type + info["size"] = len(records) + info["magic"] = POSIX_MAGIC + + # Create pax header + record blocks. + return cls._create_header(info, USTAR_FORMAT, "ascii", "replace") + \ + cls._create_payload(records) + + @classmethod + def frombuf(cls, buf, encoding, errors): + """Construct a TarInfo object from a 512 byte bytes object. + """ + if len(buf) == 0: + raise EmptyHeaderError("empty header") + if len(buf) != BLOCKSIZE: + raise TruncatedHeaderError("truncated header") + if buf.count(NUL) == BLOCKSIZE: + raise EOFHeaderError("end of file header") + + chksum = nti(buf[148:156]) + if chksum not in calc_chksums(buf): + raise InvalidHeaderError("bad checksum") + + obj = cls() + obj.name = nts(buf[0:100], encoding, errors) + obj.mode = nti(buf[100:108]) + obj.uid = nti(buf[108:116]) + obj.gid = nti(buf[116:124]) + obj.size = nti(buf[124:136]) + obj.mtime = nti(buf[136:148]) + obj.chksum = chksum + obj.type = buf[156:157] + obj.linkname = nts(buf[157:257], encoding, errors) + obj.uname = nts(buf[265:297], encoding, errors) + obj.gname = nts(buf[297:329], encoding, errors) + obj.devmajor = nti(buf[329:337]) + obj.devminor = nti(buf[337:345]) + prefix = nts(buf[345:500], encoding, errors) + + # Old V7 tar format represents a directory as a regular + # file with a trailing slash. + if obj.type == AREGTYPE and obj.name.endswith("/"): + obj.type = DIRTYPE + + # The old GNU sparse format occupies some of the unused + # space in the buffer for up to 4 sparse structures. + # Save the them for later processing in _proc_sparse(). + if obj.type == GNUTYPE_SPARSE: + pos = 386 + structs = [] + for i in range(4): + try: + offset = nti(buf[pos:pos + 12]) + numbytes = nti(buf[pos + 12:pos + 24]) + except ValueError: + break + structs.append((offset, numbytes)) + pos += 24 + isextended = bool(buf[482]) + origsize = nti(buf[483:495]) + obj._sparse_structs = (structs, isextended, origsize) + + # Remove redundant slashes from directories. + if obj.isdir(): + obj.name = obj.name.rstrip("/") + + # Reconstruct a ustar longname. + if prefix and obj.type not in GNU_TYPES: + obj.name = prefix + "/" + obj.name + return obj + + @classmethod + def fromtarfile(cls, tarfile): + """Return the next TarInfo object from TarFile object + tarfile. + """ + buf = tarfile.fileobj.read(BLOCKSIZE) + obj = cls.frombuf(buf, tarfile.encoding, tarfile.errors) + obj.offset = tarfile.fileobj.tell() - BLOCKSIZE + return obj._proc_member(tarfile) + + #-------------------------------------------------------------------------- + # The following are methods that are called depending on the type of a + # member. The entry point is _proc_member() which can be overridden in a + # subclass to add custom _proc_*() methods. A _proc_*() method MUST + # implement the following + # operations: + # 1. Set self.offset_data to the position where the data blocks begin, + # if there is data that follows. + # 2. Set tarfile.offset to the position where the next member's header will + # begin. + # 3. Return self or another valid TarInfo object. + def _proc_member(self, tarfile): + """Choose the right processing method depending on + the type and call it. + """ + if self.type in (GNUTYPE_LONGNAME, GNUTYPE_LONGLINK): + return self._proc_gnulong(tarfile) + elif self.type == GNUTYPE_SPARSE: + return self._proc_sparse(tarfile) + elif self.type in (XHDTYPE, XGLTYPE, SOLARIS_XHDTYPE): + return self._proc_pax(tarfile) + else: + return self._proc_builtin(tarfile) + + def _proc_builtin(self, tarfile): + """Process a builtin type or an unknown type which + will be treated as a regular file. + """ + self.offset_data = tarfile.fileobj.tell() + offset = self.offset_data + if self.isreg() or self.type not in SUPPORTED_TYPES: + # Skip the following data blocks. + offset += self._block(self.size) + tarfile.offset = offset + + # Patch the TarInfo object with saved global + # header information. + self._apply_pax_info(tarfile.pax_headers, tarfile.encoding, tarfile.errors) + + return self + + def _proc_gnulong(self, tarfile): + """Process the blocks that hold a GNU longname + or longlink member. + """ + buf = tarfile.fileobj.read(self._block(self.size)) + + # Fetch the next header and process it. + try: + next = self.fromtarfile(tarfile) + except HeaderError: + raise SubsequentHeaderError("missing or bad subsequent header") + + # Patch the TarInfo object from the next header with + # the longname information. + next.offset = self.offset + if self.type == GNUTYPE_LONGNAME: + next.name = nts(buf, tarfile.encoding, tarfile.errors) + elif self.type == GNUTYPE_LONGLINK: + next.linkname = nts(buf, tarfile.encoding, tarfile.errors) + + return next + + def _proc_sparse(self, tarfile): + """Process a GNU sparse header plus extra headers. + """ + # We already collected some sparse structures in frombuf(). + structs, isextended, origsize = self._sparse_structs + del self._sparse_structs + + # Collect sparse structures from extended header blocks. + while isextended: + buf = tarfile.fileobj.read(BLOCKSIZE) + pos = 0 + for i in range(21): + try: + offset = nti(buf[pos:pos + 12]) + numbytes = nti(buf[pos + 12:pos + 24]) + except ValueError: + break + if offset and numbytes: + structs.append((offset, numbytes)) + pos += 24 + isextended = bool(buf[504]) + self.sparse = structs + + self.offset_data = tarfile.fileobj.tell() + tarfile.offset = self.offset_data + self._block(self.size) + self.size = origsize + return self + + def _proc_pax(self, tarfile): + """Process an extended or global header as described in + POSIX.1-2008. + """ + # Read the header information. + buf = tarfile.fileobj.read(self._block(self.size)) + + # A pax header stores supplemental information for either + # the following file (extended) or all following files + # (global). + if self.type == XGLTYPE: + pax_headers = tarfile.pax_headers + else: + pax_headers = tarfile.pax_headers.copy() + + # Check if the pax header contains a hdrcharset field. This tells us + # the encoding of the path, linkpath, uname and gname fields. Normally, + # these fields are UTF-8 encoded but since POSIX.1-2008 tar + # implementations are allowed to store them as raw binary strings if + # the translation to UTF-8 fails. + match = re.search(br"\d+ hdrcharset=([^\n]+)\n", buf) + if match is not None: + pax_headers["hdrcharset"] = match.group(1).decode("utf8") + + # For the time being, we don't care about anything other than "BINARY". + # The only other value that is currently allowed by the standard is + # "ISO-IR 10646 2000 UTF-8" in other words UTF-8. + hdrcharset = pax_headers.get("hdrcharset") + if hdrcharset == "BINARY": + encoding = tarfile.encoding + else: + encoding = "utf8" + + # Parse pax header information. A record looks like that: + # "%d %s=%s\n" % (length, keyword, value). length is the size + # of the complete record including the length field itself and + # the newline. keyword and value are both UTF-8 encoded strings. + regex = re.compile(br"(\d+) ([^=]+)=") + pos = 0 + while True: + match = regex.match(buf, pos) + if not match: + break + + length, keyword = match.groups() + length = int(length) + value = buf[match.end(2) + 1:match.start(1) + length - 1] + + # Normally, we could just use "utf8" as the encoding and "strict" + # as the error handler, but we better not take the risk. For + # example, GNU tar <= 1.23 is known to store filenames it cannot + # translate to UTF-8 as raw strings (unfortunately without a + # hdrcharset=BINARY header). + # We first try the strict standard encoding, and if that fails we + # fall back on the user's encoding and error handler. + keyword = self._decode_pax_field(keyword, "utf8", "utf8", + tarfile.errors) + if keyword in PAX_NAME_FIELDS: + value = self._decode_pax_field(value, encoding, tarfile.encoding, + tarfile.errors) + else: + value = self._decode_pax_field(value, "utf8", "utf8", + tarfile.errors) + + pax_headers[keyword] = value + pos += length + + # Fetch the next header. + try: + next = self.fromtarfile(tarfile) + except HeaderError: + raise SubsequentHeaderError("missing or bad subsequent header") + + # Process GNU sparse information. + if "GNU.sparse.map" in pax_headers: + # GNU extended sparse format version 0.1. + self._proc_gnusparse_01(next, pax_headers) + + elif "GNU.sparse.size" in pax_headers: + # GNU extended sparse format version 0.0. + self._proc_gnusparse_00(next, pax_headers, buf) + + elif pax_headers.get("GNU.sparse.major") == "1" and pax_headers.get("GNU.sparse.minor") == "0": + # GNU extended sparse format version 1.0. + self._proc_gnusparse_10(next, pax_headers, tarfile) + + if self.type in (XHDTYPE, SOLARIS_XHDTYPE): + # Patch the TarInfo object with the extended header info. + next._apply_pax_info(pax_headers, tarfile.encoding, tarfile.errors) + next.offset = self.offset + + if "size" in pax_headers: + # If the extended header replaces the size field, + # we need to recalculate the offset where the next + # header starts. + offset = next.offset_data + if next.isreg() or next.type not in SUPPORTED_TYPES: + offset += next._block(next.size) + tarfile.offset = offset + + return next + + def _proc_gnusparse_00(self, next, pax_headers, buf): + """Process a GNU tar extended sparse header, version 0.0. + """ + offsets = [] + for match in re.finditer(br"\d+ GNU.sparse.offset=(\d+)\n", buf): + offsets.append(int(match.group(1))) + numbytes = [] + for match in re.finditer(br"\d+ GNU.sparse.numbytes=(\d+)\n", buf): + numbytes.append(int(match.group(1))) + next.sparse = list(zip(offsets, numbytes)) + + def _proc_gnusparse_01(self, next, pax_headers): + """Process a GNU tar extended sparse header, version 0.1. + """ + sparse = [int(x) for x in pax_headers["GNU.sparse.map"].split(",")] + next.sparse = list(zip(sparse[::2], sparse[1::2])) + + def _proc_gnusparse_10(self, next, pax_headers, tarfile): + """Process a GNU tar extended sparse header, version 1.0. + """ + fields = None + sparse = [] + buf = tarfile.fileobj.read(BLOCKSIZE) + fields, buf = buf.split(b"\n", 1) + fields = int(fields) + while len(sparse) < fields * 2: + if b"\n" not in buf: + buf += tarfile.fileobj.read(BLOCKSIZE) + number, buf = buf.split(b"\n", 1) + sparse.append(int(number)) + next.offset_data = tarfile.fileobj.tell() + next.sparse = list(zip(sparse[::2], sparse[1::2])) + + def _apply_pax_info(self, pax_headers, encoding, errors): + """Replace fields with supplemental information from a previous + pax extended or global header. + """ + for keyword, value in pax_headers.items(): + if keyword == "GNU.sparse.name": + setattr(self, "path", value) + elif keyword == "GNU.sparse.size": + setattr(self, "size", int(value)) + elif keyword == "GNU.sparse.realsize": + setattr(self, "size", int(value)) + elif keyword in PAX_FIELDS: + if keyword in PAX_NUMBER_FIELDS: + try: + value = PAX_NUMBER_FIELDS[keyword](value) + except ValueError: + value = 0 + if keyword == "path": + value = value.rstrip("/") + setattr(self, keyword, value) + + self.pax_headers = pax_headers.copy() + + def _decode_pax_field(self, value, encoding, fallback_encoding, fallback_errors): + """Decode a single field from a pax record. + """ + try: + return value.decode(encoding, "strict") + except UnicodeDecodeError: + return value.decode(fallback_encoding, fallback_errors) + + def _block(self, count): + """Round up a byte count by BLOCKSIZE and return it, + e.g. _block(834) => 1024. + """ + blocks, remainder = divmod(count, BLOCKSIZE) + if remainder: + blocks += 1 + return blocks * BLOCKSIZE + + def isreg(self): + return self.type in REGULAR_TYPES + def isfile(self): + return self.isreg() + def isdir(self): + return self.type == DIRTYPE + def issym(self): + return self.type == SYMTYPE + def islnk(self): + return self.type == LNKTYPE + def ischr(self): + return self.type == CHRTYPE + def isblk(self): + return self.type == BLKTYPE + def isfifo(self): + return self.type == FIFOTYPE + def issparse(self): + return self.sparse is not None + def isdev(self): + return self.type in (CHRTYPE, BLKTYPE, FIFOTYPE) +# class TarInfo + +class TarFile(object): + """The TarFile Class provides an interface to tar archives. + """ + + debug = 0 # May be set from 0 (no msgs) to 3 (all msgs) + + dereference = False # If true, add content of linked file to the + # tar file, else the link. + + ignore_zeros = False # If true, skips empty or invalid blocks and + # continues processing. + + errorlevel = 1 # If 0, fatal errors only appear in debug + # messages (if debug >= 0). If > 0, errors + # are passed to the caller as exceptions. + + format = DEFAULT_FORMAT # The format to use when creating an archive. + + encoding = ENCODING # Encoding for 8-bit character strings. + + errors = None # Error handler for unicode conversion. + + tarinfo = TarInfo # The default TarInfo class to use. + + fileobject = ExFileObject # The default ExFileObject class to use. + + def __init__(self, name=None, mode="r", fileobj=None, format=None, + tarinfo=None, dereference=None, ignore_zeros=None, encoding=None, + errors="surrogateescape", pax_headers=None, debug=None, errorlevel=None): + """Open an (uncompressed) tar archive `name'. `mode' is either 'r' to + read from an existing archive, 'a' to append data to an existing + file or 'w' to create a new file overwriting an existing one. `mode' + defaults to 'r'. + If `fileobj' is given, it is used for reading or writing data. If it + can be determined, `mode' is overridden by `fileobj's mode. + `fileobj' is not closed, when TarFile is closed. + """ + if len(mode) > 1 or mode not in "raw": + raise ValueError("mode must be 'r', 'a' or 'w'") + self.mode = mode + self._mode = {"r": "rb", "a": "r+b", "w": "wb"}[mode] + + if not fileobj: + if self.mode == "a" and not os.path.exists(name): + # Create nonexistent files in append mode. + self.mode = "w" + self._mode = "wb" + fileobj = bltn_open(name, self._mode) + self._extfileobj = False + else: + if name is None and hasattr(fileobj, "name"): + name = fileobj.name + if hasattr(fileobj, "mode"): + self._mode = fileobj.mode + self._extfileobj = True + self.name = os.path.abspath(name) if name else None + self.fileobj = fileobj + + # Init attributes. + if format is not None: + self.format = format + if tarinfo is not None: + self.tarinfo = tarinfo + if dereference is not None: + self.dereference = dereference + if ignore_zeros is not None: + self.ignore_zeros = ignore_zeros + if encoding is not None: + self.encoding = encoding + self.errors = errors + + if pax_headers is not None and self.format == PAX_FORMAT: + self.pax_headers = pax_headers + else: + self.pax_headers = {} + + if debug is not None: + self.debug = debug + if errorlevel is not None: + self.errorlevel = errorlevel + + # Init datastructures. + self.closed = False + self.members = [] # list of members as TarInfo objects + self._loaded = False # flag if all members have been read + self.offset = self.fileobj.tell() + # current position in the archive file + self.inodes = {} # dictionary caching the inodes of + # archive members already added + + try: + if self.mode == "r": + self.firstmember = None + self.firstmember = self.next() + + if self.mode == "a": + # Move to the end of the archive, + # before the first empty block. + while True: + self.fileobj.seek(self.offset) + try: + tarinfo = self.tarinfo.fromtarfile(self) + self.members.append(tarinfo) + except EOFHeaderError: + self.fileobj.seek(self.offset) + break + except HeaderError as e: + raise ReadError(str(e)) + + if self.mode in "aw": + self._loaded = True + + if self.pax_headers: + buf = self.tarinfo.create_pax_global_header(self.pax_headers.copy()) + self.fileobj.write(buf) + self.offset += len(buf) + except: + if not self._extfileobj: + self.fileobj.close() + self.closed = True + raise + + #-------------------------------------------------------------------------- + # Below are the classmethods which act as alternate constructors to the + # TarFile class. The open() method is the only one that is needed for + # public use; it is the "super"-constructor and is able to select an + # adequate "sub"-constructor for a particular compression using the mapping + # from OPEN_METH. + # + # This concept allows one to subclass TarFile without losing the comfort of + # the super-constructor. A sub-constructor is registered and made available + # by adding it to the mapping in OPEN_METH. + + @classmethod + def open(cls, name=None, mode="r", fileobj=None, bufsize=RECORDSIZE, **kwargs): + """Open a tar archive for reading, writing or appending. Return + an appropriate TarFile class. + + mode: + 'r' or 'r:*' open for reading with transparent compression + 'r:' open for reading exclusively uncompressed + 'r:gz' open for reading with gzip compression + 'r:bz2' open for reading with bzip2 compression + 'a' or 'a:' open for appending, creating the file if necessary + 'w' or 'w:' open for writing without compression + 'w:gz' open for writing with gzip compression + 'w:bz2' open for writing with bzip2 compression + + 'r|*' open a stream of tar blocks with transparent compression + 'r|' open an uncompressed stream of tar blocks for reading + 'r|gz' open a gzip compressed stream of tar blocks + 'r|bz2' open a bzip2 compressed stream of tar blocks + 'w|' open an uncompressed stream for writing + 'w|gz' open a gzip compressed stream for writing + 'w|bz2' open a bzip2 compressed stream for writing + """ + + if not name and not fileobj: + raise ValueError("nothing to open") + + if mode in ("r", "r:*"): + # Find out which *open() is appropriate for opening the file. + for comptype in cls.OPEN_METH: + func = getattr(cls, cls.OPEN_METH[comptype]) + if fileobj is not None: + saved_pos = fileobj.tell() + try: + return func(name, "r", fileobj, **kwargs) + except (ReadError, CompressionError) as e: + if fileobj is not None: + fileobj.seek(saved_pos) + continue + raise ReadError("file could not be opened successfully") + + elif ":" in mode: + filemode, comptype = mode.split(":", 1) + filemode = filemode or "r" + comptype = comptype or "tar" + + # Select the *open() function according to + # given compression. + if comptype in cls.OPEN_METH: + func = getattr(cls, cls.OPEN_METH[comptype]) + else: + raise CompressionError("unknown compression type %r" % comptype) + return func(name, filemode, fileobj, **kwargs) + + elif "|" in mode: + filemode, comptype = mode.split("|", 1) + filemode = filemode or "r" + comptype = comptype or "tar" + + if filemode not in "rw": + raise ValueError("mode must be 'r' or 'w'") + + stream = _Stream(name, filemode, comptype, fileobj, bufsize) + try: + t = cls(name, filemode, stream, **kwargs) + except: + stream.close() + raise + t._extfileobj = False + return t + + elif mode in "aw": + return cls.taropen(name, mode, fileobj, **kwargs) + + raise ValueError("undiscernible mode") + + @classmethod + def taropen(cls, name, mode="r", fileobj=None, **kwargs): + """Open uncompressed tar archive name for reading or writing. + """ + if len(mode) > 1 or mode not in "raw": + raise ValueError("mode must be 'r', 'a' or 'w'") + return cls(name, mode, fileobj, **kwargs) + + @classmethod + def gzopen(cls, name, mode="r", fileobj=None, compresslevel=9, **kwargs): + """Open gzip compressed tar archive name for reading or writing. + Appending is not allowed. + """ + if len(mode) > 1 or mode not in "rw": + raise ValueError("mode must be 'r' or 'w'") + + try: + import gzip + gzip.GzipFile + except (ImportError, AttributeError): + raise CompressionError("gzip module is not available") + + extfileobj = fileobj is not None + try: + fileobj = gzip.GzipFile(name, mode + "b", compresslevel, fileobj) + t = cls.taropen(name, mode, fileobj, **kwargs) + except IOError: + if not extfileobj and fileobj is not None: + fileobj.close() + if fileobj is None: + raise + raise ReadError("not a gzip file") + except: + if not extfileobj and fileobj is not None: + fileobj.close() + raise + t._extfileobj = extfileobj + return t + + @classmethod + def bz2open(cls, name, mode="r", fileobj=None, compresslevel=9, **kwargs): + """Open bzip2 compressed tar archive name for reading or writing. + Appending is not allowed. + """ + if len(mode) > 1 or mode not in "rw": + raise ValueError("mode must be 'r' or 'w'.") + + try: + import bz2 + except ImportError: + raise CompressionError("bz2 module is not available") + + if fileobj is not None: + fileobj = _BZ2Proxy(fileobj, mode) + else: + fileobj = bz2.BZ2File(name, mode, compresslevel=compresslevel) + + try: + t = cls.taropen(name, mode, fileobj, **kwargs) + except (IOError, EOFError): + fileobj.close() + raise ReadError("not a bzip2 file") + t._extfileobj = False + return t + + # All *open() methods are registered here. + OPEN_METH = { + "tar": "taropen", # uncompressed tar + "gz": "gzopen", # gzip compressed tar + "bz2": "bz2open" # bzip2 compressed tar + } + + #-------------------------------------------------------------------------- + # The public methods which TarFile provides: + + def close(self): + """Close the TarFile. In write-mode, two finishing zero blocks are + appended to the archive. + """ + if self.closed: + return + + if self.mode in "aw": + self.fileobj.write(NUL * (BLOCKSIZE * 2)) + self.offset += (BLOCKSIZE * 2) + # fill up the end with zero-blocks + # (like option -b20 for tar does) + blocks, remainder = divmod(self.offset, RECORDSIZE) + if remainder > 0: + self.fileobj.write(NUL * (RECORDSIZE - remainder)) + + if not self._extfileobj: + self.fileobj.close() + self.closed = True + + def getmember(self, name): + """Return a TarInfo object for member `name'. If `name' can not be + found in the archive, KeyError is raised. If a member occurs more + than once in the archive, its last occurrence is assumed to be the + most up-to-date version. + """ + tarinfo = self._getmember(name) + if tarinfo is None: + raise KeyError("filename %r not found" % name) + return tarinfo + + def getmembers(self): + """Return the members of the archive as a list of TarInfo objects. The + list has the same order as the members in the archive. + """ + self._check() + if not self._loaded: # if we want to obtain a list of + self._load() # all members, we first have to + # scan the whole archive. + return self.members + + def getnames(self): + """Return the members of the archive as a list of their names. It has + the same order as the list returned by getmembers(). + """ + return [tarinfo.name for tarinfo in self.getmembers()] + + def gettarinfo(self, name=None, arcname=None, fileobj=None): + """Create a TarInfo object for either the file `name' or the file + object `fileobj' (using os.fstat on its file descriptor). You can + modify some of the TarInfo's attributes before you add it using + addfile(). If given, `arcname' specifies an alternative name for the + file in the archive. + """ + self._check("aw") + + # When fileobj is given, replace name by + # fileobj's real name. + if fileobj is not None: + name = fileobj.name + + # Building the name of the member in the archive. + # Backward slashes are converted to forward slashes, + # Absolute paths are turned to relative paths. + if arcname is None: + arcname = name + drv, arcname = os.path.splitdrive(arcname) + arcname = arcname.replace(os.sep, "/") + arcname = arcname.lstrip("/") + + # Now, fill the TarInfo object with + # information specific for the file. + tarinfo = self.tarinfo() + tarinfo.tarfile = self + + # Use os.stat or os.lstat, depending on platform + # and if symlinks shall be resolved. + if fileobj is None: + if hasattr(os, "lstat") and not self.dereference: + statres = os.lstat(name) + else: + statres = os.stat(name) + else: + statres = os.fstat(fileobj.fileno()) + linkname = "" + + stmd = statres.st_mode + if stat.S_ISREG(stmd): + inode = (statres.st_ino, statres.st_dev) + if not self.dereference and statres.st_nlink > 1 and \ + inode in self.inodes and arcname != self.inodes[inode]: + # Is it a hardlink to an already + # archived file? + type = LNKTYPE + linkname = self.inodes[inode] + else: + # The inode is added only if its valid. + # For win32 it is always 0. + type = REGTYPE + if inode[0]: + self.inodes[inode] = arcname + elif stat.S_ISDIR(stmd): + type = DIRTYPE + elif stat.S_ISFIFO(stmd): + type = FIFOTYPE + elif stat.S_ISLNK(stmd): + type = SYMTYPE + linkname = os.readlink(name) + elif stat.S_ISCHR(stmd): + type = CHRTYPE + elif stat.S_ISBLK(stmd): + type = BLKTYPE + else: + return None + + # Fill the TarInfo object with all + # information we can get. + tarinfo.name = arcname + tarinfo.mode = stmd + tarinfo.uid = statres.st_uid + tarinfo.gid = statres.st_gid + if type == REGTYPE: + tarinfo.size = statres.st_size + else: + tarinfo.size = 0 + tarinfo.mtime = statres.st_mtime + tarinfo.type = type + tarinfo.linkname = linkname + if pwd: + try: + tarinfo.uname = pwd.getpwuid(tarinfo.uid)[0] + except KeyError: + pass + if grp: + try: + tarinfo.gname = grp.getgrgid(tarinfo.gid)[0] + except KeyError: + pass + + if type in (CHRTYPE, BLKTYPE): + if hasattr(os, "major") and hasattr(os, "minor"): + tarinfo.devmajor = os.major(statres.st_rdev) + tarinfo.devminor = os.minor(statres.st_rdev) + return tarinfo + + def list(self, verbose=True): + """Print a table of contents to sys.stdout. If `verbose' is False, only + the names of the members are printed. If it is True, an `ls -l'-like + output is produced. + """ + self._check() + + for tarinfo in self: + if verbose: + print(filemode(tarinfo.mode), end=' ') + print("%s/%s" % (tarinfo.uname or tarinfo.uid, + tarinfo.gname or tarinfo.gid), end=' ') + if tarinfo.ischr() or tarinfo.isblk(): + print("%10s" % ("%d,%d" \ + % (tarinfo.devmajor, tarinfo.devminor)), end=' ') + else: + print("%10d" % tarinfo.size, end=' ') + print("%d-%02d-%02d %02d:%02d:%02d" \ + % time.localtime(tarinfo.mtime)[:6], end=' ') + + print(tarinfo.name + ("/" if tarinfo.isdir() else ""), end=' ') + + if verbose: + if tarinfo.issym(): + print("->", tarinfo.linkname, end=' ') + if tarinfo.islnk(): + print("link to", tarinfo.linkname, end=' ') + print() + + def add(self, name, arcname=None, recursive=True, exclude=None, filter=None): + """Add the file `name' to the archive. `name' may be any type of file + (directory, fifo, symbolic link, etc.). If given, `arcname' + specifies an alternative name for the file in the archive. + Directories are added recursively by default. This can be avoided by + setting `recursive' to False. `exclude' is a function that should + return True for each filename to be excluded. `filter' is a function + that expects a TarInfo object argument and returns the changed + TarInfo object, if it returns None the TarInfo object will be + excluded from the archive. + """ + self._check("aw") + + if arcname is None: + arcname = name + + # Exclude pathnames. + if exclude is not None: + import warnings + warnings.warn("use the filter argument instead", + DeprecationWarning, 2) + if exclude(name): + self._dbg(2, "tarfile: Excluded %r" % name) + return + + # Skip if somebody tries to archive the archive... + if self.name is not None and os.path.abspath(name) == self.name: + self._dbg(2, "tarfile: Skipped %r" % name) + return + + self._dbg(1, name) + + # Create a TarInfo object from the file. + tarinfo = self.gettarinfo(name, arcname) + + if tarinfo is None: + self._dbg(1, "tarfile: Unsupported type %r" % name) + return + + # Change or exclude the TarInfo object. + if filter is not None: + tarinfo = filter(tarinfo) + if tarinfo is None: + self._dbg(2, "tarfile: Excluded %r" % name) + return + + # Append the tar header and data to the archive. + if tarinfo.isreg(): + f = bltn_open(name, "rb") + self.addfile(tarinfo, f) + f.close() + + elif tarinfo.isdir(): + self.addfile(tarinfo) + if recursive: + for f in os.listdir(name): + self.add(os.path.join(name, f), os.path.join(arcname, f), + recursive, exclude, filter=filter) + + else: + self.addfile(tarinfo) + + def addfile(self, tarinfo, fileobj=None): + """Add the TarInfo object `tarinfo' to the archive. If `fileobj' is + given, tarinfo.size bytes are read from it and added to the archive. + You can create TarInfo objects using gettarinfo(). + On Windows platforms, `fileobj' should always be opened with mode + 'rb' to avoid irritation about the file size. + """ + self._check("aw") + + tarinfo = copy.copy(tarinfo) + + buf = tarinfo.tobuf(self.format, self.encoding, self.errors) + self.fileobj.write(buf) + self.offset += len(buf) + + # If there's data to follow, append it. + if fileobj is not None: + copyfileobj(fileobj, self.fileobj, tarinfo.size) + blocks, remainder = divmod(tarinfo.size, BLOCKSIZE) + if remainder > 0: + self.fileobj.write(NUL * (BLOCKSIZE - remainder)) + blocks += 1 + self.offset += blocks * BLOCKSIZE + + self.members.append(tarinfo) + + def extractall(self, path=".", members=None): + """Extract all members from the archive to the current working + directory and set owner, modification time and permissions on + directories afterwards. `path' specifies a different directory + to extract to. `members' is optional and must be a subset of the + list returned by getmembers(). + """ + directories = [] + + if members is None: + members = self + + for tarinfo in members: + if tarinfo.isdir(): + # Extract directories with a safe mode. + directories.append(tarinfo) + tarinfo = copy.copy(tarinfo) + tarinfo.mode = 0o700 + # Do not set_attrs directories, as we will do that further down + self.extract(tarinfo, path, set_attrs=not tarinfo.isdir()) + + # Reverse sort directories. + directories.sort(key=lambda a: a.name) + directories.reverse() + + # Set correct owner, mtime and filemode on directories. + for tarinfo in directories: + dirpath = os.path.join(path, tarinfo.name) + try: + self.chown(tarinfo, dirpath) + self.utime(tarinfo, dirpath) + self.chmod(tarinfo, dirpath) + except ExtractError as e: + if self.errorlevel > 1: + raise + else: + self._dbg(1, "tarfile: %s" % e) + + def extract(self, member, path="", set_attrs=True): + """Extract a member from the archive to the current working directory, + using its full name. Its file information is extracted as accurately + as possible. `member' may be a filename or a TarInfo object. You can + specify a different directory using `path'. File attributes (owner, + mtime, mode) are set unless `set_attrs' is False. + """ + self._check("r") + + if isinstance(member, str): + tarinfo = self.getmember(member) + else: + tarinfo = member + + # Prepare the link target for makelink(). + if tarinfo.islnk(): + tarinfo._link_target = os.path.join(path, tarinfo.linkname) + + try: + self._extract_member(tarinfo, os.path.join(path, tarinfo.name), + set_attrs=set_attrs) + except EnvironmentError as e: + if self.errorlevel > 0: + raise + else: + if e.filename is None: + self._dbg(1, "tarfile: %s" % e.strerror) + else: + self._dbg(1, "tarfile: %s %r" % (e.strerror, e.filename)) + except ExtractError as e: + if self.errorlevel > 1: + raise + else: + self._dbg(1, "tarfile: %s" % e) + + def extractfile(self, member): + """Extract a member from the archive as a file object. `member' may be + a filename or a TarInfo object. If `member' is a regular file, a + file-like object is returned. If `member' is a link, a file-like + object is constructed from the link's target. If `member' is none of + the above, None is returned. + The file-like object is read-only and provides the following + methods: read(), readline(), readlines(), seek() and tell() + """ + self._check("r") + + if isinstance(member, str): + tarinfo = self.getmember(member) + else: + tarinfo = member + + if tarinfo.isreg(): + return self.fileobject(self, tarinfo) + + elif tarinfo.type not in SUPPORTED_TYPES: + # If a member's type is unknown, it is treated as a + # regular file. + return self.fileobject(self, tarinfo) + + elif tarinfo.islnk() or tarinfo.issym(): + if isinstance(self.fileobj, _Stream): + # A small but ugly workaround for the case that someone tries + # to extract a (sym)link as a file-object from a non-seekable + # stream of tar blocks. + raise StreamError("cannot extract (sym)link as file object") + else: + # A (sym)link's file object is its target's file object. + return self.extractfile(self._find_link_target(tarinfo)) + else: + # If there's no data associated with the member (directory, chrdev, + # blkdev, etc.), return None instead of a file object. + return None + + def _extract_member(self, tarinfo, targetpath, set_attrs=True): + """Extract the TarInfo object tarinfo to a physical + file called targetpath. + """ + # Fetch the TarInfo object for the given name + # and build the destination pathname, replacing + # forward slashes to platform specific separators. + targetpath = targetpath.rstrip("/") + targetpath = targetpath.replace("/", os.sep) + + # Create all upper directories. + upperdirs = os.path.dirname(targetpath) + if upperdirs and not os.path.exists(upperdirs): + # Create directories that are not part of the archive with + # default permissions. + os.makedirs(upperdirs) + + if tarinfo.islnk() or tarinfo.issym(): + self._dbg(1, "%s -> %s" % (tarinfo.name, tarinfo.linkname)) + else: + self._dbg(1, tarinfo.name) + + if tarinfo.isreg(): + self.makefile(tarinfo, targetpath) + elif tarinfo.isdir(): + self.makedir(tarinfo, targetpath) + elif tarinfo.isfifo(): + self.makefifo(tarinfo, targetpath) + elif tarinfo.ischr() or tarinfo.isblk(): + self.makedev(tarinfo, targetpath) + elif tarinfo.islnk() or tarinfo.issym(): + self.makelink(tarinfo, targetpath) + elif tarinfo.type not in SUPPORTED_TYPES: + self.makeunknown(tarinfo, targetpath) + else: + self.makefile(tarinfo, targetpath) + + if set_attrs: + self.chown(tarinfo, targetpath) + if not tarinfo.issym(): + self.chmod(tarinfo, targetpath) + self.utime(tarinfo, targetpath) + + #-------------------------------------------------------------------------- + # Below are the different file methods. They are called via + # _extract_member() when extract() is called. They can be replaced in a + # subclass to implement other functionality. + + def makedir(self, tarinfo, targetpath): + """Make a directory called targetpath. + """ + try: + # Use a safe mode for the directory, the real mode is set + # later in _extract_member(). + os.mkdir(targetpath, 0o700) + except EnvironmentError as e: + if e.errno != errno.EEXIST: + raise + + def makefile(self, tarinfo, targetpath): + """Make a file called targetpath. + """ + source = self.fileobj + source.seek(tarinfo.offset_data) + target = bltn_open(targetpath, "wb") + if tarinfo.sparse is not None: + for offset, size in tarinfo.sparse: + target.seek(offset) + copyfileobj(source, target, size) + else: + copyfileobj(source, target, tarinfo.size) + target.seek(tarinfo.size) + target.truncate() + target.close() + + def makeunknown(self, tarinfo, targetpath): + """Make a file from a TarInfo object with an unknown type + at targetpath. + """ + self.makefile(tarinfo, targetpath) + self._dbg(1, "tarfile: Unknown file type %r, " \ + "extracted as regular file." % tarinfo.type) + + def makefifo(self, tarinfo, targetpath): + """Make a fifo called targetpath. + """ + if hasattr(os, "mkfifo"): + os.mkfifo(targetpath) + else: + raise ExtractError("fifo not supported by system") + + def makedev(self, tarinfo, targetpath): + """Make a character or block device called targetpath. + """ + if not hasattr(os, "mknod") or not hasattr(os, "makedev"): + raise ExtractError("special devices not supported by system") + + mode = tarinfo.mode + if tarinfo.isblk(): + mode |= stat.S_IFBLK + else: + mode |= stat.S_IFCHR + + os.mknod(targetpath, mode, + os.makedev(tarinfo.devmajor, tarinfo.devminor)) + + def makelink(self, tarinfo, targetpath): + """Make a (symbolic) link called targetpath. If it cannot be created + (platform limitation), we try to make a copy of the referenced file + instead of a link. + """ + try: + # For systems that support symbolic and hard links. + if tarinfo.issym(): + os.symlink(tarinfo.linkname, targetpath) + else: + # See extract(). + if os.path.exists(tarinfo._link_target): + os.link(tarinfo._link_target, targetpath) + else: + self._extract_member(self._find_link_target(tarinfo), + targetpath) + except symlink_exception: + if tarinfo.issym(): + linkpath = os.path.join(os.path.dirname(tarinfo.name), + tarinfo.linkname) + else: + linkpath = tarinfo.linkname + else: + try: + self._extract_member(self._find_link_target(tarinfo), + targetpath) + except KeyError: + raise ExtractError("unable to resolve link inside archive") + + def chown(self, tarinfo, targetpath): + """Set owner of targetpath according to tarinfo. + """ + if pwd and hasattr(os, "geteuid") and os.geteuid() == 0: + # We have to be root to do so. + try: + g = grp.getgrnam(tarinfo.gname)[2] + except KeyError: + g = tarinfo.gid + try: + u = pwd.getpwnam(tarinfo.uname)[2] + except KeyError: + u = tarinfo.uid + try: + if tarinfo.issym() and hasattr(os, "lchown"): + os.lchown(targetpath, u, g) + else: + if sys.platform != "os2emx": + os.chown(targetpath, u, g) + except EnvironmentError as e: + raise ExtractError("could not change owner") + + def chmod(self, tarinfo, targetpath): + """Set file permissions of targetpath according to tarinfo. + """ + if hasattr(os, 'chmod'): + try: + os.chmod(targetpath, tarinfo.mode) + except EnvironmentError as e: + raise ExtractError("could not change mode") + + def utime(self, tarinfo, targetpath): + """Set modification time of targetpath according to tarinfo. + """ + if not hasattr(os, 'utime'): + return + try: + os.utime(targetpath, (tarinfo.mtime, tarinfo.mtime)) + except EnvironmentError as e: + raise ExtractError("could not change modification time") + + #-------------------------------------------------------------------------- + def next(self): + """Return the next member of the archive as a TarInfo object, when + TarFile is opened for reading. Return None if there is no more + available. + """ + self._check("ra") + if self.firstmember is not None: + m = self.firstmember + self.firstmember = None + return m + + # Read the next block. + self.fileobj.seek(self.offset) + tarinfo = None + while True: + try: + tarinfo = self.tarinfo.fromtarfile(self) + except EOFHeaderError as e: + if self.ignore_zeros: + self._dbg(2, "0x%X: %s" % (self.offset, e)) + self.offset += BLOCKSIZE + continue + except InvalidHeaderError as e: + if self.ignore_zeros: + self._dbg(2, "0x%X: %s" % (self.offset, e)) + self.offset += BLOCKSIZE + continue + elif self.offset == 0: + raise ReadError(str(e)) + except EmptyHeaderError: + if self.offset == 0: + raise ReadError("empty file") + except TruncatedHeaderError as e: + if self.offset == 0: + raise ReadError(str(e)) + except SubsequentHeaderError as e: + raise ReadError(str(e)) + break + + if tarinfo is not None: + self.members.append(tarinfo) + else: + self._loaded = True + + return tarinfo + + #-------------------------------------------------------------------------- + # Little helper methods: + + def _getmember(self, name, tarinfo=None, normalize=False): + """Find an archive member by name from bottom to top. + If tarinfo is given, it is used as the starting point. + """ + # Ensure that all members have been loaded. + members = self.getmembers() + + # Limit the member search list up to tarinfo. + if tarinfo is not None: + members = members[:members.index(tarinfo)] + + if normalize: + name = os.path.normpath(name) + + for member in reversed(members): + if normalize: + member_name = os.path.normpath(member.name) + else: + member_name = member.name + + if name == member_name: + return member + + def _load(self): + """Read through the entire archive file and look for readable + members. + """ + while True: + tarinfo = self.next() + if tarinfo is None: + break + self._loaded = True + + def _check(self, mode=None): + """Check if TarFile is still open, and if the operation's mode + corresponds to TarFile's mode. + """ + if self.closed: + raise IOError("%s is closed" % self.__class__.__name__) + if mode is not None and self.mode not in mode: + raise IOError("bad operation for mode %r" % self.mode) + + def _find_link_target(self, tarinfo): + """Find the target member of a symlink or hardlink member in the + archive. + """ + if tarinfo.issym(): + # Always search the entire archive. + linkname = os.path.dirname(tarinfo.name) + "/" + tarinfo.linkname + limit = None + else: + # Search the archive before the link, because a hard link is + # just a reference to an already archived file. + linkname = tarinfo.linkname + limit = tarinfo + + member = self._getmember(linkname, tarinfo=limit, normalize=True) + if member is None: + raise KeyError("linkname %r not found" % linkname) + return member + + def __iter__(self): + """Provide an iterator object. + """ + if self._loaded: + return iter(self.members) + else: + return TarIter(self) + + def _dbg(self, level, msg): + """Write debugging output to sys.stderr. + """ + if level <= self.debug: + print(msg, file=sys.stderr) + + def __enter__(self): + self._check() + return self + + def __exit__(self, type, value, traceback): + if type is None: + self.close() + else: + # An exception occurred. We must not call close() because + # it would try to write end-of-archive blocks and padding. + if not self._extfileobj: + self.fileobj.close() + self.closed = True +# class TarFile + +class TarIter(object): + """Iterator Class. + + for tarinfo in TarFile(...): + suite... + """ + + def __init__(self, tarfile): + """Construct a TarIter object. + """ + self.tarfile = tarfile + self.index = 0 + def __iter__(self): + """Return iterator object. + """ + return self + + def __next__(self): + """Return the next item using TarFile's next() method. + When all members have been read, set TarFile as _loaded. + """ + # Fix for SF #1100429: Under rare circumstances it can + # happen that getmembers() is called during iteration, + # which will cause TarIter to stop prematurely. + if not self.tarfile._loaded: + tarinfo = self.tarfile.next() + if not tarinfo: + self.tarfile._loaded = True + raise StopIteration + else: + try: + tarinfo = self.tarfile.members[self.index] + except IndexError: + raise StopIteration + self.index += 1 + return tarinfo + + next = __next__ # for Python 2.x + +#-------------------- +# exported functions +#-------------------- +def is_tarfile(name): + """Return True if name points to a tar archive that we + are able to handle, else return False. + """ + try: + t = open(name) + t.close() + return True + except TarError: + return False + +bltn_open = open +open = TarFile.open diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/tarfile.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/tarfile.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7265ceb1c4c6b47d083a88e237319c5e79702503 GIT binary patch literal 86781 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 literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/compat.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/compat.py new file mode 100644 index 0000000..ff328c8 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/compat.py @@ -0,0 +1,1120 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013-2017 Vinay Sajip. +# Licensed to the Python Software Foundation under a contributor agreement. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +from __future__ import absolute_import + +import os +import re +import sys + +try: + import ssl +except ImportError: # pragma: no cover + ssl = None + +if sys.version_info[0] < 3: # pragma: no cover + from StringIO import StringIO + string_types = basestring, + text_type = unicode + from types import FileType as file_type + import __builtin__ as builtins + import ConfigParser as configparser + from ._backport import shutil + from urlparse import urlparse, urlunparse, urljoin, urlsplit, urlunsplit + from urllib import (urlretrieve, quote as _quote, unquote, url2pathname, + pathname2url, ContentTooShortError, splittype) + + def quote(s): + if isinstance(s, unicode): + s = s.encode('utf-8') + return _quote(s) + + import urllib2 + from urllib2 import (Request, urlopen, URLError, HTTPError, + HTTPBasicAuthHandler, HTTPPasswordMgr, + HTTPHandler, HTTPRedirectHandler, + build_opener) + if ssl: + from urllib2 import HTTPSHandler + import httplib + import xmlrpclib + import Queue as queue + from HTMLParser import HTMLParser + import htmlentitydefs + raw_input = raw_input + from itertools import ifilter as filter + from itertools import ifilterfalse as filterfalse + + _userprog = None + def splituser(host): + """splituser('user[:passwd]@host[:port]') --> 'user[:passwd]', 'host[:port]'.""" + global _userprog + if _userprog is None: + import re + _userprog = re.compile('^(.*)@(.*)$') + + match = _userprog.match(host) + if match: return match.group(1, 2) + return None, host + +else: # pragma: no cover + from io import StringIO + string_types = str, + text_type = str + from io import TextIOWrapper as file_type + import builtins + import configparser + import shutil + from urllib.parse import (urlparse, urlunparse, urljoin, splituser, quote, + unquote, urlsplit, urlunsplit, splittype) + from urllib.request import (urlopen, urlretrieve, Request, url2pathname, + pathname2url, + HTTPBasicAuthHandler, HTTPPasswordMgr, + HTTPHandler, HTTPRedirectHandler, + build_opener) + if ssl: + from urllib.request import HTTPSHandler + from urllib.error import HTTPError, URLError, ContentTooShortError + import http.client as httplib + import urllib.request as urllib2 + import xmlrpc.client as xmlrpclib + import queue + from html.parser import HTMLParser + import html.entities as htmlentitydefs + raw_input = input + from itertools import filterfalse + filter = filter + +try: + from ssl import match_hostname, CertificateError +except ImportError: # pragma: no cover + class CertificateError(ValueError): + pass + + + def _dnsname_match(dn, hostname, max_wildcards=1): + """Matching according to RFC 6125, section 6.4.3 + + http://tools.ietf.org/html/rfc6125#section-6.4.3 + """ + pats = [] + if not dn: + return False + + parts = dn.split('.') + leftmost, remainder = parts[0], parts[1:] + + wildcards = leftmost.count('*') + if wildcards > max_wildcards: + # Issue #17980: avoid denials of service by refusing more + # than one wildcard per fragment. A survey of established + # policy among SSL implementations showed it to be a + # reasonable choice. + raise CertificateError( + "too many wildcards in certificate DNS name: " + repr(dn)) + + # speed up common case w/o wildcards + if not wildcards: + return dn.lower() == hostname.lower() + + # RFC 6125, section 6.4.3, subitem 1. + # The client SHOULD NOT attempt to match a presented identifier in which + # the wildcard character comprises a label other than the left-most label. + if leftmost == '*': + # When '*' is a fragment by itself, it matches a non-empty dotless + # fragment. + pats.append('[^.]+') + elif leftmost.startswith('xn--') or hostname.startswith('xn--'): + # RFC 6125, section 6.4.3, subitem 3. + # The client SHOULD NOT attempt to match a presented identifier + # where the wildcard character is embedded within an A-label or + # U-label of an internationalized domain name. + pats.append(re.escape(leftmost)) + else: + # Otherwise, '*' matches any dotless string, e.g. www* + pats.append(re.escape(leftmost).replace(r'\*', '[^.]*')) + + # add the remaining fragments, ignore any wildcards + for frag in remainder: + pats.append(re.escape(frag)) + + pat = re.compile(r'\A' + r'\.'.join(pats) + r'\Z', re.IGNORECASE) + return pat.match(hostname) + + + def match_hostname(cert, hostname): + """Verify that *cert* (in decoded format as returned by + SSLSocket.getpeercert()) matches the *hostname*. RFC 2818 and RFC 6125 + rules are followed, but IP addresses are not accepted for *hostname*. + + CertificateError is raised on failure. On success, the function + returns nothing. + """ + if not cert: + raise ValueError("empty or no certificate, match_hostname needs a " + "SSL socket or SSL context with either " + "CERT_OPTIONAL or CERT_REQUIRED") + dnsnames = [] + san = cert.get('subjectAltName', ()) + for key, value in san: + if key == 'DNS': + if _dnsname_match(value, hostname): + return + dnsnames.append(value) + if not dnsnames: + # The subject is only checked when there is no dNSName entry + # in subjectAltName + for sub in cert.get('subject', ()): + for key, value in sub: + # XXX according to RFC 2818, the most specific Common Name + # must be used. + if key == 'commonName': + if _dnsname_match(value, hostname): + return + dnsnames.append(value) + if len(dnsnames) > 1: + raise CertificateError("hostname %r " + "doesn't match either of %s" + % (hostname, ', '.join(map(repr, dnsnames)))) + elif len(dnsnames) == 1: + raise CertificateError("hostname %r " + "doesn't match %r" + % (hostname, dnsnames[0])) + else: + raise CertificateError("no appropriate commonName or " + "subjectAltName fields were found") + + +try: + from types import SimpleNamespace as Container +except ImportError: # pragma: no cover + class Container(object): + """ + A generic container for when multiple values need to be returned + """ + def __init__(self, **kwargs): + self.__dict__.update(kwargs) + + +try: + from shutil import which +except ImportError: # pragma: no cover + # Implementation from Python 3.3 + def which(cmd, mode=os.F_OK | os.X_OK, path=None): + """Given a command, mode, and a PATH string, return the path which + conforms to the given mode on the PATH, or None if there is no such + file. + + `mode` defaults to os.F_OK | os.X_OK. `path` defaults to the result + of os.environ.get("PATH"), or can be overridden with a custom search + path. + + """ + # Check that a given file can be accessed with the correct mode. + # Additionally check that `file` is not a directory, as on Windows + # directories pass the os.access check. + def _access_check(fn, mode): + return (os.path.exists(fn) and os.access(fn, mode) + and not os.path.isdir(fn)) + + # If we're given a path with a directory part, look it up directly rather + # than referring to PATH directories. This includes checking relative to the + # current directory, e.g. ./script + if os.path.dirname(cmd): + if _access_check(cmd, mode): + return cmd + return None + + if path is None: + path = os.environ.get("PATH", os.defpath) + if not path: + return None + path = path.split(os.pathsep) + + if sys.platform == "win32": + # The current directory takes precedence on Windows. + if not os.curdir in path: + path.insert(0, os.curdir) + + # PATHEXT is necessary to check on Windows. + pathext = os.environ.get("PATHEXT", "").split(os.pathsep) + # See if the given file matches any of the expected path extensions. + # This will allow us to short circuit when given "python.exe". + # If it does match, only test that one, otherwise we have to try + # others. + if any(cmd.lower().endswith(ext.lower()) for ext in pathext): + files = [cmd] + else: + files = [cmd + ext for ext in pathext] + else: + # On other platforms you don't have things like PATHEXT to tell you + # what file suffixes are executable, so just pass on cmd as-is. + files = [cmd] + + seen = set() + for dir in path: + normdir = os.path.normcase(dir) + if not normdir in seen: + seen.add(normdir) + for thefile in files: + name = os.path.join(dir, thefile) + if _access_check(name, mode): + return name + return None + + +# ZipFile is a context manager in 2.7, but not in 2.6 + +from zipfile import ZipFile as BaseZipFile + +if hasattr(BaseZipFile, '__enter__'): # pragma: no cover + ZipFile = BaseZipFile +else: # pragma: no cover + from zipfile import ZipExtFile as BaseZipExtFile + + class ZipExtFile(BaseZipExtFile): + def __init__(self, base): + self.__dict__.update(base.__dict__) + + def __enter__(self): + return self + + def __exit__(self, *exc_info): + self.close() + # return None, so if an exception occurred, it will propagate + + class ZipFile(BaseZipFile): + def __enter__(self): + return self + + def __exit__(self, *exc_info): + self.close() + # return None, so if an exception occurred, it will propagate + + def open(self, *args, **kwargs): + base = BaseZipFile.open(self, *args, **kwargs) + return ZipExtFile(base) + +try: + from platform import python_implementation +except ImportError: # pragma: no cover + def python_implementation(): + """Return a string identifying the Python implementation.""" + if 'PyPy' in sys.version: + return 'PyPy' + if os.name == 'java': + return 'Jython' + if sys.version.startswith('IronPython'): + return 'IronPython' + return 'CPython' + +try: + import sysconfig +except ImportError: # pragma: no cover + from ._backport import sysconfig + +try: + callable = callable +except NameError: # pragma: no cover + from collections import Callable + + def callable(obj): + return isinstance(obj, Callable) + + +try: + fsencode = os.fsencode + fsdecode = os.fsdecode +except AttributeError: # pragma: no cover + # Issue #99: on some systems (e.g. containerised), + # sys.getfilesystemencoding() returns None, and we need a real value, + # so fall back to utf-8. From the CPython 2.7 docs relating to Unix and + # sys.getfilesystemencoding(): the return value is "the user’s preference + # according to the result of nl_langinfo(CODESET), or None if the + # nl_langinfo(CODESET) failed." + _fsencoding = sys.getfilesystemencoding() or 'utf-8' + if _fsencoding == 'mbcs': + _fserrors = 'strict' + else: + _fserrors = 'surrogateescape' + + def fsencode(filename): + if isinstance(filename, bytes): + return filename + elif isinstance(filename, text_type): + return filename.encode(_fsencoding, _fserrors) + else: + raise TypeError("expect bytes or str, not %s" % + type(filename).__name__) + + def fsdecode(filename): + if isinstance(filename, text_type): + return filename + elif isinstance(filename, bytes): + return filename.decode(_fsencoding, _fserrors) + else: + raise TypeError("expect bytes or str, not %s" % + type(filename).__name__) + +try: + from tokenize import detect_encoding +except ImportError: # pragma: no cover + from codecs import BOM_UTF8, lookup + import re + + cookie_re = re.compile(r"coding[:=]\s*([-\w.]+)") + + def _get_normal_name(orig_enc): + """Imitates get_normal_name in tokenizer.c.""" + # Only care about the first 12 characters. + enc = orig_enc[:12].lower().replace("_", "-") + if enc == "utf-8" or enc.startswith("utf-8-"): + return "utf-8" + if enc in ("latin-1", "iso-8859-1", "iso-latin-1") or \ + enc.startswith(("latin-1-", "iso-8859-1-", "iso-latin-1-")): + return "iso-8859-1" + return orig_enc + + def detect_encoding(readline): + """ + The detect_encoding() function is used to detect the encoding that should + be used to decode a Python source file. It requires one argument, readline, + in the same way as the tokenize() generator. + + It will call readline a maximum of twice, and return the encoding used + (as a string) and a list of any lines (left as bytes) it has read in. + + It detects the encoding from the presence of a utf-8 bom or an encoding + cookie as specified in pep-0263. If both a bom and a cookie are present, + but disagree, a SyntaxError will be raised. If the encoding cookie is an + invalid charset, raise a SyntaxError. Note that if a utf-8 bom is found, + 'utf-8-sig' is returned. + + If no encoding is specified, then the default of 'utf-8' will be returned. + """ + try: + filename = readline.__self__.name + except AttributeError: + filename = None + bom_found = False + encoding = None + default = 'utf-8' + def read_or_stop(): + try: + return readline() + except StopIteration: + return b'' + + def find_cookie(line): + try: + # Decode as UTF-8. Either the line is an encoding declaration, + # in which case it should be pure ASCII, or it must be UTF-8 + # per default encoding. + line_string = line.decode('utf-8') + except UnicodeDecodeError: + msg = "invalid or missing encoding declaration" + if filename is not None: + msg = '{} for {!r}'.format(msg, filename) + raise SyntaxError(msg) + + matches = cookie_re.findall(line_string) + if not matches: + return None + encoding = _get_normal_name(matches[0]) + try: + codec = lookup(encoding) + except LookupError: + # This behaviour mimics the Python interpreter + if filename is None: + msg = "unknown encoding: " + encoding + else: + msg = "unknown encoding for {!r}: {}".format(filename, + encoding) + raise SyntaxError(msg) + + if bom_found: + if codec.name != 'utf-8': + # This behaviour mimics the Python interpreter + if filename is None: + msg = 'encoding problem: utf-8' + else: + msg = 'encoding problem for {!r}: utf-8'.format(filename) + raise SyntaxError(msg) + encoding += '-sig' + return encoding + + first = read_or_stop() + if first.startswith(BOM_UTF8): + bom_found = True + first = first[3:] + default = 'utf-8-sig' + if not first: + return default, [] + + encoding = find_cookie(first) + if encoding: + return encoding, [first] + + second = read_or_stop() + if not second: + return default, [first] + + encoding = find_cookie(second) + if encoding: + return encoding, [first, second] + + return default, [first, second] + +# For converting & <-> & etc. +try: + from html import escape +except ImportError: + from cgi import escape +if sys.version_info[:2] < (3, 4): + unescape = HTMLParser().unescape +else: + from html import unescape + +try: + from collections import ChainMap +except ImportError: # pragma: no cover + from collections import MutableMapping + + try: + from reprlib import recursive_repr as _recursive_repr + except ImportError: + def _recursive_repr(fillvalue='...'): + ''' + Decorator to make a repr function return fillvalue for a recursive + call + ''' + + def decorating_function(user_function): + repr_running = set() + + def wrapper(self): + key = id(self), get_ident() + if key in repr_running: + return fillvalue + repr_running.add(key) + try: + result = user_function(self) + finally: + repr_running.discard(key) + return result + + # Can't use functools.wraps() here because of bootstrap issues + wrapper.__module__ = getattr(user_function, '__module__') + wrapper.__doc__ = getattr(user_function, '__doc__') + wrapper.__name__ = getattr(user_function, '__name__') + wrapper.__annotations__ = getattr(user_function, '__annotations__', {}) + return wrapper + + return decorating_function + + class ChainMap(MutableMapping): + ''' A ChainMap groups multiple dicts (or other mappings) together + to create a single, updateable view. + + The underlying mappings are stored in a list. That list is public and can + accessed or updated using the *maps* attribute. There is no other state. + + Lookups search the underlying mappings successively until a key is found. + In contrast, writes, updates, and deletions only operate on the first + mapping. + + ''' + + def __init__(self, *maps): + '''Initialize a ChainMap by setting *maps* to the given mappings. + If no mappings are provided, a single empty dictionary is used. + + ''' + self.maps = list(maps) or [{}] # always at least one map + + def __missing__(self, key): + raise KeyError(key) + + def __getitem__(self, key): + for mapping in self.maps: + try: + return mapping[key] # can't use 'key in mapping' with defaultdict + except KeyError: + pass + return self.__missing__(key) # support subclasses that define __missing__ + + def get(self, key, default=None): + return self[key] if key in self else default + + def __len__(self): + return len(set().union(*self.maps)) # reuses stored hash values if possible + + def __iter__(self): + return iter(set().union(*self.maps)) + + def __contains__(self, key): + return any(key in m for m in self.maps) + + def __bool__(self): + return any(self.maps) + + @_recursive_repr() + def __repr__(self): + return '{0.__class__.__name__}({1})'.format( + self, ', '.join(map(repr, self.maps))) + + @classmethod + def fromkeys(cls, iterable, *args): + 'Create a ChainMap with a single dict created from the iterable.' + return cls(dict.fromkeys(iterable, *args)) + + def copy(self): + 'New ChainMap or subclass with a new copy of maps[0] and refs to maps[1:]' + return self.__class__(self.maps[0].copy(), *self.maps[1:]) + + __copy__ = copy + + def new_child(self): # like Django's Context.push() + 'New ChainMap with a new dict followed by all previous maps.' + return self.__class__({}, *self.maps) + + @property + def parents(self): # like Django's Context.pop() + 'New ChainMap from maps[1:].' + return self.__class__(*self.maps[1:]) + + def __setitem__(self, key, value): + self.maps[0][key] = value + + def __delitem__(self, key): + try: + del self.maps[0][key] + except KeyError: + raise KeyError('Key not found in the first mapping: {!r}'.format(key)) + + def popitem(self): + 'Remove and return an item pair from maps[0]. Raise KeyError is maps[0] is empty.' + try: + return self.maps[0].popitem() + except KeyError: + raise KeyError('No keys found in the first mapping.') + + def pop(self, key, *args): + 'Remove *key* from maps[0] and return its value. Raise KeyError if *key* not in maps[0].' + try: + return self.maps[0].pop(key, *args) + except KeyError: + raise KeyError('Key not found in the first mapping: {!r}'.format(key)) + + def clear(self): + 'Clear maps[0], leaving maps[1:] intact.' + self.maps[0].clear() + +try: + from importlib.util import cache_from_source # Python >= 3.4 +except ImportError: # pragma: no cover + try: + from imp import cache_from_source + except ImportError: # pragma: no cover + def cache_from_source(path, debug_override=None): + assert path.endswith('.py') + if debug_override is None: + debug_override = __debug__ + if debug_override: + suffix = 'c' + else: + suffix = 'o' + return path + suffix + +try: + from collections import OrderedDict +except ImportError: # pragma: no cover +## {{{ http://code.activestate.com/recipes/576693/ (r9) +# Backport of OrderedDict() class that runs on Python 2.4, 2.5, 2.6, 2.7 and pypy. +# Passes Python2.7's test suite and incorporates all the latest updates. + try: + from thread import get_ident as _get_ident + except ImportError: + from dummy_thread import get_ident as _get_ident + + try: + from _abcoll import KeysView, ValuesView, ItemsView + except ImportError: + pass + + + class OrderedDict(dict): + 'Dictionary that remembers insertion order' + # An inherited dict maps keys to values. + # The inherited dict provides __getitem__, __len__, __contains__, and get. + # The remaining methods are order-aware. + # Big-O running times for all methods are the same as for regular dictionaries. + + # The internal self.__map dictionary maps keys to links in a doubly linked list. + # The circular doubly linked list starts and ends with a sentinel element. + # The sentinel element never gets deleted (this simplifies the algorithm). + # Each link is stored as a list of length three: [PREV, NEXT, KEY]. + + def __init__(self, *args, **kwds): + '''Initialize an ordered dictionary. Signature is the same as for + regular dictionaries, but keyword arguments are not recommended + because their insertion order is arbitrary. + + ''' + if len(args) > 1: + raise TypeError('expected at most 1 arguments, got %d' % len(args)) + try: + self.__root + except AttributeError: + self.__root = root = [] # sentinel node + root[:] = [root, root, None] + self.__map = {} + self.__update(*args, **kwds) + + def __setitem__(self, key, value, dict_setitem=dict.__setitem__): + 'od.__setitem__(i, y) <==> od[i]=y' + # Setting a new item creates a new link which goes at the end of the linked + # list, and the inherited dictionary is updated with the new key/value pair. + if key not in self: + root = self.__root + last = root[0] + last[1] = root[0] = self.__map[key] = [last, root, key] + dict_setitem(self, key, value) + + def __delitem__(self, key, dict_delitem=dict.__delitem__): + 'od.__delitem__(y) <==> del od[y]' + # Deleting an existing item uses self.__map to find the link which is + # then removed by updating the links in the predecessor and successor nodes. + dict_delitem(self, key) + link_prev, link_next, key = self.__map.pop(key) + link_prev[1] = link_next + link_next[0] = link_prev + + def __iter__(self): + 'od.__iter__() <==> iter(od)' + root = self.__root + curr = root[1] + while curr is not root: + yield curr[2] + curr = curr[1] + + def __reversed__(self): + 'od.__reversed__() <==> reversed(od)' + root = self.__root + curr = root[0] + while curr is not root: + yield curr[2] + curr = curr[0] + + def clear(self): + 'od.clear() -> None. Remove all items from od.' + try: + for node in self.__map.itervalues(): + del node[:] + root = self.__root + root[:] = [root, root, None] + self.__map.clear() + except AttributeError: + pass + dict.clear(self) + + def popitem(self, last=True): + '''od.popitem() -> (k, v), return and remove a (key, value) pair. + Pairs are returned in LIFO order if last is true or FIFO order if false. + + ''' + if not self: + raise KeyError('dictionary is empty') + root = self.__root + if last: + link = root[0] + link_prev = link[0] + link_prev[1] = root + root[0] = link_prev + else: + link = root[1] + link_next = link[1] + root[1] = link_next + link_next[0] = root + key = link[2] + del self.__map[key] + value = dict.pop(self, key) + return key, value + + # -- the following methods do not depend on the internal structure -- + + def keys(self): + 'od.keys() -> list of keys in od' + return list(self) + + def values(self): + 'od.values() -> list of values in od' + return [self[key] for key in self] + + def items(self): + 'od.items() -> list of (key, value) pairs in od' + return [(key, self[key]) for key in self] + + def iterkeys(self): + 'od.iterkeys() -> an iterator over the keys in od' + return iter(self) + + def itervalues(self): + 'od.itervalues -> an iterator over the values in od' + for k in self: + yield self[k] + + def iteritems(self): + 'od.iteritems -> an iterator over the (key, value) items in od' + for k in self: + yield (k, self[k]) + + def update(*args, **kwds): + '''od.update(E, **F) -> None. Update od from dict/iterable E and F. + + If E is a dict instance, does: for k in E: od[k] = E[k] + If E has a .keys() method, does: for k in E.keys(): od[k] = E[k] + Or if E is an iterable of items, does: for k, v in E: od[k] = v + In either case, this is followed by: for k, v in F.items(): od[k] = v + + ''' + if len(args) > 2: + raise TypeError('update() takes at most 2 positional ' + 'arguments (%d given)' % (len(args),)) + elif not args: + raise TypeError('update() takes at least 1 argument (0 given)') + self = args[0] + # Make progressively weaker assumptions about "other" + other = () + if len(args) == 2: + other = args[1] + if isinstance(other, dict): + for key in other: + self[key] = other[key] + elif hasattr(other, 'keys'): + for key in other.keys(): + self[key] = other[key] + else: + for key, value in other: + self[key] = value + for key, value in kwds.items(): + self[key] = value + + __update = update # let subclasses override update without breaking __init__ + + __marker = object() + + def pop(self, key, default=__marker): + '''od.pop(k[,d]) -> v, remove specified key and return the corresponding value. + If key is not found, d is returned if given, otherwise KeyError is raised. + + ''' + if key in self: + result = self[key] + del self[key] + return result + if default is self.__marker: + raise KeyError(key) + return default + + def setdefault(self, key, default=None): + 'od.setdefault(k[,d]) -> od.get(k,d), also set od[k]=d if k not in od' + if key in self: + return self[key] + self[key] = default + return default + + def __repr__(self, _repr_running=None): + 'od.__repr__() <==> repr(od)' + if not _repr_running: _repr_running = {} + call_key = id(self), _get_ident() + if call_key in _repr_running: + return '...' + _repr_running[call_key] = 1 + try: + if not self: + return '%s()' % (self.__class__.__name__,) + return '%s(%r)' % (self.__class__.__name__, self.items()) + finally: + del _repr_running[call_key] + + def __reduce__(self): + 'Return state information for pickling' + items = [[k, self[k]] for k in self] + inst_dict = vars(self).copy() + for k in vars(OrderedDict()): + inst_dict.pop(k, None) + if inst_dict: + return (self.__class__, (items,), inst_dict) + return self.__class__, (items,) + + def copy(self): + 'od.copy() -> a shallow copy of od' + return self.__class__(self) + + @classmethod + def fromkeys(cls, iterable, value=None): + '''OD.fromkeys(S[, v]) -> New ordered dictionary with keys from S + and values equal to v (which defaults to None). + + ''' + d = cls() + for key in iterable: + d[key] = value + return d + + def __eq__(self, other): + '''od.__eq__(y) <==> od==y. Comparison to another OD is order-sensitive + while comparison to a regular mapping is order-insensitive. + + ''' + if isinstance(other, OrderedDict): + return len(self)==len(other) and self.items() == other.items() + return dict.__eq__(self, other) + + def __ne__(self, other): + return not self == other + + # -- the following methods are only used in Python 2.7 -- + + def viewkeys(self): + "od.viewkeys() -> a set-like object providing a view on od's keys" + return KeysView(self) + + def viewvalues(self): + "od.viewvalues() -> an object providing a view on od's values" + return ValuesView(self) + + def viewitems(self): + "od.viewitems() -> a set-like object providing a view on od's items" + return ItemsView(self) + +try: + from logging.config import BaseConfigurator, valid_ident +except ImportError: # pragma: no cover + IDENTIFIER = re.compile('^[a-z_][a-z0-9_]*$', re.I) + + + def valid_ident(s): + m = IDENTIFIER.match(s) + if not m: + raise ValueError('Not a valid Python identifier: %r' % s) + return True + + + # The ConvertingXXX classes are wrappers around standard Python containers, + # and they serve to convert any suitable values in the container. The + # conversion converts base dicts, lists and tuples to their wrapped + # equivalents, whereas strings which match a conversion format are converted + # appropriately. + # + # Each wrapper should have a configurator attribute holding the actual + # configurator to use for conversion. + + class ConvertingDict(dict): + """A converting dictionary wrapper.""" + + def __getitem__(self, key): + value = dict.__getitem__(self, key) + result = self.configurator.convert(value) + #If the converted value is different, save for next time + if value is not result: + self[key] = result + if type(result) in (ConvertingDict, ConvertingList, + ConvertingTuple): + result.parent = self + result.key = key + return result + + def get(self, key, default=None): + value = dict.get(self, key, default) + result = self.configurator.convert(value) + #If the converted value is different, save for next time + if value is not result: + self[key] = result + if type(result) in (ConvertingDict, ConvertingList, + ConvertingTuple): + result.parent = self + result.key = key + return result + + def pop(self, key, default=None): + value = dict.pop(self, key, default) + result = self.configurator.convert(value) + if value is not result: + if type(result) in (ConvertingDict, ConvertingList, + ConvertingTuple): + result.parent = self + result.key = key + return result + + class ConvertingList(list): + """A converting list wrapper.""" + def __getitem__(self, key): + value = list.__getitem__(self, key) + result = self.configurator.convert(value) + #If the converted value is different, save for next time + if value is not result: + self[key] = result + if type(result) in (ConvertingDict, ConvertingList, + ConvertingTuple): + result.parent = self + result.key = key + return result + + def pop(self, idx=-1): + value = list.pop(self, idx) + result = self.configurator.convert(value) + if value is not result: + if type(result) in (ConvertingDict, ConvertingList, + ConvertingTuple): + result.parent = self + return result + + class ConvertingTuple(tuple): + """A converting tuple wrapper.""" + def __getitem__(self, key): + value = tuple.__getitem__(self, key) + result = self.configurator.convert(value) + if value is not result: + if type(result) in (ConvertingDict, ConvertingList, + ConvertingTuple): + result.parent = self + result.key = key + return result + + class BaseConfigurator(object): + """ + The configurator base class which defines some useful defaults. + """ + + CONVERT_PATTERN = re.compile(r'^(?P[a-z]+)://(?P.*)$') + + WORD_PATTERN = re.compile(r'^\s*(\w+)\s*') + DOT_PATTERN = re.compile(r'^\.\s*(\w+)\s*') + INDEX_PATTERN = re.compile(r'^\[\s*(\w+)\s*\]\s*') + DIGIT_PATTERN = re.compile(r'^\d+$') + + value_converters = { + 'ext' : 'ext_convert', + 'cfg' : 'cfg_convert', + } + + # We might want to use a different one, e.g. importlib + importer = staticmethod(__import__) + + def __init__(self, config): + self.config = ConvertingDict(config) + self.config.configurator = self + + def resolve(self, s): + """ + Resolve strings to objects using standard import and attribute + syntax. + """ + name = s.split('.') + used = name.pop(0) + try: + found = self.importer(used) + for frag in name: + used += '.' + frag + try: + found = getattr(found, frag) + except AttributeError: + self.importer(used) + found = getattr(found, frag) + return found + except ImportError: + e, tb = sys.exc_info()[1:] + v = ValueError('Cannot resolve %r: %s' % (s, e)) + v.__cause__, v.__traceback__ = e, tb + raise v + + def ext_convert(self, value): + """Default converter for the ext:// protocol.""" + return self.resolve(value) + + def cfg_convert(self, value): + """Default converter for the cfg:// protocol.""" + rest = value + m = self.WORD_PATTERN.match(rest) + if m is None: + raise ValueError("Unable to convert %r" % value) + else: + rest = rest[m.end():] + d = self.config[m.groups()[0]] + #print d, rest + while rest: + m = self.DOT_PATTERN.match(rest) + if m: + d = d[m.groups()[0]] + else: + m = self.INDEX_PATTERN.match(rest) + if m: + idx = m.groups()[0] + if not self.DIGIT_PATTERN.match(idx): + d = d[idx] + else: + try: + n = int(idx) # try as number first (most likely) + d = d[n] + except TypeError: + d = d[idx] + if m: + rest = rest[m.end():] + else: + raise ValueError('Unable to convert ' + '%r at %r' % (value, rest)) + #rest should be empty + return d + + def convert(self, value): + """ + Convert values to an appropriate type. dicts, lists and tuples are + replaced by their converting alternatives. Strings are checked to + see if they have a conversion format and are converted if they do. + """ + if not isinstance(value, ConvertingDict) and isinstance(value, dict): + value = ConvertingDict(value) + value.configurator = self + elif not isinstance(value, ConvertingList) and isinstance(value, list): + value = ConvertingList(value) + value.configurator = self + elif not isinstance(value, ConvertingTuple) and\ + isinstance(value, tuple): + value = ConvertingTuple(value) + value.configurator = self + elif isinstance(value, string_types): + m = self.CONVERT_PATTERN.match(value) + if m: + d = m.groupdict() + prefix = d['prefix'] + converter = self.value_converters.get(prefix, None) + if converter: + suffix = d['suffix'] + converter = getattr(self, converter) + value = converter(suffix) + return value + + def configure_custom(self, config): + """Configure an object with a user-supplied factory.""" + c = config.pop('()') + if not callable(c): + c = self.resolve(c) + props = config.pop('.', None) + # Check for valid identifiers + kwargs = dict([(k, config[k]) for k in config if valid_ident(k)]) + result = c(**kwargs) + if props: + for name, value in props.items(): + setattr(result, name, value) + return result + + def as_tuple(self, value): + """Utility function which converts lists to tuples.""" + if isinstance(value, list): + value = tuple(value) + return value diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/compat.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/compat.pyc new file mode 100644 index 0000000000000000000000000000000000000000..47ca8c6c47628f0ff16e6aec93edb21b5f4aae36 GIT binary patch literal 44256 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 MYj|kO)-A*T8(*>@@Bjb+ literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/database 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/database 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c6463b9619ec05eff1a9a378cdebfb8d92a39fb2 GIT binary patch literal 53920 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 AvH$=8 literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/database.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/database.py new file mode 100644 index 0000000..c16c0c8 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/database.py @@ -0,0 +1,1339 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2012-2017 The Python Software Foundation. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +"""PEP 376 implementation.""" + +from __future__ import unicode_literals + +import base64 +import codecs +import contextlib +import hashlib +import logging +import os +import posixpath +import sys +import zipimport + +from . import DistlibException, resources +from .compat import StringIO +from .version import get_scheme, UnsupportedVersionError +from .metadata import (Metadata, METADATA_FILENAME, WHEEL_METADATA_FILENAME, + LEGACY_METADATA_FILENAME) +from .util import (parse_requirement, cached_property, parse_name_and_version, + read_exports, write_exports, CSVReader, CSVWriter) + + +__all__ = ['Distribution', 'BaseInstalledDistribution', + 'InstalledDistribution', 'EggInfoDistribution', + 'DistributionPath'] + + +logger = logging.getLogger(__name__) + +EXPORTS_FILENAME = 'pydist-exports.json' +COMMANDS_FILENAME = 'pydist-commands.json' + +DIST_FILES = ('INSTALLER', METADATA_FILENAME, 'RECORD', 'REQUESTED', + 'RESOURCES', EXPORTS_FILENAME, 'SHARED') + +DISTINFO_EXT = '.dist-info' + + +class _Cache(object): + """ + A simple cache mapping names and .dist-info paths to distributions + """ + def __init__(self): + """ + Initialise an instance. There is normally one for each DistributionPath. + """ + self.name = {} + self.path = {} + self.generated = False + + def clear(self): + """ + Clear the cache, setting it to its initial state. + """ + self.name.clear() + self.path.clear() + self.generated = False + + def add(self, dist): + """ + Add a distribution to the cache. + :param dist: The distribution to add. + """ + if dist.path not in self.path: + self.path[dist.path] = dist + self.name.setdefault(dist.key, []).append(dist) + + +class DistributionPath(object): + """ + Represents a set of distributions installed on a path (typically sys.path). + """ + def __init__(self, path=None, include_egg=False): + """ + Create an instance from a path, optionally including legacy (distutils/ + setuptools/distribute) distributions. + :param path: The path to use, as a list of directories. If not specified, + sys.path is used. + :param include_egg: If True, this instance will look for and return legacy + distributions as well as those based on PEP 376. + """ + if path is None: + path = sys.path + self.path = path + self._include_dist = True + self._include_egg = include_egg + + self._cache = _Cache() + self._cache_egg = _Cache() + self._cache_enabled = True + self._scheme = get_scheme('default') + + def _get_cache_enabled(self): + return self._cache_enabled + + def _set_cache_enabled(self, value): + self._cache_enabled = value + + cache_enabled = property(_get_cache_enabled, _set_cache_enabled) + + def clear_cache(self): + """ + Clears the internal cache. + """ + self._cache.clear() + self._cache_egg.clear() + + + def _yield_distributions(self): + """ + Yield .dist-info and/or .egg(-info) distributions. + """ + # We need to check if we've seen some resources already, because on + # some Linux systems (e.g. some Debian/Ubuntu variants) there are + # symlinks which alias other files in the environment. + seen = set() + for path in self.path: + finder = resources.finder_for_path(path) + if finder is None: + continue + r = finder.find('') + if not r or not r.is_container: + continue + rset = sorted(r.resources) + for entry in rset: + r = finder.find(entry) + if not r or r.path in seen: + continue + if self._include_dist and entry.endswith(DISTINFO_EXT): + possible_filenames = [METADATA_FILENAME, + WHEEL_METADATA_FILENAME, + LEGACY_METADATA_FILENAME] + for metadata_filename in possible_filenames: + metadata_path = posixpath.join(entry, metadata_filename) + pydist = finder.find(metadata_path) + if pydist: + break + else: + continue + + with contextlib.closing(pydist.as_stream()) as stream: + metadata = Metadata(fileobj=stream, scheme='legacy') + logger.debug('Found %s', r.path) + seen.add(r.path) + yield new_dist_class(r.path, metadata=metadata, + env=self) + elif self._include_egg and entry.endswith(('.egg-info', + '.egg')): + logger.debug('Found %s', r.path) + seen.add(r.path) + yield old_dist_class(r.path, self) + + def _generate_cache(self): + """ + Scan the path for distributions and populate the cache with + those that are found. + """ + gen_dist = not self._cache.generated + gen_egg = self._include_egg and not self._cache_egg.generated + if gen_dist or gen_egg: + for dist in self._yield_distributions(): + if isinstance(dist, InstalledDistribution): + self._cache.add(dist) + else: + self._cache_egg.add(dist) + + if gen_dist: + self._cache.generated = True + if gen_egg: + self._cache_egg.generated = True + + @classmethod + def distinfo_dirname(cls, name, version): + """ + The *name* and *version* parameters are converted into their + filename-escaped form, i.e. any ``'-'`` characters are replaced + with ``'_'`` other than the one in ``'dist-info'`` and the one + separating the name from the version number. + + :parameter name: is converted to a standard distribution name by replacing + any runs of non- alphanumeric characters with a single + ``'-'``. + :type name: string + :parameter version: is converted to a standard version string. Spaces + become dots, and all other non-alphanumeric characters + (except dots) become dashes, with runs of multiple + dashes condensed to a single dash. + :type version: string + :returns: directory name + :rtype: string""" + name = name.replace('-', '_') + return '-'.join([name, version]) + DISTINFO_EXT + + def get_distributions(self): + """ + Provides an iterator that looks for distributions and returns + :class:`InstalledDistribution` or + :class:`EggInfoDistribution` instances for each one of them. + + :rtype: iterator of :class:`InstalledDistribution` and + :class:`EggInfoDistribution` instances + """ + if not self._cache_enabled: + for dist in self._yield_distributions(): + yield dist + else: + self._generate_cache() + + for dist in self._cache.path.values(): + yield dist + + if self._include_egg: + for dist in self._cache_egg.path.values(): + yield dist + + def get_distribution(self, name): + """ + Looks for a named distribution on the path. + + This function only returns the first result found, as no more than one + value is expected. If nothing is found, ``None`` is returned. + + :rtype: :class:`InstalledDistribution`, :class:`EggInfoDistribution` + or ``None`` + """ + result = None + name = name.lower() + if not self._cache_enabled: + for dist in self._yield_distributions(): + if dist.key == name: + result = dist + break + else: + self._generate_cache() + + if name in self._cache.name: + result = self._cache.name[name][0] + elif self._include_egg and name in self._cache_egg.name: + result = self._cache_egg.name[name][0] + return result + + def provides_distribution(self, name, version=None): + """ + Iterates over all distributions to find which distributions provide *name*. + If a *version* is provided, it will be used to filter the results. + + This function only returns the first result found, since no more than + one values are expected. If the directory is not found, returns ``None``. + + :parameter version: a version specifier that indicates the version + required, conforming to the format in ``PEP-345`` + + :type name: string + :type version: string + """ + matcher = None + if version is not None: + try: + matcher = self._scheme.matcher('%s (%s)' % (name, version)) + except ValueError: + raise DistlibException('invalid name or version: %r, %r' % + (name, version)) + + for dist in self.get_distributions(): + # We hit a problem on Travis where enum34 was installed and doesn't + # have a provides attribute ... + if not hasattr(dist, 'provides'): + logger.debug('No "provides": %s', dist) + else: + provided = dist.provides + + for p in provided: + p_name, p_ver = parse_name_and_version(p) + if matcher is None: + if p_name == name: + yield dist + break + else: + if p_name == name and matcher.match(p_ver): + yield dist + break + + def get_file_path(self, name, relative_path): + """ + Return the path to a resource file. + """ + dist = self.get_distribution(name) + if dist is None: + raise LookupError('no distribution named %r found' % name) + return dist.get_resource_path(relative_path) + + def get_exported_entries(self, category, name=None): + """ + Return all of the exported entries in a particular category. + + :param category: The category to search for entries. + :param name: If specified, only entries with that name are returned. + """ + for dist in self.get_distributions(): + r = dist.exports + if category in r: + d = r[category] + if name is not None: + if name in d: + yield d[name] + else: + for v in d.values(): + yield v + + +class Distribution(object): + """ + A base class for distributions, whether installed or from indexes. + Either way, it must have some metadata, so that's all that's needed + for construction. + """ + + build_time_dependency = False + """ + Set to True if it's known to be only a build-time dependency (i.e. + not needed after installation). + """ + + requested = False + """A boolean that indicates whether the ``REQUESTED`` metadata file is + present (in other words, whether the package was installed by user + request or it was installed as a dependency).""" + + def __init__(self, metadata): + """ + Initialise an instance. + :param metadata: The instance of :class:`Metadata` describing this + distribution. + """ + self.metadata = metadata + self.name = metadata.name + self.key = self.name.lower() # for case-insensitive comparisons + self.version = metadata.version + self.locator = None + self.digest = None + self.extras = None # additional features requested + self.context = None # environment marker overrides + self.download_urls = set() + self.digests = {} + + @property + def source_url(self): + """ + The source archive download URL for this distribution. + """ + return self.metadata.source_url + + download_url = source_url # Backward compatibility + + @property + def name_and_version(self): + """ + A utility property which displays the name and version in parentheses. + """ + return '%s (%s)' % (self.name, self.version) + + @property + def provides(self): + """ + A set of distribution names and versions provided by this distribution. + :return: A set of "name (version)" strings. + """ + plist = self.metadata.provides + s = '%s (%s)' % (self.name, self.version) + if s not in plist: + plist.append(s) + return plist + + def _get_requirements(self, req_attr): + md = self.metadata + logger.debug('Getting requirements from metadata %r', md.todict()) + reqts = getattr(md, req_attr) + return set(md.get_requirements(reqts, extras=self.extras, + env=self.context)) + + @property + def run_requires(self): + return self._get_requirements('run_requires') + + @property + def meta_requires(self): + return self._get_requirements('meta_requires') + + @property + def build_requires(self): + return self._get_requirements('build_requires') + + @property + def test_requires(self): + return self._get_requirements('test_requires') + + @property + def dev_requires(self): + return self._get_requirements('dev_requires') + + def matches_requirement(self, req): + """ + Say if this instance matches (fulfills) a requirement. + :param req: The requirement to match. + :rtype req: str + :return: True if it matches, else False. + """ + # Requirement may contain extras - parse to lose those + # from what's passed to the matcher + r = parse_requirement(req) + scheme = get_scheme(self.metadata.scheme) + try: + matcher = scheme.matcher(r.requirement) + except UnsupportedVersionError: + # XXX compat-mode if cannot read the version + logger.warning('could not read version %r - using name only', + req) + name = req.split()[0] + matcher = scheme.matcher(name) + + name = matcher.key # case-insensitive + + result = False + for p in self.provides: + p_name, p_ver = parse_name_and_version(p) + if p_name != name: + continue + try: + result = matcher.match(p_ver) + break + except UnsupportedVersionError: + pass + return result + + def __repr__(self): + """ + Return a textual representation of this instance, + """ + if self.source_url: + suffix = ' [%s]' % self.source_url + else: + suffix = '' + return '' % (self.name, self.version, suffix) + + def __eq__(self, other): + """ + See if this distribution is the same as another. + :param other: The distribution to compare with. To be equal to one + another. distributions must have the same type, name, + version and source_url. + :return: True if it is the same, else False. + """ + if type(other) is not type(self): + result = False + else: + result = (self.name == other.name and + self.version == other.version and + self.source_url == other.source_url) + return result + + def __hash__(self): + """ + Compute hash in a way which matches the equality test. + """ + return hash(self.name) + hash(self.version) + hash(self.source_url) + + +class BaseInstalledDistribution(Distribution): + """ + This is the base class for installed distributions (whether PEP 376 or + legacy). + """ + + hasher = None + + def __init__(self, metadata, path, env=None): + """ + Initialise an instance. + :param metadata: An instance of :class:`Metadata` which describes the + distribution. This will normally have been initialised + from a metadata file in the ``path``. + :param path: The path of the ``.dist-info`` or ``.egg-info`` + directory for the distribution. + :param env: This is normally the :class:`DistributionPath` + instance where this distribution was found. + """ + super(BaseInstalledDistribution, self).__init__(metadata) + self.path = path + self.dist_path = env + + def get_hash(self, data, hasher=None): + """ + Get the hash of some data, using a particular hash algorithm, if + specified. + + :param data: The data to be hashed. + :type data: bytes + :param hasher: The name of a hash implementation, supported by hashlib, + or ``None``. Examples of valid values are ``'sha1'``, + ``'sha224'``, ``'sha384'``, '``sha256'``, ``'md5'`` and + ``'sha512'``. If no hasher is specified, the ``hasher`` + attribute of the :class:`InstalledDistribution` instance + is used. If the hasher is determined to be ``None``, MD5 + is used as the hashing algorithm. + :returns: The hash of the data. If a hasher was explicitly specified, + the returned hash will be prefixed with the specified hasher + followed by '='. + :rtype: str + """ + if hasher is None: + hasher = self.hasher + if hasher is None: + hasher = hashlib.md5 + prefix = '' + else: + hasher = getattr(hashlib, hasher) + prefix = '%s=' % self.hasher + digest = hasher(data).digest() + digest = base64.urlsafe_b64encode(digest).rstrip(b'=').decode('ascii') + return '%s%s' % (prefix, digest) + + +class InstalledDistribution(BaseInstalledDistribution): + """ + Created with the *path* of the ``.dist-info`` directory provided to the + constructor. It reads the metadata contained in ``pydist.json`` when it is + instantiated., or uses a passed in Metadata instance (useful for when + dry-run mode is being used). + """ + + hasher = 'sha256' + + def __init__(self, path, metadata=None, env=None): + self.modules = [] + self.finder = finder = resources.finder_for_path(path) + if finder is None: + raise ValueError('finder unavailable for %s' % path) + if env and env._cache_enabled and path in env._cache.path: + metadata = env._cache.path[path].metadata + elif metadata is None: + r = finder.find(METADATA_FILENAME) + # Temporary - for Wheel 0.23 support + if r is None: + r = finder.find(WHEEL_METADATA_FILENAME) + # Temporary - for legacy support + if r is None: + r = finder.find('METADATA') + if r is None: + raise ValueError('no %s found in %s' % (METADATA_FILENAME, + path)) + with contextlib.closing(r.as_stream()) as stream: + metadata = Metadata(fileobj=stream, scheme='legacy') + + super(InstalledDistribution, self).__init__(metadata, path, env) + + if env and env._cache_enabled: + env._cache.add(self) + + r = finder.find('REQUESTED') + self.requested = r is not None + p = os.path.join(path, 'top_level.txt') + if os.path.exists(p): + with open(p, 'rb') as f: + data = f.read().decode('utf-8') + self.modules = data.splitlines() + + def __repr__(self): + return '' % ( + self.name, self.version, self.path) + + def __str__(self): + return "%s %s" % (self.name, self.version) + + def _get_records(self): + """ + Get the list of installed files for the distribution + :return: A list of tuples of path, hash and size. Note that hash and + size might be ``None`` for some entries. The path is exactly + as stored in the file (which is as in PEP 376). + """ + results = [] + r = self.get_distinfo_resource('RECORD') + with contextlib.closing(r.as_stream()) as stream: + with CSVReader(stream=stream) as record_reader: + # Base location is parent dir of .dist-info dir + #base_location = os.path.dirname(self.path) + #base_location = os.path.abspath(base_location) + for row in record_reader: + missing = [None for i in range(len(row), 3)] + path, checksum, size = row + missing + #if not os.path.isabs(path): + # path = path.replace('/', os.sep) + # path = os.path.join(base_location, path) + results.append((path, checksum, size)) + return results + + @cached_property + def exports(self): + """ + Return the information exported by this distribution. + :return: A dictionary of exports, mapping an export category to a dict + of :class:`ExportEntry` instances describing the individual + export entries, and keyed by name. + """ + result = {} + r = self.get_distinfo_resource(EXPORTS_FILENAME) + if r: + result = self.read_exports() + return result + + def read_exports(self): + """ + Read exports data from a file in .ini format. + + :return: A dictionary of exports, mapping an export category to a list + of :class:`ExportEntry` instances describing the individual + export entries. + """ + result = {} + r = self.get_distinfo_resource(EXPORTS_FILENAME) + if r: + with contextlib.closing(r.as_stream()) as stream: + result = read_exports(stream) + return result + + def write_exports(self, exports): + """ + Write a dictionary of exports to a file in .ini format. + :param exports: A dictionary of exports, mapping an export category to + a list of :class:`ExportEntry` instances describing the + individual export entries. + """ + rf = self.get_distinfo_file(EXPORTS_FILENAME) + with open(rf, 'w') as f: + write_exports(exports, f) + + def get_resource_path(self, relative_path): + """ + NOTE: This API may change in the future. + + Return the absolute path to a resource file with the given relative + path. + + :param relative_path: The path, relative to .dist-info, of the resource + of interest. + :return: The absolute path where the resource is to be found. + """ + r = self.get_distinfo_resource('RESOURCES') + with contextlib.closing(r.as_stream()) as stream: + with CSVReader(stream=stream) as resources_reader: + for relative, destination in resources_reader: + if relative == relative_path: + return destination + raise KeyError('no resource file with relative path %r ' + 'is installed' % relative_path) + + def list_installed_files(self): + """ + Iterates over the ``RECORD`` entries and returns a tuple + ``(path, hash, size)`` for each line. + + :returns: iterator of (path, hash, size) + """ + for result in self._get_records(): + yield result + + def write_installed_files(self, paths, prefix, dry_run=False): + """ + Writes the ``RECORD`` file, using the ``paths`` iterable passed in. Any + existing ``RECORD`` file is silently overwritten. + + prefix is used to determine when to write absolute paths. + """ + prefix = os.path.join(prefix, '') + base = os.path.dirname(self.path) + base_under_prefix = base.startswith(prefix) + base = os.path.join(base, '') + record_path = self.get_distinfo_file('RECORD') + logger.info('creating %s', record_path) + if dry_run: + return None + with CSVWriter(record_path) as writer: + for path in paths: + if os.path.isdir(path) or path.endswith(('.pyc', '.pyo')): + # do not put size and hash, as in PEP-376 + hash_value = size = '' + else: + size = '%d' % os.path.getsize(path) + with open(path, 'rb') as fp: + hash_value = self.get_hash(fp.read()) + if path.startswith(base) or (base_under_prefix and + path.startswith(prefix)): + path = os.path.relpath(path, base) + writer.writerow((path, hash_value, size)) + + # add the RECORD file itself + if record_path.startswith(base): + record_path = os.path.relpath(record_path, base) + writer.writerow((record_path, '', '')) + return record_path + + def check_installed_files(self): + """ + Checks that the hashes and sizes of the files in ``RECORD`` are + matched by the files themselves. Returns a (possibly empty) list of + mismatches. Each entry in the mismatch list will be a tuple consisting + of the path, 'exists', 'size' or 'hash' according to what didn't match + (existence is checked first, then size, then hash), the expected + value and the actual value. + """ + mismatches = [] + base = os.path.dirname(self.path) + record_path = self.get_distinfo_file('RECORD') + for path, hash_value, size in self.list_installed_files(): + if not os.path.isabs(path): + path = os.path.join(base, path) + if path == record_path: + continue + if not os.path.exists(path): + mismatches.append((path, 'exists', True, False)) + elif os.path.isfile(path): + actual_size = str(os.path.getsize(path)) + if size and actual_size != size: + mismatches.append((path, 'size', size, actual_size)) + elif hash_value: + if '=' in hash_value: + hasher = hash_value.split('=', 1)[0] + else: + hasher = None + + with open(path, 'rb') as f: + actual_hash = self.get_hash(f.read(), hasher) + if actual_hash != hash_value: + mismatches.append((path, 'hash', hash_value, actual_hash)) + return mismatches + + @cached_property + def shared_locations(self): + """ + A dictionary of shared locations whose keys are in the set 'prefix', + 'purelib', 'platlib', 'scripts', 'headers', 'data' and 'namespace'. + The corresponding value is the absolute path of that category for + this distribution, and takes into account any paths selected by the + user at installation time (e.g. via command-line arguments). In the + case of the 'namespace' key, this would be a list of absolute paths + for the roots of namespace packages in this distribution. + + The first time this property is accessed, the relevant information is + read from the SHARED file in the .dist-info directory. + """ + result = {} + shared_path = os.path.join(self.path, 'SHARED') + if os.path.isfile(shared_path): + with codecs.open(shared_path, 'r', encoding='utf-8') as f: + lines = f.read().splitlines() + for line in lines: + key, value = line.split('=', 1) + if key == 'namespace': + result.setdefault(key, []).append(value) + else: + result[key] = value + return result + + def write_shared_locations(self, paths, dry_run=False): + """ + Write shared location information to the SHARED file in .dist-info. + :param paths: A dictionary as described in the documentation for + :meth:`shared_locations`. + :param dry_run: If True, the action is logged but no file is actually + written. + :return: The path of the file written to. + """ + shared_path = os.path.join(self.path, 'SHARED') + logger.info('creating %s', shared_path) + if dry_run: + return None + lines = [] + for key in ('prefix', 'lib', 'headers', 'scripts', 'data'): + path = paths[key] + if os.path.isdir(paths[key]): + lines.append('%s=%s' % (key, path)) + for ns in paths.get('namespace', ()): + lines.append('namespace=%s' % ns) + + with codecs.open(shared_path, 'w', encoding='utf-8') as f: + f.write('\n'.join(lines)) + return shared_path + + def get_distinfo_resource(self, path): + if path not in DIST_FILES: + raise DistlibException('invalid path for a dist-info file: ' + '%r at %r' % (path, self.path)) + finder = resources.finder_for_path(self.path) + if finder is None: + raise DistlibException('Unable to get a finder for %s' % self.path) + return finder.find(path) + + def get_distinfo_file(self, path): + """ + Returns a path located under the ``.dist-info`` directory. Returns a + string representing the path. + + :parameter path: a ``'/'``-separated path relative to the + ``.dist-info`` directory or an absolute path; + If *path* is an absolute path and doesn't start + with the ``.dist-info`` directory path, + a :class:`DistlibException` is raised + :type path: str + :rtype: str + """ + # Check if it is an absolute path # XXX use relpath, add tests + if path.find(os.sep) >= 0: + # it's an absolute path? + distinfo_dirname, path = path.split(os.sep)[-2:] + if distinfo_dirname != self.path.split(os.sep)[-1]: + raise DistlibException( + 'dist-info file %r does not belong to the %r %s ' + 'distribution' % (path, self.name, self.version)) + + # The file must be relative + if path not in DIST_FILES: + raise DistlibException('invalid path for a dist-info file: ' + '%r at %r' % (path, self.path)) + + return os.path.join(self.path, path) + + def list_distinfo_files(self): + """ + Iterates over the ``RECORD`` entries and returns paths for each line if + the path is pointing to a file located in the ``.dist-info`` directory + or one of its subdirectories. + + :returns: iterator of paths + """ + base = os.path.dirname(self.path) + for path, checksum, size in self._get_records(): + # XXX add separator or use real relpath algo + if not os.path.isabs(path): + path = os.path.join(base, path) + if path.startswith(self.path): + yield path + + def __eq__(self, other): + return (isinstance(other, InstalledDistribution) and + self.path == other.path) + + # See http://docs.python.org/reference/datamodel#object.__hash__ + __hash__ = object.__hash__ + + +class EggInfoDistribution(BaseInstalledDistribution): + """Created with the *path* of the ``.egg-info`` directory or file provided + to the constructor. It reads the metadata contained in the file itself, or + if the given path happens to be a directory, the metadata is read from the + file ``PKG-INFO`` under that directory.""" + + requested = True # as we have no way of knowing, assume it was + shared_locations = {} + + def __init__(self, path, env=None): + def set_name_and_version(s, n, v): + s.name = n + s.key = n.lower() # for case-insensitive comparisons + s.version = v + + self.path = path + self.dist_path = env + if env and env._cache_enabled and path in env._cache_egg.path: + metadata = env._cache_egg.path[path].metadata + set_name_and_version(self, metadata.name, metadata.version) + else: + metadata = self._get_metadata(path) + + # Need to be set before caching + set_name_and_version(self, metadata.name, metadata.version) + + if env and env._cache_enabled: + env._cache_egg.add(self) + super(EggInfoDistribution, self).__init__(metadata, path, env) + + def _get_metadata(self, path): + requires = None + + def parse_requires_data(data): + """Create a list of dependencies from a requires.txt file. + + *data*: the contents of a setuptools-produced requires.txt file. + """ + reqs = [] + lines = data.splitlines() + for line in lines: + line = line.strip() + if line.startswith('['): + logger.warning('Unexpected line: quitting requirement scan: %r', + line) + break + r = parse_requirement(line) + if not r: + logger.warning('Not recognised as a requirement: %r', line) + continue + if r.extras: + logger.warning('extra requirements in requires.txt are ' + 'not supported') + if not r.constraints: + reqs.append(r.name) + else: + cons = ', '.join('%s%s' % c for c in r.constraints) + reqs.append('%s (%s)' % (r.name, cons)) + return reqs + + def parse_requires_path(req_path): + """Create a list of dependencies from a requires.txt file. + + *req_path*: the path to a setuptools-produced requires.txt file. + """ + + reqs = [] + try: + with codecs.open(req_path, 'r', 'utf-8') as fp: + reqs = parse_requires_data(fp.read()) + except IOError: + pass + return reqs + + tl_path = tl_data = None + if path.endswith('.egg'): + if os.path.isdir(path): + p = os.path.join(path, 'EGG-INFO') + meta_path = os.path.join(p, 'PKG-INFO') + metadata = Metadata(path=meta_path, scheme='legacy') + req_path = os.path.join(p, 'requires.txt') + tl_path = os.path.join(p, 'top_level.txt') + requires = parse_requires_path(req_path) + else: + # FIXME handle the case where zipfile is not available + zipf = zipimport.zipimporter(path) + fileobj = StringIO( + zipf.get_data('EGG-INFO/PKG-INFO').decode('utf8')) + metadata = Metadata(fileobj=fileobj, scheme='legacy') + try: + data = zipf.get_data('EGG-INFO/requires.txt') + tl_data = zipf.get_data('EGG-INFO/top_level.txt').decode('utf-8') + requires = parse_requires_data(data.decode('utf-8')) + except IOError: + requires = None + elif path.endswith('.egg-info'): + if os.path.isdir(path): + req_path = os.path.join(path, 'requires.txt') + requires = parse_requires_path(req_path) + path = os.path.join(path, 'PKG-INFO') + tl_path = os.path.join(path, 'top_level.txt') + metadata = Metadata(path=path, scheme='legacy') + else: + raise DistlibException('path must end with .egg-info or .egg, ' + 'got %r' % path) + + if requires: + metadata.add_requirements(requires) + # look for top-level modules in top_level.txt, if present + if tl_data is None: + if tl_path is not None and os.path.exists(tl_path): + with open(tl_path, 'rb') as f: + tl_data = f.read().decode('utf-8') + if not tl_data: + tl_data = [] + else: + tl_data = tl_data.splitlines() + self.modules = tl_data + return metadata + + def __repr__(self): + return '' % ( + self.name, self.version, self.path) + + def __str__(self): + return "%s %s" % (self.name, self.version) + + def check_installed_files(self): + """ + Checks that the hashes and sizes of the files in ``RECORD`` are + matched by the files themselves. Returns a (possibly empty) list of + mismatches. Each entry in the mismatch list will be a tuple consisting + of the path, 'exists', 'size' or 'hash' according to what didn't match + (existence is checked first, then size, then hash), the expected + value and the actual value. + """ + mismatches = [] + record_path = os.path.join(self.path, 'installed-files.txt') + if os.path.exists(record_path): + for path, _, _ in self.list_installed_files(): + if path == record_path: + continue + if not os.path.exists(path): + mismatches.append((path, 'exists', True, False)) + return mismatches + + def list_installed_files(self): + """ + Iterates over the ``installed-files.txt`` entries and returns a tuple + ``(path, hash, size)`` for each line. + + :returns: a list of (path, hash, size) + """ + + def _md5(path): + f = open(path, 'rb') + try: + content = f.read() + finally: + f.close() + return hashlib.md5(content).hexdigest() + + def _size(path): + return os.stat(path).st_size + + record_path = os.path.join(self.path, 'installed-files.txt') + result = [] + if os.path.exists(record_path): + with codecs.open(record_path, 'r', encoding='utf-8') as f: + for line in f: + line = line.strip() + p = os.path.normpath(os.path.join(self.path, line)) + # "./" is present as a marker between installed files + # and installation metadata files + if not os.path.exists(p): + logger.warning('Non-existent file: %s', p) + if p.endswith(('.pyc', '.pyo')): + continue + #otherwise fall through and fail + if not os.path.isdir(p): + result.append((p, _md5(p), _size(p))) + result.append((record_path, None, None)) + return result + + def list_distinfo_files(self, absolute=False): + """ + Iterates over the ``installed-files.txt`` entries and returns paths for + each line if the path is pointing to a file located in the + ``.egg-info`` directory or one of its subdirectories. + + :parameter absolute: If *absolute* is ``True``, each returned path is + transformed into a local absolute path. Otherwise the + raw value from ``installed-files.txt`` is returned. + :type absolute: boolean + :returns: iterator of paths + """ + record_path = os.path.join(self.path, 'installed-files.txt') + if os.path.exists(record_path): + skip = True + with codecs.open(record_path, 'r', encoding='utf-8') as f: + for line in f: + line = line.strip() + if line == './': + skip = False + continue + if not skip: + p = os.path.normpath(os.path.join(self.path, line)) + if p.startswith(self.path): + if absolute: + yield p + else: + yield line + + def __eq__(self, other): + return (isinstance(other, EggInfoDistribution) and + self.path == other.path) + + # See http://docs.python.org/reference/datamodel#object.__hash__ + __hash__ = object.__hash__ + +new_dist_class = InstalledDistribution +old_dist_class = EggInfoDistribution + + +class DependencyGraph(object): + """ + Represents a dependency graph between distributions. + + The dependency relationships are stored in an ``adjacency_list`` that maps + distributions to a list of ``(other, label)`` tuples where ``other`` + is a distribution and the edge is labeled with ``label`` (i.e. the version + specifier, if such was provided). Also, for more efficient traversal, for + every distribution ``x``, a list of predecessors is kept in + ``reverse_list[x]``. An edge from distribution ``a`` to + distribution ``b`` means that ``a`` depends on ``b``. If any missing + dependencies are found, they are stored in ``missing``, which is a + dictionary that maps distributions to a list of requirements that were not + provided by any other distributions. + """ + + def __init__(self): + self.adjacency_list = {} + self.reverse_list = {} + self.missing = {} + + def add_distribution(self, distribution): + """Add the *distribution* to the graph. + + :type distribution: :class:`distutils2.database.InstalledDistribution` + or :class:`distutils2.database.EggInfoDistribution` + """ + self.adjacency_list[distribution] = [] + self.reverse_list[distribution] = [] + #self.missing[distribution] = [] + + def add_edge(self, x, y, label=None): + """Add an edge from distribution *x* to distribution *y* with the given + *label*. + + :type x: :class:`distutils2.database.InstalledDistribution` or + :class:`distutils2.database.EggInfoDistribution` + :type y: :class:`distutils2.database.InstalledDistribution` or + :class:`distutils2.database.EggInfoDistribution` + :type label: ``str`` or ``None`` + """ + self.adjacency_list[x].append((y, label)) + # multiple edges are allowed, so be careful + if x not in self.reverse_list[y]: + self.reverse_list[y].append(x) + + def add_missing(self, distribution, requirement): + """ + Add a missing *requirement* for the given *distribution*. + + :type distribution: :class:`distutils2.database.InstalledDistribution` + or :class:`distutils2.database.EggInfoDistribution` + :type requirement: ``str`` + """ + logger.debug('%s missing %r', distribution, requirement) + self.missing.setdefault(distribution, []).append(requirement) + + def _repr_dist(self, dist): + return '%s %s' % (dist.name, dist.version) + + def repr_node(self, dist, level=1): + """Prints only a subgraph""" + output = [self._repr_dist(dist)] + for other, label in self.adjacency_list[dist]: + dist = self._repr_dist(other) + if label is not None: + dist = '%s [%s]' % (dist, label) + output.append(' ' * level + str(dist)) + suboutput = self.repr_node(other, level + 1) + subs = suboutput.split('\n') + output.extend(subs[1:]) + return '\n'.join(output) + + def to_dot(self, f, skip_disconnected=True): + """Writes a DOT output for the graph to the provided file *f*. + + If *skip_disconnected* is set to ``True``, then all distributions + that are not dependent on any other distribution are skipped. + + :type f: has to support ``file``-like operations + :type skip_disconnected: ``bool`` + """ + disconnected = [] + + f.write("digraph dependencies {\n") + for dist, adjs in self.adjacency_list.items(): + if len(adjs) == 0 and not skip_disconnected: + disconnected.append(dist) + for other, label in adjs: + if not label is None: + f.write('"%s" -> "%s" [label="%s"]\n' % + (dist.name, other.name, label)) + else: + f.write('"%s" -> "%s"\n' % (dist.name, other.name)) + if not skip_disconnected and len(disconnected) > 0: + f.write('subgraph disconnected {\n') + f.write('label = "Disconnected"\n') + f.write('bgcolor = red\n') + + for dist in disconnected: + f.write('"%s"' % dist.name) + f.write('\n') + f.write('}\n') + f.write('}\n') + + def topological_sort(self): + """ + Perform a topological sort of the graph. + :return: A tuple, the first element of which is a topologically sorted + list of distributions, and the second element of which is a + list of distributions that cannot be sorted because they have + circular dependencies and so form a cycle. + """ + result = [] + # Make a shallow copy of the adjacency list + alist = {} + for k, v in self.adjacency_list.items(): + alist[k] = v[:] + while True: + # See what we can remove in this run + to_remove = [] + for k, v in list(alist.items())[:]: + if not v: + to_remove.append(k) + del alist[k] + if not to_remove: + # What's left in alist (if anything) is a cycle. + break + # Remove from the adjacency list of others + for k, v in alist.items(): + alist[k] = [(d, r) for d, r in v if d not in to_remove] + logger.debug('Moving to result: %s', + ['%s (%s)' % (d.name, d.version) for d in to_remove]) + result.extend(to_remove) + return result, list(alist.keys()) + + def __repr__(self): + """Representation of the graph""" + output = [] + for dist, adjs in self.adjacency_list.items(): + output.append(self.repr_node(dist)) + return '\n'.join(output) + + +def make_graph(dists, scheme='default'): + """Makes a dependency graph from the given distributions. + + :parameter dists: a list of distributions + :type dists: list of :class:`distutils2.database.InstalledDistribution` and + :class:`distutils2.database.EggInfoDistribution` instances + :rtype: a :class:`DependencyGraph` instance + """ + scheme = get_scheme(scheme) + graph = DependencyGraph() + provided = {} # maps names to lists of (version, dist) tuples + + # first, build the graph and find out what's provided + for dist in dists: + graph.add_distribution(dist) + + for p in dist.provides: + name, version = parse_name_and_version(p) + logger.debug('Add to provided: %s, %s, %s', name, version, dist) + provided.setdefault(name, []).append((version, dist)) + + # now make the edges + for dist in dists: + requires = (dist.run_requires | dist.meta_requires | + dist.build_requires | dist.dev_requires) + for req in requires: + try: + matcher = scheme.matcher(req) + except UnsupportedVersionError: + # XXX compat-mode if cannot read the version + logger.warning('could not read version %r - using name only', + req) + name = req.split()[0] + matcher = scheme.matcher(name) + + name = matcher.key # case-insensitive + + matched = False + if name in provided: + for version, provider in provided[name]: + try: + match = matcher.match(version) + except UnsupportedVersionError: + match = False + + if match: + graph.add_edge(dist, provider, req) + matched = True + break + if not matched: + graph.add_missing(dist, req) + return graph + + +def get_dependent_dists(dists, dist): + """Recursively generate a list of distributions from *dists* that are + dependent on *dist*. + + :param dists: a list of distributions + :param dist: a distribution, member of *dists* for which we are interested + """ + if dist not in dists: + raise DistlibException('given distribution %r is not a member ' + 'of the list' % dist.name) + graph = make_graph(dists) + + dep = [dist] # dependent distributions + todo = graph.reverse_list[dist] # list of nodes we should inspect + + while todo: + d = todo.pop() + dep.append(d) + for succ in graph.reverse_list[d]: + if succ not in dep: + todo.append(succ) + + dep.pop(0) # remove dist from dep, was there to prevent infinite loops + return dep + + +def get_required_dists(dists, dist): + """Recursively generate a list of distributions from *dists* that are + required by *dist*. + + :param dists: a list of distributions + :param dist: a distribution, member of *dists* for which we are interested + """ + if dist not in dists: + raise DistlibException('given distribution %r is not a member ' + 'of the list' % dist.name) + graph = make_graph(dists) + + req = [] # required distributions + todo = graph.adjacency_list[dist] # list of nodes we should inspect + + while todo: + d = todo.pop()[0] + req.append(d) + for pred in graph.adjacency_list[d]: + if pred not in req: + todo.append(pred) + + return req + + +def make_dist(name, version, **kwargs): + """ + A convenience method for making a dist given just a name and version. + """ + summary = kwargs.pop('summary', 'Placeholder for summary') + md = Metadata(**kwargs) + md.name = name + md.version = version + md.summary = summary or 'Placeholder for summary' + return Distribution(md) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/database.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/database.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dba1020632d7f7781e09840ab68f8c3aca993071 GIT binary patch literal 53920 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 0 and read < size: + raise DistlibException( + 'retrieval incomplete: got only %d out of %d bytes' + % (read, size)) + # if we have a digest, it must match. + if digester: + actual = digester.hexdigest() + if digest != actual: + raise DistlibException('%s digest mismatch for %s: expected ' + '%s, got %s' % (hasher, destfile, + digest, actual)) + logger.debug('Digest verified: %s', digest) + + def send_request(self, req): + """ + Send a standard library :class:`Request` to PyPI and return its + response. + + :param req: The request to send. + :return: The HTTP response from PyPI (a standard library HTTPResponse). + """ + handlers = [] + if self.password_handler: + handlers.append(self.password_handler) + if self.ssl_verifier: + handlers.append(self.ssl_verifier) + opener = build_opener(*handlers) + return opener.open(req) + + def encode_request(self, fields, files): + """ + Encode fields and files for posting to an HTTP server. + + :param fields: The fields to send as a list of (fieldname, value) + tuples. + :param files: The files to send as a list of (fieldname, filename, + file_bytes) tuple. + """ + # Adapted from packaging, which in turn was adapted from + # http://code.activestate.com/recipes/146306 + + parts = [] + boundary = self.boundary + for k, values in fields: + if not isinstance(values, (list, tuple)): + values = [values] + + for v in values: + parts.extend(( + b'--' + boundary, + ('Content-Disposition: form-data; name="%s"' % + k).encode('utf-8'), + b'', + v.encode('utf-8'))) + for key, filename, value in files: + parts.extend(( + b'--' + boundary, + ('Content-Disposition: form-data; name="%s"; filename="%s"' % + (key, filename)).encode('utf-8'), + b'', + value)) + + parts.extend((b'--' + boundary + b'--', b'')) + + body = b'\r\n'.join(parts) + ct = b'multipart/form-data; boundary=' + boundary + headers = { + 'Content-type': ct, + 'Content-length': str(len(body)) + } + return Request(self.url, body, headers) + + def search(self, terms, operator=None): + if isinstance(terms, string_types): + terms = {'name': terms} + rpc_proxy = ServerProxy(self.url, timeout=3.0) + try: + return rpc_proxy.search(terms, operator or 'and') + finally: + rpc_proxy('close')() diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/index 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/index 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6ce01fb03ba243e8fe8428def998965e471d6cf2 GIT binary patch literal 20980 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 HqlNzkU%EQy literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/index.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/index.py new file mode 100644 index 0000000..7a87cdc --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/index.py @@ -0,0 +1,516 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013 Vinay Sajip. +# Licensed to the Python Software Foundation under a contributor agreement. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +import hashlib +import logging +import os +import shutil +import subprocess +import tempfile +try: + from threading import Thread +except ImportError: + from dummy_threading import Thread + +from . import DistlibException +from .compat import (HTTPBasicAuthHandler, Request, HTTPPasswordMgr, + urlparse, build_opener, string_types) +from .util import cached_property, zip_dir, ServerProxy + +logger = logging.getLogger(__name__) + +DEFAULT_INDEX = 'https://pypi.org/pypi' +DEFAULT_REALM = 'pypi' + +class PackageIndex(object): + """ + This class represents a package index compatible with PyPI, the Python + Package Index. + """ + + boundary = b'----------ThIs_Is_tHe_distlib_index_bouNdaRY_$' + + def __init__(self, url=None): + """ + Initialise an instance. + + :param url: The URL of the index. If not specified, the URL for PyPI is + used. + """ + self.url = url or DEFAULT_INDEX + self.read_configuration() + scheme, netloc, path, params, query, frag = urlparse(self.url) + if params or query or frag or scheme not in ('http', 'https'): + raise DistlibException('invalid repository: %s' % self.url) + self.password_handler = None + self.ssl_verifier = None + self.gpg = None + self.gpg_home = None + with open(os.devnull, 'w') as sink: + # Use gpg by default rather than gpg2, as gpg2 insists on + # prompting for passwords + for s in ('gpg', 'gpg2'): + try: + rc = subprocess.check_call([s, '--version'], stdout=sink, + stderr=sink) + if rc == 0: + self.gpg = s + break + except OSError: + pass + + def _get_pypirc_command(self): + """ + Get the distutils command for interacting with PyPI configurations. + :return: the command. + """ + from distutils.core import Distribution + from distutils.config import PyPIRCCommand + d = Distribution() + return PyPIRCCommand(d) + + def read_configuration(self): + """ + Read the PyPI access configuration as supported by distutils, getting + PyPI to do the actual work. This populates ``username``, ``password``, + ``realm`` and ``url`` attributes from the configuration. + """ + # get distutils to do the work + c = self._get_pypirc_command() + c.repository = self.url + cfg = c._read_pypirc() + self.username = cfg.get('username') + self.password = cfg.get('password') + self.realm = cfg.get('realm', 'pypi') + self.url = cfg.get('repository', self.url) + + def save_configuration(self): + """ + Save the PyPI access configuration. You must have set ``username`` and + ``password`` attributes before calling this method. + + Again, distutils is used to do the actual work. + """ + self.check_credentials() + # get distutils to do the work + c = self._get_pypirc_command() + c._store_pypirc(self.username, self.password) + + def check_credentials(self): + """ + Check that ``username`` and ``password`` have been set, and raise an + exception if not. + """ + if self.username is None or self.password is None: + raise DistlibException('username and password must be set') + pm = HTTPPasswordMgr() + _, netloc, _, _, _, _ = urlparse(self.url) + pm.add_password(self.realm, netloc, self.username, self.password) + self.password_handler = HTTPBasicAuthHandler(pm) + + def register(self, metadata): + """ + Register a distribution on PyPI, using the provided metadata. + + :param metadata: A :class:`Metadata` instance defining at least a name + and version number for the distribution to be + registered. + :return: The HTTP response received from PyPI upon submission of the + request. + """ + self.check_credentials() + metadata.validate() + d = metadata.todict() + d[':action'] = 'verify' + request = self.encode_request(d.items(), []) + response = self.send_request(request) + d[':action'] = 'submit' + request = self.encode_request(d.items(), []) + return self.send_request(request) + + def _reader(self, name, stream, outbuf): + """ + Thread runner for reading lines of from a subprocess into a buffer. + + :param name: The logical name of the stream (used for logging only). + :param stream: The stream to read from. This will typically a pipe + connected to the output stream of a subprocess. + :param outbuf: The list to append the read lines to. + """ + while True: + s = stream.readline() + if not s: + break + s = s.decode('utf-8').rstrip() + outbuf.append(s) + logger.debug('%s: %s' % (name, s)) + stream.close() + + def get_sign_command(self, filename, signer, sign_password, + keystore=None): + """ + Return a suitable command for signing a file. + + :param filename: The pathname to the file to be signed. + :param signer: The identifier of the signer of the file. + :param sign_password: The passphrase for the signer's + private key used for signing. + :param keystore: The path to a directory which contains the keys + used in verification. If not specified, the + instance's ``gpg_home`` attribute is used instead. + :return: The signing command as a list suitable to be + passed to :class:`subprocess.Popen`. + """ + cmd = [self.gpg, '--status-fd', '2', '--no-tty'] + if keystore is None: + keystore = self.gpg_home + if keystore: + cmd.extend(['--homedir', keystore]) + if sign_password is not None: + cmd.extend(['--batch', '--passphrase-fd', '0']) + td = tempfile.mkdtemp() + sf = os.path.join(td, os.path.basename(filename) + '.asc') + cmd.extend(['--detach-sign', '--armor', '--local-user', + signer, '--output', sf, filename]) + logger.debug('invoking: %s', ' '.join(cmd)) + return cmd, sf + + def run_command(self, cmd, input_data=None): + """ + Run a command in a child process , passing it any input data specified. + + :param cmd: The command to run. + :param input_data: If specified, this must be a byte string containing + data to be sent to the child process. + :return: A tuple consisting of the subprocess' exit code, a list of + lines read from the subprocess' ``stdout``, and a list of + lines read from the subprocess' ``stderr``. + """ + kwargs = { + 'stdout': subprocess.PIPE, + 'stderr': subprocess.PIPE, + } + if input_data is not None: + kwargs['stdin'] = subprocess.PIPE + stdout = [] + stderr = [] + p = subprocess.Popen(cmd, **kwargs) + # We don't use communicate() here because we may need to + # get clever with interacting with the command + t1 = Thread(target=self._reader, args=('stdout', p.stdout, stdout)) + t1.start() + t2 = Thread(target=self._reader, args=('stderr', p.stderr, stderr)) + t2.start() + if input_data is not None: + p.stdin.write(input_data) + p.stdin.close() + + p.wait() + t1.join() + t2.join() + return p.returncode, stdout, stderr + + def sign_file(self, filename, signer, sign_password, keystore=None): + """ + Sign a file. + + :param filename: The pathname to the file to be signed. + :param signer: The identifier of the signer of the file. + :param sign_password: The passphrase for the signer's + private key used for signing. + :param keystore: The path to a directory which contains the keys + used in signing. If not specified, the instance's + ``gpg_home`` attribute is used instead. + :return: The absolute pathname of the file where the signature is + stored. + """ + cmd, sig_file = self.get_sign_command(filename, signer, sign_password, + keystore) + rc, stdout, stderr = self.run_command(cmd, + sign_password.encode('utf-8')) + if rc != 0: + raise DistlibException('sign command failed with error ' + 'code %s' % rc) + return sig_file + + def upload_file(self, metadata, filename, signer=None, sign_password=None, + filetype='sdist', pyversion='source', keystore=None): + """ + Upload a release file to the index. + + :param metadata: A :class:`Metadata` instance defining at least a name + and version number for the file to be uploaded. + :param filename: The pathname of the file to be uploaded. + :param signer: The identifier of the signer of the file. + :param sign_password: The passphrase for the signer's + private key used for signing. + :param filetype: The type of the file being uploaded. This is the + distutils command which produced that file, e.g. + ``sdist`` or ``bdist_wheel``. + :param pyversion: The version of Python which the release relates + to. For code compatible with any Python, this would + be ``source``, otherwise it would be e.g. ``3.2``. + :param keystore: The path to a directory which contains the keys + used in signing. If not specified, the instance's + ``gpg_home`` attribute is used instead. + :return: The HTTP response received from PyPI upon submission of the + request. + """ + self.check_credentials() + if not os.path.exists(filename): + raise DistlibException('not found: %s' % filename) + metadata.validate() + d = metadata.todict() + sig_file = None + if signer: + if not self.gpg: + logger.warning('no signing program available - not signed') + else: + sig_file = self.sign_file(filename, signer, sign_password, + keystore) + with open(filename, 'rb') as f: + file_data = f.read() + md5_digest = hashlib.md5(file_data).hexdigest() + sha256_digest = hashlib.sha256(file_data).hexdigest() + d.update({ + ':action': 'file_upload', + 'protocol_version': '1', + 'filetype': filetype, + 'pyversion': pyversion, + 'md5_digest': md5_digest, + 'sha256_digest': sha256_digest, + }) + files = [('content', os.path.basename(filename), file_data)] + if sig_file: + with open(sig_file, 'rb') as f: + sig_data = f.read() + files.append(('gpg_signature', os.path.basename(sig_file), + sig_data)) + shutil.rmtree(os.path.dirname(sig_file)) + request = self.encode_request(d.items(), files) + return self.send_request(request) + + def upload_documentation(self, metadata, doc_dir): + """ + Upload documentation to the index. + + :param metadata: A :class:`Metadata` instance defining at least a name + and version number for the documentation to be + uploaded. + :param doc_dir: The pathname of the directory which contains the + documentation. This should be the directory that + contains the ``index.html`` for the documentation. + :return: The HTTP response received from PyPI upon submission of the + request. + """ + self.check_credentials() + if not os.path.isdir(doc_dir): + raise DistlibException('not a directory: %r' % doc_dir) + fn = os.path.join(doc_dir, 'index.html') + if not os.path.exists(fn): + raise DistlibException('not found: %r' % fn) + metadata.validate() + name, version = metadata.name, metadata.version + zip_data = zip_dir(doc_dir).getvalue() + fields = [(':action', 'doc_upload'), + ('name', name), ('version', version)] + files = [('content', name, zip_data)] + request = self.encode_request(fields, files) + return self.send_request(request) + + def get_verify_command(self, signature_filename, data_filename, + keystore=None): + """ + Return a suitable command for verifying a file. + + :param signature_filename: The pathname to the file containing the + signature. + :param data_filename: The pathname to the file containing the + signed data. + :param keystore: The path to a directory which contains the keys + used in verification. If not specified, the + instance's ``gpg_home`` attribute is used instead. + :return: The verifying command as a list suitable to be + passed to :class:`subprocess.Popen`. + """ + cmd = [self.gpg, '--status-fd', '2', '--no-tty'] + if keystore is None: + keystore = self.gpg_home + if keystore: + cmd.extend(['--homedir', keystore]) + cmd.extend(['--verify', signature_filename, data_filename]) + logger.debug('invoking: %s', ' '.join(cmd)) + return cmd + + def verify_signature(self, signature_filename, data_filename, + keystore=None): + """ + Verify a signature for a file. + + :param signature_filename: The pathname to the file containing the + signature. + :param data_filename: The pathname to the file containing the + signed data. + :param keystore: The path to a directory which contains the keys + used in verification. If not specified, the + instance's ``gpg_home`` attribute is used instead. + :return: True if the signature was verified, else False. + """ + if not self.gpg: + raise DistlibException('verification unavailable because gpg ' + 'unavailable') + cmd = self.get_verify_command(signature_filename, data_filename, + keystore) + rc, stdout, stderr = self.run_command(cmd) + if rc not in (0, 1): + raise DistlibException('verify command failed with error ' + 'code %s' % rc) + return rc == 0 + + def download_file(self, url, destfile, digest=None, reporthook=None): + """ + This is a convenience method for downloading a file from an URL. + Normally, this will be a file from the index, though currently + no check is made for this (i.e. a file can be downloaded from + anywhere). + + The method is just like the :func:`urlretrieve` function in the + standard library, except that it allows digest computation to be + done during download and checking that the downloaded data + matched any expected value. + + :param url: The URL of the file to be downloaded (assumed to be + available via an HTTP GET request). + :param destfile: The pathname where the downloaded file is to be + saved. + :param digest: If specified, this must be a (hasher, value) + tuple, where hasher is the algorithm used (e.g. + ``'md5'``) and ``value`` is the expected value. + :param reporthook: The same as for :func:`urlretrieve` in the + standard library. + """ + if digest is None: + digester = None + logger.debug('No digest specified') + else: + if isinstance(digest, (list, tuple)): + hasher, digest = digest + else: + hasher = 'md5' + digester = getattr(hashlib, hasher)() + logger.debug('Digest specified: %s' % digest) + # The following code is equivalent to urlretrieve. + # We need to do it this way so that we can compute the + # digest of the file as we go. + with open(destfile, 'wb') as dfp: + # addinfourl is not a context manager on 2.x + # so we have to use try/finally + sfp = self.send_request(Request(url)) + try: + headers = sfp.info() + blocksize = 8192 + size = -1 + read = 0 + blocknum = 0 + if "content-length" in headers: + size = int(headers["Content-Length"]) + if reporthook: + reporthook(blocknum, blocksize, size) + while True: + block = sfp.read(blocksize) + if not block: + break + read += len(block) + dfp.write(block) + if digester: + digester.update(block) + blocknum += 1 + if reporthook: + reporthook(blocknum, blocksize, size) + finally: + sfp.close() + + # check that we got the whole file, if we can + if size >= 0 and read < size: + raise DistlibException( + 'retrieval incomplete: got only %d out of %d bytes' + % (read, size)) + # if we have a digest, it must match. + if digester: + actual = digester.hexdigest() + if digest != actual: + raise DistlibException('%s digest mismatch for %s: expected ' + '%s, got %s' % (hasher, destfile, + digest, actual)) + logger.debug('Digest verified: %s', digest) + + def send_request(self, req): + """ + Send a standard library :class:`Request` to PyPI and return its + response. + + :param req: The request to send. + :return: The HTTP response from PyPI (a standard library HTTPResponse). + """ + handlers = [] + if self.password_handler: + handlers.append(self.password_handler) + if self.ssl_verifier: + handlers.append(self.ssl_verifier) + opener = build_opener(*handlers) + return opener.open(req) + + def encode_request(self, fields, files): + """ + Encode fields and files for posting to an HTTP server. + + :param fields: The fields to send as a list of (fieldname, value) + tuples. + :param files: The files to send as a list of (fieldname, filename, + file_bytes) tuple. + """ + # Adapted from packaging, which in turn was adapted from + # http://code.activestate.com/recipes/146306 + + parts = [] + boundary = self.boundary + for k, values in fields: + if not isinstance(values, (list, tuple)): + values = [values] + + for v in values: + parts.extend(( + b'--' + boundary, + ('Content-Disposition: form-data; name="%s"' % + k).encode('utf-8'), + b'', + v.encode('utf-8'))) + for key, filename, value in files: + parts.extend(( + b'--' + boundary, + ('Content-Disposition: form-data; name="%s"; filename="%s"' % + (key, filename)).encode('utf-8'), + b'', + value)) + + parts.extend((b'--' + boundary + b'--', b'')) + + body = b'\r\n'.join(parts) + ct = b'multipart/form-data; boundary=' + boundary + headers = { + 'Content-type': ct, + 'Content-length': str(len(body)) + } + return Request(self.url, body, headers) + + def search(self, terms, operator=None): + if isinstance(terms, string_types): + terms = {'name': terms} + rpc_proxy = ServerProxy(self.url, timeout=3.0) + try: + return rpc_proxy.search(terms, operator or 'and') + finally: + rpc_proxy('close')() diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/index.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/index.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a6cdd8d5537a29f77a88f01089a6f98c5bcc8431 GIT binary patch literal 20980 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 s2: + result = url1 + if result != url2: + logger.debug('Not replacing %r with %r', url1, url2) + else: + logger.debug('Replacing %r with %r', url1, url2) + return result + + def split_filename(self, filename, project_name): + """ + Attempt to split a filename in project name, version and Python version. + """ + return split_filename(filename, project_name) + + def convert_url_to_download_info(self, url, project_name): + """ + See if a URL is a candidate for a download URL for a project (the URL + has typically been scraped from an HTML page). + + If it is, a dictionary is returned with keys "name", "version", + "filename" and "url"; otherwise, None is returned. + """ + def same_project(name1, name2): + return normalize_name(name1) == normalize_name(name2) + + result = None + scheme, netloc, path, params, query, frag = urlparse(url) + if frag.lower().startswith('egg='): # pragma: no cover + logger.debug('%s: version hint in fragment: %r', + project_name, frag) + m = HASHER_HASH.match(frag) + if m: + algo, digest = m.groups() + else: + algo, digest = None, None + origpath = path + if path and path[-1] == '/': # pragma: no cover + path = path[:-1] + if path.endswith('.whl'): + try: + wheel = Wheel(path) + if not is_compatible(wheel, self.wheel_tags): + logger.debug('Wheel not compatible: %s', path) + else: + if project_name is None: + include = True + else: + include = same_project(wheel.name, project_name) + if include: + result = { + 'name': wheel.name, + 'version': wheel.version, + 'filename': wheel.filename, + 'url': urlunparse((scheme, netloc, origpath, + params, query, '')), + 'python-version': ', '.join( + ['.'.join(list(v[2:])) for v in wheel.pyver]), + } + except Exception as e: # pragma: no cover + logger.warning('invalid path for wheel: %s', path) + elif not path.endswith(self.downloadable_extensions): # pragma: no cover + logger.debug('Not downloadable: %s', path) + else: # downloadable extension + path = filename = posixpath.basename(path) + for ext in self.downloadable_extensions: + if path.endswith(ext): + path = path[:-len(ext)] + t = self.split_filename(path, project_name) + if not t: # pragma: no cover + logger.debug('No match for project/version: %s', path) + else: + name, version, pyver = t + if not project_name or same_project(project_name, name): + result = { + 'name': name, + 'version': version, + 'filename': filename, + 'url': urlunparse((scheme, netloc, origpath, + params, query, '')), + #'packagetype': 'sdist', + } + if pyver: # pragma: no cover + result['python-version'] = pyver + break + if result and algo: + result['%s_digest' % algo] = digest + return result + + def _get_digest(self, info): + """ + Get a digest from a dictionary by looking at a "digests" dictionary + or keys of the form 'algo_digest'. + + Returns a 2-tuple (algo, digest) if found, else None. Currently + looks only for SHA256, then MD5. + """ + result = None + if 'digests' in info: + digests = info['digests'] + for algo in ('sha256', 'md5'): + if algo in digests: + result = (algo, digests[algo]) + break + if not result: + for algo in ('sha256', 'md5'): + key = '%s_digest' % algo + if key in info: + result = (algo, info[key]) + break + return result + + def _update_version_data(self, result, info): + """ + Update a result dictionary (the final result from _get_project) with a + dictionary for a specific version, which typically holds information + gleaned from a filename or URL for an archive for the distribution. + """ + name = info.pop('name') + version = info.pop('version') + if version in result: + dist = result[version] + md = dist.metadata + else: + dist = make_dist(name, version, scheme=self.scheme) + md = dist.metadata + dist.digest = digest = self._get_digest(info) + url = info['url'] + result['digests'][url] = digest + if md.source_url != info['url']: + md.source_url = self.prefer_url(md.source_url, url) + result['urls'].setdefault(version, set()).add(url) + dist.locator = self + result[version] = dist + + def locate(self, requirement, prereleases=False): + """ + Find the most recent distribution which matches the given + requirement. + + :param requirement: A requirement of the form 'foo (1.0)' or perhaps + 'foo (>= 1.0, < 2.0, != 1.3)' + :param prereleases: If ``True``, allow pre-release versions + to be located. Otherwise, pre-release versions + are not returned. + :return: A :class:`Distribution` instance, or ``None`` if no such + distribution could be located. + """ + result = None + r = parse_requirement(requirement) + if r is None: # pragma: no cover + raise DistlibException('Not a valid requirement: %r' % requirement) + scheme = get_scheme(self.scheme) + self.matcher = matcher = scheme.matcher(r.requirement) + logger.debug('matcher: %s (%s)', matcher, type(matcher).__name__) + versions = self.get_project(r.name) + if len(versions) > 2: # urls and digests keys are present + # sometimes, versions are invalid + slist = [] + vcls = matcher.version_class + for k in versions: + if k in ('urls', 'digests'): + continue + try: + if not matcher.match(k): + logger.debug('%s did not match %r', matcher, k) + else: + if prereleases or not vcls(k).is_prerelease: + slist.append(k) + else: + logger.debug('skipping pre-release ' + 'version %s of %s', k, matcher.name) + except Exception: # pragma: no cover + logger.warning('error matching %s with %r', matcher, k) + pass # slist.append(k) + if len(slist) > 1: + slist = sorted(slist, key=scheme.key) + if slist: + logger.debug('sorted list: %s', slist) + version = slist[-1] + result = versions[version] + if result: + if r.extras: + result.extras = r.extras + result.download_urls = versions.get('urls', {}).get(version, set()) + d = {} + sd = versions.get('digests', {}) + for url in result.download_urls: + if url in sd: # pragma: no cover + d[url] = sd[url] + result.digests = d + self.matcher = None + return result + + +class PyPIRPCLocator(Locator): + """ + This locator uses XML-RPC to locate distributions. It therefore + cannot be used with simple mirrors (that only mirror file content). + """ + def __init__(self, url, **kwargs): + """ + Initialise an instance. + + :param url: The URL to use for XML-RPC. + :param kwargs: Passed to the superclass constructor. + """ + super(PyPIRPCLocator, self).__init__(**kwargs) + self.base_url = url + self.client = ServerProxy(url, timeout=3.0) + + def get_distribution_names(self): + """ + Return all the distribution names known to this locator. + """ + return set(self.client.list_packages()) + + def _get_project(self, name): + result = {'urls': {}, 'digests': {}} + versions = self.client.package_releases(name, True) + for v in versions: + urls = self.client.release_urls(name, v) + data = self.client.release_data(name, v) + metadata = Metadata(scheme=self.scheme) + metadata.name = data['name'] + metadata.version = data['version'] + metadata.license = data.get('license') + metadata.keywords = data.get('keywords', []) + metadata.summary = data.get('summary') + dist = Distribution(metadata) + if urls: + info = urls[0] + metadata.source_url = info['url'] + dist.digest = self._get_digest(info) + dist.locator = self + result[v] = dist + for info in urls: + url = info['url'] + digest = self._get_digest(info) + result['urls'].setdefault(v, set()).add(url) + result['digests'][url] = digest + return result + +class PyPIJSONLocator(Locator): + """ + This locator uses PyPI's JSON interface. It's very limited in functionality + and probably not worth using. + """ + def __init__(self, url, **kwargs): + super(PyPIJSONLocator, self).__init__(**kwargs) + self.base_url = ensure_slash(url) + + def get_distribution_names(self): + """ + Return all the distribution names known to this locator. + """ + raise NotImplementedError('Not available from this locator') + + def _get_project(self, name): + result = {'urls': {}, 'digests': {}} + url = urljoin(self.base_url, '%s/json' % quote(name)) + try: + resp = self.opener.open(url) + data = resp.read().decode() # for now + d = json.loads(data) + md = Metadata(scheme=self.scheme) + data = d['info'] + md.name = data['name'] + md.version = data['version'] + md.license = data.get('license') + md.keywords = data.get('keywords', []) + md.summary = data.get('summary') + dist = Distribution(md) + dist.locator = self + urls = d['urls'] + result[md.version] = dist + for info in d['urls']: + url = info['url'] + dist.download_urls.add(url) + dist.digests[url] = self._get_digest(info) + result['urls'].setdefault(md.version, set()).add(url) + result['digests'][url] = self._get_digest(info) + # Now get other releases + for version, infos in d['releases'].items(): + if version == md.version: + continue # already done + omd = Metadata(scheme=self.scheme) + omd.name = md.name + omd.version = version + odist = Distribution(omd) + odist.locator = self + result[version] = odist + for info in infos: + url = info['url'] + odist.download_urls.add(url) + odist.digests[url] = self._get_digest(info) + result['urls'].setdefault(version, set()).add(url) + result['digests'][url] = self._get_digest(info) +# for info in urls: +# md.source_url = info['url'] +# dist.digest = self._get_digest(info) +# dist.locator = self +# for info in urls: +# url = info['url'] +# result['urls'].setdefault(md.version, set()).add(url) +# result['digests'][url] = self._get_digest(info) + except Exception as e: + self.errors.put(text_type(e)) + logger.exception('JSON fetch failed: %s', e) + return result + + +class Page(object): + """ + This class represents a scraped HTML page. + """ + # The following slightly hairy-looking regex just looks for the contents of + # an anchor link, which has an attribute "href" either immediately preceded + # or immediately followed by a "rel" attribute. The attribute values can be + # declared with double quotes, single quotes or no quotes - which leads to + # the length of the expression. + _href = re.compile(""" +(rel\\s*=\\s*(?:"(?P[^"]*)"|'(?P[^']*)'|(?P[^>\\s\n]*))\\s+)? +href\\s*=\\s*(?:"(?P[^"]*)"|'(?P[^']*)'|(?P[^>\\s\n]*)) +(\\s+rel\\s*=\\s*(?:"(?P[^"]*)"|'(?P[^']*)'|(?P[^>\\s\n]*)))? +""", re.I | re.S | re.X) + _base = re.compile(r"""]+)""", re.I | re.S) + + def __init__(self, data, url): + """ + Initialise an instance with the Unicode page contents and the URL they + came from. + """ + self.data = data + self.base_url = self.url = url + m = self._base.search(self.data) + if m: + self.base_url = m.group(1) + + _clean_re = re.compile(r'[^a-z0-9$&+,/:;=?@.#%_\\|-]', re.I) + + @cached_property + def links(self): + """ + Return the URLs of all the links on a page together with information + about their "rel" attribute, for determining which ones to treat as + downloads and which ones to queue for further scraping. + """ + def clean(url): + "Tidy up an URL." + scheme, netloc, path, params, query, frag = urlparse(url) + return urlunparse((scheme, netloc, quote(path), + params, query, frag)) + + result = set() + for match in self._href.finditer(self.data): + d = match.groupdict('') + rel = (d['rel1'] or d['rel2'] or d['rel3'] or + d['rel4'] or d['rel5'] or d['rel6']) + url = d['url1'] or d['url2'] or d['url3'] + url = urljoin(self.base_url, url) + url = unescape(url) + url = self._clean_re.sub(lambda m: '%%%2x' % ord(m.group(0)), url) + result.add((url, rel)) + # We sort the result, hoping to bring the most recent versions + # to the front + result = sorted(result, key=lambda t: t[0], reverse=True) + return result + + +class SimpleScrapingLocator(Locator): + """ + A locator which scrapes HTML pages to locate downloads for a distribution. + This runs multiple threads to do the I/O; performance is at least as good + as pip's PackageFinder, which works in an analogous fashion. + """ + + # These are used to deal with various Content-Encoding schemes. + decoders = { + 'deflate': zlib.decompress, + 'gzip': lambda b: gzip.GzipFile(fileobj=BytesIO(d)).read(), + 'none': lambda b: b, + } + + def __init__(self, url, timeout=None, num_workers=10, **kwargs): + """ + Initialise an instance. + :param url: The root URL to use for scraping. + :param timeout: The timeout, in seconds, to be applied to requests. + This defaults to ``None`` (no timeout specified). + :param num_workers: The number of worker threads you want to do I/O, + This defaults to 10. + :param kwargs: Passed to the superclass. + """ + super(SimpleScrapingLocator, self).__init__(**kwargs) + self.base_url = ensure_slash(url) + self.timeout = timeout + self._page_cache = {} + self._seen = set() + self._to_fetch = queue.Queue() + self._bad_hosts = set() + self.skip_externals = False + self.num_workers = num_workers + self._lock = threading.RLock() + # See issue #45: we need to be resilient when the locator is used + # in a thread, e.g. with concurrent.futures. We can't use self._lock + # as it is for coordinating our internal threads - the ones created + # in _prepare_threads. + self._gplock = threading.RLock() + self.platform_check = False # See issue #112 + + def _prepare_threads(self): + """ + Threads are created only when get_project is called, and terminate + before it returns. They are there primarily to parallelise I/O (i.e. + fetching web pages). + """ + self._threads = [] + for i in range(self.num_workers): + t = threading.Thread(target=self._fetch) + t.setDaemon(True) + t.start() + self._threads.append(t) + + def _wait_threads(self): + """ + Tell all the threads to terminate (by sending a sentinel value) and + wait for them to do so. + """ + # Note that you need two loops, since you can't say which + # thread will get each sentinel + for t in self._threads: + self._to_fetch.put(None) # sentinel + for t in self._threads: + t.join() + self._threads = [] + + def _get_project(self, name): + result = {'urls': {}, 'digests': {}} + with self._gplock: + self.result = result + self.project_name = name + url = urljoin(self.base_url, '%s/' % quote(name)) + self._seen.clear() + self._page_cache.clear() + self._prepare_threads() + try: + logger.debug('Queueing %s', url) + self._to_fetch.put(url) + self._to_fetch.join() + finally: + self._wait_threads() + del self.result + return result + + platform_dependent = re.compile(r'\b(linux_(i\d86|x86_64|arm\w+)|' + r'win(32|_amd64)|macosx_?\d+)\b', re.I) + + def _is_platform_dependent(self, url): + """ + Does an URL refer to a platform-specific download? + """ + return self.platform_dependent.search(url) + + def _process_download(self, url): + """ + See if an URL is a suitable download for a project. + + If it is, register information in the result dictionary (for + _get_project) about the specific version it's for. + + Note that the return value isn't actually used other than as a boolean + value. + """ + if self.platform_check and self._is_platform_dependent(url): + info = None + else: + info = self.convert_url_to_download_info(url, self.project_name) + logger.debug('process_download: %s -> %s', url, info) + if info: + with self._lock: # needed because self.result is shared + self._update_version_data(self.result, info) + return info + + def _should_queue(self, link, referrer, rel): + """ + Determine whether a link URL from a referring page and with a + particular "rel" attribute should be queued for scraping. + """ + scheme, netloc, path, _, _, _ = urlparse(link) + if path.endswith(self.source_extensions + self.binary_extensions + + self.excluded_extensions): + result = False + elif self.skip_externals and not link.startswith(self.base_url): + result = False + elif not referrer.startswith(self.base_url): + result = False + elif rel not in ('homepage', 'download'): + result = False + elif scheme not in ('http', 'https', 'ftp'): + result = False + elif self._is_platform_dependent(link): + result = False + else: + host = netloc.split(':', 1)[0] + if host.lower() == 'localhost': + result = False + else: + result = True + logger.debug('should_queue: %s (%s) from %s -> %s', link, rel, + referrer, result) + return result + + def _fetch(self): + """ + Get a URL to fetch from the work queue, get the HTML page, examine its + links for download candidates and candidates for further scraping. + + This is a handy method to run in a thread. + """ + while True: + url = self._to_fetch.get() + try: + if url: + page = self.get_page(url) + if page is None: # e.g. after an error + continue + for link, rel in page.links: + if link not in self._seen: + try: + self._seen.add(link) + if (not self._process_download(link) and + self._should_queue(link, url, rel)): + logger.debug('Queueing %s from %s', link, url) + self._to_fetch.put(link) + except MetadataInvalidError: # e.g. invalid versions + pass + except Exception as e: # pragma: no cover + self.errors.put(text_type(e)) + finally: + # always do this, to avoid hangs :-) + self._to_fetch.task_done() + if not url: + #logger.debug('Sentinel seen, quitting.') + break + + def get_page(self, url): + """ + Get the HTML for an URL, possibly from an in-memory cache. + + XXX TODO Note: this cache is never actually cleared. It's assumed that + the data won't get stale over the lifetime of a locator instance (not + necessarily true for the default_locator). + """ + # http://peak.telecommunity.com/DevCenter/EasyInstall#package-index-api + scheme, netloc, path, _, _, _ = urlparse(url) + if scheme == 'file' and os.path.isdir(url2pathname(path)): + url = urljoin(ensure_slash(url), 'index.html') + + if url in self._page_cache: + result = self._page_cache[url] + logger.debug('Returning %s from cache: %s', url, result) + else: + host = netloc.split(':', 1)[0] + result = None + if host in self._bad_hosts: + logger.debug('Skipping %s due to bad host %s', url, host) + else: + req = Request(url, headers={'Accept-encoding': 'identity'}) + try: + logger.debug('Fetching %s', url) + resp = self.opener.open(req, timeout=self.timeout) + logger.debug('Fetched %s', url) + headers = resp.info() + content_type = headers.get('Content-Type', '') + if HTML_CONTENT_TYPE.match(content_type): + final_url = resp.geturl() + data = resp.read() + encoding = headers.get('Content-Encoding') + if encoding: + decoder = self.decoders[encoding] # fail if not found + data = decoder(data) + encoding = 'utf-8' + m = CHARSET.search(content_type) + if m: + encoding = m.group(1) + try: + data = data.decode(encoding) + except UnicodeError: # pragma: no cover + data = data.decode('latin-1') # fallback + result = Page(data, final_url) + self._page_cache[final_url] = result + except HTTPError as e: + if e.code != 404: + logger.exception('Fetch failed: %s: %s', url, e) + except URLError as e: # pragma: no cover + logger.exception('Fetch failed: %s: %s', url, e) + with self._lock: + self._bad_hosts.add(host) + except Exception as e: # pragma: no cover + logger.exception('Fetch failed: %s: %s', url, e) + finally: + self._page_cache[url] = result # even if None (failure) + return result + + _distname_re = re.compile(']*>([^<]+)<') + + def get_distribution_names(self): + """ + Return all the distribution names known to this locator. + """ + result = set() + page = self.get_page(self.base_url) + if not page: + raise DistlibException('Unable to get %s' % self.base_url) + for match in self._distname_re.finditer(page.data): + result.add(match.group(1)) + return result + +class DirectoryLocator(Locator): + """ + This class locates distributions in a directory tree. + """ + + def __init__(self, path, **kwargs): + """ + Initialise an instance. + :param path: The root of the directory tree to search. + :param kwargs: Passed to the superclass constructor, + except for: + * recursive - if True (the default), subdirectories are + recursed into. If False, only the top-level directory + is searched, + """ + self.recursive = kwargs.pop('recursive', True) + super(DirectoryLocator, self).__init__(**kwargs) + path = os.path.abspath(path) + if not os.path.isdir(path): # pragma: no cover + raise DistlibException('Not a directory: %r' % path) + self.base_dir = path + + def should_include(self, filename, parent): + """ + Should a filename be considered as a candidate for a distribution + archive? As well as the filename, the directory which contains it + is provided, though not used by the current implementation. + """ + return filename.endswith(self.downloadable_extensions) + + def _get_project(self, name): + result = {'urls': {}, 'digests': {}} + for root, dirs, files in os.walk(self.base_dir): + for fn in files: + if self.should_include(fn, root): + fn = os.path.join(root, fn) + url = urlunparse(('file', '', + pathname2url(os.path.abspath(fn)), + '', '', '')) + info = self.convert_url_to_download_info(url, name) + if info: + self._update_version_data(result, info) + if not self.recursive: + break + return result + + def get_distribution_names(self): + """ + Return all the distribution names known to this locator. + """ + result = set() + for root, dirs, files in os.walk(self.base_dir): + for fn in files: + if self.should_include(fn, root): + fn = os.path.join(root, fn) + url = urlunparse(('file', '', + pathname2url(os.path.abspath(fn)), + '', '', '')) + info = self.convert_url_to_download_info(url, None) + if info: + result.add(info['name']) + if not self.recursive: + break + return result + +class JSONLocator(Locator): + """ + This locator uses special extended metadata (not available on PyPI) and is + the basis of performant dependency resolution in distlib. Other locators + require archive downloads before dependencies can be determined! As you + might imagine, that can be slow. + """ + def get_distribution_names(self): + """ + Return all the distribution names known to this locator. + """ + raise NotImplementedError('Not available from this locator') + + def _get_project(self, name): + result = {'urls': {}, 'digests': {}} + data = get_project_data(name) + if data: + for info in data.get('files', []): + if info['ptype'] != 'sdist' or info['pyversion'] != 'source': + continue + # We don't store summary in project metadata as it makes + # the data bigger for no benefit during dependency + # resolution + dist = make_dist(data['name'], info['version'], + summary=data.get('summary', + 'Placeholder for summary'), + scheme=self.scheme) + md = dist.metadata + md.source_url = info['url'] + # TODO SHA256 digest + if 'digest' in info and info['digest']: + dist.digest = ('md5', info['digest']) + md.dependencies = info.get('requirements', {}) + dist.exports = info.get('exports', {}) + result[dist.version] = dist + result['urls'].setdefault(dist.version, set()).add(info['url']) + return result + +class DistPathLocator(Locator): + """ + This locator finds installed distributions in a path. It can be useful for + adding to an :class:`AggregatingLocator`. + """ + def __init__(self, distpath, **kwargs): + """ + Initialise an instance. + + :param distpath: A :class:`DistributionPath` instance to search. + """ + super(DistPathLocator, self).__init__(**kwargs) + assert isinstance(distpath, DistributionPath) + self.distpath = distpath + + def _get_project(self, name): + dist = self.distpath.get_distribution(name) + if dist is None: + result = {'urls': {}, 'digests': {}} + else: + result = { + dist.version: dist, + 'urls': {dist.version: set([dist.source_url])}, + 'digests': {dist.version: set([None])} + } + return result + + +class AggregatingLocator(Locator): + """ + This class allows you to chain and/or merge a list of locators. + """ + def __init__(self, *locators, **kwargs): + """ + Initialise an instance. + + :param locators: The list of locators to search. + :param kwargs: Passed to the superclass constructor, + except for: + * merge - if False (the default), the first successful + search from any of the locators is returned. If True, + the results from all locators are merged (this can be + slow). + """ + self.merge = kwargs.pop('merge', False) + self.locators = locators + super(AggregatingLocator, self).__init__(**kwargs) + + def clear_cache(self): + super(AggregatingLocator, self).clear_cache() + for locator in self.locators: + locator.clear_cache() + + def _set_scheme(self, value): + self._scheme = value + for locator in self.locators: + locator.scheme = value + + scheme = property(Locator.scheme.fget, _set_scheme) + + def _get_project(self, name): + result = {} + for locator in self.locators: + d = locator.get_project(name) + if d: + if self.merge: + files = result.get('urls', {}) + digests = result.get('digests', {}) + # next line could overwrite result['urls'], result['digests'] + result.update(d) + df = result.get('urls') + if files and df: + for k, v in files.items(): + if k in df: + df[k] |= v + else: + df[k] = v + dd = result.get('digests') + if digests and dd: + dd.update(digests) + else: + # See issue #18. If any dists are found and we're looking + # for specific constraints, we only return something if + # a match is found. For example, if a DirectoryLocator + # returns just foo (1.0) while we're looking for + # foo (>= 2.0), we'll pretend there was nothing there so + # that subsequent locators can be queried. Otherwise we + # would just return foo (1.0) which would then lead to a + # failure to find foo (>= 2.0), because other locators + # weren't searched. Note that this only matters when + # merge=False. + if self.matcher is None: + found = True + else: + found = False + for k in d: + if self.matcher.match(k): + found = True + break + if found: + result = d + break + return result + + def get_distribution_names(self): + """ + Return all the distribution names known to this locator. + """ + result = set() + for locator in self.locators: + try: + result |= locator.get_distribution_names() + except NotImplementedError: + pass + return result + + +# We use a legacy scheme simply because most of the dists on PyPI use legacy +# versions which don't conform to PEP 426 / PEP 440. +default_locator = AggregatingLocator( + JSONLocator(), + SimpleScrapingLocator('https://pypi.org/simple/', + timeout=3.0), + scheme='legacy') + +locate = default_locator.locate + +NAME_VERSION_RE = re.compile(r'(?P[\w-]+)\s*' + r'\(\s*(==\s*)?(?P[^)]+)\)$') + +class DependencyFinder(object): + """ + Locate dependencies for distributions. + """ + + def __init__(self, locator=None): + """ + Initialise an instance, using the specified locator + to locate distributions. + """ + self.locator = locator or default_locator + self.scheme = get_scheme(self.locator.scheme) + + def add_distribution(self, dist): + """ + Add a distribution to the finder. This will update internal information + about who provides what. + :param dist: The distribution to add. + """ + logger.debug('adding distribution %s', dist) + name = dist.key + self.dists_by_name[name] = dist + self.dists[(name, dist.version)] = dist + for p in dist.provides: + name, version = parse_name_and_version(p) + logger.debug('Add to provided: %s, %s, %s', name, version, dist) + self.provided.setdefault(name, set()).add((version, dist)) + + def remove_distribution(self, dist): + """ + Remove a distribution from the finder. This will update internal + information about who provides what. + :param dist: The distribution to remove. + """ + logger.debug('removing distribution %s', dist) + name = dist.key + del self.dists_by_name[name] + del self.dists[(name, dist.version)] + for p in dist.provides: + name, version = parse_name_and_version(p) + logger.debug('Remove from provided: %s, %s, %s', name, version, dist) + s = self.provided[name] + s.remove((version, dist)) + if not s: + del self.provided[name] + + def get_matcher(self, reqt): + """ + Get a version matcher for a requirement. + :param reqt: The requirement + :type reqt: str + :return: A version matcher (an instance of + :class:`distlib.version.Matcher`). + """ + try: + matcher = self.scheme.matcher(reqt) + except UnsupportedVersionError: # pragma: no cover + # XXX compat-mode if cannot read the version + name = reqt.split()[0] + matcher = self.scheme.matcher(name) + return matcher + + def find_providers(self, reqt): + """ + Find the distributions which can fulfill a requirement. + + :param reqt: The requirement. + :type reqt: str + :return: A set of distribution which can fulfill the requirement. + """ + matcher = self.get_matcher(reqt) + name = matcher.key # case-insensitive + result = set() + provided = self.provided + if name in provided: + for version, provider in provided[name]: + try: + match = matcher.match(version) + except UnsupportedVersionError: + match = False + + if match: + result.add(provider) + break + return result + + def try_to_replace(self, provider, other, problems): + """ + Attempt to replace one provider with another. This is typically used + when resolving dependencies from multiple sources, e.g. A requires + (B >= 1.0) while C requires (B >= 1.1). + + For successful replacement, ``provider`` must meet all the requirements + which ``other`` fulfills. + + :param provider: The provider we are trying to replace with. + :param other: The provider we're trying to replace. + :param problems: If False is returned, this will contain what + problems prevented replacement. This is currently + a tuple of the literal string 'cantreplace', + ``provider``, ``other`` and the set of requirements + that ``provider`` couldn't fulfill. + :return: True if we can replace ``other`` with ``provider``, else + False. + """ + rlist = self.reqts[other] + unmatched = set() + for s in rlist: + matcher = self.get_matcher(s) + if not matcher.match(provider.version): + unmatched.add(s) + if unmatched: + # can't replace other with provider + problems.add(('cantreplace', provider, other, + frozenset(unmatched))) + result = False + else: + # can replace other with provider + self.remove_distribution(other) + del self.reqts[other] + for s in rlist: + self.reqts.setdefault(provider, set()).add(s) + self.add_distribution(provider) + result = True + return result + + def find(self, requirement, meta_extras=None, prereleases=False): + """ + Find a distribution and all distributions it depends on. + + :param requirement: The requirement specifying the distribution to + find, or a Distribution instance. + :param meta_extras: A list of meta extras such as :test:, :build: and + so on. + :param prereleases: If ``True``, allow pre-release versions to be + returned - otherwise, don't return prereleases + unless they're all that's available. + + Return a set of :class:`Distribution` instances and a set of + problems. + + The distributions returned should be such that they have the + :attr:`required` attribute set to ``True`` if they were + from the ``requirement`` passed to ``find()``, and they have the + :attr:`build_time_dependency` attribute set to ``True`` unless they + are post-installation dependencies of the ``requirement``. + + The problems should be a tuple consisting of the string + ``'unsatisfied'`` and the requirement which couldn't be satisfied + by any distribution known to the locator. + """ + + self.provided = {} + self.dists = {} + self.dists_by_name = {} + self.reqts = {} + + meta_extras = set(meta_extras or []) + if ':*:' in meta_extras: + meta_extras.remove(':*:') + # :meta: and :run: are implicitly included + meta_extras |= set([':test:', ':build:', ':dev:']) + + if isinstance(requirement, Distribution): + dist = odist = requirement + logger.debug('passed %s as requirement', odist) + else: + dist = odist = self.locator.locate(requirement, + prereleases=prereleases) + if dist is None: + raise DistlibException('Unable to locate %r' % requirement) + logger.debug('located %s', odist) + dist.requested = True + problems = set() + todo = set([dist]) + install_dists = set([odist]) + while todo: + dist = todo.pop() + name = dist.key # case-insensitive + if name not in self.dists_by_name: + self.add_distribution(dist) + else: + #import pdb; pdb.set_trace() + other = self.dists_by_name[name] + if other != dist: + self.try_to_replace(dist, other, problems) + + ireqts = dist.run_requires | dist.meta_requires + sreqts = dist.build_requires + ereqts = set() + if meta_extras and dist in install_dists: + for key in ('test', 'build', 'dev'): + e = ':%s:' % key + if e in meta_extras: + ereqts |= getattr(dist, '%s_requires' % key) + all_reqts = ireqts | sreqts | ereqts + for r in all_reqts: + providers = self.find_providers(r) + if not providers: + logger.debug('No providers found for %r', r) + provider = self.locator.locate(r, prereleases=prereleases) + # If no provider is found and we didn't consider + # prereleases, consider them now. + if provider is None and not prereleases: + provider = self.locator.locate(r, prereleases=True) + if provider is None: + logger.debug('Cannot satisfy %r', r) + problems.add(('unsatisfied', r)) + else: + n, v = provider.key, provider.version + if (n, v) not in self.dists: + todo.add(provider) + providers.add(provider) + if r in ireqts and dist in install_dists: + install_dists.add(provider) + logger.debug('Adding %s to install_dists', + provider.name_and_version) + for p in providers: + name = p.key + if name not in self.dists_by_name: + self.reqts.setdefault(p, set()).add(r) + else: + other = self.dists_by_name[name] + if other != p: + # see if other can be replaced by p + self.try_to_replace(p, other, problems) + + dists = set(self.dists.values()) + for dist in dists: + dist.build_time_dependency = dist not in install_dists + if dist.build_time_dependency: + logger.debug('%s is a build-time dependency only.', + dist.name_and_version) + logger.debug('find done for %s', odist) + return dists, problems diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/locators 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/locators 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3aced0876988def45ef6b0bad813d30d1fe9253f GIT binary patch literal 49881 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

...' % action) + + thedir = convert_path(words[1]) + patterns = [convert_path(word) for word in words[2:]] + + elif action in ('graft', 'prune'): + if len(words) != 2: + raise DistlibException( + '%r expects a single ' % action) + + dir_pattern = convert_path(words[1]) + + else: + raise DistlibException('unknown action %r' % action) + + return action, patterns, thedir, dir_pattern + + def _include_pattern(self, pattern, anchor=True, prefix=None, + is_regex=False): + """Select strings (presumably filenames) from 'self.files' that + match 'pattern', a Unix-style wildcard (glob) pattern. + + Patterns are not quite the same as implemented by the 'fnmatch' + module: '*' and '?' match non-special characters, where "special" + is platform-dependent: slash on Unix; colon, slash, and backslash on + DOS/Windows; and colon on Mac OS. + + If 'anchor' is true (the default), then the pattern match is more + stringent: "*.py" will match "foo.py" but not "foo/bar.py". If + 'anchor' is false, both of these will match. + + If 'prefix' is supplied, then only filenames starting with 'prefix' + (itself a pattern) and ending with 'pattern', with anything in between + them, will match. 'anchor' is ignored in this case. + + If 'is_regex' is true, 'anchor' and 'prefix' are ignored, and + 'pattern' is assumed to be either a string containing a regex or a + regex object -- no translation is done, the regex is just compiled + and used as-is. + + Selected strings will be added to self.files. + + Return True if files are found. + """ + # XXX docstring lying about what the special chars are? + found = False + pattern_re = self._translate_pattern(pattern, anchor, prefix, is_regex) + + # delayed loading of allfiles list + if self.allfiles is None: + self.findall() + + for name in self.allfiles: + if pattern_re.search(name): + self.files.add(name) + found = True + return found + + def _exclude_pattern(self, pattern, anchor=True, prefix=None, + is_regex=False): + """Remove strings (presumably filenames) from 'files' that match + 'pattern'. + + Other parameters are the same as for 'include_pattern()', above. + The list 'self.files' is modified in place. Return True if files are + found. + + This API is public to allow e.g. exclusion of SCM subdirs, e.g. when + packaging source distributions + """ + found = False + pattern_re = self._translate_pattern(pattern, anchor, prefix, is_regex) + for f in list(self.files): + if pattern_re.search(f): + self.files.remove(f) + found = True + return found + + def _translate_pattern(self, pattern, anchor=True, prefix=None, + is_regex=False): + """Translate a shell-like wildcard pattern to a compiled regular + expression. + + Return the compiled regex. If 'is_regex' true, + then 'pattern' is directly compiled to a regex (if it's a string) + or just returned as-is (assumes it's a regex object). + """ + if is_regex: + if isinstance(pattern, str): + return re.compile(pattern) + else: + return pattern + + if _PYTHON_VERSION > (3, 2): + # ditch start and end characters + start, _, end = self._glob_to_re('_').partition('_') + + if pattern: + pattern_re = self._glob_to_re(pattern) + if _PYTHON_VERSION > (3, 2): + assert pattern_re.startswith(start) and pattern_re.endswith(end) + else: + pattern_re = '' + + base = re.escape(os.path.join(self.base, '')) + if prefix is not None: + # ditch end of pattern character + if _PYTHON_VERSION <= (3, 2): + empty_pattern = self._glob_to_re('') + prefix_re = self._glob_to_re(prefix)[:-len(empty_pattern)] + else: + prefix_re = self._glob_to_re(prefix) + assert prefix_re.startswith(start) and prefix_re.endswith(end) + prefix_re = prefix_re[len(start): len(prefix_re) - len(end)] + sep = os.sep + if os.sep == '\\': + sep = r'\\' + if _PYTHON_VERSION <= (3, 2): + pattern_re = '^' + base + sep.join((prefix_re, + '.*' + pattern_re)) + else: + pattern_re = pattern_re[len(start): len(pattern_re) - len(end)] + pattern_re = r'%s%s%s%s.*%s%s' % (start, base, prefix_re, sep, + pattern_re, end) + else: # no prefix -- respect anchor flag + if anchor: + if _PYTHON_VERSION <= (3, 2): + pattern_re = '^' + base + pattern_re + else: + pattern_re = r'%s%s%s' % (start, base, pattern_re[len(start):]) + + return re.compile(pattern_re) + + def _glob_to_re(self, pattern): + """Translate a shell-like glob pattern to a regular expression. + + Return a string containing the regex. Differs from + 'fnmatch.translate()' in that '*' does not match "special characters" + (which are platform-specific). + """ + pattern_re = fnmatch.translate(pattern) + + # '?' and '*' in the glob pattern become '.' and '.*' in the RE, which + # IMHO is wrong -- '?' and '*' aren't supposed to match slash in Unix, + # and by extension they shouldn't match such "special characters" under + # any OS. So change all non-escaped dots in the RE to match any + # character except the special characters (currently: just os.sep). + sep = os.sep + if os.sep == '\\': + # we're using a regex to manipulate a regex, so we need + # to escape the backslash twice + sep = r'\\\\' + escaped = r'\1[^%s]' % sep + pattern_re = re.sub(r'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 ...' % action) + + patterns = [convert_path(word) for word in words[1:]] + + elif action in ('recursive-include', 'recursive-exclude'): + if len(words) < 3: + raise DistlibException( + '%r expects ...' % action) + + thedir = convert_path(words[1]) + patterns = [convert_path(word) for word in words[2:]] + + elif action in ('graft', 'prune'): + if len(words) != 2: + raise DistlibException( + '%r expects a single ' % action) + + dir_pattern = convert_path(words[1]) + + else: + raise DistlibException('unknown action %r' % action) + + return action, patterns, thedir, dir_pattern + + def _include_pattern(self, pattern, anchor=True, prefix=None, + is_regex=False): + """Select strings (presumably filenames) from 'self.files' that + match 'pattern', a Unix-style wildcard (glob) pattern. + + Patterns are not quite the same as implemented by the 'fnmatch' + module: '*' and '?' match non-special characters, where "special" + is platform-dependent: slash on Unix; colon, slash, and backslash on + DOS/Windows; and colon on Mac OS. + + If 'anchor' is true (the default), then the pattern match is more + stringent: "*.py" will match "foo.py" but not "foo/bar.py". If + 'anchor' is false, both of these will match. + + If 'prefix' is supplied, then only filenames starting with 'prefix' + (itself a pattern) and ending with 'pattern', with anything in between + them, will match. 'anchor' is ignored in this case. + + If 'is_regex' is true, 'anchor' and 'prefix' are ignored, and + 'pattern' is assumed to be either a string containing a regex or a + regex object -- no translation is done, the regex is just compiled + and used as-is. + + Selected strings will be added to self.files. + + Return True if files are found. + """ + # XXX docstring lying about what the special chars are? + found = False + pattern_re = self._translate_pattern(pattern, anchor, prefix, is_regex) + + # delayed loading of allfiles list + if self.allfiles is None: + self.findall() + + for name in self.allfiles: + if pattern_re.search(name): + self.files.add(name) + found = True + return found + + def _exclude_pattern(self, pattern, anchor=True, prefix=None, + is_regex=False): + """Remove strings (presumably filenames) from 'files' that match + 'pattern'. + + Other parameters are the same as for 'include_pattern()', above. + The list 'self.files' is modified in place. Return True if files are + found. + + This API is public to allow e.g. exclusion of SCM subdirs, e.g. when + packaging source distributions + """ + found = False + pattern_re = self._translate_pattern(pattern, anchor, prefix, is_regex) + for f in list(self.files): + if pattern_re.search(f): + self.files.remove(f) + found = True + return found + + def _translate_pattern(self, pattern, anchor=True, prefix=None, + is_regex=False): + """Translate a shell-like wildcard pattern to a compiled regular + expression. + + Return the compiled regex. If 'is_regex' true, + then 'pattern' is directly compiled to a regex (if it's a string) + or just returned as-is (assumes it's a regex object). + """ + if is_regex: + if isinstance(pattern, str): + return re.compile(pattern) + else: + return pattern + + if _PYTHON_VERSION > (3, 2): + # ditch start and end characters + start, _, end = self._glob_to_re('_').partition('_') + + if pattern: + pattern_re = self._glob_to_re(pattern) + if _PYTHON_VERSION > (3, 2): + assert pattern_re.startswith(start) and pattern_re.endswith(end) + else: + pattern_re = '' + + base = re.escape(os.path.join(self.base, '')) + if prefix is not None: + # ditch end of pattern character + if _PYTHON_VERSION <= (3, 2): + empty_pattern = self._glob_to_re('') + prefix_re = self._glob_to_re(prefix)[:-len(empty_pattern)] + else: + prefix_re = self._glob_to_re(prefix) + assert prefix_re.startswith(start) and prefix_re.endswith(end) + prefix_re = prefix_re[len(start): len(prefix_re) - len(end)] + sep = os.sep + if os.sep == '\\': + sep = r'\\' + if _PYTHON_VERSION <= (3, 2): + pattern_re = '^' + base + sep.join((prefix_re, + '.*' + pattern_re)) + else: + pattern_re = pattern_re[len(start): len(pattern_re) - len(end)] + pattern_re = r'%s%s%s%s.*%s%s' % (start, base, prefix_re, sep, + pattern_re, end) + else: # no prefix -- respect anchor flag + if anchor: + if _PYTHON_VERSION <= (3, 2): + pattern_re = '^' + base + pattern_re + else: + pattern_re = r'%s%s%s' % (start, base, pattern_re[len(start):]) + + return re.compile(pattern_re) + + def _glob_to_re(self, pattern): + """Translate a shell-like glob pattern to a regular expression. + + Return a string containing the regex. Differs from + 'fnmatch.translate()' in that '*' does not match "special characters" + (which are platform-specific). + """ + pattern_re = fnmatch.translate(pattern) + + # '?' and '*' in the glob pattern become '.' and '.*' in the RE, which + # IMHO is wrong -- '?' and '*' aren't supposed to match slash in Unix, + # and by extension they shouldn't match such "special characters" under + # any OS. So change all non-escaped dots in the RE to match any + # character except the special characters (currently: just os.sep). + sep = os.sep + if os.sep == '\\': + # we're using a regex to manipulate a regex, so we need + # to escape the backslash twice + sep = r'\\\\' + escaped = r'\1[^%s]' % sep + pattern_re = re.sub(r'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 GqVQk%q70}2 literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/markers 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/markers 2.py new file mode 100644 index 0000000..ee1f3e2 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/markers 2.py @@ -0,0 +1,131 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2012-2017 Vinay Sajip. +# Licensed to the Python Software Foundation under a contributor agreement. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +""" +Parser for the environment markers micro-language defined in PEP 508. +""" + +# Note: In PEP 345, the micro-language was Python compatible, so the ast +# module could be used to parse it. However, PEP 508 introduced operators such +# as ~= and === which aren't in Python, necessitating a different approach. + +import os +import sys +import platform +import re + +from .compat import python_implementation, urlparse, string_types +from .util import in_venv, parse_marker + +__all__ = ['interpret'] + +def _is_literal(o): + if not isinstance(o, string_types) or not o: + return False + return o[0] in '\'"' + +class Evaluator(object): + """ + This class is used to evaluate marker expessions. + """ + + operations = { + '==': lambda x, y: x == y, + '===': lambda x, y: x == y, + '~=': lambda x, y: x == y or x > y, + '!=': lambda x, y: x != y, + '<': lambda x, y: x < y, + '<=': lambda x, y: x == y or x < y, + '>': lambda x, y: x > y, + '>=': lambda x, y: x == y or x > y, + 'and': lambda x, y: x and y, + 'or': lambda x, y: x or y, + 'in': lambda x, y: x in y, + 'not in': lambda x, y: x not in y, + } + + def evaluate(self, expr, context): + """ + Evaluate a marker expression returned by the :func:`parse_requirement` + function in the specified context. + """ + if isinstance(expr, string_types): + if expr[0] in '\'"': + result = expr[1:-1] + else: + if expr not in context: + raise SyntaxError('unknown variable: %s' % expr) + result = context[expr] + else: + assert isinstance(expr, dict) + op = expr['op'] + if op not in self.operations: + raise NotImplementedError('op not implemented: %s' % op) + elhs = expr['lhs'] + erhs = expr['rhs'] + if _is_literal(expr['lhs']) and _is_literal(expr['rhs']): + raise SyntaxError('invalid comparison: %s %s %s' % (elhs, op, erhs)) + + lhs = self.evaluate(elhs, context) + rhs = self.evaluate(erhs, context) + result = self.operations[op](lhs, rhs) + return result + +def default_context(): + def format_full_version(info): + version = '%s.%s.%s' % (info.major, info.minor, info.micro) + kind = info.releaselevel + if kind != 'final': + version += kind[0] + str(info.serial) + return version + + if hasattr(sys, 'implementation'): + implementation_version = format_full_version(sys.implementation.version) + implementation_name = sys.implementation.name + else: + implementation_version = '0' + implementation_name = '' + + result = { + 'implementation_name': implementation_name, + 'implementation_version': implementation_version, + 'os_name': os.name, + 'platform_machine': platform.machine(), + 'platform_python_implementation': platform.python_implementation(), + 'platform_release': platform.release(), + 'platform_system': platform.system(), + 'platform_version': platform.version(), + 'platform_in_venv': str(in_venv()), + 'python_full_version': platform.python_version(), + 'python_version': platform.python_version()[:3], + 'sys_platform': sys.platform, + } + return result + +DEFAULT_CONTEXT = default_context() +del default_context + +evaluator = Evaluator() + +def interpret(marker, execution_context=None): + """ + Interpret a marker and return a result depending on environment. + + :param marker: The marker to interpret. + :type marker: str + :param execution_context: The context used for name lookup. + :type execution_context: mapping + """ + try: + expr, rest = parse_marker(marker) + except Exception as e: + raise SyntaxError('Unable to interpret marker syntax: %s: %s' % (marker, e)) + if rest and rest[0] != '#': + raise SyntaxError('unexpected trailing data in marker: %s: %s' % (marker, rest)) + context = dict(DEFAULT_CONTEXT) + if execution_context: + context.update(execution_context) + return evaluator.evaluate(expr, context) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/markers 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/markers 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cbe61c73af89cd38f7ac52df353161fbe903be4c GIT binary patch literal 7112 zcmd5>-EtgP5$@TQR@${>$$wH5T*(A*vN2dI#b&fKD~&We zGn#W&ktm4^oHwAjBa!c_NJOEel0PuZ1JFAs#TyQ1r?i}^`nRB{N_v!O>tNO3m z#$Ug^_nWQ^KUMtw0FU_#ia?}|(vhGdu_J8|1znMLrKGFUu9ozKv?nA$bwc7v>DQ!P zlm3*nr=&kE?P+n?Hz{#l`VDC}q<=x$7tmUhElfWn!IXT1HD@K5mhhtVuv(oh&qRLJ zo|B-V-SZO8v#EVaz63p|^kp&`T##=t(N)rqn=_Q-6BLa{es03t?WMVEw?j8f_M<#a z`e9<-zMt=gxpDhZH&1WHezG<2w?a1vdr=YwZj`u>)*rb)Uiry#BlNNTKoQ;ueVq5*-BbZT3M9c($(Vl)`O4M&7-Gm(ucbc zq6e5azd9SRPDnl~#puGoWUbx(I4csd-SB zl)4P+ic(iWT~lfS)S^NhXXXT@YL7hVTM~>|B1Wj09NZu)7f~3R;Jud#vw)6~in41ZJ@KNt&XZto zj|8J3{qEIDs-ACI-Z>@9Td$Ty&bKTyc{Mma)puV!JO9Pp&be5;;EHoZbG!R$6`k{= zbF-91RdoMj$M+3M%fOsEC)$_+^yVc^|!S8J#EZ_QO&ZOSkPO!AMEZ3zMCH zVQ!6t;n@Ky;-B&vR}4`C@!@kQ;XEm3`IIbC@=95z&bKVBQWnLpNoo;XbZKt{`vl&q zo14%Ep}jMN_W75jPvCss(z?c2Zyi@MElKlZl<+ATChDhzU8uPh@9OXZw@b8bdNPj?IR#(-^CZ03$CQ*BHxi3N&NU z{2yfno zJy_54G>5hk$3$Ig2~i&y#KaV>=ws-RW{9!aWb74GH&XlQ2}e52;|dzymcfaxsWY1} z?kRydCD-_NxJ57{5vX7gTaUX@45DCUD1>AlLurpYakdzq8~h_YhCzu;&N=hWd}YSD z;>=dAISpqHR0Chvxn8;KTy_?mCJ(OeN2inc{jk%q+{jL+p9X`NRmS<9PLOsx9gjhu z$2Cr*RO$=@YmaQcfyc0@Rcn>1ibnBHe`l**j1a1d_V^Hw`8$dtkUmy-1!#ka8mBe? zDNie^I~Cc1mvQ7+JsGPLa$J!F5qOo2fmRWa}upYwu#6|Xpt3^pKRr}mW4hN@RkK=BX1SjTs29~L=2dTQgZ#%s~ z93wfT+-*<-TCF(Oow_sQyy2)HdoJ}xeXSHB5q;R{UOl6he&)IMatC-?Q&S9^2c5;f zB`-+Kb+?fbv^*`N#+N7mPQ5o&hMgOK&m0;X_U);GB?qS(%LE}M87?-yB@qo%H(}UW zPNFHtL(?faZPMYZs<(aPTi65N1RLIM{PmXEON*cjEAAzuPOW@jUmb3NhjGPRrEF?j zDw3yB0q6Gap-`LlR#<(H#T^zdinBE^>H-N~ANNsbct!mJO-8wL>Qi%Y?Q@lyL!UT> zZ^M}#edj@4!gbK)?M=Z)$nDRl94;urQkU~E$V^2_91nSguQZAkt=9KbAxFikxL zKuxbQfiflvz01s(;B4txt8 z9Z(b85nK+Ff@IkI6NO@&PXS^y%j}Nu65^jBP(oXAZ6hC^Aw`Q6whJgUmOo!^=qzi1 zB7T1exYm%)9OW#L#*E4(3aGTkB=~43eAD<0;X&9P5P_76DJC0gsmP2njZZ^$<22nJ zWaG2GN3_aTc9SUg0b-UzUrf-B^;>VG_{r2x6yW|&OuRoSGQUSKXCcSolH ztb9A&+=22G_jsRh=+9YvhC=siBTYi(^JJ%#I*S{S=5x0|koO6=75LX`GuSMAE7zTc RO1)B_TxiwbtUFcE{{emNiG=_F literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/markers.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/markers.py new file mode 100644 index 0000000..ee1f3e2 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/markers.py @@ -0,0 +1,131 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2012-2017 Vinay Sajip. +# Licensed to the Python Software Foundation under a contributor agreement. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +""" +Parser for the environment markers micro-language defined in PEP 508. +""" + +# Note: In PEP 345, the micro-language was Python compatible, so the ast +# module could be used to parse it. However, PEP 508 introduced operators such +# as ~= and === which aren't in Python, necessitating a different approach. + +import os +import sys +import platform +import re + +from .compat import python_implementation, urlparse, string_types +from .util import in_venv, parse_marker + +__all__ = ['interpret'] + +def _is_literal(o): + if not isinstance(o, string_types) or not o: + return False + return o[0] in '\'"' + +class Evaluator(object): + """ + This class is used to evaluate marker expessions. + """ + + operations = { + '==': lambda x, y: x == y, + '===': lambda x, y: x == y, + '~=': lambda x, y: x == y or x > y, + '!=': lambda x, y: x != y, + '<': lambda x, y: x < y, + '<=': lambda x, y: x == y or x < y, + '>': lambda x, y: x > y, + '>=': lambda x, y: x == y or x > y, + 'and': lambda x, y: x and y, + 'or': lambda x, y: x or y, + 'in': lambda x, y: x in y, + 'not in': lambda x, y: x not in y, + } + + def evaluate(self, expr, context): + """ + Evaluate a marker expression returned by the :func:`parse_requirement` + function in the specified context. + """ + if isinstance(expr, string_types): + if expr[0] in '\'"': + result = expr[1:-1] + else: + if expr not in context: + raise SyntaxError('unknown variable: %s' % expr) + result = context[expr] + else: + assert isinstance(expr, dict) + op = expr['op'] + if op not in self.operations: + raise NotImplementedError('op not implemented: %s' % op) + elhs = expr['lhs'] + erhs = expr['rhs'] + if _is_literal(expr['lhs']) and _is_literal(expr['rhs']): + raise SyntaxError('invalid comparison: %s %s %s' % (elhs, op, erhs)) + + lhs = self.evaluate(elhs, context) + rhs = self.evaluate(erhs, context) + result = self.operations[op](lhs, rhs) + return result + +def default_context(): + def format_full_version(info): + version = '%s.%s.%s' % (info.major, info.minor, info.micro) + kind = info.releaselevel + if kind != 'final': + version += kind[0] + str(info.serial) + return version + + if hasattr(sys, 'implementation'): + implementation_version = format_full_version(sys.implementation.version) + implementation_name = sys.implementation.name + else: + implementation_version = '0' + implementation_name = '' + + result = { + 'implementation_name': implementation_name, + 'implementation_version': implementation_version, + 'os_name': os.name, + 'platform_machine': platform.machine(), + 'platform_python_implementation': platform.python_implementation(), + 'platform_release': platform.release(), + 'platform_system': platform.system(), + 'platform_version': platform.version(), + 'platform_in_venv': str(in_venv()), + 'python_full_version': platform.python_version(), + 'python_version': platform.python_version()[:3], + 'sys_platform': sys.platform, + } + return result + +DEFAULT_CONTEXT = default_context() +del default_context + +evaluator = Evaluator() + +def interpret(marker, execution_context=None): + """ + Interpret a marker and return a result depending on environment. + + :param marker: The marker to interpret. + :type marker: str + :param execution_context: The context used for name lookup. + :type execution_context: mapping + """ + try: + expr, rest = parse_marker(marker) + except Exception as e: + raise SyntaxError('Unable to interpret marker syntax: %s: %s' % (marker, e)) + if rest and rest[0] != '#': + raise SyntaxError('unexpected trailing data in marker: %s: %s' % (marker, rest)) + context = dict(DEFAULT_CONTEXT) + if execution_context: + context.update(execution_context) + return evaluator.evaluate(expr, context) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/markers.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/markers.pyc new file mode 100644 index 0000000000000000000000000000000000000000..02c51816c178a67fc1b34660ab7aa2ad343475c3 GIT binary patch literal 7112 zcmd5>-E!O35nhlICDM{5|H)D6NszWq7`GPfIF(z~_QY|OOgbs!ft_i}bjm;kC_w@N z2rWdOVA5SUnG;kIr#>D|EwTFUr$o z5GK|g`1wwl8+Q=(^7LlxC!0fmGjxNnA0=VnMv41){jvL#TR&ZCMBn1mjvUO`eA6k@pY zJKrz3Z-9$zp&7}3Tl||W2T`i7pzIS)E-SOC@4|gF* z^HvZU8%GLRF1N?itZMX4oFSCx8AR(VR6S-}zUo-|)4dp}3faPfJ%6&be|`^LB+h6a{rQ#ULG z3r9xkhWoG{1N$;7`c{uRD<3rs>J-{PbYzDofck3}`cw6?zOPz6I9;vIf{}Z%KiCNT z2R{T2V;))O{rmr~R31&l;~_g$nY?*$aGk82M`37!_g^N=5<12z%C403)QjpmOM<;U z7L11UhgU19dbVYG=Y%Y8y;>GI+p^H))!_70-+S@w{1(S!e4MQ2>BAC+P$sCaO!B3?3+mr+{hee}X*be6o^k4srB-L{_uVT(htHvev!s}n6S73fD`lBE+p@GuSroq}sYP(nqrDOA6L_m` zZa^D^_Ra{}=Ul$OdbyStzw;l8!0_x95-X{D9m_^IdGe`dD2oO8^P+!K_ z1)!jPR@trX0@+Eo{lh8(NZJhY(cNGgqN2O(LJlJRXHTgAoerQ zP$(cKlpaL`q3ch;=DfhoE~2Sn&bV&lKqJAm{xIpSeO1I>dAK`_a*g7?8c)Xo4CxpN zGIlgs*o*oRrsyHg3-@gS#kulih^0}Y28`x1xEm%rN&0o-B4&#GjW}F$uN$Ze$1^j$ zq0`J&gD9iOFwhaSj(E$cSIW1HxrTa_AS#Hs`~Yl6CQUfB_%&%t9>b#|oa631IY3al zzn@>o3L4&)!HKS^Gn+8( zD}gvA*Z6j{MKB`~s9+ddkGoL}qF`hwgk&B=X^%T`x)`1t{2m^|phTt@oJD7`GUr@! z<||j6hO+>wfv@Xat6X$0I!jKI2Uqu_+fDpI*zHgNUV_4LxwMtb*qj)F3^VJ?k2vtRUe1ymR6Gah7AE~t3^SwRI{Aad7{^V*33p05>^1#tt!@#Goq?t-ks zQ>t&d2qD`&-i}o~l>Z4H!veBH%x#V2whOwVehq@L0}{gPLNNH{s^p*1KeAetW!OAN zOp~jtcQKwWn)rwdw9PEa>t;oN*b5Qlp>W$@M z!x-*`vAPapbBGJpLwKLK$o_D(DCwtapL@vR;MD7J+=-Il*gQ|cGS&4URX6Z$w?B+y zB!`r{HYK3digV4WJ9Ew(j{33ZQg77Pts*3%4?EebXVlWqJl9_C08eXbieZbOv)H%f z1&O)d7BYgCr)Avu^5ox%_eRRF3zP4e17pL1Ju$H4;6!7YAfzOt#U{5TqG9SLj5^Cn zH05|;x+SMgI($|2mT!Cud*GX3!@G^Y-U@qZ5p-e2y=2s>mGA4Tqb=|-u9&NoO>Ij> z@-!;o+}?c@YSZ2=R^MlFhlPvcbPbHUK!VrDebgOYQNKcyQLdc&%mQ5dLZ#-=C(hv8 zaOTI~MNk)T9rSp6Q}8iz`ztC3ONy}6<@^@d1;48NI(b*7;9hnbl0Os&Fv}rKQ%?a< z)31!-kRxBf^W?kqKX4t(@E3F+y9(>nZ=hphJoHed;^<}-kmY|Ol!9}CM?s?l-$F+R z)C6|~m&2qW88-h$p%~{AfEdj(yJNhB_-6!^&{kaA$cJZ0(ISQI0t!v!&sQ2c%Nn4F zKNtb7HKa4gIZLE5qjHG?Dy=aIJ{}6+G&w`KANGbsAf;l8$wpc#GNVl6(@@8~nxkM-M;$^lA6eXYHr!Up!SGJR+<-(LA^hV(f1 z`F6Uo4dp5B@jm9zU$XcVh3;27O+w}Kc&C&)jT?~WbFV;<4+yvw_}6N4*erZ2*PNwF Qy;7fEYSrJYJ5|u%0jd;($^ZZW literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/metadata 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/metadata 2.py new file mode 100644 index 0000000..2d61378 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/metadata 2.py @@ -0,0 +1,1096 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2012 The Python Software Foundation. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +"""Implementation of the Metadata for Python packages PEPs. + +Supports all metadata formats (1.0, 1.1, 1.2, and 2.0 experimental). +""" +from __future__ import unicode_literals + +import codecs +from email import message_from_file +import json +import logging +import re + + +from . import DistlibException, __version__ +from .compat import StringIO, string_types, text_type +from .markers import interpret +from .util import extract_by_key, get_extras +from .version import get_scheme, PEP440_VERSION_RE + +logger = logging.getLogger(__name__) + + +class MetadataMissingError(DistlibException): + """A required metadata is missing""" + + +class MetadataConflictError(DistlibException): + """Attempt to read or write metadata fields that are conflictual.""" + + +class MetadataUnrecognizedVersionError(DistlibException): + """Unknown metadata version number.""" + + +class MetadataInvalidError(DistlibException): + """A metadata value is invalid""" + +# public API of this module +__all__ = ['Metadata', 'PKG_INFO_ENCODING', 'PKG_INFO_PREFERRED_VERSION'] + +# Encoding used for the PKG-INFO files +PKG_INFO_ENCODING = 'utf-8' + +# preferred version. Hopefully will be changed +# to 1.2 once PEP 345 is supported everywhere +PKG_INFO_PREFERRED_VERSION = '1.1' + +_LINE_PREFIX_1_2 = re.compile('\n \\|') +_LINE_PREFIX_PRE_1_2 = re.compile('\n ') +_241_FIELDS = ('Metadata-Version', 'Name', 'Version', 'Platform', + 'Summary', 'Description', + 'Keywords', 'Home-page', 'Author', 'Author-email', + 'License') + +_314_FIELDS = ('Metadata-Version', 'Name', 'Version', 'Platform', + 'Supported-Platform', 'Summary', 'Description', + 'Keywords', 'Home-page', 'Author', 'Author-email', + 'License', 'Classifier', 'Download-URL', 'Obsoletes', + 'Provides', 'Requires') + +_314_MARKERS = ('Obsoletes', 'Provides', 'Requires', 'Classifier', + 'Download-URL') + +_345_FIELDS = ('Metadata-Version', 'Name', 'Version', 'Platform', + 'Supported-Platform', 'Summary', 'Description', + 'Keywords', 'Home-page', 'Author', 'Author-email', + 'Maintainer', 'Maintainer-email', 'License', + 'Classifier', 'Download-URL', 'Obsoletes-Dist', + 'Project-URL', 'Provides-Dist', 'Requires-Dist', + 'Requires-Python', 'Requires-External') + +_345_MARKERS = ('Provides-Dist', 'Requires-Dist', 'Requires-Python', + 'Obsoletes-Dist', 'Requires-External', 'Maintainer', + 'Maintainer-email', 'Project-URL') + +_426_FIELDS = ('Metadata-Version', 'Name', 'Version', 'Platform', + 'Supported-Platform', 'Summary', 'Description', + 'Keywords', 'Home-page', 'Author', 'Author-email', + 'Maintainer', 'Maintainer-email', 'License', + 'Classifier', 'Download-URL', 'Obsoletes-Dist', + 'Project-URL', 'Provides-Dist', 'Requires-Dist', + 'Requires-Python', 'Requires-External', 'Private-Version', + 'Obsoleted-By', 'Setup-Requires-Dist', 'Extension', + 'Provides-Extra') + +_426_MARKERS = ('Private-Version', 'Provides-Extra', 'Obsoleted-By', + 'Setup-Requires-Dist', 'Extension') + +# See issue #106: Sometimes 'Requires' and 'Provides' occur wrongly in +# the metadata. Include them in the tuple literal below to allow them +# (for now). +_566_FIELDS = _426_FIELDS + ('Description-Content-Type', + 'Requires', 'Provides') + +_566_MARKERS = ('Description-Content-Type',) + +_ALL_FIELDS = set() +_ALL_FIELDS.update(_241_FIELDS) +_ALL_FIELDS.update(_314_FIELDS) +_ALL_FIELDS.update(_345_FIELDS) +_ALL_FIELDS.update(_426_FIELDS) +_ALL_FIELDS.update(_566_FIELDS) + +EXTRA_RE = re.compile(r'''extra\s*==\s*("([^"]+)"|'([^']+)')''') + + +def _version2fieldlist(version): + if version == '1.0': + return _241_FIELDS + elif version == '1.1': + return _314_FIELDS + elif version == '1.2': + return _345_FIELDS + elif version in ('1.3', '2.1'): + return _345_FIELDS + _566_FIELDS + elif version == '2.0': + return _426_FIELDS + raise MetadataUnrecognizedVersionError(version) + + +def _best_version(fields): + """Detect the best version depending on the fields used.""" + def _has_marker(keys, markers): + for marker in markers: + if marker in keys: + return True + return False + + keys = [] + for key, value in fields.items(): + if value in ([], 'UNKNOWN', None): + continue + keys.append(key) + + possible_versions = ['1.0', '1.1', '1.2', '1.3', '2.0', '2.1'] + + # first let's try to see if a field is not part of one of the version + for key in keys: + if key not in _241_FIELDS and '1.0' in possible_versions: + possible_versions.remove('1.0') + logger.debug('Removed 1.0 due to %s', key) + if key not in _314_FIELDS and '1.1' in possible_versions: + possible_versions.remove('1.1') + logger.debug('Removed 1.1 due to %s', key) + if key not in _345_FIELDS and '1.2' in possible_versions: + possible_versions.remove('1.2') + logger.debug('Removed 1.2 due to %s', key) + if key not in _566_FIELDS and '1.3' in possible_versions: + possible_versions.remove('1.3') + logger.debug('Removed 1.3 due to %s', key) + if key not in _566_FIELDS and '2.1' in possible_versions: + if key != 'Description': # In 2.1, description allowed after headers + possible_versions.remove('2.1') + logger.debug('Removed 2.1 due to %s', key) + if key not in _426_FIELDS and '2.0' in possible_versions: + possible_versions.remove('2.0') + logger.debug('Removed 2.0 due to %s', key) + + # possible_version contains qualified versions + if len(possible_versions) == 1: + return possible_versions[0] # found ! + elif len(possible_versions) == 0: + logger.debug('Out of options - unknown metadata set: %s', fields) + raise MetadataConflictError('Unknown metadata set') + + # let's see if one unique marker is found + is_1_1 = '1.1' in possible_versions and _has_marker(keys, _314_MARKERS) + is_1_2 = '1.2' in possible_versions and _has_marker(keys, _345_MARKERS) + is_2_1 = '2.1' in possible_versions and _has_marker(keys, _566_MARKERS) + is_2_0 = '2.0' in possible_versions and _has_marker(keys, _426_MARKERS) + if int(is_1_1) + int(is_1_2) + int(is_2_1) + int(is_2_0) > 1: + raise MetadataConflictError('You used incompatible 1.1/1.2/2.0/2.1 fields') + + # we have the choice, 1.0, or 1.2, or 2.0 + # - 1.0 has a broken Summary field but works with all tools + # - 1.1 is to avoid + # - 1.2 fixes Summary but has little adoption + # - 2.0 adds more features and is very new + if not is_1_1 and not is_1_2 and not is_2_1 and not is_2_0: + # we couldn't find any specific marker + if PKG_INFO_PREFERRED_VERSION in possible_versions: + return PKG_INFO_PREFERRED_VERSION + if is_1_1: + return '1.1' + if is_1_2: + return '1.2' + if is_2_1: + return '2.1' + + return '2.0' + +_ATTR2FIELD = { + 'metadata_version': 'Metadata-Version', + 'name': 'Name', + 'version': 'Version', + 'platform': 'Platform', + 'supported_platform': 'Supported-Platform', + 'summary': 'Summary', + 'description': 'Description', + 'keywords': 'Keywords', + 'home_page': 'Home-page', + 'author': 'Author', + 'author_email': 'Author-email', + 'maintainer': 'Maintainer', + 'maintainer_email': 'Maintainer-email', + 'license': 'License', + 'classifier': 'Classifier', + 'download_url': 'Download-URL', + 'obsoletes_dist': 'Obsoletes-Dist', + 'provides_dist': 'Provides-Dist', + 'requires_dist': 'Requires-Dist', + 'setup_requires_dist': 'Setup-Requires-Dist', + 'requires_python': 'Requires-Python', + 'requires_external': 'Requires-External', + 'requires': 'Requires', + 'provides': 'Provides', + 'obsoletes': 'Obsoletes', + 'project_url': 'Project-URL', + 'private_version': 'Private-Version', + 'obsoleted_by': 'Obsoleted-By', + 'extension': 'Extension', + 'provides_extra': 'Provides-Extra', +} + +_PREDICATE_FIELDS = ('Requires-Dist', 'Obsoletes-Dist', 'Provides-Dist') +_VERSIONS_FIELDS = ('Requires-Python',) +_VERSION_FIELDS = ('Version',) +_LISTFIELDS = ('Platform', 'Classifier', 'Obsoletes', + 'Requires', 'Provides', 'Obsoletes-Dist', + 'Provides-Dist', 'Requires-Dist', 'Requires-External', + 'Project-URL', 'Supported-Platform', 'Setup-Requires-Dist', + 'Provides-Extra', 'Extension') +_LISTTUPLEFIELDS = ('Project-URL',) + +_ELEMENTSFIELD = ('Keywords',) + +_UNICODEFIELDS = ('Author', 'Maintainer', 'Summary', 'Description') + +_MISSING = object() + +_FILESAFE = re.compile('[^A-Za-z0-9.]+') + + +def _get_name_and_version(name, version, for_filename=False): + """Return the distribution name with version. + + If for_filename is true, return a filename-escaped form.""" + if for_filename: + # For both name and version any runs of non-alphanumeric or '.' + # characters are replaced with a single '-'. Additionally any + # spaces in the version string become '.' + name = _FILESAFE.sub('-', name) + version = _FILESAFE.sub('-', version.replace(' ', '.')) + return '%s-%s' % (name, version) + + +class LegacyMetadata(object): + """The legacy metadata of a release. + + Supports versions 1.0, 1.1 and 1.2 (auto-detected). You can + instantiate the class with one of these arguments (or none): + - *path*, the path to a metadata file + - *fileobj* give a file-like object with metadata as content + - *mapping* is a dict-like object + - *scheme* is a version scheme name + """ + # TODO document the mapping API and UNKNOWN default key + + def __init__(self, path=None, fileobj=None, mapping=None, + scheme='default'): + if [path, fileobj, mapping].count(None) < 2: + raise TypeError('path, fileobj and mapping are exclusive') + self._fields = {} + self.requires_files = [] + self._dependencies = None + self.scheme = scheme + if path is not None: + self.read(path) + elif fileobj is not None: + self.read_file(fileobj) + elif mapping is not None: + self.update(mapping) + self.set_metadata_version() + + def set_metadata_version(self): + self._fields['Metadata-Version'] = _best_version(self._fields) + + def _write_field(self, fileobj, name, value): + fileobj.write('%s: %s\n' % (name, value)) + + def __getitem__(self, name): + return self.get(name) + + def __setitem__(self, name, value): + return self.set(name, value) + + def __delitem__(self, name): + field_name = self._convert_name(name) + try: + del self._fields[field_name] + except KeyError: + raise KeyError(name) + + def __contains__(self, name): + return (name in self._fields or + self._convert_name(name) in self._fields) + + def _convert_name(self, name): + if name in _ALL_FIELDS: + return name + name = name.replace('-', '_').lower() + return _ATTR2FIELD.get(name, name) + + def _default_value(self, name): + if name in _LISTFIELDS or name in _ELEMENTSFIELD: + return [] + return 'UNKNOWN' + + def _remove_line_prefix(self, value): + if self.metadata_version in ('1.0', '1.1'): + return _LINE_PREFIX_PRE_1_2.sub('\n', value) + else: + return _LINE_PREFIX_1_2.sub('\n', value) + + def __getattr__(self, name): + if name in _ATTR2FIELD: + return self[name] + raise AttributeError(name) + + # + # Public API + # + +# dependencies = property(_get_dependencies, _set_dependencies) + + def get_fullname(self, filesafe=False): + """Return the distribution name with version. + + If filesafe is true, return a filename-escaped form.""" + return _get_name_and_version(self['Name'], self['Version'], filesafe) + + def is_field(self, name): + """return True if name is a valid metadata key""" + name = self._convert_name(name) + return name in _ALL_FIELDS + + def is_multi_field(self, name): + name = self._convert_name(name) + return name in _LISTFIELDS + + def read(self, filepath): + """Read the metadata values from a file path.""" + fp = codecs.open(filepath, 'r', encoding='utf-8') + try: + self.read_file(fp) + finally: + fp.close() + + def read_file(self, fileob): + """Read the metadata values from a file object.""" + msg = message_from_file(fileob) + self._fields['Metadata-Version'] = msg['metadata-version'] + + # When reading, get all the fields we can + for field in _ALL_FIELDS: + if field not in msg: + continue + if field in _LISTFIELDS: + # we can have multiple lines + values = msg.get_all(field) + if field in _LISTTUPLEFIELDS and values is not None: + values = [tuple(value.split(',')) for value in values] + self.set(field, values) + else: + # single line + value = msg[field] + if value is not None and value != 'UNKNOWN': + self.set(field, value) + # logger.debug('Attempting to set metadata for %s', self) + # self.set_metadata_version() + + def write(self, filepath, skip_unknown=False): + """Write the metadata fields to filepath.""" + fp = codecs.open(filepath, 'w', encoding='utf-8') + try: + self.write_file(fp, skip_unknown) + finally: + fp.close() + + def write_file(self, fileobject, skip_unknown=False): + """Write the PKG-INFO format data to a file object.""" + self.set_metadata_version() + + for field in _version2fieldlist(self['Metadata-Version']): + values = self.get(field) + if skip_unknown and values in ('UNKNOWN', [], ['UNKNOWN']): + continue + if field in _ELEMENTSFIELD: + self._write_field(fileobject, field, ','.join(values)) + continue + if field not in _LISTFIELDS: + if field == 'Description': + if self.metadata_version in ('1.0', '1.1'): + values = values.replace('\n', '\n ') + else: + values = values.replace('\n', '\n |') + values = [values] + + if field in _LISTTUPLEFIELDS: + values = [','.join(value) for value in values] + + for value in values: + self._write_field(fileobject, field, value) + + def update(self, other=None, **kwargs): + """Set metadata values from the given iterable `other` and kwargs. + + Behavior is like `dict.update`: If `other` has a ``keys`` method, + they are looped over and ``self[key]`` is assigned ``other[key]``. + Else, ``other`` is an iterable of ``(key, value)`` iterables. + + Keys that don't match a metadata field or that have an empty value are + dropped. + """ + def _set(key, value): + if key in _ATTR2FIELD and value: + self.set(self._convert_name(key), value) + + if not other: + # other is None or empty container + pass + elif hasattr(other, 'keys'): + for k in other.keys(): + _set(k, other[k]) + else: + for k, v in other: + _set(k, v) + + if kwargs: + for k, v in kwargs.items(): + _set(k, v) + + def set(self, name, value): + """Control then set a metadata field.""" + name = self._convert_name(name) + + if ((name in _ELEMENTSFIELD or name == 'Platform') and + not isinstance(value, (list, tuple))): + if isinstance(value, string_types): + value = [v.strip() for v in value.split(',')] + else: + value = [] + elif (name in _LISTFIELDS and + not isinstance(value, (list, tuple))): + if isinstance(value, string_types): + value = [value] + else: + value = [] + + if logger.isEnabledFor(logging.WARNING): + project_name = self['Name'] + + scheme = get_scheme(self.scheme) + if name in _PREDICATE_FIELDS and value is not None: + for v in value: + # check that the values are valid + if not scheme.is_valid_matcher(v.split(';')[0]): + logger.warning( + "'%s': '%s' is not valid (field '%s')", + project_name, v, name) + # FIXME this rejects UNKNOWN, is that right? + elif name in _VERSIONS_FIELDS and value is not None: + if not scheme.is_valid_constraint_list(value): + logger.warning("'%s': '%s' is not a valid version (field '%s')", + project_name, value, name) + elif name in _VERSION_FIELDS and value is not None: + if not scheme.is_valid_version(value): + logger.warning("'%s': '%s' is not a valid version (field '%s')", + project_name, value, name) + + if name in _UNICODEFIELDS: + if name == 'Description': + value = self._remove_line_prefix(value) + + self._fields[name] = value + + def get(self, name, default=_MISSING): + """Get a metadata field.""" + name = self._convert_name(name) + if name not in self._fields: + if default is _MISSING: + default = self._default_value(name) + return default + if name in _UNICODEFIELDS: + value = self._fields[name] + return value + elif name in _LISTFIELDS: + value = self._fields[name] + if value is None: + return [] + res = [] + for val in value: + if name not in _LISTTUPLEFIELDS: + res.append(val) + else: + # That's for Project-URL + res.append((val[0], val[1])) + return res + + elif name in _ELEMENTSFIELD: + value = self._fields[name] + if isinstance(value, string_types): + return value.split(',') + return self._fields[name] + + def check(self, strict=False): + """Check if the metadata is compliant. If strict is True then raise if + no Name or Version are provided""" + self.set_metadata_version() + + # XXX should check the versions (if the file was loaded) + missing, warnings = [], [] + + for attr in ('Name', 'Version'): # required by PEP 345 + if attr not in self: + missing.append(attr) + + if strict and missing != []: + msg = 'missing required metadata: %s' % ', '.join(missing) + raise MetadataMissingError(msg) + + for attr in ('Home-page', 'Author'): + if attr not in self: + missing.append(attr) + + # checking metadata 1.2 (XXX needs to check 1.1, 1.0) + if self['Metadata-Version'] != '1.2': + return missing, warnings + + scheme = get_scheme(self.scheme) + + def are_valid_constraints(value): + for v in value: + if not scheme.is_valid_matcher(v.split(';')[0]): + return False + return True + + for fields, controller in ((_PREDICATE_FIELDS, are_valid_constraints), + (_VERSIONS_FIELDS, + scheme.is_valid_constraint_list), + (_VERSION_FIELDS, + scheme.is_valid_version)): + for field in fields: + value = self.get(field, None) + if value is not None and not controller(value): + warnings.append("Wrong value for '%s': %s" % (field, value)) + + return missing, warnings + + def todict(self, skip_missing=False): + """Return fields as a dict. + + Field names will be converted to use the underscore-lowercase style + instead of hyphen-mixed case (i.e. home_page instead of Home-page). + """ + self.set_metadata_version() + + mapping_1_0 = ( + ('metadata_version', 'Metadata-Version'), + ('name', 'Name'), + ('version', 'Version'), + ('summary', 'Summary'), + ('home_page', 'Home-page'), + ('author', 'Author'), + ('author_email', 'Author-email'), + ('license', 'License'), + ('description', 'Description'), + ('keywords', 'Keywords'), + ('platform', 'Platform'), + ('classifiers', 'Classifier'), + ('download_url', 'Download-URL'), + ) + + data = {} + for key, field_name in mapping_1_0: + if not skip_missing or field_name in self._fields: + data[key] = self[field_name] + + if self['Metadata-Version'] == '1.2': + mapping_1_2 = ( + ('requires_dist', 'Requires-Dist'), + ('requires_python', 'Requires-Python'), + ('requires_external', 'Requires-External'), + ('provides_dist', 'Provides-Dist'), + ('obsoletes_dist', 'Obsoletes-Dist'), + ('project_url', 'Project-URL'), + ('maintainer', 'Maintainer'), + ('maintainer_email', 'Maintainer-email'), + ) + for key, field_name in mapping_1_2: + if not skip_missing or field_name in self._fields: + if key != 'project_url': + data[key] = self[field_name] + else: + data[key] = [','.join(u) for u in self[field_name]] + + elif self['Metadata-Version'] == '1.1': + mapping_1_1 = ( + ('provides', 'Provides'), + ('requires', 'Requires'), + ('obsoletes', 'Obsoletes'), + ) + for key, field_name in mapping_1_1: + if not skip_missing or field_name in self._fields: + data[key] = self[field_name] + + return data + + def add_requirements(self, requirements): + if self['Metadata-Version'] == '1.1': + # we can't have 1.1 metadata *and* Setuptools requires + for field in ('Obsoletes', 'Requires', 'Provides'): + if field in self: + del self[field] + self['Requires-Dist'] += requirements + + # Mapping API + # TODO could add iter* variants + + def keys(self): + return list(_version2fieldlist(self['Metadata-Version'])) + + def __iter__(self): + for key in self.keys(): + yield key + + def values(self): + return [self[key] for key in self.keys()] + + def items(self): + return [(key, self[key]) for key in self.keys()] + + def __repr__(self): + return '<%s %s %s>' % (self.__class__.__name__, self.name, + self.version) + + +METADATA_FILENAME = 'pydist.json' +WHEEL_METADATA_FILENAME = 'metadata.json' +LEGACY_METADATA_FILENAME = 'METADATA' + + +class Metadata(object): + """ + The metadata of a release. This implementation uses 2.0 (JSON) + metadata where possible. If not possible, it wraps a LegacyMetadata + instance which handles the key-value metadata format. + """ + + METADATA_VERSION_MATCHER = re.compile(r'^\d+(\.\d+)*$') + + NAME_MATCHER = re.compile('^[0-9A-Z]([0-9A-Z_.-]*[0-9A-Z])?$', re.I) + + VERSION_MATCHER = PEP440_VERSION_RE + + SUMMARY_MATCHER = re.compile('.{1,2047}') + + METADATA_VERSION = '2.0' + + GENERATOR = 'distlib (%s)' % __version__ + + MANDATORY_KEYS = { + 'name': (), + 'version': (), + 'summary': ('legacy',), + } + + INDEX_KEYS = ('name version license summary description author ' + 'author_email keywords platform home_page classifiers ' + 'download_url') + + DEPENDENCY_KEYS = ('extras run_requires test_requires build_requires ' + 'dev_requires provides meta_requires obsoleted_by ' + 'supports_environments') + + SYNTAX_VALIDATORS = { + 'metadata_version': (METADATA_VERSION_MATCHER, ()), + 'name': (NAME_MATCHER, ('legacy',)), + 'version': (VERSION_MATCHER, ('legacy',)), + 'summary': (SUMMARY_MATCHER, ('legacy',)), + } + + __slots__ = ('_legacy', '_data', 'scheme') + + def __init__(self, path=None, fileobj=None, mapping=None, + scheme='default'): + if [path, fileobj, mapping].count(None) < 2: + raise TypeError('path, fileobj and mapping are exclusive') + self._legacy = None + self._data = None + self.scheme = scheme + #import pdb; pdb.set_trace() + if mapping is not None: + try: + self._validate_mapping(mapping, scheme) + self._data = mapping + except MetadataUnrecognizedVersionError: + self._legacy = LegacyMetadata(mapping=mapping, scheme=scheme) + self.validate() + else: + data = None + if path: + with open(path, 'rb') as f: + data = f.read() + elif fileobj: + data = fileobj.read() + if data is None: + # Initialised with no args - to be added + self._data = { + 'metadata_version': self.METADATA_VERSION, + 'generator': self.GENERATOR, + } + else: + if not isinstance(data, text_type): + data = data.decode('utf-8') + try: + self._data = json.loads(data) + self._validate_mapping(self._data, scheme) + except ValueError: + # Note: MetadataUnrecognizedVersionError does not + # inherit from ValueError (it's a DistlibException, + # which should not inherit from ValueError). + # The ValueError comes from the json.load - if that + # succeeds and we get a validation error, we want + # that to propagate + self._legacy = LegacyMetadata(fileobj=StringIO(data), + scheme=scheme) + self.validate() + + common_keys = set(('name', 'version', 'license', 'keywords', 'summary')) + + none_list = (None, list) + none_dict = (None, dict) + + mapped_keys = { + 'run_requires': ('Requires-Dist', list), + 'build_requires': ('Setup-Requires-Dist', list), + 'dev_requires': none_list, + 'test_requires': none_list, + 'meta_requires': none_list, + 'extras': ('Provides-Extra', list), + 'modules': none_list, + 'namespaces': none_list, + 'exports': none_dict, + 'commands': none_dict, + 'classifiers': ('Classifier', list), + 'source_url': ('Download-URL', None), + 'metadata_version': ('Metadata-Version', None), + } + + del none_list, none_dict + + def __getattribute__(self, key): + common = object.__getattribute__(self, 'common_keys') + mapped = object.__getattribute__(self, 'mapped_keys') + if key in mapped: + lk, maker = mapped[key] + if self._legacy: + if lk is None: + result = None if maker is None else maker() + else: + result = self._legacy.get(lk) + else: + value = None if maker is None else maker() + if key not in ('commands', 'exports', 'modules', 'namespaces', + 'classifiers'): + result = self._data.get(key, value) + else: + # special cases for PEP 459 + sentinel = object() + result = sentinel + d = self._data.get('extensions') + if d: + if key == 'commands': + result = d.get('python.commands', value) + elif key == 'classifiers': + d = d.get('python.details') + if d: + result = d.get(key, value) + else: + d = d.get('python.exports') + if not d: + d = self._data.get('python.exports') + if d: + result = d.get(key, value) + if result is sentinel: + result = value + elif key not in common: + result = object.__getattribute__(self, key) + elif self._legacy: + result = self._legacy.get(key) + else: + result = self._data.get(key) + return result + + def _validate_value(self, key, value, scheme=None): + if key in self.SYNTAX_VALIDATORS: + pattern, exclusions = self.SYNTAX_VALIDATORS[key] + if (scheme or self.scheme) not in exclusions: + m = pattern.match(value) + if not m: + raise MetadataInvalidError("'%s' is an invalid value for " + "the '%s' property" % (value, + key)) + + def __setattr__(self, key, value): + self._validate_value(key, value) + common = object.__getattribute__(self, 'common_keys') + mapped = object.__getattribute__(self, 'mapped_keys') + if key in mapped: + lk, _ = mapped[key] + if self._legacy: + if lk is None: + raise NotImplementedError + self._legacy[lk] = value + elif key not in ('commands', 'exports', 'modules', 'namespaces', + 'classifiers'): + self._data[key] = value + else: + # special cases for PEP 459 + d = self._data.setdefault('extensions', {}) + if key == 'commands': + d['python.commands'] = value + elif key == 'classifiers': + d = d.setdefault('python.details', {}) + d[key] = value + else: + d = d.setdefault('python.exports', {}) + d[key] = value + elif key not in common: + object.__setattr__(self, key, value) + else: + if key == 'keywords': + if isinstance(value, string_types): + value = value.strip() + if value: + value = value.split() + else: + value = [] + if self._legacy: + self._legacy[key] = value + else: + self._data[key] = value + + @property + def name_and_version(self): + return _get_name_and_version(self.name, self.version, True) + + @property + def provides(self): + if self._legacy: + result = self._legacy['Provides-Dist'] + else: + result = self._data.setdefault('provides', []) + s = '%s (%s)' % (self.name, self.version) + if s not in result: + result.append(s) + return result + + @provides.setter + def provides(self, value): + if self._legacy: + self._legacy['Provides-Dist'] = value + else: + self._data['provides'] = value + + def get_requirements(self, reqts, extras=None, env=None): + """ + Base method to get dependencies, given a set of extras + to satisfy and an optional environment context. + :param reqts: A list of sometimes-wanted dependencies, + perhaps dependent on extras and environment. + :param extras: A list of optional components being requested. + :param env: An optional environment for marker evaluation. + """ + if self._legacy: + result = reqts + else: + result = [] + extras = get_extras(extras or [], self.extras) + for d in reqts: + if 'extra' not in d and 'environment' not in d: + # unconditional + include = True + else: + if 'extra' not in d: + # Not extra-dependent - only environment-dependent + include = True + else: + include = d.get('extra') in extras + if include: + # Not excluded because of extras, check environment + marker = d.get('environment') + if marker: + include = interpret(marker, env) + if include: + result.extend(d['requires']) + for key in ('build', 'dev', 'test'): + e = ':%s:' % key + if e in extras: + extras.remove(e) + # A recursive call, but it should terminate since 'test' + # has been removed from the extras + reqts = self._data.get('%s_requires' % key, []) + result.extend(self.get_requirements(reqts, extras=extras, + env=env)) + return result + + @property + def dictionary(self): + if self._legacy: + return self._from_legacy() + return self._data + + @property + def dependencies(self): + if self._legacy: + raise NotImplementedError + else: + return extract_by_key(self._data, self.DEPENDENCY_KEYS) + + @dependencies.setter + def dependencies(self, value): + if self._legacy: + raise NotImplementedError + else: + self._data.update(value) + + def _validate_mapping(self, mapping, scheme): + if mapping.get('metadata_version') != self.METADATA_VERSION: + raise MetadataUnrecognizedVersionError() + missing = [] + for key, exclusions in self.MANDATORY_KEYS.items(): + if key not in mapping: + if scheme not in exclusions: + missing.append(key) + if missing: + msg = 'Missing metadata items: %s' % ', '.join(missing) + raise MetadataMissingError(msg) + for k, v in mapping.items(): + self._validate_value(k, v, scheme) + + def validate(self): + if self._legacy: + missing, warnings = self._legacy.check(True) + if missing or warnings: + logger.warning('Metadata: missing: %s, warnings: %s', + missing, warnings) + else: + self._validate_mapping(self._data, self.scheme) + + def todict(self): + if self._legacy: + return self._legacy.todict(True) + else: + result = extract_by_key(self._data, self.INDEX_KEYS) + return result + + def _from_legacy(self): + assert self._legacy and not self._data + result = { + 'metadata_version': self.METADATA_VERSION, + 'generator': self.GENERATOR, + } + lmd = self._legacy.todict(True) # skip missing ones + for k in ('name', 'version', 'license', 'summary', 'description', + 'classifier'): + if k in lmd: + if k == 'classifier': + nk = 'classifiers' + else: + nk = k + result[nk] = lmd[k] + kw = lmd.get('Keywords', []) + if kw == ['']: + kw = [] + result['keywords'] = kw + keys = (('requires_dist', 'run_requires'), + ('setup_requires_dist', 'build_requires')) + for ok, nk in keys: + if ok in lmd and lmd[ok]: + result[nk] = [{'requires': lmd[ok]}] + result['provides'] = self.provides + author = {} + maintainer = {} + return result + + LEGACY_MAPPING = { + 'name': 'Name', + 'version': 'Version', + 'license': 'License', + 'summary': 'Summary', + 'description': 'Description', + 'classifiers': 'Classifier', + } + + def _to_legacy(self): + def process_entries(entries): + reqts = set() + for e in entries: + extra = e.get('extra') + env = e.get('environment') + rlist = e['requires'] + for r in rlist: + if not env and not extra: + reqts.add(r) + else: + marker = '' + if extra: + marker = 'extra == "%s"' % extra + if env: + if marker: + marker = '(%s) and %s' % (env, marker) + else: + marker = env + reqts.add(';'.join((r, marker))) + return reqts + + assert self._data and not self._legacy + result = LegacyMetadata() + nmd = self._data + for nk, ok in self.LEGACY_MAPPING.items(): + if nk in nmd: + result[ok] = nmd[nk] + r1 = process_entries(self.run_requires + self.meta_requires) + r2 = process_entries(self.build_requires + self.dev_requires) + if self.extras: + result['Provides-Extra'] = sorted(self.extras) + result['Requires-Dist'] = sorted(r1) + result['Setup-Requires-Dist'] = sorted(r2) + # TODO: other fields such as contacts + return result + + def write(self, path=None, fileobj=None, legacy=False, skip_unknown=True): + if [path, fileobj].count(None) != 1: + raise ValueError('Exactly one of path and fileobj is needed') + self.validate() + if legacy: + if self._legacy: + legacy_md = self._legacy + else: + legacy_md = self._to_legacy() + if path: + legacy_md.write(path, skip_unknown=skip_unknown) + else: + legacy_md.write_file(fileobj, skip_unknown=skip_unknown) + else: + if self._legacy: + d = self._from_legacy() + else: + d = self._data + if fileobj: + json.dump(d, fileobj, ensure_ascii=True, indent=2, + sort_keys=True) + else: + with codecs.open(path, 'w', 'utf-8') as f: + json.dump(d, f, ensure_ascii=True, indent=2, + sort_keys=True) + + def add_requirements(self, requirements): + if self._legacy: + self._legacy.add_requirements(requirements) + else: + run_requires = self._data.setdefault('run_requires', []) + always = None + for entry in run_requires: + if 'environment' not in entry and 'extra' not in entry: + always = entry + break + if always is None: + always = { 'requires': requirements } + run_requires.insert(0, always) + else: + rset = set(always['requires']) | set(requirements) + always['requires'] = sorted(rset) + + def __repr__(self): + name = self.name or '(no name)' + version = self.version or 'no version' + return '<%s %s %s (%s)>' % (self.__class__.__name__, + self.metadata_version, name, version) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/metadata.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/metadata.py new file mode 100644 index 0000000..2d61378 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/metadata.py @@ -0,0 +1,1096 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2012 The Python Software Foundation. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +"""Implementation of the Metadata for Python packages PEPs. + +Supports all metadata formats (1.0, 1.1, 1.2, and 2.0 experimental). +""" +from __future__ import unicode_literals + +import codecs +from email import message_from_file +import json +import logging +import re + + +from . import DistlibException, __version__ +from .compat import StringIO, string_types, text_type +from .markers import interpret +from .util import extract_by_key, get_extras +from .version import get_scheme, PEP440_VERSION_RE + +logger = logging.getLogger(__name__) + + +class MetadataMissingError(DistlibException): + """A required metadata is missing""" + + +class MetadataConflictError(DistlibException): + """Attempt to read or write metadata fields that are conflictual.""" + + +class MetadataUnrecognizedVersionError(DistlibException): + """Unknown metadata version number.""" + + +class MetadataInvalidError(DistlibException): + """A metadata value is invalid""" + +# public API of this module +__all__ = ['Metadata', 'PKG_INFO_ENCODING', 'PKG_INFO_PREFERRED_VERSION'] + +# Encoding used for the PKG-INFO files +PKG_INFO_ENCODING = 'utf-8' + +# preferred version. Hopefully will be changed +# to 1.2 once PEP 345 is supported everywhere +PKG_INFO_PREFERRED_VERSION = '1.1' + +_LINE_PREFIX_1_2 = re.compile('\n \\|') +_LINE_PREFIX_PRE_1_2 = re.compile('\n ') +_241_FIELDS = ('Metadata-Version', 'Name', 'Version', 'Platform', + 'Summary', 'Description', + 'Keywords', 'Home-page', 'Author', 'Author-email', + 'License') + +_314_FIELDS = ('Metadata-Version', 'Name', 'Version', 'Platform', + 'Supported-Platform', 'Summary', 'Description', + 'Keywords', 'Home-page', 'Author', 'Author-email', + 'License', 'Classifier', 'Download-URL', 'Obsoletes', + 'Provides', 'Requires') + +_314_MARKERS = ('Obsoletes', 'Provides', 'Requires', 'Classifier', + 'Download-URL') + +_345_FIELDS = ('Metadata-Version', 'Name', 'Version', 'Platform', + 'Supported-Platform', 'Summary', 'Description', + 'Keywords', 'Home-page', 'Author', 'Author-email', + 'Maintainer', 'Maintainer-email', 'License', + 'Classifier', 'Download-URL', 'Obsoletes-Dist', + 'Project-URL', 'Provides-Dist', 'Requires-Dist', + 'Requires-Python', 'Requires-External') + +_345_MARKERS = ('Provides-Dist', 'Requires-Dist', 'Requires-Python', + 'Obsoletes-Dist', 'Requires-External', 'Maintainer', + 'Maintainer-email', 'Project-URL') + +_426_FIELDS = ('Metadata-Version', 'Name', 'Version', 'Platform', + 'Supported-Platform', 'Summary', 'Description', + 'Keywords', 'Home-page', 'Author', 'Author-email', + 'Maintainer', 'Maintainer-email', 'License', + 'Classifier', 'Download-URL', 'Obsoletes-Dist', + 'Project-URL', 'Provides-Dist', 'Requires-Dist', + 'Requires-Python', 'Requires-External', 'Private-Version', + 'Obsoleted-By', 'Setup-Requires-Dist', 'Extension', + 'Provides-Extra') + +_426_MARKERS = ('Private-Version', 'Provides-Extra', 'Obsoleted-By', + 'Setup-Requires-Dist', 'Extension') + +# See issue #106: Sometimes 'Requires' and 'Provides' occur wrongly in +# the metadata. Include them in the tuple literal below to allow them +# (for now). +_566_FIELDS = _426_FIELDS + ('Description-Content-Type', + 'Requires', 'Provides') + +_566_MARKERS = ('Description-Content-Type',) + +_ALL_FIELDS = set() +_ALL_FIELDS.update(_241_FIELDS) +_ALL_FIELDS.update(_314_FIELDS) +_ALL_FIELDS.update(_345_FIELDS) +_ALL_FIELDS.update(_426_FIELDS) +_ALL_FIELDS.update(_566_FIELDS) + +EXTRA_RE = re.compile(r'''extra\s*==\s*("([^"]+)"|'([^']+)')''') + + +def _version2fieldlist(version): + if version == '1.0': + return _241_FIELDS + elif version == '1.1': + return _314_FIELDS + elif version == '1.2': + return _345_FIELDS + elif version in ('1.3', '2.1'): + return _345_FIELDS + _566_FIELDS + elif version == '2.0': + return _426_FIELDS + raise MetadataUnrecognizedVersionError(version) + + +def _best_version(fields): + """Detect the best version depending on the fields used.""" + def _has_marker(keys, markers): + for marker in markers: + if marker in keys: + return True + return False + + keys = [] + for key, value in fields.items(): + if value in ([], 'UNKNOWN', None): + continue + keys.append(key) + + possible_versions = ['1.0', '1.1', '1.2', '1.3', '2.0', '2.1'] + + # first let's try to see if a field is not part of one of the version + for key in keys: + if key not in _241_FIELDS and '1.0' in possible_versions: + possible_versions.remove('1.0') + logger.debug('Removed 1.0 due to %s', key) + if key not in _314_FIELDS and '1.1' in possible_versions: + possible_versions.remove('1.1') + logger.debug('Removed 1.1 due to %s', key) + if key not in _345_FIELDS and '1.2' in possible_versions: + possible_versions.remove('1.2') + logger.debug('Removed 1.2 due to %s', key) + if key not in _566_FIELDS and '1.3' in possible_versions: + possible_versions.remove('1.3') + logger.debug('Removed 1.3 due to %s', key) + if key not in _566_FIELDS and '2.1' in possible_versions: + if key != 'Description': # In 2.1, description allowed after headers + possible_versions.remove('2.1') + logger.debug('Removed 2.1 due to %s', key) + if key not in _426_FIELDS and '2.0' in possible_versions: + possible_versions.remove('2.0') + logger.debug('Removed 2.0 due to %s', key) + + # possible_version contains qualified versions + if len(possible_versions) == 1: + return possible_versions[0] # found ! + elif len(possible_versions) == 0: + logger.debug('Out of options - unknown metadata set: %s', fields) + raise MetadataConflictError('Unknown metadata set') + + # let's see if one unique marker is found + is_1_1 = '1.1' in possible_versions and _has_marker(keys, _314_MARKERS) + is_1_2 = '1.2' in possible_versions and _has_marker(keys, _345_MARKERS) + is_2_1 = '2.1' in possible_versions and _has_marker(keys, _566_MARKERS) + is_2_0 = '2.0' in possible_versions and _has_marker(keys, _426_MARKERS) + if int(is_1_1) + int(is_1_2) + int(is_2_1) + int(is_2_0) > 1: + raise MetadataConflictError('You used incompatible 1.1/1.2/2.0/2.1 fields') + + # we have the choice, 1.0, or 1.2, or 2.0 + # - 1.0 has a broken Summary field but works with all tools + # - 1.1 is to avoid + # - 1.2 fixes Summary but has little adoption + # - 2.0 adds more features and is very new + if not is_1_1 and not is_1_2 and not is_2_1 and not is_2_0: + # we couldn't find any specific marker + if PKG_INFO_PREFERRED_VERSION in possible_versions: + return PKG_INFO_PREFERRED_VERSION + if is_1_1: + return '1.1' + if is_1_2: + return '1.2' + if is_2_1: + return '2.1' + + return '2.0' + +_ATTR2FIELD = { + 'metadata_version': 'Metadata-Version', + 'name': 'Name', + 'version': 'Version', + 'platform': 'Platform', + 'supported_platform': 'Supported-Platform', + 'summary': 'Summary', + 'description': 'Description', + 'keywords': 'Keywords', + 'home_page': 'Home-page', + 'author': 'Author', + 'author_email': 'Author-email', + 'maintainer': 'Maintainer', + 'maintainer_email': 'Maintainer-email', + 'license': 'License', + 'classifier': 'Classifier', + 'download_url': 'Download-URL', + 'obsoletes_dist': 'Obsoletes-Dist', + 'provides_dist': 'Provides-Dist', + 'requires_dist': 'Requires-Dist', + 'setup_requires_dist': 'Setup-Requires-Dist', + 'requires_python': 'Requires-Python', + 'requires_external': 'Requires-External', + 'requires': 'Requires', + 'provides': 'Provides', + 'obsoletes': 'Obsoletes', + 'project_url': 'Project-URL', + 'private_version': 'Private-Version', + 'obsoleted_by': 'Obsoleted-By', + 'extension': 'Extension', + 'provides_extra': 'Provides-Extra', +} + +_PREDICATE_FIELDS = ('Requires-Dist', 'Obsoletes-Dist', 'Provides-Dist') +_VERSIONS_FIELDS = ('Requires-Python',) +_VERSION_FIELDS = ('Version',) +_LISTFIELDS = ('Platform', 'Classifier', 'Obsoletes', + 'Requires', 'Provides', 'Obsoletes-Dist', + 'Provides-Dist', 'Requires-Dist', 'Requires-External', + 'Project-URL', 'Supported-Platform', 'Setup-Requires-Dist', + 'Provides-Extra', 'Extension') +_LISTTUPLEFIELDS = ('Project-URL',) + +_ELEMENTSFIELD = ('Keywords',) + +_UNICODEFIELDS = ('Author', 'Maintainer', 'Summary', 'Description') + +_MISSING = object() + +_FILESAFE = re.compile('[^A-Za-z0-9.]+') + + +def _get_name_and_version(name, version, for_filename=False): + """Return the distribution name with version. + + If for_filename is true, return a filename-escaped form.""" + if for_filename: + # For both name and version any runs of non-alphanumeric or '.' + # characters are replaced with a single '-'. Additionally any + # spaces in the version string become '.' + name = _FILESAFE.sub('-', name) + version = _FILESAFE.sub('-', version.replace(' ', '.')) + return '%s-%s' % (name, version) + + +class LegacyMetadata(object): + """The legacy metadata of a release. + + Supports versions 1.0, 1.1 and 1.2 (auto-detected). You can + instantiate the class with one of these arguments (or none): + - *path*, the path to a metadata file + - *fileobj* give a file-like object with metadata as content + - *mapping* is a dict-like object + - *scheme* is a version scheme name + """ + # TODO document the mapping API and UNKNOWN default key + + def __init__(self, path=None, fileobj=None, mapping=None, + scheme='default'): + if [path, fileobj, mapping].count(None) < 2: + raise TypeError('path, fileobj and mapping are exclusive') + self._fields = {} + self.requires_files = [] + self._dependencies = None + self.scheme = scheme + if path is not None: + self.read(path) + elif fileobj is not None: + self.read_file(fileobj) + elif mapping is not None: + self.update(mapping) + self.set_metadata_version() + + def set_metadata_version(self): + self._fields['Metadata-Version'] = _best_version(self._fields) + + def _write_field(self, fileobj, name, value): + fileobj.write('%s: %s\n' % (name, value)) + + def __getitem__(self, name): + return self.get(name) + + def __setitem__(self, name, value): + return self.set(name, value) + + def __delitem__(self, name): + field_name = self._convert_name(name) + try: + del self._fields[field_name] + except KeyError: + raise KeyError(name) + + def __contains__(self, name): + return (name in self._fields or + self._convert_name(name) in self._fields) + + def _convert_name(self, name): + if name in _ALL_FIELDS: + return name + name = name.replace('-', '_').lower() + return _ATTR2FIELD.get(name, name) + + def _default_value(self, name): + if name in _LISTFIELDS or name in _ELEMENTSFIELD: + return [] + return 'UNKNOWN' + + def _remove_line_prefix(self, value): + if self.metadata_version in ('1.0', '1.1'): + return _LINE_PREFIX_PRE_1_2.sub('\n', value) + else: + return _LINE_PREFIX_1_2.sub('\n', value) + + def __getattr__(self, name): + if name in _ATTR2FIELD: + return self[name] + raise AttributeError(name) + + # + # Public API + # + +# dependencies = property(_get_dependencies, _set_dependencies) + + def get_fullname(self, filesafe=False): + """Return the distribution name with version. + + If filesafe is true, return a filename-escaped form.""" + return _get_name_and_version(self['Name'], self['Version'], filesafe) + + def is_field(self, name): + """return True if name is a valid metadata key""" + name = self._convert_name(name) + return name in _ALL_FIELDS + + def is_multi_field(self, name): + name = self._convert_name(name) + return name in _LISTFIELDS + + def read(self, filepath): + """Read the metadata values from a file path.""" + fp = codecs.open(filepath, 'r', encoding='utf-8') + try: + self.read_file(fp) + finally: + fp.close() + + def read_file(self, fileob): + """Read the metadata values from a file object.""" + msg = message_from_file(fileob) + self._fields['Metadata-Version'] = msg['metadata-version'] + + # When reading, get all the fields we can + for field in _ALL_FIELDS: + if field not in msg: + continue + if field in _LISTFIELDS: + # we can have multiple lines + values = msg.get_all(field) + if field in _LISTTUPLEFIELDS and values is not None: + values = [tuple(value.split(',')) for value in values] + self.set(field, values) + else: + # single line + value = msg[field] + if value is not None and value != 'UNKNOWN': + self.set(field, value) + # logger.debug('Attempting to set metadata for %s', self) + # self.set_metadata_version() + + def write(self, filepath, skip_unknown=False): + """Write the metadata fields to filepath.""" + fp = codecs.open(filepath, 'w', encoding='utf-8') + try: + self.write_file(fp, skip_unknown) + finally: + fp.close() + + def write_file(self, fileobject, skip_unknown=False): + """Write the PKG-INFO format data to a file object.""" + self.set_metadata_version() + + for field in _version2fieldlist(self['Metadata-Version']): + values = self.get(field) + if skip_unknown and values in ('UNKNOWN', [], ['UNKNOWN']): + continue + if field in _ELEMENTSFIELD: + self._write_field(fileobject, field, ','.join(values)) + continue + if field not in _LISTFIELDS: + if field == 'Description': + if self.metadata_version in ('1.0', '1.1'): + values = values.replace('\n', '\n ') + else: + values = values.replace('\n', '\n |') + values = [values] + + if field in _LISTTUPLEFIELDS: + values = [','.join(value) for value in values] + + for value in values: + self._write_field(fileobject, field, value) + + def update(self, other=None, **kwargs): + """Set metadata values from the given iterable `other` and kwargs. + + Behavior is like `dict.update`: If `other` has a ``keys`` method, + they are looped over and ``self[key]`` is assigned ``other[key]``. + Else, ``other`` is an iterable of ``(key, value)`` iterables. + + Keys that don't match a metadata field or that have an empty value are + dropped. + """ + def _set(key, value): + if key in _ATTR2FIELD and value: + self.set(self._convert_name(key), value) + + if not other: + # other is None or empty container + pass + elif hasattr(other, 'keys'): + for k in other.keys(): + _set(k, other[k]) + else: + for k, v in other: + _set(k, v) + + if kwargs: + for k, v in kwargs.items(): + _set(k, v) + + def set(self, name, value): + """Control then set a metadata field.""" + name = self._convert_name(name) + + if ((name in _ELEMENTSFIELD or name == 'Platform') and + not isinstance(value, (list, tuple))): + if isinstance(value, string_types): + value = [v.strip() for v in value.split(',')] + else: + value = [] + elif (name in _LISTFIELDS and + not isinstance(value, (list, tuple))): + if isinstance(value, string_types): + value = [value] + else: + value = [] + + if logger.isEnabledFor(logging.WARNING): + project_name = self['Name'] + + scheme = get_scheme(self.scheme) + if name in _PREDICATE_FIELDS and value is not None: + for v in value: + # check that the values are valid + if not scheme.is_valid_matcher(v.split(';')[0]): + logger.warning( + "'%s': '%s' is not valid (field '%s')", + project_name, v, name) + # FIXME this rejects UNKNOWN, is that right? + elif name in _VERSIONS_FIELDS and value is not None: + if not scheme.is_valid_constraint_list(value): + logger.warning("'%s': '%s' is not a valid version (field '%s')", + project_name, value, name) + elif name in _VERSION_FIELDS and value is not None: + if not scheme.is_valid_version(value): + logger.warning("'%s': '%s' is not a valid version (field '%s')", + project_name, value, name) + + if name in _UNICODEFIELDS: + if name == 'Description': + value = self._remove_line_prefix(value) + + self._fields[name] = value + + def get(self, name, default=_MISSING): + """Get a metadata field.""" + name = self._convert_name(name) + if name not in self._fields: + if default is _MISSING: + default = self._default_value(name) + return default + if name in _UNICODEFIELDS: + value = self._fields[name] + return value + elif name in _LISTFIELDS: + value = self._fields[name] + if value is None: + return [] + res = [] + for val in value: + if name not in _LISTTUPLEFIELDS: + res.append(val) + else: + # That's for Project-URL + res.append((val[0], val[1])) + return res + + elif name in _ELEMENTSFIELD: + value = self._fields[name] + if isinstance(value, string_types): + return value.split(',') + return self._fields[name] + + def check(self, strict=False): + """Check if the metadata is compliant. If strict is True then raise if + no Name or Version are provided""" + self.set_metadata_version() + + # XXX should check the versions (if the file was loaded) + missing, warnings = [], [] + + for attr in ('Name', 'Version'): # required by PEP 345 + if attr not in self: + missing.append(attr) + + if strict and missing != []: + msg = 'missing required metadata: %s' % ', '.join(missing) + raise MetadataMissingError(msg) + + for attr in ('Home-page', 'Author'): + if attr not in self: + missing.append(attr) + + # checking metadata 1.2 (XXX needs to check 1.1, 1.0) + if self['Metadata-Version'] != '1.2': + return missing, warnings + + scheme = get_scheme(self.scheme) + + def are_valid_constraints(value): + for v in value: + if not scheme.is_valid_matcher(v.split(';')[0]): + return False + return True + + for fields, controller in ((_PREDICATE_FIELDS, are_valid_constraints), + (_VERSIONS_FIELDS, + scheme.is_valid_constraint_list), + (_VERSION_FIELDS, + scheme.is_valid_version)): + for field in fields: + value = self.get(field, None) + if value is not None and not controller(value): + warnings.append("Wrong value for '%s': %s" % (field, value)) + + return missing, warnings + + def todict(self, skip_missing=False): + """Return fields as a dict. + + Field names will be converted to use the underscore-lowercase style + instead of hyphen-mixed case (i.e. home_page instead of Home-page). + """ + self.set_metadata_version() + + mapping_1_0 = ( + ('metadata_version', 'Metadata-Version'), + ('name', 'Name'), + ('version', 'Version'), + ('summary', 'Summary'), + ('home_page', 'Home-page'), + ('author', 'Author'), + ('author_email', 'Author-email'), + ('license', 'License'), + ('description', 'Description'), + ('keywords', 'Keywords'), + ('platform', 'Platform'), + ('classifiers', 'Classifier'), + ('download_url', 'Download-URL'), + ) + + data = {} + for key, field_name in mapping_1_0: + if not skip_missing or field_name in self._fields: + data[key] = self[field_name] + + if self['Metadata-Version'] == '1.2': + mapping_1_2 = ( + ('requires_dist', 'Requires-Dist'), + ('requires_python', 'Requires-Python'), + ('requires_external', 'Requires-External'), + ('provides_dist', 'Provides-Dist'), + ('obsoletes_dist', 'Obsoletes-Dist'), + ('project_url', 'Project-URL'), + ('maintainer', 'Maintainer'), + ('maintainer_email', 'Maintainer-email'), + ) + for key, field_name in mapping_1_2: + if not skip_missing or field_name in self._fields: + if key != 'project_url': + data[key] = self[field_name] + else: + data[key] = [','.join(u) for u in self[field_name]] + + elif self['Metadata-Version'] == '1.1': + mapping_1_1 = ( + ('provides', 'Provides'), + ('requires', 'Requires'), + ('obsoletes', 'Obsoletes'), + ) + for key, field_name in mapping_1_1: + if not skip_missing or field_name in self._fields: + data[key] = self[field_name] + + return data + + def add_requirements(self, requirements): + if self['Metadata-Version'] == '1.1': + # we can't have 1.1 metadata *and* Setuptools requires + for field in ('Obsoletes', 'Requires', 'Provides'): + if field in self: + del self[field] + self['Requires-Dist'] += requirements + + # Mapping API + # TODO could add iter* variants + + def keys(self): + return list(_version2fieldlist(self['Metadata-Version'])) + + def __iter__(self): + for key in self.keys(): + yield key + + def values(self): + return [self[key] for key in self.keys()] + + def items(self): + return [(key, self[key]) for key in self.keys()] + + def __repr__(self): + return '<%s %s %s>' % (self.__class__.__name__, self.name, + self.version) + + +METADATA_FILENAME = 'pydist.json' +WHEEL_METADATA_FILENAME = 'metadata.json' +LEGACY_METADATA_FILENAME = 'METADATA' + + +class Metadata(object): + """ + The metadata of a release. This implementation uses 2.0 (JSON) + metadata where possible. If not possible, it wraps a LegacyMetadata + instance which handles the key-value metadata format. + """ + + METADATA_VERSION_MATCHER = re.compile(r'^\d+(\.\d+)*$') + + NAME_MATCHER = re.compile('^[0-9A-Z]([0-9A-Z_.-]*[0-9A-Z])?$', re.I) + + VERSION_MATCHER = PEP440_VERSION_RE + + SUMMARY_MATCHER = re.compile('.{1,2047}') + + METADATA_VERSION = '2.0' + + GENERATOR = 'distlib (%s)' % __version__ + + MANDATORY_KEYS = { + 'name': (), + 'version': (), + 'summary': ('legacy',), + } + + INDEX_KEYS = ('name version license summary description author ' + 'author_email keywords platform home_page classifiers ' + 'download_url') + + DEPENDENCY_KEYS = ('extras run_requires test_requires build_requires ' + 'dev_requires provides meta_requires obsoleted_by ' + 'supports_environments') + + SYNTAX_VALIDATORS = { + 'metadata_version': (METADATA_VERSION_MATCHER, ()), + 'name': (NAME_MATCHER, ('legacy',)), + 'version': (VERSION_MATCHER, ('legacy',)), + 'summary': (SUMMARY_MATCHER, ('legacy',)), + } + + __slots__ = ('_legacy', '_data', 'scheme') + + def __init__(self, path=None, fileobj=None, mapping=None, + scheme='default'): + if [path, fileobj, mapping].count(None) < 2: + raise TypeError('path, fileobj and mapping are exclusive') + self._legacy = None + self._data = None + self.scheme = scheme + #import pdb; pdb.set_trace() + if mapping is not None: + try: + self._validate_mapping(mapping, scheme) + self._data = mapping + except MetadataUnrecognizedVersionError: + self._legacy = LegacyMetadata(mapping=mapping, scheme=scheme) + self.validate() + else: + data = None + if path: + with open(path, 'rb') as f: + data = f.read() + elif fileobj: + data = fileobj.read() + if data is None: + # Initialised with no args - to be added + self._data = { + 'metadata_version': self.METADATA_VERSION, + 'generator': self.GENERATOR, + } + else: + if not isinstance(data, text_type): + data = data.decode('utf-8') + try: + self._data = json.loads(data) + self._validate_mapping(self._data, scheme) + except ValueError: + # Note: MetadataUnrecognizedVersionError does not + # inherit from ValueError (it's a DistlibException, + # which should not inherit from ValueError). + # The ValueError comes from the json.load - if that + # succeeds and we get a validation error, we want + # that to propagate + self._legacy = LegacyMetadata(fileobj=StringIO(data), + scheme=scheme) + self.validate() + + common_keys = set(('name', 'version', 'license', 'keywords', 'summary')) + + none_list = (None, list) + none_dict = (None, dict) + + mapped_keys = { + 'run_requires': ('Requires-Dist', list), + 'build_requires': ('Setup-Requires-Dist', list), + 'dev_requires': none_list, + 'test_requires': none_list, + 'meta_requires': none_list, + 'extras': ('Provides-Extra', list), + 'modules': none_list, + 'namespaces': none_list, + 'exports': none_dict, + 'commands': none_dict, + 'classifiers': ('Classifier', list), + 'source_url': ('Download-URL', None), + 'metadata_version': ('Metadata-Version', None), + } + + del none_list, none_dict + + def __getattribute__(self, key): + common = object.__getattribute__(self, 'common_keys') + mapped = object.__getattribute__(self, 'mapped_keys') + if key in mapped: + lk, maker = mapped[key] + if self._legacy: + if lk is None: + result = None if maker is None else maker() + else: + result = self._legacy.get(lk) + else: + value = None if maker is None else maker() + if key not in ('commands', 'exports', 'modules', 'namespaces', + 'classifiers'): + result = self._data.get(key, value) + else: + # special cases for PEP 459 + sentinel = object() + result = sentinel + d = self._data.get('extensions') + if d: + if key == 'commands': + result = d.get('python.commands', value) + elif key == 'classifiers': + d = d.get('python.details') + if d: + result = d.get(key, value) + else: + d = d.get('python.exports') + if not d: + d = self._data.get('python.exports') + if d: + result = d.get(key, value) + if result is sentinel: + result = value + elif key not in common: + result = object.__getattribute__(self, key) + elif self._legacy: + result = self._legacy.get(key) + else: + result = self._data.get(key) + return result + + def _validate_value(self, key, value, scheme=None): + if key in self.SYNTAX_VALIDATORS: + pattern, exclusions = self.SYNTAX_VALIDATORS[key] + if (scheme or self.scheme) not in exclusions: + m = pattern.match(value) + if not m: + raise MetadataInvalidError("'%s' is an invalid value for " + "the '%s' property" % (value, + key)) + + def __setattr__(self, key, value): + self._validate_value(key, value) + common = object.__getattribute__(self, 'common_keys') + mapped = object.__getattribute__(self, 'mapped_keys') + if key in mapped: + lk, _ = mapped[key] + if self._legacy: + if lk is None: + raise NotImplementedError + self._legacy[lk] = value + elif key not in ('commands', 'exports', 'modules', 'namespaces', + 'classifiers'): + self._data[key] = value + else: + # special cases for PEP 459 + d = self._data.setdefault('extensions', {}) + if key == 'commands': + d['python.commands'] = value + elif key == 'classifiers': + d = d.setdefault('python.details', {}) + d[key] = value + else: + d = d.setdefault('python.exports', {}) + d[key] = value + elif key not in common: + object.__setattr__(self, key, value) + else: + if key == 'keywords': + if isinstance(value, string_types): + value = value.strip() + if value: + value = value.split() + else: + value = [] + if self._legacy: + self._legacy[key] = value + else: + self._data[key] = value + + @property + def name_and_version(self): + return _get_name_and_version(self.name, self.version, True) + + @property + def provides(self): + if self._legacy: + result = self._legacy['Provides-Dist'] + else: + result = self._data.setdefault('provides', []) + s = '%s (%s)' % (self.name, self.version) + if s not in result: + result.append(s) + return result + + @provides.setter + def provides(self, value): + if self._legacy: + self._legacy['Provides-Dist'] = value + else: + self._data['provides'] = value + + def get_requirements(self, reqts, extras=None, env=None): + """ + Base method to get dependencies, given a set of extras + to satisfy and an optional environment context. + :param reqts: A list of sometimes-wanted dependencies, + perhaps dependent on extras and environment. + :param extras: A list of optional components being requested. + :param env: An optional environment for marker evaluation. + """ + if self._legacy: + result = reqts + else: + result = [] + extras = get_extras(extras or [], self.extras) + for d in reqts: + if 'extra' not in d and 'environment' not in d: + # unconditional + include = True + else: + if 'extra' not in d: + # Not extra-dependent - only environment-dependent + include = True + else: + include = d.get('extra') in extras + if include: + # Not excluded because of extras, check environment + marker = d.get('environment') + if marker: + include = interpret(marker, env) + if include: + result.extend(d['requires']) + for key in ('build', 'dev', 'test'): + e = ':%s:' % key + if e in extras: + extras.remove(e) + # A recursive call, but it should terminate since 'test' + # has been removed from the extras + reqts = self._data.get('%s_requires' % key, []) + result.extend(self.get_requirements(reqts, extras=extras, + env=env)) + return result + + @property + def dictionary(self): + if self._legacy: + return self._from_legacy() + return self._data + + @property + def dependencies(self): + if self._legacy: + raise NotImplementedError + else: + return extract_by_key(self._data, self.DEPENDENCY_KEYS) + + @dependencies.setter + def dependencies(self, value): + if self._legacy: + raise NotImplementedError + else: + self._data.update(value) + + def _validate_mapping(self, mapping, scheme): + if mapping.get('metadata_version') != self.METADATA_VERSION: + raise MetadataUnrecognizedVersionError() + missing = [] + for key, exclusions in self.MANDATORY_KEYS.items(): + if key not in mapping: + if scheme not in exclusions: + missing.append(key) + if missing: + msg = 'Missing metadata items: %s' % ', '.join(missing) + raise MetadataMissingError(msg) + for k, v in mapping.items(): + self._validate_value(k, v, scheme) + + def validate(self): + if self._legacy: + missing, warnings = self._legacy.check(True) + if missing or warnings: + logger.warning('Metadata: missing: %s, warnings: %s', + missing, warnings) + else: + self._validate_mapping(self._data, self.scheme) + + def todict(self): + if self._legacy: + return self._legacy.todict(True) + else: + result = extract_by_key(self._data, self.INDEX_KEYS) + return result + + def _from_legacy(self): + assert self._legacy and not self._data + result = { + 'metadata_version': self.METADATA_VERSION, + 'generator': self.GENERATOR, + } + lmd = self._legacy.todict(True) # skip missing ones + for k in ('name', 'version', 'license', 'summary', 'description', + 'classifier'): + if k in lmd: + if k == 'classifier': + nk = 'classifiers' + else: + nk = k + result[nk] = lmd[k] + kw = lmd.get('Keywords', []) + if kw == ['']: + kw = [] + result['keywords'] = kw + keys = (('requires_dist', 'run_requires'), + ('setup_requires_dist', 'build_requires')) + for ok, nk in keys: + if ok in lmd and lmd[ok]: + result[nk] = [{'requires': lmd[ok]}] + result['provides'] = self.provides + author = {} + maintainer = {} + return result + + LEGACY_MAPPING = { + 'name': 'Name', + 'version': 'Version', + 'license': 'License', + 'summary': 'Summary', + 'description': 'Description', + 'classifiers': 'Classifier', + } + + def _to_legacy(self): + def process_entries(entries): + reqts = set() + for e in entries: + extra = e.get('extra') + env = e.get('environment') + rlist = e['requires'] + for r in rlist: + if not env and not extra: + reqts.add(r) + else: + marker = '' + if extra: + marker = 'extra == "%s"' % extra + if env: + if marker: + marker = '(%s) and %s' % (env, marker) + else: + marker = env + reqts.add(';'.join((r, marker))) + return reqts + + assert self._data and not self._legacy + result = LegacyMetadata() + nmd = self._data + for nk, ok in self.LEGACY_MAPPING.items(): + if nk in nmd: + result[ok] = nmd[nk] + r1 = process_entries(self.run_requires + self.meta_requires) + r2 = process_entries(self.build_requires + self.dev_requires) + if self.extras: + result['Provides-Extra'] = sorted(self.extras) + result['Requires-Dist'] = sorted(r1) + result['Setup-Requires-Dist'] = sorted(r2) + # TODO: other fields such as contacts + return result + + def write(self, path=None, fileobj=None, legacy=False, skip_unknown=True): + if [path, fileobj].count(None) != 1: + raise ValueError('Exactly one of path and fileobj is needed') + self.validate() + if legacy: + if self._legacy: + legacy_md = self._legacy + else: + legacy_md = self._to_legacy() + if path: + legacy_md.write(path, skip_unknown=skip_unknown) + else: + legacy_md.write_file(fileobj, skip_unknown=skip_unknown) + else: + if self._legacy: + d = self._from_legacy() + else: + d = self._data + if fileobj: + json.dump(d, fileobj, ensure_ascii=True, indent=2, + sort_keys=True) + else: + with codecs.open(path, 'w', 'utf-8') as f: + json.dump(d, f, ensure_ascii=True, indent=2, + sort_keys=True) + + def add_requirements(self, requirements): + if self._legacy: + self._legacy.add_requirements(requirements) + else: + run_requires = self._data.setdefault('run_requires', []) + always = None + for entry in run_requires: + if 'environment' not in entry and 'extra' not in entry: + always = entry + break + if always is None: + always = { 'requires': requirements } + run_requires.insert(0, always) + else: + rset = set(always['requires']) | set(requirements) + always['requires'] = sorted(rset) + + def __repr__(self): + name = self.name or '(no name)' + version = self.version or 'no version' + return '<%s %s %s (%s)>' % (self.__class__.__name__, + self.metadata_version, name, version) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/metadata.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/metadata.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bb3f1c5accfe16018f6f45d40e75f8a1721a090c GIT binary patch literal 38841 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 _frozen_importlib_external + try: + import _frozen_importlib_external as _fi + except ImportError: + import _frozen_importlib as _fi + _finder_registry[_fi.SourceFileLoader] = ResourceFinder + _finder_registry[_fi.FileFinder] = ResourceFinder + del _fi +except (ImportError, AttributeError): + pass + + +def register_finder(loader, finder_maker): + _finder_registry[type(loader)] = finder_maker + +_finder_cache = {} + + +def finder(package): + """ + Return a resource finder for a package. + :param package: The name of the package. + :return: A :class:`ResourceFinder` instance for the package. + """ + if package in _finder_cache: + result = _finder_cache[package] + else: + if package not in sys.modules: + __import__(package) + module = sys.modules[package] + path = getattr(module, '__path__', None) + if path is None: + raise DistlibException('You cannot get a finder for a module, ' + 'only for a package') + loader = getattr(module, '__loader__', None) + finder_maker = _finder_registry.get(type(loader)) + if finder_maker is None: + raise DistlibException('Unable to locate finder for %r' % package) + result = finder_maker(module) + _finder_cache[package] = result + return result + + +_dummy_module = types.ModuleType(str('__dummy__')) + + +def finder_for_path(path): + """ + Return a resource finder for a path, which should represent a container. + + :param path: The path. + :return: A :class:`ResourceFinder` instance for the path. + """ + result = None + # calls any path hooks, gets importer into cache + pkgutil.get_importer(path) + loader = sys.path_importer_cache.get(path) + finder = _finder_registry.get(type(loader)) + if finder: + module = _dummy_module + module.__file__ = os.path.join(path, '') + module.__loader__ = loader + result = finder(module) + return result diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/resources 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/resources 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6d41dc0c5b353355da2e1d5d43c5490b31fd18da GIT binary patch literal 15896 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 vQ(LY#>L<^iY@B@j _frozen_importlib_external + try: + import _frozen_importlib_external as _fi + except ImportError: + import _frozen_importlib as _fi + _finder_registry[_fi.SourceFileLoader] = ResourceFinder + _finder_registry[_fi.FileFinder] = ResourceFinder + del _fi +except (ImportError, AttributeError): + pass + + +def register_finder(loader, finder_maker): + _finder_registry[type(loader)] = finder_maker + +_finder_cache = {} + + +def finder(package): + """ + Return a resource finder for a package. + :param package: The name of the package. + :return: A :class:`ResourceFinder` instance for the package. + """ + if package in _finder_cache: + result = _finder_cache[package] + else: + if package not in sys.modules: + __import__(package) + module = sys.modules[package] + path = getattr(module, '__path__', None) + if path is None: + raise DistlibException('You cannot get a finder for a module, ' + 'only for a package') + loader = getattr(module, '__loader__', None) + finder_maker = _finder_registry.get(type(loader)) + if finder_maker is None: + raise DistlibException('Unable to locate finder for %r' % package) + result = finder_maker(module) + _finder_cache[package] = result + return result + + +_dummy_module = types.ModuleType(str('__dummy__')) + + +def finder_for_path(path): + """ + Return a resource finder for a path, which should represent a container. + + :param path: The path. + :return: A :class:`ResourceFinder` instance for the path. + """ + result = None + # calls any path hooks, gets importer into cache + pkgutil.get_importer(path) + loader = sys.path_importer_cache.get(path) + finder = _finder_registry.get(type(loader)) + if finder: + module = _dummy_module + module.__file__ = os.path.join(path, '') + module.__loader__ = loader + result = finder(module) + return result diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/resources.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/resources.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1ad528d3e80b2d5f3c7f1f09287bb38bb5c71543 GIT binary patch literal 15896 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 literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/scripts 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/scripts 2.py new file mode 100644 index 0000000..5185974 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/scripts 2.py @@ -0,0 +1,416 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013-2015 Vinay Sajip. +# Licensed to the Python Software Foundation under a contributor agreement. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +from io import BytesIO +import logging +import os +import re +import struct +import sys + +from .compat import sysconfig, detect_encoding, ZipFile +from .resources import finder +from .util import (FileOperator, get_export_entry, convert_path, + get_executable, in_venv) + +logger = logging.getLogger(__name__) + +_DEFAULT_MANIFEST = ''' + + + + + + + + + + + + +'''.strip() + +# check if Python is called on the first line with this expression +FIRST_LINE_RE = re.compile(b'^#!.*pythonw?[0-9.]*([ \t].*)?$') +SCRIPT_TEMPLATE = r'''# -*- coding: utf-8 -*- +import re +import sys +from %(module)s import %(import_name)s +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(%(func)s()) +''' + + +def _enquote_executable(executable): + if ' ' in executable: + # make sure we quote only the executable in case of env + # for example /usr/bin/env "/dir with spaces/bin/jython" + # instead of "/usr/bin/env /dir with spaces/bin/jython" + # otherwise whole + if executable.startswith('/usr/bin/env '): + env, _executable = executable.split(' ', 1) + if ' ' in _executable and not _executable.startswith('"'): + executable = '%s "%s"' % (env, _executable) + else: + if not executable.startswith('"'): + executable = '"%s"' % executable + return executable + + +class ScriptMaker(object): + """ + A class to copy or create scripts from source scripts or callable + specifications. + """ + script_template = SCRIPT_TEMPLATE + + executable = None # for shebangs + + def __init__(self, source_dir, target_dir, add_launchers=True, + dry_run=False, fileop=None): + self.source_dir = source_dir + self.target_dir = target_dir + self.add_launchers = add_launchers + self.force = False + self.clobber = False + # It only makes sense to set mode bits on POSIX. + self.set_mode = (os.name == 'posix') or (os.name == 'java' and + os._name == 'posix') + self.variants = set(('', 'X.Y')) + self._fileop = fileop or FileOperator(dry_run) + + self._is_nt = os.name == 'nt' or ( + os.name == 'java' and os._name == 'nt') + + def _get_alternate_executable(self, executable, options): + if options.get('gui', False) and self._is_nt: # pragma: no cover + dn, fn = os.path.split(executable) + fn = fn.replace('python', 'pythonw') + executable = os.path.join(dn, fn) + return executable + + if sys.platform.startswith('java'): # pragma: no cover + def _is_shell(self, executable): + """ + Determine if the specified executable is a script + (contains a #! line) + """ + try: + with open(executable) as fp: + return fp.read(2) == '#!' + except (OSError, IOError): + logger.warning('Failed to open %s', executable) + return False + + def _fix_jython_executable(self, executable): + if self._is_shell(executable): + # Workaround for Jython is not needed on Linux systems. + import java + + if java.lang.System.getProperty('os.name') == 'Linux': + return executable + elif executable.lower().endswith('jython.exe'): + # Use wrapper exe for Jython on Windows + return executable + return '/usr/bin/env %s' % executable + + def _build_shebang(self, executable, post_interp): + """ + Build a shebang line. In the simple case (on Windows, or a shebang line + which is not too long or contains spaces) use a simple formulation for + the shebang. Otherwise, use /bin/sh as the executable, with a contrived + shebang which allows the script to run either under Python or sh, using + suitable quoting. Thanks to Harald Nordgren for his input. + + See also: http://www.in-ulm.de/~mascheck/various/shebang/#length + https://hg.mozilla.org/mozilla-central/file/tip/mach + """ + if os.name != 'posix': + simple_shebang = True + else: + # Add 3 for '#!' prefix and newline suffix. + shebang_length = len(executable) + len(post_interp) + 3 + if sys.platform == 'darwin': + max_shebang_length = 512 + else: + max_shebang_length = 127 + simple_shebang = ((b' ' not in executable) and + (shebang_length <= max_shebang_length)) + + if simple_shebang: + result = b'#!' + executable + post_interp + b'\n' + else: + result = b'#!/bin/sh\n' + result += b"'''exec' " + executable + post_interp + b' "$0" "$@"\n' + result += b"' '''" + return result + + def _get_shebang(self, encoding, post_interp=b'', options=None): + enquote = True + if self.executable: + executable = self.executable + enquote = False # assume this will be taken care of + elif not sysconfig.is_python_build(): + executable = get_executable() + elif in_venv(): # pragma: no cover + executable = os.path.join(sysconfig.get_path('scripts'), + 'python%s' % sysconfig.get_config_var('EXE')) + else: # pragma: no cover + executable = os.path.join( + sysconfig.get_config_var('BINDIR'), + 'python%s%s' % (sysconfig.get_config_var('VERSION'), + sysconfig.get_config_var('EXE'))) + if options: + executable = self._get_alternate_executable(executable, options) + + if sys.platform.startswith('java'): # pragma: no cover + executable = self._fix_jython_executable(executable) + + # Normalise case for Windows - COMMENTED OUT + # executable = os.path.normcase(executable) + # N.B. The normalising operation above has been commented out: See + # issue #124. Although paths in Windows are generally case-insensitive, + # they aren't always. For example, a path containing a ẞ (which is a + # LATIN CAPITAL LETTER SHARP S - U+1E9E) is normcased to ß (which is a + # LATIN SMALL LETTER SHARP S' - U+00DF). The two are not considered by + # Windows as equivalent in path names. + + # If the user didn't specify an executable, it may be necessary to + # cater for executable paths with spaces (not uncommon on Windows) + if enquote: + executable = _enquote_executable(executable) + # Issue #51: don't use fsencode, since we later try to + # check that the shebang is decodable using utf-8. + executable = executable.encode('utf-8') + # in case of IronPython, play safe and enable frames support + if (sys.platform == 'cli' and '-X:Frames' not in post_interp + and '-X:FullFrames' not in post_interp): # pragma: no cover + post_interp += b' -X:Frames' + shebang = self._build_shebang(executable, post_interp) + # Python parser starts to read a script using UTF-8 until + # it gets a #coding:xxx cookie. The shebang has to be the + # first line of a file, the #coding:xxx cookie cannot be + # written before. So the shebang has to be decodable from + # UTF-8. + try: + shebang.decode('utf-8') + except UnicodeDecodeError: # pragma: no cover + raise ValueError( + 'The shebang (%r) is not decodable from utf-8' % shebang) + # If the script is encoded to a custom encoding (use a + # #coding:xxx cookie), the shebang has to be decodable from + # the script encoding too. + if encoding != 'utf-8': + try: + shebang.decode(encoding) + except UnicodeDecodeError: # pragma: no cover + raise ValueError( + 'The shebang (%r) is not decodable ' + 'from the script encoding (%r)' % (shebang, encoding)) + return shebang + + def _get_script_text(self, entry): + return self.script_template % dict(module=entry.prefix, + import_name=entry.suffix.split('.')[0], + func=entry.suffix) + + manifest = _DEFAULT_MANIFEST + + def get_manifest(self, exename): + base = os.path.basename(exename) + return self.manifest % base + + def _write_script(self, names, shebang, script_bytes, filenames, ext): + use_launcher = self.add_launchers and self._is_nt + linesep = os.linesep.encode('utf-8') + if not shebang.endswith(linesep): + shebang += linesep + if not use_launcher: + script_bytes = shebang + script_bytes + else: # pragma: no cover + if ext == 'py': + launcher = self._get_launcher('t') + else: + launcher = self._get_launcher('w') + stream = BytesIO() + with ZipFile(stream, 'w') as zf: + zf.writestr('__main__.py', script_bytes) + zip_data = stream.getvalue() + script_bytes = launcher + shebang + zip_data + for name in names: + outname = os.path.join(self.target_dir, name) + if use_launcher: # pragma: no cover + n, e = os.path.splitext(outname) + if e.startswith('.py'): + outname = n + outname = '%s.exe' % outname + try: + self._fileop.write_binary_file(outname, script_bytes) + except Exception: + # Failed writing an executable - it might be in use. + logger.warning('Failed to write executable - trying to ' + 'use .deleteme logic') + dfname = '%s.deleteme' % outname + if os.path.exists(dfname): + os.remove(dfname) # Not allowed to fail here + os.rename(outname, dfname) # nor here + self._fileop.write_binary_file(outname, script_bytes) + logger.debug('Able to replace executable using ' + '.deleteme logic') + try: + os.remove(dfname) + except Exception: + pass # still in use - ignore error + else: + if self._is_nt and not outname.endswith('.' + ext): # pragma: no cover + outname = '%s.%s' % (outname, ext) + if os.path.exists(outname) and not self.clobber: + logger.warning('Skipping existing file %s', outname) + continue + self._fileop.write_binary_file(outname, script_bytes) + if self.set_mode: + self._fileop.set_executable_mode([outname]) + filenames.append(outname) + + def _make_script(self, entry, filenames, options=None): + post_interp = b'' + if options: + args = options.get('interpreter_args', []) + if args: + args = ' %s' % ' '.join(args) + post_interp = args.encode('utf-8') + shebang = self._get_shebang('utf-8', post_interp, options=options) + script = self._get_script_text(entry).encode('utf-8') + name = entry.name + scriptnames = set() + if '' in self.variants: + scriptnames.add(name) + if 'X' in self.variants: + scriptnames.add('%s%s' % (name, sys.version_info[0])) + if 'X.Y' in self.variants: + scriptnames.add('%s-%s.%s' % (name, sys.version_info[0], + sys.version_info[1])) + if options and options.get('gui', False): + ext = 'pyw' + else: + ext = 'py' + self._write_script(scriptnames, shebang, script, filenames, ext) + + def _copy_script(self, script, filenames): + adjust = False + script = os.path.join(self.source_dir, convert_path(script)) + outname = os.path.join(self.target_dir, os.path.basename(script)) + if not self.force and not self._fileop.newer(script, outname): + logger.debug('not copying %s (up-to-date)', script) + return + + # Always open the file, but ignore failures in dry-run mode -- + # that way, we'll get accurate feedback if we can read the + # script. + try: + f = open(script, 'rb') + except IOError: # pragma: no cover + if not self.dry_run: + raise + f = None + else: + first_line = f.readline() + if not first_line: # pragma: no cover + logger.warning('%s: %s is an empty file (skipping)', + self.get_command_name(), script) + return + + match = FIRST_LINE_RE.match(first_line.replace(b'\r\n', b'\n')) + if match: + adjust = True + post_interp = match.group(1) or b'' + + if not adjust: + if f: + f.close() + self._fileop.copy_file(script, outname) + if self.set_mode: + self._fileop.set_executable_mode([outname]) + filenames.append(outname) + else: + logger.info('copying and adjusting %s -> %s', script, + self.target_dir) + if not self._fileop.dry_run: + encoding, lines = detect_encoding(f.readline) + f.seek(0) + shebang = self._get_shebang(encoding, post_interp) + if b'pythonw' in first_line: # pragma: no cover + ext = 'pyw' + else: + ext = 'py' + n = os.path.basename(outname) + self._write_script([n], shebang, f.read(), filenames, ext) + if f: + f.close() + + @property + def dry_run(self): + return self._fileop.dry_run + + @dry_run.setter + def dry_run(self, value): + self._fileop.dry_run = value + + if os.name == 'nt' or (os.name == 'java' and os._name == 'nt'): # pragma: no cover + # Executable launcher support. + # Launchers are from https://bitbucket.org/vinay.sajip/simple_launcher/ + + def _get_launcher(self, kind): + if struct.calcsize('P') == 8: # 64-bit + bits = '64' + else: + bits = '32' + name = '%s%s.exe' % (kind, bits) + # Issue 31: don't hardcode an absolute package name, but + # determine it relative to the current package + distlib_package = __name__.rsplit('.', 1)[0] + resource = finder(distlib_package).find(name) + if not resource: + msg = ('Unable to find resource %s in package %s' % (name, + distlib_package)) + raise ValueError(msg) + return resource.bytes + + # Public API follows + + def make(self, specification, options=None): + """ + Make a script. + + :param specification: The specification, which is either a valid export + entry specification (to make a script from a + callable) or a filename (to make a script by + copying from a source location). + :param options: A dictionary of options controlling script generation. + :return: A list of all absolute pathnames written to. + """ + filenames = [] + entry = get_export_entry(specification) + if entry is None: + self._copy_script(specification, filenames) + else: + self._make_script(entry, filenames, options=options) + return filenames + + def make_multiple(self, specifications, options=None): + """ + Take a list of specifications and make scripts from them, + :param specifications: A list of specifications. + :return: A list of all absolute pathnames written to, + """ + filenames = [] + for specification in specifications: + filenames.extend(self.make(specification, options)) + return filenames diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/scripts 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/scripts 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7388ded2838a9b46e5a90df28b61c22bca69b832 GIT binary patch literal 14218 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 NDCNh72J^$?{{uaMuQvby literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/scripts.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/scripts.py new file mode 100644 index 0000000..5185974 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/scripts.py @@ -0,0 +1,416 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013-2015 Vinay Sajip. +# Licensed to the Python Software Foundation under a contributor agreement. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +from io import BytesIO +import logging +import os +import re +import struct +import sys + +from .compat import sysconfig, detect_encoding, ZipFile +from .resources import finder +from .util import (FileOperator, get_export_entry, convert_path, + get_executable, in_venv) + +logger = logging.getLogger(__name__) + +_DEFAULT_MANIFEST = ''' + + + + + + + + + + + + +'''.strip() + +# check if Python is called on the first line with this expression +FIRST_LINE_RE = re.compile(b'^#!.*pythonw?[0-9.]*([ \t].*)?$') +SCRIPT_TEMPLATE = r'''# -*- coding: utf-8 -*- +import re +import sys +from %(module)s import %(import_name)s +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(%(func)s()) +''' + + +def _enquote_executable(executable): + if ' ' in executable: + # make sure we quote only the executable in case of env + # for example /usr/bin/env "/dir with spaces/bin/jython" + # instead of "/usr/bin/env /dir with spaces/bin/jython" + # otherwise whole + if executable.startswith('/usr/bin/env '): + env, _executable = executable.split(' ', 1) + if ' ' in _executable and not _executable.startswith('"'): + executable = '%s "%s"' % (env, _executable) + else: + if not executable.startswith('"'): + executable = '"%s"' % executable + return executable + + +class ScriptMaker(object): + """ + A class to copy or create scripts from source scripts or callable + specifications. + """ + script_template = SCRIPT_TEMPLATE + + executable = None # for shebangs + + def __init__(self, source_dir, target_dir, add_launchers=True, + dry_run=False, fileop=None): + self.source_dir = source_dir + self.target_dir = target_dir + self.add_launchers = add_launchers + self.force = False + self.clobber = False + # It only makes sense to set mode bits on POSIX. + self.set_mode = (os.name == 'posix') or (os.name == 'java' and + os._name == 'posix') + self.variants = set(('', 'X.Y')) + self._fileop = fileop or FileOperator(dry_run) + + self._is_nt = os.name == 'nt' or ( + os.name == 'java' and os._name == 'nt') + + def _get_alternate_executable(self, executable, options): + if options.get('gui', False) and self._is_nt: # pragma: no cover + dn, fn = os.path.split(executable) + fn = fn.replace('python', 'pythonw') + executable = os.path.join(dn, fn) + return executable + + if sys.platform.startswith('java'): # pragma: no cover + def _is_shell(self, executable): + """ + Determine if the specified executable is a script + (contains a #! line) + """ + try: + with open(executable) as fp: + return fp.read(2) == '#!' + except (OSError, IOError): + logger.warning('Failed to open %s', executable) + return False + + def _fix_jython_executable(self, executable): + if self._is_shell(executable): + # Workaround for Jython is not needed on Linux systems. + import java + + if java.lang.System.getProperty('os.name') == 'Linux': + return executable + elif executable.lower().endswith('jython.exe'): + # Use wrapper exe for Jython on Windows + return executable + return '/usr/bin/env %s' % executable + + def _build_shebang(self, executable, post_interp): + """ + Build a shebang line. In the simple case (on Windows, or a shebang line + which is not too long or contains spaces) use a simple formulation for + the shebang. Otherwise, use /bin/sh as the executable, with a contrived + shebang which allows the script to run either under Python or sh, using + suitable quoting. Thanks to Harald Nordgren for his input. + + See also: http://www.in-ulm.de/~mascheck/various/shebang/#length + https://hg.mozilla.org/mozilla-central/file/tip/mach + """ + if os.name != 'posix': + simple_shebang = True + else: + # Add 3 for '#!' prefix and newline suffix. + shebang_length = len(executable) + len(post_interp) + 3 + if sys.platform == 'darwin': + max_shebang_length = 512 + else: + max_shebang_length = 127 + simple_shebang = ((b' ' not in executable) and + (shebang_length <= max_shebang_length)) + + if simple_shebang: + result = b'#!' + executable + post_interp + b'\n' + else: + result = b'#!/bin/sh\n' + result += b"'''exec' " + executable + post_interp + b' "$0" "$@"\n' + result += b"' '''" + return result + + def _get_shebang(self, encoding, post_interp=b'', options=None): + enquote = True + if self.executable: + executable = self.executable + enquote = False # assume this will be taken care of + elif not sysconfig.is_python_build(): + executable = get_executable() + elif in_venv(): # pragma: no cover + executable = os.path.join(sysconfig.get_path('scripts'), + 'python%s' % sysconfig.get_config_var('EXE')) + else: # pragma: no cover + executable = os.path.join( + sysconfig.get_config_var('BINDIR'), + 'python%s%s' % (sysconfig.get_config_var('VERSION'), + sysconfig.get_config_var('EXE'))) + if options: + executable = self._get_alternate_executable(executable, options) + + if sys.platform.startswith('java'): # pragma: no cover + executable = self._fix_jython_executable(executable) + + # Normalise case for Windows - COMMENTED OUT + # executable = os.path.normcase(executable) + # N.B. The normalising operation above has been commented out: See + # issue #124. Although paths in Windows are generally case-insensitive, + # they aren't always. For example, a path containing a ẞ (which is a + # LATIN CAPITAL LETTER SHARP S - U+1E9E) is normcased to ß (which is a + # LATIN SMALL LETTER SHARP S' - U+00DF). The two are not considered by + # Windows as equivalent in path names. + + # If the user didn't specify an executable, it may be necessary to + # cater for executable paths with spaces (not uncommon on Windows) + if enquote: + executable = _enquote_executable(executable) + # Issue #51: don't use fsencode, since we later try to + # check that the shebang is decodable using utf-8. + executable = executable.encode('utf-8') + # in case of IronPython, play safe and enable frames support + if (sys.platform == 'cli' and '-X:Frames' not in post_interp + and '-X:FullFrames' not in post_interp): # pragma: no cover + post_interp += b' -X:Frames' + shebang = self._build_shebang(executable, post_interp) + # Python parser starts to read a script using UTF-8 until + # it gets a #coding:xxx cookie. The shebang has to be the + # first line of a file, the #coding:xxx cookie cannot be + # written before. So the shebang has to be decodable from + # UTF-8. + try: + shebang.decode('utf-8') + except UnicodeDecodeError: # pragma: no cover + raise ValueError( + 'The shebang (%r) is not decodable from utf-8' % shebang) + # If the script is encoded to a custom encoding (use a + # #coding:xxx cookie), the shebang has to be decodable from + # the script encoding too. + if encoding != 'utf-8': + try: + shebang.decode(encoding) + except UnicodeDecodeError: # pragma: no cover + raise ValueError( + 'The shebang (%r) is not decodable ' + 'from the script encoding (%r)' % (shebang, encoding)) + return shebang + + def _get_script_text(self, entry): + return self.script_template % dict(module=entry.prefix, + import_name=entry.suffix.split('.')[0], + func=entry.suffix) + + manifest = _DEFAULT_MANIFEST + + def get_manifest(self, exename): + base = os.path.basename(exename) + return self.manifest % base + + def _write_script(self, names, shebang, script_bytes, filenames, ext): + use_launcher = self.add_launchers and self._is_nt + linesep = os.linesep.encode('utf-8') + if not shebang.endswith(linesep): + shebang += linesep + if not use_launcher: + script_bytes = shebang + script_bytes + else: # pragma: no cover + if ext == 'py': + launcher = self._get_launcher('t') + else: + launcher = self._get_launcher('w') + stream = BytesIO() + with ZipFile(stream, 'w') as zf: + zf.writestr('__main__.py', script_bytes) + zip_data = stream.getvalue() + script_bytes = launcher + shebang + zip_data + for name in names: + outname = os.path.join(self.target_dir, name) + if use_launcher: # pragma: no cover + n, e = os.path.splitext(outname) + if e.startswith('.py'): + outname = n + outname = '%s.exe' % outname + try: + self._fileop.write_binary_file(outname, script_bytes) + except Exception: + # Failed writing an executable - it might be in use. + logger.warning('Failed to write executable - trying to ' + 'use .deleteme logic') + dfname = '%s.deleteme' % outname + if os.path.exists(dfname): + os.remove(dfname) # Not allowed to fail here + os.rename(outname, dfname) # nor here + self._fileop.write_binary_file(outname, script_bytes) + logger.debug('Able to replace executable using ' + '.deleteme logic') + try: + os.remove(dfname) + except Exception: + pass # still in use - ignore error + else: + if self._is_nt and not outname.endswith('.' + ext): # pragma: no cover + outname = '%s.%s' % (outname, ext) + if os.path.exists(outname) and not self.clobber: + logger.warning('Skipping existing file %s', outname) + continue + self._fileop.write_binary_file(outname, script_bytes) + if self.set_mode: + self._fileop.set_executable_mode([outname]) + filenames.append(outname) + + def _make_script(self, entry, filenames, options=None): + post_interp = b'' + if options: + args = options.get('interpreter_args', []) + if args: + args = ' %s' % ' '.join(args) + post_interp = args.encode('utf-8') + shebang = self._get_shebang('utf-8', post_interp, options=options) + script = self._get_script_text(entry).encode('utf-8') + name = entry.name + scriptnames = set() + if '' in self.variants: + scriptnames.add(name) + if 'X' in self.variants: + scriptnames.add('%s%s' % (name, sys.version_info[0])) + if 'X.Y' in self.variants: + scriptnames.add('%s-%s.%s' % (name, sys.version_info[0], + sys.version_info[1])) + if options and options.get('gui', False): + ext = 'pyw' + else: + ext = 'py' + self._write_script(scriptnames, shebang, script, filenames, ext) + + def _copy_script(self, script, filenames): + adjust = False + script = os.path.join(self.source_dir, convert_path(script)) + outname = os.path.join(self.target_dir, os.path.basename(script)) + if not self.force and not self._fileop.newer(script, outname): + logger.debug('not copying %s (up-to-date)', script) + return + + # Always open the file, but ignore failures in dry-run mode -- + # that way, we'll get accurate feedback if we can read the + # script. + try: + f = open(script, 'rb') + except IOError: # pragma: no cover + if not self.dry_run: + raise + f = None + else: + first_line = f.readline() + if not first_line: # pragma: no cover + logger.warning('%s: %s is an empty file (skipping)', + self.get_command_name(), script) + return + + match = FIRST_LINE_RE.match(first_line.replace(b'\r\n', b'\n')) + if match: + adjust = True + post_interp = match.group(1) or b'' + + if not adjust: + if f: + f.close() + self._fileop.copy_file(script, outname) + if self.set_mode: + self._fileop.set_executable_mode([outname]) + filenames.append(outname) + else: + logger.info('copying and adjusting %s -> %s', script, + self.target_dir) + if not self._fileop.dry_run: + encoding, lines = detect_encoding(f.readline) + f.seek(0) + shebang = self._get_shebang(encoding, post_interp) + if b'pythonw' in first_line: # pragma: no cover + ext = 'pyw' + else: + ext = 'py' + n = os.path.basename(outname) + self._write_script([n], shebang, f.read(), filenames, ext) + if f: + f.close() + + @property + def dry_run(self): + return self._fileop.dry_run + + @dry_run.setter + def dry_run(self, value): + self._fileop.dry_run = value + + if os.name == 'nt' or (os.name == 'java' and os._name == 'nt'): # pragma: no cover + # Executable launcher support. + # Launchers are from https://bitbucket.org/vinay.sajip/simple_launcher/ + + def _get_launcher(self, kind): + if struct.calcsize('P') == 8: # 64-bit + bits = '64' + else: + bits = '32' + name = '%s%s.exe' % (kind, bits) + # Issue 31: don't hardcode an absolute package name, but + # determine it relative to the current package + distlib_package = __name__.rsplit('.', 1)[0] + resource = finder(distlib_package).find(name) + if not resource: + msg = ('Unable to find resource %s in package %s' % (name, + distlib_package)) + raise ValueError(msg) + return resource.bytes + + # Public API follows + + def make(self, specification, options=None): + """ + Make a script. + + :param specification: The specification, which is either a valid export + entry specification (to make a script from a + callable) or a filename (to make a script by + copying from a source location). + :param options: A dictionary of options controlling script generation. + :return: A list of all absolute pathnames written to. + """ + filenames = [] + entry = get_export_entry(specification) + if entry is None: + self._copy_script(specification, filenames) + else: + self._make_script(entry, filenames, options=options) + return filenames + + def make_multiple(self, specifications, options=None): + """ + Take a list of specifications and make scripts from them, + :param specifications: A list of specifications. + :return: A list of all absolute pathnames written to, + """ + filenames = [] + for specification in specifications: + filenames.extend(self.make(specification, options)) + return filenames diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/scripts.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/scripts.pyc new file mode 100644 index 0000000000000000000000000000000000000000..628c8add8afafd50d2cd308bdc2ef6a695ead209 GIT binary patch literal 14218 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 F{{j_Hb~FG0 literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/t32.exe b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/t32.exe new file mode 100644 index 0000000000000000000000000000000000000000..8932a18e4596952373a38c60b81b7116d4ef9ee8 GIT binary patch literal 96768 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 F{{j_Hb~FG0 literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/t64 2.exe b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/t64 2.exe new file mode 100644 index 0000000000000000000000000000000000000000..325b8057c08cf7113d4fd889991fa5638d443793 GIT binary patch literal 105984 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

^h^N4aZyJe%k(7BL*-gn=9``8`j0CuR45%cHI z_uuQ8!-|TEvJ}r=zF@%uKc8U@W1eNxUymJ(e45Tb6KDNieQcKe?L-gR8zZj^wFmi= z{5sAxrfP3BOZz~T$3h=Gi%jFg1%D>!6t*l^`zH2G#1PiYtvOBSI#q&y?8qN57P^LA zq9U)rQU+*y!XEgsGMCJM7yWOS+9lW~^axz>9gyv{Pu^qsBg%ZkfzkaN`$zV#>=oFn zwANnf4&g*eu~pAMC~1dl8FZ-^aeQgZ7=osPU=58@oke z55pen;eU@Z`iL!`$;1-VA&$VF4gN7ttU>relx5d-_x=|95B47HeeiYJZ$$38(ddJH zcrW3>{OR2@KF^H}gAbdZDX=AzyZHSizB_(9`v&$-69)D4WBjSaY@YVD`kl8;nl#Cu z5h1U}Tp}-l|Nde9w|3Pc@Aps8-X~fh_EGq!b-~*$a&nv>05-_n;)z{t+vW|PpX{Oj zKE#i|Gsq9Jhpor%Fqiu6y5}jjnz?*$b)h|UO;3NGd-k|9?ZqeVXL!9~vaIO0E8bVb zejzv5ZG0}~1A7{a3!hob11v4ihxvzh!S5>3I?4E~N9+^m8@sHve^M+wb{f3t2VUsD z*C*C&;z_`=&t~mbE@mHC`k7cGl3rKU9U84p?fzGxTg1q z)-Ai@eQSs49?#VDZ(BQ5_sXt#*VAn)X1Lk5l>kvHP6SDZX>#ITM7@`jxR;sQ>OG+Pe$CuXbGOdj zGq+|zTtQMnhk{-O{R=KF7*}vZ!OVhr1xpLo6l^NkTCk^}W?@_*Z|>hH7&o`>+{q8j zm_Kv=-1+n7FPgt}{>u4l=C7T3KtbFEnHc+rVzeuEi5hE<2hHiD6S}>D5l co{tw5U0O7totB*9DH^Zx#M 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

^h^N4aZyJe%k(7BL*-gn=9``8`j0CuR45%cHI z_uuQ8!-|TEvJ}r=zF@%uKc8U@W1eNxUymJ(e45Tb6KDNieQcKe?L-gR8zZj^wFmi= z{5sAxrfP3BOZz~T$3h=Gi%jFg1%D>!6t*l^`zH2G#1PiYtvOBSI#q&y?8qN57P^LA zq9U)rQU+*y!XEgsGMCJM7yWOS+9lW~^axz>9gyv{Pu^qsBg%ZkfzkaN`$zV#>=oFn zwANnf4&g*eu~pAMC~1dl8FZ-^aeQgZ7=osPU=58@oke z55pen;eU@Z`iL!`$;1-VA&$VF4gN7ttU>relx5d-_x=|95B47HeeiYJZ$$38(ddJH zcrW3>{OR2@KF^H}gAbdZDX=AzyZHSizB_(9`v&$-69)D4WBjSaY@YVD`kl8;nl#Cu z5h1U}Tp}-l|Nde9w|3Pc@Aps8-X~fh_EGq!b-~*$a&nv>05-_n;)z{t+vW|PpX{Oj zKE#i|Gsq9Jhpor%Fqiu6y5}jjnz?*$b)h|UO;3NGd-k|9?ZqeVXL!9~vaIO0E8bVb zejzv5ZG0}~1A7{a3!hob11v4ihxvzh!S5>3I?4E~N9+^m8@sHve^M+wb{f3t2VUsD z*C*C&;z_`=&t~mbE@mHC`k7cGl3rKU9U84p?fzGxTg1q z)-Ai@eQSs49?#VDZ(BQ5_sXt#*VAn)X1Lk5l>kvHP6SDZX>#ITM7@`jxR;sQ>OG+Pe$CuXbGOdj zGq+|zTtQMnhk{-O{R=KF7*}vZ!OVhr1xpLo6l^NkTCk^}W?@_*Z|>hH7&o`>+{q8j zm_Kv=-1+n7FPgt}{>u4l=C7T3KtbFEnHc+rVzeuEi5hE<2hHiD6S}>D5l co{tw5U0O7=?|={2,3}|[~!]=)\s*') +MARKER_OP = re.compile(r'^((<=?)|(>=?)|={2,3}|[~!]=|in|not\s+in)\s*') +OR = re.compile(r'^or\b\s*') +AND = re.compile(r'^and\b\s*') +NON_SPACE = re.compile(r'(\S+)\s*') +STRING_CHUNK = re.compile(r'([\s\w\.{}()*+#:;,/?!~`@$%^&=|<>\[\]-]+)') + + +def parse_marker(marker_string): + """ + Parse a marker string and return a dictionary containing a marker expression. + + The dictionary will contain keys "op", "lhs" and "rhs" for non-terminals in + the expression grammar, or strings. A string contained in quotes is to be + interpreted as a literal string, and a string not contained in quotes is a + variable (such as os_name). + """ + def marker_var(remaining): + # either identifier, or literal string + m = IDENTIFIER.match(remaining) + if m: + result = m.groups()[0] + remaining = remaining[m.end():] + elif not remaining: + raise SyntaxError('unexpected end of input') + else: + q = remaining[0] + if q not in '\'"': + raise SyntaxError('invalid expression: %s' % remaining) + oq = '\'"'.replace(q, '') + remaining = remaining[1:] + parts = [q] + while remaining: + # either a string chunk, or oq, or q to terminate + if remaining[0] == q: + break + elif remaining[0] == oq: + parts.append(oq) + remaining = remaining[1:] + else: + m = STRING_CHUNK.match(remaining) + if not m: + raise SyntaxError('error in string literal: %s' % remaining) + parts.append(m.groups()[0]) + remaining = remaining[m.end():] + else: + s = ''.join(parts) + raise SyntaxError('unterminated string: %s' % s) + parts.append(q) + result = ''.join(parts) + remaining = remaining[1:].lstrip() # skip past closing quote + return result, remaining + + def marker_expr(remaining): + if remaining and remaining[0] == '(': + result, remaining = marker(remaining[1:].lstrip()) + if remaining[0] != ')': + raise SyntaxError('unterminated parenthesis: %s' % remaining) + remaining = remaining[1:].lstrip() + else: + lhs, remaining = marker_var(remaining) + while remaining: + m = MARKER_OP.match(remaining) + if not m: + break + op = m.groups()[0] + remaining = remaining[m.end():] + rhs, remaining = marker_var(remaining) + lhs = {'op': op, 'lhs': lhs, 'rhs': rhs} + result = lhs + return result, remaining + + def marker_and(remaining): + lhs, remaining = marker_expr(remaining) + while remaining: + m = AND.match(remaining) + if not m: + break + remaining = remaining[m.end():] + rhs, remaining = marker_expr(remaining) + lhs = {'op': 'and', 'lhs': lhs, 'rhs': rhs} + return lhs, remaining + + def marker(remaining): + lhs, remaining = marker_and(remaining) + while remaining: + m = OR.match(remaining) + if not m: + break + remaining = remaining[m.end():] + rhs, remaining = marker_and(remaining) + lhs = {'op': 'or', 'lhs': lhs, 'rhs': rhs} + return lhs, remaining + + return marker(marker_string) + + +def parse_requirement(req): + """ + Parse a requirement passed in as a string. Return a Container + whose attributes contain the various parts of the requirement. + """ + remaining = req.strip() + if not remaining or remaining.startswith('#'): + return None + m = IDENTIFIER.match(remaining) + if not m: + raise SyntaxError('name expected: %s' % remaining) + distname = m.groups()[0] + remaining = remaining[m.end():] + extras = mark_expr = versions = uri = None + if remaining and remaining[0] == '[': + i = remaining.find(']', 1) + if i < 0: + raise SyntaxError('unterminated extra: %s' % remaining) + s = remaining[1:i] + remaining = remaining[i + 1:].lstrip() + extras = [] + while s: + m = IDENTIFIER.match(s) + if not m: + raise SyntaxError('malformed extra: %s' % s) + extras.append(m.groups()[0]) + s = s[m.end():] + if not s: + break + if s[0] != ',': + raise SyntaxError('comma expected in extras: %s' % s) + s = s[1:].lstrip() + if not extras: + extras = None + if remaining: + if remaining[0] == '@': + # it's a URI + remaining = remaining[1:].lstrip() + m = NON_SPACE.match(remaining) + if not m: + raise SyntaxError('invalid URI: %s' % remaining) + uri = m.groups()[0] + t = urlparse(uri) + # there are issues with Python and URL parsing, so this test + # is a bit crude. See bpo-20271, bpo-23505. Python doesn't + # always parse invalid URLs correctly - it should raise + # exceptions for malformed URLs + if not (t.scheme and t.netloc): + raise SyntaxError('Invalid URL: %s' % uri) + remaining = remaining[m.end():].lstrip() + else: + + def get_versions(ver_remaining): + """ + Return a list of operator, version tuples if any are + specified, else None. + """ + m = COMPARE_OP.match(ver_remaining) + versions = None + if m: + versions = [] + while True: + op = m.groups()[0] + ver_remaining = ver_remaining[m.end():] + m = VERSION_IDENTIFIER.match(ver_remaining) + if not m: + raise SyntaxError('invalid version: %s' % ver_remaining) + v = m.groups()[0] + versions.append((op, v)) + ver_remaining = ver_remaining[m.end():] + if not ver_remaining or ver_remaining[0] != ',': + break + ver_remaining = ver_remaining[1:].lstrip() + m = COMPARE_OP.match(ver_remaining) + if not m: + raise SyntaxError('invalid constraint: %s' % ver_remaining) + if not versions: + versions = None + return versions, ver_remaining + + if remaining[0] != '(': + versions, remaining = get_versions(remaining) + else: + i = remaining.find(')', 1) + if i < 0: + raise SyntaxError('unterminated parenthesis: %s' % remaining) + s = remaining[1:i] + remaining = remaining[i + 1:].lstrip() + # As a special diversion from PEP 508, allow a version number + # a.b.c in parentheses as a synonym for ~= a.b.c (because this + # is allowed in earlier PEPs) + if COMPARE_OP.match(s): + versions, _ = get_versions(s) + else: + m = VERSION_IDENTIFIER.match(s) + if not m: + raise SyntaxError('invalid constraint: %s' % s) + v = m.groups()[0] + s = s[m.end():].lstrip() + if s: + raise SyntaxError('invalid constraint: %s' % s) + versions = [('~=', v)] + + if remaining: + if remaining[0] != ';': + raise SyntaxError('invalid requirement: %s' % remaining) + remaining = remaining[1:].lstrip() + + mark_expr, remaining = parse_marker(remaining) + + if remaining and remaining[0] != '#': + raise SyntaxError('unexpected trailing data: %s' % remaining) + + if not versions: + rs = distname + else: + rs = '%s %s' % (distname, ', '.join(['%s %s' % con for con in versions])) + return Container(name=distname, extras=extras, constraints=versions, + marker=mark_expr, url=uri, requirement=rs) + + +def get_resources_dests(resources_root, rules): + """Find destinations for resources files""" + + def get_rel_path(root, path): + # normalizes and returns a lstripped-/-separated path + root = root.replace(os.path.sep, '/') + path = path.replace(os.path.sep, '/') + assert path.startswith(root) + return path[len(root):].lstrip('/') + + destinations = {} + for base, suffix, dest in rules: + prefix = os.path.join(resources_root, base) + for abs_base in iglob(prefix): + abs_glob = os.path.join(abs_base, suffix) + for abs_path in iglob(abs_glob): + resource_file = get_rel_path(resources_root, abs_path) + if dest is None: # remove the entry if it was here + destinations.pop(resource_file, None) + else: + rel_path = get_rel_path(abs_base, abs_path) + rel_dest = dest.replace(os.path.sep, '/').rstrip('/') + destinations[resource_file] = rel_dest + '/' + rel_path + return destinations + + +def in_venv(): + if hasattr(sys, 'real_prefix'): + # virtualenv venvs + result = True + else: + # PEP 405 venvs + result = sys.prefix != getattr(sys, 'base_prefix', sys.prefix) + return result + + +def get_executable(): +# The __PYVENV_LAUNCHER__ dance is apparently no longer needed, as +# changes to the stub launcher mean that sys.executable always points +# to the stub on OS X +# if sys.platform == 'darwin' and ('__PYVENV_LAUNCHER__' +# in os.environ): +# result = os.environ['__PYVENV_LAUNCHER__'] +# else: +# result = sys.executable +# return result + result = os.path.normcase(sys.executable) + if not isinstance(result, text_type): + result = fsdecode(result) + return result + + +def proceed(prompt, allowed_chars, error_prompt=None, default=None): + p = prompt + while True: + s = raw_input(p) + p = prompt + if not s and default: + s = default + if s: + c = s[0].lower() + if c in allowed_chars: + break + if error_prompt: + p = '%c: %s\n%s' % (c, error_prompt, prompt) + return c + + +def extract_by_key(d, keys): + if isinstance(keys, string_types): + keys = keys.split() + result = {} + for key in keys: + if key in d: + result[key] = d[key] + return result + +def read_exports(stream): + if sys.version_info[0] >= 3: + # needs to be a text stream + stream = codecs.getreader('utf-8')(stream) + # Try to load as JSON, falling back on legacy format + data = stream.read() + stream = StringIO(data) + try: + jdata = json.load(stream) + result = jdata['extensions']['python.exports']['exports'] + for group, entries in result.items(): + for k, v in entries.items(): + s = '%s = %s' % (k, v) + entry = get_export_entry(s) + assert entry is not None + entries[k] = entry + return result + except Exception: + stream.seek(0, 0) + + def read_stream(cp, stream): + if hasattr(cp, 'read_file'): + cp.read_file(stream) + else: + cp.readfp(stream) + + cp = configparser.ConfigParser() + try: + read_stream(cp, stream) + except configparser.MissingSectionHeaderError: + stream.close() + data = textwrap.dedent(data) + stream = StringIO(data) + read_stream(cp, stream) + + result = {} + for key in cp.sections(): + result[key] = entries = {} + for name, value in cp.items(key): + s = '%s = %s' % (name, value) + entry = get_export_entry(s) + assert entry is not None + #entry.dist = self + entries[name] = entry + return result + + +def write_exports(exports, stream): + if sys.version_info[0] >= 3: + # needs to be a text stream + stream = codecs.getwriter('utf-8')(stream) + cp = configparser.ConfigParser() + for k, v in exports.items(): + # TODO check k, v for valid values + cp.add_section(k) + for entry in v.values(): + if entry.suffix is None: + s = entry.prefix + else: + s = '%s:%s' % (entry.prefix, entry.suffix) + if entry.flags: + s = '%s [%s]' % (s, ', '.join(entry.flags)) + cp.set(k, entry.name, s) + cp.write(stream) + + +@contextlib.contextmanager +def tempdir(): + td = tempfile.mkdtemp() + try: + yield td + finally: + shutil.rmtree(td) + +@contextlib.contextmanager +def chdir(d): + cwd = os.getcwd() + try: + os.chdir(d) + yield + finally: + os.chdir(cwd) + + +@contextlib.contextmanager +def socket_timeout(seconds=15): + cto = socket.getdefaulttimeout() + try: + socket.setdefaulttimeout(seconds) + yield + finally: + socket.setdefaulttimeout(cto) + + +class cached_property(object): + def __init__(self, func): + self.func = func + #for attr in ('__name__', '__module__', '__doc__'): + # setattr(self, attr, getattr(func, attr, None)) + + def __get__(self, obj, cls=None): + if obj is None: + return self + value = self.func(obj) + object.__setattr__(obj, self.func.__name__, value) + #obj.__dict__[self.func.__name__] = value = self.func(obj) + return value + +def convert_path(pathname): + """Return 'pathname' as a name that will work on the native filesystem. + + The path is split on '/' and put back together again using the current + directory separator. Needed because filenames in the setup script are + always supplied in Unix style, and have to be converted to the local + convention before we can actually use them in the filesystem. Raises + ValueError on non-Unix-ish systems if 'pathname' either starts or + ends with a slash. + """ + if os.sep == '/': + return pathname + if not pathname: + return pathname + if pathname[0] == '/': + raise ValueError("path '%s' cannot be absolute" % pathname) + if pathname[-1] == '/': + raise ValueError("path '%s' cannot end with '/'" % pathname) + + paths = pathname.split('/') + while os.curdir in paths: + paths.remove(os.curdir) + if not paths: + return os.curdir + return os.path.join(*paths) + + +class FileOperator(object): + def __init__(self, dry_run=False): + self.dry_run = dry_run + self.ensured = set() + self._init_record() + + def _init_record(self): + self.record = False + self.files_written = set() + self.dirs_created = set() + + def record_as_written(self, path): + if self.record: + self.files_written.add(path) + + def newer(self, source, target): + """Tell if the target is newer than the source. + + Returns true if 'source' exists and is more recently modified than + 'target', or if 'source' exists and 'target' doesn't. + + Returns false if both exist and 'target' is the same age or younger + than 'source'. Raise PackagingFileError if 'source' does not exist. + + Note that this test is not very accurate: files created in the same + second will have the same "age". + """ + if not os.path.exists(source): + raise DistlibException("file '%r' does not exist" % + os.path.abspath(source)) + if not os.path.exists(target): + return True + + return os.stat(source).st_mtime > os.stat(target).st_mtime + + def copy_file(self, infile, outfile, check=True): + """Copy a file respecting dry-run and force flags. + """ + self.ensure_dir(os.path.dirname(outfile)) + logger.info('Copying %s to %s', infile, outfile) + if not self.dry_run: + msg = None + if check: + if os.path.islink(outfile): + msg = '%s is a symlink' % outfile + elif os.path.exists(outfile) and not os.path.isfile(outfile): + msg = '%s is a non-regular file' % outfile + if msg: + raise ValueError(msg + ' which would be overwritten') + shutil.copyfile(infile, outfile) + self.record_as_written(outfile) + + def copy_stream(self, instream, outfile, encoding=None): + assert not os.path.isdir(outfile) + self.ensure_dir(os.path.dirname(outfile)) + logger.info('Copying stream %s to %s', instream, outfile) + if not self.dry_run: + if encoding is None: + outstream = open(outfile, 'wb') + else: + outstream = codecs.open(outfile, 'w', encoding=encoding) + try: + shutil.copyfileobj(instream, outstream) + finally: + outstream.close() + self.record_as_written(outfile) + + def write_binary_file(self, path, data): + self.ensure_dir(os.path.dirname(path)) + if not self.dry_run: + if os.path.exists(path): + os.remove(path) + with open(path, 'wb') as f: + f.write(data) + self.record_as_written(path) + + def write_text_file(self, path, data, encoding): + self.write_binary_file(path, data.encode(encoding)) + + def set_mode(self, bits, mask, files): + if os.name == 'posix' or (os.name == 'java' and os._name == 'posix'): + # Set the executable bits (owner, group, and world) on + # all the files specified. + for f in files: + if self.dry_run: + logger.info("changing mode of %s", f) + else: + mode = (os.stat(f).st_mode | bits) & mask + logger.info("changing mode of %s to %o", f, mode) + os.chmod(f, mode) + + set_executable_mode = lambda s, f: s.set_mode(0o555, 0o7777, f) + + def ensure_dir(self, path): + path = os.path.abspath(path) + if path not in self.ensured and not os.path.exists(path): + self.ensured.add(path) + d, f = os.path.split(path) + self.ensure_dir(d) + logger.info('Creating %s' % path) + if not self.dry_run: + os.mkdir(path) + if self.record: + self.dirs_created.add(path) + + def byte_compile(self, path, optimize=False, force=False, prefix=None, hashed_invalidation=False): + dpath = cache_from_source(path, not optimize) + logger.info('Byte-compiling %s to %s', path, dpath) + if not self.dry_run: + if force or self.newer(path, dpath): + if not prefix: + diagpath = None + else: + assert path.startswith(prefix) + diagpath = path[len(prefix):] + compile_kwargs = {} + if hashed_invalidation and hasattr(py_compile, 'PycInvalidationMode'): + compile_kwargs['invalidation_mode'] = py_compile.PycInvalidationMode.CHECKED_HASH + py_compile.compile(path, dpath, diagpath, True, **compile_kwargs) # raise error + self.record_as_written(dpath) + return dpath + + def ensure_removed(self, path): + if os.path.exists(path): + if os.path.isdir(path) and not os.path.islink(path): + logger.debug('Removing directory tree at %s', path) + if not self.dry_run: + shutil.rmtree(path) + if self.record: + if path in self.dirs_created: + self.dirs_created.remove(path) + else: + if os.path.islink(path): + s = 'link' + else: + s = 'file' + logger.debug('Removing %s %s', s, path) + if not self.dry_run: + os.remove(path) + if self.record: + if path in self.files_written: + self.files_written.remove(path) + + def is_writable(self, path): + result = False + while not result: + if os.path.exists(path): + result = os.access(path, os.W_OK) + break + parent = os.path.dirname(path) + if parent == path: + break + path = parent + return result + + def commit(self): + """ + Commit recorded changes, turn off recording, return + changes. + """ + assert self.record + result = self.files_written, self.dirs_created + self._init_record() + return result + + def rollback(self): + if not self.dry_run: + for f in list(self.files_written): + if os.path.exists(f): + os.remove(f) + # dirs should all be empty now, except perhaps for + # __pycache__ subdirs + # reverse so that subdirs appear before their parents + dirs = sorted(self.dirs_created, reverse=True) + for d in dirs: + flist = os.listdir(d) + if flist: + assert flist == ['__pycache__'] + sd = os.path.join(d, flist[0]) + os.rmdir(sd) + os.rmdir(d) # should fail if non-empty + self._init_record() + +def resolve(module_name, dotted_path): + if module_name in sys.modules: + mod = sys.modules[module_name] + else: + mod = __import__(module_name) + if dotted_path is None: + result = mod + else: + parts = dotted_path.split('.') + result = getattr(mod, parts.pop(0)) + for p in parts: + result = getattr(result, p) + return result + + +class ExportEntry(object): + def __init__(self, name, prefix, suffix, flags): + self.name = name + self.prefix = prefix + self.suffix = suffix + self.flags = flags + + @cached_property + def value(self): + return resolve(self.prefix, self.suffix) + + def __repr__(self): # pragma: no cover + return '' % (self.name, self.prefix, + self.suffix, self.flags) + + def __eq__(self, other): + if not isinstance(other, ExportEntry): + result = False + else: + result = (self.name == other.name and + self.prefix == other.prefix and + self.suffix == other.suffix and + self.flags == other.flags) + return result + + __hash__ = object.__hash__ + + +ENTRY_RE = re.compile(r'''(?P(\w|[-.+])+) + \s*=\s*(?P(\w+)([:\.]\w+)*) + \s*(\[\s*(?P[\w-]+(=\w+)?(,\s*\w+(=\w+)?)*)\s*\])? + ''', re.VERBOSE) + +def get_export_entry(specification): + m = ENTRY_RE.search(specification) + if not m: + result = None + if '[' in specification or ']' in specification: + raise DistlibException("Invalid specification " + "'%s'" % specification) + else: + d = m.groupdict() + name = d['name'] + path = d['callable'] + colons = path.count(':') + if colons == 0: + prefix, suffix = path, None + else: + if colons != 1: + raise DistlibException("Invalid specification " + "'%s'" % specification) + prefix, suffix = path.split(':') + flags = d['flags'] + if flags is None: + if '[' in specification or ']' in specification: + raise DistlibException("Invalid specification " + "'%s'" % specification) + flags = [] + else: + flags = [f.strip() for f in flags.split(',')] + result = ExportEntry(name, prefix, suffix, flags) + return result + + +def get_cache_base(suffix=None): + """ + Return the default base location for distlib caches. If the directory does + not exist, it is created. Use the suffix provided for the base directory, + and default to '.distlib' if it isn't provided. + + On Windows, if LOCALAPPDATA is defined in the environment, then it is + assumed to be a directory, and will be the parent directory of the result. + On POSIX, and on Windows if LOCALAPPDATA is not defined, the user's home + directory - using os.expanduser('~') - will be the parent directory of + the result. + + The result is just the directory '.distlib' in the parent directory as + determined above, or with the name specified with ``suffix``. + """ + if suffix is None: + suffix = '.distlib' + if os.name == 'nt' and 'LOCALAPPDATA' in os.environ: + result = os.path.expandvars('$localappdata') + else: + # Assume posix, or old Windows + result = os.path.expanduser('~') + # we use 'isdir' instead of 'exists', because we want to + # fail if there's a file with that name + if os.path.isdir(result): + usable = os.access(result, os.W_OK) + if not usable: + logger.warning('Directory exists but is not writable: %s', result) + else: + try: + os.makedirs(result) + usable = True + except OSError: + logger.warning('Unable to create %s', result, exc_info=True) + usable = False + if not usable: + result = tempfile.mkdtemp() + logger.warning('Default location unusable, using %s', result) + return os.path.join(result, suffix) + + +def path_to_cache_dir(path): + """ + Convert an absolute path to a directory name for use in a cache. + + The algorithm used is: + + #. On Windows, any ``':'`` in the drive is replaced with ``'---'``. + #. Any occurrence of ``os.sep`` is replaced with ``'--'``. + #. ``'.cache'`` is appended. + """ + d, p = os.path.splitdrive(os.path.abspath(path)) + if d: + d = d.replace(':', '---') + p = p.replace(os.sep, '--') + return d + p + '.cache' + + +def ensure_slash(s): + if not s.endswith('/'): + return s + '/' + return s + + +def parse_credentials(netloc): + username = password = None + if '@' in netloc: + prefix, netloc = netloc.rsplit('@', 1) + if ':' not in prefix: + username = prefix + else: + username, password = prefix.split(':', 1) + if username: + username = unquote(username) + if password: + password = unquote(password) + return username, password, netloc + + +def get_process_umask(): + result = os.umask(0o22) + os.umask(result) + return result + +def is_string_sequence(seq): + result = True + i = None + for i, s in enumerate(seq): + if not isinstance(s, string_types): + result = False + break + assert i is not None + return result + +PROJECT_NAME_AND_VERSION = re.compile('([a-z0-9_]+([.-][a-z_][a-z0-9_]*)*)-' + '([a-z0-9_.+-]+)', re.I) +PYTHON_VERSION = re.compile(r'-py(\d\.?\d?)') + + +def split_filename(filename, project_name=None): + """ + Extract name, version, python version from a filename (no extension) + + Return name, version, pyver or None + """ + result = None + pyver = None + filename = unquote(filename).replace(' ', '-') + m = PYTHON_VERSION.search(filename) + if m: + pyver = m.group(1) + filename = filename[:m.start()] + if project_name and len(filename) > len(project_name) + 1: + m = re.match(re.escape(project_name) + r'\b', filename) + if m: + n = m.end() + result = filename[:n], filename[n + 1:], pyver + if result is None: + m = PROJECT_NAME_AND_VERSION.match(filename) + if m: + result = m.group(1), m.group(3), pyver + return result + +# Allow spaces in name because of legacy dists like "Twisted Core" +NAME_VERSION_RE = re.compile(r'(?P[\w .-]+)\s*' + r'\(\s*(?P[^\s)]+)\)$') + +def parse_name_and_version(p): + """ + A utility method used to get name and version from a string. + + From e.g. a Provides-Dist value. + + :param p: A value in a form 'foo (1.0)' + :return: The name and version as a tuple. + """ + m = NAME_VERSION_RE.match(p) + if not m: + raise DistlibException('Ill-formed name/version string: \'%s\'' % p) + d = m.groupdict() + return d['name'].strip().lower(), d['ver'] + +def get_extras(requested, available): + result = set() + requested = set(requested or []) + available = set(available or []) + if '*' in requested: + requested.remove('*') + result |= available + for r in requested: + if r == '-': + result.add(r) + elif r.startswith('-'): + unwanted = r[1:] + if unwanted not in available: + logger.warning('undeclared extra: %s' % unwanted) + if unwanted in result: + result.remove(unwanted) + else: + if r not in available: + logger.warning('undeclared extra: %s' % r) + result.add(r) + return result +# +# Extended metadata functionality +# + +def _get_external_data(url): + result = {} + try: + # urlopen might fail if it runs into redirections, + # because of Python issue #13696. Fixed in locators + # using a custom redirect handler. + resp = urlopen(url) + headers = resp.info() + ct = headers.get('Content-Type') + if not ct.startswith('application/json'): + logger.debug('Unexpected response for JSON request: %s', ct) + else: + reader = codecs.getreader('utf-8')(resp) + #data = reader.read().decode('utf-8') + #result = json.loads(data) + result = json.load(reader) + except Exception as e: + logger.exception('Failed to get external data for %s: %s', url, e) + return result + +_external_data_base_url = 'https://www.red-dove.com/pypi/projects/' + +def get_project_data(name): + url = '%s/%s/project.json' % (name[0].upper(), name) + url = urljoin(_external_data_base_url, url) + result = _get_external_data(url) + return result + +def get_package_data(name, version): + url = '%s/%s/package-%s.json' % (name[0].upper(), name, version) + url = urljoin(_external_data_base_url, url) + return _get_external_data(url) + + +class Cache(object): + """ + A class implementing a cache for resources that need to live in the file system + e.g. shared libraries. This class was moved from resources to here because it + could be used by other modules, e.g. the wheel module. + """ + + def __init__(self, base): + """ + Initialise an instance. + + :param base: The base directory where the cache should be located. + """ + # we use 'isdir' instead of 'exists', because we want to + # fail if there's a file with that name + if not os.path.isdir(base): # pragma: no cover + os.makedirs(base) + if (os.stat(base).st_mode & 0o77) != 0: + logger.warning('Directory \'%s\' is not private', base) + self.base = os.path.abspath(os.path.normpath(base)) + + def prefix_to_dir(self, prefix): + """ + Converts a resource prefix to a directory name in the cache. + """ + return path_to_cache_dir(prefix) + + def clear(self): + """ + Clear the cache. + """ + not_removed = [] + for fn in os.listdir(self.base): + fn = os.path.join(self.base, fn) + try: + if os.path.islink(fn) or os.path.isfile(fn): + os.remove(fn) + elif os.path.isdir(fn): + shutil.rmtree(fn) + except Exception: + not_removed.append(fn) + return not_removed + + +class EventMixin(object): + """ + A very simple publish/subscribe system. + """ + def __init__(self): + self._subscribers = {} + + def add(self, event, subscriber, append=True): + """ + Add a subscriber for an event. + + :param event: The name of an event. + :param subscriber: The subscriber to be added (and called when the + event is published). + :param append: Whether to append or prepend the subscriber to an + existing subscriber list for the event. + """ + subs = self._subscribers + if event not in subs: + subs[event] = deque([subscriber]) + else: + sq = subs[event] + if append: + sq.append(subscriber) + else: + sq.appendleft(subscriber) + + def remove(self, event, subscriber): + """ + Remove a subscriber for an event. + + :param event: The name of an event. + :param subscriber: The subscriber to be removed. + """ + subs = self._subscribers + if event not in subs: + raise ValueError('No subscribers: %r' % event) + subs[event].remove(subscriber) + + def get_subscribers(self, event): + """ + Return an iterator for the subscribers for an event. + :param event: The event to return subscribers for. + """ + return iter(self._subscribers.get(event, ())) + + def publish(self, event, *args, **kwargs): + """ + Publish a event and return a list of values returned by its + subscribers. + + :param event: The event to publish. + :param args: The positional arguments to pass to the event's + subscribers. + :param kwargs: The keyword arguments to pass to the event's + subscribers. + """ + result = [] + for subscriber in self.get_subscribers(event): + try: + value = subscriber(event, *args, **kwargs) + except Exception: + logger.exception('Exception during event publication') + value = None + result.append(value) + logger.debug('publish %s: args = %s, kwargs = %s, result = %s', + event, args, kwargs, result) + return result + +# +# Simple sequencing +# +class Sequencer(object): + def __init__(self): + self._preds = {} + self._succs = {} + self._nodes = set() # nodes with no preds/succs + + def add_node(self, node): + self._nodes.add(node) + + def remove_node(self, node, edges=False): + if node in self._nodes: + self._nodes.remove(node) + if edges: + for p in set(self._preds.get(node, ())): + self.remove(p, node) + for s in set(self._succs.get(node, ())): + self.remove(node, s) + # Remove empties + for k, v in list(self._preds.items()): + if not v: + del self._preds[k] + for k, v in list(self._succs.items()): + if not v: + del self._succs[k] + + def add(self, pred, succ): + assert pred != succ + self._preds.setdefault(succ, set()).add(pred) + self._succs.setdefault(pred, set()).add(succ) + + def remove(self, pred, succ): + assert pred != succ + try: + preds = self._preds[succ] + succs = self._succs[pred] + except KeyError: # pragma: no cover + raise ValueError('%r not a successor of anything' % succ) + try: + preds.remove(pred) + succs.remove(succ) + except KeyError: # pragma: no cover + raise ValueError('%r not a successor of %r' % (succ, pred)) + + def is_step(self, step): + return (step in self._preds or step in self._succs or + step in self._nodes) + + def get_steps(self, final): + if not self.is_step(final): + raise ValueError('Unknown: %r' % final) + result = [] + todo = [] + seen = set() + todo.append(final) + while todo: + step = todo.pop(0) + if step in seen: + # if a step was already seen, + # move it to the end (so it will appear earlier + # when reversed on return) ... but not for the + # final step, as that would be confusing for + # users + if step != final: + result.remove(step) + result.append(step) + else: + seen.add(step) + result.append(step) + preds = self._preds.get(step, ()) + todo.extend(preds) + return reversed(result) + + @property + def strong_connections(self): + #http://en.wikipedia.org/wiki/Tarjan%27s_strongly_connected_components_algorithm + index_counter = [0] + stack = [] + lowlinks = {} + index = {} + result = [] + + graph = self._succs + + def strongconnect(node): + # set the depth index for this node to the smallest unused index + index[node] = index_counter[0] + lowlinks[node] = index_counter[0] + index_counter[0] += 1 + stack.append(node) + + # Consider successors + try: + successors = graph[node] + except Exception: + successors = [] + for successor in successors: + if successor not in lowlinks: + # Successor has not yet been visited + strongconnect(successor) + lowlinks[node] = min(lowlinks[node],lowlinks[successor]) + elif successor in stack: + # the successor is in the stack and hence in the current + # strongly connected component (SCC) + lowlinks[node] = min(lowlinks[node],index[successor]) + + # If `node` is a root node, pop the stack and generate an SCC + if lowlinks[node] == index[node]: + connected_component = [] + + while True: + successor = stack.pop() + connected_component.append(successor) + if successor == node: break + component = tuple(connected_component) + # storing the result + result.append(component) + + for node in graph: + if node not in lowlinks: + strongconnect(node) + + return result + + @property + def dot(self): + result = ['digraph G {'] + for succ in self._preds: + preds = self._preds[succ] + for pred in preds: + result.append(' %s -> %s;' % (pred, succ)) + for node in self._nodes: + result.append(' %s;' % node) + result.append('}') + return '\n'.join(result) + +# +# Unarchiving functionality for zip, tar, tgz, tbz, whl +# + +ARCHIVE_EXTENSIONS = ('.tar.gz', '.tar.bz2', '.tar', '.zip', + '.tgz', '.tbz', '.whl') + +def unarchive(archive_filename, dest_dir, format=None, check=True): + + def check_path(path): + if not isinstance(path, text_type): + path = path.decode('utf-8') + p = os.path.abspath(os.path.join(dest_dir, path)) + if not p.startswith(dest_dir) or p[plen] != os.sep: + raise ValueError('path outside destination: %r' % p) + + dest_dir = os.path.abspath(dest_dir) + plen = len(dest_dir) + archive = None + if format is None: + if archive_filename.endswith(('.zip', '.whl')): + format = 'zip' + elif archive_filename.endswith(('.tar.gz', '.tgz')): + format = 'tgz' + mode = 'r:gz' + elif archive_filename.endswith(('.tar.bz2', '.tbz')): + format = 'tbz' + mode = 'r:bz2' + elif archive_filename.endswith('.tar'): + format = 'tar' + mode = 'r' + else: # pragma: no cover + raise ValueError('Unknown format for %r' % archive_filename) + try: + if format == 'zip': + archive = ZipFile(archive_filename, 'r') + if check: + names = archive.namelist() + for name in names: + check_path(name) + else: + archive = tarfile.open(archive_filename, mode) + if check: + names = archive.getnames() + for name in names: + check_path(name) + if format != 'zip' and sys.version_info[0] < 3: + # See Python issue 17153. If the dest path contains Unicode, + # tarfile extraction fails on Python 2.x if a member path name + # contains non-ASCII characters - it leads to an implicit + # bytes -> unicode conversion using ASCII to decode. + for tarinfo in archive.getmembers(): + if not isinstance(tarinfo.name, text_type): + tarinfo.name = tarinfo.name.decode('utf-8') + archive.extractall(dest_dir) + + finally: + if archive: + archive.close() + + +def zip_dir(directory): + """zip a directory tree into a BytesIO object""" + result = io.BytesIO() + dlen = len(directory) + with ZipFile(result, "w") as zf: + for root, dirs, files in os.walk(directory): + for name in files: + full = os.path.join(root, name) + rel = root[dlen:] + dest = os.path.join(rel, name) + zf.write(full, dest) + return result + +# +# Simple progress bar +# + +UNITS = ('', 'K', 'M', 'G','T','P') + + +class Progress(object): + unknown = 'UNKNOWN' + + def __init__(self, minval=0, maxval=100): + assert maxval is None or maxval >= minval + self.min = self.cur = minval + self.max = maxval + self.started = None + self.elapsed = 0 + self.done = False + + def update(self, curval): + assert self.min <= curval + assert self.max is None or curval <= self.max + self.cur = curval + now = time.time() + if self.started is None: + self.started = now + else: + self.elapsed = now - self.started + + def increment(self, incr): + assert incr >= 0 + self.update(self.cur + incr) + + def start(self): + self.update(self.min) + return self + + def stop(self): + if self.max is not None: + self.update(self.max) + self.done = True + + @property + def maximum(self): + return self.unknown if self.max is None else self.max + + @property + def percentage(self): + if self.done: + result = '100 %' + elif self.max is None: + result = ' ?? %' + else: + v = 100.0 * (self.cur - self.min) / (self.max - self.min) + result = '%3d %%' % v + return result + + def format_duration(self, duration): + if (duration <= 0) and self.max is None or self.cur == self.min: + result = '??:??:??' + #elif duration < 1: + # result = '--:--:--' + else: + result = time.strftime('%H:%M:%S', time.gmtime(duration)) + return result + + @property + def ETA(self): + if self.done: + prefix = 'Done' + t = self.elapsed + #import pdb; pdb.set_trace() + else: + prefix = 'ETA ' + if self.max is None: + t = -1 + elif self.elapsed == 0 or (self.cur == self.min): + t = 0 + else: + #import pdb; pdb.set_trace() + t = float(self.max - self.min) + t /= self.cur - self.min + t = (t - 1) * self.elapsed + return '%s: %s' % (prefix, self.format_duration(t)) + + @property + def speed(self): + if self.elapsed == 0: + result = 0.0 + else: + result = (self.cur - self.min) / self.elapsed + for unit in UNITS: + if result < 1000: + break + result /= 1000.0 + return '%d %sB/s' % (result, unit) + +# +# Glob functionality +# + +RICH_GLOB = re.compile(r'\{([^}]*)\}') +_CHECK_RECURSIVE_GLOB = re.compile(r'[^/\\,{]\*\*|\*\*[^/\\,}]') +_CHECK_MISMATCH_SET = re.compile(r'^[^{]*\}|\{[^}]*$') + + +def iglob(path_glob): + """Extended globbing function that supports ** and {opt1,opt2,opt3}.""" + if _CHECK_RECURSIVE_GLOB.search(path_glob): + msg = """invalid glob %r: recursive glob "**" must be used alone""" + raise ValueError(msg % path_glob) + if _CHECK_MISMATCH_SET.search(path_glob): + msg = """invalid glob %r: mismatching set marker '{' or '}'""" + raise ValueError(msg % path_glob) + return _iglob(path_glob) + + +def _iglob(path_glob): + rich_path_glob = RICH_GLOB.split(path_glob, 1) + if len(rich_path_glob) > 1: + assert len(rich_path_glob) == 3, rich_path_glob + prefix, set, suffix = rich_path_glob + for item in set.split(','): + for path in _iglob(''.join((prefix, item, suffix))): + yield path + else: + if '**' not in path_glob: + for item in std_iglob(path_glob): + yield item + else: + prefix, radical = path_glob.split('**', 1) + if prefix == '': + prefix = '.' + if radical == '': + radical = '*' + else: + # we support both + radical = radical.lstrip('/') + radical = radical.lstrip('\\') + for path, dir, files in os.walk(prefix): + path = os.path.normpath(path) + for fn in _iglob(os.path.join(path, radical)): + yield fn + +if ssl: + from .compat import (HTTPSHandler as BaseHTTPSHandler, match_hostname, + CertificateError) + + +# +# HTTPSConnection which verifies certificates/matches domains +# + + class HTTPSConnection(httplib.HTTPSConnection): + ca_certs = None # set this to the path to the certs file (.pem) + check_domain = True # only used if ca_certs is not None + + # noinspection PyPropertyAccess + def connect(self): + sock = socket.create_connection((self.host, self.port), self.timeout) + if getattr(self, '_tunnel_host', False): + self.sock = sock + self._tunnel() + + if not hasattr(ssl, 'SSLContext'): + # For 2.x + if self.ca_certs: + cert_reqs = ssl.CERT_REQUIRED + else: + cert_reqs = ssl.CERT_NONE + self.sock = ssl.wrap_socket(sock, self.key_file, self.cert_file, + cert_reqs=cert_reqs, + ssl_version=ssl.PROTOCOL_SSLv23, + ca_certs=self.ca_certs) + else: # pragma: no cover + context = ssl.SSLContext(ssl.PROTOCOL_SSLv23) + if hasattr(ssl, 'OP_NO_SSLv2'): + context.options |= ssl.OP_NO_SSLv2 + if self.cert_file: + context.load_cert_chain(self.cert_file, self.key_file) + kwargs = {} + if self.ca_certs: + context.verify_mode = ssl.CERT_REQUIRED + context.load_verify_locations(cafile=self.ca_certs) + if getattr(ssl, 'HAS_SNI', False): + kwargs['server_hostname'] = self.host + self.sock = context.wrap_socket(sock, **kwargs) + if self.ca_certs and self.check_domain: + try: + match_hostname(self.sock.getpeercert(), self.host) + logger.debug('Host verified: %s', self.host) + except CertificateError: # pragma: no cover + self.sock.shutdown(socket.SHUT_RDWR) + self.sock.close() + raise + + class HTTPSHandler(BaseHTTPSHandler): + def __init__(self, ca_certs, check_domain=True): + BaseHTTPSHandler.__init__(self) + self.ca_certs = ca_certs + self.check_domain = check_domain + + def _conn_maker(self, *args, **kwargs): + """ + This is called to create a connection instance. Normally you'd + pass a connection class to do_open, but it doesn't actually check for + a class, and just expects a callable. As long as we behave just as a + constructor would have, we should be OK. If it ever changes so that + we *must* pass a class, we'll create an UnsafeHTTPSConnection class + which just sets check_domain to False in the class definition, and + choose which one to pass to do_open. + """ + result = HTTPSConnection(*args, **kwargs) + if self.ca_certs: + result.ca_certs = self.ca_certs + result.check_domain = self.check_domain + return result + + def https_open(self, req): + try: + return self.do_open(self._conn_maker, req) + except URLError as e: + if 'certificate verify failed' in str(e.reason): + raise CertificateError('Unable to verify server certificate ' + 'for %s' % req.host) + else: + raise + + # + # To prevent against mixing HTTP traffic with HTTPS (examples: A Man-In-The- + # Middle proxy using HTTP listens on port 443, or an index mistakenly serves + # HTML containing a http://xyz link when it should be https://xyz), + # you can use the following handler class, which does not allow HTTP traffic. + # + # It works by inheriting from HTTPHandler - so build_opener won't add a + # handler for HTTP itself. + # + class HTTPSOnlyHandler(HTTPSHandler, HTTPHandler): + def http_open(self, req): + raise URLError('Unexpected HTTP request on what should be a secure ' + 'connection: %s' % req) + +# +# XML-RPC with timeouts +# + +_ver_info = sys.version_info[:2] + +if _ver_info == (2, 6): + class HTTP(httplib.HTTP): + def __init__(self, host='', port=None, **kwargs): + if port == 0: # 0 means use port 0, not the default port + port = None + self._setup(self._connection_class(host, port, **kwargs)) + + + if ssl: + class HTTPS(httplib.HTTPS): + def __init__(self, host='', port=None, **kwargs): + if port == 0: # 0 means use port 0, not the default port + port = None + self._setup(self._connection_class(host, port, **kwargs)) + + +class Transport(xmlrpclib.Transport): + def __init__(self, timeout, use_datetime=0): + self.timeout = timeout + xmlrpclib.Transport.__init__(self, use_datetime) + + def make_connection(self, host): + h, eh, x509 = self.get_host_info(host) + if _ver_info == (2, 6): + result = HTTP(h, timeout=self.timeout) + else: + if not self._connection or host != self._connection[0]: + self._extra_headers = eh + self._connection = host, httplib.HTTPConnection(h) + result = self._connection[1] + return result + +if ssl: + class SafeTransport(xmlrpclib.SafeTransport): + def __init__(self, timeout, use_datetime=0): + self.timeout = timeout + xmlrpclib.SafeTransport.__init__(self, use_datetime) + + def make_connection(self, host): + h, eh, kwargs = self.get_host_info(host) + if not kwargs: + kwargs = {} + kwargs['timeout'] = self.timeout + if _ver_info == (2, 6): + result = HTTPS(host, None, **kwargs) + else: + if not self._connection or host != self._connection[0]: + self._extra_headers = eh + self._connection = host, httplib.HTTPSConnection(h, None, + **kwargs) + result = self._connection[1] + return result + + +class ServerProxy(xmlrpclib.ServerProxy): + def __init__(self, uri, **kwargs): + self.timeout = timeout = kwargs.pop('timeout', None) + # The above classes only come into play if a timeout + # is specified + if timeout is not None: + scheme, _ = splittype(uri) + use_datetime = kwargs.get('use_datetime', 0) + if scheme == 'https': + tcls = SafeTransport + else: + tcls = Transport + kwargs['transport'] = t = tcls(timeout, use_datetime=use_datetime) + self.transport = t + xmlrpclib.ServerProxy.__init__(self, uri, **kwargs) + +# +# CSV functionality. This is provided because on 2.x, the csv module can't +# handle Unicode. However, we need to deal with Unicode in e.g. RECORD files. +# + +def _csv_open(fn, mode, **kwargs): + if sys.version_info[0] < 3: + mode += 'b' + else: + kwargs['newline'] = '' + # Python 3 determines encoding from locale. Force 'utf-8' + # file encoding to match other forced utf-8 encoding + kwargs['encoding'] = 'utf-8' + return open(fn, mode, **kwargs) + + +class CSVBase(object): + defaults = { + 'delimiter': str(','), # The strs are used because we need native + 'quotechar': str('"'), # str in the csv API (2.x won't take + 'lineterminator': str('\n') # Unicode) + } + + def __enter__(self): + return self + + def __exit__(self, *exc_info): + self.stream.close() + + +class CSVReader(CSVBase): + def __init__(self, **kwargs): + if 'stream' in kwargs: + stream = kwargs['stream'] + if sys.version_info[0] >= 3: + # needs to be a text stream + stream = codecs.getreader('utf-8')(stream) + self.stream = stream + else: + self.stream = _csv_open(kwargs['path'], 'r') + self.reader = csv.reader(self.stream, **self.defaults) + + def __iter__(self): + return self + + def next(self): + result = next(self.reader) + if sys.version_info[0] < 3: + for i, item in enumerate(result): + if not isinstance(item, text_type): + result[i] = item.decode('utf-8') + return result + + __next__ = next + +class CSVWriter(CSVBase): + def __init__(self, fn, **kwargs): + self.stream = _csv_open(fn, 'w') + self.writer = csv.writer(self.stream, **self.defaults) + + def writerow(self, row): + if sys.version_info[0] < 3: + r = [] + for item in row: + if isinstance(item, text_type): + item = item.encode('utf-8') + r.append(item) + row = r + self.writer.writerow(row) + +# +# Configurator functionality +# + +class Configurator(BaseConfigurator): + + value_converters = dict(BaseConfigurator.value_converters) + value_converters['inc'] = 'inc_convert' + + def __init__(self, config, base=None): + super(Configurator, self).__init__(config) + self.base = base or os.getcwd() + + def configure_custom(self, config): + def convert(o): + if isinstance(o, (list, tuple)): + result = type(o)([convert(i) for i in o]) + elif isinstance(o, dict): + if '()' in o: + result = self.configure_custom(o) + else: + result = {} + for k in o: + result[k] = convert(o[k]) + else: + result = self.convert(o) + return result + + c = config.pop('()') + if not callable(c): + c = self.resolve(c) + props = config.pop('.', None) + # Check for valid identifiers + args = config.pop('[]', ()) + if args: + args = tuple([convert(o) for o in args]) + items = [(k, convert(config[k])) for k in config if valid_ident(k)] + kwargs = dict(items) + result = c(*args, **kwargs) + if props: + for n, v in props.items(): + setattr(result, n, convert(v)) + return result + + def __getitem__(self, key): + result = self.config[key] + if isinstance(result, dict) and '()' in result: + self.config[key] = result = self.configure_custom(result) + return result + + def inc_convert(self, value): + """Default converter for the inc:// protocol.""" + if not os.path.isabs(value): + value = os.path.join(self.base, value) + with codecs.open(value, 'r', encoding='utf-8') as f: + result = json.load(f) + return result + + +class SubprocessMixin(object): + """ + Mixin for running subprocesses and capturing their output + """ + def __init__(self, verbose=False, progress=None): + self.verbose = verbose + self.progress = progress + + def reader(self, stream, context): + """ + Read lines from a subprocess' output stream and either pass to a progress + callable (if specified) or write progress information to sys.stderr. + """ + progress = self.progress + verbose = self.verbose + while True: + s = stream.readline() + if not s: + break + if progress is not None: + progress(s, context) + else: + if not verbose: + sys.stderr.write('.') + else: + sys.stderr.write(s.decode('utf-8')) + sys.stderr.flush() + stream.close() + + def run_command(self, cmd, **kwargs): + p = subprocess.Popen(cmd, stdout=subprocess.PIPE, + stderr=subprocess.PIPE, **kwargs) + t1 = threading.Thread(target=self.reader, args=(p.stdout, 'stdout')) + t1.start() + t2 = threading.Thread(target=self.reader, args=(p.stderr, 'stderr')) + t2.start() + p.wait() + t1.join() + t2.join() + if self.progress is not None: + self.progress('done.', 'main') + elif self.verbose: + sys.stderr.write('done.\n') + return p + + +def normalize_name(name): + """Normalize a python package name a la PEP 503""" + # https://www.python.org/dev/peps/pep-0503/#normalized-names + return re.sub('[-_.]+', '-', name).lower() diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/util.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/util.py new file mode 100644 index 0000000..01324ea --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/util.py @@ -0,0 +1,1761 @@ +# +# Copyright (C) 2012-2017 The Python Software Foundation. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +import codecs +from collections import deque +import contextlib +import csv +from glob import iglob as std_iglob +import io +import json +import logging +import os +import py_compile +import re +import socket +try: + import ssl +except ImportError: # pragma: no cover + ssl = None +import subprocess +import sys +import tarfile +import tempfile +import textwrap + +try: + import threading +except ImportError: # pragma: no cover + import dummy_threading as threading +import time + +from . import DistlibException +from .compat import (string_types, text_type, shutil, raw_input, StringIO, + cache_from_source, urlopen, urljoin, httplib, xmlrpclib, + splittype, HTTPHandler, BaseConfigurator, valid_ident, + Container, configparser, URLError, ZipFile, fsdecode, + unquote, urlparse) + +logger = logging.getLogger(__name__) + +# +# Requirement parsing code as per PEP 508 +# + +IDENTIFIER = re.compile(r'^([\w\.-]+)\s*') +VERSION_IDENTIFIER = re.compile(r'^([\w\.*+-]+)\s*') +COMPARE_OP = re.compile(r'^(<=?|>=?|={2,3}|[~!]=)\s*') +MARKER_OP = re.compile(r'^((<=?)|(>=?)|={2,3}|[~!]=|in|not\s+in)\s*') +OR = re.compile(r'^or\b\s*') +AND = re.compile(r'^and\b\s*') +NON_SPACE = re.compile(r'(\S+)\s*') +STRING_CHUNK = re.compile(r'([\s\w\.{}()*+#:;,/?!~`@$%^&=|<>\[\]-]+)') + + +def parse_marker(marker_string): + """ + Parse a marker string and return a dictionary containing a marker expression. + + The dictionary will contain keys "op", "lhs" and "rhs" for non-terminals in + the expression grammar, or strings. A string contained in quotes is to be + interpreted as a literal string, and a string not contained in quotes is a + variable (such as os_name). + """ + def marker_var(remaining): + # either identifier, or literal string + m = IDENTIFIER.match(remaining) + if m: + result = m.groups()[0] + remaining = remaining[m.end():] + elif not remaining: + raise SyntaxError('unexpected end of input') + else: + q = remaining[0] + if q not in '\'"': + raise SyntaxError('invalid expression: %s' % remaining) + oq = '\'"'.replace(q, '') + remaining = remaining[1:] + parts = [q] + while remaining: + # either a string chunk, or oq, or q to terminate + if remaining[0] == q: + break + elif remaining[0] == oq: + parts.append(oq) + remaining = remaining[1:] + else: + m = STRING_CHUNK.match(remaining) + if not m: + raise SyntaxError('error in string literal: %s' % remaining) + parts.append(m.groups()[0]) + remaining = remaining[m.end():] + else: + s = ''.join(parts) + raise SyntaxError('unterminated string: %s' % s) + parts.append(q) + result = ''.join(parts) + remaining = remaining[1:].lstrip() # skip past closing quote + return result, remaining + + def marker_expr(remaining): + if remaining and remaining[0] == '(': + result, remaining = marker(remaining[1:].lstrip()) + if remaining[0] != ')': + raise SyntaxError('unterminated parenthesis: %s' % remaining) + remaining = remaining[1:].lstrip() + else: + lhs, remaining = marker_var(remaining) + while remaining: + m = MARKER_OP.match(remaining) + if not m: + break + op = m.groups()[0] + remaining = remaining[m.end():] + rhs, remaining = marker_var(remaining) + lhs = {'op': op, 'lhs': lhs, 'rhs': rhs} + result = lhs + return result, remaining + + def marker_and(remaining): + lhs, remaining = marker_expr(remaining) + while remaining: + m = AND.match(remaining) + if not m: + break + remaining = remaining[m.end():] + rhs, remaining = marker_expr(remaining) + lhs = {'op': 'and', 'lhs': lhs, 'rhs': rhs} + return lhs, remaining + + def marker(remaining): + lhs, remaining = marker_and(remaining) + while remaining: + m = OR.match(remaining) + if not m: + break + remaining = remaining[m.end():] + rhs, remaining = marker_and(remaining) + lhs = {'op': 'or', 'lhs': lhs, 'rhs': rhs} + return lhs, remaining + + return marker(marker_string) + + +def parse_requirement(req): + """ + Parse a requirement passed in as a string. Return a Container + whose attributes contain the various parts of the requirement. + """ + remaining = req.strip() + if not remaining or remaining.startswith('#'): + return None + m = IDENTIFIER.match(remaining) + if not m: + raise SyntaxError('name expected: %s' % remaining) + distname = m.groups()[0] + remaining = remaining[m.end():] + extras = mark_expr = versions = uri = None + if remaining and remaining[0] == '[': + i = remaining.find(']', 1) + if i < 0: + raise SyntaxError('unterminated extra: %s' % remaining) + s = remaining[1:i] + remaining = remaining[i + 1:].lstrip() + extras = [] + while s: + m = IDENTIFIER.match(s) + if not m: + raise SyntaxError('malformed extra: %s' % s) + extras.append(m.groups()[0]) + s = s[m.end():] + if not s: + break + if s[0] != ',': + raise SyntaxError('comma expected in extras: %s' % s) + s = s[1:].lstrip() + if not extras: + extras = None + if remaining: + if remaining[0] == '@': + # it's a URI + remaining = remaining[1:].lstrip() + m = NON_SPACE.match(remaining) + if not m: + raise SyntaxError('invalid URI: %s' % remaining) + uri = m.groups()[0] + t = urlparse(uri) + # there are issues with Python and URL parsing, so this test + # is a bit crude. See bpo-20271, bpo-23505. Python doesn't + # always parse invalid URLs correctly - it should raise + # exceptions for malformed URLs + if not (t.scheme and t.netloc): + raise SyntaxError('Invalid URL: %s' % uri) + remaining = remaining[m.end():].lstrip() + else: + + def get_versions(ver_remaining): + """ + Return a list of operator, version tuples if any are + specified, else None. + """ + m = COMPARE_OP.match(ver_remaining) + versions = None + if m: + versions = [] + while True: + op = m.groups()[0] + ver_remaining = ver_remaining[m.end():] + m = VERSION_IDENTIFIER.match(ver_remaining) + if not m: + raise SyntaxError('invalid version: %s' % ver_remaining) + v = m.groups()[0] + versions.append((op, v)) + ver_remaining = ver_remaining[m.end():] + if not ver_remaining or ver_remaining[0] != ',': + break + ver_remaining = ver_remaining[1:].lstrip() + m = COMPARE_OP.match(ver_remaining) + if not m: + raise SyntaxError('invalid constraint: %s' % ver_remaining) + if not versions: + versions = None + return versions, ver_remaining + + if remaining[0] != '(': + versions, remaining = get_versions(remaining) + else: + i = remaining.find(')', 1) + if i < 0: + raise SyntaxError('unterminated parenthesis: %s' % remaining) + s = remaining[1:i] + remaining = remaining[i + 1:].lstrip() + # As a special diversion from PEP 508, allow a version number + # a.b.c in parentheses as a synonym for ~= a.b.c (because this + # is allowed in earlier PEPs) + if COMPARE_OP.match(s): + versions, _ = get_versions(s) + else: + m = VERSION_IDENTIFIER.match(s) + if not m: + raise SyntaxError('invalid constraint: %s' % s) + v = m.groups()[0] + s = s[m.end():].lstrip() + if s: + raise SyntaxError('invalid constraint: %s' % s) + versions = [('~=', v)] + + if remaining: + if remaining[0] != ';': + raise SyntaxError('invalid requirement: %s' % remaining) + remaining = remaining[1:].lstrip() + + mark_expr, remaining = parse_marker(remaining) + + if remaining and remaining[0] != '#': + raise SyntaxError('unexpected trailing data: %s' % remaining) + + if not versions: + rs = distname + else: + rs = '%s %s' % (distname, ', '.join(['%s %s' % con for con in versions])) + return Container(name=distname, extras=extras, constraints=versions, + marker=mark_expr, url=uri, requirement=rs) + + +def get_resources_dests(resources_root, rules): + """Find destinations for resources files""" + + def get_rel_path(root, path): + # normalizes and returns a lstripped-/-separated path + root = root.replace(os.path.sep, '/') + path = path.replace(os.path.sep, '/') + assert path.startswith(root) + return path[len(root):].lstrip('/') + + destinations = {} + for base, suffix, dest in rules: + prefix = os.path.join(resources_root, base) + for abs_base in iglob(prefix): + abs_glob = os.path.join(abs_base, suffix) + for abs_path in iglob(abs_glob): + resource_file = get_rel_path(resources_root, abs_path) + if dest is None: # remove the entry if it was here + destinations.pop(resource_file, None) + else: + rel_path = get_rel_path(abs_base, abs_path) + rel_dest = dest.replace(os.path.sep, '/').rstrip('/') + destinations[resource_file] = rel_dest + '/' + rel_path + return destinations + + +def in_venv(): + if hasattr(sys, 'real_prefix'): + # virtualenv venvs + result = True + else: + # PEP 405 venvs + result = sys.prefix != getattr(sys, 'base_prefix', sys.prefix) + return result + + +def get_executable(): +# The __PYVENV_LAUNCHER__ dance is apparently no longer needed, as +# changes to the stub launcher mean that sys.executable always points +# to the stub on OS X +# if sys.platform == 'darwin' and ('__PYVENV_LAUNCHER__' +# in os.environ): +# result = os.environ['__PYVENV_LAUNCHER__'] +# else: +# result = sys.executable +# return result + result = os.path.normcase(sys.executable) + if not isinstance(result, text_type): + result = fsdecode(result) + return result + + +def proceed(prompt, allowed_chars, error_prompt=None, default=None): + p = prompt + while True: + s = raw_input(p) + p = prompt + if not s and default: + s = default + if s: + c = s[0].lower() + if c in allowed_chars: + break + if error_prompt: + p = '%c: %s\n%s' % (c, error_prompt, prompt) + return c + + +def extract_by_key(d, keys): + if isinstance(keys, string_types): + keys = keys.split() + result = {} + for key in keys: + if key in d: + result[key] = d[key] + return result + +def read_exports(stream): + if sys.version_info[0] >= 3: + # needs to be a text stream + stream = codecs.getreader('utf-8')(stream) + # Try to load as JSON, falling back on legacy format + data = stream.read() + stream = StringIO(data) + try: + jdata = json.load(stream) + result = jdata['extensions']['python.exports']['exports'] + for group, entries in result.items(): + for k, v in entries.items(): + s = '%s = %s' % (k, v) + entry = get_export_entry(s) + assert entry is not None + entries[k] = entry + return result + except Exception: + stream.seek(0, 0) + + def read_stream(cp, stream): + if hasattr(cp, 'read_file'): + cp.read_file(stream) + else: + cp.readfp(stream) + + cp = configparser.ConfigParser() + try: + read_stream(cp, stream) + except configparser.MissingSectionHeaderError: + stream.close() + data = textwrap.dedent(data) + stream = StringIO(data) + read_stream(cp, stream) + + result = {} + for key in cp.sections(): + result[key] = entries = {} + for name, value in cp.items(key): + s = '%s = %s' % (name, value) + entry = get_export_entry(s) + assert entry is not None + #entry.dist = self + entries[name] = entry + return result + + +def write_exports(exports, stream): + if sys.version_info[0] >= 3: + # needs to be a text stream + stream = codecs.getwriter('utf-8')(stream) + cp = configparser.ConfigParser() + for k, v in exports.items(): + # TODO check k, v for valid values + cp.add_section(k) + for entry in v.values(): + if entry.suffix is None: + s = entry.prefix + else: + s = '%s:%s' % (entry.prefix, entry.suffix) + if entry.flags: + s = '%s [%s]' % (s, ', '.join(entry.flags)) + cp.set(k, entry.name, s) + cp.write(stream) + + +@contextlib.contextmanager +def tempdir(): + td = tempfile.mkdtemp() + try: + yield td + finally: + shutil.rmtree(td) + +@contextlib.contextmanager +def chdir(d): + cwd = os.getcwd() + try: + os.chdir(d) + yield + finally: + os.chdir(cwd) + + +@contextlib.contextmanager +def socket_timeout(seconds=15): + cto = socket.getdefaulttimeout() + try: + socket.setdefaulttimeout(seconds) + yield + finally: + socket.setdefaulttimeout(cto) + + +class cached_property(object): + def __init__(self, func): + self.func = func + #for attr in ('__name__', '__module__', '__doc__'): + # setattr(self, attr, getattr(func, attr, None)) + + def __get__(self, obj, cls=None): + if obj is None: + return self + value = self.func(obj) + object.__setattr__(obj, self.func.__name__, value) + #obj.__dict__[self.func.__name__] = value = self.func(obj) + return value + +def convert_path(pathname): + """Return 'pathname' as a name that will work on the native filesystem. + + The path is split on '/' and put back together again using the current + directory separator. Needed because filenames in the setup script are + always supplied in Unix style, and have to be converted to the local + convention before we can actually use them in the filesystem. Raises + ValueError on non-Unix-ish systems if 'pathname' either starts or + ends with a slash. + """ + if os.sep == '/': + return pathname + if not pathname: + return pathname + if pathname[0] == '/': + raise ValueError("path '%s' cannot be absolute" % pathname) + if pathname[-1] == '/': + raise ValueError("path '%s' cannot end with '/'" % pathname) + + paths = pathname.split('/') + while os.curdir in paths: + paths.remove(os.curdir) + if not paths: + return os.curdir + return os.path.join(*paths) + + +class FileOperator(object): + def __init__(self, dry_run=False): + self.dry_run = dry_run + self.ensured = set() + self._init_record() + + def _init_record(self): + self.record = False + self.files_written = set() + self.dirs_created = set() + + def record_as_written(self, path): + if self.record: + self.files_written.add(path) + + def newer(self, source, target): + """Tell if the target is newer than the source. + + Returns true if 'source' exists and is more recently modified than + 'target', or if 'source' exists and 'target' doesn't. + + Returns false if both exist and 'target' is the same age or younger + than 'source'. Raise PackagingFileError if 'source' does not exist. + + Note that this test is not very accurate: files created in the same + second will have the same "age". + """ + if not os.path.exists(source): + raise DistlibException("file '%r' does not exist" % + os.path.abspath(source)) + if not os.path.exists(target): + return True + + return os.stat(source).st_mtime > os.stat(target).st_mtime + + def copy_file(self, infile, outfile, check=True): + """Copy a file respecting dry-run and force flags. + """ + self.ensure_dir(os.path.dirname(outfile)) + logger.info('Copying %s to %s', infile, outfile) + if not self.dry_run: + msg = None + if check: + if os.path.islink(outfile): + msg = '%s is a symlink' % outfile + elif os.path.exists(outfile) and not os.path.isfile(outfile): + msg = '%s is a non-regular file' % outfile + if msg: + raise ValueError(msg + ' which would be overwritten') + shutil.copyfile(infile, outfile) + self.record_as_written(outfile) + + def copy_stream(self, instream, outfile, encoding=None): + assert not os.path.isdir(outfile) + self.ensure_dir(os.path.dirname(outfile)) + logger.info('Copying stream %s to %s', instream, outfile) + if not self.dry_run: + if encoding is None: + outstream = open(outfile, 'wb') + else: + outstream = codecs.open(outfile, 'w', encoding=encoding) + try: + shutil.copyfileobj(instream, outstream) + finally: + outstream.close() + self.record_as_written(outfile) + + def write_binary_file(self, path, data): + self.ensure_dir(os.path.dirname(path)) + if not self.dry_run: + if os.path.exists(path): + os.remove(path) + with open(path, 'wb') as f: + f.write(data) + self.record_as_written(path) + + def write_text_file(self, path, data, encoding): + self.write_binary_file(path, data.encode(encoding)) + + def set_mode(self, bits, mask, files): + if os.name == 'posix' or (os.name == 'java' and os._name == 'posix'): + # Set the executable bits (owner, group, and world) on + # all the files specified. + for f in files: + if self.dry_run: + logger.info("changing mode of %s", f) + else: + mode = (os.stat(f).st_mode | bits) & mask + logger.info("changing mode of %s to %o", f, mode) + os.chmod(f, mode) + + set_executable_mode = lambda s, f: s.set_mode(0o555, 0o7777, f) + + def ensure_dir(self, path): + path = os.path.abspath(path) + if path not in self.ensured and not os.path.exists(path): + self.ensured.add(path) + d, f = os.path.split(path) + self.ensure_dir(d) + logger.info('Creating %s' % path) + if not self.dry_run: + os.mkdir(path) + if self.record: + self.dirs_created.add(path) + + def byte_compile(self, path, optimize=False, force=False, prefix=None, hashed_invalidation=False): + dpath = cache_from_source(path, not optimize) + logger.info('Byte-compiling %s to %s', path, dpath) + if not self.dry_run: + if force or self.newer(path, dpath): + if not prefix: + diagpath = None + else: + assert path.startswith(prefix) + diagpath = path[len(prefix):] + compile_kwargs = {} + if hashed_invalidation and hasattr(py_compile, 'PycInvalidationMode'): + compile_kwargs['invalidation_mode'] = py_compile.PycInvalidationMode.CHECKED_HASH + py_compile.compile(path, dpath, diagpath, True, **compile_kwargs) # raise error + self.record_as_written(dpath) + return dpath + + def ensure_removed(self, path): + if os.path.exists(path): + if os.path.isdir(path) and not os.path.islink(path): + logger.debug('Removing directory tree at %s', path) + if not self.dry_run: + shutil.rmtree(path) + if self.record: + if path in self.dirs_created: + self.dirs_created.remove(path) + else: + if os.path.islink(path): + s = 'link' + else: + s = 'file' + logger.debug('Removing %s %s', s, path) + if not self.dry_run: + os.remove(path) + if self.record: + if path in self.files_written: + self.files_written.remove(path) + + def is_writable(self, path): + result = False + while not result: + if os.path.exists(path): + result = os.access(path, os.W_OK) + break + parent = os.path.dirname(path) + if parent == path: + break + path = parent + return result + + def commit(self): + """ + Commit recorded changes, turn off recording, return + changes. + """ + assert self.record + result = self.files_written, self.dirs_created + self._init_record() + return result + + def rollback(self): + if not self.dry_run: + for f in list(self.files_written): + if os.path.exists(f): + os.remove(f) + # dirs should all be empty now, except perhaps for + # __pycache__ subdirs + # reverse so that subdirs appear before their parents + dirs = sorted(self.dirs_created, reverse=True) + for d in dirs: + flist = os.listdir(d) + if flist: + assert flist == ['__pycache__'] + sd = os.path.join(d, flist[0]) + os.rmdir(sd) + os.rmdir(d) # should fail if non-empty + self._init_record() + +def resolve(module_name, dotted_path): + if module_name in sys.modules: + mod = sys.modules[module_name] + else: + mod = __import__(module_name) + if dotted_path is None: + result = mod + else: + parts = dotted_path.split('.') + result = getattr(mod, parts.pop(0)) + for p in parts: + result = getattr(result, p) + return result + + +class ExportEntry(object): + def __init__(self, name, prefix, suffix, flags): + self.name = name + self.prefix = prefix + self.suffix = suffix + self.flags = flags + + @cached_property + def value(self): + return resolve(self.prefix, self.suffix) + + def __repr__(self): # pragma: no cover + return '' % (self.name, self.prefix, + self.suffix, self.flags) + + def __eq__(self, other): + if not isinstance(other, ExportEntry): + result = False + else: + result = (self.name == other.name and + self.prefix == other.prefix and + self.suffix == other.suffix and + self.flags == other.flags) + return result + + __hash__ = object.__hash__ + + +ENTRY_RE = re.compile(r'''(?P(\w|[-.+])+) + \s*=\s*(?P(\w+)([:\.]\w+)*) + \s*(\[\s*(?P[\w-]+(=\w+)?(,\s*\w+(=\w+)?)*)\s*\])? + ''', re.VERBOSE) + +def get_export_entry(specification): + m = ENTRY_RE.search(specification) + if not m: + result = None + if '[' in specification or ']' in specification: + raise DistlibException("Invalid specification " + "'%s'" % specification) + else: + d = m.groupdict() + name = d['name'] + path = d['callable'] + colons = path.count(':') + if colons == 0: + prefix, suffix = path, None + else: + if colons != 1: + raise DistlibException("Invalid specification " + "'%s'" % specification) + prefix, suffix = path.split(':') + flags = d['flags'] + if flags is None: + if '[' in specification or ']' in specification: + raise DistlibException("Invalid specification " + "'%s'" % specification) + flags = [] + else: + flags = [f.strip() for f in flags.split(',')] + result = ExportEntry(name, prefix, suffix, flags) + return result + + +def get_cache_base(suffix=None): + """ + Return the default base location for distlib caches. If the directory does + not exist, it is created. Use the suffix provided for the base directory, + and default to '.distlib' if it isn't provided. + + On Windows, if LOCALAPPDATA is defined in the environment, then it is + assumed to be a directory, and will be the parent directory of the result. + On POSIX, and on Windows if LOCALAPPDATA is not defined, the user's home + directory - using os.expanduser('~') - will be the parent directory of + the result. + + The result is just the directory '.distlib' in the parent directory as + determined above, or with the name specified with ``suffix``. + """ + if suffix is None: + suffix = '.distlib' + if os.name == 'nt' and 'LOCALAPPDATA' in os.environ: + result = os.path.expandvars('$localappdata') + else: + # Assume posix, or old Windows + result = os.path.expanduser('~') + # we use 'isdir' instead of 'exists', because we want to + # fail if there's a file with that name + if os.path.isdir(result): + usable = os.access(result, os.W_OK) + if not usable: + logger.warning('Directory exists but is not writable: %s', result) + else: + try: + os.makedirs(result) + usable = True + except OSError: + logger.warning('Unable to create %s', result, exc_info=True) + usable = False + if not usable: + result = tempfile.mkdtemp() + logger.warning('Default location unusable, using %s', result) + return os.path.join(result, suffix) + + +def path_to_cache_dir(path): + """ + Convert an absolute path to a directory name for use in a cache. + + The algorithm used is: + + #. On Windows, any ``':'`` in the drive is replaced with ``'---'``. + #. Any occurrence of ``os.sep`` is replaced with ``'--'``. + #. ``'.cache'`` is appended. + """ + d, p = os.path.splitdrive(os.path.abspath(path)) + if d: + d = d.replace(':', '---') + p = p.replace(os.sep, '--') + return d + p + '.cache' + + +def ensure_slash(s): + if not s.endswith('/'): + return s + '/' + return s + + +def parse_credentials(netloc): + username = password = None + if '@' in netloc: + prefix, netloc = netloc.rsplit('@', 1) + if ':' not in prefix: + username = prefix + else: + username, password = prefix.split(':', 1) + if username: + username = unquote(username) + if password: + password = unquote(password) + return username, password, netloc + + +def get_process_umask(): + result = os.umask(0o22) + os.umask(result) + return result + +def is_string_sequence(seq): + result = True + i = None + for i, s in enumerate(seq): + if not isinstance(s, string_types): + result = False + break + assert i is not None + return result + +PROJECT_NAME_AND_VERSION = re.compile('([a-z0-9_]+([.-][a-z_][a-z0-9_]*)*)-' + '([a-z0-9_.+-]+)', re.I) +PYTHON_VERSION = re.compile(r'-py(\d\.?\d?)') + + +def split_filename(filename, project_name=None): + """ + Extract name, version, python version from a filename (no extension) + + Return name, version, pyver or None + """ + result = None + pyver = None + filename = unquote(filename).replace(' ', '-') + m = PYTHON_VERSION.search(filename) + if m: + pyver = m.group(1) + filename = filename[:m.start()] + if project_name and len(filename) > len(project_name) + 1: + m = re.match(re.escape(project_name) + r'\b', filename) + if m: + n = m.end() + result = filename[:n], filename[n + 1:], pyver + if result is None: + m = PROJECT_NAME_AND_VERSION.match(filename) + if m: + result = m.group(1), m.group(3), pyver + return result + +# Allow spaces in name because of legacy dists like "Twisted Core" +NAME_VERSION_RE = re.compile(r'(?P[\w .-]+)\s*' + r'\(\s*(?P[^\s)]+)\)$') + +def parse_name_and_version(p): + """ + A utility method used to get name and version from a string. + + From e.g. a Provides-Dist value. + + :param p: A value in a form 'foo (1.0)' + :return: The name and version as a tuple. + """ + m = NAME_VERSION_RE.match(p) + if not m: + raise DistlibException('Ill-formed name/version string: \'%s\'' % p) + d = m.groupdict() + return d['name'].strip().lower(), d['ver'] + +def get_extras(requested, available): + result = set() + requested = set(requested or []) + available = set(available or []) + if '*' in requested: + requested.remove('*') + result |= available + for r in requested: + if r == '-': + result.add(r) + elif r.startswith('-'): + unwanted = r[1:] + if unwanted not in available: + logger.warning('undeclared extra: %s' % unwanted) + if unwanted in result: + result.remove(unwanted) + else: + if r not in available: + logger.warning('undeclared extra: %s' % r) + result.add(r) + return result +# +# Extended metadata functionality +# + +def _get_external_data(url): + result = {} + try: + # urlopen might fail if it runs into redirections, + # because of Python issue #13696. Fixed in locators + # using a custom redirect handler. + resp = urlopen(url) + headers = resp.info() + ct = headers.get('Content-Type') + if not ct.startswith('application/json'): + logger.debug('Unexpected response for JSON request: %s', ct) + else: + reader = codecs.getreader('utf-8')(resp) + #data = reader.read().decode('utf-8') + #result = json.loads(data) + result = json.load(reader) + except Exception as e: + logger.exception('Failed to get external data for %s: %s', url, e) + return result + +_external_data_base_url = 'https://www.red-dove.com/pypi/projects/' + +def get_project_data(name): + url = '%s/%s/project.json' % (name[0].upper(), name) + url = urljoin(_external_data_base_url, url) + result = _get_external_data(url) + return result + +def get_package_data(name, version): + url = '%s/%s/package-%s.json' % (name[0].upper(), name, version) + url = urljoin(_external_data_base_url, url) + return _get_external_data(url) + + +class Cache(object): + """ + A class implementing a cache for resources that need to live in the file system + e.g. shared libraries. This class was moved from resources to here because it + could be used by other modules, e.g. the wheel module. + """ + + def __init__(self, base): + """ + Initialise an instance. + + :param base: The base directory where the cache should be located. + """ + # we use 'isdir' instead of 'exists', because we want to + # fail if there's a file with that name + if not os.path.isdir(base): # pragma: no cover + os.makedirs(base) + if (os.stat(base).st_mode & 0o77) != 0: + logger.warning('Directory \'%s\' is not private', base) + self.base = os.path.abspath(os.path.normpath(base)) + + def prefix_to_dir(self, prefix): + """ + Converts a resource prefix to a directory name in the cache. + """ + return path_to_cache_dir(prefix) + + def clear(self): + """ + Clear the cache. + """ + not_removed = [] + for fn in os.listdir(self.base): + fn = os.path.join(self.base, fn) + try: + if os.path.islink(fn) or os.path.isfile(fn): + os.remove(fn) + elif os.path.isdir(fn): + shutil.rmtree(fn) + except Exception: + not_removed.append(fn) + return not_removed + + +class EventMixin(object): + """ + A very simple publish/subscribe system. + """ + def __init__(self): + self._subscribers = {} + + def add(self, event, subscriber, append=True): + """ + Add a subscriber for an event. + + :param event: The name of an event. + :param subscriber: The subscriber to be added (and called when the + event is published). + :param append: Whether to append or prepend the subscriber to an + existing subscriber list for the event. + """ + subs = self._subscribers + if event not in subs: + subs[event] = deque([subscriber]) + else: + sq = subs[event] + if append: + sq.append(subscriber) + else: + sq.appendleft(subscriber) + + def remove(self, event, subscriber): + """ + Remove a subscriber for an event. + + :param event: The name of an event. + :param subscriber: The subscriber to be removed. + """ + subs = self._subscribers + if event not in subs: + raise ValueError('No subscribers: %r' % event) + subs[event].remove(subscriber) + + def get_subscribers(self, event): + """ + Return an iterator for the subscribers for an event. + :param event: The event to return subscribers for. + """ + return iter(self._subscribers.get(event, ())) + + def publish(self, event, *args, **kwargs): + """ + Publish a event and return a list of values returned by its + subscribers. + + :param event: The event to publish. + :param args: The positional arguments to pass to the event's + subscribers. + :param kwargs: The keyword arguments to pass to the event's + subscribers. + """ + result = [] + for subscriber in self.get_subscribers(event): + try: + value = subscriber(event, *args, **kwargs) + except Exception: + logger.exception('Exception during event publication') + value = None + result.append(value) + logger.debug('publish %s: args = %s, kwargs = %s, result = %s', + event, args, kwargs, result) + return result + +# +# Simple sequencing +# +class Sequencer(object): + def __init__(self): + self._preds = {} + self._succs = {} + self._nodes = set() # nodes with no preds/succs + + def add_node(self, node): + self._nodes.add(node) + + def remove_node(self, node, edges=False): + if node in self._nodes: + self._nodes.remove(node) + if edges: + for p in set(self._preds.get(node, ())): + self.remove(p, node) + for s in set(self._succs.get(node, ())): + self.remove(node, s) + # Remove empties + for k, v in list(self._preds.items()): + if not v: + del self._preds[k] + for k, v in list(self._succs.items()): + if not v: + del self._succs[k] + + def add(self, pred, succ): + assert pred != succ + self._preds.setdefault(succ, set()).add(pred) + self._succs.setdefault(pred, set()).add(succ) + + def remove(self, pred, succ): + assert pred != succ + try: + preds = self._preds[succ] + succs = self._succs[pred] + except KeyError: # pragma: no cover + raise ValueError('%r not a successor of anything' % succ) + try: + preds.remove(pred) + succs.remove(succ) + except KeyError: # pragma: no cover + raise ValueError('%r not a successor of %r' % (succ, pred)) + + def is_step(self, step): + return (step in self._preds or step in self._succs or + step in self._nodes) + + def get_steps(self, final): + if not self.is_step(final): + raise ValueError('Unknown: %r' % final) + result = [] + todo = [] + seen = set() + todo.append(final) + while todo: + step = todo.pop(0) + if step in seen: + # if a step was already seen, + # move it to the end (so it will appear earlier + # when reversed on return) ... but not for the + # final step, as that would be confusing for + # users + if step != final: + result.remove(step) + result.append(step) + else: + seen.add(step) + result.append(step) + preds = self._preds.get(step, ()) + todo.extend(preds) + return reversed(result) + + @property + def strong_connections(self): + #http://en.wikipedia.org/wiki/Tarjan%27s_strongly_connected_components_algorithm + index_counter = [0] + stack = [] + lowlinks = {} + index = {} + result = [] + + graph = self._succs + + def strongconnect(node): + # set the depth index for this node to the smallest unused index + index[node] = index_counter[0] + lowlinks[node] = index_counter[0] + index_counter[0] += 1 + stack.append(node) + + # Consider successors + try: + successors = graph[node] + except Exception: + successors = [] + for successor in successors: + if successor not in lowlinks: + # Successor has not yet been visited + strongconnect(successor) + lowlinks[node] = min(lowlinks[node],lowlinks[successor]) + elif successor in stack: + # the successor is in the stack and hence in the current + # strongly connected component (SCC) + lowlinks[node] = min(lowlinks[node],index[successor]) + + # If `node` is a root node, pop the stack and generate an SCC + if lowlinks[node] == index[node]: + connected_component = [] + + while True: + successor = stack.pop() + connected_component.append(successor) + if successor == node: break + component = tuple(connected_component) + # storing the result + result.append(component) + + for node in graph: + if node not in lowlinks: + strongconnect(node) + + return result + + @property + def dot(self): + result = ['digraph G {'] + for succ in self._preds: + preds = self._preds[succ] + for pred in preds: + result.append(' %s -> %s;' % (pred, succ)) + for node in self._nodes: + result.append(' %s;' % node) + result.append('}') + return '\n'.join(result) + +# +# Unarchiving functionality for zip, tar, tgz, tbz, whl +# + +ARCHIVE_EXTENSIONS = ('.tar.gz', '.tar.bz2', '.tar', '.zip', + '.tgz', '.tbz', '.whl') + +def unarchive(archive_filename, dest_dir, format=None, check=True): + + def check_path(path): + if not isinstance(path, text_type): + path = path.decode('utf-8') + p = os.path.abspath(os.path.join(dest_dir, path)) + if not p.startswith(dest_dir) or p[plen] != os.sep: + raise ValueError('path outside destination: %r' % p) + + dest_dir = os.path.abspath(dest_dir) + plen = len(dest_dir) + archive = None + if format is None: + if archive_filename.endswith(('.zip', '.whl')): + format = 'zip' + elif archive_filename.endswith(('.tar.gz', '.tgz')): + format = 'tgz' + mode = 'r:gz' + elif archive_filename.endswith(('.tar.bz2', '.tbz')): + format = 'tbz' + mode = 'r:bz2' + elif archive_filename.endswith('.tar'): + format = 'tar' + mode = 'r' + else: # pragma: no cover + raise ValueError('Unknown format for %r' % archive_filename) + try: + if format == 'zip': + archive = ZipFile(archive_filename, 'r') + if check: + names = archive.namelist() + for name in names: + check_path(name) + else: + archive = tarfile.open(archive_filename, mode) + if check: + names = archive.getnames() + for name in names: + check_path(name) + if format != 'zip' and sys.version_info[0] < 3: + # See Python issue 17153. If the dest path contains Unicode, + # tarfile extraction fails on Python 2.x if a member path name + # contains non-ASCII characters - it leads to an implicit + # bytes -> unicode conversion using ASCII to decode. + for tarinfo in archive.getmembers(): + if not isinstance(tarinfo.name, text_type): + tarinfo.name = tarinfo.name.decode('utf-8') + archive.extractall(dest_dir) + + finally: + if archive: + archive.close() + + +def zip_dir(directory): + """zip a directory tree into a BytesIO object""" + result = io.BytesIO() + dlen = len(directory) + with ZipFile(result, "w") as zf: + for root, dirs, files in os.walk(directory): + for name in files: + full = os.path.join(root, name) + rel = root[dlen:] + dest = os.path.join(rel, name) + zf.write(full, dest) + return result + +# +# Simple progress bar +# + +UNITS = ('', 'K', 'M', 'G','T','P') + + +class Progress(object): + unknown = 'UNKNOWN' + + def __init__(self, minval=0, maxval=100): + assert maxval is None or maxval >= minval + self.min = self.cur = minval + self.max = maxval + self.started = None + self.elapsed = 0 + self.done = False + + def update(self, curval): + assert self.min <= curval + assert self.max is None or curval <= self.max + self.cur = curval + now = time.time() + if self.started is None: + self.started = now + else: + self.elapsed = now - self.started + + def increment(self, incr): + assert incr >= 0 + self.update(self.cur + incr) + + def start(self): + self.update(self.min) + return self + + def stop(self): + if self.max is not None: + self.update(self.max) + self.done = True + + @property + def maximum(self): + return self.unknown if self.max is None else self.max + + @property + def percentage(self): + if self.done: + result = '100 %' + elif self.max is None: + result = ' ?? %' + else: + v = 100.0 * (self.cur - self.min) / (self.max - self.min) + result = '%3d %%' % v + return result + + def format_duration(self, duration): + if (duration <= 0) and self.max is None or self.cur == self.min: + result = '??:??:??' + #elif duration < 1: + # result = '--:--:--' + else: + result = time.strftime('%H:%M:%S', time.gmtime(duration)) + return result + + @property + def ETA(self): + if self.done: + prefix = 'Done' + t = self.elapsed + #import pdb; pdb.set_trace() + else: + prefix = 'ETA ' + if self.max is None: + t = -1 + elif self.elapsed == 0 or (self.cur == self.min): + t = 0 + else: + #import pdb; pdb.set_trace() + t = float(self.max - self.min) + t /= self.cur - self.min + t = (t - 1) * self.elapsed + return '%s: %s' % (prefix, self.format_duration(t)) + + @property + def speed(self): + if self.elapsed == 0: + result = 0.0 + else: + result = (self.cur - self.min) / self.elapsed + for unit in UNITS: + if result < 1000: + break + result /= 1000.0 + return '%d %sB/s' % (result, unit) + +# +# Glob functionality +# + +RICH_GLOB = re.compile(r'\{([^}]*)\}') +_CHECK_RECURSIVE_GLOB = re.compile(r'[^/\\,{]\*\*|\*\*[^/\\,}]') +_CHECK_MISMATCH_SET = re.compile(r'^[^{]*\}|\{[^}]*$') + + +def iglob(path_glob): + """Extended globbing function that supports ** and {opt1,opt2,opt3}.""" + if _CHECK_RECURSIVE_GLOB.search(path_glob): + msg = """invalid glob %r: recursive glob "**" must be used alone""" + raise ValueError(msg % path_glob) + if _CHECK_MISMATCH_SET.search(path_glob): + msg = """invalid glob %r: mismatching set marker '{' or '}'""" + raise ValueError(msg % path_glob) + return _iglob(path_glob) + + +def _iglob(path_glob): + rich_path_glob = RICH_GLOB.split(path_glob, 1) + if len(rich_path_glob) > 1: + assert len(rich_path_glob) == 3, rich_path_glob + prefix, set, suffix = rich_path_glob + for item in set.split(','): + for path in _iglob(''.join((prefix, item, suffix))): + yield path + else: + if '**' not in path_glob: + for item in std_iglob(path_glob): + yield item + else: + prefix, radical = path_glob.split('**', 1) + if prefix == '': + prefix = '.' + if radical == '': + radical = '*' + else: + # we support both + radical = radical.lstrip('/') + radical = radical.lstrip('\\') + for path, dir, files in os.walk(prefix): + path = os.path.normpath(path) + for fn in _iglob(os.path.join(path, radical)): + yield fn + +if ssl: + from .compat import (HTTPSHandler as BaseHTTPSHandler, match_hostname, + CertificateError) + + +# +# HTTPSConnection which verifies certificates/matches domains +# + + class HTTPSConnection(httplib.HTTPSConnection): + ca_certs = None # set this to the path to the certs file (.pem) + check_domain = True # only used if ca_certs is not None + + # noinspection PyPropertyAccess + def connect(self): + sock = socket.create_connection((self.host, self.port), self.timeout) + if getattr(self, '_tunnel_host', False): + self.sock = sock + self._tunnel() + + if not hasattr(ssl, 'SSLContext'): + # For 2.x + if self.ca_certs: + cert_reqs = ssl.CERT_REQUIRED + else: + cert_reqs = ssl.CERT_NONE + self.sock = ssl.wrap_socket(sock, self.key_file, self.cert_file, + cert_reqs=cert_reqs, + ssl_version=ssl.PROTOCOL_SSLv23, + ca_certs=self.ca_certs) + else: # pragma: no cover + context = ssl.SSLContext(ssl.PROTOCOL_SSLv23) + if hasattr(ssl, 'OP_NO_SSLv2'): + context.options |= ssl.OP_NO_SSLv2 + if self.cert_file: + context.load_cert_chain(self.cert_file, self.key_file) + kwargs = {} + if self.ca_certs: + context.verify_mode = ssl.CERT_REQUIRED + context.load_verify_locations(cafile=self.ca_certs) + if getattr(ssl, 'HAS_SNI', False): + kwargs['server_hostname'] = self.host + self.sock = context.wrap_socket(sock, **kwargs) + if self.ca_certs and self.check_domain: + try: + match_hostname(self.sock.getpeercert(), self.host) + logger.debug('Host verified: %s', self.host) + except CertificateError: # pragma: no cover + self.sock.shutdown(socket.SHUT_RDWR) + self.sock.close() + raise + + class HTTPSHandler(BaseHTTPSHandler): + def __init__(self, ca_certs, check_domain=True): + BaseHTTPSHandler.__init__(self) + self.ca_certs = ca_certs + self.check_domain = check_domain + + def _conn_maker(self, *args, **kwargs): + """ + This is called to create a connection instance. Normally you'd + pass a connection class to do_open, but it doesn't actually check for + a class, and just expects a callable. As long as we behave just as a + constructor would have, we should be OK. If it ever changes so that + we *must* pass a class, we'll create an UnsafeHTTPSConnection class + which just sets check_domain to False in the class definition, and + choose which one to pass to do_open. + """ + result = HTTPSConnection(*args, **kwargs) + if self.ca_certs: + result.ca_certs = self.ca_certs + result.check_domain = self.check_domain + return result + + def https_open(self, req): + try: + return self.do_open(self._conn_maker, req) + except URLError as e: + if 'certificate verify failed' in str(e.reason): + raise CertificateError('Unable to verify server certificate ' + 'for %s' % req.host) + else: + raise + + # + # To prevent against mixing HTTP traffic with HTTPS (examples: A Man-In-The- + # Middle proxy using HTTP listens on port 443, or an index mistakenly serves + # HTML containing a http://xyz link when it should be https://xyz), + # you can use the following handler class, which does not allow HTTP traffic. + # + # It works by inheriting from HTTPHandler - so build_opener won't add a + # handler for HTTP itself. + # + class HTTPSOnlyHandler(HTTPSHandler, HTTPHandler): + def http_open(self, req): + raise URLError('Unexpected HTTP request on what should be a secure ' + 'connection: %s' % req) + +# +# XML-RPC with timeouts +# + +_ver_info = sys.version_info[:2] + +if _ver_info == (2, 6): + class HTTP(httplib.HTTP): + def __init__(self, host='', port=None, **kwargs): + if port == 0: # 0 means use port 0, not the default port + port = None + self._setup(self._connection_class(host, port, **kwargs)) + + + if ssl: + class HTTPS(httplib.HTTPS): + def __init__(self, host='', port=None, **kwargs): + if port == 0: # 0 means use port 0, not the default port + port = None + self._setup(self._connection_class(host, port, **kwargs)) + + +class Transport(xmlrpclib.Transport): + def __init__(self, timeout, use_datetime=0): + self.timeout = timeout + xmlrpclib.Transport.__init__(self, use_datetime) + + def make_connection(self, host): + h, eh, x509 = self.get_host_info(host) + if _ver_info == (2, 6): + result = HTTP(h, timeout=self.timeout) + else: + if not self._connection or host != self._connection[0]: + self._extra_headers = eh + self._connection = host, httplib.HTTPConnection(h) + result = self._connection[1] + return result + +if ssl: + class SafeTransport(xmlrpclib.SafeTransport): + def __init__(self, timeout, use_datetime=0): + self.timeout = timeout + xmlrpclib.SafeTransport.__init__(self, use_datetime) + + def make_connection(self, host): + h, eh, kwargs = self.get_host_info(host) + if not kwargs: + kwargs = {} + kwargs['timeout'] = self.timeout + if _ver_info == (2, 6): + result = HTTPS(host, None, **kwargs) + else: + if not self._connection or host != self._connection[0]: + self._extra_headers = eh + self._connection = host, httplib.HTTPSConnection(h, None, + **kwargs) + result = self._connection[1] + return result + + +class ServerProxy(xmlrpclib.ServerProxy): + def __init__(self, uri, **kwargs): + self.timeout = timeout = kwargs.pop('timeout', None) + # The above classes only come into play if a timeout + # is specified + if timeout is not None: + scheme, _ = splittype(uri) + use_datetime = kwargs.get('use_datetime', 0) + if scheme == 'https': + tcls = SafeTransport + else: + tcls = Transport + kwargs['transport'] = t = tcls(timeout, use_datetime=use_datetime) + self.transport = t + xmlrpclib.ServerProxy.__init__(self, uri, **kwargs) + +# +# CSV functionality. This is provided because on 2.x, the csv module can't +# handle Unicode. However, we need to deal with Unicode in e.g. RECORD files. +# + +def _csv_open(fn, mode, **kwargs): + if sys.version_info[0] < 3: + mode += 'b' + else: + kwargs['newline'] = '' + # Python 3 determines encoding from locale. Force 'utf-8' + # file encoding to match other forced utf-8 encoding + kwargs['encoding'] = 'utf-8' + return open(fn, mode, **kwargs) + + +class CSVBase(object): + defaults = { + 'delimiter': str(','), # The strs are used because we need native + 'quotechar': str('"'), # str in the csv API (2.x won't take + 'lineterminator': str('\n') # Unicode) + } + + def __enter__(self): + return self + + def __exit__(self, *exc_info): + self.stream.close() + + +class CSVReader(CSVBase): + def __init__(self, **kwargs): + if 'stream' in kwargs: + stream = kwargs['stream'] + if sys.version_info[0] >= 3: + # needs to be a text stream + stream = codecs.getreader('utf-8')(stream) + self.stream = stream + else: + self.stream = _csv_open(kwargs['path'], 'r') + self.reader = csv.reader(self.stream, **self.defaults) + + def __iter__(self): + return self + + def next(self): + result = next(self.reader) + if sys.version_info[0] < 3: + for i, item in enumerate(result): + if not isinstance(item, text_type): + result[i] = item.decode('utf-8') + return result + + __next__ = next + +class CSVWriter(CSVBase): + def __init__(self, fn, **kwargs): + self.stream = _csv_open(fn, 'w') + self.writer = csv.writer(self.stream, **self.defaults) + + def writerow(self, row): + if sys.version_info[0] < 3: + r = [] + for item in row: + if isinstance(item, text_type): + item = item.encode('utf-8') + r.append(item) + row = r + self.writer.writerow(row) + +# +# Configurator functionality +# + +class Configurator(BaseConfigurator): + + value_converters = dict(BaseConfigurator.value_converters) + value_converters['inc'] = 'inc_convert' + + def __init__(self, config, base=None): + super(Configurator, self).__init__(config) + self.base = base or os.getcwd() + + def configure_custom(self, config): + def convert(o): + if isinstance(o, (list, tuple)): + result = type(o)([convert(i) for i in o]) + elif isinstance(o, dict): + if '()' in o: + result = self.configure_custom(o) + else: + result = {} + for k in o: + result[k] = convert(o[k]) + else: + result = self.convert(o) + return result + + c = config.pop('()') + if not callable(c): + c = self.resolve(c) + props = config.pop('.', None) + # Check for valid identifiers + args = config.pop('[]', ()) + if args: + args = tuple([convert(o) for o in args]) + items = [(k, convert(config[k])) for k in config if valid_ident(k)] + kwargs = dict(items) + result = c(*args, **kwargs) + if props: + for n, v in props.items(): + setattr(result, n, convert(v)) + return result + + def __getitem__(self, key): + result = self.config[key] + if isinstance(result, dict) and '()' in result: + self.config[key] = result = self.configure_custom(result) + return result + + def inc_convert(self, value): + """Default converter for the inc:// protocol.""" + if not os.path.isabs(value): + value = os.path.join(self.base, value) + with codecs.open(value, 'r', encoding='utf-8') as f: + result = json.load(f) + return result + + +class SubprocessMixin(object): + """ + Mixin for running subprocesses and capturing their output + """ + def __init__(self, verbose=False, progress=None): + self.verbose = verbose + self.progress = progress + + def reader(self, stream, context): + """ + Read lines from a subprocess' output stream and either pass to a progress + callable (if specified) or write progress information to sys.stderr. + """ + progress = self.progress + verbose = self.verbose + while True: + s = stream.readline() + if not s: + break + if progress is not None: + progress(s, context) + else: + if not verbose: + sys.stderr.write('.') + else: + sys.stderr.write(s.decode('utf-8')) + sys.stderr.flush() + stream.close() + + def run_command(self, cmd, **kwargs): + p = subprocess.Popen(cmd, stdout=subprocess.PIPE, + stderr=subprocess.PIPE, **kwargs) + t1 = threading.Thread(target=self.reader, args=(p.stdout, 'stdout')) + t1.start() + t2 = threading.Thread(target=self.reader, args=(p.stderr, 'stderr')) + t2.start() + p.wait() + t1.join() + t2.join() + if self.progress is not None: + self.progress('done.', 'main') + elif self.verbose: + sys.stderr.write('done.\n') + return p + + +def normalize_name(name): + """Normalize a python package name a la PEP 503""" + # https://www.python.org/dev/peps/pep-0503/#normalized-names + return re.sub('[-_.]+', '-', name).lower() diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/util.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/util.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4eb564989f0344d05111b9b8573b0469f6d2cc6e GIT binary patch literal 67899 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 literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/version 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/version 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..433fbc902fdbcb422ab7612e5232422963c28d68 GIT binary patch literal 29783 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 0 + + def parse(self, s): + raise NotImplementedError('please implement in a subclass') + + def _check_compatible(self, other): + if type(self) != type(other): + raise TypeError('cannot compare %r and %r' % (self, other)) + + def __eq__(self, other): + self._check_compatible(other) + return self._parts == other._parts + + def __ne__(self, other): + return not self.__eq__(other) + + def __lt__(self, other): + self._check_compatible(other) + return self._parts < other._parts + + def __gt__(self, other): + return not (self.__lt__(other) or self.__eq__(other)) + + def __le__(self, other): + return self.__lt__(other) or self.__eq__(other) + + def __ge__(self, other): + return self.__gt__(other) or self.__eq__(other) + + # See http://docs.python.org/reference/datamodel#object.__hash__ + def __hash__(self): + return hash(self._parts) + + def __repr__(self): + return "%s('%s')" % (self.__class__.__name__, self._string) + + def __str__(self): + return self._string + + @property + def is_prerelease(self): + raise NotImplementedError('Please implement in subclasses.') + + +class Matcher(object): + version_class = None + + # value is either a callable or the name of a method + _operators = { + '<': lambda v, c, p: v < c, + '>': lambda v, c, p: v > c, + '<=': lambda v, c, p: v == c or v < c, + '>=': lambda v, c, p: v == c or v > c, + '==': lambda v, c, p: v == c, + '===': lambda v, c, p: v == c, + # by default, compatible => >=. + '~=': lambda v, c, p: v == c or v > c, + '!=': lambda v, c, p: v != c, + } + + # this is a method only to support alternative implementations + # via overriding + def parse_requirement(self, s): + return parse_requirement(s) + + def __init__(self, s): + if self.version_class is None: + raise ValueError('Please specify a version class') + self._string = s = s.strip() + r = self.parse_requirement(s) + if not r: + raise ValueError('Not valid: %r' % s) + self.name = r.name + self.key = self.name.lower() # for case-insensitive comparisons + clist = [] + if r.constraints: + # import pdb; pdb.set_trace() + for op, s in r.constraints: + if s.endswith('.*'): + if op not in ('==', '!='): + raise ValueError('\'.*\' not allowed for ' + '%r constraints' % op) + # Could be a partial version (e.g. for '2.*') which + # won't parse as a version, so keep it as a string + vn, prefix = s[:-2], True + # Just to check that vn is a valid version + self.version_class(vn) + else: + # Should parse as a version, so we can create an + # instance for the comparison + vn, prefix = self.version_class(s), False + clist.append((op, vn, prefix)) + self._parts = tuple(clist) + + def match(self, version): + """ + Check if the provided version matches the constraints. + + :param version: The version to match against this instance. + :type version: String or :class:`Version` instance. + """ + if isinstance(version, string_types): + version = self.version_class(version) + for operator, constraint, prefix in self._parts: + f = self._operators.get(operator) + if isinstance(f, string_types): + f = getattr(self, f) + if not f: + msg = ('%r not implemented ' + 'for %s' % (operator, self.__class__.__name__)) + raise NotImplementedError(msg) + if not f(version, constraint, prefix): + return False + return True + + @property + def exact_version(self): + result = None + if len(self._parts) == 1 and self._parts[0][0] in ('==', '==='): + result = self._parts[0][1] + return result + + def _check_compatible(self, other): + if type(self) != type(other) or self.name != other.name: + raise TypeError('cannot compare %s and %s' % (self, other)) + + def __eq__(self, other): + self._check_compatible(other) + return self.key == other.key and self._parts == other._parts + + def __ne__(self, other): + return not self.__eq__(other) + + # See http://docs.python.org/reference/datamodel#object.__hash__ + def __hash__(self): + return hash(self.key) + hash(self._parts) + + def __repr__(self): + return "%s(%r)" % (self.__class__.__name__, self._string) + + def __str__(self): + return self._string + + +PEP440_VERSION_RE = re.compile(r'^v?(\d+!)?(\d+(\.\d+)*)((a|b|c|rc)(\d+))?' + r'(\.(post)(\d+))?(\.(dev)(\d+))?' + r'(\+([a-zA-Z\d]+(\.[a-zA-Z\d]+)?))?$') + + +def _pep_440_key(s): + s = s.strip() + m = PEP440_VERSION_RE.match(s) + if not m: + raise UnsupportedVersionError('Not a valid version: %s' % s) + groups = m.groups() + nums = tuple(int(v) for v in groups[1].split('.')) + while len(nums) > 1 and nums[-1] == 0: + nums = nums[:-1] + + if not groups[0]: + epoch = 0 + else: + epoch = int(groups[0]) + pre = groups[4:6] + post = groups[7:9] + dev = groups[10:12] + local = groups[13] + if pre == (None, None): + pre = () + else: + pre = pre[0], int(pre[1]) + if post == (None, None): + post = () + else: + post = post[0], int(post[1]) + if dev == (None, None): + dev = () + else: + dev = dev[0], int(dev[1]) + if local is None: + local = () + else: + parts = [] + for part in local.split('.'): + # to ensure that numeric compares as > lexicographic, avoid + # comparing them directly, but encode a tuple which ensures + # correct sorting + if part.isdigit(): + part = (1, int(part)) + else: + part = (0, part) + parts.append(part) + local = tuple(parts) + if not pre: + # either before pre-release, or final release and after + if not post and dev: + # before pre-release + pre = ('a', -1) # to sort before a0 + else: + pre = ('z',) # to sort after all pre-releases + # now look at the state of post and dev. + if not post: + post = ('_',) # sort before 'a' + if not dev: + dev = ('final',) + + #print('%s -> %s' % (s, m.groups())) + return epoch, nums, pre, post, dev, local + + +_normalized_key = _pep_440_key + + +class NormalizedVersion(Version): + """A rational version. + + Good: + 1.2 # equivalent to "1.2.0" + 1.2.0 + 1.2a1 + 1.2.3a2 + 1.2.3b1 + 1.2.3c1 + 1.2.3.4 + TODO: fill this out + + Bad: + 1 # minimum two numbers + 1.2a # release level must have a release serial + 1.2.3b + """ + def parse(self, s): + result = _normalized_key(s) + # _normalized_key loses trailing zeroes in the release + # clause, since that's needed to ensure that X.Y == X.Y.0 == X.Y.0.0 + # However, PEP 440 prefix matching needs it: for example, + # (~= 1.4.5.0) matches differently to (~= 1.4.5.0.0). + m = PEP440_VERSION_RE.match(s) # must succeed + groups = m.groups() + self._release_clause = tuple(int(v) for v in groups[1].split('.')) + return result + + PREREL_TAGS = set(['a', 'b', 'c', 'rc', 'dev']) + + @property + def is_prerelease(self): + return any(t[0] in self.PREREL_TAGS for t in self._parts if t) + + +def _match_prefix(x, y): + x = str(x) + y = str(y) + if x == y: + return True + if not x.startswith(y): + return False + n = len(y) + return x[n] == '.' + + +class NormalizedMatcher(Matcher): + version_class = NormalizedVersion + + # value is either a callable or the name of a method + _operators = { + '~=': '_match_compatible', + '<': '_match_lt', + '>': '_match_gt', + '<=': '_match_le', + '>=': '_match_ge', + '==': '_match_eq', + '===': '_match_arbitrary', + '!=': '_match_ne', + } + + def _adjust_local(self, version, constraint, prefix): + if prefix: + strip_local = '+' not in constraint and version._parts[-1] + else: + # both constraint and version are + # NormalizedVersion instances. + # If constraint does not have a local component, + # ensure the version doesn't, either. + strip_local = not constraint._parts[-1] and version._parts[-1] + if strip_local: + s = version._string.split('+', 1)[0] + version = self.version_class(s) + return version, constraint + + def _match_lt(self, version, constraint, prefix): + version, constraint = self._adjust_local(version, constraint, prefix) + if version >= constraint: + return False + release_clause = constraint._release_clause + pfx = '.'.join([str(i) for i in release_clause]) + return not _match_prefix(version, pfx) + + def _match_gt(self, version, constraint, prefix): + version, constraint = self._adjust_local(version, constraint, prefix) + if version <= constraint: + return False + release_clause = constraint._release_clause + pfx = '.'.join([str(i) for i in release_clause]) + return not _match_prefix(version, pfx) + + def _match_le(self, version, constraint, prefix): + version, constraint = self._adjust_local(version, constraint, prefix) + return version <= constraint + + def _match_ge(self, version, constraint, prefix): + version, constraint = self._adjust_local(version, constraint, prefix) + return version >= constraint + + def _match_eq(self, version, constraint, prefix): + version, constraint = self._adjust_local(version, constraint, prefix) + if not prefix: + result = (version == constraint) + else: + result = _match_prefix(version, constraint) + return result + + def _match_arbitrary(self, version, constraint, prefix): + return str(version) == str(constraint) + + def _match_ne(self, version, constraint, prefix): + version, constraint = self._adjust_local(version, constraint, prefix) + if not prefix: + result = (version != constraint) + else: + result = not _match_prefix(version, constraint) + return result + + def _match_compatible(self, version, constraint, prefix): + version, constraint = self._adjust_local(version, constraint, prefix) + if version == constraint: + return True + if version < constraint: + return False +# if not prefix: +# return True + release_clause = constraint._release_clause + if len(release_clause) > 1: + release_clause = release_clause[:-1] + pfx = '.'.join([str(i) for i in release_clause]) + return _match_prefix(version, pfx) + +_REPLACEMENTS = ( + (re.compile('[.+-]$'), ''), # remove trailing puncts + (re.compile(r'^[.](\d)'), r'0.\1'), # .N -> 0.N at start + (re.compile('^[.-]'), ''), # remove leading puncts + (re.compile(r'^\((.*)\)$'), r'\1'), # remove parentheses + (re.compile(r'^v(ersion)?\s*(\d+)'), r'\2'), # remove leading v(ersion) + (re.compile(r'^r(ev)?\s*(\d+)'), r'\2'), # remove leading v(ersion) + (re.compile('[.]{2,}'), '.'), # multiple runs of '.' + (re.compile(r'\b(alfa|apha)\b'), 'alpha'), # misspelt alpha + (re.compile(r'\b(pre-alpha|prealpha)\b'), + 'pre.alpha'), # standardise + (re.compile(r'\(beta\)$'), 'beta'), # remove parentheses +) + +_SUFFIX_REPLACEMENTS = ( + (re.compile('^[:~._+-]+'), ''), # remove leading puncts + (re.compile('[,*")([\\]]'), ''), # remove unwanted chars + (re.compile('[~:+_ -]'), '.'), # replace illegal chars + (re.compile('[.]{2,}'), '.'), # multiple runs of '.' + (re.compile(r'\.$'), ''), # trailing '.' +) + +_NUMERIC_PREFIX = re.compile(r'(\d+(\.\d+)*)') + + +def _suggest_semantic_version(s): + """ + Try to suggest a semantic form for a version for which + _suggest_normalized_version couldn't come up with anything. + """ + result = s.strip().lower() + for pat, repl in _REPLACEMENTS: + result = pat.sub(repl, result) + if not result: + result = '0.0.0' + + # Now look for numeric prefix, and separate it out from + # the rest. + #import pdb; pdb.set_trace() + m = _NUMERIC_PREFIX.match(result) + if not m: + prefix = '0.0.0' + suffix = result + else: + prefix = m.groups()[0].split('.') + prefix = [int(i) for i in prefix] + while len(prefix) < 3: + prefix.append(0) + if len(prefix) == 3: + suffix = result[m.end():] + else: + suffix = '.'.join([str(i) for i in prefix[3:]]) + result[m.end():] + prefix = prefix[:3] + prefix = '.'.join([str(i) for i in prefix]) + suffix = suffix.strip() + if suffix: + #import pdb; pdb.set_trace() + # massage the suffix. + for pat, repl in _SUFFIX_REPLACEMENTS: + suffix = pat.sub(repl, suffix) + + if not suffix: + result = prefix + else: + sep = '-' if 'dev' in suffix else '+' + result = prefix + sep + suffix + if not is_semver(result): + result = None + return result + + +def _suggest_normalized_version(s): + """Suggest a normalized version close to the given version string. + + If you have a version string that isn't rational (i.e. NormalizedVersion + doesn't like it) then you might be able to get an equivalent (or close) + rational version from this function. + + This does a number of simple normalizations to the given string, based + on observation of versions currently in use on PyPI. Given a dump of + those version during PyCon 2009, 4287 of them: + - 2312 (53.93%) match NormalizedVersion without change + with the automatic suggestion + - 3474 (81.04%) match when using this suggestion method + + @param s {str} An irrational version string. + @returns A rational version string, or None, if couldn't determine one. + """ + try: + _normalized_key(s) + return s # already rational + except UnsupportedVersionError: + pass + + rs = s.lower() + + # part of this could use maketrans + for orig, repl in (('-alpha', 'a'), ('-beta', 'b'), ('alpha', 'a'), + ('beta', 'b'), ('rc', 'c'), ('-final', ''), + ('-pre', 'c'), + ('-release', ''), ('.release', ''), ('-stable', ''), + ('+', '.'), ('_', '.'), (' ', ''), ('.final', ''), + ('final', '')): + rs = rs.replace(orig, repl) + + # if something ends with dev or pre, we add a 0 + rs = re.sub(r"pre$", r"pre0", rs) + rs = re.sub(r"dev$", r"dev0", rs) + + # if we have something like "b-2" or "a.2" at the end of the + # version, that is probably beta, alpha, etc + # let's remove the dash or dot + rs = re.sub(r"([abc]|rc)[\-\.](\d+)$", r"\1\2", rs) + + # 1.0-dev-r371 -> 1.0.dev371 + # 0.1-dev-r79 -> 0.1.dev79 + rs = re.sub(r"[\-\.](dev)[\-\.]?r?(\d+)$", r".\1\2", rs) + + # Clean: 2.0.a.3, 2.0.b1, 0.9.0~c1 + rs = re.sub(r"[.~]?([abc])\.?", r"\1", rs) + + # Clean: v0.3, v1.0 + if rs.startswith('v'): + rs = rs[1:] + + # Clean leading '0's on numbers. + #TODO: unintended side-effect on, e.g., "2003.05.09" + # PyPI stats: 77 (~2%) better + rs = re.sub(r"\b0+(\d+)(?!\d)", r"\1", rs) + + # Clean a/b/c with no version. E.g. "1.0a" -> "1.0a0". Setuptools infers + # zero. + # PyPI stats: 245 (7.56%) better + rs = re.sub(r"(\d+[abc])$", r"\g<1>0", rs) + + # the 'dev-rNNN' tag is a dev tag + rs = re.sub(r"\.?(dev-r|dev\.r)\.?(\d+)$", r".dev\2", rs) + + # clean the - when used as a pre delimiter + rs = re.sub(r"-(a|b|c)(\d+)$", r"\1\2", rs) + + # a terminal "dev" or "devel" can be changed into ".dev0" + rs = re.sub(r"[\.\-](dev|devel)$", r".dev0", rs) + + # a terminal "dev" can be changed into ".dev0" + rs = re.sub(r"(?![\.\-])dev$", r".dev0", rs) + + # a terminal "final" or "stable" can be removed + rs = re.sub(r"(final|stable)$", "", rs) + + # The 'r' and the '-' tags are post release tags + # 0.4a1.r10 -> 0.4a1.post10 + # 0.9.33-17222 -> 0.9.33.post17222 + # 0.9.33-r17222 -> 0.9.33.post17222 + rs = re.sub(r"\.?(r|-|-r)\.?(\d+)$", r".post\2", rs) + + # Clean 'r' instead of 'dev' usage: + # 0.9.33+r17222 -> 0.9.33.dev17222 + # 1.0dev123 -> 1.0.dev123 + # 1.0.git123 -> 1.0.dev123 + # 1.0.bzr123 -> 1.0.dev123 + # 0.1a0dev.123 -> 0.1a0.dev123 + # PyPI stats: ~150 (~4%) better + rs = re.sub(r"\.?(dev|git|bzr)\.?(\d+)$", r".dev\2", rs) + + # Clean '.pre' (normalized from '-pre' above) instead of 'c' usage: + # 0.2.pre1 -> 0.2c1 + # 0.2-c1 -> 0.2c1 + # 1.0preview123 -> 1.0c123 + # PyPI stats: ~21 (0.62%) better + rs = re.sub(r"\.?(pre|preview|-c)(\d+)$", r"c\g<2>", rs) + + # Tcl/Tk uses "px" for their post release markers + rs = re.sub(r"p(\d+)$", r".post\1", rs) + + try: + _normalized_key(rs) + except UnsupportedVersionError: + rs = None + return rs + +# +# Legacy version processing (distribute-compatible) +# + +_VERSION_PART = re.compile(r'([a-z]+|\d+|[\.-])', re.I) +_VERSION_REPLACE = { + 'pre': 'c', + 'preview': 'c', + '-': 'final-', + 'rc': 'c', + 'dev': '@', + '': None, + '.': None, +} + + +def _legacy_key(s): + def get_parts(s): + result = [] + for p in _VERSION_PART.split(s.lower()): + p = _VERSION_REPLACE.get(p, p) + if p: + if '0' <= p[:1] <= '9': + p = p.zfill(8) + else: + p = '*' + p + result.append(p) + result.append('*final') + return result + + result = [] + for p in get_parts(s): + if p.startswith('*'): + if p < '*final': + while result and result[-1] == '*final-': + result.pop() + while result and result[-1] == '00000000': + result.pop() + result.append(p) + return tuple(result) + + +class LegacyVersion(Version): + def parse(self, s): + return _legacy_key(s) + + @property + def is_prerelease(self): + result = False + for x in self._parts: + if (isinstance(x, string_types) and x.startswith('*') and + x < '*final'): + result = True + break + return result + + +class LegacyMatcher(Matcher): + version_class = LegacyVersion + + _operators = dict(Matcher._operators) + _operators['~='] = '_match_compatible' + + numeric_re = re.compile(r'^(\d+(\.\d+)*)') + + def _match_compatible(self, version, constraint, prefix): + if version < constraint: + return False + m = self.numeric_re.match(str(constraint)) + if not m: + logger.warning('Cannot compute compatible match for version %s ' + ' and constraint %s', version, constraint) + return True + s = m.groups()[0] + if '.' in s: + s = s.rsplit('.', 1)[0] + return _match_prefix(version, s) + +# +# Semantic versioning +# + +_SEMVER_RE = re.compile(r'^(\d+)\.(\d+)\.(\d+)' + r'(-[a-z0-9]+(\.[a-z0-9-]+)*)?' + r'(\+[a-z0-9]+(\.[a-z0-9-]+)*)?$', re.I) + + +def is_semver(s): + return _SEMVER_RE.match(s) + + +def _semantic_key(s): + def make_tuple(s, absent): + if s is None: + result = (absent,) + else: + parts = s[1:].split('.') + # We can't compare ints and strings on Python 3, so fudge it + # by zero-filling numeric values so simulate a numeric comparison + result = tuple([p.zfill(8) if p.isdigit() else p for p in parts]) + return result + + m = is_semver(s) + if not m: + raise UnsupportedVersionError(s) + groups = m.groups() + major, minor, patch = [int(i) for i in groups[:3]] + # choose the '|' and '*' so that versions sort correctly + pre, build = make_tuple(groups[3], '|'), make_tuple(groups[5], '*') + return (major, minor, patch), pre, build + + +class SemanticVersion(Version): + def parse(self, s): + return _semantic_key(s) + + @property + def is_prerelease(self): + return self._parts[1][0] != '|' + + +class SemanticMatcher(Matcher): + version_class = SemanticVersion + + +class VersionScheme(object): + def __init__(self, key, matcher, suggester=None): + self.key = key + self.matcher = matcher + self.suggester = suggester + + def is_valid_version(self, s): + try: + self.matcher.version_class(s) + result = True + except UnsupportedVersionError: + result = False + return result + + def is_valid_matcher(self, s): + try: + self.matcher(s) + result = True + except UnsupportedVersionError: + result = False + return result + + def is_valid_constraint_list(self, s): + """ + Used for processing some metadata fields + """ + return self.is_valid_matcher('dummy_name (%s)' % s) + + def suggest(self, s): + if self.suggester is None: + result = None + else: + result = self.suggester(s) + return result + +_SCHEMES = { + 'normalized': VersionScheme(_normalized_key, NormalizedMatcher, + _suggest_normalized_version), + 'legacy': VersionScheme(_legacy_key, LegacyMatcher, lambda self, s: s), + 'semantic': VersionScheme(_semantic_key, SemanticMatcher, + _suggest_semantic_version), +} + +_SCHEMES['default'] = _SCHEMES['normalized'] + + +def get_scheme(name): + if name not in _SCHEMES: + raise ValueError('unknown scheme name: %r' % name) + return _SCHEMES[name] diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/version.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/version.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e846fa9641150156b40f3dfd02b2ffd5c3820a2f GIT binary patch literal 29783 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�gPVRVBXt_FM7e4<}XM;HRH{62JZSn^<*L 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 OB+yBqlfeHwf&T)jA)JE% literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/w32.exe b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/w32.exe new file mode 100644 index 0000000000000000000000000000000000000000..e6439e9e45897365d5ac6a85a46864c158a225fd GIT binary patch literal 90112 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�gPVRVBXt_FM7e4<}XM;HRH{62JZSn^<*L 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 OB+yBqlfeHwf&T)jA)JE% literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/w64 2.exe b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/w64 2.exe new file mode 100644 index 0000000000000000000000000000000000000000..46139dbf9400b7bc0b64e6756ce17b4eb5fd7436 GIT binary patch literal 99840 zcmeFadwf*Yx%fTFWXJ#sJ17GIjf@Z!jhAS=Bo5RJ%*Y;@2v$*4R5Y5>N-GUBf)zD! zCoRKvTCCc7THD&|v8VRfp0->qBm@X|0^WkC;C+t+8Wocu!hXNc+A|?wdp_s)|I0^b zulwa$&w6g_St~U+FLk+HE>|A^+qTQKg0K9mR=@xIk45&7(W{2I{yuQ~nJaRl+t0jy z&Nt`#=hff)jru#j?XSJ#JKwoC=D+i9e|`Kr{%?NAADVWZ|J(Q8b@v5@g@Z~nO?QmY zpLpWFv)Z%&=U1+2f0Fo*(#iIJsPCigAE@t&_FwS*#gKorKgRco`_69Ps?rx{%D<5L zu2$c#f3tRuw3(g3^sviy*Y^jw;%6V7l}+n%jd2am9prMoM9P0VsZE#jEmGm?9QjB% z*X8oa5C5`Xl?c$1?p$)J8?%)%bt&mIlKn{COo{|u3(v@LO_0FS9M|ur^KHm+y~I%Z z{&nTJ?qUGdpSfJ8_a*)x0$ncGCTFPsvhW45yBEgDS^pwGG9a0|EPlU#ewS$o1V8u=eYEW^?IVIw49Wvxn-3=JCdAS ztS6(T<)P#xyTaBJp;Etf>6uhX7IuFLHStyMm-?MF@rN3kXl{w0r#J77U9Bg5M=7A2 zTWw!~lu3A+GX(~##2@T)xzb~!NzX@8EO~utd2nTsE5}u_xjj@me#Kyyt1hvq)NgmJ zlm)kams5UQ+qVC8E{vFg`1;L-l>c=u@oS~?!gJMJ=F){Tm)+5m<}xxnmue}K@ccDX zz?sYHH#2kj`u}Y%_fVd>=!sdSUOf>jExJ)R4){&ak&Eco{6aTBsn{DeH%F6`zSP!q zM9j_BFW7QXa})55m6)CvRkzy*y(Trrj^fF8`d?u~e+L5xO zy8B4#2Vli&$WWfS)oMS*>6cC+6i1pFUDxq`Z_4x=GTS2NtGc{bY&iUh0({V+7Xyn#-l8VTQXDI4WA);RAYE zFLQnG3}>!Ub0d8+Gb=!!PDf8V9Z4@2&`VHT9(L6QJU=5j?x``~OV>$j$)76t?PeY? z0YB^Uue6vNk!^AE2}9rWrEOo6oKoYMlfi4nDYrfphwJig0}~63*H)>b!*$UZ4R!^xIqxL9714zlDzQ( z!KT^PkKt%~^8B9);;?4t2UiN^V92`pO2uX=GhR>3WheWZ_PSinEm~6(;9M)aI{hGs z_lLt$|N7E7LTF}M?=Vl@l&DG6?6kU1rPki~*Ht`S>NFoUzuNpb)qH$Zh3tjW*(~WT zG;LiCm>5`mW7?xSRqa?W6iPR91P$rg30=^XB*|X5kHbj;ncd%v-VB_AQ~S71BJV#2j6#Z!X)6?OVBr_L9C)6g4+lw^O)cx2)ql z7{(lH@-&xgWw&kHfNb6zIxV*7eC`21b$U}uR^+3MIjOM9E=Q^Efu>%iKt+E zwA8;+1TWjSi#k!tFwOfIT-0o@*lf-1wQVyb7=C@}OjaY|x%sLb3O`L@!Oq#X?{FqK z)7Sz$=4WHFPo~>GL*hx_B4@fOX)Y@1r;?uCtFq@nnpkP^jnMlWgu&?Mht&EGwG=)l zS$)WSa1D4vilVq7ZTVDh9cWlqXB-|A8y7TRv3@NZuq8f{x))2`FbE$hXW)8rL9w=ch;%trI=h6< z6cW;-+o6}2QimE=jubaG=4Of)NO6xdHcL0(tP5406&tB7A1vty;Rv)aNH^MY$ru~| zAd~Tu%7}UELW!}GDeS<1B+CPGWqxXWa1bHTN%mTuapjo!Idw*0j5D4>3Nd^c(sv{~ z+mg|qE5l=!6_g0BfIX<$KZY#BF7wwJ51%n6Hu88wmqYD43t`40EJ3 zp4OO=wtSOS>?9V*xV7c(Iwts@p174xpx?SV7nC+P3XKus;)i(8x*a(H(l8S#V;;z` zu=qIdPd-~I+obWpGx;)1&puz4jw~G@n7i|3i1ZkyP*+tM^CYJoOXq9Lcj`tLC0p0izuqNlB2h;@tp6Dp!74QX6Aj|sU8bj}~qP*oVy8mb1x2I+RI9@td>QQFNupg!_K(x=gc ztoYBVT)p^mMJ~&ZM9ns4vNCnlbiX3eFhB0b$hZ2o)WB|3j(!k9$P?v}; znyx1yt94Z@M+_8a5nr-yfGB_p19fnvuIlo*1#XR1GwAxkoXvhZ3;fE!4M05&Qz zPBa1Mx2|Qc3&o2-s}ygy9zYs{CV%x`U7a>sBq1sU3hy{2#}yx{x3(75^|ab{JomFU zy>)X@YR^b0dWQdJNcjvA!F1^@Z0>iog>c2ept(UuH+r&#MHylJY#dzAHJrAsvk6wT zq#6mUGP_lo*y}_fjORMB9oApYl!12&FPtv>xzM^nwZT%l(rYPsL41rgxvyD(CvbtVOd8dWk0ASxn6}95;ohA{Z=%PfY>f7kRYXk z&XKIG)|;7cJ#7fxlDVY9(x4vLGXH#~Fe+V9t@|F`RMXFuv9)>iz`pu}U(x$iaS_H* zEB8n%BY?%Jx;Ypy$8zmm*_x^TH8b+Q)0Hvt;_2){b59IgK;hYht#4hZ$c$GeKU@-? zynq2GeLvnUpTb%`)B;u}Y^OxJWOtNRQwd;(ZFYMPc&e~UWl5X2}X?9oo{(xpQbaG^v_t5(SpLsLKh!vxl(F< zr#nf7lJq;0mWG?(jcE>a=8Z)tY<@R>R=a1{nGR5#j2p=aLfP7&XMAnnAGQlxvIO&F zM=u0dtFsy-yIK}&cd8B%e4B(>ww%;VVxpa(8|0*>s;q5FKqtvum#UH!XRolgUcC^M z+iJ}NYpB1{2H?_&b*fWOu=jFBH=<@M@R@fZ7=h;0%c#J*5!O%rvSgjM@B5@6u3SkR zYT;0a?4Cr1uZEi-|6A^IRbFV{X;mb|eAe~S1eiD2x|$Foc6Gulrj--hU|Ver7E^F{ z{9$X4Y}~};BHdit;*uacZSe{fn#u$BiX}USN$Xu+770!}k1FicnR&6tc$wl3&h1~csLzT(hIJr0n0j((aGwtD={$uQu z|K=e7&BFk+&>y@Wa$Ak$9|1>|wJB(>uMw=?A_Il`j=|1&a{{1^nTv+F|i4^|Bsq`RQM)GmZr72l0FJg1kDT%`c*h(W{brRZ@#z zBpTh`9;>cHcL>x4I%6Btmmt`Stm3y`y#m=|xuzo8@=mLrxDu^1wFXHokJQ?Rkf|+i zD{Bo^qQ4>cuuA2|uLW*L1vjUQSe#)wNH=p7md=9d0D|!qFr3{{b5E7$=JSE@0$>pP zUS|GGIy?W8%>1c~F5b-iqh+s6)|MBXijJgaby&@+)sKXGN}chAO8Y{kt@B5Wb-59H zQ;achmN9RMt=E>X)0S^8+XUiDlc=E93;^l0f1*uLXtr^9|AIx1>7seFu7wYS?v3Yx zD6Ev@!5WnI;mn5DdId+3`oF>Vvs6;uw5c@eIeZv0TBr&AeL zTH&=b#NH@Krzht^Kohs}f4ovpJXnp5Q3vnu9LRJkHt2~ko4vb6@bc4)Brx3Cj#V)$ z3EV_DbuXmaT04Om1vb_XKt-xZzZNmWE>j-{jIR$O6e63g5{e#Dw3r{ibpaKkwflj< zmDcy9Nx&t-#dipsuGHz27NtrMwUFPN7l5=a{yL!t{}7vlQu#hs7$k;37SVK`+p{V359|i}L)_ zbYp*)HJ;JwW&1^EfWz3abK3K_ZG%OgYJDg~8;TBqwRYDVZ^%|?FG{;3s5Z@ZyvX|V zY1xHKT}XQZi3|t;NCpa6G!z%I#zSjp=@jq+`<$S_eF$=9XS%?;n|3ll(Ua4<8mpwQ zxW{@7!;FZ!H7wC~YnmumCM#&Nf+j0yvVzIGi^Nul^{h`ssYbUF%b7zeI;@?vB9zwe z$jsIUOsioLHkW_3Y2hUf4@o`8j5xQD^9m5Ck^_nHk;LS#h*4{~tXuL080#x#KeKQA z*eCmJ+enmR*fu{AbIcsw+)`s6t`ULxQ$2Bg={&*LQ8l28uco;>ezrAdRNsdG9GTle zabaryKBk6oP&Z#FZD6fsg@&-s#wI(`b0`|vbl*9;ami*X?g&5B=kKoA1*J`bBaqJhoY4?bjMQ4>W5{hT>lbFZSga~61m=Ef*{b&g(U z={aPJd5)jiQFoVKwkh>%RgL_x*%}F0^>f02#m_VXAKr&CWnI|(G}!Y=dZ2D@2$`Qp zdb&bopQZ;%Fz{hmoAN2m3r627de5#f>^jq3#C!$5``eHpoMZGgdhOUfSZ>R#)O}1y zDii=GNrpxB2Nx@Vz#by@Mszm?5mCJ6$Wl_~U}~QtmjJx558%Qxtlyxnv~%Li zZoHHt#0Eys!Op!@M*A{8KT7)S`BBq0=c^9lpDN4#tjPeQFtue7SuhX#$TGawW2mQCz zk>^$N5WHF_*=u!yO>t3-!YhOj5}S`y;+Z)-hs@2|@;p6#)=DxEe-Lbh)s~0MR@>LU zUQ9Af*rP2cLtEaeE#Ep;IF+bXif@K1_STpkC~LqaKEgVm*=Bge7gbg=lm9{PfF+40YkEk+I^i=wzWl3rq<1h|w{(E=*eo&@)Gg@uE*@<3y-6U3PN4 zoPSj>uIkak$oS5**!MGYQ2b@*aStMwLW9BnO)5-3wN8>75A+3QanDWY`)jrnBqLr zWd^X6JYJ4{>*KO}in`aiV-tjpFq+n0kMY*%h?&=--?MpUcgX8)i1|duOAl(O92C#B zH|TbY9&p!x0--w1+>q)3x=p(meq#Ndp*f>W-3%&puS1`Co=h2GJip>#>NiBn9w@3Y z57d~4+z)sot;ak;o8Q-a5>lXNNC-h5fX`l}iJ?3x;-2F80O-OJUfa*&B1450vUj z&tr(`SJS)dIS>7_y{so0x|AJo+=MCiOYmP%UyPVo2{QB@2^J*J=)Zf|FIj_!&-&xA zEGVqY2(n=5QC2UUZK>?Sd`1QbCG=n+qfvH9)zoeR+=!X1l? zeGrcMy~pD7tQV+dRF2V_AEhDdzlkM^Qwsc1DBp>33N_Wf&PEelol%?>B?RL9LG_K(7{7T-aky#k{eyzWJ70zpw-l#G1-sjFV#E0L#)bs7 zRqqU{&u^bxD%(~n4gH!_YFC{5Ot2Q5!UVb@8HQPlu?204DPTvI%_+t^88iD5+vM@h z88ka(z=u!Rq4|9Sx1NCI$>`5ViyLGd$%%Q4Bf0T6ES=NIrP!B6F5PK;B%8KVLYqi; zPEEhsH^!B$|AaB|TN9zQx>@pB5$c5biPmI*6vC}5^s15_B*x;_l*B9VAdW{w$#SX7z^2O9yGo9S4qq#c_GV0G6;?{(f%f}Gl2T_(xPM|?bEIi2 zKn|R9fY{X1JH@z_3@yyfvUZ?%Tw&_tL(aL(ak)dusNw>$65-Zm?FYk_R_tZ^&E1Z5 z_f+cz?YKgu6Hec!C(aN_)2$~)n{7}Y$Ey2^h#Ic~MllRAu4!^?Q^pvh80%ND;-bk| zpMC@aCI*OVILx|(<}ym)4FpXP2B`&uzf_Gc|WOMW`rYzYVosqJ^yDH=A(Q^b#rCgr@C+jOFD- zjFw!iyO3IYOFTsb@uIpgb)S;DV;FFH9Wqe+alOQE>;#vUk$IR^PpJ%_x8V$f+tXKd z2aAo^71m-V%Z4y}tuq8+*c#mkc>rOmgEJnQNkfpQj+c=SvgRI?ZCpFvWz-gDI86CT zd!!%lqH@2@G0ggq&NJg!pg2_eEXGkC8(`c~>`Hf87YxX7vP9w9woG|O|_QpzapNxOF zaxjQdSEU!n_f_mQRy5JnkoyK!J=IGrgDrRbZ8l1r@#K$>kiXeGt48>gAG zuW}VLNO&4K4YcmMNrflUnl*c7rmR=WuA!_|Gb57(*>G8ZB1y@));TFLNXPP7#GgpH zKeDjhq0+fI+Hw@a;L1T14{6~oxO9ldu+y6Gz5rX84@{9ckidXP z&PWosSr_uVRK$y?OIOgC-njl5KI)7ET0Y+Tl?)s)G$p)DXeTJaaxIp!$-;5W$M*eb zB@xq8Gz2n4*E88pBAm|_{b;6D_(yU{=7bjw!4(VYoJm$vp9Vtc4P=!|sM=vMNlyn# zri4+3aS@2ZeP)W=!E83@>Sw{AF}m4Qss@noJk0>~WF~5~Kw3TLNRsJ!L_P`6XM-iy zRJv69OLz{^cDrW_i39UoE$yE5gdo6D;W3W3rCStlPcjpphaDZTBs`Z;&sma507TAz zzehR{*vlf@zPpJS6NgX;3EC+)igLE^uH~FCN>}P^<}#_%xL(E%A5y-Jw|FCodx|58 z`F`

~9OGt}*ZT)|eNW!Muohe`QTsPmTFj6n_Xa^=zHie2_*WwcphviK&}#kLf&Z-b0&{Y2G|;6z0?=IMW{a8YQoY+XA`E0z1`EtbF zZg+@WoFMO^SmT4P+WFt!A0Mw96aVKj8jhX8jQ>c;I$dp$*brq4*Ujy=@5dyYQ}cq# z2S~NG)A|Yc8DagZ&Fk`_wHRXnFA|&lxL=J5kycWZ-}YS(oUETx9QD~~E0URz;!0Jq zkr2pa|JIm6f5kxrxtg-}XZ^82#qO#R_g#wF$7=?eTT6YunZxJ40vlDcwJ0!ResTIe z)J}Jc8Er2@#2aAFZ7)c>L&$-^4fl({<@0CgHm8>FekE9tou+gw}b{J^7Mn&VnMjG01t@|9MS_5|9rXq#TUX_c4sgl8N@Ed547RL|j3 zFq@*K$?0B*eWJuGnPpDq>zT~_6{Dz_zE62awI7m-!*WnyA@r@-J-2eMZ+f1maQc0< zYkg}e6He-w>NZ7_z9%_Z;*j&W!naNozNk42CWb9xFu%uQo*G!#fOZj1?Fd3Xtw-$5 z@qa=EkhpF^ixoOD#pP<4c%JB(F^@HJCL=KmFOyLUad``}mEoc55p z_Dqk2I~QCmX1Eo9`Y-kGT)k|U-t(c}`UQs&TlCh{mC5MPBI_mXpn>M3+d^$seX&O0sb!Lxq(ggLZKf~BmOfWxQ!K#! z=|Q=9=_6P|FgByfgp&_BXX&q@?O{v{o3DhGKhYI^4n%=iH^yOSKN`Jv#LA7{`q)^b zcR>vM2b?&=yjOXY$}<@jx;DoRt`r8%W5K~)Y42Jr+%97W9zt!oL9@eg-_e@dNJUp_ zIs{^Ilwlmc?&14m-wKxP)S7mYWTXbirr4WfUo%q0v9pcTpx8*`a9;e;u;^E!WrocT zV`ow7_fmb;$N4FtNY&l#)mpPq9b;#8YKbbl!h$2JNWfWPWiijXCMK-A-TJs>Mvmq2KI$`hM1v7Q%EvBH)k=fK2C7@V}^0U3X755(yd ztj4-Aq01G+$2hO6ySmtj&*-Txb~UiJ(d3k)MsLxAqU5w9s{zo7*;bf^Zu<6M!_v)R zpCT0vzvH%Wt1LqrAuj`#>wrKy0-6L zsxh2ODPo>}M8t1V-%1(@Fe@?AA(t2NGgbl!=u=P62!u_TrsS;Du|0{|6$ryk^hDuz zp{-fJTXfqQ&<;KMTxk*dH3C}~z+oWIeZ)t(-tMO*rKX#EjKelG`J2<}`mWM>P^4&S z4Ex%OCj<}|mx}TwN9M^e)|ncXSsYPeeRyv^`Mk{J_d?Z0;)Bh}$+qohM!EoWoTs+CnSsN*~k zCZ;FC4Yu#|{}!Rl?6rOG5Rwjb+t)#m)hWW{RbU*kk)pR+P1DFWlQMa|Vw-j8UKT6) zbg4iGixRTQd}U3Vb-SDk!M7apxoQLwTrjEUSWgR+^ZoG8NOh7X7y|!-e&0f8$ML(* z{zMz-(AeV&cMrgO(A*OdRp?XOcZ4QF=GN?))^-8cnNbmQqn!0{ha|JabH%dmxJRCnngv{w0;72LE@G?AwT@Xg)Kyy(qn*hafot7k@i-<=kbwg zZ>G%B%w-U?5@fu!5>YIdqx1XBwXqw2YmF;K`w=ainz7W+gAmf`cpSE(}hMGGolh;!^0wX|QxXi@+OuIbxJYG#^cm1gr<%5WEnY(pIF~JK`@J*oIc6W=GE-^7Rvo35!uFi1@$)leT4P|;86gaD!RzS5a)%{Tw>w=J zNz6LxN)NDRkwxvod30|3cK;U$Zv3l7kqZ}Uo{m|+7I}5z(;o>W_QI(4;S_0o4w;}w zZ&Dv>y#b8@Li?PiSk>Es)m&N^`eNMzX5w$tAxj8%$+LH*UDhKvNUl2jp$xLcE_Q+K znYTq)5+q4=@#S?zpY;3GK9bp9wQ_P8ae;m)`n+vka*j|c-*$x*;e`evi zd{U1xEs`#9lFsIn#{G8Oa3`)we6IBpqG!g@!z)J-^}Fi(2nNkuH?Qsam>Hqo@%Z$4 zQFD#(B;`%38-I|ni<0qEL#D_EuJ-TCuRtN~39+?jOJcyJwCb(iow)AJr-_ol$E z2hY`Ox2WCp{b#5ERo~=w+3SQGn1wG;DE*@KPckBjyi!J%&&cjWcvo;R{LMjO zHyn%GzMqnA6fPw}*w^@!21-dep(&XoH02SR^c-xVqeSB~OxU=i$kiScR~T1&<0gJ3 zw6QV9XY$6z9{E72o~BVMV1IF~Eab-u06I3iAt_yUCh;sfTnS~uzM--ct6PZ3nHio( zo)z8FhM|&7Q$Fghz*48ihd7HI-{NZT^^M#1{r&eWP2sWw{34|M@(;A+5HcO9VwK#C zw!S+hn;5Gw3r&h5p@OHX>{fs|oMZbgR?7B0BxweBS`u!Yh=2DgHj=&K-*}rUtE5Av z#NM8VGXQ7{>n5eo;4U1S#iCneMx|AY!8ogp^dtyY1kTE3r=mRVzG z6Xjc5LCUOAg?-_SL0N{9R~K6sskS%KyzLt&l@p#b#tKjHX!5}x?BQy3nvE{u zG;=voaT0$Ofx_|gdf~@uA%#7ir?vES+Df+1z{sIL$r5ut{U#?i@%h)j;7VK)F0XX4 z4BbkW)H?NM{lC_G+`=w1NP%~-?W_5X%-W4`hVgD^Jbfa;0VlHm@IhHACn$AQ-k6)q z1A47K0oRC%mc}Y|W>T=qIWxJoSbL)7v$k!~+Ta8<2yrfTw{lWdJq&-BnFFp)MqR}i zJYr{<*A_$ryXyy;L9csVly%dBTuCxo$A<%3>))0hxTTQo-J$JxIir4D{1@@>+iZOc zq-GVz)Rb|pr9)B{3sE9TGpkEmtuoBnCdE8#Jwx9W-Og6jnm&T~C9iQ? z$F7$xi%Uv8lW>p(kg||-TACnZ78#AU$O>AMY)fttHy%NeeqoqfBpuI7f0hon%f+c( z@6ZKaNm}zT3L?}lk%H>}SY6`MW@KCJEVi#6T{(ygc<@3H|aB#7=uBsw7)Ly4-&271j zUmOCy_3w$+UtPWU@1+&OP0OYUD3rB9j1T5cx%Dh2RqlZTaov1Wp@J9z%C|a306`YV z2yhQZfccdfx01fIFa=TTH2?sP#6~#Ltqwd&jEVXiU`Tw}N|_8SPS0q@W>KaNyei$&^}+YCIH+%ZRu8Bd;YM~0{7;$P_M89d;fxB`rCVqtuWn- zUBdQ#;}>c~@$-#|ACv6jq7mHD)2(!ytzxqJpLTZv8R`F$$N(pD0!_;BmlO0=J$Vxr zp41w-#{$3OEd>OdtwRNKp!^RO1(Q<;K!VyriCYVziCgpPKKm0C_qBH@U3PRy-sr_{ zIkZ84{Y+0Lxt!oq4#P|Gsut(SHAxQDKXb-#lIMrxzW|kR?i6q_{n>>Ge2@vT96~03 zw3m-Ej?Dws_%oQ1JTYrw=$Zg1R*PsU2F3||0U6jeZ*dO$&u$I0)qlPuRC>ckynp=S z5Pd`X9BtW+IU#LXODM2z!SG;NN6>76oaV_j^PK>_PH zztKB#ftO~Ill*xlf*(}ICzjCBbfoY(` ze2;>Y1kF$DvIpZ(lJw|r0gJ5o>9I<-Ngtj&DX1rYpz4~Q>s5^PM8{A_>GbeVabQ6r z^CqYItrws_8PO!;;g^x^s^ut5?4rA^5RDt-!f+7u%VY6z?VigB17ZZTzx<4&HRYCm zof=N&E=f9U961_4rQK7|SMniBre89Sd>Q9;67Z$~+`m>Ta* zq$B2r;0rSBs!FZtECNCIwut)xceKlm!=Cz7qiw+$wI+0R_^jMv)|xnPo4Jz@P)5UNtl*PIq9U}2iUgEZbP}N+)~`u<`^mu*P>A?@*pAUQ&*fKpMn*6Xz6LsilM|3R~3X3 zb>6f)ahq39K2!vyTRDK1A# z#BY5&@1Hd6nwAWmi+yBMu(CLIQRPiJvGcTLL$zhWoIuBdk&uLoOM*+>LHA2RZ;qta zxVPca2<%&PD{(-M;672~emzolAif&7HGV8plaX?0_;DWRY9ANI1|xKiTJ212wKKKV z&eT@R)S_jt0B$yS(bVLka}TYOY2mi5)g?G{Zq1F9y%g^f)Tl=Cy&@!z!!QE!)hyCUP`z{4IdvK4<3Ppt0SyPDf@zxv+{rHr@QC>^fM~8e$=He_(Q+ zBg(DxgND}9%W2;1_y=p zN?{C2)7}u9!9XrQJ4uniHuTn#O$;HShR|iZyT32{Cs%7`gSomrQ(31R$7y2?c*!+# zYo+qMnVgsK7+|G*Wn`l<)^A z(VpfJ49|1>WlCO|QsFa%ohe-ndDRmoKT?@)#_ahJBVQQ;S^O;EFy(bA_&OJ;&|1%+ zto8B-S$kmGQvvWkmiyaiMAc$g;vnPXD+0;}WK4WeBxFP+)`-32r?e$kmbyYYu#dixI0~AdxBX?!}Oery5<={lv z61yKu#RI~a0q_qts=w&;t4Nls0DMoae z6P0GH|8l~zIPl}%H~C-*8fB~$Fv!UN8YRgzrGWLI6iz-cbB%)ro_|X5swrKuQ@GJA zGV>srt;d=n<&1{`H@=e7z=pn@fXZq2i|n}uoX<#^Sr6INY2>4~X6>S{2_glh{)DJG z6zw^7p`KuaZBgeBIL*YkLb1jAGgu!qu3)&#;n034OrQgDa)lTo;3RU%#!$AJjLqqs z1Cr61m1RDK7;(!zE6WVA2CDq0T7W>h%&|>g!?s+iCrwG?Wc=f|0LKlYeVd(5f%9=T z=#xjzQ{DK+m1H*XCQd>R)d2TIt z5=Y8?+I9Yh2Z1O1t)?p@op7NvJx^O+Q>27e^A-e)Z0Zo8HG%bG-KINd8joNV|o03wNqKJIm~PNNpEKTzulwo zdzdpeVW0IrXZ@MukNE_}LHxeHOBDF(IhP|=0_lgNfw#D_jQXujX$4>%C*82%E=Awv zi3%=HoGBL~AS7~mBF(Y8x-pRtLl$LNE=3ICQpBXiv(B>r4|gK6JhcD)A%r-T+>>rZ z9AGuYm$~1Kh&?26Is&y|&d|NhDuDY>3jw(iQDg0YON4NBBjT^<49<;+IsI=$%u}E+x#h{)<}bMugZ2t*414iqj8Sj}w4A&7q;=*CA*OiYB@cQtR=?0yMTUG};Cz z$8SS?-Dx*oVd;cI+=e&@$K3H7^Hr%5>ta&-E<=n{5jpX;{%5~hzznyVn>}`iWz7U* z%H=5bU)_cHm26Yztlin4VVOT(S(~}P&>QS_fRKs*n*`@?Zi}K71V_>jK>iYft!q7 zRsz&oA+(Mn%4T*V-7k;SVr=U)zc4?+;prjvUx%>j%c&r@Dd#A+T40-b15709S3~9| zv8UeiLmEBKxq*PPgJ8cvj}^jp3XV@Xc+rUcN$#wztN#c);)(zIozEKwa2y#{D$XO` z8lH+od@qicb<}8+Uc5VMo<0t3*i{pFasKeSVB_1auA1b};kR~hqgztrUAP>U%B_7b z6D^{fK3#qej&k$-2|as21T%ciIyM+IoLa2cc6GNt5+7lGZJ(_9K)Nud7W+l0z679k zw^qjrtuZQZ40-9dE9~x89AXm>c)MGRv?lRKljSkqI)>3TF}2v7TudGpSd2}%yh!>- zb(npjRUwB1XfQY_#)eqqoY-t)@xjPU58kD0h-~JqRtaG)n0bYqH6>}D!+P_&BCgkA zt;wMib8@M@DKXjGeDI->A#(%O2h~!lH+`eA+0O`4SK6Q{w@Akt$ByBSYwnQuvy#38 zz0B>c(c-8n9-6wlU|l+&eN+l}=ni`Qu@M!!%^j%RxmNsUL6=@zYx-ERn5ii6rR9rr z(!>9$Fo~5Zr>MEX`q7=zb>OJhyn&M1GKvXGfP8ba5*<83;f1sA{ni_sqtWZFzfN1W zJF+q-^N&l!yGX9CKSS@?W4x6g8xSpP)e}Wnrnw^;G4@{>X-y4?S2>Y#s%vf3;K!*#pi^S15?@OqUGmc#@91hMD0QW-XE8G8 zlVV%Uo}C?rQoDuwS0w~TTK zI;fRz9k>I$6DSjk= zyHxlT%~P1h1c|(-BF7L!h;$O+t0yo0Z#mhl?bKV3c&v4#hRjZ=*XWvi_RfsDPk%F= zkEZ$BYY4ncCVNXCnea&5qpiBPxUlhIbqOne8ohaAK1RjeZx?!?x)rX4S`#u(&7S7f zmMPO*LQ4;mvlU~1khaf^dTlG$ zwc5k`K}tJu>$^hzM_S+8i%w}LDy?e?IGa7S0a35QhHWkW9if0{9q!he@f2Zn#;DoL z@xjb&H9dy4IN#2kXPR{NLEe@3r3^yH&-I*;w164E-yA}&s&Ei4X zWa{YlI;!+am8xI^-WC^RGpTch)G49P$m4aK3WupGb*{)R3vW`sj!6?&nv2xC5ZHqd z9R%|i17p2*#_M<(FJ45LLV*tL2j3-#3jNn75d++B(`m1)u1vZ?Yr2$7MuV%%qaro# zjui$QzBVYH-w-YL=A}Iica?jOL~40o_RSjeqlkN>o(Nm&0>x=;*`Ped%5Dg|CXCXW zIK_1ZuUH=|REFt@y&<)Y6l6C`w>R#;kS*PbVAyZ@y0*r;LZ48$&PzAx(B7pKp3Ydbt``h_F>7SRfASzn(TPbLV~n~u{|32wxvB% zz&1#;OOC^_+JRSYdZ55UO+RG56E1td;lbHhJ9YtC9%j;-#J>UCZ@0T4&beh<>aR>* zN&9Kd_#*G&5sa?>6bjhuv}Nu|l`ptv2f6t8uC{FOByCMoj>Le$sn&gX6tug}rM9uv zPQ_`}ZsCPAuU^YFkIwY1{l})q0(7+)yf(hbT{LuwI|~y@4P8`aeBq9NCG`qvsjM@7 zD)8xfEd!z2-PRvPt_{B%HNQPQSoY>F3)6g!xltt2irwm^MR{qDqoscsLJ#(f2yOdX zh(Mxq7_f za<)RqyN@FzN{BfuQP=@Sc9rs_cp`zP|j5bX2gosIPw9Qu<#1F^?XvI+CF9NMrrXK3DqNZppk`gIIvCw=l~7{(SzR zu(uEO+QWt|yzw@gsMw2>?WKLqrq(c)ioL=ce?cfP@eg<~YQ|%Pqvi)uvqv6Yh$bgK zPIAzA7g^xlnY_W!!-kCdy~bNPv2XIuXk)LiM(rmpVEizv=S5NCtPVboR-C>OG2`Xi z@upE#yF-3_QipQj$H_N2BdCqzz0dlksv+{Z^*7Z9`-S|;vxSxe6v?OI1;>l!5zGh< zkWC!xL`Uiak8{@QNMVyyC8gr+#9N0-X}1|XJ)bkGNjlW7oA$vR#8hiF!Ao3tfXYPP#~9Q$maD zCu0i!wNxGxqQMNdtUyOy7mlTXM0CmUjf*FDHB@k`id0AJmi6 zodGx8d11o|gDxM`Z@~Fq9qeY)_iCC}jCOC}#YKzL1GxJ^oQqA(dmma9F(#DSu{rWN z7P}+Z9d_l!ZkCTXJ|toml=A)_pk{bsz4l{tsHId@p2WJjftN@e9qS-E)_Ew`d8J4O zN)*7VQ?xjY_t7&CDO%X{O`%EQ0=pe<9x>K?14kA$h0XU7DRgsUK#gxgz?KI;Cj^eg z1~o(j-i8!R9(RyXDTa-Jx3Q;lMK_I{w%KU?TsUb6&!;;cWMJ6#w+?T?a1P-6RUeDP>?QE#r5_)v8zCD z+GYmr^?KtGrL8`ylV%n+Anf30NMF1}mwZ}Xt972@xQ9bm=P8c<@1LN7_31^mdz||w zTdiwuk;UN@p~(8}&Mb|To%wZMEXKrOa!H(-=F<(AmMI5R>ld+mForVWfl$pqQ7?@d z03&Rh=)Wmibe^Tr%{+BWvEeSS_o(x5%E`I~=fXlVvzi4)6``0R^X&}9EVj<0dBg9r z^7@9C`VlMBym{gLz{CgWZ2mpExi4yd9BDlYnY?r^NoY(u8WW`MBZy?NB9dXq*h?tf zLI6MN4x#xg`iFlI8GC^<^l!NJ%Nr&+&nQmy#$g1M69s7_*_ z%DA!Jep~jP*zQTi)!2UIX`=5HVb>1YE_#}dLlgE$Hgcdf?lHJRmy1&!)$s*v-u+Ot zKOKUxD6co(kAWzfuW8G9n~c+U9`@dDZ?zDsZR1L;kUtP=Va8HB#$ zJ|l20=SEkuG)}%{1Jma2hquX9UAM4#`k07K|6SSP*BSo|w_Vc3+AkTaEdNym2)hSrCVd{d{Js`}bn5jPn0n z{tsEr&vCG|VjJWD--kqah1lB9v;LEWjQRKymA5xkdF!)cCJ#T8Ie%w`Q?n2Ud1R+S z7|vGQ^2P_v-C^^KFuw7L8Gk`huI44GgId#>l;fGZ7GsBK}r;( z-hmJnZTW_}U|AcBzrY7&yYERSO6Z7>$2ce2)WtqO#-CQ%!V-YHtsUsd2bt*Mo&M(<3m=>h8U z2qO1Ed+*Sio>uv_S`$v7$mDZNLu=vBt`Ki}&()f5MN1EMudmjcE<`BfQJHtWn$gXw z%U|%BmAxhqP5H=;nCNXAx#=j^uvmjC-Q+|XowZ!GD3u4#AFi!+g_8Ha^dCIWQyMB; zx2rdV)$Xy7wze{Cei&kvLUNm=Bhs6?9fS_{td~Dx6nBRQzXONW zBjy<#vLIT8di(kgH@%}ZUB_(boAuYVP|4k@wa=Pu?S~^N9;zI!H5C!imhmjOp#J4=<*ct1j$L zulxo9*LM-zu!*UEb{slVZC^v;XjVf4<|n*Jm;qadm^ zH2@L>uIg~|W}1A5cUcqp>D)vP?>xt>NQSX#;9%3Fn2)t9p+YEQBQ8 z@8#K40f3k0xjmy=b%)KCX8ZnpwUMw681ME3j%m}5$sL$^a%Cs^i=7Nw9IZEx-2zRC z;>xqLdGo`(CD5WCax@`8n|Y8Fx6S0Fa-+BEAv{+$iiu%s`bBvfa=M;umNo=QSP{F8 z6$v%J5B@{KX=GrivJ5{Wq31T2VcJ8B%Tk|X$%_x=6~9#c%Agus>Zhz>pf|Yow*X3; z)+?(S%x^pNlhp#;$4u*7jOakZT0XR*Zwpujf43)sr zcT}(CRqb$#?Hd}SzU&jGS#H)WM#Le6TVG8JFG1pKB6!Y)&!G8b;|HvgD|T8KJR44< zZ>|z)t7E=2Fk>lXgFh`M+eXb`RHo2hRiQuiFQn*Fb!8y#RSN@fgya;LDr6G6~|5RBkrTJ zpSmAjC0gUc^!e(8aZ}i68fhUjP}TjbB3=Rx{(hVcgA)`AHSb<{y9_pVlQUQWPiC;I z=|G_-MT4s)Ln_dwgFDwj5RhxFL%&7r1A8bX3>z?U06|)O!TrFsV*S z5TaEVG%7EPbLeI)%)LZa$y4d6Wt5Q2icIFkeVK=})PIn<;x0x)Z?Nkn5*32%L?4i- zP+})4)M_BqhO$o2QYfa#x7nd zdx`}cyHcbN0>cz~2U?v)x{*e`>1(Cw^i}-kq^kw~`H*L0TW-1{l$fztMmbl0X39@A zY`*QxOk$yQk)RSdqz-gNOjHevn5d+}=3apsJ}3i_+VbNQLzOd>gjw@U#u0-Ta?GTN zx8jL6?rGVqPnVV>_Hb=l#Na-o3J!VJ=dFDb>mvkl*#3&d%5~lU?vwkox*x}0Vyf6v z>Yk7rzp^K&PC#RqnN?-?b3Ol|^R4Jd((!dg@{r#qYxq@wsy(i8-rCf1zh>+|%4usl zUmf1=pxo3Vc_TrHryLn25SZos2+>}hMP~hP)PrewPNCeSxESHGzJX)}XYh!o>6dpt zt0A^rk=|-;=P5M$&4t~{`P6Zzo8$H&n6Td!o5P9!el#;9b{oCkizWtD_gpCXX2E{-j#~wo zofALBx{SdF1MRV~_D0aSG!0WY7#~g%ysRw|_Q=HOD6eLW$EPQaFCLA*O|wtYEJpTu z{5rSJrmdqit!klTjy^nH00-gbA}rvM%bxOLsVbZrM76&4>(kqq@^pDZvn%_4W{bKs zYcWT$kd3nTuI?9b_7?^ z(U`AKcy(X?!qiDm){Es97c6<6p2b9$iEUKR1Gkj5rl*8>SlVn~l~aUdz~8ix_48Y~ z)5O%lli8Q{jk3BDl~8NC-WI$=tjg$HsmUZ@9aq`%MhJIG`n}CRTQo`NlXFXUI(NMA z$58jCc7>`6+qWaZ%XLTKv2{%!JZ2J9@Br4C*ZBM35iR4dB`(k73I3C(%^xE;@uhyu zT-jIoGt=IXown03t*1iJM*RP@<(y&5D}%e^hjfnEx%*>p67LLw2R38wNhvIrrz5Ii zN+ox#VWoHo42Z_@t0j3n7Mi;k>^ zBLxdFZT?9rC-S8hkHR8%y(}z$!=IH?+qGhm%i=-2peBr@vhB-6rXkFE44BLV}RmJh1Y~Z7^c9Qg3OJ*4!BxCN9;zOh2;)|%n zTZ35Hc~%Y7uzlAFs>uA+$^O5#3n}XoCO1rB6Q)pHESfh#4@bX(iiRxXGHhOmt!`Se zf^d9L;BdU8yLvWPudG6fD{_S_Zn>l`4EGG$IRxiWw!?eos4dUAX%!)?Y+M2*e?0k7 zbDy|9v>xVRX-sxW-}5g^rGhQu?=Wd&Xrz}D@K^y$auv`NW+6V9$61WB8zI6g`=Qtl zdEY`VWfWW8t0<4va0lOv3qm79$7*TqS;Wh5CNU^TR7Vo5%P z)v!`o4KJtfUouh*OnHa8LzP$!2b0v!8X~+8vA)ySK0JqvQ9uBnz|*XFW&kyP1+3TL z2FyXmKOLmuO_6>!LLLr^Pmb40o5bMlp#T!cfCRF(U} z&^z7CX{=Na1C|*Ji}T{+%xeEcKhLMcd=t-<&ya~@)Si)`1|7j6fgLg*c<}@evY>VR$L{wGr-azt^766T_ zPmvr}9LUCbK|YUsUbB!^27_HiHMi0NM9O4h` zHFWb&&q~XQzsbkAKhLW*cN1DAN(!E-&&bDEhjUvrw^wicqJ{XP4;riRqi8W#|Akmw zYd7R;@PF#}{4`cAB{Q4cD9My2nZq~!`l?g9iInvB8mk`fm)0z4b&XZYerb1>&g6yy=8-~Gop%#U;q$hKix5b;slns zxjx5zzYL{O9sg@OS8h!7(W?yN`&jiE#PiF+J>~a&nlOpKlR2S}MSM6+MmWozqk8zD zKZ9r&=~yv{^JzhdU<<9?L0HC*aJAKXj@k|V*aMhEmF?D}Qq^G(^N+KK`mu^wP0g|g zH_&j!m(ys0bU=G8Sle}D+?UIw9ph}?FumZNf5#r+3?i7^RqBTgX0P2^7yQHF4Bw*( z>$^^K-5xdf6D3js-F;bQwELIo>Q;;$EDu+wI!23dz}FMXpwhdg{pq$gOVbj-7_c z`{(M0WB%9xeh0>XEsYG^IEAAOF$7g~117BrKmcoh%+nAU80S&tw)7_|UGzHf#^#09 z38gZ;pgll&om6Z_qOjZS)`q~W7;TJ+U)HoGUczxLR@2FN>WrZoSjJ%agJ8U24GMPc zN~MS5JV^foHs;S_4l-mUy|kc5Y#M*(z&pVon=)ZwY%&13TwAlrni~=5*vx`I8nHwW zS500jX5f$>OcnrXlQabbLZhSWq86aV%%2F#MTgc2pcC7gEmF*T*jD5U@Q za$z-o8FwhL(CJod`XlpYkrBiEG2ST4{LS6&zR&>?s48&=l5e@bi@&SNj6=Lv$e(^A z$@%M49c@{!TV;uZtGO-zA+b{UD&>ze5nO&q&2y+vo2W{<{>RbY(X4=Ol>U zRvATL6s?ATq>SyZA?VRW$=B#D((@vr2{J6Tln#Y9#$B|{C3mU*jU4Yc zCqCB7ybp2<8%qe(dWZGI;~<&yYR-7}N2xq*b{@kqC)QCkl>CL|<`dW#G}A$C%7I|u zKzx%xEW?w47`S(wPXM`pk1u}sg8V^%lynZRt3N!o-Fgf`Br}9_t2`gKxLo&*kv01L z?J|I0IRhwpmGmH{N^Q!Q!N8YsD*vy8__r_+lL-$VsWGU1vE4c^EN~PtD1M<32}bcv zXB7DCk5;4jWo8uDs!@E#C=LY!hvdT2|2hg_agzL%J*$-mXM6cW+;ZWPzbxb&w93mY z^S?Tn*VihLFqj|TCLqZUWuD^Iq|cFJ_9=`X1McDf&N*<;T|5-xH?9ke_3wqy4*LD7n?JP@T!@ggGWX;8PGRpybbif?!^%h&P%_1EJyPxBRWILb-1>>fCar#1P~GZd zDH~TW;zhaE^xEe=5p}EET#v=Hgs0UNwxw;NkIp`31v9T_rn=$$a9F4cTpL=wF(>w^ zlyJK8sp-c&A?cA{`Cc%xK4g*9;2Lp&OZ<$7o@+Q}>_R13xxbSmW$g7^7oiIrW7@-# zR7k&VWF!7z_EiHqGyBqftt|smj_-@`L=dGS$`4&n;wPnr-JMonb}r&y8(e>&Cr9RQ zjAyL;jF6uJ^5dxaJjGj^p4`ffr!9M0cqsh{xBGoBw}f-{p(WV&s&C&eaH_fmdq?ah z$w9Ekisu~1k}xrzaP))mXdRqN93gT%WtesH{s4_% zM7Li_DO>x|@=Txb3fKflN%N)e(p<^NK*6d&{r?6i>}rK*JTDx`PZTO{USlb zD*X#^kozX~v#^3O^DFB~WBOsoh8m(wuVtIyUaFd_ z_A`&y*DIaFT|7`W`*jL3y-`YafOQ@TT$d!iJ=r8=_D7u5luI+dUhKymHEAfSTYc2Z zWl7p}MC|m)XAOe3sOJ;h2JTb4URU!xXCYaywLchoo&xU)0in zm&o$AYfL1!4i>e9N_S&gvZMBX+M5fZ+iAYl4Rxy<9UFcw7QX$urj6JQMwQ~Ig8|~Civ{Fz)QZe(O=7O)lM7}2?RiZ%N3F=rrlufkfjW}6 zZgt~Fzkf=3qmgWTO0uoxCval7ar!Agv)zG|!4Kf zdWl#{g}Ss^UNeRml4{o8^>P~*(nHx@4M1<4se)dcEy7&uc=HEkaHLpRax`n<#Yv84Ru{xa zoT4C0CsKh#$f(ZQvpQ#=bJ;-pSXe93=j{RISigas(Uqt`P-t8}C;VW|+Sqi1- zxv@;>Rw3yU{(^pfKHeHc3IappeT48mtq=UwIE1?a>qxwL{>Td^Ron}Ao!GsW0+xYR zu{y-%DSd@9P3HA!oXg^wTv(zq%eG!)>)0o|hLZ`L$WVswVeWhf1*l7|J}z-LMb6zl zxwpsJMcx1U99H@y=_Vbu71T76(JTVg0$jWl+2|rSNiN@R{Vpc*@Uxg+FqTlc89lNj z9Sj*f{`QG|hQ z<>rhKE@pNuARagkl#wnVcTIC}r$W*Ngk5NRAq5I3r=x&sni<}updnn4x4nSEO##99 zXpiC>mQPw_n^1z8eX|r$JY^9h1q9*xnP^-b;fwXYtc$186i-Ka>+)&!`&XLsp)90W z+Kb7Q&+bm;lV!&z^lcORLh!6eNIySP3L(Q1yC$(aCU%EOmo6bGzBv?RmPwf@pa?8u zzpi{9r+hTu9G24ntMqP}IOzuYCF>lwutJ1`Zr+uT=Xw>q87z>sJ7|uUwX3&Nn&+%hOXH~h0bLNAK+oc!C%3WePSWE!YHtzpPLUF?5Fzy*4&a%o{8a_}Zek02aX{0uBE|53bz^X^y*yE%@>Ka6WhVbvU@V>{%T z?2j8KvEb)?dA2~96P}@Xu>M1mbI8-z9~W(Vpv`lJP5k(xcj4@h`#WrX3BbvZ=ebhH z#USm)Y`F>ZkW(qQ-XwK=Z;p}Fy5w8eUSrEOmJ?KZXXmtc__BW9F`OU!nGEM3U;_(w zUo7(8WWYmC;Kwkpy*=ddy_V;{$qRkQ!DO!SZ0EApZyDRnSrh%Zuv{79IY9mMqSuKB zI5Y=5{k5VBfJcUtyK+1oLrk zxZ4+$=F1H|aYr@8G&eH`$s5OV0-@$@b`+Tf`uF(b;@ND_M+5cImE$t=Xn)Y2^Mc=^ z&qV5A#tDSJwFOsPaan!V*cdkg1z7d2q=C2`+)7%>R$_x2@f_9#f1pw(G>Nds6ye0( zzd!sSEKNxB!5Uo5UV7wyB`?ymuM;DFIQuF0M)f9yJi^RAJiK5@Ufj1cWJ&F)%_3Q8 zKCc=khgbM@a})F;{E zgq?TUgpfJvkHEA)B#{5rl7HO|^bX|z=@?ox0-j&@ly*){`w<;~+!qi)KjJ;jmtIba zNH|Pq4)eg@W*$we=_Ps59aBrRa7`q8Iy;ckgy%#;{bjA|rV7oyVV3V^5>kIfhsDiU z$f>dH2=}Dttt4tZ_a*4dsGL43XMJHzfC1M2#zXu4rE*~hACZ1Chg*W&WU_V$wp#sc zVj66;256w2(^zYykiaAy=_BPdc%mD6dr7U=@R8%Xp+(%Dlfz8%vQkme{S0?fVW%(QQomyvrxSCTq@?`%Pc4O~uwx zkgq)S#I@zV7o>#@g4EPN8j7?LIX}Tm;ZR%NM0l1Yu36Sz_y{p-TDgdJ!4V?6T}(Jz z73uYOdlgBPVt=5$dOZK__Uhs2R6X?e5*{~Z`}R`&G?b7A>yh6Jk52{$-DVI=B0Dd# zn4=E6Nh^I`9CDU&S?p-3eemLUVNL7nToKk+QBoZI$%ZP=TPaNbzInOlwwHT~dA`Tm z2{tKkDNo9AD?rLUMao^X^Q5ph>(Z6?eYnh~OE~?MF5yLX3FmY=R#q-NPPudB%ZRX^Tq&u(EXI1oXyUE=jmByH!f3`=KQ)>}>o%?FWz`vr6sy{3 z+}28?$+1d}W|38BG`ZGdqgigvGnynT(`d>qm(f&NNm}EpCU@3_M!!+?PNSDxTm6h) z=wd|}{hgved86dOCuFl)jb56E^^VcYYT7zx^bMjvX!MPuZ!r49qJP-vkBNS}(Km^H zo6%dM-)!`)qOUdjHqloZy>MWy5~G*vjaIJFYoT@XjXqxN-A3;e{WPPO6}FXV^jZqt zNTW{@`*@>=NvEtRqnBgNmNI$~VrPA-`yF4o=q;nK68)cyzFPE$jeeu(_Zt0X(eE_+ zt)jo*=$DKBPNUy0`YlGkL-ZSsey8YH8GVE3%Z6M`V`UMWAtv(Z#DWH(cfb9i$q^-^tqz<82xh5FE{#f(JwaoD$(Z{eYNP* zjDDl&lZ<||=r1(-t)h1t{hgxkXY|`eA7S)6M1NBEJHDNwZxy|sk;2DemRQu$)_b~> zqu=1z4>ACs)gdm6z~&`mv(wmc$|?GQvH7L3S%i(>*laO2x!8PWY}Sj7j!jruwTcqz zh%X}^kG00*RVJtto12ZzY-2M9n{s0_#n>S2D!Rznj4(Dy*eo_SvBo9^o4Llu4;zc_ z%Z-iO*nDVgmSc0Jv3cFtlw*@+Yz`QkDr{yNo5!?`?trkIVl3}AmeLbpImTGl8%ybu zupDG8tHjc#yM0a^>PO2QT@HnL2d8ZevK&9?n3>=H{f@;0YmMxLM%N~lx{+7BSs!x_ zSC$bU$}*z&##rkWJe&2wGfe-VWqr`~>$KiZIFjXiR(M{6HU-Vx)UW3yd%Ra7(F&9c z-6wX-GTi&#=8oldW_`b&MeE-7JBrqQ(dJnB9D_Kgy{RgDyia939$21dg|O^zC4)%H znzScl!_%JqEe`h}CalN&Ps8o%q@Gf}DCi^aU$|kuBzJaylzxFQp zrRFa9WEXe5%n1bUd-ax8t^XOh3EoF;f^!y`S>DSJ%&q=zHMhBBg9OJN4E2BKYS_^9m3c4KR1W)6mJ;fW@f! z);iYU*2CYE4GOsfekZeH?tuRS3!9afsNLj7%~pK}d~>He;IGpoxVYtWJT*QA@m_Ca za>sWATzFFVoaJDa48tg?9zV(ZJYx`u<{6QdkAQ~ghw+#J3x~EM2cEO9Z&;KaQhPuI zVR4$%w+An`;f3q?No&35OXzbY^Z<80T$(Q1MvXq`_ncJclkb%n@dcWxqOvQ61W4$9ayHkJtRBV?sWZL3E7eN zFXZL?-NxVJB0@2mrY&08C&TgN-kFX^Z;5DNt$W&~^#(4j&vHCk+p`H**KUg&>s)2# zSphDX&7!)ve2wX{dd??hvQ2qQgn^T7_;=g>&oCAGm( zTS{v6ZS^FK`nJ088f)6Ptu7~s^=T0=b29+CD+WGkF!z`TF!6&03C<-a@d%Y zYBA=0wyR&p&UNA$eYrf0@E`Wd@C|h(a}j74)Zl(OavJwX;3EbCIBI)>mWmmOz|C#w zo(5g>+eFw6Q%6Y8Xl|Tc!K!OPgRF(z*}kW(r1Ny)lZgS~lb3T;i^H{Pb{i(Qm^P;4 z`Pzo&B+`gomDsteIigc^*}jsS?RDouU!2pRylR%~;Wces2M-}oP1~|HFV?gb z8yRf+8n~<|YTC+-fNr@0p0BTfhf4?5=CvO-Y^!o?cp5}IN8`IC$KR;gf-+D9GY8;? z_jB$epSL(6gb+Y+1Os}uMEV=kl49k&=5Bm_lJFe-2zRqc9SB?k|Il0lr^XeSi{OaJ zyJ>Og9G(TqNtBD<8`DP4X}KbB@B71>Qqp_1Ae_xNLkhuqsEXXa7sZvX%5^>_#Bu!AQ^Zx>?HRpBQ=>G1j^q1yFH>D}JxmzM6sQ9Dl z!JE!rjZSK}hs%4P1a?91He zPHLD6ZhfD-H)#EFO5;I-i15O7!UI>i-&-Z_O;aQu+r2t@tiHwlp$N{CRy`L{-9jw7 zRiTf_vsmoda5dT17&6j>>`&I57oB~(5&u!B+Ho_B6&`|pp zxE(anx}TtO08K@J)WeIt6}x^IviART6cmUif|?V{+2N=-|;j!izzL`+f!>2YM5_MtHSse zGHy6tHB1uh8PtK96Kdr4^W*J=2F(uXjM=nrw5Am4sASk8M-)4QR2r$uHRBc|>I^Os zGSJDOwqc5#NFZn=Lr^%q4pia_t{y3~H`^>AVM*4@%tAIh?#>k=Z`0=`IF%!&zL&vm>y#1SvSO4a9#6s>b@WLe5J*YHy88PH=2Ex9i5~MX(V9@u!pWJKT|4wWE zmiD0Uf2TFi37{F|G94#1N?-aGi6c;rOW!RH3fSEC220?!cf1Mc^tedH2+st56FkHD z9m^4s>XV7w6#7bIh-m)MXhNIcF`A&}*F{4)gf|~CR>94UXoOHz^0Qce0ynOYa7EnLN73Cf;qTqWBwDSytSnt*cez_~oy15gjJF;pCpAuZH$eLa-SUX(EhfL6bAF}scAtwy00(q9H!!|fD(u|AL@ z>$_<6o;wHHyUE_ttm*bGYIecu?;m;iU5*MR4ub1*oPB%QGxCLvECat@Q8)+ECSY=N zeBk|I(x2r2k^Vxn-`{1%Bdmp?)*Zw+EXlf2r$P1%tq`;nUGr}IWcj$9@E5LAy|;~F zYxha+HU4#|Tqu{j2RYf?E_7}3IFjU*;@p(r<0*$vahoPs->Kn#CG&JGhxn(i<7o~g zg-0Xj;yEoT{2{6t_2vntz%pfimad3M))7gjFSH5o;UY=*A*`(}NTO$d2T?$adCj^( zDpq~iLVQlWs-L8U(`OFHmZ$x3x9ghZs9jAcxc%JjJnpD1$Ka2v!U+m+?CTAx-r{s- z{A6Bqy$L&mw~3x9dyqO|F_%{d1JZ$ap%yS8oO)=YI z=3ju5BrLaumBRsRTrXXfCuh*>COn-H!m6AXAHVlo>1kwGF+my3t%oCJD#>}o2gQxE z;DhZGcs`zk!l(6vfQQ?}0|(2J^lzeKI80i%14Ip!FUsR(EcI?TK0U=_#Z?8Y@d*e)r$QB^?3=+Nyq2kCZ zSBo6Cgki@?vn*-_g>NRj?Kq$LDQ_c_u4r95x*#@r^T$oJaqlCg;8_&pxaC2#Ot;c_ zE9howPLQrS!QOKnkA-m0x~QftQiR4JxMIs*xjrL%G+FZAHK3FCOGFe)iggk7y(k&) z-etUgCkHBr+2WLa2a%9efS11QUWig6)>)AqU<7OIt30pyeJUmws_NrD`w1!APiEeB zZA^1yQ7zwg?N1BOfd-1knbrKcu2~mdi1AqS2N<+%3mPc=7@>s_y5dulPhl-v`S0o) z_Z&EM9UQ`pyMA7@Nc>52*FWN<#Z5ZEV;**LM!PnJj?D1yofhfswecJyV~ZsM{~LQC zZi}5Ve_zghz2F|ku9drfgM_CmN=s;vK9XI>=<%e3lHM(XfXFMYR7zUP-Oc1k{L^m8 zg4C1ojIfk84jPd=q1BzwG|-*A&v8o>=_g%}N0V}sILCS!(VPDcJ*3GyHpr%l&XjP= zwa2q%Yof>{kZW_nQovr`@H)pufyvZN)=8p@>Uc~T7K)6$zd!GI$!1DW2aC++9(^z9R)SMYmTC*ZTeXVA@dz*i9n))*)g)3}St53-gdOSEL>J*K!#^Ui<4 zUB4w-iZ&gVRekh@KQ;ssKZq-mlJ`YLq$TY0$K7>-?y!1=c$kZriwf5dxXCLhUO~52kP-MjsduRp}Y0SkmBj(s$Q*- zMLiKO*6-Q%-7jx5u(yS_#;Ka8W1m2c7oJ_c41+TL{lx;ow{7IcL73O=m0`2<^!J<0 zA<7MY%dMl7Nlqu(olpJnG})ayusYKmLS%QwGxl|wLm1h`GKc8PL|)78e4A4MW~O4D zKugBV4B|V4)UrF@GPc&P4v(|M>T6_o`op$W3n~AoA5ySh)i2AXa)hM86O9m@i2bP} zo7kK@U-2%bDiY3XB~xT!s>wP@jk*2s;1DU*1SDd7}>s_a>(Fu_SJ z0+~#3IQ$^&Xl}AO9{bp_VFT?`Zh&6%OUk)^Y;6_Om-@QZr|i;eO_ZLm=`Vd#YN z2*$5L8HCJ9AuTBHvr%%9?2z?S8|6qb)OSU>2BXgsS;5zTxF{p!!ap5Pmzh$X;9(#i zDP5D3weJhAoiZV?deeO(irAZf2!A8aMYM$U|R{=n?Q|4cHWSM7H^wvVHF`Bw;M>r~wp5tR9P;3=w` z(86Pav$1YCrC$%JVr3g%RF~+k2}dM~zIpm8$+O;tBPFwvL}{84bA@h;IX2JbJvptw z&q-aqUH52m<3EJk62?DN>_JnQ~K2W ze%=vs&ZLLqQ8E&emQ>iLndq%G<{{Ia)H~JkTgRggmZVKq6DH}I>2}Frc2kIfDCZD>4yz$D?Bd!2$eZ-_~f|}CLmMwKJNT=64;>5(=l(y}0r z)2A&Y5suo6=wOK=@bFpld6=#HZi`d|VEb zGcZ1Ps6Wm{O32EFo`h-nC3`?z`fsjg5Y>A@fj4BW;438=OgoX~`Z{y;6jD5sA^xgS zs+t=4=uF z4y02Uir(!zA(By$lOoblNcd;Wt*3?iy~#Dx|D4BVDDNmL$~jzc?8R>10R3)wOVlp7 z1OAqcqC-qV2(2({&Em^BM|Vo@pfe;_ zUiSWuu2i6K*F=TLdjRKHH5?$YhZi~9a9WD(#FD@<(#OYH6~>p9*&eWkqo7q2lB4&2 zkEEaP&gT$Y^b_d2Zt%#!eLO9OlygEXG=`P$7#ovn$7I#ZzP^x5I{q`XZ`YOj$WlHh zSpOmmQ7#$IC8qY#b@F?f3t6*jQk3#euD_zE^$-nVvoZ6geAc9Zbn*j-O?B z?DQOiCWfQ#quz1iYU(HVj^#vLKnA}IXIi}8d+C!ttpApX1?n&9V2REKmxxKk=0j{Y zb7j0fET3oyJ+j81;;8rGnw5Vd(>J(PI+EIt$%Vv{$U>zxAY1>Kqvini$5VNgcf)Vc z)qES`Ofy-Qvpk!%#V}5^1&DJgsU-ou((0E7=|iL~A^udGNJ}X#5fz6>-pe3R2wnv> zZCjha97;C`abD1#X6(bsT{nrhGJefA&t(ZDbmuR8;~ux}_KkC&Xn{3DF@|Q)5$?8T zWQ8>O_U~>A<64@&s@fuQ6JUTKlCM7OI>I*(rP-w=zvtL+8~O0>Z*HL*GH(`SHd>qI z^1RFkWFAxL&X@OXCle~8F7$9s*eG;P=AVbT5u;xN;0b_%`%+{glejOXXJk!o6wRVx zk;c&S%I?30L1s8y@T>GiD*FZ%cg7m_F=Gj0RKA8~B0XaoVrTy>OnuhxXvA2@%L9#3OMv7o&BhI&OrBosqiL-c0U3xVHL{(q#>%eu zq)B8u8Hw=nB*q>l(za|T=_(SiO2$fa-ZoJ{lr4g*s)xuNU(U@kuEkkDA##q2SG1?W z%rnmwCe70vJHD#j!FsQZp2Bo&@DpeU_Bd^i$DL)okUw4tlvgj1Qtf+7o(bee0jIDV zt(eV{q+_za)B|uXXN9?2dsrqspWX^-U-vjE$-y!taj;of>@RZ^*FMnv?7395{t3tQ z4bFP^DTjNvzJx+MNaJ>#oE)ahWtpR80CY$+Gja&x;aSFX=A)6!Ngw*Y$nt&cdxI$g z9bGY*4DdhUZ#REINo4tkAtuF$gn4{A79ytL9yYjn)`nUK4@*2HHyNqnMN^jtyM0rt z%4DI&^ITi@yOXC>VDgqtg2VYYDwfD~X}OwJZUhsqslC0Q`5W5h#5Mdu=+kEIk?@qe zyQlSWwpgXZwQKMUawmL5iCPn=bt3YI?Ib!@?gTV=E#z9%ji;-sa@S4yycBnMUG{c< z*dH;|%Vh|TH0!bl!B`g-MXIcDgb*Nb`6lb49is7+TZLrY&_EaWwvpB3j}jM=j`|q} z*)l+Mt|yei!9$H710BjuLcC5b^~uUJp02h%{mgi}OpLz2 z$pw;I+`b;!2_Lw9r!tOwB@ZB#XXkSiigz=f6w+slT)4wh0I&Xz#lit1A0V^LnNue( zchug6542HeSv8Vop^k{n^U|A7d3Oa?38&n<{UImbq~B#FyOI7uWlde79JT8uK>i6P zrk^S6ms!%^`8`EhQ%gQmo+0$;pMfd}L4R`gr%r}{|32;LwdiyLLQDKes5$JY5$-Y* zSPv1pcCrPotj{Fh=|#0tDV-O9z%!H?k4(HAaAzqHZpsI!m#JxA}+0vcykYB$Z)-~5k)$q=dsU8z`v7F6p`T}>z zDk^Ztju55trVtUhoSR+cL2FXNJn)Owe8Ders;GmU-fh2Jg_HO!^4pCB4)K2Tq z*RjW*0<;-S{A!&zGzyRN`-joCXNR%eA6_wcrvEma@puPf86=;LMsOJ z25;HauvhVCM1Flp|4Vuk+%;b|-S`LDs(l?BYY%kVucE+Y7Bu!eMbF!;dvTE&f3(^ZgQXadq#3YC3lDk z7KprMI?r!%E8~DC!g^r8sYGzHsgSQqJ=8h!oFnfQ#kv#Tq_%}ihM%@3+#;@QQMS*q zblRaUwN9_^I*%vF4AZk^L zT9P@^_jW@mf84`ta=4xnCP)23T5}^@GVbAFDKFnZ`3cr_#eu9@OVIjoIpdh(q$?EZ zwvWp)he-bnet7P@B$$!>rrY;&x+8l()~W9qc0rVTt4Yb4K`pOaqrhB~6z1(^eYsqs zizcuenTzs%%L^7qN=a%@Ql({JHp&z}0aMF@o35o2f*en!@0d&)S+iKo`Bdo19^0`v znc}(!`Q0bpbjzkU!s$m@-*1n|x(}_c9XH}r*f|{f(p#+{mlw2NuwvVhpP&r6u^~Xu zW3%KHk0CG9RdPmBj(=s?$G>2BKR0tzT2KHf&#cZ0il}BD`y4m)Rnj`lDk-QXv77yRZ6DkckFTJJ zwJk9LcM^e3Qgu3~;KH?R8_ouucx_O_DAk};m?T09G=d4dtZk&p_P1_aCWQcn+5bYT zpVDfH^o2dT68Z!|aaop__CcQqkA)e8;W*@K5k}nL5q5*uup6W)1P?=6UGpX|iYcU~ zr{5OMdt;mxK@@=tdRvP0EUN&KBq_ptupXKvHTqh%o_O%wu|c*-5Im8z3-*n?t#f0h zjF5fg(pR+ZI;5TbbtC=3gJ3cpu5}+;c^KW-^=Wire^!Hr+~msmEtr@y`@QE|UP9C_ z8O}5?1Rc^F;4c)?(RJo8EWpgpgYZK3he!`5Q6P^)drJ@SLz=@d*A$L{oqicC#Pl&T zuTBz{cOneA^rXP174v4CxQFJC+uBct4Nu>i)nmxPEk$U&5jL& zwEby$Z}~2Hf0VT9^U-8rCVG>ydvy2Hk+LmfuK7SG#;L5a+KBW5{RF*s@I|jG6#B5> zjj}Qr9O01yX{-4-$dohGUlm?&EtnK4rbAU5De^(!_hxd+hh5 z_wb&yu4clXeOtdLJ@0JqN&n>6eWuH}IbH*!T4aPp^pF@@Buk{XJ=!Aa#CE znpYa-J!vE-ba_yEmqm8uLFs3mb@Sqzr%63H{Xyy5*O0w4JShFrQZm~0LFtiAl3dv+ z{XmywY7C9f*)mv*h7x`!bwADb43;d*txI(D@~HHa_-0E+uf$ShG0=If(!Lg#(S$Km zgt>dNEa$yUq$qG^LvC21t=3;>61kZUjdSxltrn`;Xw9FmiG&!({VnmPCUi_-tl>+U z8<^pkh}l<>DYN1E)O>(J8Ua5v4!wGTUvmG2GOsxBI5Bf@mAMM{%wkDJUDziOgy3!? zFN2EsmbQQs8zmJK0c3G+I<%KDPy0vBXGHUlx>En<@=MjzU&;cq>15EPCFfY1DDur9 zb#e`{-KFLa)x=I$VW#IdQ_s5ifk+ZM*UGX(Cw2~vOQJQgJ6;L1i;W6pCD`b?1%k#$ zd=XaO_HL0$QjKJ^Px8;;1Q{-vFOBUMvfd??60l}bSwp8~ z)}5bCo>}q6xmQySeEpuaPF&UDFObUiJQ%8OqlR`tB_&m}8u>Ak7=p@cR!>ImlRKYT ztY&_|NqPTf(_oPzBRmizMJCene_#-GDObZ=O6nemF4Rb&{*X>i-Kej5C|~7uOP&Pv zWv5u1?dYWDg6Kc}RS%QSTB+~Z@J<{4&W4RPe8q;A4Nuyzj~tEQ8)w5z8!onCg$*~_ z@E#jJZo?OB_-7mb&4y}(!5d@4F*dx!h6hI*_a|)lI~#5ZK-=GT8}78>UK<{^;oCO+ z)P_Aq8oUE-c##d~+iciQl<4J{kSj52tgHcYai+lE)#u)v0;He6%F zEjGNL9oBjiBINXMbHk@X|EE|5yhNU)KZ^J*^P$!z761#k^v|*JE1MX*oA6z1W+>{!b zZJ>3Hfq$wquzR?Nn~eRz_b+De=&u$Fl;JWPb+}KEI?VK4zSOdc^r~V{PDNRM zVP&OKD^#V*S7oX~74kPu6{r&aluAqs(&;>G!+d<I~r2=hN zq*J~^`&~|sD$(WfDrO@vtYzn|pforK+hN%=ElKUGqh7MffUaVd62v@9bw*8f1 z9|<)A_{CoV?)loi(2mndY+j9D+?~W*rel@#l=CMTO^9M#N-19_l#yJTRIk9cQk%u+ z^`yYB~umi}6!Pnw@Hl8jo!W*v`jP z1in(tLJdii*hozfdgh@{r&OsBD4zyi36# z6ez@>P-_`^brM54Ve@sai|jZ`fF`#>3&Cq#R^T&``i`0@v30~Zp*_Ac*Dt}=wcI6+ z0Nqnb_k7G!K2iq8#ZX#kCg~jaFR34a`~>Kh*q)C-ngaAYQw|E+>29bIpvOe|i$Hsm z($CYa#N3^nyZ(<+?obbl+zBi0jW9PawVj znflW;rUFg>ylzwp;O}UsQYzAGc<6VfzgG8nbYR&*|$~Lp~*B|pS zJ->pNpuck43^z@GPTSnqHaC23{Idt4zZ~1lj*j_k^FZ6Uxy|_J7^VK4wpk8h%6IsL zac8que;aKxo6!1eIBwjXwmHW(53|j=pBi_L@#!zcHnS_DKc{VGacVx>e9|_y{oRBY zwyAu_Y;(45`!XMpKA}jL(UsUqIhkHBRVDD}WQ3HKDlO8?D6`NlrG`i?F{y~O=ahnf zoc`mT7s^_&FVj9{&LN|b!65jq*EL`zzn4m|(_%>{oSC-{1AC;(>4NPN@R`r8-0BkW zuHaW@hJmku`XqlB;xpU+lU~o*+(gRdPv-5}^tfU_-nLQ1C9`?oIJ{0v%CEjx{oYt_dO3kGVkr~(*<>Unw0a#X$LpQzqupPPQgLiaEZdUoo4PK3(Shl1|CHq$`jf1KF8|B6&J> zCLP8s)G+Y|;t@PDiphv7{b@&jW?@s@$!_Dd$l8yqM^R6!Q@hx-Z0M=~M zFEjQ)9P@DRYL;|J`XpXi_egvJ{9+b-k`KWn>6Y;Dk=&Q8SaFH0+{{HY_BMnm)+RKd_}&eOq}NxmU{vYF7GmLC5g@S zmT2Ue-cnuguJVdvDevsOiv0F+E?ipS&8ui9Y-V1mHWIHQE(LzUt-vYxP^E;wNr6l7 zs9A+e6=Br8Jdd}c00+KV6~(p=x-9orRJNO-S7AYEVJD0EUSrBGE7iW{d2N{I5j+xJ z!YKSH{3zTty#hZ$!6BhxJ;Eb;M)rz|?(K+)?bEkk+&TT@2MioEc*wa!ox_HY7&+>^ z(PPfPAmPHXaCO2EhU-wt5PXFubf1T?13sT?guQP`As^c#h9?UoS3xs$6e_QSy z89%*Tm;X=KfS`5le@5!@KmHArpuqJ(9e=?=-|R0C{`B1cvo`;z1xQT&_zT1+rVf3K zE$8_k=h*n@?*E(Rw!>G9>d+fqP*6u*U>?10eNF9#?|gS--6r2H_20X7^KIY%!ImHX z=*L@s^3&V5-SM-Z-+9;Fzqse#U*5O1W4Jw0-`?mnXmCHHrV~fN=H>{~HYm|J(Wh-;V#kO#gp0AfMe` z56J)9`43~iQg+?~-w@1l)-CY;sGGSSb6`y>e!kbud}}xJ=5A)rZ+8j*{ch$TbTdC3 z+||E4Guk2PD1P0Na=1RjZeV@kaxC1|;r*@Ho!9xJc0hnx38>Cf}4q)?eb$nUu3A zJVITZn7A;99dxHtXE!2uc`lz)RpnKD5%}PhtB43d1b<@GUythQ?^Lg=CW4UfRDWlE zb-%DMV%V@@0|lL!Se;Y75#M7*C*>@xCOnbkNdYCk?V#nbqg4JWpPUGrgjstioAb>deaXmgX;KJyF5xPrg}s#U+IWPEVP$th}() zSy)w=@Ac#@Ezt`K+!vIJLEMX|AI`i|XI?oT3kV~t3<`go#?#@iqA;((SyWNBf)EDH zh+(o;c0mC*Wxoi>QGFeXHB8x3($!wQoHuw2D{d+-UFIy(2|LZbve4t{Z#?B&NsQwu zKZ#{LZo=gYeCbu?G+0xjro_OzVnrThN2v+rAlK+|l=EoORW2`FnuldcacSWt&QT@p z>)6xqtXy8~DXc8d%P(~16?qCPoTJBkD=Wq?EiN5jSbF2=K;Vvgpkwc-PZAp*iz~`X zR}_|d0{%PVDXdsgTuKp=8j6fcH}(c^nWxZ6-RM*;&z9(E(79{fU&3l%`16-4z4>Yr zXnvI`)4i+D`39=hvnuXOy~^10>V=GwrZ5-F3=3`!6WeRiU#V zr?*lFvta(Lv1X^Yvwt1)=noL6=9L1kbdD*!kshYF$XU3e+;h|U|2V#-R5iQv$s?h(@51)VEEU$dqHsl- z&Dt1lx31ys?aZl8w}XE;FKynfzy0aF4F?iuKAJIgXVjYX-vyD?)Jqo2cvrdjN-E(^ zi`kEtfv<9LW$}vglENh=cE7o}pt#brc;!Wt$CVeD4%Cq8tiOUgwr_;$TM(uCPVS}p z&UGA)Zs=A14#gzOco3sJ322E}#g*K{%m^$1oyCI%-4IYO0Vau4O0*sDBtaHJYs z;824n_f~@|;#<#Y>UX$LLyX2L@%0^s{FdQLMZRTl1`UW*13b}c0BIO7zn2;?8FNKk z!+^2TQ-5Ed1Ns$#jnnDi;Gq}d*GX{bpC^A$<5(by@pk6_$7da2= z7peM9cBp<6V_JJRMIDZ8h$s)w?U55JaqT4z53ryoaYd*BbK?$6ekE ztj<@s&R4+CR}3lPO0Y)>xYzg6jRTss6d#@(62|e zhtch(Q$3y-*VOlLY(t~)-9Y^_#Mot2P8r$#L5`t8xUP$V^sK*9 zsXwAB?DPy68lhq)!%L{>XrI!iWd!-UwjeaOu2yQxH66HO?S3c_*SsZ46{G6yxPtnG zsy>uopYQj|2^thhpAth}>07ABgTAkGNiImg)P+94{t=XUPt|`ukaFoiu`eye)QOSlR6~Qdsjj`9 zDYwHc05v^5^sfbW|2miS+jWIvRqwB-&#R%2vD5Yd=GmA(w#`BP=)Y(K{pLs0k433| z-;XH|l6E~ml6Fnord^wU9Q*~;$@%SlYeQ^o4;4$l7&}o$mX3Uc*CCk}^_#y4WudK( zgMOQ^{U#INT;doKrG|KV(Jw@*A=nSWe#pcDP5lqYHR$-sj|1E~e%PQ1#x1iKpzz}GE$A4JV1^7WMFH2(>aIx zHS{Tu&5g;?^?q)!UGL3U6ezC;w$V4BqU?O?yy_gA`ZVBN`o-_}YU+77ydkVSG&dwC zI8oXG-3o0oI(?|85A`aRdKjbnruP1RWNSoIkHeu2fiY108Ct|bix}m2u~)esJMB8& zpE}-mQtyiH;S$@!ISAKVIUb}8dk3rD6C)FYB7=pFiBfOn>kNb9p&N9KhpzF^6&jYC zI#@s*y!woFurc`S>vTo~;|;34PG8hZjhcKz$f%&AkTcb3CmYpY*GB3ak+zF!$2TlO z^_lOW59qD>ROpcJ~74Slp5IV0=7;!myp5+VG8cdzJwQ$!A2Ujf*npII)m{q*ALJk9LSE;b+ zJcahLb9jsUG-hu_1xxk7Vf2Wwg?YuES!EUTU=frQ+L%`0v$U{+(5Ypmm1QM`sh*0G zbe8tan$A(K%F5zpr8b87WgQ7n1wmkfiEMK=iSs>)Q?i!|=PMAY8W@aic3FY9q;M7t z#LM$mkWF=8$QXy>urpG&Fh1@}Bp zfg669@FpX~EPQOuAm#e7m?b5yf`STt9{(f= zSqoh`8Jcl?ZU==-T)00cCrN~iWyPhin$)Yo?!vrsDRZS>(t4M$P*l00Km{c_|E6-m zd`q`FV?n%->jpY-VR+*x?Iz-AiXM|<0)(#P+$_ddPt~rR_EZ5 zjLNjarQT)B3M+CTvs9h)Lg#u)t}G_Xypjc_@T3Y@^NC$nS=sg8@>#I0C4%%)k1%}V z#U(YboHHp>3q6HZ9yLnrOwjZy^@+l3VMS_1u?NO*$vl`jvaO+#L$V6NmgP~I^QR>%H znpeWw()oW``!TJb%@K`1NBpZ&(YsO^i!YTBSEOf)K8ms;mBj_Rjk1%Y#)o93X6Kbt zPpL!X?CFrXq)VErQmZ8WrcN4isV@YpI7)3(9&r~_pqi>>x?f7~U<@0)l?&Bd67ozA zYJjA#YY#!obcO|*{`|7`{y_c8^cy*a6?%`MG@trHIZ{b~Dp=+h=U;E9bibxWmmUye zSBtNCH&t@@N;YU*l{zoz*!G)OQpm}vTkU>E92TlSnKGajDRrmDXm^s(^1)7Kl8=uq zLXS@U(Y2JUw{p3ln&~YnqRGO# z*XC5)O!uk7%(d<3*--i{!G9G>;x0i6o)su3icU@oJ7!X%(=YiD|J5i-^Ew-@2TERQ zP~u*T5NqqOA#NT5m$>mD~_5aU?|5xMho}TXJ?(zTsYDP#%``9Zq$hphh+xYK-|601nob@yDI?ww3 zYt!{Vh5hV@4^0Zre)#QwDuw_0c+Oe{>{;SjtAO)gpSJ&n82*n}iPnqF{68o-REB+Z z4-<&o^*5~_W|Q)lZyL>A_ZqnF=S}*`S<0Gf4Y%We_b*=ih12%m9jrTLY*K9a$T#%w zvi(1b|3i1bbN4{??%meiY-o1-+VQWsONW@lglEoc-+Ildmb`Y|YZJTqX1?&!u|GF` zuGEAzCM2Sh{HdLMl?NMol-O{&4GV0TYs1AhTx7!>8@g?nV#7omI&Ij`h7mRlwIRp0 zQ)J9M8DwCa4L`MEs|`P}p=HB&Y}jPOKiTk@4G-I}!G;gp@O~Qx@ZV#bx7l!u4L91b z+J@ye%(dYn8_u_(+lGlYblR{d6VlFef_U3L#)c6#R5ol=h7PSZv}}0HhK)AdX~R2h zxY34HHq5o*A{*w|&~3vM8z$K>(S~De=(J(H4LP5$%PGQ!%7(3eGmam#VWSOq+Ax5B zyKUZT!;Lm9w_&ag-8M|L;Yb?}wqb+~n@*W{8*SK`#+|D5f4g?%bVG-;A^zWX7dm_$ zEt+PYCHJX0S3Rk+svj@oz++Iat2D0NTL+Pw}|MVWLix1o$b z@~O+hWNG`~|1m3j4)qQXCm#g`)DC%2nT5QopHdgHXPX8b8>dtQ_KCpT zQAy~xi5;pOKLY>OA6@|ZR^Z72O10rfU=~;4Sd?x?**PfZNyI-aDtO{d0dd14E&3&e+O7O9L_9$?gzez z5}ZeYu_NHU4u{ebtQB>e)Ho@Z!P4ZMDgQh&lv3Ggvg zXg~4=d>a*m{vF_;1b7GN2Lqo*C8FO8d<(Tr`~WjAH0j9#_8M#AiURJT;xrAwKXCAP zrE&!i@S;S{Jj4g7B;bY#@HnvF2>c~VaBc@)&6KBLaFALIdnu`DTWTAz%?kLXEpFWR6KeMxb9-^`J=A|{s<*B*$RA{gJ=cV%NdThE`fK0 z9(h~}*;<;m0{@N@|DOUEPP1tath4oPz?WxGri48P9Pc8{=#zjoGr@(v7WfEC@azPR zPQ@Pji~-I;j^jR*hc_Ip(H(vfSWQ1i~T*oS5Z>;-U0UH zjHCF80`5j_!Ovcx`!a)5UW8VM_%Ap_Nwb(>p{akib(QgL6gc3YQffvBM6a9t2eJH`%2%JCP z&_`g}mG~j7z*DHL@&fHb&gY;OLqmaKoKbuN`v~BB*C4Y3J@VUB%wmH->aLZD5N2wk zmn7g1QCn#vhk@r7z?%W56ZqRg+9~=5;IE7DkN$q(sbwZ@T-H$|%9Qe8FYl4gC?{U@ zDZnC>;9m~>2qkT>6}YF8yyIst@M@2-Ukpt4LI>=p0V`2b?jGPXC=Y#CBXH@B^d|$! zFYw8A)KBu*0Gzts;F$*8h?1}ZJvGn=Kh?nPwMs2VFL2rhleR^`A>U#54|^wY!FLVa z76IQtNu6&3Zrfq`Tw8&EL`i;;zo$O6^#b?$3?6~gZ!vgMfaUe3 zEeo7+tLgVrfER6+afNaLUU-}7lLfwsiX!h8u;}}=LG;UkEw=sx;0-@8_8#C#l+a4x zFSpRH(98R5IopUEy};pjP%qJs1YU`fdQuDAi;}!F0sGy>nI`-Q%tncQIWYci#zpJ} zI`1J2dV%+%geKd8EAKV>D&S6(gcZ1cJNda4c$tB$xl(Au%8Azf|B-r6!=&JV&ZM~e8mNUL$FK_`$ z(l1cXaf-b_pRJd(oWHU40{7Z__3!VWra-6;5u!qXV`!4Sf#tw>;6@-of5u<9Ubozd zeK58=ff9~pRW0roFbs&N>K*`wtLktdhoP$h`ZIWf^vy^28SI1bm3szz30x(P_7}h- z#*JsO-+C7N?Psyyc^3P|v)CUyi@kLQd*O4nVIT2*#wdvQj>&*(-NJko`+zzAN3@fO z4s*lL7{?%Lz?rEWb~&Aqh!D_7D*V?5;l=wx-&$(1Wttr8C(`465vv%Ee*K*we%=5$MEby1 z#7h#A{?FgUbX+{>^shg;>EOwO#|4L&Pt9GNfrpbN;Kv;H#DRY2Z##I1EEEZSB98rb zU0)#pUz?b}+AuLT>);`L+=6%T|LUg`l8gs!ZhQXFJ;U!msQrpN;XZIp^S2Q^O8Y-_ z@P%K@KiGEiP<4Ztp^yKo1y8k|)Xw4``ZjNC^J`~Ke?egxXYsG)mLD_D8oy4PAQyZa z?XN)_)ybg^YnwutCyfAAVTZ@mF4XMZNp(yY2P7 zT#g6qpby>gSh&>mZ}V94qeV}twNHKYRMGWiYAr=n^pxMf_NkU7)P(ET{_V3RkD^)o zvv+wr;LD=b2i{$B{9o9&|>Arrn%5bJUerUa79S>MC{Zwb!aO1+&z$Wy{oc*IlPptXQEc zDv(h}|FL@YYIT=)hWgFT)73+3l2y&Jbal)1scK7^OWj_PqJF>b67}2a4E57>OVwjr z%hkSHFH?tqalIPzq+eaQ$FC;r^Q#$q{c6gyel_g{zgqmfU!@*}ZT6a9&3V(WDp3pG z_N#0D>R0(qezo)izgo9$ovN#=Q@7oAoBHvOf2@A;lb@(<+qS7Y@4Qppd+)uve0S{F zp&ohU5#5(P@x&AArKfkO^&k7yBdvb*%rnoZ0|ySM=bwLG9XWDD9X)zfz4qE`>Ww$v zP#?W}Ouh7pU%mC#Te@B}H#e(KKYCyN<#WGkZEaO2PMpwnMaUXFo;6wyXK<)A5u2IM z?V$3|*n789PyKz=bpHf(jem~1$$x{|>c34r;(tIL^&biJr>Y;}hvzW9ma}%+%$j@$ z=Vb`Ltd+46Cf+8(ZzKHg2;V^X7YYAPr|{q13Mkzo(V?JmHTK z{?CN}3*nmy{}JJjcM3oLJk}R3>iRXz(LBtJzsH{3ui&FRO(T3UR{4)jQ2saODE~V* zDF6GnDSzt&%76Swd-})sBm8i}CldZr!e->^;jZ+lSrA81tmBX4#J z?ge{(FSKhwu*({z<~`Cp>Z9_9w!>OZe9I@E0QG;W983gWzH=^Vd0euH0~xXrIVf55N4JmPN;KZx*S2|t7Ia|xeM_!|kok?=o> z^~3-3tB2?K)t(#t>dy)li15P*e;(m4B>bhZezjkT(|kvQxEvnYezc5ckLRMn6I;CYU)haOjnw=%DQ08sFA~mpEtYRgKK7HMn+m% zX6lR?uCyg%$BZ65YUJ$MBbL}6(lT)7KLbr#+LDCx#l!5`PTM^*J2gFX2I$jMT{C97 zmRu+vMvWRi%y!SnPH|8rD|B`Wd5DX)S4|9$n zkr{$NGc#jG=8_?O2gKu!hcUK?^Og{PhD#8nW-b}jx94C0=eo}H1InVp_Jw2KGaM_-`v&&*ECOwUfso^|fPI6Der zSaSZDv03C_@Tcl10#sWvEuJKZ3HoXL6OywbadvuUw$6l3V}Smoe@WVe6iGs6cJ`8i zvu5?}+m}qVyDzz@$C8xs=|pik?&r>$rE@vB-96P2=1A(Dn4X!I4V7mN)wvup%dQ?X zE^)aghB(3!XDrEHlAV#BZBj`WV!n*j$um>OhXzGnZaWCAGScX-Z1*Ko$H(;S5fl{b zCWVs3?93Tdqz-r2#ZwX|^$dyVlYwLEOzQIF$*HLw?n{=;bX}3$J3Q;ZqA+XQ_vZ%OS*=peRTb@yCA23^*5|- zb5zf0Vsg=dsy6DsGM`%uj_%5Trny|Tn$c}O_x1CXzY+r@w;Q3QR5j9bK(ilV7vK3!e2!A6vAf` z{u;vHK=|(x{tm)FNcaPUf3tm@`S&~p^8I_B@_%xkGEkXs;J|@2BJM;Fkl%svqsEUP ze}U+n0|&+r9CpFbnBKk5Wj;J$_?S_nMvodF8{;@X8uP$mBSw$LZ*0ua@d@J-)ZpP4 zj2S;9a(pZvdPhf}J9yZrG2?qhjyc!1a5~3aFg_w8Y7AliUwdaBU3HP=@z81m+BS?c zw!zku5Nx&_1Vto3AOWJ{(vlv#5s_|*7-bECu#P}jqNrd1mlko!rUW&44^RO`3E;*+ zw?uHkjl@0TuqaC-(%kueDzD-rgb;!~Xa2CxxvBSi@As>^d)>OX-b|8+ ze@3H5r#C+Bv|qJp(&XGze|c`(^Ur8>I&ZXZ8g+KV1`T6$Z~OM=H$IK=e-rtOf7jI+ zElzLTI9B_B=D+*xDd*`^J#xOTHGk}R|Iw;NZ2R`Ht%SekZyOtXL2PXESV!M^YSC)V zo4d=1%qGfDH`I-al^rxtUsL0Ke-HQTxriv26O2%J9x+JJAR=0SPpbVwPb*@NP{dvZ zr|C5_|6jCYQD58K;CqJP?5L=y=IVh91T7mkZmb=UevZm)cOle0;n#AL+ZViZG6LS59sx!aroq!hBZCmMvSThgYPR>(U}`yz$0_OVxDq zZ!@JR%Y6N8=s2?(;oceii(P_Me8S^Fk*1?MPN(ec260|)h53um42Zzg_kk_}$M z7@a$JZV7(E%i+Ia!v<51)P$d{T)EQWtsIhl`Q?{ZT3Tw#DY*N1Mlk~Kf39b8mM&d7 zWyOjWQxx`HHgo38zUk@dN!i)i$%?DNt&Je|oO90UsNBYYi!Z(y-bE%QCADT;y*?rQ z_w3nYie=`vXwjmRc$mF?`*u@Kw~Ei3Hf^%^-+$lXDfu|ukxhAdxqbNIhwd7hJSgUI zucdQ)zy0>x1Jb)6G-k!Yg9q)q@4nmf&O7hC@Y!ddm1(Z;c}8^JFMI1G9I|=#MDbTV zWtyuBz~2LW^?*z~fIqyV_piAIJRS7l<3Tu^2g%$#`1gEYAN*f=<&`;-V~lhn3tHB# zTjyv%Ka_7WWS~5g(-&~WCS=2|-?C+k0oVrepvOM29iG{^aigOF8Or_*IVe|83b(51 z`Uky#h|gui7mJ3v+HbS{`}docA*cUwad9otV*nW_Z)U4jtuo2n6f-*;Mh3`4c{K;% zzJC3B!&bI#-RfRL13mzK!%mP9xGmplmimEN!kcE7{I^;A*UVzqnq9cY>_0b{J^h8* zzWw{R$X2lbx-^IX>eZ{~UvR+%ofN}o%U_!0;b_3;AOrXcJ;(ywd5!$HZQJI6*YF&E zgD<)OE#M9R(b0VUKhLCh^{=Kkn{`tPzO!lu9oLJ7SIydrhL$gz#k^>i{gG+|hYmej z7vy!1!(YDMJb=FkFALw-$4;;V^yT_(W>;+0S^0Owe`t^lF5PH$v1mwpPxX#N%6GqI z)?u|%tKD_QUwKk=c}~ZU9b=>mSF}qeYTqXU#T>OTH?xkj3{$5E#2ib!1=~bQm3)%7XK3*D3=Q6%@ky;$IsE@o9e?bM z^+j=36+nZB>U4Np38#bC&_G*}*~OMk?rMSm>Sj+(6b<9M+rHh~?LC<@G~6T_RAaO2 z!|WNKggy6^E#Q;l_mB4D}6l0*3Rr~FHIK>vV~_wLoj5|_@umXJ?ybDJ#0aGf<2IyXmdyOwArHJ zPSG$!G)xfM{TtH^Ph+8leG)&wK=`5WM-VL3fVJ0$=mZ2 z@=4I}NQj2}q(|Aqd)nPYD`@~x7h@>izDDqv{MBKzjn#CY%Vx-2>+gJ>W4J0UEo}q1 zVvpFs)TvV)4dMD#otEk{;ToTSEgY}C_iCUj#=xHM4cT+G=W30Az#rN7>C*=}*i%nE zl8s!IU{P^)zG}J~%Z88BLeA09Hq~qDMXrR@=>zdwb2A_1+X03duwQAMMZo26v z)7cCouFJ^Cu(4yu+MGFaoLwvBP))SJd)5Yg6|oTUDEk2#_PlA)I6HJu`;CI} zZha1qF&+-t^E}xCttMpsd&*TbQLO(*T|4~SwQF~&j`pPKUk84pINHe}KR@64_U&sr zTV(g%d#|acWDh*>fWwFVJ^Y3S)&kZE^a@}P0}c37^pLd>9=$p{$u<{)|9;!>#P}a$ z4A}xP2KJ0kS~&6dpnu%`mvVo1s}wpN{gJNE*S^1#&cPJPhE1QD{^yFxCXDN=ufE#F zJvtBL{3p1BD>8xx54;Dz(LMG##CFI6d%&ihJxdO(&)%N#N#XYVw-q_Wfsc4z*VcFG z(&Yi2>2Y}w<__7i>5QW3Op+<5Wo_EDF~!yn7w{n72nT5J;OU@eJOG{YW8+)@{@Bg- z(jAFfpDSYw*5_xY^tKiE-)0|fTyFdK?b{-G*E#>7vy_&Vm9Z;Hh(?4zOuYL)*4(O=s7f99T2Zd14<=2l#?NIuD)f4d}54Yy^Ao zGNDHYiB0_4!`_?yv-IVJ@}Jli`Y&C|(|NJCu~SvVZSv&FP7ct3UsZ0|`uFee-bV(| z-~k%^zLz~EF*bS+p7iJtw0ZsFePSwNZuye?lzX~V=M3kvho}$!=skcgk#B}3a3kle zvv*4L*7vK;b=%nNwI6LxyI?1YVr<$cn!~?1-!8X{15N5 zM?imwwM%3N*Z?-cxcFem2YChC;>e5{N;B}Dr$MY3@%F4kZ=35 z*2u}ieVyK$C8Vi))U|%o419@y@c**MY_734dT>GR_yy^yizQSialTcy?$$Sa4f>7F zfj@SDT_O|o1R0Re;&b14&A7-2d9a>~-Y11Oev>+3U7N$->nVM>4nuN@B>x&+U$A^D62!lOR8SK%M7|M-Y-dDJ8m z=px5HaNt1Gxm>5;p6B5`_n}MZI`6XvfV;1cXpf|C=G7Z_hd*=p{jb)ZZ1j>f2s*Gq z_=Nw!*RdXj%LLvoU%uQHE?nsJ8Gd_!ZgdCRA#UOtonbuI0{P5B{ggs|`3~;1X5bUP zE`q-YXz);*Oc+CFqTM*?7|%c(_@Y}S@}1D)aaVl0sGj;>iS>_vUH(V*<@Uc?zq6nP z{?mIp=sg|u@D%@oEda=d_mBg=6FWs__#$cv)S#dRzH5&9_?aIuKJt~r-|N3(g_iIM zs7)rs_ryQYMO_X+x9DGg{dMPe;Q{uFzJot@Abos7)1R!)gj3KAe){~U{6tm$2O3yA ziC^%4=mF~yYbQKr&k6651F?XY1K0R`d@X)VdkR$$)7b{pQK z>s)gWvOwqIGc=;>(xbzQ5h^4r)>Y0}oXFY)e#dKP=?2aq{40SuIQzgkjgxLRO^Zv( zgb9Zt8rtE62@}fo{hZyEyv{Tbvz@iK8!ekYfIm~rxljJ~Ypn(U zBfs>4;`4mv$%ZKgPSX7s31Sp)?7B@g4(ep&LKBt0rRGh&`0YJro0OH)_mOBjb^o#2 z`SRffn)3ku6CcTb2^;`l!wALvhvirI$med6-+YmQshLu5q|QZsg`7C`p?CJ0m5TN{ z)Ow@v)5a<|m`sFgjpJN(lc zUsJ>i*9SL0`$1v^02~1PI{;5uzjl1_ffdf|=jsyV!)Z6~P`zt=W!>~T;XvJ&GZ5tV zsrh<+q~1%NF<$*UN9tr0Yl`--DT;IZfrrNh`4a7#I<)<%s7eWXT3t&=+84YCon^&y!=v5qV6lBVz94P$KvJPyPh@PybpFtxX< z^--T8k4R%~fZ8kdV`_fk`p8)pYBbdPs4=0Bu`jzv_xt&YgM59Fb(J{H$8R1No*=JG zF0erPOlrRRE}c!6jfLZYKK84ok2=5aY=W~i=wr1yT@>@Ho|2-xLcef4m>WH(r%`XC zMnb)iI@R)r(vMp++21lTl-$wn2@I`qJdVmGIXYLk%39KC15OYu}6)K0iJHAhrR*@chyCK2qnRzCx|h)wn|QPr2oCrgApn^|8D7pjIV+Vl&ktQuMvc ze)t0R`^4wa4KDD2esjT4S2v_yMeUZFA+_h6P`wbFpguyaaGGjVo(D`8?xU&Qs#WPf zwx#d(rpf;g!xr&7>)!I@1 zkNIcMo}KdexW!~dfT@B>|BZg8Pt6FWbB+je~Vu56;3KFTK0M_Nr2d;MoW zPM(9DE<9#`C0lg+Eo>8ujXpjy^#-P|as8KX zCEku=e$^sANk|~7o8W5G`b`D9=bn4q{tle*i`W5pzyst1Z}wDtU~lFPw-;vibY}s) zKITul+?G9532ZMJGDgW68fI0k$(k;(W6H@zT*#A2N~Pz z0CV9Nysc`TIHbDFZPMio#Yl%WDQBLJx2KANSK|G=Aw!0|PK}2gy}s~o$b$Ns)@3&j z@c?{het?*a7|r)us}72vw`;5%)hl*rZngr)Yfk^LLB=AsgWu$G(Lr+Q)HSdV@btMW zWPo4bIdFj&_-%Y9c$Sou%+`kesN?+Vzp*Iw&z z0|$V6umSEvZ-|rd7o1B}E<8`;vR9}}bN(0qqjU7b7_Uq@dDeV<4z&gSW`V0QV;A5@ zgAYE(OT0`?g}7ZbJgQ0SIyd;a`Mo~FR{%T!=3_n5ZzMS1z*$vjN9T|iyoPRkvT`qr zPH=8FKl8}fIR9T09zF)vcMeS7cXYX8;zDvx=;KMu?dFGGzy6|2(94(rJ`bD2wxJUp z{{MA<(}a%7@*pG030PxA9$*ru78u z>v;a{n0OtE(syzCQ6S033|^%rd|U!t%l!VnRe9ocB3PX z)pS;iv1@G7$KE+PInSv^vtK@Hr_P1kw`kF#Bm9nP0J}8CsHdNP+P$xPPAw=XxKjD- z)y2idPM&@ZL(cN)?}krCJx%AI$+P~TG0LTXd$B|I#^`H6dywlC*Kw{fL3^u5v=3BU z;m6=!beb5>$1~oh@MSk?-^8AY9KvRWHJ9jIr<#wCBd8xR7q*690?=2UrKM=EJ280^K_dy$J^-^ac)PWw)B)WlTajo+fNhhY!(?1Q6?F~Zw7 za`vUyzJa~dl+-KS9M_eZE!MtP-}AQ2%uIJigt{8CL|;7r-Oc(_ zx^{_+`=@B{6KW9qJp9wT;QSUfInEF8tk=1vQ+wF<@-2>^?4j-$>gM0;^#|R<*W-7P zrM|oFc#5w^mfP0l+p-x~xbxhPO}yGRyjaNe&->@~-4z$B;lI!u{5CNc^1z>lj9K#H8qnBS)lV zbdMP~Car76;326aQ!?6(96ET+sEkp!j%_!1)X1(W86z(oe^E^I$dt69x29(J|J~R< z=AsKb#Pm4x^yujLv17(%xc~B4$I&`gKBp%$QU{OIKa8B@#)(#oACo$IoMuVAC3(!y z@%lf3x20xOeHi}nWfS!%|3vee)bXh!qDSzzdrV5km1*Ng4Nn~t6FqKd&%uNBPgA?c z+?p~XBQ>T+eEX`gk9@dl{IENYnmxY#5xB;;uOeEH$G7+V?2+6vxo1++mDgU;zkle( z&(}X4KlBqn5hS(C_1{x==O4&#S`b-qSHZl3#YHQN))#Fpswg^8)TlVJxOH({ai8M; z#Y2iG7T;C8pm=fd%Hs9KTZ=1-4;1smj-?tSI=4e^ZsFp>C50;s*A%WVEG^txSYB9B z7+ussPbcd6WQ{OLW29@8X&PsqM#|M#OElUVjaRA>%Qfb1Mh!FyGz~-sq64i19RhKI z#6X`wa-e@;P+&+PJuopaEwCVv8(17z5?C2n6IdT84QvgR2Py))0|x>T!A8NR!N_2A zuywFQFfN!F>=R55_74sU4hg0QCkCel?+VTfE(qoZ7YCOFR|eMv*9S|3TZ84nil7Kd z)bIYP>z_L@cR}vT+^xBhc^&fN@)Gm<N-GUBf)zD! zCoRKvTCCc7THD&|v8VRfp0->qBm@X|0^WkC;C+t+8Wocu!hXNc+A|?wdp_s)|I0^b zulwa$&w6g_St~U+FLk+HE>|A^+qTQKg0K9mR=@xIk45&7(W{2I{yuQ~nJaRl+t0jy z&Nt`#=hff)jru#j?XSJ#JKwoC=D+i9e|`Kr{%?NAADVWZ|J(Q8b@v5@g@Z~nO?QmY zpLpWFv)Z%&=U1+2f0Fo*(#iIJsPCigAE@t&_FwS*#gKorKgRco`_69Ps?rx{%D<5L zu2$c#f3tRuw3(g3^sviy*Y^jw;%6V7l}+n%jd2am9prMoM9P0VsZE#jEmGm?9QjB% z*X8oa5C5`Xl?c$1?p$)J8?%)%bt&mIlKn{COo{|u3(v@LO_0FS9M|ur^KHm+y~I%Z z{&nTJ?qUGdpSfJ8_a*)x0$ncGCTFPsvhW45yBEgDS^pwGG9a0|EPlU#ewS$o1V8u=eYEW^?IVIw49Wvxn-3=JCdAS ztS6(T<)P#xyTaBJp;Etf>6uhX7IuFLHStyMm-?MF@rN3kXl{w0r#J77U9Bg5M=7A2 zTWw!~lu3A+GX(~##2@T)xzb~!NzX@8EO~utd2nTsE5}u_xjj@me#Kyyt1hvq)NgmJ zlm)kams5UQ+qVC8E{vFg`1;L-l>c=u@oS~?!gJMJ=F){Tm)+5m<}xxnmue}K@ccDX zz?sYHH#2kj`u}Y%_fVd>=!sdSUOf>jExJ)R4){&ak&Eco{6aTBsn{DeH%F6`zSP!q zM9j_BFW7QXa})55m6)CvRkzy*y(Trrj^fF8`d?u~e+L5xO zy8B4#2Vli&$WWfS)oMS*>6cC+6i1pFUDxq`Z_4x=GTS2NtGc{bY&iUh0({V+7Xyn#-l8VTQXDI4WA);RAYE zFLQnG3}>!Ub0d8+Gb=!!PDf8V9Z4@2&`VHT9(L6QJU=5j?x``~OV>$j$)76t?PeY? z0YB^Uue6vNk!^AE2}9rWrEOo6oKoYMlfi4nDYrfphwJig0}~63*H)>b!*$UZ4R!^xIqxL9714zlDzQ( z!KT^PkKt%~^8B9);;?4t2UiN^V92`pO2uX=GhR>3WheWZ_PSinEm~6(;9M)aI{hGs z_lLt$|N7E7LTF}M?=Vl@l&DG6?6kU1rPki~*Ht`S>NFoUzuNpb)qH$Zh3tjW*(~WT zG;LiCm>5`mW7?xSRqa?W6iPR91P$rg30=^XB*|X5kHbj;ncd%v-VB_AQ~S71BJV#2j6#Z!X)6?OVBr_L9C)6g4+lw^O)cx2)ql z7{(lH@-&xgWw&kHfNb6zIxV*7eC`21b$U}uR^+3MIjOM9E=Q^Efu>%iKt+E zwA8;+1TWjSi#k!tFwOfIT-0o@*lf-1wQVyb7=C@}OjaY|x%sLb3O`L@!Oq#X?{FqK z)7Sz$=4WHFPo~>GL*hx_B4@fOX)Y@1r;?uCtFq@nnpkP^jnMlWgu&?Mht&EGwG=)l zS$)WSa1D4vilVq7ZTVDh9cWlqXB-|A8y7TRv3@NZuq8f{x))2`FbE$hXW)8rL9w=ch;%trI=h6< z6cW;-+o6}2QimE=jubaG=4Of)NO6xdHcL0(tP5406&tB7A1vty;Rv)aNH^MY$ru~| zAd~Tu%7}UELW!}GDeS<1B+CPGWqxXWa1bHTN%mTuapjo!Idw*0j5D4>3Nd^c(sv{~ z+mg|qE5l=!6_g0BfIX<$KZY#BF7wwJ51%n6Hu88wmqYD43t`40EJ3 zp4OO=wtSOS>?9V*xV7c(Iwts@p174xpx?SV7nC+P3XKus;)i(8x*a(H(l8S#V;;z` zu=qIdPd-~I+obWpGx;)1&puz4jw~G@n7i|3i1ZkyP*+tM^CYJoOXq9Lcj`tLC0p0izuqNlB2h;@tp6Dp!74QX6Aj|sU8bj}~qP*oVy8mb1x2I+RI9@td>QQFNupg!_K(x=gc ztoYBVT)p^mMJ~&ZM9ns4vNCnlbiX3eFhB0b$hZ2o)WB|3j(!k9$P?v}; znyx1yt94Z@M+_8a5nr-yfGB_p19fnvuIlo*1#XR1GwAxkoXvhZ3;fE!4M05&Qz zPBa1Mx2|Qc3&o2-s}ygy9zYs{CV%x`U7a>sBq1sU3hy{2#}yx{x3(75^|ab{JomFU zy>)X@YR^b0dWQdJNcjvA!F1^@Z0>iog>c2ept(UuH+r&#MHylJY#dzAHJrAsvk6wT zq#6mUGP_lo*y}_fjORMB9oApYl!12&FPtv>xzM^nwZT%l(rYPsL41rgxvyD(CvbtVOd8dWk0ASxn6}95;ohA{Z=%PfY>f7kRYXk z&XKIG)|;7cJ#7fxlDVY9(x4vLGXH#~Fe+V9t@|F`RMXFuv9)>iz`pu}U(x$iaS_H* zEB8n%BY?%Jx;Ypy$8zmm*_x^TH8b+Q)0Hvt;_2){b59IgK;hYht#4hZ$c$GeKU@-? zynq2GeLvnUpTb%`)B;u}Y^OxJWOtNRQwd;(ZFYMPc&e~UWl5X2}X?9oo{(xpQbaG^v_t5(SpLsLKh!vxl(F< zr#nf7lJq;0mWG?(jcE>a=8Z)tY<@R>R=a1{nGR5#j2p=aLfP7&XMAnnAGQlxvIO&F zM=u0dtFsy-yIK}&cd8B%e4B(>ww%;VVxpa(8|0*>s;q5FKqtvum#UH!XRolgUcC^M z+iJ}NYpB1{2H?_&b*fWOu=jFBH=<@M@R@fZ7=h;0%c#J*5!O%rvSgjM@B5@6u3SkR zYT;0a?4Cr1uZEi-|6A^IRbFV{X;mb|eAe~S1eiD2x|$Foc6Gulrj--hU|Ver7E^F{ z{9$X4Y}~};BHdit;*uacZSe{fn#u$BiX}USN$Xu+770!}k1FicnR&6tc$wl3&h1~csLzT(hIJr0n0j((aGwtD={$uQu z|K=e7&BFk+&>y@Wa$Ak$9|1>|wJB(>uMw=?A_Il`j=|1&a{{1^nTv+F|i4^|Bsq`RQM)GmZr72l0FJg1kDT%`c*h(W{brRZ@#z zBpTh`9;>cHcL>x4I%6Btmmt`Stm3y`y#m=|xuzo8@=mLrxDu^1wFXHokJQ?Rkf|+i zD{Bo^qQ4>cuuA2|uLW*L1vjUQSe#)wNH=p7md=9d0D|!qFr3{{b5E7$=JSE@0$>pP zUS|GGIy?W8%>1c~F5b-iqh+s6)|MBXijJgaby&@+)sKXGN}chAO8Y{kt@B5Wb-59H zQ;achmN9RMt=E>X)0S^8+XUiDlc=E93;^l0f1*uLXtr^9|AIx1>7seFu7wYS?v3Yx zD6Ev@!5WnI;mn5DdId+3`oF>Vvs6;uw5c@eIeZv0TBr&AeL zTH&=b#NH@Krzht^Kohs}f4ovpJXnp5Q3vnu9LRJkHt2~ko4vb6@bc4)Brx3Cj#V)$ z3EV_DbuXmaT04Om1vb_XKt-xZzZNmWE>j-{jIR$O6e63g5{e#Dw3r{ibpaKkwflj< zmDcy9Nx&t-#dipsuGHz27NtrMwUFPN7l5=a{yL!t{}7vlQu#hs7$k;37SVK`+p{V359|i}L)_ zbYp*)HJ;JwW&1^EfWz3abK3K_ZG%OgYJDg~8;TBqwRYDVZ^%|?FG{;3s5Z@ZyvX|V zY1xHKT}XQZi3|t;NCpa6G!z%I#zSjp=@jq+`<$S_eF$=9XS%?;n|3ll(Ua4<8mpwQ zxW{@7!;FZ!H7wC~YnmumCM#&Nf+j0yvVzIGi^Nul^{h`ssYbUF%b7zeI;@?vB9zwe z$jsIUOsioLHkW_3Y2hUf4@o`8j5xQD^9m5Ck^_nHk;LS#h*4{~tXuL080#x#KeKQA z*eCmJ+enmR*fu{AbIcsw+)`s6t`ULxQ$2Bg={&*LQ8l28uco;>ezrAdRNsdG9GTle zabaryKBk6oP&Z#FZD6fsg@&-s#wI(`b0`|vbl*9;ami*X?g&5B=kKoA1*J`bBaqJhoY4?bjMQ4>W5{hT>lbFZSga~61m=Ef*{b&g(U z={aPJd5)jiQFoVKwkh>%RgL_x*%}F0^>f02#m_VXAKr&CWnI|(G}!Y=dZ2D@2$`Qp zdb&bopQZ;%Fz{hmoAN2m3r627de5#f>^jq3#C!$5``eHpoMZGgdhOUfSZ>R#)O}1y zDii=GNrpxB2Nx@Vz#by@Mszm?5mCJ6$Wl_~U}~QtmjJx558%Qxtlyxnv~%Li zZoHHt#0Eys!Op!@M*A{8KT7)S`BBq0=c^9lpDN4#tjPeQFtue7SuhX#$TGawW2mQCz zk>^$N5WHF_*=u!yO>t3-!YhOj5}S`y;+Z)-hs@2|@;p6#)=DxEe-Lbh)s~0MR@>LU zUQ9Af*rP2cLtEaeE#Ep;IF+bXif@K1_STpkC~LqaKEgVm*=Bge7gbg=lm9{PfF+40YkEk+I^i=wzWl3rq<1h|w{(E=*eo&@)Gg@uE*@<3y-6U3PN4 zoPSj>uIkak$oS5**!MGYQ2b@*aStMwLW9BnO)5-3wN8>75A+3QanDWY`)jrnBqLr zWd^X6JYJ4{>*KO}in`aiV-tjpFq+n0kMY*%h?&=--?MpUcgX8)i1|duOAl(O92C#B zH|TbY9&p!x0--w1+>q)3x=p(meq#Ndp*f>W-3%&puS1`Co=h2GJip>#>NiBn9w@3Y z57d~4+z)sot;ak;o8Q-a5>lXNNC-h5fX`l}iJ?3x;-2F80O-OJUfa*&B1450vUj z&tr(`SJS)dIS>7_y{so0x|AJo+=MCiOYmP%UyPVo2{QB@2^J*J=)Zf|FIj_!&-&xA zEGVqY2(n=5QC2UUZK>?Sd`1QbCG=n+qfvH9)zoeR+=!X1l? zeGrcMy~pD7tQV+dRF2V_AEhDdzlkM^Qwsc1DBp>33N_Wf&PEelol%?>B?RL9LG_K(7{7T-aky#k{eyzWJ70zpw-l#G1-sjFV#E0L#)bs7 zRqqU{&u^bxD%(~n4gH!_YFC{5Ot2Q5!UVb@8HQPlu?204DPTvI%_+t^88iD5+vM@h z88ka(z=u!Rq4|9Sx1NCI$>`5ViyLGd$%%Q4Bf0T6ES=NIrP!B6F5PK;B%8KVLYqi; zPEEhsH^!B$|AaB|TN9zQx>@pB5$c5biPmI*6vC}5^s15_B*x;_l*B9VAdW{w$#SX7z^2O9yGo9S4qq#c_GV0G6;?{(f%f}Gl2T_(xPM|?bEIi2 zKn|R9fY{X1JH@z_3@yyfvUZ?%Tw&_tL(aL(ak)dusNw>$65-Zm?FYk_R_tZ^&E1Z5 z_f+cz?YKgu6Hec!C(aN_)2$~)n{7}Y$Ey2^h#Ic~MllRAu4!^?Q^pvh80%ND;-bk| zpMC@aCI*OVILx|(<}ym)4FpXP2B`&uzf_Gc|WOMW`rYzYVosqJ^yDH=A(Q^b#rCgr@C+jOFD- zjFw!iyO3IYOFTsb@uIpgb)S;DV;FFH9Wqe+alOQE>;#vUk$IR^PpJ%_x8V$f+tXKd z2aAo^71m-V%Z4y}tuq8+*c#mkc>rOmgEJnQNkfpQj+c=SvgRI?ZCpFvWz-gDI86CT zd!!%lqH@2@G0ggq&NJg!pg2_eEXGkC8(`c~>`Hf87YxX7vP9w9woG|O|_QpzapNxOF zaxjQdSEU!n_f_mQRy5JnkoyK!J=IGrgDrRbZ8l1r@#K$>kiXeGt48>gAG zuW}VLNO&4K4YcmMNrflUnl*c7rmR=WuA!_|Gb57(*>G8ZB1y@));TFLNXPP7#GgpH zKeDjhq0+fI+Hw@a;L1T14{6~oxO9ldu+y6Gz5rX84@{9ckidXP z&PWosSr_uVRK$y?OIOgC-njl5KI)7ET0Y+Tl?)s)G$p)DXeTJaaxIp!$-;5W$M*eb zB@xq8Gz2n4*E88pBAm|_{b;6D_(yU{=7bjw!4(VYoJm$vp9Vtc4P=!|sM=vMNlyn# zri4+3aS@2ZeP)W=!E83@>Sw{AF}m4Qss@noJk0>~WF~5~Kw3TLNRsJ!L_P`6XM-iy zRJv69OLz{^cDrW_i39UoE$yE5gdo6D;W3W3rCStlPcjpphaDZTBs`Z;&sma507TAz zzehR{*vlf@zPpJS6NgX;3EC+)igLE^uH~FCN>}P^<}#_%xL(E%A5y-Jw|FCodx|58 z`F`

O@~Yn~-`=1#VJ=*})8Bs#8Eaau~PCdske zY7FLnsgq@BmA?$NKPl2!Y2!~zKR%jIfBRx`Yj=F>_G-1Xb8GFFx1Y^+@tNlSzF#Kg z%_PUAX?pYi-b3@#&+KwPxm0;vXn$t2^iG7V4ws**I|?NdA5hgUvVv>;<+3J*9q*8QI&fKJ;x>79-Zl}H(hrJuw!_19h8D> zx9NA+KGt=aaNSfAV|sO%Pb=l6DtFE62eo>rb)ny9nfE0h0LNz$M_M3iW7q6nfyb~S zNo}tD#tK)Lofw3R-5Dy{n@lO;u#^W;Q$F sI0{%AmO+2--rY|2ZvNIncj*U0fJ@}vDs}f5nj_+hR}0+u$-c&2TSx976m zZD);=7l?po{)lhl2RPMZ*d#x&vFvtrO<(GqI#tv7r`KKo{n_J$HlHp0fAMobwt$i1 zD@YUNg2saKfW`sk4H`E{toQumfOM1cEgEl;cvQScP1T~4E}0PtA$UI)Z2z~Q5cFf( zAhktPL1~ko6a7Z?)3{CP7L5iiT$ynkg9Zk78ACj=rCvHEv%D&eb8Yz2Y?axpEZh}L zmPMA7sggQ#%Ea0Z1aIBO@IzcxSut}>*heN)|3eJm_=+LkgQ19#Ay6Pg5P) z3g`hX0w&;DK!19&PugTYBt-laenF!@$P*>#cVgEe`v!dIFkzT%F}hto`h6I4EF(I8 zho0dAK?~w@vB|V}`d2`wEgXP_RMXUjWnFBXeUiDkKiTo2`v-`S=&WAFX{n5wW@mn@ zwU~#M$yTvb;VL%awA86GHk?&qdb*hX^6~V}!Q{@}^?KzN&bj+{pUe;NnHAwtSY_4i ztiYvO-~Q;8IUjEH$Sr^Wj&3Z;)_hoj@jD7Y5v zh;HzblD_72@8jXw2b^wX85%k~zRo&=N)|r%ob?_do1@bnJp%ZVPv&sI$o(aer;Vpa zW~n@X-=ct&Cn)OiG7iD>1}1BM;Gm15#_i$qd2A);RkC7bEz4^hl&4GVip!#XP8Xx| zbUlWF5&&H%EizZw9-V#4wTO!6aui%Au-`&e9v=5Smv9GkslVBD%OAjw(djKv3bOsC zUw!-7)MdtXQ%j8LHE}Vkm8VtVo7eYh{f#lDd6i|}m%RoYzkxV(iKwmHuzLd@%Zeni zBbq^9Tot`@hPkRd!`uzQ6x3MLQi~BDaCm(R9d7i;K%+M?yvhLgZ2dx?@nl?>*0{gC z%!9-mCcg={WmOS`HXN|%d|IU};#^7TxRpqmm+4aTltD?EmWh(QRH*UP1wJylTvGyIJ}wdemqGc pmWE@{-}!g9m%X3Au+U%nnh@X<`JhhSLx$#wxDhnOp6H3a#=nJ~8JPe8 literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/_trie/datrie 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/_trie/datrie 2.py new file mode 100644 index 0000000..e2e5f86 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/_trie/datrie 2.py @@ -0,0 +1,44 @@ +from __future__ import absolute_import, division, unicode_literals + +from datrie import Trie as DATrie +from pip._vendor.six import text_type + +from ._base import Trie as ABCTrie + + +class Trie(ABCTrie): + def __init__(self, data): + chars = set() + for key in data.keys(): + if not isinstance(key, text_type): + raise TypeError("All keys must be strings") + for char in key: + chars.add(char) + + self._data = DATrie("".join(chars)) + for key, value in data.items(): + self._data[key] = value + + def __contains__(self, key): + return key in self._data + + def __len__(self): + return len(self._data) + + def __iter__(self): + raise NotImplementedError() + + def __getitem__(self, key): + return self._data[key] + + def keys(self, prefix=None): + return self._data.keys(prefix) + + def has_keys_with_prefix(self, prefix): + return self._data.has_keys_with_prefix(prefix) + + def longest_prefix(self, prefix): + return self._data.longest_prefix(prefix) + + def longest_prefix_item(self, prefix): + return self._data.longest_prefix_item(prefix) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/_trie/datrie 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/_trie/datrie 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f8bd38f5a5d1c100a6824081a479ef9e2ea3a0fa GIT binary patch literal 3296 zcmd5;-HzK-5FXq4?=D?fTDr8r3aKIz>ZVmeNT?vP-Cl4LRqj?RqLx!9K1rPVC+l;P zCMbIW+b7{kxaE0x0lpb0T@?w0)QgSnGoJJ3nQvy!c)Y*18-M=s-OqhmT^`;)yl}}3 zz=U`liir}3x(+2SbzMq4>U!kxoJ(iN=c2nHS|j|Uzhm?`eo7$8aNbI z=rz$f(NEnng;jdetU*-7@|!H(UIhtyCX1(5t0Dkuk(z|D-uAeaFf zPZ;Q25~f07oq*~!Y*SmI>SClSvkeMs!dxN$NwWa~eHK?iE1^APvA=_{Vu~}D=8tLV z(AZ(i96djzGmorGOHhx_vG`j?2d&N>`puz~XnvDtkDl++S&5b|jmxww@w9W=rjyg_ zbYh_*#;ZJwaXd>RRipVABC1}9+M{PKOFP4UJVfIffB3=auXGX;+`~5OOmBd;<9Pq2 zUYPx4YV3Yb?;D#(>Cj9uM*g!<2&u6N9OTU9+IYJIt{bDHL^+kbsY6t3O3R$sEF6WWFeufRFpLK#{u3VS z`o@37amN9clf_eo|LiWanf)=D#5&Qb)u9}Y!nvD*v<4*+y2!Xn-2%Uc$_`pLfqDf4 zMVumF_tt(CuWe|cvc^gcwdEY6)Mx*Nj{iReI>adeBC)O^vK1smea=!B2U3#TB-evz zz5yXC%65bcNf!YD9`^SpW$*^ycy6e~y`y2(~RyW~9NbF|(@``3v5KR&e#DbCWN zHg`XAu`sEZn8l4^qN%0VQ=q#i?)Az2e@Icc;mz zYz28RwbPs-V~BjozkD_&8x<9ae9q@OMCxu-F$b#(=D^~^n=2;-!no}1G(kyI6Ll+_cycg{)7Mk literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/_trie/datrie.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/_trie/datrie.py new file mode 100644 index 0000000..e2e5f86 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/_trie/datrie.py @@ -0,0 +1,44 @@ +from __future__ import absolute_import, division, unicode_literals + +from datrie import Trie as DATrie +from pip._vendor.six import text_type + +from ._base import Trie as ABCTrie + + +class Trie(ABCTrie): + def __init__(self, data): + chars = set() + for key in data.keys(): + if not isinstance(key, text_type): + raise TypeError("All keys must be strings") + for char in key: + chars.add(char) + + self._data = DATrie("".join(chars)) + for key, value in data.items(): + self._data[key] = value + + def __contains__(self, key): + return key in self._data + + def __len__(self): + return len(self._data) + + def __iter__(self): + raise NotImplementedError() + + def __getitem__(self, key): + return self._data[key] + + def keys(self, prefix=None): + return self._data.keys(prefix) + + def has_keys_with_prefix(self, prefix): + return self._data.has_keys_with_prefix(prefix) + + def longest_prefix(self, prefix): + return self._data.longest_prefix(prefix) + + def longest_prefix_item(self, prefix): + return self._data.longest_prefix_item(prefix) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/_trie/datrie.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/_trie/datrie.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b6f83688f811a3b0ec21578a355aabfa806ba742 GIT binary patch literal 3296 zcmd5;-HzK-5FXq4?=D?fTDr8r3aKIz>bj*sB~%c*Ef?HG$X#hg)N<;?Cy7)4WPMK3 z1Z6K^`y{*x&%_Jx%{b|*NFbzMY;2$LoIlTeGjqn{{k7d%{Q2!KeOg@}-rqlW$qc|m zcpOTIQir+@r7m?{NC1d`4;+B(k&V|6xHYz z(K*r2-6}@kF7qKpTO&-#7tL$Q;V_p!jfIgaBF6a?seF{bsLj)=)2b93gjK?6D0UA#j z=v)z|Mp2W1>J@C$SfT1-q%N~9iW>Pa<6ye>m}@)A8`vF9-MT_U_$ZEM|6Wt$lF+<>)T1VdfwElX!AR zASKD2FCKi|=>|L`P0e%`<%K`8Y4TMP_k0B#X&)-$bud{-C@U3bu~mwVW8Pz>oTjtu zT*bZZTyt+Ydya$)hYU9fmu)Zz5%v(#iyAz`A>9!gY=Ld_(%>B??{XLIvca-iO7(GQ zL)c5H>*yO+lbk+l&+QF>a0>&JXk7#31>)31XC+WM%M5fAFxH`mQqWDQJ+S|T$GX1u zUwPbdfaPTIROvsv%WQ6cOecv>b!K%Whof}vrXX!VNrWyku2Q$auc5Mo)=i*Z!9W?O z2-v-~AH{1M8mO$XQbTPy$0+s5f1%_5Pl*n33V=wgYlv(G3DJPF)Ww0685z)b>xb|ac`Z?MPZ>P-}X7!iN!c;3IHHcDa9!(Q;1CHC^ z8j}y0aMBJw1d)QFlV@7ahr~?4)(lw0MHCBnY4wAYuv|b%-B5FyTTQRLx8&Vvb1GXw z9!%}DV8|GvK=Lo2P02=OMIxUIxDJuJ8&%A~s)9K%@w_b8qzLPUDC_uFcX;%OYqU+V Xhj{v7>D%uZp=p5Ja(A2^cgOo1?|l0b literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/_trie/py 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/_trie/py 2.py new file mode 100644 index 0000000..c178b21 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/_trie/py 2.py @@ -0,0 +1,67 @@ +from __future__ import absolute_import, division, unicode_literals +from pip._vendor.six import text_type + +from bisect import bisect_left + +from ._base import Trie as ABCTrie + + +class Trie(ABCTrie): + def __init__(self, data): + if not all(isinstance(x, text_type) for x in data.keys()): + raise TypeError("All keys must be strings") + + self._data = data + self._keys = sorted(data.keys()) + self._cachestr = "" + self._cachepoints = (0, len(data)) + + def __contains__(self, key): + return key in self._data + + def __len__(self): + return len(self._data) + + def __iter__(self): + return iter(self._data) + + def __getitem__(self, key): + return self._data[key] + + def keys(self, prefix=None): + if prefix is None or prefix == "" or not self._keys: + return set(self._keys) + + if prefix.startswith(self._cachestr): + lo, hi = self._cachepoints + start = i = bisect_left(self._keys, prefix, lo, hi) + else: + start = i = bisect_left(self._keys, prefix) + + keys = set() + if start == len(self._keys): + return keys + + while self._keys[i].startswith(prefix): + keys.add(self._keys[i]) + i += 1 + + self._cachestr = prefix + self._cachepoints = (start, i) + + return keys + + def has_keys_with_prefix(self, prefix): + if prefix in self._data: + return True + + if prefix.startswith(self._cachestr): + lo, hi = self._cachepoints + i = bisect_left(self._keys, prefix, lo, hi) + else: + i = bisect_left(self._keys, prefix) + + if i == len(self._keys): + return False + + return self._keys[i].startswith(prefix) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/_trie/py 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/_trie/py 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a2bbec50f2be046540bb2f6dd541ec6351084ed3 GIT binary patch literal 3489 zcmd5<&2k$>5bjy6WXafZaBK$?LrkcmR7J&dDnK}d6#3)8K~QT0g$fu}+L5&KY9;TC z94TdAaL&92RXhb(9)oA#PVsfGBs)}2Tog+?>Yd;Iy1(ge7ye#d{_~H|ernP5uYljr zfA+|>Aw>8pN{IT38jAWJH9YDUs8JxrV;&_w^^4Rf=I;ecO4MJX#uDCrii(t!sb8VS zGTuvMmZ_~MTA~+3=S1H(DioFJpjyFEF`r-M)7=`HuxSU$$Qd2?hl9+yGWw$UB)0J& zbyx8+O5@fbGCGN!$-=}|6))wToEbaqCPR~Vy@9S~Y)#AQ#I#+^^YRfN(qR^xpa@}Z z01q#Z*Z^NbFvPe46&eFNjKM;Ik+T4Z1rdrA`684U9&o>a!O8^8Jgq{(L6s4-cyoRj z=VLzP2!azUW8$fzo?^>9ImeG8`yn|T>aqNbqEu#_66pdt|6(>qxf41RM1T%Hxh0-} zp|&TTP=;V?hFWj24Ok5yk7YI9g@8SN+@LeX`e3QUYLC8E$3V*~c}=~_tK2dgcp|kf zOj{;kF!=zF?(JhG(YT6+q_IOtwP6;YgwE7X!mQRFB$3H%tuw4e$Gy(;kJ@+kn|JO` zCMT}voV$1TS$7|QowRmX8^*)ia#WJse)#06{rVg3l1HDIG#X^JuIncsCvmf;9o$(P zPWFZq%T&1EF{v33vj|CduxRnb_U_$hzI8*|k`icI*gaQz{CT7+RPl zur?9T7lIvvTTinLv}9}QD0HDKL9*yEQQkS9tXpBLYp}iJy%LkU6<#F0!$F)no10Et zVUo5S#ak}eesbfqj?>s_%?`J$H>n-9=2g_Ds;D`c*{(w7RR~}Xh}46*N^{aM9|B%3 zP=j?yVhtE+(I~|kx`m(;f@E4>gKk0;QgTaXH)W2GF9-0+)w+Bs0uD+!NP){B7Y%L+ zI%q__RO_w(i%a;(G4?gXRu*imnAY2uz%dzTk2sC5e$Gfxb9?5pS5Pw8#LPvzjJ4Ie zV;qq6wcf$&jE;VgVY39&?SM!8Yf8$2`h83?uZUIp@(F1Qn%Eqx31RIO>avgw(o7L4Rr(j zlrcDTQ6Q0;5q2Z!b&;l1+7-UT^js zr*W0skY4i|NW2A)!ZUD>_-592Qp8nn+}L|Odw%De`OeIw^!MuWE3?$GqFgx}A9 z@yK=|MEEL7h=z(9wj~v%hW0t?v$Qbac2}6oy5-MVPflwm-0@|oI33$nJK#7Kvz4qrsH&Cx-RB<#fT5-Fpo`8hA=mP zhnFX8fNvleV%&fVjR76TV4=jwSpdY62xW?V5h@H1xL?3vRRU(7R-@pc&ImfZIX{f^ zDIanK!HJbI@l4S`v1Puzz>gyPAvqlCvHYu|RA!tJ=@L2rayCY}6FQVcfDS&nC7ytx zt|y&PhG1%j+U&3mSPdVKWi{S~fIWWNpmW9gV5!4ukG@mKK+7w6O|#Cc+%g(?BDF3| zJ0@T-#Q=})?qMa-X&ntoV>3vNERRn@XBsDA-sp~!$mF)s%No(~p!fXa?)|;?{RflD zi5ocQ_8&a!@8PePHVzwEoZXY7lH}e;`wyF~fV6O6E7P7GV{A%Ap%Oz2lLXc# z;`u_bLvZV>JO?e=nmP(y=qivbdQ4Pw&L`_m*y$T=?|84oq;7>5NpCiaQ)dg)i7QOf zm7{pe1=~+s4_HA34UpX4tBNjTO^+`wBQFBapPtv9!oLv-<&6^55wUf#CGh z*|ufcW)0;2CEBf|Gc ze)_QldD%^pT^w+PTrhV;hdacYcE_fCF?53Ic%%Ak4SoEB^{%;0gE}zP~~k@FiU*7->EPvY_*l9~It>`SF~P zX%43Ie2@dDy%bzI4@>M3zaHje6THJ+|8XGuy6_@H`Wh9Xkzz;u7_eD_9d6#^=6y5^ z_Lkd#4*k$-t`sy=QWr#fhrAt0W=_MQ(OPJ&^>7r86TAkz zYrw%ixXBGi#^7ykZgIoQgAdSLf){Ba6`GXY>|M*gtEgJ7Rw_O#H=A`1gi~mEL(e*qhK`V9a8 literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/_utils 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/_utils 2.py new file mode 100644 index 0000000..0703afb --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/_utils 2.py @@ -0,0 +1,124 @@ +from __future__ import absolute_import, division, unicode_literals + +from types import ModuleType + +from pip._vendor.six import text_type + +try: + import xml.etree.cElementTree as default_etree +except ImportError: + import xml.etree.ElementTree as default_etree + + +__all__ = ["default_etree", "MethodDispatcher", "isSurrogatePair", + "surrogatePairToCodepoint", "moduleFactoryFactory", + "supports_lone_surrogates"] + + +# Platforms not supporting lone surrogates (\uD800-\uDFFF) should be +# caught by the below test. In general this would be any platform +# using UTF-16 as its encoding of unicode strings, such as +# Jython. This is because UTF-16 itself is based on the use of such +# surrogates, and there is no mechanism to further escape such +# escapes. +try: + _x = eval('"\\uD800"') # pylint:disable=eval-used + if not isinstance(_x, text_type): + # We need this with u"" because of http://bugs.jython.org/issue2039 + _x = eval('u"\\uD800"') # pylint:disable=eval-used + assert isinstance(_x, text_type) +except: # pylint:disable=bare-except + supports_lone_surrogates = False +else: + supports_lone_surrogates = True + + +class MethodDispatcher(dict): + """Dict with 2 special properties: + + On initiation, keys that are lists, sets or tuples are converted to + multiple keys so accessing any one of the items in the original + list-like object returns the matching value + + md = MethodDispatcher({("foo", "bar"):"baz"}) + md["foo"] == "baz" + + A default value which can be set through the default attribute. + """ + + def __init__(self, items=()): + # Using _dictEntries instead of directly assigning to self is about + # twice as fast. Please do careful performance testing before changing + # anything here. + _dictEntries = [] + for name, value in items: + if isinstance(name, (list, tuple, frozenset, set)): + for item in name: + _dictEntries.append((item, value)) + else: + _dictEntries.append((name, value)) + dict.__init__(self, _dictEntries) + assert len(self) == len(_dictEntries) + self.default = None + + def __getitem__(self, key): + return dict.get(self, key, self.default) + + +# Some utility functions to deal with weirdness around UCS2 vs UCS4 +# python builds + +def isSurrogatePair(data): + return (len(data) == 2 and + ord(data[0]) >= 0xD800 and ord(data[0]) <= 0xDBFF and + ord(data[1]) >= 0xDC00 and ord(data[1]) <= 0xDFFF) + + +def surrogatePairToCodepoint(data): + char_val = (0x10000 + (ord(data[0]) - 0xD800) * 0x400 + + (ord(data[1]) - 0xDC00)) + return char_val + +# Module Factory Factory (no, this isn't Java, I know) +# Here to stop this being duplicated all over the place. + + +def moduleFactoryFactory(factory): + moduleCache = {} + + def moduleFactory(baseModule, *args, **kwargs): + if isinstance(ModuleType.__name__, type("")): + name = "_%s_factory" % baseModule.__name__ + else: + name = b"_%s_factory" % baseModule.__name__ + + kwargs_tuple = tuple(kwargs.items()) + + try: + return moduleCache[name][args][kwargs_tuple] + except KeyError: + mod = ModuleType(name) + objs = factory(baseModule, *args, **kwargs) + mod.__dict__.update(objs) + if "name" not in moduleCache: + moduleCache[name] = {} + if "args" not in moduleCache[name]: + moduleCache[name][args] = {} + if "kwargs" not in moduleCache[name][args]: + moduleCache[name][args][kwargs_tuple] = {} + moduleCache[name][args][kwargs_tuple] = mod + return mod + + return moduleFactory + + +def memoize(func): + cache = {} + + def wrapped(*args, **kwargs): + key = (tuple(args), tuple(kwargs.items())) + if key not in cache: + cache[key] = func(*args, **kwargs) + return cache[key] + + return wrapped diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/_utils 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/_utils 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0bab689dc31b8b8f7cfdd535456f22f2af5eed8b GIT binary patch literal 4808 zcmc&&-ESMm5uZI$lqrdpEX(?^o#Y^=C=JM>9H&T;+J#-qNsGd2a8hfBiF-ZqmgG^# zJNkA{5>@M^4jT6*e?$L)z7*(tU;Em;6lj6|5q&Mt{$`H)OpsU6;&OI(ZgzI&Hy`KH ze`*td`|E>Ww`laK;P>Hg95UZmL?QkZ#YBBYO+|f&nhy0#)GU$WJ%{2l^~b0=R?JHj zSExTu&2du0d3n4{@g?e2sW(B*NqUytqOzW%oe9eJNGXv5mYT3!W|la7Kvh6kZYH28FXi+@!EfoAs+OTEqsd zmoV6A48gWZJQS)+Dljqqut0vX<}zE$&;v+hT4xKtFs_Bb=aHi1cs++n8$i+ zIMBsfl{fUh^(~e*@*1Y0ZU=d6eQh(Xa~Ahh+in`JM`jS%R##^^D-oH^Jj>EfVD%?K zl;w+9GpAR!(#OzYkVc8k=djtAqdy8-HqC~kpV3nTzJ~GRG|~RC43qP{mOszef4H`` zoU^9+(M)c6Uae!CIbi(>z09%)Fw%O|vhH4F zyY73g8R%9N#O@$V2RgHnHXlw*xcK}caib)%QD9;36?aDujcdDsb%RX1ab&DnagDad zO*7Z#gIF8cX{E_7pF5K8RI8-KS z7ImT|h(!h;cPEZ^z`EVjP(IT(&k|NhyM1;Si`xz2To=msL-&Du-g5Qd)|cC9y1e2p zZwJ}(?GN#DuzYyCP&52YHea|89`OFbav|xFJ3>k!-reg)t*+Y&5_enk{h>mZ=AEvn za>N=~n?>8e?yAUcv8y;OjN|*5UG^ss9il^r_9J?wX#GV%pF4C|qQf#-qE{udimXEx zM48%U4$$l~+W&yJ)?X~q;TXMgsD}}M;BYu>)yp5zvzN7_ozm%@8a=ZW>W$MYhzGYr z3L%9Fo?}7;>_E3alC5&A15DWUCz;rkINGRBL2rpLL}6lVkhC<^BVq^HG2Ub(;CZ5U zmLBK?7Qz(}Gx%i-1cQN2LU|?x3MHt0pMmE4!WiqsUIybMV;GKU@&w_R$pag}ie(dy z%v@)IvSW1Img5CNmbLU*{F4NJ&_;NYps$5TU?NM*T?a48V36FXG037_1bbsQ$Qtc5 z4s~W4ok1gf+3Os<-@d!HefQpQxNCdX+7IsSb=UCeB#o`cAR62elf?0zN9#|_C%@z+ z`TD!Ka+)=|wjci>ji2)zQ|wg5Np|@%RuiGJ^R+?`+N`v@W&dIFI&3ya#x&?#exxmx@&6caO( znpG=G%*@w3j+OUVb0jyh^od;;(QwQyj8=~=xVUf#`?J9qS{tyHI&CnPdSWoKjQ2Je zi@n2R;mcQq+bq3XzLOX}K*)!1?+E=@N<;P!t|^d-@kiYp6@_Fe*@tgaioTA>f$HR-Hi&Xk&dI6%PF)(0wvTDlRJ7Yl#OG zz~LOd!C@s@fLOeYi96$z{h2RUNWYJSk3M;H6mNcgvdKpaL*^4T$T}wHOtQ1bWW5T~tRtjc^R1!)evcupUnpdXDvEOR^1MaE*fT$#Rmyrai({TC2~P2=6+G(`Ftc} zc>+C|kvNd7Ji3^q_#$0D4$w|ZL|jDX;1XNtG3v%Y#e#Vk1F1zdk7yK3L!=5Hpab_2e6XQ2R9P#~K zA`25j1O4YW_4_xcYea zFo>cBgt*o7c;h1A!g}|0KaCEwVHJ)MQmMa%`KZHc=XkS1!{uR#JZ=#@_EFK?Bh45| zJyMU+->!~&+f@_odz`u~H>mslcvar3S6feF-A6~ig_mp*AYWeLi=OSP$ z%eA!B9;486d06IQjfeL!6fOo)P#57{M&bP;8~m8PW>zrVbY}3c1Yp+Ge5tA`s#+}p YsMF4rx~WQP!l{(zZ&fSRYW1!E1A$&^kpKVy literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/_utils.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/_utils.py new file mode 100644 index 0000000..0703afb --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/_utils.py @@ -0,0 +1,124 @@ +from __future__ import absolute_import, division, unicode_literals + +from types import ModuleType + +from pip._vendor.six import text_type + +try: + import xml.etree.cElementTree as default_etree +except ImportError: + import xml.etree.ElementTree as default_etree + + +__all__ = ["default_etree", "MethodDispatcher", "isSurrogatePair", + "surrogatePairToCodepoint", "moduleFactoryFactory", + "supports_lone_surrogates"] + + +# Platforms not supporting lone surrogates (\uD800-\uDFFF) should be +# caught by the below test. In general this would be any platform +# using UTF-16 as its encoding of unicode strings, such as +# Jython. This is because UTF-16 itself is based on the use of such +# surrogates, and there is no mechanism to further escape such +# escapes. +try: + _x = eval('"\\uD800"') # pylint:disable=eval-used + if not isinstance(_x, text_type): + # We need this with u"" because of http://bugs.jython.org/issue2039 + _x = eval('u"\\uD800"') # pylint:disable=eval-used + assert isinstance(_x, text_type) +except: # pylint:disable=bare-except + supports_lone_surrogates = False +else: + supports_lone_surrogates = True + + +class MethodDispatcher(dict): + """Dict with 2 special properties: + + On initiation, keys that are lists, sets or tuples are converted to + multiple keys so accessing any one of the items in the original + list-like object returns the matching value + + md = MethodDispatcher({("foo", "bar"):"baz"}) + md["foo"] == "baz" + + A default value which can be set through the default attribute. + """ + + def __init__(self, items=()): + # Using _dictEntries instead of directly assigning to self is about + # twice as fast. Please do careful performance testing before changing + # anything here. + _dictEntries = [] + for name, value in items: + if isinstance(name, (list, tuple, frozenset, set)): + for item in name: + _dictEntries.append((item, value)) + else: + _dictEntries.append((name, value)) + dict.__init__(self, _dictEntries) + assert len(self) == len(_dictEntries) + self.default = None + + def __getitem__(self, key): + return dict.get(self, key, self.default) + + +# Some utility functions to deal with weirdness around UCS2 vs UCS4 +# python builds + +def isSurrogatePair(data): + return (len(data) == 2 and + ord(data[0]) >= 0xD800 and ord(data[0]) <= 0xDBFF and + ord(data[1]) >= 0xDC00 and ord(data[1]) <= 0xDFFF) + + +def surrogatePairToCodepoint(data): + char_val = (0x10000 + (ord(data[0]) - 0xD800) * 0x400 + + (ord(data[1]) - 0xDC00)) + return char_val + +# Module Factory Factory (no, this isn't Java, I know) +# Here to stop this being duplicated all over the place. + + +def moduleFactoryFactory(factory): + moduleCache = {} + + def moduleFactory(baseModule, *args, **kwargs): + if isinstance(ModuleType.__name__, type("")): + name = "_%s_factory" % baseModule.__name__ + else: + name = b"_%s_factory" % baseModule.__name__ + + kwargs_tuple = tuple(kwargs.items()) + + try: + return moduleCache[name][args][kwargs_tuple] + except KeyError: + mod = ModuleType(name) + objs = factory(baseModule, *args, **kwargs) + mod.__dict__.update(objs) + if "name" not in moduleCache: + moduleCache[name] = {} + if "args" not in moduleCache[name]: + moduleCache[name][args] = {} + if "kwargs" not in moduleCache[name][args]: + moduleCache[name][args][kwargs_tuple] = {} + moduleCache[name][args][kwargs_tuple] = mod + return mod + + return moduleFactory + + +def memoize(func): + cache = {} + + def wrapped(*args, **kwargs): + key = (tuple(args), tuple(kwargs.items())) + if key not in cache: + cache[key] = func(*args, **kwargs) + return cache[key] + + return wrapped diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/_utils.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/_utils.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f5d641eb0a27b731091144f86d6fff37ada42fe7 GIT binary patch literal 4808 zcmc&&-EJGl6+W}1C{YqES(f!5VkOiL6L-7f4#}mK zyY$YiB&ya;9W?Guo}n+$n*x1+zCwFbpaJ?2y)Dpw=PdP`Ah)8$;hCAUXU?4Sou75- zKefr>-yZ&^MWaszzmIYRO@I5Ay+XfNln@lC@v(ZInpY_q zrx$vGsjxsMg3hz(dT zVX!k8f^Cz=xz&EuAEcSJ6IctQ-N-~~VrMbQlc<%3+K(fvvmiEg*qiJmhG%J*$9iix z(8XGnH}t;sEtWR&8m6Ic2YGCLZ8NQN7WYisZW=y`%pkC>uFi5+A~KtKmZhD*>R$y> zmM>w=oL<>VA47*h8YMQL$7WxS{y1paG#ie7Mo$g+8pe;)MEl1wOwRXO`8+VIi z>)v(EK)0eGb_ZEH(3y?2`EYX5#pjoa8zqsA0t>9|2MbYToPZ9}ql;l{qfp)yIc zs1qeYEHe1G+i|o5*6p5#@|m`ImaszF?X$aB+-?x(x=_9!x)0s+maG4+zS2(9l~s3T zJIGdUeTbifmBU+wn&D@%`Obk8Uakn+!A1Y*N-sy@e zN34OhS+ou8u8HgxyNc7oIKGeBWq$_IAv$zuKcd%)p1cg`bB7K~bXX=!^twb=k#)#| zC{w%40h)bA`}cY4$;)Lr9HZ9`^)TWO91e%Adi7&^{;GDgQ#!pWUC@!)ny zA*3+Db4-YU9q9HavQ>_CfC;<)6cd{gM;rBN=q(Y3C`^nEl9q;gMC>3t#+!@;JWtfl z(gU5qLbw8A2ES~9U@*{0D9?mIp#-(>Gthir7-OB-OJMxS7=~k-JVp3r^1ueLV%dZv zGuK(5>=+%l<#>URWi5Rc|1^Ogv=N>p=xgB-n8*@y*TG9N7$i4p46`7e3w-|(riN7{ zRp=#9n!w!m*>AuGr*+>ivMZ(x1K$tRmhX!Zy=z!Fxsy;A;ZRomeS8gLvock2re|7Q zmiWsK5hr#*aF9#vAyp&l(hdhaR*zrlv(8rB zh}gJNUnBY_sQ>*71M3vg*F63A5kxrj1R`k`7PXV17X~&sG42J}RT_eGwfGY#CT1oz zr&g7inXh>qD|cCQBsa12iCve_aLg}`R*x;Xw0H>nv%wfz8?co+Z7`O4Vlc6c_bwQV zzd0!#>gtKr*m5N z1&P1V!=iHXGBPEqA<`y4n-37qT6B`Ex*Zr@G|VE44-&rOOz$d77slS8ysKaXKc(X#o' instead.", + "expected-tag-name-but-got-question-mark": + "Expected tag name. Got '?' instead. (HTML doesn't " + "support processing instructions.)", + "expected-tag-name": + "Expected tag name. Got something else instead", + "expected-closing-tag-but-got-right-bracket": + "Expected closing tag. Got '>' instead. Ignoring ''.", + "expected-closing-tag-but-got-eof": + "Expected closing tag. Unexpected end of file.", + "expected-closing-tag-but-got-char": + "Expected closing tag. Unexpected character '%(data)s' found.", + "eof-in-tag-name": + "Unexpected end of file in the tag name.", + "expected-attribute-name-but-got-eof": + "Unexpected end of file. Expected attribute name instead.", + "eof-in-attribute-name": + "Unexpected end of file in attribute name.", + "invalid-character-in-attribute-name": + "Invalid character in attribute name", + "duplicate-attribute": + "Dropped duplicate attribute on tag.", + "expected-end-of-tag-name-but-got-eof": + "Unexpected end of file. Expected = or end of tag.", + "expected-attribute-value-but-got-eof": + "Unexpected end of file. Expected attribute value.", + "expected-attribute-value-but-got-right-bracket": + "Expected attribute value. Got '>' instead.", + 'equals-in-unquoted-attribute-value': + "Unexpected = in unquoted attribute", + 'unexpected-character-in-unquoted-attribute-value': + "Unexpected character in unquoted attribute", + "invalid-character-after-attribute-name": + "Unexpected character after attribute name.", + "unexpected-character-after-attribute-value": + "Unexpected character after attribute value.", + "eof-in-attribute-value-double-quote": + "Unexpected end of file in attribute value (\").", + "eof-in-attribute-value-single-quote": + "Unexpected end of file in attribute value (').", + "eof-in-attribute-value-no-quotes": + "Unexpected end of file in attribute value.", + "unexpected-EOF-after-solidus-in-tag": + "Unexpected end of file in tag. Expected >", + "unexpected-character-after-solidus-in-tag": + "Unexpected character after / in tag. Expected >", + "expected-dashes-or-doctype": + "Expected '--' or 'DOCTYPE'. Not found.", + "unexpected-bang-after-double-dash-in-comment": + "Unexpected ! after -- in comment", + "unexpected-space-after-double-dash-in-comment": + "Unexpected space after -- in comment", + "incorrect-comment": + "Incorrect comment.", + "eof-in-comment": + "Unexpected end of file in comment.", + "eof-in-comment-end-dash": + "Unexpected end of file in comment (-)", + "unexpected-dash-after-double-dash-in-comment": + "Unexpected '-' after '--' found in comment.", + "eof-in-comment-double-dash": + "Unexpected end of file in comment (--).", + "eof-in-comment-end-space-state": + "Unexpected end of file in comment.", + "eof-in-comment-end-bang-state": + "Unexpected end of file in comment.", + "unexpected-char-in-comment": + "Unexpected character in comment found.", + "need-space-after-doctype": + "No space after literal string 'DOCTYPE'.", + "expected-doctype-name-but-got-right-bracket": + "Unexpected > character. Expected DOCTYPE name.", + "expected-doctype-name-but-got-eof": + "Unexpected end of file. Expected DOCTYPE name.", + "eof-in-doctype-name": + "Unexpected end of file in DOCTYPE name.", + "eof-in-doctype": + "Unexpected end of file in DOCTYPE.", + "expected-space-or-right-bracket-in-doctype": + "Expected space or '>'. Got '%(data)s'", + "unexpected-end-of-doctype": + "Unexpected end of DOCTYPE.", + "unexpected-char-in-doctype": + "Unexpected character in DOCTYPE.", + "eof-in-innerhtml": + "XXX innerHTML EOF", + "unexpected-doctype": + "Unexpected DOCTYPE. Ignored.", + "non-html-root": + "html needs to be the first start tag.", + "expected-doctype-but-got-eof": + "Unexpected End of file. Expected DOCTYPE.", + "unknown-doctype": + "Erroneous DOCTYPE.", + "expected-doctype-but-got-chars": + "Unexpected non-space characters. Expected DOCTYPE.", + "expected-doctype-but-got-start-tag": + "Unexpected start tag (%(name)s). Expected DOCTYPE.", + "expected-doctype-but-got-end-tag": + "Unexpected end tag (%(name)s). Expected DOCTYPE.", + "end-tag-after-implied-root": + "Unexpected end tag (%(name)s) after the (implied) root element.", + "expected-named-closing-tag-but-got-eof": + "Unexpected end of file. Expected end tag (%(name)s).", + "two-heads-are-not-better-than-one": + "Unexpected start tag head in existing head. Ignored.", + "unexpected-end-tag": + "Unexpected end tag (%(name)s). Ignored.", + "unexpected-start-tag-out-of-my-head": + "Unexpected start tag (%(name)s) that can be in head. Moved.", + "unexpected-start-tag": + "Unexpected start tag (%(name)s).", + "missing-end-tag": + "Missing end tag (%(name)s).", + "missing-end-tags": + "Missing end tags (%(name)s).", + "unexpected-start-tag-implies-end-tag": + "Unexpected start tag (%(startName)s) " + "implies end tag (%(endName)s).", + "unexpected-start-tag-treated-as": + "Unexpected start tag (%(originalName)s). Treated as %(newName)s.", + "deprecated-tag": + "Unexpected start tag %(name)s. Don't use it!", + "unexpected-start-tag-ignored": + "Unexpected start tag %(name)s. Ignored.", + "expected-one-end-tag-but-got-another": + "Unexpected end tag (%(gotName)s). " + "Missing end tag (%(expectedName)s).", + "end-tag-too-early": + "End tag (%(name)s) seen too early. Expected other end tag.", + "end-tag-too-early-named": + "Unexpected end tag (%(gotName)s). Expected end tag (%(expectedName)s).", + "end-tag-too-early-ignored": + "End tag (%(name)s) seen too early. Ignored.", + "adoption-agency-1.1": + "End tag (%(name)s) violates step 1, " + "paragraph 1 of the adoption agency algorithm.", + "adoption-agency-1.2": + "End tag (%(name)s) violates step 1, " + "paragraph 2 of the adoption agency algorithm.", + "adoption-agency-1.3": + "End tag (%(name)s) violates step 1, " + "paragraph 3 of the adoption agency algorithm.", + "adoption-agency-4.4": + "End tag (%(name)s) violates step 4, " + "paragraph 4 of the adoption agency algorithm.", + "unexpected-end-tag-treated-as": + "Unexpected end tag (%(originalName)s). Treated as %(newName)s.", + "no-end-tag": + "This element (%(name)s) has no end tag.", + "unexpected-implied-end-tag-in-table": + "Unexpected implied end tag (%(name)s) in the table phase.", + "unexpected-implied-end-tag-in-table-body": + "Unexpected implied end tag (%(name)s) in the table body phase.", + "unexpected-char-implies-table-voodoo": + "Unexpected non-space characters in " + "table context caused voodoo mode.", + "unexpected-hidden-input-in-table": + "Unexpected input with type hidden in table context.", + "unexpected-form-in-table": + "Unexpected form in table context.", + "unexpected-start-tag-implies-table-voodoo": + "Unexpected start tag (%(name)s) in " + "table context caused voodoo mode.", + "unexpected-end-tag-implies-table-voodoo": + "Unexpected end tag (%(name)s) in " + "table context caused voodoo mode.", + "unexpected-cell-in-table-body": + "Unexpected table cell start tag (%(name)s) " + "in the table body phase.", + "unexpected-cell-end-tag": + "Got table cell end tag (%(name)s) " + "while required end tags are missing.", + "unexpected-end-tag-in-table-body": + "Unexpected end tag (%(name)s) in the table body phase. Ignored.", + "unexpected-implied-end-tag-in-table-row": + "Unexpected implied end tag (%(name)s) in the table row phase.", + "unexpected-end-tag-in-table-row": + "Unexpected end tag (%(name)s) in the table row phase. Ignored.", + "unexpected-select-in-select": + "Unexpected select start tag in the select phase " + "treated as select end tag.", + "unexpected-input-in-select": + "Unexpected input start tag in the select phase.", + "unexpected-start-tag-in-select": + "Unexpected start tag token (%(name)s in the select phase. " + "Ignored.", + "unexpected-end-tag-in-select": + "Unexpected end tag (%(name)s) in the select phase. Ignored.", + "unexpected-table-element-start-tag-in-select-in-table": + "Unexpected table element start tag (%(name)s) in the select in table phase.", + "unexpected-table-element-end-tag-in-select-in-table": + "Unexpected table element end tag (%(name)s) in the select in table phase.", + "unexpected-char-after-body": + "Unexpected non-space characters in the after body phase.", + "unexpected-start-tag-after-body": + "Unexpected start tag token (%(name)s)" + " in the after body phase.", + "unexpected-end-tag-after-body": + "Unexpected end tag token (%(name)s)" + " in the after body phase.", + "unexpected-char-in-frameset": + "Unexpected characters in the frameset phase. Characters ignored.", + "unexpected-start-tag-in-frameset": + "Unexpected start tag token (%(name)s)" + " in the frameset phase. Ignored.", + "unexpected-frameset-in-frameset-innerhtml": + "Unexpected end tag token (frameset) " + "in the frameset phase (innerHTML).", + "unexpected-end-tag-in-frameset": + "Unexpected end tag token (%(name)s)" + " in the frameset phase. Ignored.", + "unexpected-char-after-frameset": + "Unexpected non-space characters in the " + "after frameset phase. Ignored.", + "unexpected-start-tag-after-frameset": + "Unexpected start tag (%(name)s)" + " in the after frameset phase. Ignored.", + "unexpected-end-tag-after-frameset": + "Unexpected end tag (%(name)s)" + " in the after frameset phase. Ignored.", + "unexpected-end-tag-after-body-innerhtml": + "Unexpected end tag after body(innerHtml)", + "expected-eof-but-got-char": + "Unexpected non-space characters. Expected end of file.", + "expected-eof-but-got-start-tag": + "Unexpected start tag (%(name)s)" + ". Expected end of file.", + "expected-eof-but-got-end-tag": + "Unexpected end tag (%(name)s)" + ". Expected end of file.", + "eof-in-table": + "Unexpected end of file. Expected table content.", + "eof-in-select": + "Unexpected end of file. Expected select content.", + "eof-in-frameset": + "Unexpected end of file. Expected frameset content.", + "eof-in-script-in-script": + "Unexpected end of file. Expected script content.", + "eof-in-foreign-lands": + "Unexpected end of file. Expected foreign content", + "non-void-element-with-trailing-solidus": + "Trailing solidus not allowed on element %(name)s", + "unexpected-html-element-in-foreign-content": + "Element %(name)s not allowed in a non-html context", + "unexpected-end-tag-before-html": + "Unexpected end tag (%(name)s) before html.", + "unexpected-inhead-noscript-tag": + "Element %(name)s not allowed in a inhead-noscript context", + "eof-in-head-noscript": + "Unexpected end of file. Expected inhead-noscript content", + "char-in-head-noscript": + "Unexpected non-space character. Expected inhead-noscript content", + "XXX-undefined-error": + "Undefined error (this sucks and should be fixed)", +} + +namespaces = { + "html": "http://www.w3.org/1999/xhtml", + "mathml": "http://www.w3.org/1998/Math/MathML", + "svg": "http://www.w3.org/2000/svg", + "xlink": "http://www.w3.org/1999/xlink", + "xml": "http://www.w3.org/XML/1998/namespace", + "xmlns": "http://www.w3.org/2000/xmlns/" +} + +scopingElements = frozenset([ + (namespaces["html"], "applet"), + (namespaces["html"], "caption"), + (namespaces["html"], "html"), + (namespaces["html"], "marquee"), + (namespaces["html"], "object"), + (namespaces["html"], "table"), + (namespaces["html"], "td"), + (namespaces["html"], "th"), + (namespaces["mathml"], "mi"), + (namespaces["mathml"], "mo"), + (namespaces["mathml"], "mn"), + (namespaces["mathml"], "ms"), + (namespaces["mathml"], "mtext"), + (namespaces["mathml"], "annotation-xml"), + (namespaces["svg"], "foreignObject"), + (namespaces["svg"], "desc"), + (namespaces["svg"], "title"), +]) + +formattingElements = frozenset([ + (namespaces["html"], "a"), + (namespaces["html"], "b"), + (namespaces["html"], "big"), + (namespaces["html"], "code"), + (namespaces["html"], "em"), + (namespaces["html"], "font"), + (namespaces["html"], "i"), + (namespaces["html"], "nobr"), + (namespaces["html"], "s"), + (namespaces["html"], "small"), + (namespaces["html"], "strike"), + (namespaces["html"], "strong"), + (namespaces["html"], "tt"), + (namespaces["html"], "u") +]) + +specialElements = frozenset([ + (namespaces["html"], "address"), + (namespaces["html"], "applet"), + (namespaces["html"], "area"), + (namespaces["html"], "article"), + (namespaces["html"], "aside"), + (namespaces["html"], "base"), + (namespaces["html"], "basefont"), + (namespaces["html"], "bgsound"), + (namespaces["html"], "blockquote"), + (namespaces["html"], "body"), + (namespaces["html"], "br"), + (namespaces["html"], "button"), + (namespaces["html"], "caption"), + (namespaces["html"], "center"), + (namespaces["html"], "col"), + (namespaces["html"], "colgroup"), + (namespaces["html"], "command"), + (namespaces["html"], "dd"), + (namespaces["html"], "details"), + (namespaces["html"], "dir"), + (namespaces["html"], "div"), + (namespaces["html"], "dl"), + (namespaces["html"], "dt"), + (namespaces["html"], "embed"), + (namespaces["html"], "fieldset"), + (namespaces["html"], "figure"), + (namespaces["html"], "footer"), + (namespaces["html"], "form"), + (namespaces["html"], "frame"), + (namespaces["html"], "frameset"), + (namespaces["html"], "h1"), + (namespaces["html"], "h2"), + (namespaces["html"], "h3"), + (namespaces["html"], "h4"), + (namespaces["html"], "h5"), + (namespaces["html"], "h6"), + (namespaces["html"], "head"), + (namespaces["html"], "header"), + (namespaces["html"], "hr"), + (namespaces["html"], "html"), + (namespaces["html"], "iframe"), + # Note that image is commented out in the spec as "this isn't an + # element that can end up on the stack, so it doesn't matter," + (namespaces["html"], "image"), + (namespaces["html"], "img"), + (namespaces["html"], "input"), + (namespaces["html"], "isindex"), + (namespaces["html"], "li"), + (namespaces["html"], "link"), + (namespaces["html"], "listing"), + (namespaces["html"], "marquee"), + (namespaces["html"], "menu"), + (namespaces["html"], "meta"), + (namespaces["html"], "nav"), + (namespaces["html"], "noembed"), + (namespaces["html"], "noframes"), + (namespaces["html"], "noscript"), + (namespaces["html"], "object"), + (namespaces["html"], "ol"), + (namespaces["html"], "p"), + (namespaces["html"], "param"), + (namespaces["html"], "plaintext"), + (namespaces["html"], "pre"), + (namespaces["html"], "script"), + (namespaces["html"], "section"), + (namespaces["html"], "select"), + (namespaces["html"], "style"), + (namespaces["html"], "table"), + (namespaces["html"], "tbody"), + (namespaces["html"], "td"), + (namespaces["html"], "textarea"), + (namespaces["html"], "tfoot"), + (namespaces["html"], "th"), + (namespaces["html"], "thead"), + (namespaces["html"], "title"), + (namespaces["html"], "tr"), + (namespaces["html"], "ul"), + (namespaces["html"], "wbr"), + (namespaces["html"], "xmp"), + (namespaces["svg"], "foreignObject") +]) + +htmlIntegrationPointElements = frozenset([ + (namespaces["mathml"], "annotation-xml"), + (namespaces["svg"], "foreignObject"), + (namespaces["svg"], "desc"), + (namespaces["svg"], "title") +]) + +mathmlTextIntegrationPointElements = frozenset([ + (namespaces["mathml"], "mi"), + (namespaces["mathml"], "mo"), + (namespaces["mathml"], "mn"), + (namespaces["mathml"], "ms"), + (namespaces["mathml"], "mtext") +]) + +adjustSVGAttributes = { + "attributename": "attributeName", + "attributetype": "attributeType", + "basefrequency": "baseFrequency", + "baseprofile": "baseProfile", + "calcmode": "calcMode", + "clippathunits": "clipPathUnits", + "contentscripttype": "contentScriptType", + "contentstyletype": "contentStyleType", + "diffuseconstant": "diffuseConstant", + "edgemode": "edgeMode", + "externalresourcesrequired": "externalResourcesRequired", + "filterres": "filterRes", + "filterunits": "filterUnits", + "glyphref": "glyphRef", + "gradienttransform": "gradientTransform", + "gradientunits": "gradientUnits", + "kernelmatrix": "kernelMatrix", + "kernelunitlength": "kernelUnitLength", + "keypoints": "keyPoints", + "keysplines": "keySplines", + "keytimes": "keyTimes", + "lengthadjust": "lengthAdjust", + "limitingconeangle": "limitingConeAngle", + "markerheight": "markerHeight", + "markerunits": "markerUnits", + "markerwidth": "markerWidth", + "maskcontentunits": "maskContentUnits", + "maskunits": "maskUnits", + "numoctaves": "numOctaves", + "pathlength": "pathLength", + "patterncontentunits": "patternContentUnits", + "patterntransform": "patternTransform", + "patternunits": "patternUnits", + "pointsatx": "pointsAtX", + "pointsaty": "pointsAtY", + "pointsatz": "pointsAtZ", + "preservealpha": "preserveAlpha", + "preserveaspectratio": "preserveAspectRatio", + "primitiveunits": "primitiveUnits", + "refx": "refX", + "refy": "refY", + "repeatcount": "repeatCount", + "repeatdur": "repeatDur", + "requiredextensions": "requiredExtensions", + "requiredfeatures": "requiredFeatures", + "specularconstant": "specularConstant", + "specularexponent": "specularExponent", + "spreadmethod": "spreadMethod", + "startoffset": "startOffset", + "stddeviation": "stdDeviation", + "stitchtiles": "stitchTiles", + "surfacescale": "surfaceScale", + "systemlanguage": "systemLanguage", + "tablevalues": "tableValues", + "targetx": "targetX", + "targety": "targetY", + "textlength": "textLength", + "viewbox": "viewBox", + "viewtarget": "viewTarget", + "xchannelselector": "xChannelSelector", + "ychannelselector": "yChannelSelector", + "zoomandpan": "zoomAndPan" +} + +adjustMathMLAttributes = {"definitionurl": "definitionURL"} + +adjustForeignAttributes = { + "xlink:actuate": ("xlink", "actuate", namespaces["xlink"]), + "xlink:arcrole": ("xlink", "arcrole", namespaces["xlink"]), + "xlink:href": ("xlink", "href", namespaces["xlink"]), + "xlink:role": ("xlink", "role", namespaces["xlink"]), + "xlink:show": ("xlink", "show", namespaces["xlink"]), + "xlink:title": ("xlink", "title", namespaces["xlink"]), + "xlink:type": ("xlink", "type", namespaces["xlink"]), + "xml:base": ("xml", "base", namespaces["xml"]), + "xml:lang": ("xml", "lang", namespaces["xml"]), + "xml:space": ("xml", "space", namespaces["xml"]), + "xmlns": (None, "xmlns", namespaces["xmlns"]), + "xmlns:xlink": ("xmlns", "xlink", namespaces["xmlns"]) +} + +unadjustForeignAttributes = dict([((ns, local), qname) for qname, (prefix, local, ns) in + adjustForeignAttributes.items()]) + +spaceCharacters = frozenset([ + "\t", + "\n", + "\u000C", + " ", + "\r" +]) + +tableInsertModeElements = frozenset([ + "table", + "tbody", + "tfoot", + "thead", + "tr" +]) + +asciiLowercase = frozenset(string.ascii_lowercase) +asciiUppercase = frozenset(string.ascii_uppercase) +asciiLetters = frozenset(string.ascii_letters) +digits = frozenset(string.digits) +hexDigits = frozenset(string.hexdigits) + +asciiUpper2Lower = dict([(ord(c), ord(c.lower())) + for c in string.ascii_uppercase]) + +# Heading elements need to be ordered +headingElements = ( + "h1", + "h2", + "h3", + "h4", + "h5", + "h6" +) + +voidElements = frozenset([ + "base", + "command", + "event-source", + "link", + "meta", + "hr", + "br", + "img", + "embed", + "param", + "area", + "col", + "input", + "source", + "track" +]) + +cdataElements = frozenset(['title', 'textarea']) + +rcdataElements = frozenset([ + 'style', + 'script', + 'xmp', + 'iframe', + 'noembed', + 'noframes', + 'noscript' +]) + +booleanAttributes = { + "": frozenset(["irrelevant", "itemscope"]), + "style": frozenset(["scoped"]), + "img": frozenset(["ismap"]), + "audio": frozenset(["autoplay", "controls"]), + "video": frozenset(["autoplay", "controls"]), + "script": frozenset(["defer", "async"]), + "details": frozenset(["open"]), + "datagrid": frozenset(["multiple", "disabled"]), + "command": frozenset(["hidden", "disabled", "checked", "default"]), + "hr": frozenset(["noshade"]), + "menu": frozenset(["autosubmit"]), + "fieldset": frozenset(["disabled", "readonly"]), + "option": frozenset(["disabled", "readonly", "selected"]), + "optgroup": frozenset(["disabled", "readonly"]), + "button": frozenset(["disabled", "autofocus"]), + "input": frozenset(["disabled", "readonly", "required", "autofocus", "checked", "ismap"]), + "select": frozenset(["disabled", "readonly", "autofocus", "multiple"]), + "output": frozenset(["disabled", "readonly"]), + "iframe": frozenset(["seamless"]), +} + +# entitiesWindows1252 has to be _ordered_ and needs to have an index. It +# therefore can't be a frozenset. +entitiesWindows1252 = ( + 8364, # 0x80 0x20AC EURO SIGN + 65533, # 0x81 UNDEFINED + 8218, # 0x82 0x201A SINGLE LOW-9 QUOTATION MARK + 402, # 0x83 0x0192 LATIN SMALL LETTER F WITH HOOK + 8222, # 0x84 0x201E DOUBLE LOW-9 QUOTATION MARK + 8230, # 0x85 0x2026 HORIZONTAL ELLIPSIS + 8224, # 0x86 0x2020 DAGGER + 8225, # 0x87 0x2021 DOUBLE DAGGER + 710, # 0x88 0x02C6 MODIFIER LETTER CIRCUMFLEX ACCENT + 8240, # 0x89 0x2030 PER MILLE SIGN + 352, # 0x8A 0x0160 LATIN CAPITAL LETTER S WITH CARON + 8249, # 0x8B 0x2039 SINGLE LEFT-POINTING ANGLE QUOTATION MARK + 338, # 0x8C 0x0152 LATIN CAPITAL LIGATURE OE + 65533, # 0x8D UNDEFINED + 381, # 0x8E 0x017D LATIN CAPITAL LETTER Z WITH CARON + 65533, # 0x8F UNDEFINED + 65533, # 0x90 UNDEFINED + 8216, # 0x91 0x2018 LEFT SINGLE QUOTATION MARK + 8217, # 0x92 0x2019 RIGHT SINGLE QUOTATION MARK + 8220, # 0x93 0x201C LEFT DOUBLE QUOTATION MARK + 8221, # 0x94 0x201D RIGHT DOUBLE QUOTATION MARK + 8226, # 0x95 0x2022 BULLET + 8211, # 0x96 0x2013 EN DASH + 8212, # 0x97 0x2014 EM DASH + 732, # 0x98 0x02DC SMALL TILDE + 8482, # 0x99 0x2122 TRADE MARK SIGN + 353, # 0x9A 0x0161 LATIN SMALL LETTER S WITH CARON + 8250, # 0x9B 0x203A SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + 339, # 0x9C 0x0153 LATIN SMALL LIGATURE OE + 65533, # 0x9D UNDEFINED + 382, # 0x9E 0x017E LATIN SMALL LETTER Z WITH CARON + 376 # 0x9F 0x0178 LATIN CAPITAL LETTER Y WITH DIAERESIS +) + +xmlEntities = frozenset(['lt;', 'gt;', 'amp;', 'apos;', 'quot;']) + +entities = { + "AElig": "\xc6", + "AElig;": "\xc6", + "AMP": "&", + "AMP;": "&", + "Aacute": "\xc1", + "Aacute;": "\xc1", + "Abreve;": "\u0102", + "Acirc": "\xc2", + "Acirc;": "\xc2", + "Acy;": "\u0410", + "Afr;": "\U0001d504", + "Agrave": "\xc0", + "Agrave;": "\xc0", + "Alpha;": "\u0391", + "Amacr;": "\u0100", + "And;": "\u2a53", + "Aogon;": "\u0104", + "Aopf;": "\U0001d538", + "ApplyFunction;": "\u2061", + "Aring": "\xc5", + "Aring;": "\xc5", + "Ascr;": "\U0001d49c", + "Assign;": "\u2254", + "Atilde": "\xc3", + "Atilde;": "\xc3", + "Auml": "\xc4", + "Auml;": "\xc4", + "Backslash;": "\u2216", + "Barv;": "\u2ae7", + "Barwed;": "\u2306", + "Bcy;": "\u0411", + "Because;": "\u2235", + "Bernoullis;": "\u212c", + "Beta;": "\u0392", + "Bfr;": "\U0001d505", + "Bopf;": "\U0001d539", + "Breve;": "\u02d8", + "Bscr;": "\u212c", + "Bumpeq;": "\u224e", + "CHcy;": "\u0427", + "COPY": "\xa9", + "COPY;": "\xa9", + "Cacute;": "\u0106", + "Cap;": "\u22d2", + "CapitalDifferentialD;": "\u2145", + "Cayleys;": "\u212d", + "Ccaron;": "\u010c", + "Ccedil": "\xc7", + "Ccedil;": "\xc7", + "Ccirc;": "\u0108", + "Cconint;": "\u2230", + "Cdot;": "\u010a", + "Cedilla;": "\xb8", + "CenterDot;": "\xb7", + "Cfr;": "\u212d", + "Chi;": "\u03a7", + "CircleDot;": "\u2299", + "CircleMinus;": "\u2296", + "CirclePlus;": "\u2295", + "CircleTimes;": "\u2297", + "ClockwiseContourIntegral;": "\u2232", + "CloseCurlyDoubleQuote;": "\u201d", + "CloseCurlyQuote;": "\u2019", + "Colon;": "\u2237", + "Colone;": "\u2a74", + "Congruent;": "\u2261", + "Conint;": "\u222f", + "ContourIntegral;": "\u222e", + "Copf;": "\u2102", + "Coproduct;": "\u2210", + "CounterClockwiseContourIntegral;": "\u2233", + "Cross;": "\u2a2f", + "Cscr;": "\U0001d49e", + "Cup;": "\u22d3", + "CupCap;": "\u224d", + "DD;": "\u2145", + "DDotrahd;": "\u2911", + "DJcy;": "\u0402", + "DScy;": "\u0405", + "DZcy;": "\u040f", + "Dagger;": "\u2021", + "Darr;": "\u21a1", + "Dashv;": "\u2ae4", + "Dcaron;": "\u010e", + "Dcy;": "\u0414", + "Del;": "\u2207", + "Delta;": "\u0394", + "Dfr;": "\U0001d507", + "DiacriticalAcute;": "\xb4", + "DiacriticalDot;": "\u02d9", + "DiacriticalDoubleAcute;": "\u02dd", + "DiacriticalGrave;": "`", + "DiacriticalTilde;": "\u02dc", + "Diamond;": "\u22c4", + "DifferentialD;": "\u2146", + "Dopf;": "\U0001d53b", + "Dot;": "\xa8", + "DotDot;": "\u20dc", + "DotEqual;": "\u2250", + "DoubleContourIntegral;": "\u222f", + "DoubleDot;": "\xa8", + "DoubleDownArrow;": "\u21d3", + "DoubleLeftArrow;": "\u21d0", + "DoubleLeftRightArrow;": "\u21d4", + "DoubleLeftTee;": "\u2ae4", + "DoubleLongLeftArrow;": "\u27f8", + "DoubleLongLeftRightArrow;": "\u27fa", + "DoubleLongRightArrow;": "\u27f9", + "DoubleRightArrow;": "\u21d2", + "DoubleRightTee;": "\u22a8", + "DoubleUpArrow;": "\u21d1", + "DoubleUpDownArrow;": "\u21d5", + "DoubleVerticalBar;": "\u2225", + "DownArrow;": "\u2193", + "DownArrowBar;": "\u2913", + "DownArrowUpArrow;": "\u21f5", + "DownBreve;": "\u0311", + "DownLeftRightVector;": "\u2950", + "DownLeftTeeVector;": "\u295e", + "DownLeftVector;": "\u21bd", + "DownLeftVectorBar;": "\u2956", + "DownRightTeeVector;": "\u295f", + "DownRightVector;": "\u21c1", + "DownRightVectorBar;": "\u2957", + "DownTee;": "\u22a4", + "DownTeeArrow;": "\u21a7", + "Downarrow;": "\u21d3", + "Dscr;": "\U0001d49f", + "Dstrok;": "\u0110", + "ENG;": "\u014a", + "ETH": "\xd0", + "ETH;": "\xd0", + "Eacute": "\xc9", + "Eacute;": "\xc9", + "Ecaron;": "\u011a", + "Ecirc": "\xca", + "Ecirc;": "\xca", + "Ecy;": "\u042d", + "Edot;": "\u0116", + "Efr;": "\U0001d508", + "Egrave": "\xc8", + "Egrave;": "\xc8", + "Element;": "\u2208", + "Emacr;": "\u0112", + "EmptySmallSquare;": "\u25fb", + "EmptyVerySmallSquare;": "\u25ab", + "Eogon;": "\u0118", + "Eopf;": "\U0001d53c", + "Epsilon;": "\u0395", + "Equal;": "\u2a75", + "EqualTilde;": "\u2242", + "Equilibrium;": "\u21cc", + "Escr;": "\u2130", + "Esim;": "\u2a73", + "Eta;": "\u0397", + "Euml": "\xcb", + "Euml;": "\xcb", + "Exists;": "\u2203", + "ExponentialE;": "\u2147", + "Fcy;": "\u0424", + "Ffr;": "\U0001d509", + "FilledSmallSquare;": "\u25fc", + "FilledVerySmallSquare;": "\u25aa", + "Fopf;": "\U0001d53d", + "ForAll;": "\u2200", + "Fouriertrf;": "\u2131", + "Fscr;": "\u2131", + "GJcy;": "\u0403", + "GT": ">", + "GT;": ">", + "Gamma;": "\u0393", + "Gammad;": "\u03dc", + "Gbreve;": "\u011e", + "Gcedil;": "\u0122", + "Gcirc;": "\u011c", + "Gcy;": "\u0413", + "Gdot;": "\u0120", + "Gfr;": "\U0001d50a", + "Gg;": "\u22d9", + "Gopf;": "\U0001d53e", + "GreaterEqual;": "\u2265", + "GreaterEqualLess;": "\u22db", + "GreaterFullEqual;": "\u2267", + "GreaterGreater;": "\u2aa2", + "GreaterLess;": "\u2277", + "GreaterSlantEqual;": "\u2a7e", + "GreaterTilde;": "\u2273", + "Gscr;": "\U0001d4a2", + "Gt;": "\u226b", + "HARDcy;": "\u042a", + "Hacek;": "\u02c7", + "Hat;": "^", + "Hcirc;": "\u0124", + "Hfr;": "\u210c", + "HilbertSpace;": "\u210b", + "Hopf;": "\u210d", + "HorizontalLine;": "\u2500", + "Hscr;": "\u210b", + "Hstrok;": "\u0126", + "HumpDownHump;": "\u224e", + "HumpEqual;": "\u224f", + "IEcy;": "\u0415", + "IJlig;": "\u0132", + "IOcy;": "\u0401", + "Iacute": "\xcd", + "Iacute;": "\xcd", + "Icirc": "\xce", + "Icirc;": "\xce", + "Icy;": "\u0418", + "Idot;": "\u0130", + "Ifr;": "\u2111", + "Igrave": "\xcc", + "Igrave;": "\xcc", + "Im;": "\u2111", + "Imacr;": "\u012a", + "ImaginaryI;": "\u2148", + "Implies;": "\u21d2", + "Int;": "\u222c", + "Integral;": "\u222b", + "Intersection;": "\u22c2", + "InvisibleComma;": "\u2063", + "InvisibleTimes;": "\u2062", + "Iogon;": "\u012e", + "Iopf;": "\U0001d540", + "Iota;": "\u0399", + "Iscr;": "\u2110", + "Itilde;": "\u0128", + "Iukcy;": "\u0406", + "Iuml": "\xcf", + "Iuml;": "\xcf", + "Jcirc;": "\u0134", + "Jcy;": "\u0419", + "Jfr;": "\U0001d50d", + "Jopf;": "\U0001d541", + "Jscr;": "\U0001d4a5", + "Jsercy;": "\u0408", + "Jukcy;": "\u0404", + "KHcy;": "\u0425", + "KJcy;": "\u040c", + "Kappa;": "\u039a", + "Kcedil;": "\u0136", + "Kcy;": "\u041a", + "Kfr;": "\U0001d50e", + "Kopf;": "\U0001d542", + "Kscr;": "\U0001d4a6", + "LJcy;": "\u0409", + "LT": "<", + "LT;": "<", + "Lacute;": "\u0139", + "Lambda;": "\u039b", + "Lang;": "\u27ea", + "Laplacetrf;": "\u2112", + "Larr;": "\u219e", + "Lcaron;": "\u013d", + "Lcedil;": "\u013b", + "Lcy;": "\u041b", + "LeftAngleBracket;": "\u27e8", + "LeftArrow;": "\u2190", + "LeftArrowBar;": "\u21e4", + "LeftArrowRightArrow;": "\u21c6", + "LeftCeiling;": "\u2308", + "LeftDoubleBracket;": "\u27e6", + "LeftDownTeeVector;": "\u2961", + "LeftDownVector;": "\u21c3", + "LeftDownVectorBar;": "\u2959", + "LeftFloor;": "\u230a", + "LeftRightArrow;": "\u2194", + "LeftRightVector;": "\u294e", + "LeftTee;": "\u22a3", + "LeftTeeArrow;": "\u21a4", + "LeftTeeVector;": "\u295a", + "LeftTriangle;": "\u22b2", + "LeftTriangleBar;": "\u29cf", + "LeftTriangleEqual;": "\u22b4", + "LeftUpDownVector;": "\u2951", + "LeftUpTeeVector;": "\u2960", + "LeftUpVector;": "\u21bf", + "LeftUpVectorBar;": "\u2958", + "LeftVector;": "\u21bc", + "LeftVectorBar;": "\u2952", + "Leftarrow;": "\u21d0", + "Leftrightarrow;": "\u21d4", + "LessEqualGreater;": "\u22da", + "LessFullEqual;": "\u2266", + "LessGreater;": "\u2276", + "LessLess;": "\u2aa1", + "LessSlantEqual;": "\u2a7d", + "LessTilde;": "\u2272", + "Lfr;": "\U0001d50f", + "Ll;": "\u22d8", + "Lleftarrow;": "\u21da", + "Lmidot;": "\u013f", + "LongLeftArrow;": "\u27f5", + "LongLeftRightArrow;": "\u27f7", + "LongRightArrow;": "\u27f6", + "Longleftarrow;": "\u27f8", + "Longleftrightarrow;": "\u27fa", + "Longrightarrow;": "\u27f9", + "Lopf;": "\U0001d543", + "LowerLeftArrow;": "\u2199", + "LowerRightArrow;": "\u2198", + "Lscr;": "\u2112", + "Lsh;": "\u21b0", + "Lstrok;": "\u0141", + "Lt;": "\u226a", + "Map;": "\u2905", + "Mcy;": "\u041c", + "MediumSpace;": "\u205f", + "Mellintrf;": "\u2133", + "Mfr;": "\U0001d510", + "MinusPlus;": "\u2213", + "Mopf;": "\U0001d544", + "Mscr;": "\u2133", + "Mu;": "\u039c", + "NJcy;": "\u040a", + "Nacute;": "\u0143", + "Ncaron;": "\u0147", + "Ncedil;": "\u0145", + "Ncy;": "\u041d", + "NegativeMediumSpace;": "\u200b", + "NegativeThickSpace;": "\u200b", + "NegativeThinSpace;": "\u200b", + "NegativeVeryThinSpace;": "\u200b", + "NestedGreaterGreater;": "\u226b", + "NestedLessLess;": "\u226a", + "NewLine;": "\n", + "Nfr;": "\U0001d511", + "NoBreak;": "\u2060", + "NonBreakingSpace;": "\xa0", + "Nopf;": "\u2115", + "Not;": "\u2aec", + "NotCongruent;": "\u2262", + "NotCupCap;": "\u226d", + "NotDoubleVerticalBar;": "\u2226", + "NotElement;": "\u2209", + "NotEqual;": "\u2260", + "NotEqualTilde;": "\u2242\u0338", + "NotExists;": "\u2204", + "NotGreater;": "\u226f", + "NotGreaterEqual;": "\u2271", + "NotGreaterFullEqual;": "\u2267\u0338", + "NotGreaterGreater;": "\u226b\u0338", + "NotGreaterLess;": "\u2279", + "NotGreaterSlantEqual;": "\u2a7e\u0338", + "NotGreaterTilde;": "\u2275", + "NotHumpDownHump;": "\u224e\u0338", + "NotHumpEqual;": "\u224f\u0338", + "NotLeftTriangle;": "\u22ea", + "NotLeftTriangleBar;": "\u29cf\u0338", + "NotLeftTriangleEqual;": "\u22ec", + "NotLess;": "\u226e", + "NotLessEqual;": "\u2270", + "NotLessGreater;": "\u2278", + "NotLessLess;": "\u226a\u0338", + "NotLessSlantEqual;": "\u2a7d\u0338", + "NotLessTilde;": "\u2274", + "NotNestedGreaterGreater;": "\u2aa2\u0338", + "NotNestedLessLess;": "\u2aa1\u0338", + "NotPrecedes;": "\u2280", + "NotPrecedesEqual;": "\u2aaf\u0338", + "NotPrecedesSlantEqual;": "\u22e0", + "NotReverseElement;": "\u220c", + "NotRightTriangle;": "\u22eb", + "NotRightTriangleBar;": "\u29d0\u0338", + "NotRightTriangleEqual;": "\u22ed", + "NotSquareSubset;": "\u228f\u0338", + "NotSquareSubsetEqual;": "\u22e2", + "NotSquareSuperset;": "\u2290\u0338", + "NotSquareSupersetEqual;": "\u22e3", + "NotSubset;": "\u2282\u20d2", + "NotSubsetEqual;": "\u2288", + "NotSucceeds;": "\u2281", + "NotSucceedsEqual;": "\u2ab0\u0338", + "NotSucceedsSlantEqual;": "\u22e1", + "NotSucceedsTilde;": "\u227f\u0338", + "NotSuperset;": "\u2283\u20d2", + "NotSupersetEqual;": "\u2289", + "NotTilde;": "\u2241", + "NotTildeEqual;": "\u2244", + "NotTildeFullEqual;": "\u2247", + "NotTildeTilde;": "\u2249", + "NotVerticalBar;": "\u2224", + "Nscr;": "\U0001d4a9", + "Ntilde": "\xd1", + "Ntilde;": "\xd1", + "Nu;": "\u039d", + "OElig;": "\u0152", + "Oacute": "\xd3", + "Oacute;": "\xd3", + "Ocirc": "\xd4", + "Ocirc;": "\xd4", + "Ocy;": "\u041e", + "Odblac;": "\u0150", + "Ofr;": "\U0001d512", + "Ograve": "\xd2", + "Ograve;": "\xd2", + "Omacr;": "\u014c", + "Omega;": "\u03a9", + "Omicron;": "\u039f", + "Oopf;": "\U0001d546", + "OpenCurlyDoubleQuote;": "\u201c", + "OpenCurlyQuote;": "\u2018", + "Or;": "\u2a54", + "Oscr;": "\U0001d4aa", + "Oslash": "\xd8", + "Oslash;": "\xd8", + "Otilde": "\xd5", + "Otilde;": "\xd5", + "Otimes;": "\u2a37", + "Ouml": "\xd6", + "Ouml;": "\xd6", + "OverBar;": "\u203e", + "OverBrace;": "\u23de", + "OverBracket;": "\u23b4", + "OverParenthesis;": "\u23dc", + "PartialD;": "\u2202", + "Pcy;": "\u041f", + "Pfr;": "\U0001d513", + "Phi;": "\u03a6", + "Pi;": "\u03a0", + "PlusMinus;": "\xb1", + "Poincareplane;": "\u210c", + "Popf;": "\u2119", + "Pr;": "\u2abb", + "Precedes;": "\u227a", + "PrecedesEqual;": "\u2aaf", + "PrecedesSlantEqual;": "\u227c", + "PrecedesTilde;": "\u227e", + "Prime;": "\u2033", + "Product;": "\u220f", + "Proportion;": "\u2237", + "Proportional;": "\u221d", + "Pscr;": "\U0001d4ab", + "Psi;": "\u03a8", + "QUOT": "\"", + "QUOT;": "\"", + "Qfr;": "\U0001d514", + "Qopf;": "\u211a", + "Qscr;": "\U0001d4ac", + "RBarr;": "\u2910", + "REG": "\xae", + "REG;": "\xae", + "Racute;": "\u0154", + "Rang;": "\u27eb", + "Rarr;": "\u21a0", + "Rarrtl;": "\u2916", + "Rcaron;": "\u0158", + "Rcedil;": "\u0156", + "Rcy;": "\u0420", + "Re;": "\u211c", + "ReverseElement;": "\u220b", + "ReverseEquilibrium;": "\u21cb", + "ReverseUpEquilibrium;": "\u296f", + "Rfr;": "\u211c", + "Rho;": "\u03a1", + "RightAngleBracket;": "\u27e9", + "RightArrow;": "\u2192", + "RightArrowBar;": "\u21e5", + "RightArrowLeftArrow;": "\u21c4", + "RightCeiling;": "\u2309", + "RightDoubleBracket;": "\u27e7", + "RightDownTeeVector;": "\u295d", + "RightDownVector;": "\u21c2", + "RightDownVectorBar;": "\u2955", + "RightFloor;": "\u230b", + "RightTee;": "\u22a2", + "RightTeeArrow;": "\u21a6", + "RightTeeVector;": "\u295b", + "RightTriangle;": "\u22b3", + "RightTriangleBar;": "\u29d0", + "RightTriangleEqual;": "\u22b5", + "RightUpDownVector;": "\u294f", + "RightUpTeeVector;": "\u295c", + "RightUpVector;": "\u21be", + "RightUpVectorBar;": "\u2954", + "RightVector;": "\u21c0", + "RightVectorBar;": "\u2953", + "Rightarrow;": "\u21d2", + "Ropf;": "\u211d", + "RoundImplies;": "\u2970", + "Rrightarrow;": "\u21db", + "Rscr;": "\u211b", + "Rsh;": "\u21b1", + "RuleDelayed;": "\u29f4", + "SHCHcy;": "\u0429", + "SHcy;": "\u0428", + "SOFTcy;": "\u042c", + "Sacute;": "\u015a", + "Sc;": "\u2abc", + "Scaron;": "\u0160", + "Scedil;": "\u015e", + "Scirc;": "\u015c", + "Scy;": "\u0421", + "Sfr;": "\U0001d516", + "ShortDownArrow;": "\u2193", + "ShortLeftArrow;": "\u2190", + "ShortRightArrow;": "\u2192", + "ShortUpArrow;": "\u2191", + "Sigma;": "\u03a3", + "SmallCircle;": "\u2218", + "Sopf;": "\U0001d54a", + "Sqrt;": "\u221a", + "Square;": "\u25a1", + "SquareIntersection;": "\u2293", + "SquareSubset;": "\u228f", + "SquareSubsetEqual;": "\u2291", + "SquareSuperset;": "\u2290", + "SquareSupersetEqual;": "\u2292", + "SquareUnion;": "\u2294", + "Sscr;": "\U0001d4ae", + "Star;": "\u22c6", + "Sub;": "\u22d0", + "Subset;": "\u22d0", + "SubsetEqual;": "\u2286", + "Succeeds;": "\u227b", + "SucceedsEqual;": "\u2ab0", + "SucceedsSlantEqual;": "\u227d", + "SucceedsTilde;": "\u227f", + "SuchThat;": "\u220b", + "Sum;": "\u2211", + "Sup;": "\u22d1", + "Superset;": "\u2283", + "SupersetEqual;": "\u2287", + "Supset;": "\u22d1", + "THORN": "\xde", + "THORN;": "\xde", + "TRADE;": "\u2122", + "TSHcy;": "\u040b", + "TScy;": "\u0426", + "Tab;": "\t", + "Tau;": "\u03a4", + "Tcaron;": "\u0164", + "Tcedil;": "\u0162", + "Tcy;": "\u0422", + "Tfr;": "\U0001d517", + "Therefore;": "\u2234", + "Theta;": "\u0398", + "ThickSpace;": "\u205f\u200a", + "ThinSpace;": "\u2009", + "Tilde;": "\u223c", + "TildeEqual;": "\u2243", + "TildeFullEqual;": "\u2245", + "TildeTilde;": "\u2248", + "Topf;": "\U0001d54b", + "TripleDot;": "\u20db", + "Tscr;": "\U0001d4af", + "Tstrok;": "\u0166", + "Uacute": "\xda", + "Uacute;": "\xda", + "Uarr;": "\u219f", + "Uarrocir;": "\u2949", + "Ubrcy;": "\u040e", + "Ubreve;": "\u016c", + "Ucirc": "\xdb", + "Ucirc;": "\xdb", + "Ucy;": "\u0423", + "Udblac;": "\u0170", + "Ufr;": "\U0001d518", + "Ugrave": "\xd9", + "Ugrave;": "\xd9", + "Umacr;": "\u016a", + "UnderBar;": "_", + "UnderBrace;": "\u23df", + "UnderBracket;": "\u23b5", + "UnderParenthesis;": "\u23dd", + "Union;": "\u22c3", + "UnionPlus;": "\u228e", + "Uogon;": "\u0172", + "Uopf;": "\U0001d54c", + "UpArrow;": "\u2191", + "UpArrowBar;": "\u2912", + "UpArrowDownArrow;": "\u21c5", + "UpDownArrow;": "\u2195", + "UpEquilibrium;": "\u296e", + "UpTee;": "\u22a5", + "UpTeeArrow;": "\u21a5", + "Uparrow;": "\u21d1", + "Updownarrow;": "\u21d5", + "UpperLeftArrow;": "\u2196", + "UpperRightArrow;": "\u2197", + "Upsi;": "\u03d2", + "Upsilon;": "\u03a5", + "Uring;": "\u016e", + "Uscr;": "\U0001d4b0", + "Utilde;": "\u0168", + "Uuml": "\xdc", + "Uuml;": "\xdc", + "VDash;": "\u22ab", + "Vbar;": "\u2aeb", + "Vcy;": "\u0412", + "Vdash;": "\u22a9", + "Vdashl;": "\u2ae6", + "Vee;": "\u22c1", + "Verbar;": "\u2016", + "Vert;": "\u2016", + "VerticalBar;": "\u2223", + "VerticalLine;": "|", + "VerticalSeparator;": "\u2758", + "VerticalTilde;": "\u2240", + "VeryThinSpace;": "\u200a", + "Vfr;": "\U0001d519", + "Vopf;": "\U0001d54d", + "Vscr;": "\U0001d4b1", + "Vvdash;": "\u22aa", + "Wcirc;": "\u0174", + "Wedge;": "\u22c0", + "Wfr;": "\U0001d51a", + "Wopf;": "\U0001d54e", + "Wscr;": "\U0001d4b2", + "Xfr;": "\U0001d51b", + "Xi;": "\u039e", + "Xopf;": "\U0001d54f", + "Xscr;": "\U0001d4b3", + "YAcy;": "\u042f", + "YIcy;": "\u0407", + "YUcy;": "\u042e", + "Yacute": "\xdd", + "Yacute;": "\xdd", + "Ycirc;": "\u0176", + "Ycy;": "\u042b", + "Yfr;": "\U0001d51c", + "Yopf;": "\U0001d550", + "Yscr;": "\U0001d4b4", + "Yuml;": "\u0178", + "ZHcy;": "\u0416", + "Zacute;": "\u0179", + "Zcaron;": "\u017d", + "Zcy;": "\u0417", + "Zdot;": "\u017b", + "ZeroWidthSpace;": "\u200b", + "Zeta;": "\u0396", + "Zfr;": "\u2128", + "Zopf;": "\u2124", + "Zscr;": "\U0001d4b5", + "aacute": "\xe1", + "aacute;": "\xe1", + "abreve;": "\u0103", + "ac;": "\u223e", + "acE;": "\u223e\u0333", + "acd;": "\u223f", + "acirc": "\xe2", + "acirc;": "\xe2", + "acute": "\xb4", + "acute;": "\xb4", + "acy;": "\u0430", + "aelig": "\xe6", + "aelig;": "\xe6", + "af;": "\u2061", + "afr;": "\U0001d51e", + "agrave": "\xe0", + "agrave;": "\xe0", + "alefsym;": "\u2135", + "aleph;": "\u2135", + "alpha;": "\u03b1", + "amacr;": "\u0101", + "amalg;": "\u2a3f", + "amp": "&", + "amp;": "&", + "and;": "\u2227", + "andand;": "\u2a55", + "andd;": "\u2a5c", + "andslope;": "\u2a58", + "andv;": "\u2a5a", + "ang;": "\u2220", + "ange;": "\u29a4", + "angle;": "\u2220", + "angmsd;": "\u2221", + "angmsdaa;": "\u29a8", + "angmsdab;": "\u29a9", + "angmsdac;": "\u29aa", + "angmsdad;": "\u29ab", + "angmsdae;": "\u29ac", + "angmsdaf;": "\u29ad", + "angmsdag;": "\u29ae", + "angmsdah;": "\u29af", + "angrt;": "\u221f", + "angrtvb;": "\u22be", + "angrtvbd;": "\u299d", + "angsph;": "\u2222", + "angst;": "\xc5", + "angzarr;": "\u237c", + "aogon;": "\u0105", + "aopf;": "\U0001d552", + "ap;": "\u2248", + "apE;": "\u2a70", + "apacir;": "\u2a6f", + "ape;": "\u224a", + "apid;": "\u224b", + "apos;": "'", + "approx;": "\u2248", + "approxeq;": "\u224a", + "aring": "\xe5", + "aring;": "\xe5", + "ascr;": "\U0001d4b6", + "ast;": "*", + "asymp;": "\u2248", + "asympeq;": "\u224d", + "atilde": "\xe3", + "atilde;": "\xe3", + "auml": "\xe4", + "auml;": "\xe4", + "awconint;": "\u2233", + "awint;": "\u2a11", + "bNot;": "\u2aed", + "backcong;": "\u224c", + "backepsilon;": "\u03f6", + "backprime;": "\u2035", + "backsim;": "\u223d", + "backsimeq;": "\u22cd", + "barvee;": "\u22bd", + "barwed;": "\u2305", + "barwedge;": "\u2305", + "bbrk;": "\u23b5", + "bbrktbrk;": "\u23b6", + "bcong;": "\u224c", + "bcy;": "\u0431", + "bdquo;": "\u201e", + "becaus;": "\u2235", + "because;": "\u2235", + "bemptyv;": "\u29b0", + "bepsi;": "\u03f6", + "bernou;": "\u212c", + "beta;": "\u03b2", + "beth;": "\u2136", + "between;": "\u226c", + "bfr;": "\U0001d51f", + "bigcap;": "\u22c2", + "bigcirc;": "\u25ef", + "bigcup;": "\u22c3", + "bigodot;": "\u2a00", + "bigoplus;": "\u2a01", + "bigotimes;": "\u2a02", + "bigsqcup;": "\u2a06", + "bigstar;": "\u2605", + "bigtriangledown;": "\u25bd", + "bigtriangleup;": "\u25b3", + "biguplus;": "\u2a04", + "bigvee;": "\u22c1", + "bigwedge;": "\u22c0", + "bkarow;": "\u290d", + "blacklozenge;": "\u29eb", + "blacksquare;": "\u25aa", + "blacktriangle;": "\u25b4", + "blacktriangledown;": "\u25be", + "blacktriangleleft;": "\u25c2", + "blacktriangleright;": "\u25b8", + "blank;": "\u2423", + "blk12;": "\u2592", + "blk14;": "\u2591", + "blk34;": "\u2593", + "block;": "\u2588", + "bne;": "=\u20e5", + "bnequiv;": "\u2261\u20e5", + "bnot;": "\u2310", + "bopf;": "\U0001d553", + "bot;": "\u22a5", + "bottom;": "\u22a5", + "bowtie;": "\u22c8", + "boxDL;": "\u2557", + "boxDR;": "\u2554", + "boxDl;": "\u2556", + "boxDr;": "\u2553", + "boxH;": "\u2550", + "boxHD;": "\u2566", + "boxHU;": "\u2569", + "boxHd;": "\u2564", + "boxHu;": "\u2567", + "boxUL;": "\u255d", + "boxUR;": "\u255a", + "boxUl;": "\u255c", + "boxUr;": "\u2559", + "boxV;": "\u2551", + "boxVH;": "\u256c", + "boxVL;": "\u2563", + "boxVR;": "\u2560", + "boxVh;": "\u256b", + "boxVl;": "\u2562", + "boxVr;": "\u255f", + "boxbox;": "\u29c9", + "boxdL;": "\u2555", + "boxdR;": "\u2552", + "boxdl;": "\u2510", + "boxdr;": "\u250c", + "boxh;": "\u2500", + "boxhD;": "\u2565", + "boxhU;": "\u2568", + "boxhd;": "\u252c", + "boxhu;": "\u2534", + "boxminus;": "\u229f", + "boxplus;": "\u229e", + "boxtimes;": "\u22a0", + "boxuL;": "\u255b", + "boxuR;": "\u2558", + "boxul;": "\u2518", + "boxur;": "\u2514", + "boxv;": "\u2502", + "boxvH;": "\u256a", + "boxvL;": "\u2561", + "boxvR;": "\u255e", + "boxvh;": "\u253c", + "boxvl;": "\u2524", + "boxvr;": "\u251c", + "bprime;": "\u2035", + "breve;": "\u02d8", + "brvbar": "\xa6", + "brvbar;": "\xa6", + "bscr;": "\U0001d4b7", + "bsemi;": "\u204f", + "bsim;": "\u223d", + "bsime;": "\u22cd", + "bsol;": "\\", + "bsolb;": "\u29c5", + "bsolhsub;": "\u27c8", + "bull;": "\u2022", + "bullet;": "\u2022", + "bump;": "\u224e", + "bumpE;": "\u2aae", + "bumpe;": "\u224f", + "bumpeq;": "\u224f", + "cacute;": "\u0107", + "cap;": "\u2229", + "capand;": "\u2a44", + "capbrcup;": "\u2a49", + "capcap;": "\u2a4b", + "capcup;": "\u2a47", + "capdot;": "\u2a40", + "caps;": "\u2229\ufe00", + "caret;": "\u2041", + "caron;": "\u02c7", + "ccaps;": "\u2a4d", + "ccaron;": "\u010d", + "ccedil": "\xe7", + "ccedil;": "\xe7", + "ccirc;": "\u0109", + "ccups;": "\u2a4c", + "ccupssm;": "\u2a50", + "cdot;": "\u010b", + "cedil": "\xb8", + "cedil;": "\xb8", + "cemptyv;": "\u29b2", + "cent": "\xa2", + "cent;": "\xa2", + "centerdot;": "\xb7", + "cfr;": "\U0001d520", + "chcy;": "\u0447", + "check;": "\u2713", + "checkmark;": "\u2713", + "chi;": "\u03c7", + "cir;": "\u25cb", + "cirE;": "\u29c3", + "circ;": "\u02c6", + "circeq;": "\u2257", + "circlearrowleft;": "\u21ba", + "circlearrowright;": "\u21bb", + "circledR;": "\xae", + "circledS;": "\u24c8", + "circledast;": "\u229b", + "circledcirc;": "\u229a", + "circleddash;": "\u229d", + "cire;": "\u2257", + "cirfnint;": "\u2a10", + "cirmid;": "\u2aef", + "cirscir;": "\u29c2", + "clubs;": "\u2663", + "clubsuit;": "\u2663", + "colon;": ":", + "colone;": "\u2254", + "coloneq;": "\u2254", + "comma;": ",", + "commat;": "@", + "comp;": "\u2201", + "compfn;": "\u2218", + "complement;": "\u2201", + "complexes;": "\u2102", + "cong;": "\u2245", + "congdot;": "\u2a6d", + "conint;": "\u222e", + "copf;": "\U0001d554", + "coprod;": "\u2210", + "copy": "\xa9", + "copy;": "\xa9", + "copysr;": "\u2117", + "crarr;": "\u21b5", + "cross;": "\u2717", + "cscr;": "\U0001d4b8", + "csub;": "\u2acf", + "csube;": "\u2ad1", + "csup;": "\u2ad0", + "csupe;": "\u2ad2", + "ctdot;": "\u22ef", + "cudarrl;": "\u2938", + "cudarrr;": "\u2935", + "cuepr;": "\u22de", + "cuesc;": "\u22df", + "cularr;": "\u21b6", + "cularrp;": "\u293d", + "cup;": "\u222a", + "cupbrcap;": "\u2a48", + "cupcap;": "\u2a46", + "cupcup;": "\u2a4a", + "cupdot;": "\u228d", + "cupor;": "\u2a45", + "cups;": "\u222a\ufe00", + "curarr;": "\u21b7", + "curarrm;": "\u293c", + "curlyeqprec;": "\u22de", + "curlyeqsucc;": "\u22df", + "curlyvee;": "\u22ce", + "curlywedge;": "\u22cf", + "curren": "\xa4", + "curren;": "\xa4", + "curvearrowleft;": "\u21b6", + "curvearrowright;": "\u21b7", + "cuvee;": "\u22ce", + "cuwed;": "\u22cf", + "cwconint;": "\u2232", + "cwint;": "\u2231", + "cylcty;": "\u232d", + "dArr;": "\u21d3", + "dHar;": "\u2965", + "dagger;": "\u2020", + "daleth;": "\u2138", + "darr;": "\u2193", + "dash;": "\u2010", + "dashv;": "\u22a3", + "dbkarow;": "\u290f", + "dblac;": "\u02dd", + "dcaron;": "\u010f", + "dcy;": "\u0434", + "dd;": "\u2146", + "ddagger;": "\u2021", + "ddarr;": "\u21ca", + "ddotseq;": "\u2a77", + "deg": "\xb0", + "deg;": "\xb0", + "delta;": "\u03b4", + "demptyv;": "\u29b1", + "dfisht;": "\u297f", + "dfr;": "\U0001d521", + "dharl;": "\u21c3", + "dharr;": "\u21c2", + "diam;": "\u22c4", + "diamond;": "\u22c4", + "diamondsuit;": "\u2666", + "diams;": "\u2666", + "die;": "\xa8", + "digamma;": "\u03dd", + "disin;": "\u22f2", + "div;": "\xf7", + "divide": "\xf7", + "divide;": "\xf7", + "divideontimes;": "\u22c7", + "divonx;": "\u22c7", + "djcy;": "\u0452", + "dlcorn;": "\u231e", + "dlcrop;": "\u230d", + "dollar;": "$", + "dopf;": "\U0001d555", + "dot;": "\u02d9", + "doteq;": "\u2250", + "doteqdot;": "\u2251", + "dotminus;": "\u2238", + "dotplus;": "\u2214", + "dotsquare;": "\u22a1", + "doublebarwedge;": "\u2306", + "downarrow;": "\u2193", + "downdownarrows;": "\u21ca", + "downharpoonleft;": "\u21c3", + "downharpoonright;": "\u21c2", + "drbkarow;": "\u2910", + "drcorn;": "\u231f", + "drcrop;": "\u230c", + "dscr;": "\U0001d4b9", + "dscy;": "\u0455", + "dsol;": "\u29f6", + "dstrok;": "\u0111", + "dtdot;": "\u22f1", + "dtri;": "\u25bf", + "dtrif;": "\u25be", + "duarr;": "\u21f5", + "duhar;": "\u296f", + "dwangle;": "\u29a6", + "dzcy;": "\u045f", + "dzigrarr;": "\u27ff", + "eDDot;": "\u2a77", + "eDot;": "\u2251", + "eacute": "\xe9", + "eacute;": "\xe9", + "easter;": "\u2a6e", + "ecaron;": "\u011b", + "ecir;": "\u2256", + "ecirc": "\xea", + "ecirc;": "\xea", + "ecolon;": "\u2255", + "ecy;": "\u044d", + "edot;": "\u0117", + "ee;": "\u2147", + "efDot;": "\u2252", + "efr;": "\U0001d522", + "eg;": "\u2a9a", + "egrave": "\xe8", + "egrave;": "\xe8", + "egs;": "\u2a96", + "egsdot;": "\u2a98", + "el;": "\u2a99", + "elinters;": "\u23e7", + "ell;": "\u2113", + "els;": "\u2a95", + "elsdot;": "\u2a97", + "emacr;": "\u0113", + "empty;": "\u2205", + "emptyset;": "\u2205", + "emptyv;": "\u2205", + "emsp13;": "\u2004", + "emsp14;": "\u2005", + "emsp;": "\u2003", + "eng;": "\u014b", + "ensp;": "\u2002", + "eogon;": "\u0119", + "eopf;": "\U0001d556", + "epar;": "\u22d5", + "eparsl;": "\u29e3", + "eplus;": "\u2a71", + "epsi;": "\u03b5", + "epsilon;": "\u03b5", + "epsiv;": "\u03f5", + "eqcirc;": "\u2256", + "eqcolon;": "\u2255", + "eqsim;": "\u2242", + "eqslantgtr;": "\u2a96", + "eqslantless;": "\u2a95", + "equals;": "=", + "equest;": "\u225f", + "equiv;": "\u2261", + "equivDD;": "\u2a78", + "eqvparsl;": "\u29e5", + "erDot;": "\u2253", + "erarr;": "\u2971", + "escr;": "\u212f", + "esdot;": "\u2250", + "esim;": "\u2242", + "eta;": "\u03b7", + "eth": "\xf0", + "eth;": "\xf0", + "euml": "\xeb", + "euml;": "\xeb", + "euro;": "\u20ac", + "excl;": "!", + "exist;": "\u2203", + "expectation;": "\u2130", + "exponentiale;": "\u2147", + "fallingdotseq;": "\u2252", + "fcy;": "\u0444", + "female;": "\u2640", + "ffilig;": "\ufb03", + "fflig;": "\ufb00", + "ffllig;": "\ufb04", + "ffr;": "\U0001d523", + "filig;": "\ufb01", + "fjlig;": "fj", + "flat;": "\u266d", + "fllig;": "\ufb02", + "fltns;": "\u25b1", + "fnof;": "\u0192", + "fopf;": "\U0001d557", + "forall;": "\u2200", + "fork;": "\u22d4", + "forkv;": "\u2ad9", + "fpartint;": "\u2a0d", + "frac12": "\xbd", + "frac12;": "\xbd", + "frac13;": "\u2153", + "frac14": "\xbc", + "frac14;": "\xbc", + "frac15;": "\u2155", + "frac16;": "\u2159", + "frac18;": "\u215b", + "frac23;": "\u2154", + "frac25;": "\u2156", + "frac34": "\xbe", + "frac34;": "\xbe", + "frac35;": "\u2157", + "frac38;": "\u215c", + "frac45;": "\u2158", + "frac56;": "\u215a", + "frac58;": "\u215d", + "frac78;": "\u215e", + "frasl;": "\u2044", + "frown;": "\u2322", + "fscr;": "\U0001d4bb", + "gE;": "\u2267", + "gEl;": "\u2a8c", + "gacute;": "\u01f5", + "gamma;": "\u03b3", + "gammad;": "\u03dd", + "gap;": "\u2a86", + "gbreve;": "\u011f", + "gcirc;": "\u011d", + "gcy;": "\u0433", + "gdot;": "\u0121", + "ge;": "\u2265", + "gel;": "\u22db", + "geq;": "\u2265", + "geqq;": "\u2267", + "geqslant;": "\u2a7e", + "ges;": "\u2a7e", + "gescc;": "\u2aa9", + "gesdot;": "\u2a80", + "gesdoto;": "\u2a82", + "gesdotol;": "\u2a84", + "gesl;": "\u22db\ufe00", + "gesles;": "\u2a94", + "gfr;": "\U0001d524", + "gg;": "\u226b", + "ggg;": "\u22d9", + "gimel;": "\u2137", + "gjcy;": "\u0453", + "gl;": "\u2277", + "glE;": "\u2a92", + "gla;": "\u2aa5", + "glj;": "\u2aa4", + "gnE;": "\u2269", + "gnap;": "\u2a8a", + "gnapprox;": "\u2a8a", + "gne;": "\u2a88", + "gneq;": "\u2a88", + "gneqq;": "\u2269", + "gnsim;": "\u22e7", + "gopf;": "\U0001d558", + "grave;": "`", + "gscr;": "\u210a", + "gsim;": "\u2273", + "gsime;": "\u2a8e", + "gsiml;": "\u2a90", + "gt": ">", + "gt;": ">", + "gtcc;": "\u2aa7", + "gtcir;": "\u2a7a", + "gtdot;": "\u22d7", + "gtlPar;": "\u2995", + "gtquest;": "\u2a7c", + "gtrapprox;": "\u2a86", + "gtrarr;": "\u2978", + "gtrdot;": "\u22d7", + "gtreqless;": "\u22db", + "gtreqqless;": "\u2a8c", + "gtrless;": "\u2277", + "gtrsim;": "\u2273", + "gvertneqq;": "\u2269\ufe00", + "gvnE;": "\u2269\ufe00", + "hArr;": "\u21d4", + "hairsp;": "\u200a", + "half;": "\xbd", + "hamilt;": "\u210b", + "hardcy;": "\u044a", + "harr;": "\u2194", + "harrcir;": "\u2948", + "harrw;": "\u21ad", + "hbar;": "\u210f", + "hcirc;": "\u0125", + "hearts;": "\u2665", + "heartsuit;": "\u2665", + "hellip;": "\u2026", + "hercon;": "\u22b9", + "hfr;": "\U0001d525", + "hksearow;": "\u2925", + "hkswarow;": "\u2926", + "hoarr;": "\u21ff", + "homtht;": "\u223b", + "hookleftarrow;": "\u21a9", + "hookrightarrow;": "\u21aa", + "hopf;": "\U0001d559", + "horbar;": "\u2015", + "hscr;": "\U0001d4bd", + "hslash;": "\u210f", + "hstrok;": "\u0127", + "hybull;": "\u2043", + "hyphen;": "\u2010", + "iacute": "\xed", + "iacute;": "\xed", + "ic;": "\u2063", + "icirc": "\xee", + "icirc;": "\xee", + "icy;": "\u0438", + "iecy;": "\u0435", + "iexcl": "\xa1", + "iexcl;": "\xa1", + "iff;": "\u21d4", + "ifr;": "\U0001d526", + "igrave": "\xec", + "igrave;": "\xec", + "ii;": "\u2148", + "iiiint;": "\u2a0c", + "iiint;": "\u222d", + "iinfin;": "\u29dc", + "iiota;": "\u2129", + "ijlig;": "\u0133", + "imacr;": "\u012b", + "image;": "\u2111", + "imagline;": "\u2110", + "imagpart;": "\u2111", + "imath;": "\u0131", + "imof;": "\u22b7", + "imped;": "\u01b5", + "in;": "\u2208", + "incare;": "\u2105", + "infin;": "\u221e", + "infintie;": "\u29dd", + "inodot;": "\u0131", + "int;": "\u222b", + "intcal;": "\u22ba", + "integers;": "\u2124", + "intercal;": "\u22ba", + "intlarhk;": "\u2a17", + "intprod;": "\u2a3c", + "iocy;": "\u0451", + "iogon;": "\u012f", + "iopf;": "\U0001d55a", + "iota;": "\u03b9", + "iprod;": "\u2a3c", + "iquest": "\xbf", + "iquest;": "\xbf", + "iscr;": "\U0001d4be", + "isin;": "\u2208", + "isinE;": "\u22f9", + "isindot;": "\u22f5", + "isins;": "\u22f4", + "isinsv;": "\u22f3", + "isinv;": "\u2208", + "it;": "\u2062", + "itilde;": "\u0129", + "iukcy;": "\u0456", + "iuml": "\xef", + "iuml;": "\xef", + "jcirc;": "\u0135", + "jcy;": "\u0439", + "jfr;": "\U0001d527", + "jmath;": "\u0237", + "jopf;": "\U0001d55b", + "jscr;": "\U0001d4bf", + "jsercy;": "\u0458", + "jukcy;": "\u0454", + "kappa;": "\u03ba", + "kappav;": "\u03f0", + "kcedil;": "\u0137", + "kcy;": "\u043a", + "kfr;": "\U0001d528", + "kgreen;": "\u0138", + "khcy;": "\u0445", + "kjcy;": "\u045c", + "kopf;": "\U0001d55c", + "kscr;": "\U0001d4c0", + "lAarr;": "\u21da", + "lArr;": "\u21d0", + "lAtail;": "\u291b", + "lBarr;": "\u290e", + "lE;": "\u2266", + "lEg;": "\u2a8b", + "lHar;": "\u2962", + "lacute;": "\u013a", + "laemptyv;": "\u29b4", + "lagran;": "\u2112", + "lambda;": "\u03bb", + "lang;": "\u27e8", + "langd;": "\u2991", + "langle;": "\u27e8", + "lap;": "\u2a85", + "laquo": "\xab", + "laquo;": "\xab", + "larr;": "\u2190", + "larrb;": "\u21e4", + "larrbfs;": "\u291f", + "larrfs;": "\u291d", + "larrhk;": "\u21a9", + "larrlp;": "\u21ab", + "larrpl;": "\u2939", + "larrsim;": "\u2973", + "larrtl;": "\u21a2", + "lat;": "\u2aab", + "latail;": "\u2919", + "late;": "\u2aad", + "lates;": "\u2aad\ufe00", + "lbarr;": "\u290c", + "lbbrk;": "\u2772", + "lbrace;": "{", + "lbrack;": "[", + "lbrke;": "\u298b", + "lbrksld;": "\u298f", + "lbrkslu;": "\u298d", + "lcaron;": "\u013e", + "lcedil;": "\u013c", + "lceil;": "\u2308", + "lcub;": "{", + "lcy;": "\u043b", + "ldca;": "\u2936", + "ldquo;": "\u201c", + "ldquor;": "\u201e", + "ldrdhar;": "\u2967", + "ldrushar;": "\u294b", + "ldsh;": "\u21b2", + "le;": "\u2264", + "leftarrow;": "\u2190", + "leftarrowtail;": "\u21a2", + "leftharpoondown;": "\u21bd", + "leftharpoonup;": "\u21bc", + "leftleftarrows;": "\u21c7", + "leftrightarrow;": "\u2194", + "leftrightarrows;": "\u21c6", + "leftrightharpoons;": "\u21cb", + "leftrightsquigarrow;": "\u21ad", + "leftthreetimes;": "\u22cb", + "leg;": "\u22da", + "leq;": "\u2264", + "leqq;": "\u2266", + "leqslant;": "\u2a7d", + "les;": "\u2a7d", + "lescc;": "\u2aa8", + "lesdot;": "\u2a7f", + "lesdoto;": "\u2a81", + "lesdotor;": "\u2a83", + "lesg;": "\u22da\ufe00", + "lesges;": "\u2a93", + "lessapprox;": "\u2a85", + "lessdot;": "\u22d6", + "lesseqgtr;": "\u22da", + "lesseqqgtr;": "\u2a8b", + "lessgtr;": "\u2276", + "lesssim;": "\u2272", + "lfisht;": "\u297c", + "lfloor;": "\u230a", + "lfr;": "\U0001d529", + "lg;": "\u2276", + "lgE;": "\u2a91", + "lhard;": "\u21bd", + "lharu;": "\u21bc", + "lharul;": "\u296a", + "lhblk;": "\u2584", + "ljcy;": "\u0459", + "ll;": "\u226a", + "llarr;": "\u21c7", + "llcorner;": "\u231e", + "llhard;": "\u296b", + "lltri;": "\u25fa", + "lmidot;": "\u0140", + "lmoust;": "\u23b0", + "lmoustache;": "\u23b0", + "lnE;": "\u2268", + "lnap;": "\u2a89", + "lnapprox;": "\u2a89", + "lne;": "\u2a87", + "lneq;": "\u2a87", + "lneqq;": "\u2268", + "lnsim;": "\u22e6", + "loang;": "\u27ec", + "loarr;": "\u21fd", + "lobrk;": "\u27e6", + "longleftarrow;": "\u27f5", + "longleftrightarrow;": "\u27f7", + "longmapsto;": "\u27fc", + "longrightarrow;": "\u27f6", + "looparrowleft;": "\u21ab", + "looparrowright;": "\u21ac", + "lopar;": "\u2985", + "lopf;": "\U0001d55d", + "loplus;": "\u2a2d", + "lotimes;": "\u2a34", + "lowast;": "\u2217", + "lowbar;": "_", + "loz;": "\u25ca", + "lozenge;": "\u25ca", + "lozf;": "\u29eb", + "lpar;": "(", + "lparlt;": "\u2993", + "lrarr;": "\u21c6", + "lrcorner;": "\u231f", + "lrhar;": "\u21cb", + "lrhard;": "\u296d", + "lrm;": "\u200e", + "lrtri;": "\u22bf", + "lsaquo;": "\u2039", + "lscr;": "\U0001d4c1", + "lsh;": "\u21b0", + "lsim;": "\u2272", + "lsime;": "\u2a8d", + "lsimg;": "\u2a8f", + "lsqb;": "[", + "lsquo;": "\u2018", + "lsquor;": "\u201a", + "lstrok;": "\u0142", + "lt": "<", + "lt;": "<", + "ltcc;": "\u2aa6", + "ltcir;": "\u2a79", + "ltdot;": "\u22d6", + "lthree;": "\u22cb", + "ltimes;": "\u22c9", + "ltlarr;": "\u2976", + "ltquest;": "\u2a7b", + "ltrPar;": "\u2996", + "ltri;": "\u25c3", + "ltrie;": "\u22b4", + "ltrif;": "\u25c2", + "lurdshar;": "\u294a", + "luruhar;": "\u2966", + "lvertneqq;": "\u2268\ufe00", + "lvnE;": "\u2268\ufe00", + "mDDot;": "\u223a", + "macr": "\xaf", + "macr;": "\xaf", + "male;": "\u2642", + "malt;": "\u2720", + "maltese;": "\u2720", + "map;": "\u21a6", + "mapsto;": "\u21a6", + "mapstodown;": "\u21a7", + "mapstoleft;": "\u21a4", + "mapstoup;": "\u21a5", + "marker;": "\u25ae", + "mcomma;": "\u2a29", + "mcy;": "\u043c", + "mdash;": "\u2014", + "measuredangle;": "\u2221", + "mfr;": "\U0001d52a", + "mho;": "\u2127", + "micro": "\xb5", + "micro;": "\xb5", + "mid;": "\u2223", + "midast;": "*", + "midcir;": "\u2af0", + "middot": "\xb7", + "middot;": "\xb7", + "minus;": "\u2212", + "minusb;": "\u229f", + "minusd;": "\u2238", + "minusdu;": "\u2a2a", + "mlcp;": "\u2adb", + "mldr;": "\u2026", + "mnplus;": "\u2213", + "models;": "\u22a7", + "mopf;": "\U0001d55e", + "mp;": "\u2213", + "mscr;": "\U0001d4c2", + "mstpos;": "\u223e", + "mu;": "\u03bc", + "multimap;": "\u22b8", + "mumap;": "\u22b8", + "nGg;": "\u22d9\u0338", + "nGt;": "\u226b\u20d2", + "nGtv;": "\u226b\u0338", + "nLeftarrow;": "\u21cd", + "nLeftrightarrow;": "\u21ce", + "nLl;": "\u22d8\u0338", + "nLt;": "\u226a\u20d2", + "nLtv;": "\u226a\u0338", + "nRightarrow;": "\u21cf", + "nVDash;": "\u22af", + "nVdash;": "\u22ae", + "nabla;": "\u2207", + "nacute;": "\u0144", + "nang;": "\u2220\u20d2", + "nap;": "\u2249", + "napE;": "\u2a70\u0338", + "napid;": "\u224b\u0338", + "napos;": "\u0149", + "napprox;": "\u2249", + "natur;": "\u266e", + "natural;": "\u266e", + "naturals;": "\u2115", + "nbsp": "\xa0", + "nbsp;": "\xa0", + "nbump;": "\u224e\u0338", + "nbumpe;": "\u224f\u0338", + "ncap;": "\u2a43", + "ncaron;": "\u0148", + "ncedil;": "\u0146", + "ncong;": "\u2247", + "ncongdot;": "\u2a6d\u0338", + "ncup;": "\u2a42", + "ncy;": "\u043d", + "ndash;": "\u2013", + "ne;": "\u2260", + "neArr;": "\u21d7", + "nearhk;": "\u2924", + "nearr;": "\u2197", + "nearrow;": "\u2197", + "nedot;": "\u2250\u0338", + "nequiv;": "\u2262", + "nesear;": "\u2928", + "nesim;": "\u2242\u0338", + "nexist;": "\u2204", + "nexists;": "\u2204", + "nfr;": "\U0001d52b", + "ngE;": "\u2267\u0338", + "nge;": "\u2271", + "ngeq;": "\u2271", + "ngeqq;": "\u2267\u0338", + "ngeqslant;": "\u2a7e\u0338", + "nges;": "\u2a7e\u0338", + "ngsim;": "\u2275", + "ngt;": "\u226f", + "ngtr;": "\u226f", + "nhArr;": "\u21ce", + "nharr;": "\u21ae", + "nhpar;": "\u2af2", + "ni;": "\u220b", + "nis;": "\u22fc", + "nisd;": "\u22fa", + "niv;": "\u220b", + "njcy;": "\u045a", + "nlArr;": "\u21cd", + "nlE;": "\u2266\u0338", + "nlarr;": "\u219a", + "nldr;": "\u2025", + "nle;": "\u2270", + "nleftarrow;": "\u219a", + "nleftrightarrow;": "\u21ae", + "nleq;": "\u2270", + "nleqq;": "\u2266\u0338", + "nleqslant;": "\u2a7d\u0338", + "nles;": "\u2a7d\u0338", + "nless;": "\u226e", + "nlsim;": "\u2274", + "nlt;": "\u226e", + "nltri;": "\u22ea", + "nltrie;": "\u22ec", + "nmid;": "\u2224", + "nopf;": "\U0001d55f", + "not": "\xac", + "not;": "\xac", + "notin;": "\u2209", + "notinE;": "\u22f9\u0338", + "notindot;": "\u22f5\u0338", + "notinva;": "\u2209", + "notinvb;": "\u22f7", + "notinvc;": "\u22f6", + "notni;": "\u220c", + "notniva;": "\u220c", + "notnivb;": "\u22fe", + "notnivc;": "\u22fd", + "npar;": "\u2226", + "nparallel;": "\u2226", + "nparsl;": "\u2afd\u20e5", + "npart;": "\u2202\u0338", + "npolint;": "\u2a14", + "npr;": "\u2280", + "nprcue;": "\u22e0", + "npre;": "\u2aaf\u0338", + "nprec;": "\u2280", + "npreceq;": "\u2aaf\u0338", + "nrArr;": "\u21cf", + "nrarr;": "\u219b", + "nrarrc;": "\u2933\u0338", + "nrarrw;": "\u219d\u0338", + "nrightarrow;": "\u219b", + "nrtri;": "\u22eb", + "nrtrie;": "\u22ed", + "nsc;": "\u2281", + "nsccue;": "\u22e1", + "nsce;": "\u2ab0\u0338", + "nscr;": "\U0001d4c3", + "nshortmid;": "\u2224", + "nshortparallel;": "\u2226", + "nsim;": "\u2241", + "nsime;": "\u2244", + "nsimeq;": "\u2244", + "nsmid;": "\u2224", + "nspar;": "\u2226", + "nsqsube;": "\u22e2", + "nsqsupe;": "\u22e3", + "nsub;": "\u2284", + "nsubE;": "\u2ac5\u0338", + "nsube;": "\u2288", + "nsubset;": "\u2282\u20d2", + "nsubseteq;": "\u2288", + "nsubseteqq;": "\u2ac5\u0338", + "nsucc;": "\u2281", + "nsucceq;": "\u2ab0\u0338", + "nsup;": "\u2285", + "nsupE;": "\u2ac6\u0338", + "nsupe;": "\u2289", + "nsupset;": "\u2283\u20d2", + "nsupseteq;": "\u2289", + "nsupseteqq;": "\u2ac6\u0338", + "ntgl;": "\u2279", + "ntilde": "\xf1", + "ntilde;": "\xf1", + "ntlg;": "\u2278", + "ntriangleleft;": "\u22ea", + "ntrianglelefteq;": "\u22ec", + "ntriangleright;": "\u22eb", + "ntrianglerighteq;": "\u22ed", + "nu;": "\u03bd", + "num;": "#", + "numero;": "\u2116", + "numsp;": "\u2007", + "nvDash;": "\u22ad", + "nvHarr;": "\u2904", + "nvap;": "\u224d\u20d2", + "nvdash;": "\u22ac", + "nvge;": "\u2265\u20d2", + "nvgt;": ">\u20d2", + "nvinfin;": "\u29de", + "nvlArr;": "\u2902", + "nvle;": "\u2264\u20d2", + "nvlt;": "<\u20d2", + "nvltrie;": "\u22b4\u20d2", + "nvrArr;": "\u2903", + "nvrtrie;": "\u22b5\u20d2", + "nvsim;": "\u223c\u20d2", + "nwArr;": "\u21d6", + "nwarhk;": "\u2923", + "nwarr;": "\u2196", + "nwarrow;": "\u2196", + "nwnear;": "\u2927", + "oS;": "\u24c8", + "oacute": "\xf3", + "oacute;": "\xf3", + "oast;": "\u229b", + "ocir;": "\u229a", + "ocirc": "\xf4", + "ocirc;": "\xf4", + "ocy;": "\u043e", + "odash;": "\u229d", + "odblac;": "\u0151", + "odiv;": "\u2a38", + "odot;": "\u2299", + "odsold;": "\u29bc", + "oelig;": "\u0153", + "ofcir;": "\u29bf", + "ofr;": "\U0001d52c", + "ogon;": "\u02db", + "ograve": "\xf2", + "ograve;": "\xf2", + "ogt;": "\u29c1", + "ohbar;": "\u29b5", + "ohm;": "\u03a9", + "oint;": "\u222e", + "olarr;": "\u21ba", + "olcir;": "\u29be", + "olcross;": "\u29bb", + "oline;": "\u203e", + "olt;": "\u29c0", + "omacr;": "\u014d", + "omega;": "\u03c9", + "omicron;": "\u03bf", + "omid;": "\u29b6", + "ominus;": "\u2296", + "oopf;": "\U0001d560", + "opar;": "\u29b7", + "operp;": "\u29b9", + "oplus;": "\u2295", + "or;": "\u2228", + "orarr;": "\u21bb", + "ord;": "\u2a5d", + "order;": "\u2134", + "orderof;": "\u2134", + "ordf": "\xaa", + "ordf;": "\xaa", + "ordm": "\xba", + "ordm;": "\xba", + "origof;": "\u22b6", + "oror;": "\u2a56", + "orslope;": "\u2a57", + "orv;": "\u2a5b", + "oscr;": "\u2134", + "oslash": "\xf8", + "oslash;": "\xf8", + "osol;": "\u2298", + "otilde": "\xf5", + "otilde;": "\xf5", + "otimes;": "\u2297", + "otimesas;": "\u2a36", + "ouml": "\xf6", + "ouml;": "\xf6", + "ovbar;": "\u233d", + "par;": "\u2225", + "para": "\xb6", + "para;": "\xb6", + "parallel;": "\u2225", + "parsim;": "\u2af3", + "parsl;": "\u2afd", + "part;": "\u2202", + "pcy;": "\u043f", + "percnt;": "%", + "period;": ".", + "permil;": "\u2030", + "perp;": "\u22a5", + "pertenk;": "\u2031", + "pfr;": "\U0001d52d", + "phi;": "\u03c6", + "phiv;": "\u03d5", + "phmmat;": "\u2133", + "phone;": "\u260e", + "pi;": "\u03c0", + "pitchfork;": "\u22d4", + "piv;": "\u03d6", + "planck;": "\u210f", + "planckh;": "\u210e", + "plankv;": "\u210f", + "plus;": "+", + "plusacir;": "\u2a23", + "plusb;": "\u229e", + "pluscir;": "\u2a22", + "plusdo;": "\u2214", + "plusdu;": "\u2a25", + "pluse;": "\u2a72", + "plusmn": "\xb1", + "plusmn;": "\xb1", + "plussim;": "\u2a26", + "plustwo;": "\u2a27", + "pm;": "\xb1", + "pointint;": "\u2a15", + "popf;": "\U0001d561", + "pound": "\xa3", + "pound;": "\xa3", + "pr;": "\u227a", + "prE;": "\u2ab3", + "prap;": "\u2ab7", + "prcue;": "\u227c", + "pre;": "\u2aaf", + "prec;": "\u227a", + "precapprox;": "\u2ab7", + "preccurlyeq;": "\u227c", + "preceq;": "\u2aaf", + "precnapprox;": "\u2ab9", + "precneqq;": "\u2ab5", + "precnsim;": "\u22e8", + "precsim;": "\u227e", + "prime;": "\u2032", + "primes;": "\u2119", + "prnE;": "\u2ab5", + "prnap;": "\u2ab9", + "prnsim;": "\u22e8", + "prod;": "\u220f", + "profalar;": "\u232e", + "profline;": "\u2312", + "profsurf;": "\u2313", + "prop;": "\u221d", + "propto;": "\u221d", + "prsim;": "\u227e", + "prurel;": "\u22b0", + "pscr;": "\U0001d4c5", + "psi;": "\u03c8", + "puncsp;": "\u2008", + "qfr;": "\U0001d52e", + "qint;": "\u2a0c", + "qopf;": "\U0001d562", + "qprime;": "\u2057", + "qscr;": "\U0001d4c6", + "quaternions;": "\u210d", + "quatint;": "\u2a16", + "quest;": "?", + "questeq;": "\u225f", + "quot": "\"", + "quot;": "\"", + "rAarr;": "\u21db", + "rArr;": "\u21d2", + "rAtail;": "\u291c", + "rBarr;": "\u290f", + "rHar;": "\u2964", + "race;": "\u223d\u0331", + "racute;": "\u0155", + "radic;": "\u221a", + "raemptyv;": "\u29b3", + "rang;": "\u27e9", + "rangd;": "\u2992", + "range;": "\u29a5", + "rangle;": "\u27e9", + "raquo": "\xbb", + "raquo;": "\xbb", + "rarr;": "\u2192", + "rarrap;": "\u2975", + "rarrb;": "\u21e5", + "rarrbfs;": "\u2920", + "rarrc;": "\u2933", + "rarrfs;": "\u291e", + "rarrhk;": "\u21aa", + "rarrlp;": "\u21ac", + "rarrpl;": "\u2945", + "rarrsim;": "\u2974", + "rarrtl;": "\u21a3", + "rarrw;": "\u219d", + "ratail;": "\u291a", + "ratio;": "\u2236", + "rationals;": "\u211a", + "rbarr;": "\u290d", + "rbbrk;": "\u2773", + "rbrace;": "}", + "rbrack;": "]", + "rbrke;": "\u298c", + "rbrksld;": "\u298e", + "rbrkslu;": "\u2990", + "rcaron;": "\u0159", + "rcedil;": "\u0157", + "rceil;": "\u2309", + "rcub;": "}", + "rcy;": "\u0440", + "rdca;": "\u2937", + "rdldhar;": "\u2969", + "rdquo;": "\u201d", + "rdquor;": "\u201d", + "rdsh;": "\u21b3", + "real;": "\u211c", + "realine;": "\u211b", + "realpart;": "\u211c", + "reals;": "\u211d", + "rect;": "\u25ad", + "reg": "\xae", + "reg;": "\xae", + "rfisht;": "\u297d", + "rfloor;": "\u230b", + "rfr;": "\U0001d52f", + "rhard;": "\u21c1", + "rharu;": "\u21c0", + "rharul;": "\u296c", + "rho;": "\u03c1", + "rhov;": "\u03f1", + "rightarrow;": "\u2192", + "rightarrowtail;": "\u21a3", + "rightharpoondown;": "\u21c1", + "rightharpoonup;": "\u21c0", + "rightleftarrows;": "\u21c4", + "rightleftharpoons;": "\u21cc", + "rightrightarrows;": "\u21c9", + "rightsquigarrow;": "\u219d", + "rightthreetimes;": "\u22cc", + "ring;": "\u02da", + "risingdotseq;": "\u2253", + "rlarr;": "\u21c4", + "rlhar;": "\u21cc", + "rlm;": "\u200f", + "rmoust;": "\u23b1", + "rmoustache;": "\u23b1", + "rnmid;": "\u2aee", + "roang;": "\u27ed", + "roarr;": "\u21fe", + "robrk;": "\u27e7", + "ropar;": "\u2986", + "ropf;": "\U0001d563", + "roplus;": "\u2a2e", + "rotimes;": "\u2a35", + "rpar;": ")", + "rpargt;": "\u2994", + "rppolint;": "\u2a12", + "rrarr;": "\u21c9", + "rsaquo;": "\u203a", + "rscr;": "\U0001d4c7", + "rsh;": "\u21b1", + "rsqb;": "]", + "rsquo;": "\u2019", + "rsquor;": "\u2019", + "rthree;": "\u22cc", + "rtimes;": "\u22ca", + "rtri;": "\u25b9", + "rtrie;": "\u22b5", + "rtrif;": "\u25b8", + "rtriltri;": "\u29ce", + "ruluhar;": "\u2968", + "rx;": "\u211e", + "sacute;": "\u015b", + "sbquo;": "\u201a", + "sc;": "\u227b", + "scE;": "\u2ab4", + "scap;": "\u2ab8", + "scaron;": "\u0161", + "sccue;": "\u227d", + "sce;": "\u2ab0", + "scedil;": "\u015f", + "scirc;": "\u015d", + "scnE;": "\u2ab6", + "scnap;": "\u2aba", + "scnsim;": "\u22e9", + "scpolint;": "\u2a13", + "scsim;": "\u227f", + "scy;": "\u0441", + "sdot;": "\u22c5", + "sdotb;": "\u22a1", + "sdote;": "\u2a66", + "seArr;": "\u21d8", + "searhk;": "\u2925", + "searr;": "\u2198", + "searrow;": "\u2198", + "sect": "\xa7", + "sect;": "\xa7", + "semi;": ";", + "seswar;": "\u2929", + "setminus;": "\u2216", + "setmn;": "\u2216", + "sext;": "\u2736", + "sfr;": "\U0001d530", + "sfrown;": "\u2322", + "sharp;": "\u266f", + "shchcy;": "\u0449", + "shcy;": "\u0448", + "shortmid;": "\u2223", + "shortparallel;": "\u2225", + "shy": "\xad", + "shy;": "\xad", + "sigma;": "\u03c3", + "sigmaf;": "\u03c2", + "sigmav;": "\u03c2", + "sim;": "\u223c", + "simdot;": "\u2a6a", + "sime;": "\u2243", + "simeq;": "\u2243", + "simg;": "\u2a9e", + "simgE;": "\u2aa0", + "siml;": "\u2a9d", + "simlE;": "\u2a9f", + "simne;": "\u2246", + "simplus;": "\u2a24", + "simrarr;": "\u2972", + "slarr;": "\u2190", + "smallsetminus;": "\u2216", + "smashp;": "\u2a33", + "smeparsl;": "\u29e4", + "smid;": "\u2223", + "smile;": "\u2323", + "smt;": "\u2aaa", + "smte;": "\u2aac", + "smtes;": "\u2aac\ufe00", + "softcy;": "\u044c", + "sol;": "/", + "solb;": "\u29c4", + "solbar;": "\u233f", + "sopf;": "\U0001d564", + "spades;": "\u2660", + "spadesuit;": "\u2660", + "spar;": "\u2225", + "sqcap;": "\u2293", + "sqcaps;": "\u2293\ufe00", + "sqcup;": "\u2294", + "sqcups;": "\u2294\ufe00", + "sqsub;": "\u228f", + "sqsube;": "\u2291", + "sqsubset;": "\u228f", + "sqsubseteq;": "\u2291", + "sqsup;": "\u2290", + "sqsupe;": "\u2292", + "sqsupset;": "\u2290", + "sqsupseteq;": "\u2292", + "squ;": "\u25a1", + "square;": "\u25a1", + "squarf;": "\u25aa", + "squf;": "\u25aa", + "srarr;": "\u2192", + "sscr;": "\U0001d4c8", + "ssetmn;": "\u2216", + "ssmile;": "\u2323", + "sstarf;": "\u22c6", + "star;": "\u2606", + "starf;": "\u2605", + "straightepsilon;": "\u03f5", + "straightphi;": "\u03d5", + "strns;": "\xaf", + "sub;": "\u2282", + "subE;": "\u2ac5", + "subdot;": "\u2abd", + "sube;": "\u2286", + "subedot;": "\u2ac3", + "submult;": "\u2ac1", + "subnE;": "\u2acb", + "subne;": "\u228a", + "subplus;": "\u2abf", + "subrarr;": "\u2979", + "subset;": "\u2282", + "subseteq;": "\u2286", + "subseteqq;": "\u2ac5", + "subsetneq;": "\u228a", + "subsetneqq;": "\u2acb", + "subsim;": "\u2ac7", + "subsub;": "\u2ad5", + "subsup;": "\u2ad3", + "succ;": "\u227b", + "succapprox;": "\u2ab8", + "succcurlyeq;": "\u227d", + "succeq;": "\u2ab0", + "succnapprox;": "\u2aba", + "succneqq;": "\u2ab6", + "succnsim;": "\u22e9", + "succsim;": "\u227f", + "sum;": "\u2211", + "sung;": "\u266a", + "sup1": "\xb9", + "sup1;": "\xb9", + "sup2": "\xb2", + "sup2;": "\xb2", + "sup3": "\xb3", + "sup3;": "\xb3", + "sup;": "\u2283", + "supE;": "\u2ac6", + "supdot;": "\u2abe", + "supdsub;": "\u2ad8", + "supe;": "\u2287", + "supedot;": "\u2ac4", + "suphsol;": "\u27c9", + "suphsub;": "\u2ad7", + "suplarr;": "\u297b", + "supmult;": "\u2ac2", + "supnE;": "\u2acc", + "supne;": "\u228b", + "supplus;": "\u2ac0", + "supset;": "\u2283", + "supseteq;": "\u2287", + "supseteqq;": "\u2ac6", + "supsetneq;": "\u228b", + "supsetneqq;": "\u2acc", + "supsim;": "\u2ac8", + "supsub;": "\u2ad4", + "supsup;": "\u2ad6", + "swArr;": "\u21d9", + "swarhk;": "\u2926", + "swarr;": "\u2199", + "swarrow;": "\u2199", + "swnwar;": "\u292a", + "szlig": "\xdf", + "szlig;": "\xdf", + "target;": "\u2316", + "tau;": "\u03c4", + "tbrk;": "\u23b4", + "tcaron;": "\u0165", + "tcedil;": "\u0163", + "tcy;": "\u0442", + "tdot;": "\u20db", + "telrec;": "\u2315", + "tfr;": "\U0001d531", + "there4;": "\u2234", + "therefore;": "\u2234", + "theta;": "\u03b8", + "thetasym;": "\u03d1", + "thetav;": "\u03d1", + "thickapprox;": "\u2248", + "thicksim;": "\u223c", + "thinsp;": "\u2009", + "thkap;": "\u2248", + "thksim;": "\u223c", + "thorn": "\xfe", + "thorn;": "\xfe", + "tilde;": "\u02dc", + "times": "\xd7", + "times;": "\xd7", + "timesb;": "\u22a0", + "timesbar;": "\u2a31", + "timesd;": "\u2a30", + "tint;": "\u222d", + "toea;": "\u2928", + "top;": "\u22a4", + "topbot;": "\u2336", + "topcir;": "\u2af1", + "topf;": "\U0001d565", + "topfork;": "\u2ada", + "tosa;": "\u2929", + "tprime;": "\u2034", + "trade;": "\u2122", + "triangle;": "\u25b5", + "triangledown;": "\u25bf", + "triangleleft;": "\u25c3", + "trianglelefteq;": "\u22b4", + "triangleq;": "\u225c", + "triangleright;": "\u25b9", + "trianglerighteq;": "\u22b5", + "tridot;": "\u25ec", + "trie;": "\u225c", + "triminus;": "\u2a3a", + "triplus;": "\u2a39", + "trisb;": "\u29cd", + "tritime;": "\u2a3b", + "trpezium;": "\u23e2", + "tscr;": "\U0001d4c9", + "tscy;": "\u0446", + "tshcy;": "\u045b", + "tstrok;": "\u0167", + "twixt;": "\u226c", + "twoheadleftarrow;": "\u219e", + "twoheadrightarrow;": "\u21a0", + "uArr;": "\u21d1", + "uHar;": "\u2963", + "uacute": "\xfa", + "uacute;": "\xfa", + "uarr;": "\u2191", + "ubrcy;": "\u045e", + "ubreve;": "\u016d", + "ucirc": "\xfb", + "ucirc;": "\xfb", + "ucy;": "\u0443", + "udarr;": "\u21c5", + "udblac;": "\u0171", + "udhar;": "\u296e", + "ufisht;": "\u297e", + "ufr;": "\U0001d532", + "ugrave": "\xf9", + "ugrave;": "\xf9", + "uharl;": "\u21bf", + "uharr;": "\u21be", + "uhblk;": "\u2580", + "ulcorn;": "\u231c", + "ulcorner;": "\u231c", + "ulcrop;": "\u230f", + "ultri;": "\u25f8", + "umacr;": "\u016b", + "uml": "\xa8", + "uml;": "\xa8", + "uogon;": "\u0173", + "uopf;": "\U0001d566", + "uparrow;": "\u2191", + "updownarrow;": "\u2195", + "upharpoonleft;": "\u21bf", + "upharpoonright;": "\u21be", + "uplus;": "\u228e", + "upsi;": "\u03c5", + "upsih;": "\u03d2", + "upsilon;": "\u03c5", + "upuparrows;": "\u21c8", + "urcorn;": "\u231d", + "urcorner;": "\u231d", + "urcrop;": "\u230e", + "uring;": "\u016f", + "urtri;": "\u25f9", + "uscr;": "\U0001d4ca", + "utdot;": "\u22f0", + "utilde;": "\u0169", + "utri;": "\u25b5", + "utrif;": "\u25b4", + "uuarr;": "\u21c8", + "uuml": "\xfc", + "uuml;": "\xfc", + "uwangle;": "\u29a7", + "vArr;": "\u21d5", + "vBar;": "\u2ae8", + "vBarv;": "\u2ae9", + "vDash;": "\u22a8", + "vangrt;": "\u299c", + "varepsilon;": "\u03f5", + "varkappa;": "\u03f0", + "varnothing;": "\u2205", + "varphi;": "\u03d5", + "varpi;": "\u03d6", + "varpropto;": "\u221d", + "varr;": "\u2195", + "varrho;": "\u03f1", + "varsigma;": "\u03c2", + "varsubsetneq;": "\u228a\ufe00", + "varsubsetneqq;": "\u2acb\ufe00", + "varsupsetneq;": "\u228b\ufe00", + "varsupsetneqq;": "\u2acc\ufe00", + "vartheta;": "\u03d1", + "vartriangleleft;": "\u22b2", + "vartriangleright;": "\u22b3", + "vcy;": "\u0432", + "vdash;": "\u22a2", + "vee;": "\u2228", + "veebar;": "\u22bb", + "veeeq;": "\u225a", + "vellip;": "\u22ee", + "verbar;": "|", + "vert;": "|", + "vfr;": "\U0001d533", + "vltri;": "\u22b2", + "vnsub;": "\u2282\u20d2", + "vnsup;": "\u2283\u20d2", + "vopf;": "\U0001d567", + "vprop;": "\u221d", + "vrtri;": "\u22b3", + "vscr;": "\U0001d4cb", + "vsubnE;": "\u2acb\ufe00", + "vsubne;": "\u228a\ufe00", + "vsupnE;": "\u2acc\ufe00", + "vsupne;": "\u228b\ufe00", + "vzigzag;": "\u299a", + "wcirc;": "\u0175", + "wedbar;": "\u2a5f", + "wedge;": "\u2227", + "wedgeq;": "\u2259", + "weierp;": "\u2118", + "wfr;": "\U0001d534", + "wopf;": "\U0001d568", + "wp;": "\u2118", + "wr;": "\u2240", + "wreath;": "\u2240", + "wscr;": "\U0001d4cc", + "xcap;": "\u22c2", + "xcirc;": "\u25ef", + "xcup;": "\u22c3", + "xdtri;": "\u25bd", + "xfr;": "\U0001d535", + "xhArr;": "\u27fa", + "xharr;": "\u27f7", + "xi;": "\u03be", + "xlArr;": "\u27f8", + "xlarr;": "\u27f5", + "xmap;": "\u27fc", + "xnis;": "\u22fb", + "xodot;": "\u2a00", + "xopf;": "\U0001d569", + "xoplus;": "\u2a01", + "xotime;": "\u2a02", + "xrArr;": "\u27f9", + "xrarr;": "\u27f6", + "xscr;": "\U0001d4cd", + "xsqcup;": "\u2a06", + "xuplus;": "\u2a04", + "xutri;": "\u25b3", + "xvee;": "\u22c1", + "xwedge;": "\u22c0", + "yacute": "\xfd", + "yacute;": "\xfd", + "yacy;": "\u044f", + "ycirc;": "\u0177", + "ycy;": "\u044b", + "yen": "\xa5", + "yen;": "\xa5", + "yfr;": "\U0001d536", + "yicy;": "\u0457", + "yopf;": "\U0001d56a", + "yscr;": "\U0001d4ce", + "yucy;": "\u044e", + "yuml": "\xff", + "yuml;": "\xff", + "zacute;": "\u017a", + "zcaron;": "\u017e", + "zcy;": "\u0437", + "zdot;": "\u017c", + "zeetrf;": "\u2128", + "zeta;": "\u03b6", + "zfr;": "\U0001d537", + "zhcy;": "\u0436", + "zigrarr;": "\u21dd", + "zopf;": "\U0001d56b", + "zscr;": "\U0001d4cf", + "zwj;": "\u200d", + "zwnj;": "\u200c", +} + +replacementCharacters = { + 0x0: "\uFFFD", + 0x0d: "\u000D", + 0x80: "\u20AC", + 0x81: "\u0081", + 0x82: "\u201A", + 0x83: "\u0192", + 0x84: "\u201E", + 0x85: "\u2026", + 0x86: "\u2020", + 0x87: "\u2021", + 0x88: "\u02C6", + 0x89: "\u2030", + 0x8A: "\u0160", + 0x8B: "\u2039", + 0x8C: "\u0152", + 0x8D: "\u008D", + 0x8E: "\u017D", + 0x8F: "\u008F", + 0x90: "\u0090", + 0x91: "\u2018", + 0x92: "\u2019", + 0x93: "\u201C", + 0x94: "\u201D", + 0x95: "\u2022", + 0x96: "\u2013", + 0x97: "\u2014", + 0x98: "\u02DC", + 0x99: "\u2122", + 0x9A: "\u0161", + 0x9B: "\u203A", + 0x9C: "\u0153", + 0x9D: "\u009D", + 0x9E: "\u017E", + 0x9F: "\u0178", +} + +tokenTypes = { + "Doctype": 0, + "Characters": 1, + "SpaceCharacters": 2, + "StartTag": 3, + "EndTag": 4, + "EmptyTag": 5, + "Comment": 6, + "ParseError": 7 +} + +tagTokenTypes = frozenset([tokenTypes["StartTag"], tokenTypes["EndTag"], + tokenTypes["EmptyTag"]]) + + +prefixes = dict([(v, k) for k, v in namespaces.items()]) +prefixes["http://www.w3.org/1998/Math/MathML"] = "math" + + +class DataLossWarning(UserWarning): + """Raised when the current tree is unable to represent the input data""" + pass + + +class _ReparseException(Exception): + pass diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/constants 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/constants 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7d0321e025698ea7e59fcf800af52a86d6ea40c0 GIT binary patch literal 83207 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 literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/constants.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/constants.py new file mode 100644 index 0000000..1ff8041 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/constants.py @@ -0,0 +1,2947 @@ +from __future__ import absolute_import, division, unicode_literals + +import string + +EOF = None + +E = { + "null-character": + "Null character in input stream, replaced with U+FFFD.", + "invalid-codepoint": + "Invalid codepoint in stream.", + "incorrectly-placed-solidus": + "Solidus (/) incorrectly placed in tag.", + "incorrect-cr-newline-entity": + "Incorrect CR newline entity, replaced with LF.", + "illegal-windows-1252-entity": + "Entity used with illegal number (windows-1252 reference).", + "cant-convert-numeric-entity": + "Numeric entity couldn't be converted to character " + "(codepoint U+%(charAsInt)08x).", + "illegal-codepoint-for-numeric-entity": + "Numeric entity represents an illegal codepoint: " + "U+%(charAsInt)08x.", + "numeric-entity-without-semicolon": + "Numeric entity didn't end with ';'.", + "expected-numeric-entity-but-got-eof": + "Numeric entity expected. Got end of file instead.", + "expected-numeric-entity": + "Numeric entity expected but none found.", + "named-entity-without-semicolon": + "Named entity didn't end with ';'.", + "expected-named-entity": + "Named entity expected. Got none.", + "attributes-in-end-tag": + "End tag contains unexpected attributes.", + 'self-closing-flag-on-end-tag': + "End tag contains unexpected self-closing flag.", + "expected-tag-name-but-got-right-bracket": + "Expected tag name. Got '>' instead.", + "expected-tag-name-but-got-question-mark": + "Expected tag name. Got '?' instead. (HTML doesn't " + "support processing instructions.)", + "expected-tag-name": + "Expected tag name. Got something else instead", + "expected-closing-tag-but-got-right-bracket": + "Expected closing tag. Got '>' instead. Ignoring ''.", + "expected-closing-tag-but-got-eof": + "Expected closing tag. Unexpected end of file.", + "expected-closing-tag-but-got-char": + "Expected closing tag. Unexpected character '%(data)s' found.", + "eof-in-tag-name": + "Unexpected end of file in the tag name.", + "expected-attribute-name-but-got-eof": + "Unexpected end of file. Expected attribute name instead.", + "eof-in-attribute-name": + "Unexpected end of file in attribute name.", + "invalid-character-in-attribute-name": + "Invalid character in attribute name", + "duplicate-attribute": + "Dropped duplicate attribute on tag.", + "expected-end-of-tag-name-but-got-eof": + "Unexpected end of file. Expected = or end of tag.", + "expected-attribute-value-but-got-eof": + "Unexpected end of file. Expected attribute value.", + "expected-attribute-value-but-got-right-bracket": + "Expected attribute value. Got '>' instead.", + 'equals-in-unquoted-attribute-value': + "Unexpected = in unquoted attribute", + 'unexpected-character-in-unquoted-attribute-value': + "Unexpected character in unquoted attribute", + "invalid-character-after-attribute-name": + "Unexpected character after attribute name.", + "unexpected-character-after-attribute-value": + "Unexpected character after attribute value.", + "eof-in-attribute-value-double-quote": + "Unexpected end of file in attribute value (\").", + "eof-in-attribute-value-single-quote": + "Unexpected end of file in attribute value (').", + "eof-in-attribute-value-no-quotes": + "Unexpected end of file in attribute value.", + "unexpected-EOF-after-solidus-in-tag": + "Unexpected end of file in tag. Expected >", + "unexpected-character-after-solidus-in-tag": + "Unexpected character after / in tag. Expected >", + "expected-dashes-or-doctype": + "Expected '--' or 'DOCTYPE'. Not found.", + "unexpected-bang-after-double-dash-in-comment": + "Unexpected ! after -- in comment", + "unexpected-space-after-double-dash-in-comment": + "Unexpected space after -- in comment", + "incorrect-comment": + "Incorrect comment.", + "eof-in-comment": + "Unexpected end of file in comment.", + "eof-in-comment-end-dash": + "Unexpected end of file in comment (-)", + "unexpected-dash-after-double-dash-in-comment": + "Unexpected '-' after '--' found in comment.", + "eof-in-comment-double-dash": + "Unexpected end of file in comment (--).", + "eof-in-comment-end-space-state": + "Unexpected end of file in comment.", + "eof-in-comment-end-bang-state": + "Unexpected end of file in comment.", + "unexpected-char-in-comment": + "Unexpected character in comment found.", + "need-space-after-doctype": + "No space after literal string 'DOCTYPE'.", + "expected-doctype-name-but-got-right-bracket": + "Unexpected > character. Expected DOCTYPE name.", + "expected-doctype-name-but-got-eof": + "Unexpected end of file. Expected DOCTYPE name.", + "eof-in-doctype-name": + "Unexpected end of file in DOCTYPE name.", + "eof-in-doctype": + "Unexpected end of file in DOCTYPE.", + "expected-space-or-right-bracket-in-doctype": + "Expected space or '>'. Got '%(data)s'", + "unexpected-end-of-doctype": + "Unexpected end of DOCTYPE.", + "unexpected-char-in-doctype": + "Unexpected character in DOCTYPE.", + "eof-in-innerhtml": + "XXX innerHTML EOF", + "unexpected-doctype": + "Unexpected DOCTYPE. Ignored.", + "non-html-root": + "html needs to be the first start tag.", + "expected-doctype-but-got-eof": + "Unexpected End of file. Expected DOCTYPE.", + "unknown-doctype": + "Erroneous DOCTYPE.", + "expected-doctype-but-got-chars": + "Unexpected non-space characters. Expected DOCTYPE.", + "expected-doctype-but-got-start-tag": + "Unexpected start tag (%(name)s). Expected DOCTYPE.", + "expected-doctype-but-got-end-tag": + "Unexpected end tag (%(name)s). Expected DOCTYPE.", + "end-tag-after-implied-root": + "Unexpected end tag (%(name)s) after the (implied) root element.", + "expected-named-closing-tag-but-got-eof": + "Unexpected end of file. Expected end tag (%(name)s).", + "two-heads-are-not-better-than-one": + "Unexpected start tag head in existing head. Ignored.", + "unexpected-end-tag": + "Unexpected end tag (%(name)s). Ignored.", + "unexpected-start-tag-out-of-my-head": + "Unexpected start tag (%(name)s) that can be in head. Moved.", + "unexpected-start-tag": + "Unexpected start tag (%(name)s).", + "missing-end-tag": + "Missing end tag (%(name)s).", + "missing-end-tags": + "Missing end tags (%(name)s).", + "unexpected-start-tag-implies-end-tag": + "Unexpected start tag (%(startName)s) " + "implies end tag (%(endName)s).", + "unexpected-start-tag-treated-as": + "Unexpected start tag (%(originalName)s). Treated as %(newName)s.", + "deprecated-tag": + "Unexpected start tag %(name)s. Don't use it!", + "unexpected-start-tag-ignored": + "Unexpected start tag %(name)s. Ignored.", + "expected-one-end-tag-but-got-another": + "Unexpected end tag (%(gotName)s). " + "Missing end tag (%(expectedName)s).", + "end-tag-too-early": + "End tag (%(name)s) seen too early. Expected other end tag.", + "end-tag-too-early-named": + "Unexpected end tag (%(gotName)s). Expected end tag (%(expectedName)s).", + "end-tag-too-early-ignored": + "End tag (%(name)s) seen too early. Ignored.", + "adoption-agency-1.1": + "End tag (%(name)s) violates step 1, " + "paragraph 1 of the adoption agency algorithm.", + "adoption-agency-1.2": + "End tag (%(name)s) violates step 1, " + "paragraph 2 of the adoption agency algorithm.", + "adoption-agency-1.3": + "End tag (%(name)s) violates step 1, " + "paragraph 3 of the adoption agency algorithm.", + "adoption-agency-4.4": + "End tag (%(name)s) violates step 4, " + "paragraph 4 of the adoption agency algorithm.", + "unexpected-end-tag-treated-as": + "Unexpected end tag (%(originalName)s). Treated as %(newName)s.", + "no-end-tag": + "This element (%(name)s) has no end tag.", + "unexpected-implied-end-tag-in-table": + "Unexpected implied end tag (%(name)s) in the table phase.", + "unexpected-implied-end-tag-in-table-body": + "Unexpected implied end tag (%(name)s) in the table body phase.", + "unexpected-char-implies-table-voodoo": + "Unexpected non-space characters in " + "table context caused voodoo mode.", + "unexpected-hidden-input-in-table": + "Unexpected input with type hidden in table context.", + "unexpected-form-in-table": + "Unexpected form in table context.", + "unexpected-start-tag-implies-table-voodoo": + "Unexpected start tag (%(name)s) in " + "table context caused voodoo mode.", + "unexpected-end-tag-implies-table-voodoo": + "Unexpected end tag (%(name)s) in " + "table context caused voodoo mode.", + "unexpected-cell-in-table-body": + "Unexpected table cell start tag (%(name)s) " + "in the table body phase.", + "unexpected-cell-end-tag": + "Got table cell end tag (%(name)s) " + "while required end tags are missing.", + "unexpected-end-tag-in-table-body": + "Unexpected end tag (%(name)s) in the table body phase. Ignored.", + "unexpected-implied-end-tag-in-table-row": + "Unexpected implied end tag (%(name)s) in the table row phase.", + "unexpected-end-tag-in-table-row": + "Unexpected end tag (%(name)s) in the table row phase. Ignored.", + "unexpected-select-in-select": + "Unexpected select start tag in the select phase " + "treated as select end tag.", + "unexpected-input-in-select": + "Unexpected input start tag in the select phase.", + "unexpected-start-tag-in-select": + "Unexpected start tag token (%(name)s in the select phase. " + "Ignored.", + "unexpected-end-tag-in-select": + "Unexpected end tag (%(name)s) in the select phase. Ignored.", + "unexpected-table-element-start-tag-in-select-in-table": + "Unexpected table element start tag (%(name)s) in the select in table phase.", + "unexpected-table-element-end-tag-in-select-in-table": + "Unexpected table element end tag (%(name)s) in the select in table phase.", + "unexpected-char-after-body": + "Unexpected non-space characters in the after body phase.", + "unexpected-start-tag-after-body": + "Unexpected start tag token (%(name)s)" + " in the after body phase.", + "unexpected-end-tag-after-body": + "Unexpected end tag token (%(name)s)" + " in the after body phase.", + "unexpected-char-in-frameset": + "Unexpected characters in the frameset phase. Characters ignored.", + "unexpected-start-tag-in-frameset": + "Unexpected start tag token (%(name)s)" + " in the frameset phase. Ignored.", + "unexpected-frameset-in-frameset-innerhtml": + "Unexpected end tag token (frameset) " + "in the frameset phase (innerHTML).", + "unexpected-end-tag-in-frameset": + "Unexpected end tag token (%(name)s)" + " in the frameset phase. Ignored.", + "unexpected-char-after-frameset": + "Unexpected non-space characters in the " + "after frameset phase. Ignored.", + "unexpected-start-tag-after-frameset": + "Unexpected start tag (%(name)s)" + " in the after frameset phase. Ignored.", + "unexpected-end-tag-after-frameset": + "Unexpected end tag (%(name)s)" + " in the after frameset phase. Ignored.", + "unexpected-end-tag-after-body-innerhtml": + "Unexpected end tag after body(innerHtml)", + "expected-eof-but-got-char": + "Unexpected non-space characters. Expected end of file.", + "expected-eof-but-got-start-tag": + "Unexpected start tag (%(name)s)" + ". Expected end of file.", + "expected-eof-but-got-end-tag": + "Unexpected end tag (%(name)s)" + ". Expected end of file.", + "eof-in-table": + "Unexpected end of file. Expected table content.", + "eof-in-select": + "Unexpected end of file. Expected select content.", + "eof-in-frameset": + "Unexpected end of file. Expected frameset content.", + "eof-in-script-in-script": + "Unexpected end of file. Expected script content.", + "eof-in-foreign-lands": + "Unexpected end of file. Expected foreign content", + "non-void-element-with-trailing-solidus": + "Trailing solidus not allowed on element %(name)s", + "unexpected-html-element-in-foreign-content": + "Element %(name)s not allowed in a non-html context", + "unexpected-end-tag-before-html": + "Unexpected end tag (%(name)s) before html.", + "unexpected-inhead-noscript-tag": + "Element %(name)s not allowed in a inhead-noscript context", + "eof-in-head-noscript": + "Unexpected end of file. Expected inhead-noscript content", + "char-in-head-noscript": + "Unexpected non-space character. Expected inhead-noscript content", + "XXX-undefined-error": + "Undefined error (this sucks and should be fixed)", +} + +namespaces = { + "html": "http://www.w3.org/1999/xhtml", + "mathml": "http://www.w3.org/1998/Math/MathML", + "svg": "http://www.w3.org/2000/svg", + "xlink": "http://www.w3.org/1999/xlink", + "xml": "http://www.w3.org/XML/1998/namespace", + "xmlns": "http://www.w3.org/2000/xmlns/" +} + +scopingElements = frozenset([ + (namespaces["html"], "applet"), + (namespaces["html"], "caption"), + (namespaces["html"], "html"), + (namespaces["html"], "marquee"), + (namespaces["html"], "object"), + (namespaces["html"], "table"), + (namespaces["html"], "td"), + (namespaces["html"], "th"), + (namespaces["mathml"], "mi"), + (namespaces["mathml"], "mo"), + (namespaces["mathml"], "mn"), + (namespaces["mathml"], "ms"), + (namespaces["mathml"], "mtext"), + (namespaces["mathml"], "annotation-xml"), + (namespaces["svg"], "foreignObject"), + (namespaces["svg"], "desc"), + (namespaces["svg"], "title"), +]) + +formattingElements = frozenset([ + (namespaces["html"], "a"), + (namespaces["html"], "b"), + (namespaces["html"], "big"), + (namespaces["html"], "code"), + (namespaces["html"], "em"), + (namespaces["html"], "font"), + (namespaces["html"], "i"), + (namespaces["html"], "nobr"), + (namespaces["html"], "s"), + (namespaces["html"], "small"), + (namespaces["html"], "strike"), + (namespaces["html"], "strong"), + (namespaces["html"], "tt"), + (namespaces["html"], "u") +]) + +specialElements = frozenset([ + (namespaces["html"], "address"), + (namespaces["html"], "applet"), + (namespaces["html"], "area"), + (namespaces["html"], "article"), + (namespaces["html"], "aside"), + (namespaces["html"], "base"), + (namespaces["html"], "basefont"), + (namespaces["html"], "bgsound"), + (namespaces["html"], "blockquote"), + (namespaces["html"], "body"), + (namespaces["html"], "br"), + (namespaces["html"], "button"), + (namespaces["html"], "caption"), + (namespaces["html"], "center"), + (namespaces["html"], "col"), + (namespaces["html"], "colgroup"), + (namespaces["html"], "command"), + (namespaces["html"], "dd"), + (namespaces["html"], "details"), + (namespaces["html"], "dir"), + (namespaces["html"], "div"), + (namespaces["html"], "dl"), + (namespaces["html"], "dt"), + (namespaces["html"], "embed"), + (namespaces["html"], "fieldset"), + (namespaces["html"], "figure"), + (namespaces["html"], "footer"), + (namespaces["html"], "form"), + (namespaces["html"], "frame"), + (namespaces["html"], "frameset"), + (namespaces["html"], "h1"), + (namespaces["html"], "h2"), + (namespaces["html"], "h3"), + (namespaces["html"], "h4"), + (namespaces["html"], "h5"), + (namespaces["html"], "h6"), + (namespaces["html"], "head"), + (namespaces["html"], "header"), + (namespaces["html"], "hr"), + (namespaces["html"], "html"), + (namespaces["html"], "iframe"), + # Note that image is commented out in the spec as "this isn't an + # element that can end up on the stack, so it doesn't matter," + (namespaces["html"], "image"), + (namespaces["html"], "img"), + (namespaces["html"], "input"), + (namespaces["html"], "isindex"), + (namespaces["html"], "li"), + (namespaces["html"], "link"), + (namespaces["html"], "listing"), + (namespaces["html"], "marquee"), + (namespaces["html"], "menu"), + (namespaces["html"], "meta"), + (namespaces["html"], "nav"), + (namespaces["html"], "noembed"), + (namespaces["html"], "noframes"), + (namespaces["html"], "noscript"), + (namespaces["html"], "object"), + (namespaces["html"], "ol"), + (namespaces["html"], "p"), + (namespaces["html"], "param"), + (namespaces["html"], "plaintext"), + (namespaces["html"], "pre"), + (namespaces["html"], "script"), + (namespaces["html"], "section"), + (namespaces["html"], "select"), + (namespaces["html"], "style"), + (namespaces["html"], "table"), + (namespaces["html"], "tbody"), + (namespaces["html"], "td"), + (namespaces["html"], "textarea"), + (namespaces["html"], "tfoot"), + (namespaces["html"], "th"), + (namespaces["html"], "thead"), + (namespaces["html"], "title"), + (namespaces["html"], "tr"), + (namespaces["html"], "ul"), + (namespaces["html"], "wbr"), + (namespaces["html"], "xmp"), + (namespaces["svg"], "foreignObject") +]) + +htmlIntegrationPointElements = frozenset([ + (namespaces["mathml"], "annotation-xml"), + (namespaces["svg"], "foreignObject"), + (namespaces["svg"], "desc"), + (namespaces["svg"], "title") +]) + +mathmlTextIntegrationPointElements = frozenset([ + (namespaces["mathml"], "mi"), + (namespaces["mathml"], "mo"), + (namespaces["mathml"], "mn"), + (namespaces["mathml"], "ms"), + (namespaces["mathml"], "mtext") +]) + +adjustSVGAttributes = { + "attributename": "attributeName", + "attributetype": "attributeType", + "basefrequency": "baseFrequency", + "baseprofile": "baseProfile", + "calcmode": "calcMode", + "clippathunits": "clipPathUnits", + "contentscripttype": "contentScriptType", + "contentstyletype": "contentStyleType", + "diffuseconstant": "diffuseConstant", + "edgemode": "edgeMode", + "externalresourcesrequired": "externalResourcesRequired", + "filterres": "filterRes", + "filterunits": "filterUnits", + "glyphref": "glyphRef", + "gradienttransform": "gradientTransform", + "gradientunits": "gradientUnits", + "kernelmatrix": "kernelMatrix", + "kernelunitlength": "kernelUnitLength", + "keypoints": "keyPoints", + "keysplines": "keySplines", + "keytimes": "keyTimes", + "lengthadjust": "lengthAdjust", + "limitingconeangle": "limitingConeAngle", + "markerheight": "markerHeight", + "markerunits": "markerUnits", + "markerwidth": "markerWidth", + "maskcontentunits": "maskContentUnits", + "maskunits": "maskUnits", + "numoctaves": "numOctaves", + "pathlength": "pathLength", + "patterncontentunits": "patternContentUnits", + "patterntransform": "patternTransform", + "patternunits": "patternUnits", + "pointsatx": "pointsAtX", + "pointsaty": "pointsAtY", + "pointsatz": "pointsAtZ", + "preservealpha": "preserveAlpha", + "preserveaspectratio": "preserveAspectRatio", + "primitiveunits": "primitiveUnits", + "refx": "refX", + "refy": "refY", + "repeatcount": "repeatCount", + "repeatdur": "repeatDur", + "requiredextensions": "requiredExtensions", + "requiredfeatures": "requiredFeatures", + "specularconstant": "specularConstant", + "specularexponent": "specularExponent", + "spreadmethod": "spreadMethod", + "startoffset": "startOffset", + "stddeviation": "stdDeviation", + "stitchtiles": "stitchTiles", + "surfacescale": "surfaceScale", + "systemlanguage": "systemLanguage", + "tablevalues": "tableValues", + "targetx": "targetX", + "targety": "targetY", + "textlength": "textLength", + "viewbox": "viewBox", + "viewtarget": "viewTarget", + "xchannelselector": "xChannelSelector", + "ychannelselector": "yChannelSelector", + "zoomandpan": "zoomAndPan" +} + +adjustMathMLAttributes = {"definitionurl": "definitionURL"} + +adjustForeignAttributes = { + "xlink:actuate": ("xlink", "actuate", namespaces["xlink"]), + "xlink:arcrole": ("xlink", "arcrole", namespaces["xlink"]), + "xlink:href": ("xlink", "href", namespaces["xlink"]), + "xlink:role": ("xlink", "role", namespaces["xlink"]), + "xlink:show": ("xlink", "show", namespaces["xlink"]), + "xlink:title": ("xlink", "title", namespaces["xlink"]), + "xlink:type": ("xlink", "type", namespaces["xlink"]), + "xml:base": ("xml", "base", namespaces["xml"]), + "xml:lang": ("xml", "lang", namespaces["xml"]), + "xml:space": ("xml", "space", namespaces["xml"]), + "xmlns": (None, "xmlns", namespaces["xmlns"]), + "xmlns:xlink": ("xmlns", "xlink", namespaces["xmlns"]) +} + +unadjustForeignAttributes = dict([((ns, local), qname) for qname, (prefix, local, ns) in + adjustForeignAttributes.items()]) + +spaceCharacters = frozenset([ + "\t", + "\n", + "\u000C", + " ", + "\r" +]) + +tableInsertModeElements = frozenset([ + "table", + "tbody", + "tfoot", + "thead", + "tr" +]) + +asciiLowercase = frozenset(string.ascii_lowercase) +asciiUppercase = frozenset(string.ascii_uppercase) +asciiLetters = frozenset(string.ascii_letters) +digits = frozenset(string.digits) +hexDigits = frozenset(string.hexdigits) + +asciiUpper2Lower = dict([(ord(c), ord(c.lower())) + for c in string.ascii_uppercase]) + +# Heading elements need to be ordered +headingElements = ( + "h1", + "h2", + "h3", + "h4", + "h5", + "h6" +) + +voidElements = frozenset([ + "base", + "command", + "event-source", + "link", + "meta", + "hr", + "br", + "img", + "embed", + "param", + "area", + "col", + "input", + "source", + "track" +]) + +cdataElements = frozenset(['title', 'textarea']) + +rcdataElements = frozenset([ + 'style', + 'script', + 'xmp', + 'iframe', + 'noembed', + 'noframes', + 'noscript' +]) + +booleanAttributes = { + "": frozenset(["irrelevant", "itemscope"]), + "style": frozenset(["scoped"]), + "img": frozenset(["ismap"]), + "audio": frozenset(["autoplay", "controls"]), + "video": frozenset(["autoplay", "controls"]), + "script": frozenset(["defer", "async"]), + "details": frozenset(["open"]), + "datagrid": frozenset(["multiple", "disabled"]), + "command": frozenset(["hidden", "disabled", "checked", "default"]), + "hr": frozenset(["noshade"]), + "menu": frozenset(["autosubmit"]), + "fieldset": frozenset(["disabled", "readonly"]), + "option": frozenset(["disabled", "readonly", "selected"]), + "optgroup": frozenset(["disabled", "readonly"]), + "button": frozenset(["disabled", "autofocus"]), + "input": frozenset(["disabled", "readonly", "required", "autofocus", "checked", "ismap"]), + "select": frozenset(["disabled", "readonly", "autofocus", "multiple"]), + "output": frozenset(["disabled", "readonly"]), + "iframe": frozenset(["seamless"]), +} + +# entitiesWindows1252 has to be _ordered_ and needs to have an index. It +# therefore can't be a frozenset. +entitiesWindows1252 = ( + 8364, # 0x80 0x20AC EURO SIGN + 65533, # 0x81 UNDEFINED + 8218, # 0x82 0x201A SINGLE LOW-9 QUOTATION MARK + 402, # 0x83 0x0192 LATIN SMALL LETTER F WITH HOOK + 8222, # 0x84 0x201E DOUBLE LOW-9 QUOTATION MARK + 8230, # 0x85 0x2026 HORIZONTAL ELLIPSIS + 8224, # 0x86 0x2020 DAGGER + 8225, # 0x87 0x2021 DOUBLE DAGGER + 710, # 0x88 0x02C6 MODIFIER LETTER CIRCUMFLEX ACCENT + 8240, # 0x89 0x2030 PER MILLE SIGN + 352, # 0x8A 0x0160 LATIN CAPITAL LETTER S WITH CARON + 8249, # 0x8B 0x2039 SINGLE LEFT-POINTING ANGLE QUOTATION MARK + 338, # 0x8C 0x0152 LATIN CAPITAL LIGATURE OE + 65533, # 0x8D UNDEFINED + 381, # 0x8E 0x017D LATIN CAPITAL LETTER Z WITH CARON + 65533, # 0x8F UNDEFINED + 65533, # 0x90 UNDEFINED + 8216, # 0x91 0x2018 LEFT SINGLE QUOTATION MARK + 8217, # 0x92 0x2019 RIGHT SINGLE QUOTATION MARK + 8220, # 0x93 0x201C LEFT DOUBLE QUOTATION MARK + 8221, # 0x94 0x201D RIGHT DOUBLE QUOTATION MARK + 8226, # 0x95 0x2022 BULLET + 8211, # 0x96 0x2013 EN DASH + 8212, # 0x97 0x2014 EM DASH + 732, # 0x98 0x02DC SMALL TILDE + 8482, # 0x99 0x2122 TRADE MARK SIGN + 353, # 0x9A 0x0161 LATIN SMALL LETTER S WITH CARON + 8250, # 0x9B 0x203A SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + 339, # 0x9C 0x0153 LATIN SMALL LIGATURE OE + 65533, # 0x9D UNDEFINED + 382, # 0x9E 0x017E LATIN SMALL LETTER Z WITH CARON + 376 # 0x9F 0x0178 LATIN CAPITAL LETTER Y WITH DIAERESIS +) + +xmlEntities = frozenset(['lt;', 'gt;', 'amp;', 'apos;', 'quot;']) + +entities = { + "AElig": "\xc6", + "AElig;": "\xc6", + "AMP": "&", + "AMP;": "&", + "Aacute": "\xc1", + "Aacute;": "\xc1", + "Abreve;": "\u0102", + "Acirc": "\xc2", + "Acirc;": "\xc2", + "Acy;": "\u0410", + "Afr;": "\U0001d504", + "Agrave": "\xc0", + "Agrave;": "\xc0", + "Alpha;": "\u0391", + "Amacr;": "\u0100", + "And;": "\u2a53", + "Aogon;": "\u0104", + "Aopf;": "\U0001d538", + "ApplyFunction;": "\u2061", + "Aring": "\xc5", + "Aring;": "\xc5", + "Ascr;": "\U0001d49c", + "Assign;": "\u2254", + "Atilde": "\xc3", + "Atilde;": "\xc3", + "Auml": "\xc4", + "Auml;": "\xc4", + "Backslash;": "\u2216", + "Barv;": "\u2ae7", + "Barwed;": "\u2306", + "Bcy;": "\u0411", + "Because;": "\u2235", + "Bernoullis;": "\u212c", + "Beta;": "\u0392", + "Bfr;": "\U0001d505", + "Bopf;": "\U0001d539", + "Breve;": "\u02d8", + "Bscr;": "\u212c", + "Bumpeq;": "\u224e", + "CHcy;": "\u0427", + "COPY": "\xa9", + "COPY;": "\xa9", + "Cacute;": "\u0106", + "Cap;": "\u22d2", + "CapitalDifferentialD;": "\u2145", + "Cayleys;": "\u212d", + "Ccaron;": "\u010c", + "Ccedil": "\xc7", + "Ccedil;": "\xc7", + "Ccirc;": "\u0108", + "Cconint;": "\u2230", + "Cdot;": "\u010a", + "Cedilla;": "\xb8", + "CenterDot;": "\xb7", + "Cfr;": "\u212d", + "Chi;": "\u03a7", + "CircleDot;": "\u2299", + "CircleMinus;": "\u2296", + "CirclePlus;": "\u2295", + "CircleTimes;": "\u2297", + "ClockwiseContourIntegral;": "\u2232", + "CloseCurlyDoubleQuote;": "\u201d", + "CloseCurlyQuote;": "\u2019", + "Colon;": "\u2237", + "Colone;": "\u2a74", + "Congruent;": "\u2261", + "Conint;": "\u222f", + "ContourIntegral;": "\u222e", + "Copf;": "\u2102", + "Coproduct;": "\u2210", + "CounterClockwiseContourIntegral;": "\u2233", + "Cross;": "\u2a2f", + "Cscr;": "\U0001d49e", + "Cup;": "\u22d3", + "CupCap;": "\u224d", + "DD;": "\u2145", + "DDotrahd;": "\u2911", + "DJcy;": "\u0402", + "DScy;": "\u0405", + "DZcy;": "\u040f", + "Dagger;": "\u2021", + "Darr;": "\u21a1", + "Dashv;": "\u2ae4", + "Dcaron;": "\u010e", + "Dcy;": "\u0414", + "Del;": "\u2207", + "Delta;": "\u0394", + "Dfr;": "\U0001d507", + "DiacriticalAcute;": "\xb4", + "DiacriticalDot;": "\u02d9", + "DiacriticalDoubleAcute;": "\u02dd", + "DiacriticalGrave;": "`", + "DiacriticalTilde;": "\u02dc", + "Diamond;": "\u22c4", + "DifferentialD;": "\u2146", + "Dopf;": "\U0001d53b", + "Dot;": "\xa8", + "DotDot;": "\u20dc", + "DotEqual;": "\u2250", + "DoubleContourIntegral;": "\u222f", + "DoubleDot;": "\xa8", + "DoubleDownArrow;": "\u21d3", + "DoubleLeftArrow;": "\u21d0", + "DoubleLeftRightArrow;": "\u21d4", + "DoubleLeftTee;": "\u2ae4", + "DoubleLongLeftArrow;": "\u27f8", + "DoubleLongLeftRightArrow;": "\u27fa", + "DoubleLongRightArrow;": "\u27f9", + "DoubleRightArrow;": "\u21d2", + "DoubleRightTee;": "\u22a8", + "DoubleUpArrow;": "\u21d1", + "DoubleUpDownArrow;": "\u21d5", + "DoubleVerticalBar;": "\u2225", + "DownArrow;": "\u2193", + "DownArrowBar;": "\u2913", + "DownArrowUpArrow;": "\u21f5", + "DownBreve;": "\u0311", + "DownLeftRightVector;": "\u2950", + "DownLeftTeeVector;": "\u295e", + "DownLeftVector;": "\u21bd", + "DownLeftVectorBar;": "\u2956", + "DownRightTeeVector;": "\u295f", + "DownRightVector;": "\u21c1", + "DownRightVectorBar;": "\u2957", + "DownTee;": "\u22a4", + "DownTeeArrow;": "\u21a7", + "Downarrow;": "\u21d3", + "Dscr;": "\U0001d49f", + "Dstrok;": "\u0110", + "ENG;": "\u014a", + "ETH": "\xd0", + "ETH;": "\xd0", + "Eacute": "\xc9", + "Eacute;": "\xc9", + "Ecaron;": "\u011a", + "Ecirc": "\xca", + "Ecirc;": "\xca", + "Ecy;": "\u042d", + "Edot;": "\u0116", + "Efr;": "\U0001d508", + "Egrave": "\xc8", + "Egrave;": "\xc8", + "Element;": "\u2208", + "Emacr;": "\u0112", + "EmptySmallSquare;": "\u25fb", + "EmptyVerySmallSquare;": "\u25ab", + "Eogon;": "\u0118", + "Eopf;": "\U0001d53c", + "Epsilon;": "\u0395", + "Equal;": "\u2a75", + "EqualTilde;": "\u2242", + "Equilibrium;": "\u21cc", + "Escr;": "\u2130", + "Esim;": "\u2a73", + "Eta;": "\u0397", + "Euml": "\xcb", + "Euml;": "\xcb", + "Exists;": "\u2203", + "ExponentialE;": "\u2147", + "Fcy;": "\u0424", + "Ffr;": "\U0001d509", + "FilledSmallSquare;": "\u25fc", + "FilledVerySmallSquare;": "\u25aa", + "Fopf;": "\U0001d53d", + "ForAll;": "\u2200", + "Fouriertrf;": "\u2131", + "Fscr;": "\u2131", + "GJcy;": "\u0403", + "GT": ">", + "GT;": ">", + "Gamma;": "\u0393", + "Gammad;": "\u03dc", + "Gbreve;": "\u011e", + "Gcedil;": "\u0122", + "Gcirc;": "\u011c", + "Gcy;": "\u0413", + "Gdot;": "\u0120", + "Gfr;": "\U0001d50a", + "Gg;": "\u22d9", + "Gopf;": "\U0001d53e", + "GreaterEqual;": "\u2265", + "GreaterEqualLess;": "\u22db", + "GreaterFullEqual;": "\u2267", + "GreaterGreater;": "\u2aa2", + "GreaterLess;": "\u2277", + "GreaterSlantEqual;": "\u2a7e", + "GreaterTilde;": "\u2273", + "Gscr;": "\U0001d4a2", + "Gt;": "\u226b", + "HARDcy;": "\u042a", + "Hacek;": "\u02c7", + "Hat;": "^", + "Hcirc;": "\u0124", + "Hfr;": "\u210c", + "HilbertSpace;": "\u210b", + "Hopf;": "\u210d", + "HorizontalLine;": "\u2500", + "Hscr;": "\u210b", + "Hstrok;": "\u0126", + "HumpDownHump;": "\u224e", + "HumpEqual;": "\u224f", + "IEcy;": "\u0415", + "IJlig;": "\u0132", + "IOcy;": "\u0401", + "Iacute": "\xcd", + "Iacute;": "\xcd", + "Icirc": "\xce", + "Icirc;": "\xce", + "Icy;": "\u0418", + "Idot;": "\u0130", + "Ifr;": "\u2111", + "Igrave": "\xcc", + "Igrave;": "\xcc", + "Im;": "\u2111", + "Imacr;": "\u012a", + "ImaginaryI;": "\u2148", + "Implies;": "\u21d2", + "Int;": "\u222c", + "Integral;": "\u222b", + "Intersection;": "\u22c2", + "InvisibleComma;": "\u2063", + "InvisibleTimes;": "\u2062", + "Iogon;": "\u012e", + "Iopf;": "\U0001d540", + "Iota;": "\u0399", + "Iscr;": "\u2110", + "Itilde;": "\u0128", + "Iukcy;": "\u0406", + "Iuml": "\xcf", + "Iuml;": "\xcf", + "Jcirc;": "\u0134", + "Jcy;": "\u0419", + "Jfr;": "\U0001d50d", + "Jopf;": "\U0001d541", + "Jscr;": "\U0001d4a5", + "Jsercy;": "\u0408", + "Jukcy;": "\u0404", + "KHcy;": "\u0425", + "KJcy;": "\u040c", + "Kappa;": "\u039a", + "Kcedil;": "\u0136", + "Kcy;": "\u041a", + "Kfr;": "\U0001d50e", + "Kopf;": "\U0001d542", + "Kscr;": "\U0001d4a6", + "LJcy;": "\u0409", + "LT": "<", + "LT;": "<", + "Lacute;": "\u0139", + "Lambda;": "\u039b", + "Lang;": "\u27ea", + "Laplacetrf;": "\u2112", + "Larr;": "\u219e", + "Lcaron;": "\u013d", + "Lcedil;": "\u013b", + "Lcy;": "\u041b", + "LeftAngleBracket;": "\u27e8", + "LeftArrow;": "\u2190", + "LeftArrowBar;": "\u21e4", + "LeftArrowRightArrow;": "\u21c6", + "LeftCeiling;": "\u2308", + "LeftDoubleBracket;": "\u27e6", + "LeftDownTeeVector;": "\u2961", + "LeftDownVector;": "\u21c3", + "LeftDownVectorBar;": "\u2959", + "LeftFloor;": "\u230a", + "LeftRightArrow;": "\u2194", + "LeftRightVector;": "\u294e", + "LeftTee;": "\u22a3", + "LeftTeeArrow;": "\u21a4", + "LeftTeeVector;": "\u295a", + "LeftTriangle;": "\u22b2", + "LeftTriangleBar;": "\u29cf", + "LeftTriangleEqual;": "\u22b4", + "LeftUpDownVector;": "\u2951", + "LeftUpTeeVector;": "\u2960", + "LeftUpVector;": "\u21bf", + "LeftUpVectorBar;": "\u2958", + "LeftVector;": "\u21bc", + "LeftVectorBar;": "\u2952", + "Leftarrow;": "\u21d0", + "Leftrightarrow;": "\u21d4", + "LessEqualGreater;": "\u22da", + "LessFullEqual;": "\u2266", + "LessGreater;": "\u2276", + "LessLess;": "\u2aa1", + "LessSlantEqual;": "\u2a7d", + "LessTilde;": "\u2272", + "Lfr;": "\U0001d50f", + "Ll;": "\u22d8", + "Lleftarrow;": "\u21da", + "Lmidot;": "\u013f", + "LongLeftArrow;": "\u27f5", + "LongLeftRightArrow;": "\u27f7", + "LongRightArrow;": "\u27f6", + "Longleftarrow;": "\u27f8", + "Longleftrightarrow;": "\u27fa", + "Longrightarrow;": "\u27f9", + "Lopf;": "\U0001d543", + "LowerLeftArrow;": "\u2199", + "LowerRightArrow;": "\u2198", + "Lscr;": "\u2112", + "Lsh;": "\u21b0", + "Lstrok;": "\u0141", + "Lt;": "\u226a", + "Map;": "\u2905", + "Mcy;": "\u041c", + "MediumSpace;": "\u205f", + "Mellintrf;": "\u2133", + "Mfr;": "\U0001d510", + "MinusPlus;": "\u2213", + "Mopf;": "\U0001d544", + "Mscr;": "\u2133", + "Mu;": "\u039c", + "NJcy;": "\u040a", + "Nacute;": "\u0143", + "Ncaron;": "\u0147", + "Ncedil;": "\u0145", + "Ncy;": "\u041d", + "NegativeMediumSpace;": "\u200b", + "NegativeThickSpace;": "\u200b", + "NegativeThinSpace;": "\u200b", + "NegativeVeryThinSpace;": "\u200b", + "NestedGreaterGreater;": "\u226b", + "NestedLessLess;": "\u226a", + "NewLine;": "\n", + "Nfr;": "\U0001d511", + "NoBreak;": "\u2060", + "NonBreakingSpace;": "\xa0", + "Nopf;": "\u2115", + "Not;": "\u2aec", + "NotCongruent;": "\u2262", + "NotCupCap;": "\u226d", + "NotDoubleVerticalBar;": "\u2226", + "NotElement;": "\u2209", + "NotEqual;": "\u2260", + "NotEqualTilde;": "\u2242\u0338", + "NotExists;": "\u2204", + "NotGreater;": "\u226f", + "NotGreaterEqual;": "\u2271", + "NotGreaterFullEqual;": "\u2267\u0338", + "NotGreaterGreater;": "\u226b\u0338", + "NotGreaterLess;": "\u2279", + "NotGreaterSlantEqual;": "\u2a7e\u0338", + "NotGreaterTilde;": "\u2275", + "NotHumpDownHump;": "\u224e\u0338", + "NotHumpEqual;": "\u224f\u0338", + "NotLeftTriangle;": "\u22ea", + "NotLeftTriangleBar;": "\u29cf\u0338", + "NotLeftTriangleEqual;": "\u22ec", + "NotLess;": "\u226e", + "NotLessEqual;": "\u2270", + "NotLessGreater;": "\u2278", + "NotLessLess;": "\u226a\u0338", + "NotLessSlantEqual;": "\u2a7d\u0338", + "NotLessTilde;": "\u2274", + "NotNestedGreaterGreater;": "\u2aa2\u0338", + "NotNestedLessLess;": "\u2aa1\u0338", + "NotPrecedes;": "\u2280", + "NotPrecedesEqual;": "\u2aaf\u0338", + "NotPrecedesSlantEqual;": "\u22e0", + "NotReverseElement;": "\u220c", + "NotRightTriangle;": "\u22eb", + "NotRightTriangleBar;": "\u29d0\u0338", + "NotRightTriangleEqual;": "\u22ed", + "NotSquareSubset;": "\u228f\u0338", + "NotSquareSubsetEqual;": "\u22e2", + "NotSquareSuperset;": "\u2290\u0338", + "NotSquareSupersetEqual;": "\u22e3", + "NotSubset;": "\u2282\u20d2", + "NotSubsetEqual;": "\u2288", + "NotSucceeds;": "\u2281", + "NotSucceedsEqual;": "\u2ab0\u0338", + "NotSucceedsSlantEqual;": "\u22e1", + "NotSucceedsTilde;": "\u227f\u0338", + "NotSuperset;": "\u2283\u20d2", + "NotSupersetEqual;": "\u2289", + "NotTilde;": "\u2241", + "NotTildeEqual;": "\u2244", + "NotTildeFullEqual;": "\u2247", + "NotTildeTilde;": "\u2249", + "NotVerticalBar;": "\u2224", + "Nscr;": "\U0001d4a9", + "Ntilde": "\xd1", + "Ntilde;": "\xd1", + "Nu;": "\u039d", + "OElig;": "\u0152", + "Oacute": "\xd3", + "Oacute;": "\xd3", + "Ocirc": "\xd4", + "Ocirc;": "\xd4", + "Ocy;": "\u041e", + "Odblac;": "\u0150", + "Ofr;": "\U0001d512", + "Ograve": "\xd2", + "Ograve;": "\xd2", + "Omacr;": "\u014c", + "Omega;": "\u03a9", + "Omicron;": "\u039f", + "Oopf;": "\U0001d546", + "OpenCurlyDoubleQuote;": "\u201c", + "OpenCurlyQuote;": "\u2018", + "Or;": "\u2a54", + "Oscr;": "\U0001d4aa", + "Oslash": "\xd8", + "Oslash;": "\xd8", + "Otilde": "\xd5", + "Otilde;": "\xd5", + "Otimes;": "\u2a37", + "Ouml": "\xd6", + "Ouml;": "\xd6", + "OverBar;": "\u203e", + "OverBrace;": "\u23de", + "OverBracket;": "\u23b4", + "OverParenthesis;": "\u23dc", + "PartialD;": "\u2202", + "Pcy;": "\u041f", + "Pfr;": "\U0001d513", + "Phi;": "\u03a6", + "Pi;": "\u03a0", + "PlusMinus;": "\xb1", + "Poincareplane;": "\u210c", + "Popf;": "\u2119", + "Pr;": "\u2abb", + "Precedes;": "\u227a", + "PrecedesEqual;": "\u2aaf", + "PrecedesSlantEqual;": "\u227c", + "PrecedesTilde;": "\u227e", + "Prime;": "\u2033", + "Product;": "\u220f", + "Proportion;": "\u2237", + "Proportional;": "\u221d", + "Pscr;": "\U0001d4ab", + "Psi;": "\u03a8", + "QUOT": "\"", + "QUOT;": "\"", + "Qfr;": "\U0001d514", + "Qopf;": "\u211a", + "Qscr;": "\U0001d4ac", + "RBarr;": "\u2910", + "REG": "\xae", + "REG;": "\xae", + "Racute;": "\u0154", + "Rang;": "\u27eb", + "Rarr;": "\u21a0", + "Rarrtl;": "\u2916", + "Rcaron;": "\u0158", + "Rcedil;": "\u0156", + "Rcy;": "\u0420", + "Re;": "\u211c", + "ReverseElement;": "\u220b", + "ReverseEquilibrium;": "\u21cb", + "ReverseUpEquilibrium;": "\u296f", + "Rfr;": "\u211c", + "Rho;": "\u03a1", + "RightAngleBracket;": "\u27e9", + "RightArrow;": "\u2192", + "RightArrowBar;": "\u21e5", + "RightArrowLeftArrow;": "\u21c4", + "RightCeiling;": "\u2309", + "RightDoubleBracket;": "\u27e7", + "RightDownTeeVector;": "\u295d", + "RightDownVector;": "\u21c2", + "RightDownVectorBar;": "\u2955", + "RightFloor;": "\u230b", + "RightTee;": "\u22a2", + "RightTeeArrow;": "\u21a6", + "RightTeeVector;": "\u295b", + "RightTriangle;": "\u22b3", + "RightTriangleBar;": "\u29d0", + "RightTriangleEqual;": "\u22b5", + "RightUpDownVector;": "\u294f", + "RightUpTeeVector;": "\u295c", + "RightUpVector;": "\u21be", + "RightUpVectorBar;": "\u2954", + "RightVector;": "\u21c0", + "RightVectorBar;": "\u2953", + "Rightarrow;": "\u21d2", + "Ropf;": "\u211d", + "RoundImplies;": "\u2970", + "Rrightarrow;": "\u21db", + "Rscr;": "\u211b", + "Rsh;": "\u21b1", + "RuleDelayed;": "\u29f4", + "SHCHcy;": "\u0429", + "SHcy;": "\u0428", + "SOFTcy;": "\u042c", + "Sacute;": "\u015a", + "Sc;": "\u2abc", + "Scaron;": "\u0160", + "Scedil;": "\u015e", + "Scirc;": "\u015c", + "Scy;": "\u0421", + "Sfr;": "\U0001d516", + "ShortDownArrow;": "\u2193", + "ShortLeftArrow;": "\u2190", + "ShortRightArrow;": "\u2192", + "ShortUpArrow;": "\u2191", + "Sigma;": "\u03a3", + "SmallCircle;": "\u2218", + "Sopf;": "\U0001d54a", + "Sqrt;": "\u221a", + "Square;": "\u25a1", + "SquareIntersection;": "\u2293", + "SquareSubset;": "\u228f", + "SquareSubsetEqual;": "\u2291", + "SquareSuperset;": "\u2290", + "SquareSupersetEqual;": "\u2292", + "SquareUnion;": "\u2294", + "Sscr;": "\U0001d4ae", + "Star;": "\u22c6", + "Sub;": "\u22d0", + "Subset;": "\u22d0", + "SubsetEqual;": "\u2286", + "Succeeds;": "\u227b", + "SucceedsEqual;": "\u2ab0", + "SucceedsSlantEqual;": "\u227d", + "SucceedsTilde;": "\u227f", + "SuchThat;": "\u220b", + "Sum;": "\u2211", + "Sup;": "\u22d1", + "Superset;": "\u2283", + "SupersetEqual;": "\u2287", + "Supset;": "\u22d1", + "THORN": "\xde", + "THORN;": "\xde", + "TRADE;": "\u2122", + "TSHcy;": "\u040b", + "TScy;": "\u0426", + "Tab;": "\t", + "Tau;": "\u03a4", + "Tcaron;": "\u0164", + "Tcedil;": "\u0162", + "Tcy;": "\u0422", + "Tfr;": "\U0001d517", + "Therefore;": "\u2234", + "Theta;": "\u0398", + "ThickSpace;": "\u205f\u200a", + "ThinSpace;": "\u2009", + "Tilde;": "\u223c", + "TildeEqual;": "\u2243", + "TildeFullEqual;": "\u2245", + "TildeTilde;": "\u2248", + "Topf;": "\U0001d54b", + "TripleDot;": "\u20db", + "Tscr;": "\U0001d4af", + "Tstrok;": "\u0166", + "Uacute": "\xda", + "Uacute;": "\xda", + "Uarr;": "\u219f", + "Uarrocir;": "\u2949", + "Ubrcy;": "\u040e", + "Ubreve;": "\u016c", + "Ucirc": "\xdb", + "Ucirc;": "\xdb", + "Ucy;": "\u0423", + "Udblac;": "\u0170", + "Ufr;": "\U0001d518", + "Ugrave": "\xd9", + "Ugrave;": "\xd9", + "Umacr;": "\u016a", + "UnderBar;": "_", + "UnderBrace;": "\u23df", + "UnderBracket;": "\u23b5", + "UnderParenthesis;": "\u23dd", + "Union;": "\u22c3", + "UnionPlus;": "\u228e", + "Uogon;": "\u0172", + "Uopf;": "\U0001d54c", + "UpArrow;": "\u2191", + "UpArrowBar;": "\u2912", + "UpArrowDownArrow;": "\u21c5", + "UpDownArrow;": "\u2195", + "UpEquilibrium;": "\u296e", + "UpTee;": "\u22a5", + "UpTeeArrow;": "\u21a5", + "Uparrow;": "\u21d1", + "Updownarrow;": "\u21d5", + "UpperLeftArrow;": "\u2196", + "UpperRightArrow;": "\u2197", + "Upsi;": "\u03d2", + "Upsilon;": "\u03a5", + "Uring;": "\u016e", + "Uscr;": "\U0001d4b0", + "Utilde;": "\u0168", + "Uuml": "\xdc", + "Uuml;": "\xdc", + "VDash;": "\u22ab", + "Vbar;": "\u2aeb", + "Vcy;": "\u0412", + "Vdash;": "\u22a9", + "Vdashl;": "\u2ae6", + "Vee;": "\u22c1", + "Verbar;": "\u2016", + "Vert;": "\u2016", + "VerticalBar;": "\u2223", + "VerticalLine;": "|", + "VerticalSeparator;": "\u2758", + "VerticalTilde;": "\u2240", + "VeryThinSpace;": "\u200a", + "Vfr;": "\U0001d519", + "Vopf;": "\U0001d54d", + "Vscr;": "\U0001d4b1", + "Vvdash;": "\u22aa", + "Wcirc;": "\u0174", + "Wedge;": "\u22c0", + "Wfr;": "\U0001d51a", + "Wopf;": "\U0001d54e", + "Wscr;": "\U0001d4b2", + "Xfr;": "\U0001d51b", + "Xi;": "\u039e", + "Xopf;": "\U0001d54f", + "Xscr;": "\U0001d4b3", + "YAcy;": "\u042f", + "YIcy;": "\u0407", + "YUcy;": "\u042e", + "Yacute": "\xdd", + "Yacute;": "\xdd", + "Ycirc;": "\u0176", + "Ycy;": "\u042b", + "Yfr;": "\U0001d51c", + "Yopf;": "\U0001d550", + "Yscr;": "\U0001d4b4", + "Yuml;": "\u0178", + "ZHcy;": "\u0416", + "Zacute;": "\u0179", + "Zcaron;": "\u017d", + "Zcy;": "\u0417", + "Zdot;": "\u017b", + "ZeroWidthSpace;": "\u200b", + "Zeta;": "\u0396", + "Zfr;": "\u2128", + "Zopf;": "\u2124", + "Zscr;": "\U0001d4b5", + "aacute": "\xe1", + "aacute;": "\xe1", + "abreve;": "\u0103", + "ac;": "\u223e", + "acE;": "\u223e\u0333", + "acd;": "\u223f", + "acirc": "\xe2", + "acirc;": "\xe2", + "acute": "\xb4", + "acute;": "\xb4", + "acy;": "\u0430", + "aelig": "\xe6", + "aelig;": "\xe6", + "af;": "\u2061", + "afr;": "\U0001d51e", + "agrave": "\xe0", + "agrave;": "\xe0", + "alefsym;": "\u2135", + "aleph;": "\u2135", + "alpha;": "\u03b1", + "amacr;": "\u0101", + "amalg;": "\u2a3f", + "amp": "&", + "amp;": "&", + "and;": "\u2227", + "andand;": "\u2a55", + "andd;": "\u2a5c", + "andslope;": "\u2a58", + "andv;": "\u2a5a", + "ang;": "\u2220", + "ange;": "\u29a4", + "angle;": "\u2220", + "angmsd;": "\u2221", + "angmsdaa;": "\u29a8", + "angmsdab;": "\u29a9", + "angmsdac;": "\u29aa", + "angmsdad;": "\u29ab", + "angmsdae;": "\u29ac", + "angmsdaf;": "\u29ad", + "angmsdag;": "\u29ae", + "angmsdah;": "\u29af", + "angrt;": "\u221f", + "angrtvb;": "\u22be", + "angrtvbd;": "\u299d", + "angsph;": "\u2222", + "angst;": "\xc5", + "angzarr;": "\u237c", + "aogon;": "\u0105", + "aopf;": "\U0001d552", + "ap;": "\u2248", + "apE;": "\u2a70", + "apacir;": "\u2a6f", + "ape;": "\u224a", + "apid;": "\u224b", + "apos;": "'", + "approx;": "\u2248", + "approxeq;": "\u224a", + "aring": "\xe5", + "aring;": "\xe5", + "ascr;": "\U0001d4b6", + "ast;": "*", + "asymp;": "\u2248", + "asympeq;": "\u224d", + "atilde": "\xe3", + "atilde;": "\xe3", + "auml": "\xe4", + "auml;": "\xe4", + "awconint;": "\u2233", + "awint;": "\u2a11", + "bNot;": "\u2aed", + "backcong;": "\u224c", + "backepsilon;": "\u03f6", + "backprime;": "\u2035", + "backsim;": "\u223d", + "backsimeq;": "\u22cd", + "barvee;": "\u22bd", + "barwed;": "\u2305", + "barwedge;": "\u2305", + "bbrk;": "\u23b5", + "bbrktbrk;": "\u23b6", + "bcong;": "\u224c", + "bcy;": "\u0431", + "bdquo;": "\u201e", + "becaus;": "\u2235", + "because;": "\u2235", + "bemptyv;": "\u29b0", + "bepsi;": "\u03f6", + "bernou;": "\u212c", + "beta;": "\u03b2", + "beth;": "\u2136", + "between;": "\u226c", + "bfr;": "\U0001d51f", + "bigcap;": "\u22c2", + "bigcirc;": "\u25ef", + "bigcup;": "\u22c3", + "bigodot;": "\u2a00", + "bigoplus;": "\u2a01", + "bigotimes;": "\u2a02", + "bigsqcup;": "\u2a06", + "bigstar;": "\u2605", + "bigtriangledown;": "\u25bd", + "bigtriangleup;": "\u25b3", + "biguplus;": "\u2a04", + "bigvee;": "\u22c1", + "bigwedge;": "\u22c0", + "bkarow;": "\u290d", + "blacklozenge;": "\u29eb", + "blacksquare;": "\u25aa", + "blacktriangle;": "\u25b4", + "blacktriangledown;": "\u25be", + "blacktriangleleft;": "\u25c2", + "blacktriangleright;": "\u25b8", + "blank;": "\u2423", + "blk12;": "\u2592", + "blk14;": "\u2591", + "blk34;": "\u2593", + "block;": "\u2588", + "bne;": "=\u20e5", + "bnequiv;": "\u2261\u20e5", + "bnot;": "\u2310", + "bopf;": "\U0001d553", + "bot;": "\u22a5", + "bottom;": "\u22a5", + "bowtie;": "\u22c8", + "boxDL;": "\u2557", + "boxDR;": "\u2554", + "boxDl;": "\u2556", + "boxDr;": "\u2553", + "boxH;": "\u2550", + "boxHD;": "\u2566", + "boxHU;": "\u2569", + "boxHd;": "\u2564", + "boxHu;": "\u2567", + "boxUL;": "\u255d", + "boxUR;": "\u255a", + "boxUl;": "\u255c", + "boxUr;": "\u2559", + "boxV;": "\u2551", + "boxVH;": "\u256c", + "boxVL;": "\u2563", + "boxVR;": "\u2560", + "boxVh;": "\u256b", + "boxVl;": "\u2562", + "boxVr;": "\u255f", + "boxbox;": "\u29c9", + "boxdL;": "\u2555", + "boxdR;": "\u2552", + "boxdl;": "\u2510", + "boxdr;": "\u250c", + "boxh;": "\u2500", + "boxhD;": "\u2565", + "boxhU;": "\u2568", + "boxhd;": "\u252c", + "boxhu;": "\u2534", + "boxminus;": "\u229f", + "boxplus;": "\u229e", + "boxtimes;": "\u22a0", + "boxuL;": "\u255b", + "boxuR;": "\u2558", + "boxul;": "\u2518", + "boxur;": "\u2514", + "boxv;": "\u2502", + "boxvH;": "\u256a", + "boxvL;": "\u2561", + "boxvR;": "\u255e", + "boxvh;": "\u253c", + "boxvl;": "\u2524", + "boxvr;": "\u251c", + "bprime;": "\u2035", + "breve;": "\u02d8", + "brvbar": "\xa6", + "brvbar;": "\xa6", + "bscr;": "\U0001d4b7", + "bsemi;": "\u204f", + "bsim;": "\u223d", + "bsime;": "\u22cd", + "bsol;": "\\", + "bsolb;": "\u29c5", + "bsolhsub;": "\u27c8", + "bull;": "\u2022", + "bullet;": "\u2022", + "bump;": "\u224e", + "bumpE;": "\u2aae", + "bumpe;": "\u224f", + "bumpeq;": "\u224f", + "cacute;": "\u0107", + "cap;": "\u2229", + "capand;": "\u2a44", + "capbrcup;": "\u2a49", + "capcap;": "\u2a4b", + "capcup;": "\u2a47", + "capdot;": "\u2a40", + "caps;": "\u2229\ufe00", + "caret;": "\u2041", + "caron;": "\u02c7", + "ccaps;": "\u2a4d", + "ccaron;": "\u010d", + "ccedil": "\xe7", + "ccedil;": "\xe7", + "ccirc;": "\u0109", + "ccups;": "\u2a4c", + "ccupssm;": "\u2a50", + "cdot;": "\u010b", + "cedil": "\xb8", + "cedil;": "\xb8", + "cemptyv;": "\u29b2", + "cent": "\xa2", + "cent;": "\xa2", + "centerdot;": "\xb7", + "cfr;": "\U0001d520", + "chcy;": "\u0447", + "check;": "\u2713", + "checkmark;": "\u2713", + "chi;": "\u03c7", + "cir;": "\u25cb", + "cirE;": "\u29c3", + "circ;": "\u02c6", + "circeq;": "\u2257", + "circlearrowleft;": "\u21ba", + "circlearrowright;": "\u21bb", + "circledR;": "\xae", + "circledS;": "\u24c8", + "circledast;": "\u229b", + "circledcirc;": "\u229a", + "circleddash;": "\u229d", + "cire;": "\u2257", + "cirfnint;": "\u2a10", + "cirmid;": "\u2aef", + "cirscir;": "\u29c2", + "clubs;": "\u2663", + "clubsuit;": "\u2663", + "colon;": ":", + "colone;": "\u2254", + "coloneq;": "\u2254", + "comma;": ",", + "commat;": "@", + "comp;": "\u2201", + "compfn;": "\u2218", + "complement;": "\u2201", + "complexes;": "\u2102", + "cong;": "\u2245", + "congdot;": "\u2a6d", + "conint;": "\u222e", + "copf;": "\U0001d554", + "coprod;": "\u2210", + "copy": "\xa9", + "copy;": "\xa9", + "copysr;": "\u2117", + "crarr;": "\u21b5", + "cross;": "\u2717", + "cscr;": "\U0001d4b8", + "csub;": "\u2acf", + "csube;": "\u2ad1", + "csup;": "\u2ad0", + "csupe;": "\u2ad2", + "ctdot;": "\u22ef", + "cudarrl;": "\u2938", + "cudarrr;": "\u2935", + "cuepr;": "\u22de", + "cuesc;": "\u22df", + "cularr;": "\u21b6", + "cularrp;": "\u293d", + "cup;": "\u222a", + "cupbrcap;": "\u2a48", + "cupcap;": "\u2a46", + "cupcup;": "\u2a4a", + "cupdot;": "\u228d", + "cupor;": "\u2a45", + "cups;": "\u222a\ufe00", + "curarr;": "\u21b7", + "curarrm;": "\u293c", + "curlyeqprec;": "\u22de", + "curlyeqsucc;": "\u22df", + "curlyvee;": "\u22ce", + "curlywedge;": "\u22cf", + "curren": "\xa4", + "curren;": "\xa4", + "curvearrowleft;": "\u21b6", + "curvearrowright;": "\u21b7", + "cuvee;": "\u22ce", + "cuwed;": "\u22cf", + "cwconint;": "\u2232", + "cwint;": "\u2231", + "cylcty;": "\u232d", + "dArr;": "\u21d3", + "dHar;": "\u2965", + "dagger;": "\u2020", + "daleth;": "\u2138", + "darr;": "\u2193", + "dash;": "\u2010", + "dashv;": "\u22a3", + "dbkarow;": "\u290f", + "dblac;": "\u02dd", + "dcaron;": "\u010f", + "dcy;": "\u0434", + "dd;": "\u2146", + "ddagger;": "\u2021", + "ddarr;": "\u21ca", + "ddotseq;": "\u2a77", + "deg": "\xb0", + "deg;": "\xb0", + "delta;": "\u03b4", + "demptyv;": "\u29b1", + "dfisht;": "\u297f", + "dfr;": "\U0001d521", + "dharl;": "\u21c3", + "dharr;": "\u21c2", + "diam;": "\u22c4", + "diamond;": "\u22c4", + "diamondsuit;": "\u2666", + "diams;": "\u2666", + "die;": "\xa8", + "digamma;": "\u03dd", + "disin;": "\u22f2", + "div;": "\xf7", + "divide": "\xf7", + "divide;": "\xf7", + "divideontimes;": "\u22c7", + "divonx;": "\u22c7", + "djcy;": "\u0452", + "dlcorn;": "\u231e", + "dlcrop;": "\u230d", + "dollar;": "$", + "dopf;": "\U0001d555", + "dot;": "\u02d9", + "doteq;": "\u2250", + "doteqdot;": "\u2251", + "dotminus;": "\u2238", + "dotplus;": "\u2214", + "dotsquare;": "\u22a1", + "doublebarwedge;": "\u2306", + "downarrow;": "\u2193", + "downdownarrows;": "\u21ca", + "downharpoonleft;": "\u21c3", + "downharpoonright;": "\u21c2", + "drbkarow;": "\u2910", + "drcorn;": "\u231f", + "drcrop;": "\u230c", + "dscr;": "\U0001d4b9", + "dscy;": "\u0455", + "dsol;": "\u29f6", + "dstrok;": "\u0111", + "dtdot;": "\u22f1", + "dtri;": "\u25bf", + "dtrif;": "\u25be", + "duarr;": "\u21f5", + "duhar;": "\u296f", + "dwangle;": "\u29a6", + "dzcy;": "\u045f", + "dzigrarr;": "\u27ff", + "eDDot;": "\u2a77", + "eDot;": "\u2251", + "eacute": "\xe9", + "eacute;": "\xe9", + "easter;": "\u2a6e", + "ecaron;": "\u011b", + "ecir;": "\u2256", + "ecirc": "\xea", + "ecirc;": "\xea", + "ecolon;": "\u2255", + "ecy;": "\u044d", + "edot;": "\u0117", + "ee;": "\u2147", + "efDot;": "\u2252", + "efr;": "\U0001d522", + "eg;": "\u2a9a", + "egrave": "\xe8", + "egrave;": "\xe8", + "egs;": "\u2a96", + "egsdot;": "\u2a98", + "el;": "\u2a99", + "elinters;": "\u23e7", + "ell;": "\u2113", + "els;": "\u2a95", + "elsdot;": "\u2a97", + "emacr;": "\u0113", + "empty;": "\u2205", + "emptyset;": "\u2205", + "emptyv;": "\u2205", + "emsp13;": "\u2004", + "emsp14;": "\u2005", + "emsp;": "\u2003", + "eng;": "\u014b", + "ensp;": "\u2002", + "eogon;": "\u0119", + "eopf;": "\U0001d556", + "epar;": "\u22d5", + "eparsl;": "\u29e3", + "eplus;": "\u2a71", + "epsi;": "\u03b5", + "epsilon;": "\u03b5", + "epsiv;": "\u03f5", + "eqcirc;": "\u2256", + "eqcolon;": "\u2255", + "eqsim;": "\u2242", + "eqslantgtr;": "\u2a96", + "eqslantless;": "\u2a95", + "equals;": "=", + "equest;": "\u225f", + "equiv;": "\u2261", + "equivDD;": "\u2a78", + "eqvparsl;": "\u29e5", + "erDot;": "\u2253", + "erarr;": "\u2971", + "escr;": "\u212f", + "esdot;": "\u2250", + "esim;": "\u2242", + "eta;": "\u03b7", + "eth": "\xf0", + "eth;": "\xf0", + "euml": "\xeb", + "euml;": "\xeb", + "euro;": "\u20ac", + "excl;": "!", + "exist;": "\u2203", + "expectation;": "\u2130", + "exponentiale;": "\u2147", + "fallingdotseq;": "\u2252", + "fcy;": "\u0444", + "female;": "\u2640", + "ffilig;": "\ufb03", + "fflig;": "\ufb00", + "ffllig;": "\ufb04", + "ffr;": "\U0001d523", + "filig;": "\ufb01", + "fjlig;": "fj", + "flat;": "\u266d", + "fllig;": "\ufb02", + "fltns;": "\u25b1", + "fnof;": "\u0192", + "fopf;": "\U0001d557", + "forall;": "\u2200", + "fork;": "\u22d4", + "forkv;": "\u2ad9", + "fpartint;": "\u2a0d", + "frac12": "\xbd", + "frac12;": "\xbd", + "frac13;": "\u2153", + "frac14": "\xbc", + "frac14;": "\xbc", + "frac15;": "\u2155", + "frac16;": "\u2159", + "frac18;": "\u215b", + "frac23;": "\u2154", + "frac25;": "\u2156", + "frac34": "\xbe", + "frac34;": "\xbe", + "frac35;": "\u2157", + "frac38;": "\u215c", + "frac45;": "\u2158", + "frac56;": "\u215a", + "frac58;": "\u215d", + "frac78;": "\u215e", + "frasl;": "\u2044", + "frown;": "\u2322", + "fscr;": "\U0001d4bb", + "gE;": "\u2267", + "gEl;": "\u2a8c", + "gacute;": "\u01f5", + "gamma;": "\u03b3", + "gammad;": "\u03dd", + "gap;": "\u2a86", + "gbreve;": "\u011f", + "gcirc;": "\u011d", + "gcy;": "\u0433", + "gdot;": "\u0121", + "ge;": "\u2265", + "gel;": "\u22db", + "geq;": "\u2265", + "geqq;": "\u2267", + "geqslant;": "\u2a7e", + "ges;": "\u2a7e", + "gescc;": "\u2aa9", + "gesdot;": "\u2a80", + "gesdoto;": "\u2a82", + "gesdotol;": "\u2a84", + "gesl;": "\u22db\ufe00", + "gesles;": "\u2a94", + "gfr;": "\U0001d524", + "gg;": "\u226b", + "ggg;": "\u22d9", + "gimel;": "\u2137", + "gjcy;": "\u0453", + "gl;": "\u2277", + "glE;": "\u2a92", + "gla;": "\u2aa5", + "glj;": "\u2aa4", + "gnE;": "\u2269", + "gnap;": "\u2a8a", + "gnapprox;": "\u2a8a", + "gne;": "\u2a88", + "gneq;": "\u2a88", + "gneqq;": "\u2269", + "gnsim;": "\u22e7", + "gopf;": "\U0001d558", + "grave;": "`", + "gscr;": "\u210a", + "gsim;": "\u2273", + "gsime;": "\u2a8e", + "gsiml;": "\u2a90", + "gt": ">", + "gt;": ">", + "gtcc;": "\u2aa7", + "gtcir;": "\u2a7a", + "gtdot;": "\u22d7", + "gtlPar;": "\u2995", + "gtquest;": "\u2a7c", + "gtrapprox;": "\u2a86", + "gtrarr;": "\u2978", + "gtrdot;": "\u22d7", + "gtreqless;": "\u22db", + "gtreqqless;": "\u2a8c", + "gtrless;": "\u2277", + "gtrsim;": "\u2273", + "gvertneqq;": "\u2269\ufe00", + "gvnE;": "\u2269\ufe00", + "hArr;": "\u21d4", + "hairsp;": "\u200a", + "half;": "\xbd", + "hamilt;": "\u210b", + "hardcy;": "\u044a", + "harr;": "\u2194", + "harrcir;": "\u2948", + "harrw;": "\u21ad", + "hbar;": "\u210f", + "hcirc;": "\u0125", + "hearts;": "\u2665", + "heartsuit;": "\u2665", + "hellip;": "\u2026", + "hercon;": "\u22b9", + "hfr;": "\U0001d525", + "hksearow;": "\u2925", + "hkswarow;": "\u2926", + "hoarr;": "\u21ff", + "homtht;": "\u223b", + "hookleftarrow;": "\u21a9", + "hookrightarrow;": "\u21aa", + "hopf;": "\U0001d559", + "horbar;": "\u2015", + "hscr;": "\U0001d4bd", + "hslash;": "\u210f", + "hstrok;": "\u0127", + "hybull;": "\u2043", + "hyphen;": "\u2010", + "iacute": "\xed", + "iacute;": "\xed", + "ic;": "\u2063", + "icirc": "\xee", + "icirc;": "\xee", + "icy;": "\u0438", + "iecy;": "\u0435", + "iexcl": "\xa1", + "iexcl;": "\xa1", + "iff;": "\u21d4", + "ifr;": "\U0001d526", + "igrave": "\xec", + "igrave;": "\xec", + "ii;": "\u2148", + "iiiint;": "\u2a0c", + "iiint;": "\u222d", + "iinfin;": "\u29dc", + "iiota;": "\u2129", + "ijlig;": "\u0133", + "imacr;": "\u012b", + "image;": "\u2111", + "imagline;": "\u2110", + "imagpart;": "\u2111", + "imath;": "\u0131", + "imof;": "\u22b7", + "imped;": "\u01b5", + "in;": "\u2208", + "incare;": "\u2105", + "infin;": "\u221e", + "infintie;": "\u29dd", + "inodot;": "\u0131", + "int;": "\u222b", + "intcal;": "\u22ba", + "integers;": "\u2124", + "intercal;": "\u22ba", + "intlarhk;": "\u2a17", + "intprod;": "\u2a3c", + "iocy;": "\u0451", + "iogon;": "\u012f", + "iopf;": "\U0001d55a", + "iota;": "\u03b9", + "iprod;": "\u2a3c", + "iquest": "\xbf", + "iquest;": "\xbf", + "iscr;": "\U0001d4be", + "isin;": "\u2208", + "isinE;": "\u22f9", + "isindot;": "\u22f5", + "isins;": "\u22f4", + "isinsv;": "\u22f3", + "isinv;": "\u2208", + "it;": "\u2062", + "itilde;": "\u0129", + "iukcy;": "\u0456", + "iuml": "\xef", + "iuml;": "\xef", + "jcirc;": "\u0135", + "jcy;": "\u0439", + "jfr;": "\U0001d527", + "jmath;": "\u0237", + "jopf;": "\U0001d55b", + "jscr;": "\U0001d4bf", + "jsercy;": "\u0458", + "jukcy;": "\u0454", + "kappa;": "\u03ba", + "kappav;": "\u03f0", + "kcedil;": "\u0137", + "kcy;": "\u043a", + "kfr;": "\U0001d528", + "kgreen;": "\u0138", + "khcy;": "\u0445", + "kjcy;": "\u045c", + "kopf;": "\U0001d55c", + "kscr;": "\U0001d4c0", + "lAarr;": "\u21da", + "lArr;": "\u21d0", + "lAtail;": "\u291b", + "lBarr;": "\u290e", + "lE;": "\u2266", + "lEg;": "\u2a8b", + "lHar;": "\u2962", + "lacute;": "\u013a", + "laemptyv;": "\u29b4", + "lagran;": "\u2112", + "lambda;": "\u03bb", + "lang;": "\u27e8", + "langd;": "\u2991", + "langle;": "\u27e8", + "lap;": "\u2a85", + "laquo": "\xab", + "laquo;": "\xab", + "larr;": "\u2190", + "larrb;": "\u21e4", + "larrbfs;": "\u291f", + "larrfs;": "\u291d", + "larrhk;": "\u21a9", + "larrlp;": "\u21ab", + "larrpl;": "\u2939", + "larrsim;": "\u2973", + "larrtl;": "\u21a2", + "lat;": "\u2aab", + "latail;": "\u2919", + "late;": "\u2aad", + "lates;": "\u2aad\ufe00", + "lbarr;": "\u290c", + "lbbrk;": "\u2772", + "lbrace;": "{", + "lbrack;": "[", + "lbrke;": "\u298b", + "lbrksld;": "\u298f", + "lbrkslu;": "\u298d", + "lcaron;": "\u013e", + "lcedil;": "\u013c", + "lceil;": "\u2308", + "lcub;": "{", + "lcy;": "\u043b", + "ldca;": "\u2936", + "ldquo;": "\u201c", + "ldquor;": "\u201e", + "ldrdhar;": "\u2967", + "ldrushar;": "\u294b", + "ldsh;": "\u21b2", + "le;": "\u2264", + "leftarrow;": "\u2190", + "leftarrowtail;": "\u21a2", + "leftharpoondown;": "\u21bd", + "leftharpoonup;": "\u21bc", + "leftleftarrows;": "\u21c7", + "leftrightarrow;": "\u2194", + "leftrightarrows;": "\u21c6", + "leftrightharpoons;": "\u21cb", + "leftrightsquigarrow;": "\u21ad", + "leftthreetimes;": "\u22cb", + "leg;": "\u22da", + "leq;": "\u2264", + "leqq;": "\u2266", + "leqslant;": "\u2a7d", + "les;": "\u2a7d", + "lescc;": "\u2aa8", + "lesdot;": "\u2a7f", + "lesdoto;": "\u2a81", + "lesdotor;": "\u2a83", + "lesg;": "\u22da\ufe00", + "lesges;": "\u2a93", + "lessapprox;": "\u2a85", + "lessdot;": "\u22d6", + "lesseqgtr;": "\u22da", + "lesseqqgtr;": "\u2a8b", + "lessgtr;": "\u2276", + "lesssim;": "\u2272", + "lfisht;": "\u297c", + "lfloor;": "\u230a", + "lfr;": "\U0001d529", + "lg;": "\u2276", + "lgE;": "\u2a91", + "lhard;": "\u21bd", + "lharu;": "\u21bc", + "lharul;": "\u296a", + "lhblk;": "\u2584", + "ljcy;": "\u0459", + "ll;": "\u226a", + "llarr;": "\u21c7", + "llcorner;": "\u231e", + "llhard;": "\u296b", + "lltri;": "\u25fa", + "lmidot;": "\u0140", + "lmoust;": "\u23b0", + "lmoustache;": "\u23b0", + "lnE;": "\u2268", + "lnap;": "\u2a89", + "lnapprox;": "\u2a89", + "lne;": "\u2a87", + "lneq;": "\u2a87", + "lneqq;": "\u2268", + "lnsim;": "\u22e6", + "loang;": "\u27ec", + "loarr;": "\u21fd", + "lobrk;": "\u27e6", + "longleftarrow;": "\u27f5", + "longleftrightarrow;": "\u27f7", + "longmapsto;": "\u27fc", + "longrightarrow;": "\u27f6", + "looparrowleft;": "\u21ab", + "looparrowright;": "\u21ac", + "lopar;": "\u2985", + "lopf;": "\U0001d55d", + "loplus;": "\u2a2d", + "lotimes;": "\u2a34", + "lowast;": "\u2217", + "lowbar;": "_", + "loz;": "\u25ca", + "lozenge;": "\u25ca", + "lozf;": "\u29eb", + "lpar;": "(", + "lparlt;": "\u2993", + "lrarr;": "\u21c6", + "lrcorner;": "\u231f", + "lrhar;": "\u21cb", + "lrhard;": "\u296d", + "lrm;": "\u200e", + "lrtri;": "\u22bf", + "lsaquo;": "\u2039", + "lscr;": "\U0001d4c1", + "lsh;": "\u21b0", + "lsim;": "\u2272", + "lsime;": "\u2a8d", + "lsimg;": "\u2a8f", + "lsqb;": "[", + "lsquo;": "\u2018", + "lsquor;": "\u201a", + "lstrok;": "\u0142", + "lt": "<", + "lt;": "<", + "ltcc;": "\u2aa6", + "ltcir;": "\u2a79", + "ltdot;": "\u22d6", + "lthree;": "\u22cb", + "ltimes;": "\u22c9", + "ltlarr;": "\u2976", + "ltquest;": "\u2a7b", + "ltrPar;": "\u2996", + "ltri;": "\u25c3", + "ltrie;": "\u22b4", + "ltrif;": "\u25c2", + "lurdshar;": "\u294a", + "luruhar;": "\u2966", + "lvertneqq;": "\u2268\ufe00", + "lvnE;": "\u2268\ufe00", + "mDDot;": "\u223a", + "macr": "\xaf", + "macr;": "\xaf", + "male;": "\u2642", + "malt;": "\u2720", + "maltese;": "\u2720", + "map;": "\u21a6", + "mapsto;": "\u21a6", + "mapstodown;": "\u21a7", + "mapstoleft;": "\u21a4", + "mapstoup;": "\u21a5", + "marker;": "\u25ae", + "mcomma;": "\u2a29", + "mcy;": "\u043c", + "mdash;": "\u2014", + "measuredangle;": "\u2221", + "mfr;": "\U0001d52a", + "mho;": "\u2127", + "micro": "\xb5", + "micro;": "\xb5", + "mid;": "\u2223", + "midast;": "*", + "midcir;": "\u2af0", + "middot": "\xb7", + "middot;": "\xb7", + "minus;": "\u2212", + "minusb;": "\u229f", + "minusd;": "\u2238", + "minusdu;": "\u2a2a", + "mlcp;": "\u2adb", + "mldr;": "\u2026", + "mnplus;": "\u2213", + "models;": "\u22a7", + "mopf;": "\U0001d55e", + "mp;": "\u2213", + "mscr;": "\U0001d4c2", + "mstpos;": "\u223e", + "mu;": "\u03bc", + "multimap;": "\u22b8", + "mumap;": "\u22b8", + "nGg;": "\u22d9\u0338", + "nGt;": "\u226b\u20d2", + "nGtv;": "\u226b\u0338", + "nLeftarrow;": "\u21cd", + "nLeftrightarrow;": "\u21ce", + "nLl;": "\u22d8\u0338", + "nLt;": "\u226a\u20d2", + "nLtv;": "\u226a\u0338", + "nRightarrow;": "\u21cf", + "nVDash;": "\u22af", + "nVdash;": "\u22ae", + "nabla;": "\u2207", + "nacute;": "\u0144", + "nang;": "\u2220\u20d2", + "nap;": "\u2249", + "napE;": "\u2a70\u0338", + "napid;": "\u224b\u0338", + "napos;": "\u0149", + "napprox;": "\u2249", + "natur;": "\u266e", + "natural;": "\u266e", + "naturals;": "\u2115", + "nbsp": "\xa0", + "nbsp;": "\xa0", + "nbump;": "\u224e\u0338", + "nbumpe;": "\u224f\u0338", + "ncap;": "\u2a43", + "ncaron;": "\u0148", + "ncedil;": "\u0146", + "ncong;": "\u2247", + "ncongdot;": "\u2a6d\u0338", + "ncup;": "\u2a42", + "ncy;": "\u043d", + "ndash;": "\u2013", + "ne;": "\u2260", + "neArr;": "\u21d7", + "nearhk;": "\u2924", + "nearr;": "\u2197", + "nearrow;": "\u2197", + "nedot;": "\u2250\u0338", + "nequiv;": "\u2262", + "nesear;": "\u2928", + "nesim;": "\u2242\u0338", + "nexist;": "\u2204", + "nexists;": "\u2204", + "nfr;": "\U0001d52b", + "ngE;": "\u2267\u0338", + "nge;": "\u2271", + "ngeq;": "\u2271", + "ngeqq;": "\u2267\u0338", + "ngeqslant;": "\u2a7e\u0338", + "nges;": "\u2a7e\u0338", + "ngsim;": "\u2275", + "ngt;": "\u226f", + "ngtr;": "\u226f", + "nhArr;": "\u21ce", + "nharr;": "\u21ae", + "nhpar;": "\u2af2", + "ni;": "\u220b", + "nis;": "\u22fc", + "nisd;": "\u22fa", + "niv;": "\u220b", + "njcy;": "\u045a", + "nlArr;": "\u21cd", + "nlE;": "\u2266\u0338", + "nlarr;": "\u219a", + "nldr;": "\u2025", + "nle;": "\u2270", + "nleftarrow;": "\u219a", + "nleftrightarrow;": "\u21ae", + "nleq;": "\u2270", + "nleqq;": "\u2266\u0338", + "nleqslant;": "\u2a7d\u0338", + "nles;": "\u2a7d\u0338", + "nless;": "\u226e", + "nlsim;": "\u2274", + "nlt;": "\u226e", + "nltri;": "\u22ea", + "nltrie;": "\u22ec", + "nmid;": "\u2224", + "nopf;": "\U0001d55f", + "not": "\xac", + "not;": "\xac", + "notin;": "\u2209", + "notinE;": "\u22f9\u0338", + "notindot;": "\u22f5\u0338", + "notinva;": "\u2209", + "notinvb;": "\u22f7", + "notinvc;": "\u22f6", + "notni;": "\u220c", + "notniva;": "\u220c", + "notnivb;": "\u22fe", + "notnivc;": "\u22fd", + "npar;": "\u2226", + "nparallel;": "\u2226", + "nparsl;": "\u2afd\u20e5", + "npart;": "\u2202\u0338", + "npolint;": "\u2a14", + "npr;": "\u2280", + "nprcue;": "\u22e0", + "npre;": "\u2aaf\u0338", + "nprec;": "\u2280", + "npreceq;": "\u2aaf\u0338", + "nrArr;": "\u21cf", + "nrarr;": "\u219b", + "nrarrc;": "\u2933\u0338", + "nrarrw;": "\u219d\u0338", + "nrightarrow;": "\u219b", + "nrtri;": "\u22eb", + "nrtrie;": "\u22ed", + "nsc;": "\u2281", + "nsccue;": "\u22e1", + "nsce;": "\u2ab0\u0338", + "nscr;": "\U0001d4c3", + "nshortmid;": "\u2224", + "nshortparallel;": "\u2226", + "nsim;": "\u2241", + "nsime;": "\u2244", + "nsimeq;": "\u2244", + "nsmid;": "\u2224", + "nspar;": "\u2226", + "nsqsube;": "\u22e2", + "nsqsupe;": "\u22e3", + "nsub;": "\u2284", + "nsubE;": "\u2ac5\u0338", + "nsube;": "\u2288", + "nsubset;": "\u2282\u20d2", + "nsubseteq;": "\u2288", + "nsubseteqq;": "\u2ac5\u0338", + "nsucc;": "\u2281", + "nsucceq;": "\u2ab0\u0338", + "nsup;": "\u2285", + "nsupE;": "\u2ac6\u0338", + "nsupe;": "\u2289", + "nsupset;": "\u2283\u20d2", + "nsupseteq;": "\u2289", + "nsupseteqq;": "\u2ac6\u0338", + "ntgl;": "\u2279", + "ntilde": "\xf1", + "ntilde;": "\xf1", + "ntlg;": "\u2278", + "ntriangleleft;": "\u22ea", + "ntrianglelefteq;": "\u22ec", + "ntriangleright;": "\u22eb", + "ntrianglerighteq;": "\u22ed", + "nu;": "\u03bd", + "num;": "#", + "numero;": "\u2116", + "numsp;": "\u2007", + "nvDash;": "\u22ad", + "nvHarr;": "\u2904", + "nvap;": "\u224d\u20d2", + "nvdash;": "\u22ac", + "nvge;": "\u2265\u20d2", + "nvgt;": ">\u20d2", + "nvinfin;": "\u29de", + "nvlArr;": "\u2902", + "nvle;": "\u2264\u20d2", + "nvlt;": "<\u20d2", + "nvltrie;": "\u22b4\u20d2", + "nvrArr;": "\u2903", + "nvrtrie;": "\u22b5\u20d2", + "nvsim;": "\u223c\u20d2", + "nwArr;": "\u21d6", + "nwarhk;": "\u2923", + "nwarr;": "\u2196", + "nwarrow;": "\u2196", + "nwnear;": "\u2927", + "oS;": "\u24c8", + "oacute": "\xf3", + "oacute;": "\xf3", + "oast;": "\u229b", + "ocir;": "\u229a", + "ocirc": "\xf4", + "ocirc;": "\xf4", + "ocy;": "\u043e", + "odash;": "\u229d", + "odblac;": "\u0151", + "odiv;": "\u2a38", + "odot;": "\u2299", + "odsold;": "\u29bc", + "oelig;": "\u0153", + "ofcir;": "\u29bf", + "ofr;": "\U0001d52c", + "ogon;": "\u02db", + "ograve": "\xf2", + "ograve;": "\xf2", + "ogt;": "\u29c1", + "ohbar;": "\u29b5", + "ohm;": "\u03a9", + "oint;": "\u222e", + "olarr;": "\u21ba", + "olcir;": "\u29be", + "olcross;": "\u29bb", + "oline;": "\u203e", + "olt;": "\u29c0", + "omacr;": "\u014d", + "omega;": "\u03c9", + "omicron;": "\u03bf", + "omid;": "\u29b6", + "ominus;": "\u2296", + "oopf;": "\U0001d560", + "opar;": "\u29b7", + "operp;": "\u29b9", + "oplus;": "\u2295", + "or;": "\u2228", + "orarr;": "\u21bb", + "ord;": "\u2a5d", + "order;": "\u2134", + "orderof;": "\u2134", + "ordf": "\xaa", + "ordf;": "\xaa", + "ordm": "\xba", + "ordm;": "\xba", + "origof;": "\u22b6", + "oror;": "\u2a56", + "orslope;": "\u2a57", + "orv;": "\u2a5b", + "oscr;": "\u2134", + "oslash": "\xf8", + "oslash;": "\xf8", + "osol;": "\u2298", + "otilde": "\xf5", + "otilde;": "\xf5", + "otimes;": "\u2297", + "otimesas;": "\u2a36", + "ouml": "\xf6", + "ouml;": "\xf6", + "ovbar;": "\u233d", + "par;": "\u2225", + "para": "\xb6", + "para;": "\xb6", + "parallel;": "\u2225", + "parsim;": "\u2af3", + "parsl;": "\u2afd", + "part;": "\u2202", + "pcy;": "\u043f", + "percnt;": "%", + "period;": ".", + "permil;": "\u2030", + "perp;": "\u22a5", + "pertenk;": "\u2031", + "pfr;": "\U0001d52d", + "phi;": "\u03c6", + "phiv;": "\u03d5", + "phmmat;": "\u2133", + "phone;": "\u260e", + "pi;": "\u03c0", + "pitchfork;": "\u22d4", + "piv;": "\u03d6", + "planck;": "\u210f", + "planckh;": "\u210e", + "plankv;": "\u210f", + "plus;": "+", + "plusacir;": "\u2a23", + "plusb;": "\u229e", + "pluscir;": "\u2a22", + "plusdo;": "\u2214", + "plusdu;": "\u2a25", + "pluse;": "\u2a72", + "plusmn": "\xb1", + "plusmn;": "\xb1", + "plussim;": "\u2a26", + "plustwo;": "\u2a27", + "pm;": "\xb1", + "pointint;": "\u2a15", + "popf;": "\U0001d561", + "pound": "\xa3", + "pound;": "\xa3", + "pr;": "\u227a", + "prE;": "\u2ab3", + "prap;": "\u2ab7", + "prcue;": "\u227c", + "pre;": "\u2aaf", + "prec;": "\u227a", + "precapprox;": "\u2ab7", + "preccurlyeq;": "\u227c", + "preceq;": "\u2aaf", + "precnapprox;": "\u2ab9", + "precneqq;": "\u2ab5", + "precnsim;": "\u22e8", + "precsim;": "\u227e", + "prime;": "\u2032", + "primes;": "\u2119", + "prnE;": "\u2ab5", + "prnap;": "\u2ab9", + "prnsim;": "\u22e8", + "prod;": "\u220f", + "profalar;": "\u232e", + "profline;": "\u2312", + "profsurf;": "\u2313", + "prop;": "\u221d", + "propto;": "\u221d", + "prsim;": "\u227e", + "prurel;": "\u22b0", + "pscr;": "\U0001d4c5", + "psi;": "\u03c8", + "puncsp;": "\u2008", + "qfr;": "\U0001d52e", + "qint;": "\u2a0c", + "qopf;": "\U0001d562", + "qprime;": "\u2057", + "qscr;": "\U0001d4c6", + "quaternions;": "\u210d", + "quatint;": "\u2a16", + "quest;": "?", + "questeq;": "\u225f", + "quot": "\"", + "quot;": "\"", + "rAarr;": "\u21db", + "rArr;": "\u21d2", + "rAtail;": "\u291c", + "rBarr;": "\u290f", + "rHar;": "\u2964", + "race;": "\u223d\u0331", + "racute;": "\u0155", + "radic;": "\u221a", + "raemptyv;": "\u29b3", + "rang;": "\u27e9", + "rangd;": "\u2992", + "range;": "\u29a5", + "rangle;": "\u27e9", + "raquo": "\xbb", + "raquo;": "\xbb", + "rarr;": "\u2192", + "rarrap;": "\u2975", + "rarrb;": "\u21e5", + "rarrbfs;": "\u2920", + "rarrc;": "\u2933", + "rarrfs;": "\u291e", + "rarrhk;": "\u21aa", + "rarrlp;": "\u21ac", + "rarrpl;": "\u2945", + "rarrsim;": "\u2974", + "rarrtl;": "\u21a3", + "rarrw;": "\u219d", + "ratail;": "\u291a", + "ratio;": "\u2236", + "rationals;": "\u211a", + "rbarr;": "\u290d", + "rbbrk;": "\u2773", + "rbrace;": "}", + "rbrack;": "]", + "rbrke;": "\u298c", + "rbrksld;": "\u298e", + "rbrkslu;": "\u2990", + "rcaron;": "\u0159", + "rcedil;": "\u0157", + "rceil;": "\u2309", + "rcub;": "}", + "rcy;": "\u0440", + "rdca;": "\u2937", + "rdldhar;": "\u2969", + "rdquo;": "\u201d", + "rdquor;": "\u201d", + "rdsh;": "\u21b3", + "real;": "\u211c", + "realine;": "\u211b", + "realpart;": "\u211c", + "reals;": "\u211d", + "rect;": "\u25ad", + "reg": "\xae", + "reg;": "\xae", + "rfisht;": "\u297d", + "rfloor;": "\u230b", + "rfr;": "\U0001d52f", + "rhard;": "\u21c1", + "rharu;": "\u21c0", + "rharul;": "\u296c", + "rho;": "\u03c1", + "rhov;": "\u03f1", + "rightarrow;": "\u2192", + "rightarrowtail;": "\u21a3", + "rightharpoondown;": "\u21c1", + "rightharpoonup;": "\u21c0", + "rightleftarrows;": "\u21c4", + "rightleftharpoons;": "\u21cc", + "rightrightarrows;": "\u21c9", + "rightsquigarrow;": "\u219d", + "rightthreetimes;": "\u22cc", + "ring;": "\u02da", + "risingdotseq;": "\u2253", + "rlarr;": "\u21c4", + "rlhar;": "\u21cc", + "rlm;": "\u200f", + "rmoust;": "\u23b1", + "rmoustache;": "\u23b1", + "rnmid;": "\u2aee", + "roang;": "\u27ed", + "roarr;": "\u21fe", + "robrk;": "\u27e7", + "ropar;": "\u2986", + "ropf;": "\U0001d563", + "roplus;": "\u2a2e", + "rotimes;": "\u2a35", + "rpar;": ")", + "rpargt;": "\u2994", + "rppolint;": "\u2a12", + "rrarr;": "\u21c9", + "rsaquo;": "\u203a", + "rscr;": "\U0001d4c7", + "rsh;": "\u21b1", + "rsqb;": "]", + "rsquo;": "\u2019", + "rsquor;": "\u2019", + "rthree;": "\u22cc", + "rtimes;": "\u22ca", + "rtri;": "\u25b9", + "rtrie;": "\u22b5", + "rtrif;": "\u25b8", + "rtriltri;": "\u29ce", + "ruluhar;": "\u2968", + "rx;": "\u211e", + "sacute;": "\u015b", + "sbquo;": "\u201a", + "sc;": "\u227b", + "scE;": "\u2ab4", + "scap;": "\u2ab8", + "scaron;": "\u0161", + "sccue;": "\u227d", + "sce;": "\u2ab0", + "scedil;": "\u015f", + "scirc;": "\u015d", + "scnE;": "\u2ab6", + "scnap;": "\u2aba", + "scnsim;": "\u22e9", + "scpolint;": "\u2a13", + "scsim;": "\u227f", + "scy;": "\u0441", + "sdot;": "\u22c5", + "sdotb;": "\u22a1", + "sdote;": "\u2a66", + "seArr;": "\u21d8", + "searhk;": "\u2925", + "searr;": "\u2198", + "searrow;": "\u2198", + "sect": "\xa7", + "sect;": "\xa7", + "semi;": ";", + "seswar;": "\u2929", + "setminus;": "\u2216", + "setmn;": "\u2216", + "sext;": "\u2736", + "sfr;": "\U0001d530", + "sfrown;": "\u2322", + "sharp;": "\u266f", + "shchcy;": "\u0449", + "shcy;": "\u0448", + "shortmid;": "\u2223", + "shortparallel;": "\u2225", + "shy": "\xad", + "shy;": "\xad", + "sigma;": "\u03c3", + "sigmaf;": "\u03c2", + "sigmav;": "\u03c2", + "sim;": "\u223c", + "simdot;": "\u2a6a", + "sime;": "\u2243", + "simeq;": "\u2243", + "simg;": "\u2a9e", + "simgE;": "\u2aa0", + "siml;": "\u2a9d", + "simlE;": "\u2a9f", + "simne;": "\u2246", + "simplus;": "\u2a24", + "simrarr;": "\u2972", + "slarr;": "\u2190", + "smallsetminus;": "\u2216", + "smashp;": "\u2a33", + "smeparsl;": "\u29e4", + "smid;": "\u2223", + "smile;": "\u2323", + "smt;": "\u2aaa", + "smte;": "\u2aac", + "smtes;": "\u2aac\ufe00", + "softcy;": "\u044c", + "sol;": "/", + "solb;": "\u29c4", + "solbar;": "\u233f", + "sopf;": "\U0001d564", + "spades;": "\u2660", + "spadesuit;": "\u2660", + "spar;": "\u2225", + "sqcap;": "\u2293", + "sqcaps;": "\u2293\ufe00", + "sqcup;": "\u2294", + "sqcups;": "\u2294\ufe00", + "sqsub;": "\u228f", + "sqsube;": "\u2291", + "sqsubset;": "\u228f", + "sqsubseteq;": "\u2291", + "sqsup;": "\u2290", + "sqsupe;": "\u2292", + "sqsupset;": "\u2290", + "sqsupseteq;": "\u2292", + "squ;": "\u25a1", + "square;": "\u25a1", + "squarf;": "\u25aa", + "squf;": "\u25aa", + "srarr;": "\u2192", + "sscr;": "\U0001d4c8", + "ssetmn;": "\u2216", + "ssmile;": "\u2323", + "sstarf;": "\u22c6", + "star;": "\u2606", + "starf;": "\u2605", + "straightepsilon;": "\u03f5", + "straightphi;": "\u03d5", + "strns;": "\xaf", + "sub;": "\u2282", + "subE;": "\u2ac5", + "subdot;": "\u2abd", + "sube;": "\u2286", + "subedot;": "\u2ac3", + "submult;": "\u2ac1", + "subnE;": "\u2acb", + "subne;": "\u228a", + "subplus;": "\u2abf", + "subrarr;": "\u2979", + "subset;": "\u2282", + "subseteq;": "\u2286", + "subseteqq;": "\u2ac5", + "subsetneq;": "\u228a", + "subsetneqq;": "\u2acb", + "subsim;": "\u2ac7", + "subsub;": "\u2ad5", + "subsup;": "\u2ad3", + "succ;": "\u227b", + "succapprox;": "\u2ab8", + "succcurlyeq;": "\u227d", + "succeq;": "\u2ab0", + "succnapprox;": "\u2aba", + "succneqq;": "\u2ab6", + "succnsim;": "\u22e9", + "succsim;": "\u227f", + "sum;": "\u2211", + "sung;": "\u266a", + "sup1": "\xb9", + "sup1;": "\xb9", + "sup2": "\xb2", + "sup2;": "\xb2", + "sup3": "\xb3", + "sup3;": "\xb3", + "sup;": "\u2283", + "supE;": "\u2ac6", + "supdot;": "\u2abe", + "supdsub;": "\u2ad8", + "supe;": "\u2287", + "supedot;": "\u2ac4", + "suphsol;": "\u27c9", + "suphsub;": "\u2ad7", + "suplarr;": "\u297b", + "supmult;": "\u2ac2", + "supnE;": "\u2acc", + "supne;": "\u228b", + "supplus;": "\u2ac0", + "supset;": "\u2283", + "supseteq;": "\u2287", + "supseteqq;": "\u2ac6", + "supsetneq;": "\u228b", + "supsetneqq;": "\u2acc", + "supsim;": "\u2ac8", + "supsub;": "\u2ad4", + "supsup;": "\u2ad6", + "swArr;": "\u21d9", + "swarhk;": "\u2926", + "swarr;": "\u2199", + "swarrow;": "\u2199", + "swnwar;": "\u292a", + "szlig": "\xdf", + "szlig;": "\xdf", + "target;": "\u2316", + "tau;": "\u03c4", + "tbrk;": "\u23b4", + "tcaron;": "\u0165", + "tcedil;": "\u0163", + "tcy;": "\u0442", + "tdot;": "\u20db", + "telrec;": "\u2315", + "tfr;": "\U0001d531", + "there4;": "\u2234", + "therefore;": "\u2234", + "theta;": "\u03b8", + "thetasym;": "\u03d1", + "thetav;": "\u03d1", + "thickapprox;": "\u2248", + "thicksim;": "\u223c", + "thinsp;": "\u2009", + "thkap;": "\u2248", + "thksim;": "\u223c", + "thorn": "\xfe", + "thorn;": "\xfe", + "tilde;": "\u02dc", + "times": "\xd7", + "times;": "\xd7", + "timesb;": "\u22a0", + "timesbar;": "\u2a31", + "timesd;": "\u2a30", + "tint;": "\u222d", + "toea;": "\u2928", + "top;": "\u22a4", + "topbot;": "\u2336", + "topcir;": "\u2af1", + "topf;": "\U0001d565", + "topfork;": "\u2ada", + "tosa;": "\u2929", + "tprime;": "\u2034", + "trade;": "\u2122", + "triangle;": "\u25b5", + "triangledown;": "\u25bf", + "triangleleft;": "\u25c3", + "trianglelefteq;": "\u22b4", + "triangleq;": "\u225c", + "triangleright;": "\u25b9", + "trianglerighteq;": "\u22b5", + "tridot;": "\u25ec", + "trie;": "\u225c", + "triminus;": "\u2a3a", + "triplus;": "\u2a39", + "trisb;": "\u29cd", + "tritime;": "\u2a3b", + "trpezium;": "\u23e2", + "tscr;": "\U0001d4c9", + "tscy;": "\u0446", + "tshcy;": "\u045b", + "tstrok;": "\u0167", + "twixt;": "\u226c", + "twoheadleftarrow;": "\u219e", + "twoheadrightarrow;": "\u21a0", + "uArr;": "\u21d1", + "uHar;": "\u2963", + "uacute": "\xfa", + "uacute;": "\xfa", + "uarr;": "\u2191", + "ubrcy;": "\u045e", + "ubreve;": "\u016d", + "ucirc": "\xfb", + "ucirc;": "\xfb", + "ucy;": "\u0443", + "udarr;": "\u21c5", + "udblac;": "\u0171", + "udhar;": "\u296e", + "ufisht;": "\u297e", + "ufr;": "\U0001d532", + "ugrave": "\xf9", + "ugrave;": "\xf9", + "uharl;": "\u21bf", + "uharr;": "\u21be", + "uhblk;": "\u2580", + "ulcorn;": "\u231c", + "ulcorner;": "\u231c", + "ulcrop;": "\u230f", + "ultri;": "\u25f8", + "umacr;": "\u016b", + "uml": "\xa8", + "uml;": "\xa8", + "uogon;": "\u0173", + "uopf;": "\U0001d566", + "uparrow;": "\u2191", + "updownarrow;": "\u2195", + "upharpoonleft;": "\u21bf", + "upharpoonright;": "\u21be", + "uplus;": "\u228e", + "upsi;": "\u03c5", + "upsih;": "\u03d2", + "upsilon;": "\u03c5", + "upuparrows;": "\u21c8", + "urcorn;": "\u231d", + "urcorner;": "\u231d", + "urcrop;": "\u230e", + "uring;": "\u016f", + "urtri;": "\u25f9", + "uscr;": "\U0001d4ca", + "utdot;": "\u22f0", + "utilde;": "\u0169", + "utri;": "\u25b5", + "utrif;": "\u25b4", + "uuarr;": "\u21c8", + "uuml": "\xfc", + "uuml;": "\xfc", + "uwangle;": "\u29a7", + "vArr;": "\u21d5", + "vBar;": "\u2ae8", + "vBarv;": "\u2ae9", + "vDash;": "\u22a8", + "vangrt;": "\u299c", + "varepsilon;": "\u03f5", + "varkappa;": "\u03f0", + "varnothing;": "\u2205", + "varphi;": "\u03d5", + "varpi;": "\u03d6", + "varpropto;": "\u221d", + "varr;": "\u2195", + "varrho;": "\u03f1", + "varsigma;": "\u03c2", + "varsubsetneq;": "\u228a\ufe00", + "varsubsetneqq;": "\u2acb\ufe00", + "varsupsetneq;": "\u228b\ufe00", + "varsupsetneqq;": "\u2acc\ufe00", + "vartheta;": "\u03d1", + "vartriangleleft;": "\u22b2", + "vartriangleright;": "\u22b3", + "vcy;": "\u0432", + "vdash;": "\u22a2", + "vee;": "\u2228", + "veebar;": "\u22bb", + "veeeq;": "\u225a", + "vellip;": "\u22ee", + "verbar;": "|", + "vert;": "|", + "vfr;": "\U0001d533", + "vltri;": "\u22b2", + "vnsub;": "\u2282\u20d2", + "vnsup;": "\u2283\u20d2", + "vopf;": "\U0001d567", + "vprop;": "\u221d", + "vrtri;": "\u22b3", + "vscr;": "\U0001d4cb", + "vsubnE;": "\u2acb\ufe00", + "vsubne;": "\u228a\ufe00", + "vsupnE;": "\u2acc\ufe00", + "vsupne;": "\u228b\ufe00", + "vzigzag;": "\u299a", + "wcirc;": "\u0175", + "wedbar;": "\u2a5f", + "wedge;": "\u2227", + "wedgeq;": "\u2259", + "weierp;": "\u2118", + "wfr;": "\U0001d534", + "wopf;": "\U0001d568", + "wp;": "\u2118", + "wr;": "\u2240", + "wreath;": "\u2240", + "wscr;": "\U0001d4cc", + "xcap;": "\u22c2", + "xcirc;": "\u25ef", + "xcup;": "\u22c3", + "xdtri;": "\u25bd", + "xfr;": "\U0001d535", + "xhArr;": "\u27fa", + "xharr;": "\u27f7", + "xi;": "\u03be", + "xlArr;": "\u27f8", + "xlarr;": "\u27f5", + "xmap;": "\u27fc", + "xnis;": "\u22fb", + "xodot;": "\u2a00", + "xopf;": "\U0001d569", + "xoplus;": "\u2a01", + "xotime;": "\u2a02", + "xrArr;": "\u27f9", + "xrarr;": "\u27f6", + "xscr;": "\U0001d4cd", + "xsqcup;": "\u2a06", + "xuplus;": "\u2a04", + "xutri;": "\u25b3", + "xvee;": "\u22c1", + "xwedge;": "\u22c0", + "yacute": "\xfd", + "yacute;": "\xfd", + "yacy;": "\u044f", + "ycirc;": "\u0177", + "ycy;": "\u044b", + "yen": "\xa5", + "yen;": "\xa5", + "yfr;": "\U0001d536", + "yicy;": "\u0457", + "yopf;": "\U0001d56a", + "yscr;": "\U0001d4ce", + "yucy;": "\u044e", + "yuml": "\xff", + "yuml;": "\xff", + "zacute;": "\u017a", + "zcaron;": "\u017e", + "zcy;": "\u0437", + "zdot;": "\u017c", + "zeetrf;": "\u2128", + "zeta;": "\u03b6", + "zfr;": "\U0001d537", + "zhcy;": "\u0436", + "zigrarr;": "\u21dd", + "zopf;": "\U0001d56b", + "zscr;": "\U0001d4cf", + "zwj;": "\u200d", + "zwnj;": "\u200c", +} + +replacementCharacters = { + 0x0: "\uFFFD", + 0x0d: "\u000D", + 0x80: "\u20AC", + 0x81: "\u0081", + 0x82: "\u201A", + 0x83: "\u0192", + 0x84: "\u201E", + 0x85: "\u2026", + 0x86: "\u2020", + 0x87: "\u2021", + 0x88: "\u02C6", + 0x89: "\u2030", + 0x8A: "\u0160", + 0x8B: "\u2039", + 0x8C: "\u0152", + 0x8D: "\u008D", + 0x8E: "\u017D", + 0x8F: "\u008F", + 0x90: "\u0090", + 0x91: "\u2018", + 0x92: "\u2019", + 0x93: "\u201C", + 0x94: "\u201D", + 0x95: "\u2022", + 0x96: "\u2013", + 0x97: "\u2014", + 0x98: "\u02DC", + 0x99: "\u2122", + 0x9A: "\u0161", + 0x9B: "\u203A", + 0x9C: "\u0153", + 0x9D: "\u009D", + 0x9E: "\u017E", + 0x9F: "\u0178", +} + +tokenTypes = { + "Doctype": 0, + "Characters": 1, + "SpaceCharacters": 2, + "StartTag": 3, + "EndTag": 4, + "EmptyTag": 5, + "Comment": 6, + "ParseError": 7 +} + +tagTokenTypes = frozenset([tokenTypes["StartTag"], tokenTypes["EndTag"], + tokenTypes["EmptyTag"]]) + + +prefixes = dict([(v, k) for k, v in namespaces.items()]) +prefixes["http://www.w3.org/1998/Math/MathML"] = "math" + + +class DataLossWarning(UserWarning): + """Raised when the current tree is unable to represent the input data""" + pass + + +class _ReparseException(Exception): + pass diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/constants.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/constants.pyc new file mode 100644 index 0000000000000000000000000000000000000000..066b10d08ed10853ef88dd3e0496d63d1a1f3450 GIT binary patch literal 83207 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[^-]+) +-(?P\d+[^-]*) +(-(?P\d+[^-]*))? +-(?P\w+\d+(\.\w+\d+)*) +-(?P\w+) +-(?P\w+(\.\w+)*) +\.whl$ +''', re.IGNORECASE | re.VERBOSE) + +NAME_VERSION_RE = re.compile(r''' +(?P[^-]+) +-(?P\d+[^-]*) +(-(?P\d+[^-]*))?$ +''', re.IGNORECASE | re.VERBOSE) + +SHEBANG_RE = re.compile(br'\s*#![^\r\n]*') +SHEBANG_DETAIL_RE = re.compile(br'^(\s*#!("[^"]+"|\S+))\s+(.*)$') +SHEBANG_PYTHON = b'#!python' +SHEBANG_PYTHONW = b'#!pythonw' + +if os.sep == '/': + to_posix = lambda o: o +else: + to_posix = lambda o: o.replace(os.sep, '/') + + +class Mounter(object): + def __init__(self): + self.impure_wheels = {} + self.libs = {} + + def add(self, pathname, extensions): + self.impure_wheels[pathname] = extensions + self.libs.update(extensions) + + def remove(self, pathname): + extensions = self.impure_wheels.pop(pathname) + for k, v in extensions: + if k in self.libs: + del self.libs[k] + + def find_module(self, fullname, path=None): + if fullname in self.libs: + result = self + else: + result = None + return result + + def load_module(self, fullname): + if fullname in sys.modules: + result = sys.modules[fullname] + else: + if fullname not in self.libs: + raise ImportError('unable to find extension for %s' % fullname) + result = imp.load_dynamic(fullname, self.libs[fullname]) + result.__loader__ = self + parts = fullname.rsplit('.', 1) + if len(parts) > 1: + result.__package__ = parts[0] + return result + +_hook = Mounter() + + +class Wheel(object): + """ + Class to build and install from Wheel files (PEP 427). + """ + + wheel_version = (1, 1) + hash_kind = 'sha256' + + def __init__(self, filename=None, sign=False, verify=False): + """ + Initialise an instance using a (valid) filename. + """ + self.sign = sign + self.should_verify = verify + self.buildver = '' + self.pyver = [PYVER] + self.abi = ['none'] + self.arch = ['any'] + self.dirname = os.getcwd() + if filename is None: + self.name = 'dummy' + self.version = '0.1' + self._filename = self.filename + else: + m = NAME_VERSION_RE.match(filename) + if m: + info = m.groupdict('') + self.name = info['nm'] + # Reinstate the local version separator + self.version = info['vn'].replace('_', '-') + self.buildver = info['bn'] + self._filename = self.filename + else: + dirname, filename = os.path.split(filename) + m = FILENAME_RE.match(filename) + if not m: + raise DistlibException('Invalid name or ' + 'filename: %r' % filename) + if dirname: + self.dirname = os.path.abspath(dirname) + self._filename = filename + info = m.groupdict('') + self.name = info['nm'] + self.version = info['vn'] + self.buildver = info['bn'] + self.pyver = info['py'].split('.') + self.abi = info['bi'].split('.') + self.arch = info['ar'].split('.') + + @property + def filename(self): + """ + Build and return a filename from the various components. + """ + if self.buildver: + buildver = '-' + self.buildver + else: + buildver = '' + pyver = '.'.join(self.pyver) + abi = '.'.join(self.abi) + arch = '.'.join(self.arch) + # replace - with _ as a local version separator + version = self.version.replace('-', '_') + return '%s-%s%s-%s-%s-%s.whl' % (self.name, version, buildver, + pyver, abi, arch) + + @property + def exists(self): + path = os.path.join(self.dirname, self.filename) + return os.path.isfile(path) + + @property + def tags(self): + for pyver in self.pyver: + for abi in self.abi: + for arch in self.arch: + yield pyver, abi, arch + + @cached_property + def metadata(self): + pathname = os.path.join(self.dirname, self.filename) + name_ver = '%s-%s' % (self.name, self.version) + info_dir = '%s.dist-info' % name_ver + wrapper = codecs.getreader('utf-8') + with ZipFile(pathname, 'r') as zf: + wheel_metadata = self.get_wheel_metadata(zf) + wv = wheel_metadata['Wheel-Version'].split('.', 1) + file_version = tuple([int(i) for i in wv]) + if file_version < (1, 1): + fns = [WHEEL_METADATA_FILENAME, METADATA_FILENAME, 'METADATA'] + else: + fns = [WHEEL_METADATA_FILENAME, METADATA_FILENAME] + result = None + for fn in fns: + try: + metadata_filename = posixpath.join(info_dir, fn) + with zf.open(metadata_filename) as bf: + wf = wrapper(bf) + result = Metadata(fileobj=wf) + if result: + break + except KeyError: + pass + if not result: + raise ValueError('Invalid wheel, because metadata is ' + 'missing: looked in %s' % ', '.join(fns)) + return result + + def get_wheel_metadata(self, zf): + name_ver = '%s-%s' % (self.name, self.version) + info_dir = '%s.dist-info' % name_ver + metadata_filename = posixpath.join(info_dir, 'WHEEL') + with zf.open(metadata_filename) as bf: + wf = codecs.getreader('utf-8')(bf) + message = message_from_file(wf) + return dict(message) + + @cached_property + def info(self): + pathname = os.path.join(self.dirname, self.filename) + with ZipFile(pathname, 'r') as zf: + result = self.get_wheel_metadata(zf) + return result + + def process_shebang(self, data): + m = SHEBANG_RE.match(data) + if m: + end = m.end() + shebang, data_after_shebang = data[:end], data[end:] + # Preserve any arguments after the interpreter + if b'pythonw' in shebang.lower(): + shebang_python = SHEBANG_PYTHONW + else: + shebang_python = SHEBANG_PYTHON + m = SHEBANG_DETAIL_RE.match(shebang) + if m: + args = b' ' + m.groups()[-1] + else: + args = b'' + shebang = shebang_python + args + data = shebang + data_after_shebang + else: + cr = data.find(b'\r') + lf = data.find(b'\n') + if cr < 0 or cr > lf: + term = b'\n' + else: + if data[cr:cr + 2] == b'\r\n': + term = b'\r\n' + else: + term = b'\r' + data = SHEBANG_PYTHON + term + data + return data + + def get_hash(self, data, hash_kind=None): + if hash_kind is None: + hash_kind = self.hash_kind + try: + hasher = getattr(hashlib, hash_kind) + except AttributeError: + raise DistlibException('Unsupported hash algorithm: %r' % hash_kind) + result = hasher(data).digest() + result = base64.urlsafe_b64encode(result).rstrip(b'=').decode('ascii') + return hash_kind, result + + def write_record(self, records, record_path, base): + records = list(records) # make a copy for sorting + p = to_posix(os.path.relpath(record_path, base)) + records.append((p, '', '')) + records.sort() + with CSVWriter(record_path) as writer: + for row in records: + writer.writerow(row) + + def write_records(self, info, libdir, archive_paths): + records = [] + distinfo, info_dir = info + hasher = getattr(hashlib, self.hash_kind) + for ap, p in archive_paths: + with open(p, 'rb') as f: + data = f.read() + digest = '%s=%s' % self.get_hash(data) + size = os.path.getsize(p) + records.append((ap, digest, size)) + + p = os.path.join(distinfo, 'RECORD') + self.write_record(records, p, libdir) + ap = to_posix(os.path.join(info_dir, 'RECORD')) + archive_paths.append((ap, p)) + + def build_zip(self, pathname, archive_paths): + with ZipFile(pathname, 'w', zipfile.ZIP_DEFLATED) as zf: + for ap, p in archive_paths: + logger.debug('Wrote %s to %s in wheel', p, ap) + zf.write(p, ap) + + def build(self, paths, tags=None, wheel_version=None): + """ + Build a wheel from files in specified paths, and use any specified tags + when determining the name of the wheel. + """ + if tags is None: + tags = {} + + libkey = list(filter(lambda o: o in paths, ('purelib', 'platlib')))[0] + if libkey == 'platlib': + is_pure = 'false' + default_pyver = [IMPVER] + default_abi = [ABI] + default_arch = [ARCH] + else: + is_pure = 'true' + default_pyver = [PYVER] + default_abi = ['none'] + default_arch = ['any'] + + self.pyver = tags.get('pyver', default_pyver) + self.abi = tags.get('abi', default_abi) + self.arch = tags.get('arch', default_arch) + + libdir = paths[libkey] + + name_ver = '%s-%s' % (self.name, self.version) + data_dir = '%s.data' % name_ver + info_dir = '%s.dist-info' % name_ver + + archive_paths = [] + + # First, stuff which is not in site-packages + for key in ('data', 'headers', 'scripts'): + if key not in paths: + continue + path = paths[key] + if os.path.isdir(path): + for root, dirs, files in os.walk(path): + for fn in files: + p = fsdecode(os.path.join(root, fn)) + rp = os.path.relpath(p, path) + ap = to_posix(os.path.join(data_dir, key, rp)) + archive_paths.append((ap, p)) + if key == 'scripts' and not p.endswith('.exe'): + with open(p, 'rb') as f: + data = f.read() + data = self.process_shebang(data) + with open(p, 'wb') as f: + f.write(data) + + # Now, stuff which is in site-packages, other than the + # distinfo stuff. + path = libdir + distinfo = None + for root, dirs, files in os.walk(path): + if root == path: + # At the top level only, save distinfo for later + # and skip it for now + for i, dn in enumerate(dirs): + dn = fsdecode(dn) + if dn.endswith('.dist-info'): + distinfo = os.path.join(root, dn) + del dirs[i] + break + assert distinfo, '.dist-info directory expected, not found' + + for fn in files: + # comment out next suite to leave .pyc files in + if fsdecode(fn).endswith(('.pyc', '.pyo')): + continue + p = os.path.join(root, fn) + rp = to_posix(os.path.relpath(p, path)) + archive_paths.append((rp, p)) + + # Now distinfo. Assumed to be flat, i.e. os.listdir is enough. + files = os.listdir(distinfo) + for fn in files: + if fn not in ('RECORD', 'INSTALLER', 'SHARED', 'WHEEL'): + p = fsdecode(os.path.join(distinfo, fn)) + ap = to_posix(os.path.join(info_dir, fn)) + archive_paths.append((ap, p)) + + wheel_metadata = [ + 'Wheel-Version: %d.%d' % (wheel_version or self.wheel_version), + 'Generator: distlib %s' % __version__, + 'Root-Is-Purelib: %s' % is_pure, + ] + for pyver, abi, arch in self.tags: + wheel_metadata.append('Tag: %s-%s-%s' % (pyver, abi, arch)) + p = os.path.join(distinfo, 'WHEEL') + with open(p, 'w') as f: + f.write('\n'.join(wheel_metadata)) + ap = to_posix(os.path.join(info_dir, 'WHEEL')) + archive_paths.append((ap, p)) + + # Now, at last, RECORD. + # Paths in here are archive paths - nothing else makes sense. + self.write_records((distinfo, info_dir), libdir, archive_paths) + # Now, ready to build the zip file + pathname = os.path.join(self.dirname, self.filename) + self.build_zip(pathname, archive_paths) + return pathname + + def skip_entry(self, arcname): + """ + Determine whether an archive entry should be skipped when verifying + or installing. + """ + # The signature file won't be in RECORD, + # and we don't currently don't do anything with it + # We also skip directories, as they won't be in RECORD + # either. See: + # + # https://github.com/pypa/wheel/issues/294 + # https://github.com/pypa/wheel/issues/287 + # https://github.com/pypa/wheel/pull/289 + # + return arcname.endswith(('/', '/RECORD.jws')) + + def install(self, paths, maker, **kwargs): + """ + Install a wheel to the specified paths. If kwarg ``warner`` is + specified, it should be a callable, which will be called with two + tuples indicating the wheel version of this software and the wheel + version in the file, if there is a discrepancy in the versions. + This can be used to issue any warnings to raise any exceptions. + If kwarg ``lib_only`` is True, only the purelib/platlib files are + installed, and the headers, scripts, data and dist-info metadata are + not written. If kwarg ``bytecode_hashed_invalidation`` is True, written + bytecode will try to use file-hash based invalidation (PEP-552) on + supported interpreter versions (CPython 2.7+). + + The return value is a :class:`InstalledDistribution` instance unless + ``options.lib_only`` is True, in which case the return value is ``None``. + """ + + dry_run = maker.dry_run + warner = kwargs.get('warner') + lib_only = kwargs.get('lib_only', False) + bc_hashed_invalidation = kwargs.get('bytecode_hashed_invalidation', False) + + pathname = os.path.join(self.dirname, self.filename) + name_ver = '%s-%s' % (self.name, self.version) + data_dir = '%s.data' % name_ver + info_dir = '%s.dist-info' % name_ver + + metadata_name = posixpath.join(info_dir, METADATA_FILENAME) + wheel_metadata_name = posixpath.join(info_dir, 'WHEEL') + record_name = posixpath.join(info_dir, 'RECORD') + + wrapper = codecs.getreader('utf-8') + + with ZipFile(pathname, 'r') as zf: + with zf.open(wheel_metadata_name) as bwf: + wf = wrapper(bwf) + message = message_from_file(wf) + wv = message['Wheel-Version'].split('.', 1) + file_version = tuple([int(i) for i in wv]) + if (file_version != self.wheel_version) and warner: + warner(self.wheel_version, file_version) + + if message['Root-Is-Purelib'] == 'true': + libdir = paths['purelib'] + else: + libdir = paths['platlib'] + + records = {} + with zf.open(record_name) as bf: + with CSVReader(stream=bf) as reader: + for row in reader: + p = row[0] + records[p] = row + + data_pfx = posixpath.join(data_dir, '') + info_pfx = posixpath.join(info_dir, '') + script_pfx = posixpath.join(data_dir, 'scripts', '') + + # make a new instance rather than a copy of maker's, + # as we mutate it + fileop = FileOperator(dry_run=dry_run) + fileop.record = True # so we can rollback if needed + + bc = not sys.dont_write_bytecode # Double negatives. Lovely! + + outfiles = [] # for RECORD writing + + # for script copying/shebang processing + workdir = tempfile.mkdtemp() + # set target dir later + # we default add_launchers to False, as the + # Python Launcher should be used instead + maker.source_dir = workdir + maker.target_dir = None + try: + for zinfo in zf.infolist(): + arcname = zinfo.filename + if isinstance(arcname, text_type): + u_arcname = arcname + else: + u_arcname = arcname.decode('utf-8') + if self.skip_entry(u_arcname): + continue + row = records[u_arcname] + if row[2] and str(zinfo.file_size) != row[2]: + raise DistlibException('size mismatch for ' + '%s' % u_arcname) + if row[1]: + kind, value = row[1].split('=', 1) + with zf.open(arcname) as bf: + data = bf.read() + _, digest = self.get_hash(data, kind) + if digest != value: + raise DistlibException('digest mismatch for ' + '%s' % arcname) + + if lib_only and u_arcname.startswith((info_pfx, data_pfx)): + logger.debug('lib_only: skipping %s', u_arcname) + continue + is_script = (u_arcname.startswith(script_pfx) + and not u_arcname.endswith('.exe')) + + if u_arcname.startswith(data_pfx): + _, where, rp = u_arcname.split('/', 2) + outfile = os.path.join(paths[where], convert_path(rp)) + else: + # meant for site-packages. + if u_arcname in (wheel_metadata_name, record_name): + continue + outfile = os.path.join(libdir, convert_path(u_arcname)) + if not is_script: + with zf.open(arcname) as bf: + fileop.copy_stream(bf, outfile) + outfiles.append(outfile) + # Double check the digest of the written file + if not dry_run and row[1]: + with open(outfile, 'rb') as bf: + data = bf.read() + _, newdigest = self.get_hash(data, kind) + if newdigest != digest: + raise DistlibException('digest mismatch ' + 'on write for ' + '%s' % outfile) + if bc and outfile.endswith('.py'): + try: + pyc = fileop.byte_compile(outfile, + hashed_invalidation=bc_hashed_invalidation) + outfiles.append(pyc) + except Exception: + # Don't give up if byte-compilation fails, + # but log it and perhaps warn the user + logger.warning('Byte-compilation failed', + exc_info=True) + else: + fn = os.path.basename(convert_path(arcname)) + workname = os.path.join(workdir, fn) + with zf.open(arcname) as bf: + fileop.copy_stream(bf, workname) + + dn, fn = os.path.split(outfile) + maker.target_dir = dn + filenames = maker.make(fn) + fileop.set_executable_mode(filenames) + outfiles.extend(filenames) + + if lib_only: + logger.debug('lib_only: returning None') + dist = None + else: + # Generate scripts + + # Try to get pydist.json so we can see if there are + # any commands to generate. If this fails (e.g. because + # of a legacy wheel), log a warning but don't give up. + commands = None + file_version = self.info['Wheel-Version'] + if file_version == '1.0': + # Use legacy info + ep = posixpath.join(info_dir, 'entry_points.txt') + try: + with zf.open(ep) as bwf: + epdata = read_exports(bwf) + commands = {} + for key in ('console', 'gui'): + k = '%s_scripts' % key + if k in epdata: + commands['wrap_%s' % key] = d = {} + for v in epdata[k].values(): + s = '%s:%s' % (v.prefix, v.suffix) + if v.flags: + s += ' %s' % v.flags + d[v.name] = s + except Exception: + logger.warning('Unable to read legacy script ' + 'metadata, so cannot generate ' + 'scripts') + else: + try: + with zf.open(metadata_name) as bwf: + wf = wrapper(bwf) + commands = json.load(wf).get('extensions') + if commands: + commands = commands.get('python.commands') + except Exception: + logger.warning('Unable to read JSON metadata, so ' + 'cannot generate scripts') + if commands: + console_scripts = commands.get('wrap_console', {}) + gui_scripts = commands.get('wrap_gui', {}) + if console_scripts or gui_scripts: + script_dir = paths.get('scripts', '') + if not os.path.isdir(script_dir): + raise ValueError('Valid script path not ' + 'specified') + maker.target_dir = script_dir + for k, v in console_scripts.items(): + script = '%s = %s' % (k, v) + filenames = maker.make(script) + fileop.set_executable_mode(filenames) + + if gui_scripts: + options = {'gui': True } + for k, v in gui_scripts.items(): + script = '%s = %s' % (k, v) + filenames = maker.make(script, options) + fileop.set_executable_mode(filenames) + + p = os.path.join(libdir, info_dir) + dist = InstalledDistribution(p) + + # Write SHARED + paths = dict(paths) # don't change passed in dict + del paths['purelib'] + del paths['platlib'] + paths['lib'] = libdir + p = dist.write_shared_locations(paths, dry_run) + if p: + outfiles.append(p) + + # Write RECORD + dist.write_installed_files(outfiles, paths['prefix'], + dry_run) + return dist + except Exception: # pragma: no cover + logger.exception('installation failed.') + fileop.rollback() + raise + finally: + shutil.rmtree(workdir) + + def _get_dylib_cache(self): + global cache + if cache is None: + # Use native string to avoid issues on 2.x: see Python #20140. + base = os.path.join(get_cache_base(), str('dylib-cache'), + '%s.%s' % sys.version_info[:2]) + cache = Cache(base) + return cache + + def _get_extensions(self): + pathname = os.path.join(self.dirname, self.filename) + name_ver = '%s-%s' % (self.name, self.version) + info_dir = '%s.dist-info' % name_ver + arcname = posixpath.join(info_dir, 'EXTENSIONS') + wrapper = codecs.getreader('utf-8') + result = [] + with ZipFile(pathname, 'r') as zf: + try: + with zf.open(arcname) as bf: + wf = wrapper(bf) + extensions = json.load(wf) + cache = self._get_dylib_cache() + prefix = cache.prefix_to_dir(pathname) + cache_base = os.path.join(cache.base, prefix) + if not os.path.isdir(cache_base): + os.makedirs(cache_base) + for name, relpath in extensions.items(): + dest = os.path.join(cache_base, convert_path(relpath)) + if not os.path.exists(dest): + extract = True + else: + file_time = os.stat(dest).st_mtime + file_time = datetime.datetime.fromtimestamp(file_time) + info = zf.getinfo(relpath) + wheel_time = datetime.datetime(*info.date_time) + extract = wheel_time > file_time + if extract: + zf.extract(relpath, cache_base) + result.append((name, dest)) + except KeyError: + pass + return result + + def is_compatible(self): + """ + Determine if a wheel is compatible with the running system. + """ + return is_compatible(self) + + def is_mountable(self): + """ + Determine if a wheel is asserted as mountable by its metadata. + """ + return True # for now - metadata details TBD + + def mount(self, append=False): + pathname = os.path.abspath(os.path.join(self.dirname, self.filename)) + if not self.is_compatible(): + msg = 'Wheel %s not compatible with this Python.' % pathname + raise DistlibException(msg) + if not self.is_mountable(): + msg = 'Wheel %s is marked as not mountable.' % pathname + raise DistlibException(msg) + if pathname in sys.path: + logger.debug('%s already in path', pathname) + else: + if append: + sys.path.append(pathname) + else: + sys.path.insert(0, pathname) + extensions = self._get_extensions() + if extensions: + if _hook not in sys.meta_path: + sys.meta_path.append(_hook) + _hook.add(pathname, extensions) + + def unmount(self): + pathname = os.path.abspath(os.path.join(self.dirname, self.filename)) + if pathname not in sys.path: + logger.debug('%s not in path', pathname) + else: + sys.path.remove(pathname) + if pathname in _hook.impure_wheels: + _hook.remove(pathname) + if not _hook.impure_wheels: + if _hook in sys.meta_path: + sys.meta_path.remove(_hook) + + def verify(self): + pathname = os.path.join(self.dirname, self.filename) + name_ver = '%s-%s' % (self.name, self.version) + data_dir = '%s.data' % name_ver + info_dir = '%s.dist-info' % name_ver + + metadata_name = posixpath.join(info_dir, METADATA_FILENAME) + wheel_metadata_name = posixpath.join(info_dir, 'WHEEL') + record_name = posixpath.join(info_dir, 'RECORD') + + wrapper = codecs.getreader('utf-8') + + with ZipFile(pathname, 'r') as zf: + with zf.open(wheel_metadata_name) as bwf: + wf = wrapper(bwf) + message = message_from_file(wf) + wv = message['Wheel-Version'].split('.', 1) + file_version = tuple([int(i) for i in wv]) + # TODO version verification + + records = {} + with zf.open(record_name) as bf: + with CSVReader(stream=bf) as reader: + for row in reader: + p = row[0] + records[p] = row + + for zinfo in zf.infolist(): + arcname = zinfo.filename + if isinstance(arcname, text_type): + u_arcname = arcname + else: + u_arcname = arcname.decode('utf-8') + # See issue #115: some wheels have .. in their entries, but + # in the filename ... e.g. __main__..py ! So the check is + # updated to look for .. in the directory portions + p = u_arcname.split('/') + if '..' in p: + raise DistlibException('invalid entry in ' + 'wheel: %r' % u_arcname) + + if self.skip_entry(u_arcname): + continue + row = records[u_arcname] + if row[2] and str(zinfo.file_size) != row[2]: + raise DistlibException('size mismatch for ' + '%s' % u_arcname) + if row[1]: + kind, value = row[1].split('=', 1) + with zf.open(arcname) as bf: + data = bf.read() + _, digest = self.get_hash(data, kind) + if digest != value: + raise DistlibException('digest mismatch for ' + '%s' % arcname) + + def update(self, modifier, dest_dir=None, **kwargs): + """ + Update the contents of a wheel in a generic way. The modifier should + be a callable which expects a dictionary argument: its keys are + archive-entry paths, and its values are absolute filesystem paths + where the contents the corresponding archive entries can be found. The + modifier is free to change the contents of the files pointed to, add + new entries and remove entries, before returning. This method will + extract the entire contents of the wheel to a temporary location, call + the modifier, and then use the passed (and possibly updated) + dictionary to write a new wheel. If ``dest_dir`` is specified, the new + wheel is written there -- otherwise, the original wheel is overwritten. + + The modifier should return True if it updated the wheel, else False. + This method returns the same value the modifier returns. + """ + + def get_version(path_map, info_dir): + version = path = None + key = '%s/%s' % (info_dir, METADATA_FILENAME) + if key not in path_map: + key = '%s/PKG-INFO' % info_dir + if key in path_map: + path = path_map[key] + version = Metadata(path=path).version + return version, path + + def update_version(version, path): + updated = None + try: + v = NormalizedVersion(version) + i = version.find('-') + if i < 0: + updated = '%s+1' % version + else: + parts = [int(s) for s in version[i + 1:].split('.')] + parts[-1] += 1 + updated = '%s+%s' % (version[:i], + '.'.join(str(i) for i in parts)) + except UnsupportedVersionError: + logger.debug('Cannot update non-compliant (PEP-440) ' + 'version %r', version) + if updated: + md = Metadata(path=path) + md.version = updated + legacy = not path.endswith(METADATA_FILENAME) + md.write(path=path, legacy=legacy) + logger.debug('Version updated from %r to %r', version, + updated) + + pathname = os.path.join(self.dirname, self.filename) + name_ver = '%s-%s' % (self.name, self.version) + info_dir = '%s.dist-info' % name_ver + record_name = posixpath.join(info_dir, 'RECORD') + with tempdir() as workdir: + with ZipFile(pathname, 'r') as zf: + path_map = {} + for zinfo in zf.infolist(): + arcname = zinfo.filename + if isinstance(arcname, text_type): + u_arcname = arcname + else: + u_arcname = arcname.decode('utf-8') + if u_arcname == record_name: + continue + if '..' in u_arcname: + raise DistlibException('invalid entry in ' + 'wheel: %r' % u_arcname) + zf.extract(zinfo, workdir) + path = os.path.join(workdir, convert_path(u_arcname)) + path_map[u_arcname] = path + + # Remember the version. + original_version, _ = get_version(path_map, info_dir) + # Files extracted. Call the modifier. + modified = modifier(path_map, **kwargs) + if modified: + # Something changed - need to build a new wheel. + current_version, path = get_version(path_map, info_dir) + if current_version and (current_version == original_version): + # Add or update local version to signify changes. + update_version(current_version, path) + # Decide where the new wheel goes. + if dest_dir is None: + fd, newpath = tempfile.mkstemp(suffix='.whl', + prefix='wheel-update-', + dir=workdir) + os.close(fd) + else: + if not os.path.isdir(dest_dir): + raise DistlibException('Not a directory: %r' % dest_dir) + newpath = os.path.join(dest_dir, self.filename) + archive_paths = list(path_map.items()) + distinfo = os.path.join(workdir, info_dir) + info = distinfo, info_dir + self.write_records(info, workdir, archive_paths) + self.build_zip(newpath, archive_paths) + if dest_dir is None: + shutil.copyfile(newpath, pathname) + return modified + +def compatible_tags(): + """ + Return (pyver, abi, arch) tuples compatible with this Python. + """ + versions = [VER_SUFFIX] + major = VER_SUFFIX[0] + for minor in range(sys.version_info[1] - 1, - 1, -1): + versions.append(''.join([major, str(minor)])) + + abis = [] + for suffix, _, _ in imp.get_suffixes(): + if suffix.startswith('.abi'): + abis.append(suffix.split('.', 2)[1]) + abis.sort() + if ABI != 'none': + abis.insert(0, ABI) + abis.append('none') + result = [] + + arches = [ARCH] + if sys.platform == 'darwin': + m = re.match(r'(\w+)_(\d+)_(\d+)_(\w+)$', ARCH) + if m: + name, major, minor, arch = m.groups() + minor = int(minor) + matches = [arch] + if arch in ('i386', 'ppc'): + matches.append('fat') + if arch in ('i386', 'ppc', 'x86_64'): + matches.append('fat3') + if arch in ('ppc64', 'x86_64'): + matches.append('fat64') + if arch in ('i386', 'x86_64'): + matches.append('intel') + if arch in ('i386', 'x86_64', 'intel', 'ppc', 'ppc64'): + matches.append('universal') + while minor >= 0: + for match in matches: + s = '%s_%s_%s_%s' % (name, major, minor, match) + if s != ARCH: # already there + arches.append(s) + minor -= 1 + + # Most specific - our Python version, ABI and arch + for abi in abis: + for arch in arches: + result.append((''.join((IMP_PREFIX, versions[0])), abi, arch)) + + # where no ABI / arch dependency, but IMP_PREFIX dependency + for i, version in enumerate(versions): + result.append((''.join((IMP_PREFIX, version)), 'none', 'any')) + if i == 0: + result.append((''.join((IMP_PREFIX, version[0])), 'none', 'any')) + + # no IMP_PREFIX, ABI or arch dependency + for i, version in enumerate(versions): + result.append((''.join(('py', version)), 'none', 'any')) + if i == 0: + result.append((''.join(('py', version[0])), 'none', 'any')) + return set(result) + + +COMPATIBLE_TAGS = compatible_tags() + +del compatible_tags + + +def is_compatible(wheel, tags=None): + if not isinstance(wheel, Wheel): + wheel = Wheel(wheel) # assume it's a filename + result = False + if tags is None: + tags = COMPATIBLE_TAGS + for ver, abi, arch in tags: + if ver in wheel.pyver and abi in wheel.abi and arch in wheel.arch: + result = True + break + return result diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/wheel 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/wheel 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..748b20d7888aa79d6a838d4eb66616e2e99871b9 GIT binary patch literal 33855 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 literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/wheel.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/wheel.py new file mode 100644 index 0000000..bd17938 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/wheel.py @@ -0,0 +1,1004 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013-2017 Vinay Sajip. +# Licensed to the Python Software Foundation under a contributor agreement. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +from __future__ import unicode_literals + +import base64 +import codecs +import datetime +import distutils.util +from email import message_from_file +import hashlib +import imp +import json +import logging +import os +import posixpath +import re +import shutil +import sys +import tempfile +import zipfile + +from . import __version__, DistlibException +from .compat import sysconfig, ZipFile, fsdecode, text_type, filter +from .database import InstalledDistribution +from .metadata import Metadata, METADATA_FILENAME, WHEEL_METADATA_FILENAME +from .util import (FileOperator, convert_path, CSVReader, CSVWriter, Cache, + cached_property, get_cache_base, read_exports, tempdir) +from .version import NormalizedVersion, UnsupportedVersionError + +logger = logging.getLogger(__name__) + +cache = None # created when needed + +if hasattr(sys, 'pypy_version_info'): # pragma: no cover + IMP_PREFIX = 'pp' +elif sys.platform.startswith('java'): # pragma: no cover + IMP_PREFIX = 'jy' +elif sys.platform == 'cli': # pragma: no cover + IMP_PREFIX = 'ip' +else: + IMP_PREFIX = 'cp' + +VER_SUFFIX = sysconfig.get_config_var('py_version_nodot') +if not VER_SUFFIX: # pragma: no cover + VER_SUFFIX = '%s%s' % sys.version_info[:2] +PYVER = 'py' + VER_SUFFIX +IMPVER = IMP_PREFIX + VER_SUFFIX + +ARCH = distutils.util.get_platform().replace('-', '_').replace('.', '_') + +ABI = sysconfig.get_config_var('SOABI') +if ABI and ABI.startswith('cpython-'): + ABI = ABI.replace('cpython-', 'cp') +else: + def _derive_abi(): + parts = ['cp', VER_SUFFIX] + if sysconfig.get_config_var('Py_DEBUG'): + parts.append('d') + if sysconfig.get_config_var('WITH_PYMALLOC'): + parts.append('m') + if sysconfig.get_config_var('Py_UNICODE_SIZE') == 4: + parts.append('u') + return ''.join(parts) + ABI = _derive_abi() + del _derive_abi + +FILENAME_RE = re.compile(r''' +(?P[^-]+) +-(?P\d+[^-]*) +(-(?P\d+[^-]*))? +-(?P\w+\d+(\.\w+\d+)*) +-(?P\w+) +-(?P\w+(\.\w+)*) +\.whl$ +''', re.IGNORECASE | re.VERBOSE) + +NAME_VERSION_RE = re.compile(r''' +(?P[^-]+) +-(?P\d+[^-]*) +(-(?P\d+[^-]*))?$ +''', re.IGNORECASE | re.VERBOSE) + +SHEBANG_RE = re.compile(br'\s*#![^\r\n]*') +SHEBANG_DETAIL_RE = re.compile(br'^(\s*#!("[^"]+"|\S+))\s+(.*)$') +SHEBANG_PYTHON = b'#!python' +SHEBANG_PYTHONW = b'#!pythonw' + +if os.sep == '/': + to_posix = lambda o: o +else: + to_posix = lambda o: o.replace(os.sep, '/') + + +class Mounter(object): + def __init__(self): + self.impure_wheels = {} + self.libs = {} + + def add(self, pathname, extensions): + self.impure_wheels[pathname] = extensions + self.libs.update(extensions) + + def remove(self, pathname): + extensions = self.impure_wheels.pop(pathname) + for k, v in extensions: + if k in self.libs: + del self.libs[k] + + def find_module(self, fullname, path=None): + if fullname in self.libs: + result = self + else: + result = None + return result + + def load_module(self, fullname): + if fullname in sys.modules: + result = sys.modules[fullname] + else: + if fullname not in self.libs: + raise ImportError('unable to find extension for %s' % fullname) + result = imp.load_dynamic(fullname, self.libs[fullname]) + result.__loader__ = self + parts = fullname.rsplit('.', 1) + if len(parts) > 1: + result.__package__ = parts[0] + return result + +_hook = Mounter() + + +class Wheel(object): + """ + Class to build and install from Wheel files (PEP 427). + """ + + wheel_version = (1, 1) + hash_kind = 'sha256' + + def __init__(self, filename=None, sign=False, verify=False): + """ + Initialise an instance using a (valid) filename. + """ + self.sign = sign + self.should_verify = verify + self.buildver = '' + self.pyver = [PYVER] + self.abi = ['none'] + self.arch = ['any'] + self.dirname = os.getcwd() + if filename is None: + self.name = 'dummy' + self.version = '0.1' + self._filename = self.filename + else: + m = NAME_VERSION_RE.match(filename) + if m: + info = m.groupdict('') + self.name = info['nm'] + # Reinstate the local version separator + self.version = info['vn'].replace('_', '-') + self.buildver = info['bn'] + self._filename = self.filename + else: + dirname, filename = os.path.split(filename) + m = FILENAME_RE.match(filename) + if not m: + raise DistlibException('Invalid name or ' + 'filename: %r' % filename) + if dirname: + self.dirname = os.path.abspath(dirname) + self._filename = filename + info = m.groupdict('') + self.name = info['nm'] + self.version = info['vn'] + self.buildver = info['bn'] + self.pyver = info['py'].split('.') + self.abi = info['bi'].split('.') + self.arch = info['ar'].split('.') + + @property + def filename(self): + """ + Build and return a filename from the various components. + """ + if self.buildver: + buildver = '-' + self.buildver + else: + buildver = '' + pyver = '.'.join(self.pyver) + abi = '.'.join(self.abi) + arch = '.'.join(self.arch) + # replace - with _ as a local version separator + version = self.version.replace('-', '_') + return '%s-%s%s-%s-%s-%s.whl' % (self.name, version, buildver, + pyver, abi, arch) + + @property + def exists(self): + path = os.path.join(self.dirname, self.filename) + return os.path.isfile(path) + + @property + def tags(self): + for pyver in self.pyver: + for abi in self.abi: + for arch in self.arch: + yield pyver, abi, arch + + @cached_property + def metadata(self): + pathname = os.path.join(self.dirname, self.filename) + name_ver = '%s-%s' % (self.name, self.version) + info_dir = '%s.dist-info' % name_ver + wrapper = codecs.getreader('utf-8') + with ZipFile(pathname, 'r') as zf: + wheel_metadata = self.get_wheel_metadata(zf) + wv = wheel_metadata['Wheel-Version'].split('.', 1) + file_version = tuple([int(i) for i in wv]) + if file_version < (1, 1): + fns = [WHEEL_METADATA_FILENAME, METADATA_FILENAME, 'METADATA'] + else: + fns = [WHEEL_METADATA_FILENAME, METADATA_FILENAME] + result = None + for fn in fns: + try: + metadata_filename = posixpath.join(info_dir, fn) + with zf.open(metadata_filename) as bf: + wf = wrapper(bf) + result = Metadata(fileobj=wf) + if result: + break + except KeyError: + pass + if not result: + raise ValueError('Invalid wheel, because metadata is ' + 'missing: looked in %s' % ', '.join(fns)) + return result + + def get_wheel_metadata(self, zf): + name_ver = '%s-%s' % (self.name, self.version) + info_dir = '%s.dist-info' % name_ver + metadata_filename = posixpath.join(info_dir, 'WHEEL') + with zf.open(metadata_filename) as bf: + wf = codecs.getreader('utf-8')(bf) + message = message_from_file(wf) + return dict(message) + + @cached_property + def info(self): + pathname = os.path.join(self.dirname, self.filename) + with ZipFile(pathname, 'r') as zf: + result = self.get_wheel_metadata(zf) + return result + + def process_shebang(self, data): + m = SHEBANG_RE.match(data) + if m: + end = m.end() + shebang, data_after_shebang = data[:end], data[end:] + # Preserve any arguments after the interpreter + if b'pythonw' in shebang.lower(): + shebang_python = SHEBANG_PYTHONW + else: + shebang_python = SHEBANG_PYTHON + m = SHEBANG_DETAIL_RE.match(shebang) + if m: + args = b' ' + m.groups()[-1] + else: + args = b'' + shebang = shebang_python + args + data = shebang + data_after_shebang + else: + cr = data.find(b'\r') + lf = data.find(b'\n') + if cr < 0 or cr > lf: + term = b'\n' + else: + if data[cr:cr + 2] == b'\r\n': + term = b'\r\n' + else: + term = b'\r' + data = SHEBANG_PYTHON + term + data + return data + + def get_hash(self, data, hash_kind=None): + if hash_kind is None: + hash_kind = self.hash_kind + try: + hasher = getattr(hashlib, hash_kind) + except AttributeError: + raise DistlibException('Unsupported hash algorithm: %r' % hash_kind) + result = hasher(data).digest() + result = base64.urlsafe_b64encode(result).rstrip(b'=').decode('ascii') + return hash_kind, result + + def write_record(self, records, record_path, base): + records = list(records) # make a copy for sorting + p = to_posix(os.path.relpath(record_path, base)) + records.append((p, '', '')) + records.sort() + with CSVWriter(record_path) as writer: + for row in records: + writer.writerow(row) + + def write_records(self, info, libdir, archive_paths): + records = [] + distinfo, info_dir = info + hasher = getattr(hashlib, self.hash_kind) + for ap, p in archive_paths: + with open(p, 'rb') as f: + data = f.read() + digest = '%s=%s' % self.get_hash(data) + size = os.path.getsize(p) + records.append((ap, digest, size)) + + p = os.path.join(distinfo, 'RECORD') + self.write_record(records, p, libdir) + ap = to_posix(os.path.join(info_dir, 'RECORD')) + archive_paths.append((ap, p)) + + def build_zip(self, pathname, archive_paths): + with ZipFile(pathname, 'w', zipfile.ZIP_DEFLATED) as zf: + for ap, p in archive_paths: + logger.debug('Wrote %s to %s in wheel', p, ap) + zf.write(p, ap) + + def build(self, paths, tags=None, wheel_version=None): + """ + Build a wheel from files in specified paths, and use any specified tags + when determining the name of the wheel. + """ + if tags is None: + tags = {} + + libkey = list(filter(lambda o: o in paths, ('purelib', 'platlib')))[0] + if libkey == 'platlib': + is_pure = 'false' + default_pyver = [IMPVER] + default_abi = [ABI] + default_arch = [ARCH] + else: + is_pure = 'true' + default_pyver = [PYVER] + default_abi = ['none'] + default_arch = ['any'] + + self.pyver = tags.get('pyver', default_pyver) + self.abi = tags.get('abi', default_abi) + self.arch = tags.get('arch', default_arch) + + libdir = paths[libkey] + + name_ver = '%s-%s' % (self.name, self.version) + data_dir = '%s.data' % name_ver + info_dir = '%s.dist-info' % name_ver + + archive_paths = [] + + # First, stuff which is not in site-packages + for key in ('data', 'headers', 'scripts'): + if key not in paths: + continue + path = paths[key] + if os.path.isdir(path): + for root, dirs, files in os.walk(path): + for fn in files: + p = fsdecode(os.path.join(root, fn)) + rp = os.path.relpath(p, path) + ap = to_posix(os.path.join(data_dir, key, rp)) + archive_paths.append((ap, p)) + if key == 'scripts' and not p.endswith('.exe'): + with open(p, 'rb') as f: + data = f.read() + data = self.process_shebang(data) + with open(p, 'wb') as f: + f.write(data) + + # Now, stuff which is in site-packages, other than the + # distinfo stuff. + path = libdir + distinfo = None + for root, dirs, files in os.walk(path): + if root == path: + # At the top level only, save distinfo for later + # and skip it for now + for i, dn in enumerate(dirs): + dn = fsdecode(dn) + if dn.endswith('.dist-info'): + distinfo = os.path.join(root, dn) + del dirs[i] + break + assert distinfo, '.dist-info directory expected, not found' + + for fn in files: + # comment out next suite to leave .pyc files in + if fsdecode(fn).endswith(('.pyc', '.pyo')): + continue + p = os.path.join(root, fn) + rp = to_posix(os.path.relpath(p, path)) + archive_paths.append((rp, p)) + + # Now distinfo. Assumed to be flat, i.e. os.listdir is enough. + files = os.listdir(distinfo) + for fn in files: + if fn not in ('RECORD', 'INSTALLER', 'SHARED', 'WHEEL'): + p = fsdecode(os.path.join(distinfo, fn)) + ap = to_posix(os.path.join(info_dir, fn)) + archive_paths.append((ap, p)) + + wheel_metadata = [ + 'Wheel-Version: %d.%d' % (wheel_version or self.wheel_version), + 'Generator: distlib %s' % __version__, + 'Root-Is-Purelib: %s' % is_pure, + ] + for pyver, abi, arch in self.tags: + wheel_metadata.append('Tag: %s-%s-%s' % (pyver, abi, arch)) + p = os.path.join(distinfo, 'WHEEL') + with open(p, 'w') as f: + f.write('\n'.join(wheel_metadata)) + ap = to_posix(os.path.join(info_dir, 'WHEEL')) + archive_paths.append((ap, p)) + + # Now, at last, RECORD. + # Paths in here are archive paths - nothing else makes sense. + self.write_records((distinfo, info_dir), libdir, archive_paths) + # Now, ready to build the zip file + pathname = os.path.join(self.dirname, self.filename) + self.build_zip(pathname, archive_paths) + return pathname + + def skip_entry(self, arcname): + """ + Determine whether an archive entry should be skipped when verifying + or installing. + """ + # The signature file won't be in RECORD, + # and we don't currently don't do anything with it + # We also skip directories, as they won't be in RECORD + # either. See: + # + # https://github.com/pypa/wheel/issues/294 + # https://github.com/pypa/wheel/issues/287 + # https://github.com/pypa/wheel/pull/289 + # + return arcname.endswith(('/', '/RECORD.jws')) + + def install(self, paths, maker, **kwargs): + """ + Install a wheel to the specified paths. If kwarg ``warner`` is + specified, it should be a callable, which will be called with two + tuples indicating the wheel version of this software and the wheel + version in the file, if there is a discrepancy in the versions. + This can be used to issue any warnings to raise any exceptions. + If kwarg ``lib_only`` is True, only the purelib/platlib files are + installed, and the headers, scripts, data and dist-info metadata are + not written. If kwarg ``bytecode_hashed_invalidation`` is True, written + bytecode will try to use file-hash based invalidation (PEP-552) on + supported interpreter versions (CPython 2.7+). + + The return value is a :class:`InstalledDistribution` instance unless + ``options.lib_only`` is True, in which case the return value is ``None``. + """ + + dry_run = maker.dry_run + warner = kwargs.get('warner') + lib_only = kwargs.get('lib_only', False) + bc_hashed_invalidation = kwargs.get('bytecode_hashed_invalidation', False) + + pathname = os.path.join(self.dirname, self.filename) + name_ver = '%s-%s' % (self.name, self.version) + data_dir = '%s.data' % name_ver + info_dir = '%s.dist-info' % name_ver + + metadata_name = posixpath.join(info_dir, METADATA_FILENAME) + wheel_metadata_name = posixpath.join(info_dir, 'WHEEL') + record_name = posixpath.join(info_dir, 'RECORD') + + wrapper = codecs.getreader('utf-8') + + with ZipFile(pathname, 'r') as zf: + with zf.open(wheel_metadata_name) as bwf: + wf = wrapper(bwf) + message = message_from_file(wf) + wv = message['Wheel-Version'].split('.', 1) + file_version = tuple([int(i) for i in wv]) + if (file_version != self.wheel_version) and warner: + warner(self.wheel_version, file_version) + + if message['Root-Is-Purelib'] == 'true': + libdir = paths['purelib'] + else: + libdir = paths['platlib'] + + records = {} + with zf.open(record_name) as bf: + with CSVReader(stream=bf) as reader: + for row in reader: + p = row[0] + records[p] = row + + data_pfx = posixpath.join(data_dir, '') + info_pfx = posixpath.join(info_dir, '') + script_pfx = posixpath.join(data_dir, 'scripts', '') + + # make a new instance rather than a copy of maker's, + # as we mutate it + fileop = FileOperator(dry_run=dry_run) + fileop.record = True # so we can rollback if needed + + bc = not sys.dont_write_bytecode # Double negatives. Lovely! + + outfiles = [] # for RECORD writing + + # for script copying/shebang processing + workdir = tempfile.mkdtemp() + # set target dir later + # we default add_launchers to False, as the + # Python Launcher should be used instead + maker.source_dir = workdir + maker.target_dir = None + try: + for zinfo in zf.infolist(): + arcname = zinfo.filename + if isinstance(arcname, text_type): + u_arcname = arcname + else: + u_arcname = arcname.decode('utf-8') + if self.skip_entry(u_arcname): + continue + row = records[u_arcname] + if row[2] and str(zinfo.file_size) != row[2]: + raise DistlibException('size mismatch for ' + '%s' % u_arcname) + if row[1]: + kind, value = row[1].split('=', 1) + with zf.open(arcname) as bf: + data = bf.read() + _, digest = self.get_hash(data, kind) + if digest != value: + raise DistlibException('digest mismatch for ' + '%s' % arcname) + + if lib_only and u_arcname.startswith((info_pfx, data_pfx)): + logger.debug('lib_only: skipping %s', u_arcname) + continue + is_script = (u_arcname.startswith(script_pfx) + and not u_arcname.endswith('.exe')) + + if u_arcname.startswith(data_pfx): + _, where, rp = u_arcname.split('/', 2) + outfile = os.path.join(paths[where], convert_path(rp)) + else: + # meant for site-packages. + if u_arcname in (wheel_metadata_name, record_name): + continue + outfile = os.path.join(libdir, convert_path(u_arcname)) + if not is_script: + with zf.open(arcname) as bf: + fileop.copy_stream(bf, outfile) + outfiles.append(outfile) + # Double check the digest of the written file + if not dry_run and row[1]: + with open(outfile, 'rb') as bf: + data = bf.read() + _, newdigest = self.get_hash(data, kind) + if newdigest != digest: + raise DistlibException('digest mismatch ' + 'on write for ' + '%s' % outfile) + if bc and outfile.endswith('.py'): + try: + pyc = fileop.byte_compile(outfile, + hashed_invalidation=bc_hashed_invalidation) + outfiles.append(pyc) + except Exception: + # Don't give up if byte-compilation fails, + # but log it and perhaps warn the user + logger.warning('Byte-compilation failed', + exc_info=True) + else: + fn = os.path.basename(convert_path(arcname)) + workname = os.path.join(workdir, fn) + with zf.open(arcname) as bf: + fileop.copy_stream(bf, workname) + + dn, fn = os.path.split(outfile) + maker.target_dir = dn + filenames = maker.make(fn) + fileop.set_executable_mode(filenames) + outfiles.extend(filenames) + + if lib_only: + logger.debug('lib_only: returning None') + dist = None + else: + # Generate scripts + + # Try to get pydist.json so we can see if there are + # any commands to generate. If this fails (e.g. because + # of a legacy wheel), log a warning but don't give up. + commands = None + file_version = self.info['Wheel-Version'] + if file_version == '1.0': + # Use legacy info + ep = posixpath.join(info_dir, 'entry_points.txt') + try: + with zf.open(ep) as bwf: + epdata = read_exports(bwf) + commands = {} + for key in ('console', 'gui'): + k = '%s_scripts' % key + if k in epdata: + commands['wrap_%s' % key] = d = {} + for v in epdata[k].values(): + s = '%s:%s' % (v.prefix, v.suffix) + if v.flags: + s += ' %s' % v.flags + d[v.name] = s + except Exception: + logger.warning('Unable to read legacy script ' + 'metadata, so cannot generate ' + 'scripts') + else: + try: + with zf.open(metadata_name) as bwf: + wf = wrapper(bwf) + commands = json.load(wf).get('extensions') + if commands: + commands = commands.get('python.commands') + except Exception: + logger.warning('Unable to read JSON metadata, so ' + 'cannot generate scripts') + if commands: + console_scripts = commands.get('wrap_console', {}) + gui_scripts = commands.get('wrap_gui', {}) + if console_scripts or gui_scripts: + script_dir = paths.get('scripts', '') + if not os.path.isdir(script_dir): + raise ValueError('Valid script path not ' + 'specified') + maker.target_dir = script_dir + for k, v in console_scripts.items(): + script = '%s = %s' % (k, v) + filenames = maker.make(script) + fileop.set_executable_mode(filenames) + + if gui_scripts: + options = {'gui': True } + for k, v in gui_scripts.items(): + script = '%s = %s' % (k, v) + filenames = maker.make(script, options) + fileop.set_executable_mode(filenames) + + p = os.path.join(libdir, info_dir) + dist = InstalledDistribution(p) + + # Write SHARED + paths = dict(paths) # don't change passed in dict + del paths['purelib'] + del paths['platlib'] + paths['lib'] = libdir + p = dist.write_shared_locations(paths, dry_run) + if p: + outfiles.append(p) + + # Write RECORD + dist.write_installed_files(outfiles, paths['prefix'], + dry_run) + return dist + except Exception: # pragma: no cover + logger.exception('installation failed.') + fileop.rollback() + raise + finally: + shutil.rmtree(workdir) + + def _get_dylib_cache(self): + global cache + if cache is None: + # Use native string to avoid issues on 2.x: see Python #20140. + base = os.path.join(get_cache_base(), str('dylib-cache'), + '%s.%s' % sys.version_info[:2]) + cache = Cache(base) + return cache + + def _get_extensions(self): + pathname = os.path.join(self.dirname, self.filename) + name_ver = '%s-%s' % (self.name, self.version) + info_dir = '%s.dist-info' % name_ver + arcname = posixpath.join(info_dir, 'EXTENSIONS') + wrapper = codecs.getreader('utf-8') + result = [] + with ZipFile(pathname, 'r') as zf: + try: + with zf.open(arcname) as bf: + wf = wrapper(bf) + extensions = json.load(wf) + cache = self._get_dylib_cache() + prefix = cache.prefix_to_dir(pathname) + cache_base = os.path.join(cache.base, prefix) + if not os.path.isdir(cache_base): + os.makedirs(cache_base) + for name, relpath in extensions.items(): + dest = os.path.join(cache_base, convert_path(relpath)) + if not os.path.exists(dest): + extract = True + else: + file_time = os.stat(dest).st_mtime + file_time = datetime.datetime.fromtimestamp(file_time) + info = zf.getinfo(relpath) + wheel_time = datetime.datetime(*info.date_time) + extract = wheel_time > file_time + if extract: + zf.extract(relpath, cache_base) + result.append((name, dest)) + except KeyError: + pass + return result + + def is_compatible(self): + """ + Determine if a wheel is compatible with the running system. + """ + return is_compatible(self) + + def is_mountable(self): + """ + Determine if a wheel is asserted as mountable by its metadata. + """ + return True # for now - metadata details TBD + + def mount(self, append=False): + pathname = os.path.abspath(os.path.join(self.dirname, self.filename)) + if not self.is_compatible(): + msg = 'Wheel %s not compatible with this Python.' % pathname + raise DistlibException(msg) + if not self.is_mountable(): + msg = 'Wheel %s is marked as not mountable.' % pathname + raise DistlibException(msg) + if pathname in sys.path: + logger.debug('%s already in path', pathname) + else: + if append: + sys.path.append(pathname) + else: + sys.path.insert(0, pathname) + extensions = self._get_extensions() + if extensions: + if _hook not in sys.meta_path: + sys.meta_path.append(_hook) + _hook.add(pathname, extensions) + + def unmount(self): + pathname = os.path.abspath(os.path.join(self.dirname, self.filename)) + if pathname not in sys.path: + logger.debug('%s not in path', pathname) + else: + sys.path.remove(pathname) + if pathname in _hook.impure_wheels: + _hook.remove(pathname) + if not _hook.impure_wheels: + if _hook in sys.meta_path: + sys.meta_path.remove(_hook) + + def verify(self): + pathname = os.path.join(self.dirname, self.filename) + name_ver = '%s-%s' % (self.name, self.version) + data_dir = '%s.data' % name_ver + info_dir = '%s.dist-info' % name_ver + + metadata_name = posixpath.join(info_dir, METADATA_FILENAME) + wheel_metadata_name = posixpath.join(info_dir, 'WHEEL') + record_name = posixpath.join(info_dir, 'RECORD') + + wrapper = codecs.getreader('utf-8') + + with ZipFile(pathname, 'r') as zf: + with zf.open(wheel_metadata_name) as bwf: + wf = wrapper(bwf) + message = message_from_file(wf) + wv = message['Wheel-Version'].split('.', 1) + file_version = tuple([int(i) for i in wv]) + # TODO version verification + + records = {} + with zf.open(record_name) as bf: + with CSVReader(stream=bf) as reader: + for row in reader: + p = row[0] + records[p] = row + + for zinfo in zf.infolist(): + arcname = zinfo.filename + if isinstance(arcname, text_type): + u_arcname = arcname + else: + u_arcname = arcname.decode('utf-8') + # See issue #115: some wheels have .. in their entries, but + # in the filename ... e.g. __main__..py ! So the check is + # updated to look for .. in the directory portions + p = u_arcname.split('/') + if '..' in p: + raise DistlibException('invalid entry in ' + 'wheel: %r' % u_arcname) + + if self.skip_entry(u_arcname): + continue + row = records[u_arcname] + if row[2] and str(zinfo.file_size) != row[2]: + raise DistlibException('size mismatch for ' + '%s' % u_arcname) + if row[1]: + kind, value = row[1].split('=', 1) + with zf.open(arcname) as bf: + data = bf.read() + _, digest = self.get_hash(data, kind) + if digest != value: + raise DistlibException('digest mismatch for ' + '%s' % arcname) + + def update(self, modifier, dest_dir=None, **kwargs): + """ + Update the contents of a wheel in a generic way. The modifier should + be a callable which expects a dictionary argument: its keys are + archive-entry paths, and its values are absolute filesystem paths + where the contents the corresponding archive entries can be found. The + modifier is free to change the contents of the files pointed to, add + new entries and remove entries, before returning. This method will + extract the entire contents of the wheel to a temporary location, call + the modifier, and then use the passed (and possibly updated) + dictionary to write a new wheel. If ``dest_dir`` is specified, the new + wheel is written there -- otherwise, the original wheel is overwritten. + + The modifier should return True if it updated the wheel, else False. + This method returns the same value the modifier returns. + """ + + def get_version(path_map, info_dir): + version = path = None + key = '%s/%s' % (info_dir, METADATA_FILENAME) + if key not in path_map: + key = '%s/PKG-INFO' % info_dir + if key in path_map: + path = path_map[key] + version = Metadata(path=path).version + return version, path + + def update_version(version, path): + updated = None + try: + v = NormalizedVersion(version) + i = version.find('-') + if i < 0: + updated = '%s+1' % version + else: + parts = [int(s) for s in version[i + 1:].split('.')] + parts[-1] += 1 + updated = '%s+%s' % (version[:i], + '.'.join(str(i) for i in parts)) + except UnsupportedVersionError: + logger.debug('Cannot update non-compliant (PEP-440) ' + 'version %r', version) + if updated: + md = Metadata(path=path) + md.version = updated + legacy = not path.endswith(METADATA_FILENAME) + md.write(path=path, legacy=legacy) + logger.debug('Version updated from %r to %r', version, + updated) + + pathname = os.path.join(self.dirname, self.filename) + name_ver = '%s-%s' % (self.name, self.version) + info_dir = '%s.dist-info' % name_ver + record_name = posixpath.join(info_dir, 'RECORD') + with tempdir() as workdir: + with ZipFile(pathname, 'r') as zf: + path_map = {} + for zinfo in zf.infolist(): + arcname = zinfo.filename + if isinstance(arcname, text_type): + u_arcname = arcname + else: + u_arcname = arcname.decode('utf-8') + if u_arcname == record_name: + continue + if '..' in u_arcname: + raise DistlibException('invalid entry in ' + 'wheel: %r' % u_arcname) + zf.extract(zinfo, workdir) + path = os.path.join(workdir, convert_path(u_arcname)) + path_map[u_arcname] = path + + # Remember the version. + original_version, _ = get_version(path_map, info_dir) + # Files extracted. Call the modifier. + modified = modifier(path_map, **kwargs) + if modified: + # Something changed - need to build a new wheel. + current_version, path = get_version(path_map, info_dir) + if current_version and (current_version == original_version): + # Add or update local version to signify changes. + update_version(current_version, path) + # Decide where the new wheel goes. + if dest_dir is None: + fd, newpath = tempfile.mkstemp(suffix='.whl', + prefix='wheel-update-', + dir=workdir) + os.close(fd) + else: + if not os.path.isdir(dest_dir): + raise DistlibException('Not a directory: %r' % dest_dir) + newpath = os.path.join(dest_dir, self.filename) + archive_paths = list(path_map.items()) + distinfo = os.path.join(workdir, info_dir) + info = distinfo, info_dir + self.write_records(info, workdir, archive_paths) + self.build_zip(newpath, archive_paths) + if dest_dir is None: + shutil.copyfile(newpath, pathname) + return modified + +def compatible_tags(): + """ + Return (pyver, abi, arch) tuples compatible with this Python. + """ + versions = [VER_SUFFIX] + major = VER_SUFFIX[0] + for minor in range(sys.version_info[1] - 1, - 1, -1): + versions.append(''.join([major, str(minor)])) + + abis = [] + for suffix, _, _ in imp.get_suffixes(): + if suffix.startswith('.abi'): + abis.append(suffix.split('.', 2)[1]) + abis.sort() + if ABI != 'none': + abis.insert(0, ABI) + abis.append('none') + result = [] + + arches = [ARCH] + if sys.platform == 'darwin': + m = re.match(r'(\w+)_(\d+)_(\d+)_(\w+)$', ARCH) + if m: + name, major, minor, arch = m.groups() + minor = int(minor) + matches = [arch] + if arch in ('i386', 'ppc'): + matches.append('fat') + if arch in ('i386', 'ppc', 'x86_64'): + matches.append('fat3') + if arch in ('ppc64', 'x86_64'): + matches.append('fat64') + if arch in ('i386', 'x86_64'): + matches.append('intel') + if arch in ('i386', 'x86_64', 'intel', 'ppc', 'ppc64'): + matches.append('universal') + while minor >= 0: + for match in matches: + s = '%s_%s_%s_%s' % (name, major, minor, match) + if s != ARCH: # already there + arches.append(s) + minor -= 1 + + # Most specific - our Python version, ABI and arch + for abi in abis: + for arch in arches: + result.append((''.join((IMP_PREFIX, versions[0])), abi, arch)) + + # where no ABI / arch dependency, but IMP_PREFIX dependency + for i, version in enumerate(versions): + result.append((''.join((IMP_PREFIX, version)), 'none', 'any')) + if i == 0: + result.append((''.join((IMP_PREFIX, version[0])), 'none', 'any')) + + # no IMP_PREFIX, ABI or arch dependency + for i, version in enumerate(versions): + result.append((''.join(('py', version)), 'none', 'any')) + if i == 0: + result.append((''.join(('py', version[0])), 'none', 'any')) + return set(result) + + +COMPATIBLE_TAGS = compatible_tags() + +del compatible_tags + + +def is_compatible(wheel, tags=None): + if not isinstance(wheel, Wheel): + wheel = Wheel(wheel) # assume it's a filename + result = False + if tags is None: + tags = COMPATIBLE_TAGS + for ver, abi, arch in tags: + if ver in wheel.pyver and abi in wheel.abi and arch in wheel.arch: + result = True + break + return result diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/wheel.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distlib/wheel.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6f0f3fb3de8a22fbf5e8eb44fdc40bdb9a40ca37 GIT binary patch literal 33855 zcmd6wdyrgLUf<8{9?eT5jh-WoBwH<6W49hNvMpJ%wU*X;Tedus@5mnSSaPeUyJys+ ze$4dkwr0!>Y_VIgfn`my4+w!;C}2};Es*di68M8GAqi}ff(jKNED5yQ)pa#JbGBc66s=_KCern-{&8aLH#@wBV-xN5JP>TSQ@=cf9S za{X?qKZ&n(Q)`p>fSVdf;_KYhx+K2dO|4JjgKlatiEnUI8Qv;u=@k;;LKS)K*s=a#KU}jMQ#d+2*R--PCqh9d=X0uDZib?QqqdZfd8i?s8MR ze7PQ1dB{~Cc2f`g=U!LY?W!3!m2uTQZfcLK?sZdpeO{ldJmRYR+|)i-9dT15uKK8( zdel`Pb5oDGYSv9=GiOBxxrMozoZX;=Sn zictOCVg3DHd*rPh>K8Rkop!aYuDH{E)VZlMu5?CCkoY?BK{t2S6?a+WoQ3Dz8NG8M z$$RLXc^8wshpiXSCy%@B@scYtuP?YF^ZKGIt#fmiU2(60>_EEsi1p$nR|A{(#qr{Z zD~-FEz!e`=3cdT#)D>5{V*R}8ijO7P*>?8JuDIXc4qYj~W_h0=VJ?4SlqC&kkQ=V=1@HADPzd&ux zUg9%Rv848`ShKX)%r%$hOU-U&l`C|~cV{clmugWnU#XOeYNt`2Zdn`97-u!TRBGmn z`DVVUuD^8t+Uawrubs|axODma`01C0Un##;D!%GLZR2>Q7PaQ}Ry+B8 zqfu|P^v3+s{8D>f%C(t#OY=29-|FJeT>j0xJ(x6`%{>22_;rlP^%Z~ zO?!1D8i~rP%GbBl5-yBdn6q%KB^XRxIeq3*OEX)TUuxc}*G3D(oeJyav*HWOL|_U{ zV3KkxfIe_@aD$Ys*MpAiIT%7(j{)Q%&hE187n1BX_hfhLx!7Y1tDY3EM7Zgxs6?hGBVre!f&IHf?t5 z<(fx#L2{k~QI?3aAcBXw!}E>uoB3wxFmE58saL?m={~}?o_Kuvi6cu( zZ#L(e&F1kVcWyn-zuDU1Ylr8{^P^?Ieny`>er$XyRFZu`mRhmiI9&9r_wb!trBY># z$+IO+3*|RUx%_nb1GFCrJzOvl3tEwd$$Y-x$4daDV@(9^b5; zx?Vh}lmq+wvz9cyDrx@*eX;qaQ`hetq-6H`n2+qIyf0o>R{W4}=)o6KiR)u`ZdLa6 zw~qf^o8Q+TX{N772Oin;`Wx39*K0QpL=TbjM%L1@dtZNJ?~Q|dm#NbTB)1 zVE?{I2=mAukKK`|K=N?M@ZfMk$ew%+;WfG7-h@r=xSvxM0JEK|Kgc=OSe~uqtJB5& zsT=AMU)LUhNQ4bwGZ8Jz_F@dgNhgd>jr&n&jS!2xH%jxBe4*6Tdap-KrAMWC8+-UL z4-as>;cnW`@eMNsMsi=Ow`ve@qf(?9l{zCT^)wG9m=#pT8E=I|1r~ugr7U7{AcRUB z7O|(x5_?=Ykrn@HgRxEchDa?NBKi;)or7;EH-gRm(o zRc0O_9F5`Ta^+gNnac@ukvipqzM!D#PQHdadq`ML#ptsfxMzh(M)66797`og#;+H{ z5e1JD7=3Kb!_-TLUEyO&6v~Pn*Yed;Q-l_wp;VI?@<6Gjx}Gl`JtD{k>*554MCT0ZH1)GA+uoS}|Aya$N?BxMS zd8i2*+Z6{&(ljgrSP}%%TOM~*$9TO~$|};qoS9aoVwj_3lj?kDqE@B(AVDH#J5#O| zbJcpWRVgj-7{g^S=u35bR8pVyHB|aXM1Ttv8&ncpcE@oNhe4{^VgfdhsK+%r3SsAMKnzOex|KKABZ4P^%&?Oc2*jy^l-pgd@jZHk_zmlY zKGjNO!tigrC4$?k<)VnwhCLG9!`kk1^9Npo#DYEo#p;mb_T(VG{X? z6{IdzCHfCQw)E2-L+TCb(QM+K|gBsnkG2v3ZW>(R1vTN~snrG4uJtZK*lA z4yuGt(nxqz!7hRajTkm84}?X!6Kx@IlD|@eESh1+?k4_k2*$G_jxli-mNRStGZ$l3 zE*EMj;UNW&D|kY|Qwlyv&>5%2-gl8R+(##-`9|t>chJ|x|L%bv)2=2ZmljC3e_95{ zrgtMlwb`_cN?2TsLCcV|Q+5PC;?bCydR(bDX49ZA79>5c5!cpZzdd#*k82%v5)_I! z7xPiC;@FOq-j}3fKI*r0Y)3m~KantiA!Wc4F&wS42v(!@7TIFOC^_gpieUju#0E>p zz_HOH+hj9QLzp=>TVzKwM*6z@kDCFrY3g?&+pU8_e*A2C@ ziuBOqhUb_laG_5mF0Po2eqYK9FYQ)-&w9Ao&25Prx(-?Fb}P{0t@pMb?FpL9>{^xV zP~Byy^#=oulUlYp9_g-{_0-eH*T0v3->A6CnJQtp~_N)13!P}o^8+9aNxLYW>Iy|BtsIQ)}i8m$|FWwE+V{1D<9ZA^9 zYOQ*qa9pvo%GYv^LBQg5RqM4ZN8yV+c6h@3&koe~ck_*ehpwv+M%Rb&LH`H&>S+)b z*v-?r)Nrtlr|rbM`M-|ucI6Y({~`VtG(3$~P%s(l+ljC~<`73AvbOGsZ(}J-xMW$I zkRwr@LZ+=C8bPb#l(dlz)?G3snqA#ruBGCm@x4hOh4hL6jSlEls zz5Lqb!hd#M%`NVBziV6y_{Z~Wd?zUw%?F57h+zm&YO`NecEl)O0p%vLvYCyWL}B!- zrFj{N#$?mR?#(8Mcx0(g^B*#r~$ z!)$YhGSj6(zJ*8xleg`sOgYL_%aMel6PZfAe!C>`T57JS&7q7D0q$p&=hvdS*0ePNB}`9!Ioo65zFZ9tV9x!Lqdv)Ep6h$e0h~*r6*pb zOea)@w-U3CaOz!Fnr*ap)|_pyc5peI=55a^3yNvuA$&uDR)kSqNw{7bc}(fD3xzWZ zpl>dmS0EEv*dQ?UiubA?AYTnpc-^1zjn)%5n`D_~w(>1#U7Is4RXvB?1EWrsl7}3yHH)%}9S!aTv19sK2KIV#1HAywWMw>$dHId&*n) zaHQXDqp%bf{=^&GwjTWU-T;TBJvZ@pFeYY z{GwFImw7bet6gd>`%3)|WL%nRQtIl5u04Nce9~z8-DyUllcaO_WL&x|l~!cT6j{Hu zC981O*pU{yU;j9Agp)jlOG@e?h;Egp^R-!Hb@KDb)BF+0BLz4pPGrzFO)gtNux^0r>qZQJWGMqgJP?F04?0{ zmNtG@xvgYw<)d4fd}X$d`^>GXY&V9gCyi<3qe8jtF`_M?=!M*EFvXAoSts9YddWgL z?2a1xohDJ9L0&@f_77oOu{>Lfnud7Oc;6g5YM9w-RHFP$DK~xWXsKpiNGjWqchS6+ z^}b1~w$eUKe)t^(maUeNz#cH+G+9f+pSrVGSY#@%nMu;@53CEeKuY%nZDXxgli|uY zYapPDr=#e&d`xJNl)wx!o1WkB2nmDUV6`>2gm%Y72TC=ZkTFw8g($^*bG7SNv9?-Y7=4>C?dHtbu=)yt-6@aKiA_5~y%1(= z+zw3elpNRNrrzqAWb13E?Fdu@cI6>M(4@;=cSVPjDU zB}jPRuEun%5S~Q&5@5pfXRn0kOjiuQQ_rH6wwl8NF~bBYRpFgf)n9}XE^6Y z*B?}&&k$qPHK`S1r6 z7oVO9KTH^YLeCnOI`ANoQKMOnjL|V+qgJ7VMWMz(Y$Wk2+<}#CGZ}#$m%o6WYK=a8LMVXiKFBE()NM~A$M`O2x`cZU8Dca4jcn}USu$T* zCci%g&zJ%B8znt#m6MVe9hfNa^V>m6qyOIqAoj)F0ZDk+3&5;TNvgB5O-Z@5O+Crg zUE1A4Tn286^g6^2NxPKkwiMQOPh3XUC@VuhEej7$fl&an|`-uMGN<3~&q8_d-GHbkDsZEkM65&7*9`7JPL0S(t9 z5@}((i(jElUcuPwU)d2C2>d$>(*d8!h0A<<1+Yn|IiRA#m0`Eodk=WNb{BXA1%I00 ztEt6TToWMzmwkcpq7j50Ze^#yw!G82MD|V_)sP+=pGhEg6V5iAy&&#U$;&rAh zo)jYONui?2h1;n~RrQdgH!2Bc%=jL>p&rmYUjD+l<@8-x!e~}wNxNYX0v6lOx-T{? zET{QQ79SStod4srX7^z?RK#s)H-9oBs6(;??{bSrjTvVE{C=CDhuq4;ZUs~SE+H95 z8J6if73~&Nm!=Rb40PF$SPpcC&9sLM{PfTx+FrvN>PfJMqYo;%OXF7s9(_8nv?2Lg z1fly5NkgD7K*d(IvkJf4CiYI1Bwz86{V)2gs zORHJ-e(VD8wEatVvK;m0mRZgH8&N@uUSt)Hl@?28qHj!l@$t@dOCVphhah-%9y17d zr2+>11j*S#sTgkXss`*1IC+LM8y3q#1W^%%My*YX*8ola4&P$Q)bzIA{ z9g*zy+FpnER_{0S;n$lbbGx+>yc_&{6@oIy208;aQT%T=>g674u&V$$&G@a*&91r<;#`tQBl)t5>3d)6IMUIP0DPd3fLM? zb~Hk*?C^C3Kc?VC1>*{Sk|4WBvBwnr69rc87lRus{O^u#<6Z?;lXMm+0?`0x@HNY-|9OWV-G)5G| zx@t1LMT2V0hbH{~W2Jsr!H+7a5SWfrtc7z*xTxTH1(y^YAjtA{{-}V4{k{_~8RHXJz`)es*JY*-7rh2-&+# zC(?G$NSC&Ab_WCLVM-2?-@_Kq*3>#`>gH)@urn=x6>0W6gB|G&^}?4`U>?;tJ3t#8p9NuMCcXamSEoILFZ!jQxaE$|1{*s6|1KiJV&5p-Xn@l z%}jK=%zj-_MQa)F9t7KJ*M;L%>@-Mfhiw^UIouNJ9ro(>*xa4S69@q6-kGJ;@aG7u zkYT*xHT@EM^aw%r1Hc85e}N%qu=yDwgkbL07Xmk8}Wn!gnm<>Jpc?MJfiv#nyq6wc1w1HGvm|Dr)1X$+C|m7F`M=wX>Vi}* z6~}My@0KQmknRO@1XoUeqSENy&8Q7)r8XeF$^j9VOX|f9fUY11ZZhA5Ey$GkCZNqA z=AudjPQD4*Koub4@nMu`pJ~^)9UzhV&?k~hT~fi+1b&P13q`y6nCy^fI>QK;H8evW zHrYd&>A(W+`)~dTZ=aJ&Ag2PFNA`As92R!CMTEp1bj>sjR0q_RVFY1fs6Pm)&o2DS z0JEir=ffDXfZz0?m4{YA)~7t2q)-M$f<$C%gl*!;z%r)=D;X1yGcJdAHSFegxPg^D zX13ca2eiQ(hf`wD@aHBun9I?8s zpa4XwCW(y4ToDQU(e{o3?~{*)-1tN~jtLiVUN&5~4mv#MRH@E$l93q zC%6PQ?03t29@E_G-2-mrpj+mXH7xmrb%36ZBpq1zL|S9O$MzS~bZhQ_sVWb}S}}>u zgKqASj(Ka?vLE?D`=WMgyZ&W+bJWzBfLS@DvZ@KS237MwmmV1uuGXl>bd0&BW20_m zY}H!E)H>>hn`3TyOs`RH<*=(AQC%!2)N>4%I=OMC%Xgte1-3c8Wx)1tEg!=MbFM~g#%-{TtVyUCjae0vOB>${g2F+F|48fL9Q+=5_*N8eGq ziU5m2WldM}N!yINwMLs!OwGKetPl_yt$pH=gu z0Ud~Y8gO609a#mqxKc=*!A|&gRFy8H5!=EeoO{aZr7X=)8$^)9g98VtT;iPbI ztUE?GYdZi+D_oLrBCQC80XA0^KrTJ?!`>i@_Iyu=avS2WJnfeLRWgdF)tXie2Bc>a zO8iVb1EP7y-QuTQ@fm2s$KA>a-2t$C0uJ#3x6J1mL%C0OQ?P6KxGS=f$b5F?S-1GQ zaw#)BcfymD3vT74D}wwd-5jqHKI_eAr|jXRYpm^AKIMv|@#E0(l~Z;Ai2P?Qtryby zAG#+OKH1G@a&qB|J;@B8>*>s}EsucA*J?{{>9u5_IG8cev+rOzr*sX3=Q?7vHdO-V zao6~VJ%mbpT-^BHd%t;ssSTcg92eX`^o+Fqnf{ z25|EfJfq@5I|{xN?G~Qvom5x8(u-Re%Y>^Sj;)+^i zJGt$K2d` zJ%|fh4RF}T%Y891Fq4pRdCCDG$OZ2m=PU-rW&S_rCMIhK+mrcyeK8_kbVXYlvgyn{ zFPH}3>TCyF7|^`r=3WphrE@{d#YvvXoUSl*yjGY8P*0o*X-VkaJt@_pSku_#gpIFi|$yCki?acH(A?^LO8_ z0y^u`2s`Fe0|Ps_ee-7B?s$pD?l)^-jYsSPW3rjJx8a*NbvXCt%~h(S3^9HgnFDT8 zuO0eHz;{2ezgIJ$Y(L(%W+oro47PVy`2~-^yJN82cJ8sTnRU!8m$LTU$I@vA8(d0C z97?5x^T#n%I7UiScZ-dsT!XuKq+qsW`_pEx9Et7d&+3!1CtE{gdxw^H6p(Q+0o)0% z!;4yA1eE#4Y@A*VS37Kw>v-^|r@)hGj9TBPeB- zr>N0P9=tA^VTo1GGQldU16ZBTd5lo+gb8NcePZl!yMV^@ZCpRV?`W*K*fjGbSMfyk ziZ3|ZDw}b31n;TXhAV)|$2iAWHPa)}31aHIMt_>Wue6ULYm+}yDb3~~aQ^)^5r9~4@AS>VkkeAP*lbsYuq5RsK*mevRX5sj5qRD*vhimn2UhATGEm9 z@Ml#`N!4gtxd*Eng@Q@gRGP??pC1kjH=r7ox`Y>&G4_`vE5=501xSCkp)DrZ02}p6 zWtt=UzEiij^{ZmhMirV`%E}Dav6EXz1Ol{Ax^pIK}puRR#D8_BXqaXSGQhApZ;U9i%1xSm1W z2xq-I-fGEhQ;&@m#4ln#-8-8D7yX|>wuw4nA!_}1(JA=LHO_bWnS1qnfZRGC&PDkva zuv@Y}r2wh`;{4?ne5xF6iq~I6%Mru^8W~#;}b#`*3RAMgEp9 z<*IHSlvzh@eoQLI0h?4G*JJ3aGGC|S-ZyQ4mV5ZG-J0%TgYC8S^1ep4HdPQTwOBOm zw!iWs5vW?xyH#J5<(`8C*zCdbkC24}lc~Kps)6Y8_D{RakW9YlaW!gxAL8c$w0SqU)BrfJh1oLri%E#u8vOqkGXngvwBRo&t6ADY zZ$Q92fH8qYHbn@(&iP8-TXhx+@*&T4D!^8OTN-9F9M$^G*1(iv8NCzWv9@$Qz*y=1 zQYrcN#X#pdXou|+Uc_70wollB(IcEsoWao+pG`Wr zqWz$auJKa_C)|PzPiG=<}~#J3p?g5+?3d<+2&F-?Nx{LxtZ^p!Mb@)IU`0e<;``>=Q0}`6!2D zI!wV}s%Z2SW`1JC7!~8o{xPO1(TU*9aR!k*HCQ;g(UJ_E;gQPRkA&ky+ z)U}@$nK?zegE48#Ugs~xEIb3zg%UbjqkEKwDWS7B#zKf`>whyRD8w8JjJ@rcWu!@H z$dY2^v(CI@R_i6w+J=|TzB_idytl{6_#y!xfmnBAd5fP6G_9JshjC*r;&jJ4;;;S_ ziXdNgUi7XKkCFTUp&cFsCjU|3<;$)@8$<$?fvAfJAc}!=m8WkA9E?&3@fgJNoTt_u zjdq9FG#1Gw3Grd;d*EYB?f(mqn6nKt)$aM1SAj=R5|t5DJO*h!C8Ru#B>c^@HE24> zg)6q_Z}5SLYouX%?dt>JZIp=j7pM#VM4^Sd?-;nN5RwYF;`+PeK53iPxI)t`O=*`s z66b1sAufd9v@$TA*Wd>Bp1cO|P4LA#e2*kfGj{7LCY5809zWKv#&N14-Kt^8T-F5h zU{J=!#pxhp$r0oIKxa}8aM&`;%F)64OuSrJL*CXo*4nqaH0jlRLnrS+9$9kQ(=gW3 z*(fT^S7Zb-`?ky|qKGc5yj2|I6+P}$AnDKhW(n2pSXp>TF$rDa7Zm)s0+C`<6%fq9 z-td4XR#Tn3#Z3T4GKIQ!7Q}90TXnR|$hhdXsfX2Q*68vBT-MfcgWOkyynE@I3m$_Q z>hQV`xqc3Ldvj{Dkw{%eS75{@Ik%Df^BU57L2lbH0(wG8Q07u1NL#w08;#nn;|74)U1l%r%xIJX9 zQ-oUtk;Z2N+@e-+d_wLXGVgpFIVo(oYEY&{(3VcQ;8+Fz|AyU3NBM25{5Ld{_70_oP+3z9bC{zNR=ZH8Ek<=&hM&}d@j*z)B}|yrVeq{ zo+m8pJo#OCr4S)`3D29$}Ry<2|4}HX+Ht~)?JGJ-B&M{s?>cAJQ1N3w# z8P&oUQVfI7>I0`+z~j|gg_gnB^&A)J{zh9y@490Y{#$A=<`R2GioA@CwM6XWoxa%f z(zeXtb~+0E|F{ce_dTxSWB0JI%e3wNqNf#;4dOi;=*>3&TYBTS6$p6VE}mBGOA5>w z@jHtBkb+MUWJN&kRZPC9G}f34|6IY>6#RvPTM7iT@GljZiqcZ-wt|X+s)FxRU|P&y zDb}`(hAENUUsYOKu`UH`6nt1|-HLsJ*aIZK;j6Tt0%nmSi9&K;Yh8M^jjnBr!%k;c z#@Ow5_qWLvG$q0_DGlbN`WcW9nen46D?3rC2t+sG&G*uBJ8!GRyR0gl$V0;G!JP== z>!~xwE>E4|rzUp3olQY@q0~@e-FksB<>zG(5xpF6i=Q{k2sA*X?fdPdFz0n3ZID^W zCZU-|8b7BvWLBh&b47@oMq^2lk-^`J@!M|UyN!24<2gD8b^DrJSaoV}Frfpm_Sh5y z@i)>FbOud7A#x^@iop=)1OFI=CV#iimG(o85m1$8d`e`?4)eixl$dtkWhN3RT;t=Z zdrNZcjrz85OR|pOLD%HoMI4y&hzTZkXywdhzn!`KtpHD1Og%6V+`^#V&~1EO)o+(p z+gptVFfF`~Q>i5KlgT8)Buq$;{&yfC&~oP@ht*u$>k*#G!b$MD#fpW4ovE;}j@97t zqm~~npI(`9M6zk0Mr%Y;#cBwu8Qb~E*ao|K?%**~EVe6SW2W7tJZbz@?MafZJmcc- z#FvDAsw+~tI8#uU^HQbKt}3=s*+2mrC#D!;XExOrGZ?AA`HZ$|>kZ9AvQ>D9z4%qt zseCfjwwF)M{AiRlFQY**lU1j=I3mKdvXt>ZAW+=j?vw78il>`ay{kh$qd{9&%-!ea zO&PjmYGb*d=zDJ@Eq?31Ydk?1f^4U$%fU48N5=%w)sS4{n4&`|*?w3@GuMgh;<3<{ewnO4Qn->9c{2M#{ z*dYh7I7-pp>JR+%QCN_$S$GUFhFJh$OP>|^0V%uyh!R1qVp{ZQ^TD1JqEiD;Udz?Z zleJk>Z)_Ui=i7DzdogjHwdQyRQUPz;vyNxHB2~=ua?oLz7mlZ&g&F&4%$J0y%Hcj8QrNa_C!fVk^+Q%#0HZf9y{W7S@mCi)vHoa5mi zP|W)Xau2la1DRfHoMqJaeAEn+utYm(JdRm4kE?Ke23l(C-%jte%_@TPX~%$tF-P^sgM_Oq(z(+d7b!H+5UNdrbxRuX%%Qi=RA!(L(u zdUl-j_Zr`ms$%ZRQF($3pf%5FBkw<|FE*|{foJe#4d z@Hqvi2@DT%xnjM*kDB~~Qoloi;mNNlCIETXAO8rWx8F}G?{x)c?2i=7DbQH_+3rs% z_JayKX!I+3{E~uU&Gs$@GVa^fm){C_LXS@>kWOzv>P(Ww-gogLJVQ@D#@BA1?M`=N ztnW^3+CR8)aLr)P;KO}=gFSr@53KF$>)X)RJ$Q@o4~XyW>*iNiw)PG5Jzd~sGyTfa zW9Hv)W8&d{x}wJ-2pYpMMD7Vk2mx;;NJvIVx$TG>d|<@-Wh;aZxF=dZ(t|7t6h@{n zZI#=my~q$OJmDsh(2!y{y}}gxU959APT2uFEChD15Tc`8H%vTf%u7_HS|yrY*xQ2D z2PzE~<{h6&mBH+bsRc0tNks<3FWZ|45_H834rcMR$|#|i)fH^e>ut1{o*5lC*?7al z$rS5bM*uM(U>HUgMlj*dq?0MaIkVedr^8%+1Ek2M7`90psX)PRskPBoDU|84++Z zxv35Uj@z8OJ(gO0PG*yHH=dT!h6Ax!T$nXUW!$#Xg;$Nq^7JwDNuQrD*x#9a(|pqxpFWm5cGSv{bi`yA z%8(@KfTTF4(=HXeI)!r*Vw4bGSi^~^6B4|zx9ol8yb>XOFdyW(F{ zZ%Nt?zGg&urc_aLpW7oXM9>E$F* z??`k>IbtSuu7xb?j>+rKtB{%ZO?T(%L22bCk+q$3a=OUrv%n;}sXpNt+aK%;9)*|g zLVDT9lcW}Ya0X{nIp6AsXXM^GV3Lfq_|8|?dq|kyf-EFw(? zjWGhqJan5!lyvwBkKW+V71j0#22lIeh36a}k@Q5@?W1FUA4qaWXkwQHFq3G{UU}*2 z>1&tHTt1(>cKYJPy_dcGI_2!{L_;J~GrU-4s3Qaf=Q@|ebR??@?(LdxZ4TKrNEzq=QzZ1}c<8w&PNiD`jyUDp|gXv|JB2!`z> zgGH&z(J8wL-``KFbszpAfi0T~H&J48^}Bo1%6dVo{ZAA-rrpQ8}X@8b0mv$Zbgc^xY8CpjV&5RLGrHPIhi@alZHPU-6vXvNqKyykH1W$VpK z6U@S`3QT7=^521}#YIzRu1uT{uj#F; z3KkV0?z)g=;=*rI@Q8xX5Ez}~$3eIO%znSndwkf6m{5nWDG&~IaM)t+J0jccK8xDP z?~9%i364HYAU(|g7nQote;oF+P_SLWbEzQ?5_F@%>GvkRhNq_`_ for +more information. +""" + +import os +import re +import sys +import json +import shlex +import logging +import argparse +import subprocess + + +_UNIXCONFDIR = os.environ.get('UNIXCONFDIR', '/etc') +_OS_RELEASE_BASENAME = 'os-release' + +#: Translation table for normalizing the "ID" attribute defined in os-release +#: files, for use by the :func:`distro.id` method. +#: +#: * Key: Value as defined in the os-release file, translated to lower case, +#: with blanks translated to underscores. +#: +#: * Value: Normalized value. +NORMALIZED_OS_ID = { + 'ol': 'oracle', # Oracle Enterprise Linux +} + +#: Translation table for normalizing the "Distributor ID" attribute returned by +#: the lsb_release command, for use by the :func:`distro.id` method. +#: +#: * Key: Value as returned by the lsb_release command, translated to lower +#: case, with blanks translated to underscores. +#: +#: * Value: Normalized value. +NORMALIZED_LSB_ID = { + 'enterpriseenterprise': 'oracle', # Oracle Enterprise Linux + 'redhatenterpriseworkstation': 'rhel', # RHEL 6, 7 Workstation + 'redhatenterpriseserver': 'rhel', # RHEL 6, 7 Server +} + +#: Translation table for normalizing the distro ID derived from the file name +#: of distro release files, for use by the :func:`distro.id` method. +#: +#: * Key: Value as derived from the file name of a distro release file, +#: translated to lower case, with blanks translated to underscores. +#: +#: * Value: Normalized value. +NORMALIZED_DISTRO_ID = { + 'redhat': 'rhel', # RHEL 6.x, 7.x +} + +# Pattern for content of distro release file (reversed) +_DISTRO_RELEASE_CONTENT_REVERSED_PATTERN = re.compile( + r'(?:[^)]*\)(.*)\()? *(?:STL )?([\d.+\-a-z]*\d) *(?:esaeler *)?(.+)') + +# Pattern for base file name of distro release file +_DISTRO_RELEASE_BASENAME_PATTERN = re.compile( + r'(\w+)[-_](release|version)$') + +# Base file names to be ignored when searching for distro release file +_DISTRO_RELEASE_IGNORE_BASENAMES = ( + 'debian_version', + 'lsb-release', + 'oem-release', + _OS_RELEASE_BASENAME, + 'system-release' +) + + +def linux_distribution(full_distribution_name=True): + """ + Return information about the current OS distribution as a tuple + ``(id_name, version, codename)`` with items as follows: + + * ``id_name``: If *full_distribution_name* is false, the result of + :func:`distro.id`. Otherwise, the result of :func:`distro.name`. + + * ``version``: The result of :func:`distro.version`. + + * ``codename``: The result of :func:`distro.codename`. + + The interface of this function is compatible with the original + :py:func:`platform.linux_distribution` function, supporting a subset of + its parameters. + + The data it returns may not exactly be the same, because it uses more data + sources than the original function, and that may lead to different data if + the OS distribution is not consistent across multiple data sources it + provides (there are indeed such distributions ...). + + Another reason for differences is the fact that the :func:`distro.id` + method normalizes the distro ID string to a reliable machine-readable value + for a number of popular OS distributions. + """ + return _distro.linux_distribution(full_distribution_name) + + +def id(): + """ + Return the distro ID of the current distribution, as a + machine-readable string. + + For a number of OS distributions, the returned distro ID value is + *reliable*, in the sense that it is documented and that it does not change + across releases of the distribution. + + This package maintains the following reliable distro ID values: + + ============== ========================================= + Distro ID Distribution + ============== ========================================= + "ubuntu" Ubuntu + "debian" Debian + "rhel" RedHat Enterprise Linux + "centos" CentOS + "fedora" Fedora + "sles" SUSE Linux Enterprise Server + "opensuse" openSUSE + "amazon" Amazon Linux + "arch" Arch Linux + "cloudlinux" CloudLinux OS + "exherbo" Exherbo Linux + "gentoo" GenToo Linux + "ibm_powerkvm" IBM PowerKVM + "kvmibm" KVM for IBM z Systems + "linuxmint" Linux Mint + "mageia" Mageia + "mandriva" Mandriva Linux + "parallels" Parallels + "pidora" Pidora + "raspbian" Raspbian + "oracle" Oracle Linux (and Oracle Enterprise Linux) + "scientific" Scientific Linux + "slackware" Slackware + "xenserver" XenServer + "openbsd" OpenBSD + "netbsd" NetBSD + "freebsd" FreeBSD + ============== ========================================= + + If you have a need to get distros for reliable IDs added into this set, + or if you find that the :func:`distro.id` function returns a different + distro ID for one of the listed distros, please create an issue in the + `distro issue tracker`_. + + **Lookup hierarchy and transformations:** + + First, the ID is obtained from the following sources, in the specified + order. The first available and non-empty value is used: + + * the value of the "ID" attribute of the os-release file, + + * the value of the "Distributor ID" attribute returned by the lsb_release + command, + + * the first part of the file name of the distro release file, + + The so determined ID value then passes the following transformations, + before it is returned by this method: + + * it is translated to lower case, + + * blanks (which should not be there anyway) are translated to underscores, + + * a normalization of the ID is performed, based upon + `normalization tables`_. The purpose of this normalization is to ensure + that the ID is as reliable as possible, even across incompatible changes + in the OS distributions. A common reason for an incompatible change is + the addition of an os-release file, or the addition of the lsb_release + command, with ID values that differ from what was previously determined + from the distro release file name. + """ + return _distro.id() + + +def name(pretty=False): + """ + Return the name of the current OS distribution, as a human-readable + string. + + If *pretty* is false, the name is returned without version or codename. + (e.g. "CentOS Linux") + + If *pretty* is true, the version and codename are appended. + (e.g. "CentOS Linux 7.1.1503 (Core)") + + **Lookup hierarchy:** + + The name is obtained from the following sources, in the specified order. + The first available and non-empty value is used: + + * If *pretty* is false: + + - the value of the "NAME" attribute of the os-release file, + + - the value of the "Distributor ID" attribute returned by the lsb_release + command, + + - the value of the "" field of the distro release file. + + * If *pretty* is true: + + - the value of the "PRETTY_NAME" attribute of the os-release file, + + - the value of the "Description" attribute returned by the lsb_release + command, + + - the value of the "" field of the distro release file, appended + with the value of the pretty version ("" and "" + fields) of the distro release file, if available. + """ + return _distro.name(pretty) + + +def version(pretty=False, best=False): + """ + Return the version of the current OS distribution, as a human-readable + string. + + If *pretty* is false, the version is returned without codename (e.g. + "7.0"). + + If *pretty* is true, the codename in parenthesis is appended, if the + codename is non-empty (e.g. "7.0 (Maipo)"). + + Some distributions provide version numbers with different precisions in + the different sources of distribution information. Examining the different + sources in a fixed priority order does not always yield the most precise + version (e.g. for Debian 8.2, or CentOS 7.1). + + The *best* parameter can be used to control the approach for the returned + version: + + If *best* is false, the first non-empty version number in priority order of + the examined sources is returned. + + If *best* is true, the most precise version number out of all examined + sources is returned. + + **Lookup hierarchy:** + + In all cases, the version number is obtained from the following sources. + If *best* is false, this order represents the priority order: + + * the value of the "VERSION_ID" attribute of the os-release file, + * the value of the "Release" attribute returned by the lsb_release + command, + * the version number parsed from the "" field of the first line + of the distro release file, + * the version number parsed from the "PRETTY_NAME" attribute of the + os-release file, if it follows the format of the distro release files. + * the version number parsed from the "Description" attribute returned by + the lsb_release command, if it follows the format of the distro release + files. + """ + return _distro.version(pretty, best) + + +def version_parts(best=False): + """ + Return the version of the current OS distribution as a tuple + ``(major, minor, build_number)`` with items as follows: + + * ``major``: The result of :func:`distro.major_version`. + + * ``minor``: The result of :func:`distro.minor_version`. + + * ``build_number``: The result of :func:`distro.build_number`. + + For a description of the *best* parameter, see the :func:`distro.version` + method. + """ + return _distro.version_parts(best) + + +def major_version(best=False): + """ + Return the major version of the current OS distribution, as a string, + if provided. + Otherwise, the empty string is returned. The major version is the first + part of the dot-separated version string. + + For a description of the *best* parameter, see the :func:`distro.version` + method. + """ + return _distro.major_version(best) + + +def minor_version(best=False): + """ + Return the minor version of the current OS distribution, as a string, + if provided. + Otherwise, the empty string is returned. The minor version is the second + part of the dot-separated version string. + + For a description of the *best* parameter, see the :func:`distro.version` + method. + """ + return _distro.minor_version(best) + + +def build_number(best=False): + """ + Return the build number of the current OS distribution, as a string, + if provided. + Otherwise, the empty string is returned. The build number is the third part + of the dot-separated version string. + + For a description of the *best* parameter, see the :func:`distro.version` + method. + """ + return _distro.build_number(best) + + +def like(): + """ + Return a space-separated list of distro IDs of distributions that are + closely related to the current OS distribution in regards to packaging + and programming interfaces, for example distributions the current + distribution is a derivative from. + + **Lookup hierarchy:** + + This information item is only provided by the os-release file. + For details, see the description of the "ID_LIKE" attribute in the + `os-release man page + `_. + """ + return _distro.like() + + +def codename(): + """ + Return the codename for the release of the current OS distribution, + as a string. + + If the distribution does not have a codename, an empty string is returned. + + Note that the returned codename is not always really a codename. For + example, openSUSE returns "x86_64". This function does not handle such + cases in any special way and just returns the string it finds, if any. + + **Lookup hierarchy:** + + * the codename within the "VERSION" attribute of the os-release file, if + provided, + + * the value of the "Codename" attribute returned by the lsb_release + command, + + * the value of the "" field of the distro release file. + """ + return _distro.codename() + + +def info(pretty=False, best=False): + """ + Return certain machine-readable information items about the current OS + distribution in a dictionary, as shown in the following example: + + .. sourcecode:: python + + { + 'id': 'rhel', + 'version': '7.0', + 'version_parts': { + 'major': '7', + 'minor': '0', + 'build_number': '' + }, + 'like': 'fedora', + 'codename': 'Maipo' + } + + The dictionary structure and keys are always the same, regardless of which + information items are available in the underlying data sources. The values + for the various keys are as follows: + + * ``id``: The result of :func:`distro.id`. + + * ``version``: The result of :func:`distro.version`. + + * ``version_parts -> major``: The result of :func:`distro.major_version`. + + * ``version_parts -> minor``: The result of :func:`distro.minor_version`. + + * ``version_parts -> build_number``: The result of + :func:`distro.build_number`. + + * ``like``: The result of :func:`distro.like`. + + * ``codename``: The result of :func:`distro.codename`. + + For a description of the *pretty* and *best* parameters, see the + :func:`distro.version` method. + """ + return _distro.info(pretty, best) + + +def os_release_info(): + """ + Return a dictionary containing key-value pairs for the information items + from the os-release file data source of the current OS distribution. + + See `os-release file`_ for details about these information items. + """ + return _distro.os_release_info() + + +def lsb_release_info(): + """ + Return a dictionary containing key-value pairs for the information items + from the lsb_release command data source of the current OS distribution. + + See `lsb_release command output`_ for details about these information + items. + """ + return _distro.lsb_release_info() + + +def distro_release_info(): + """ + Return a dictionary containing key-value pairs for the information items + from the distro release file data source of the current OS distribution. + + See `distro release file`_ for details about these information items. + """ + return _distro.distro_release_info() + + +def uname_info(): + """ + Return a dictionary containing key-value pairs for the information items + from the distro release file data source of the current OS distribution. + """ + return _distro.uname_info() + + +def os_release_attr(attribute): + """ + Return a single named information item from the os-release file data source + of the current OS distribution. + + Parameters: + + * ``attribute`` (string): Key of the information item. + + Returns: + + * (string): Value of the information item, if the item exists. + The empty string, if the item does not exist. + + See `os-release file`_ for details about these information items. + """ + return _distro.os_release_attr(attribute) + + +def lsb_release_attr(attribute): + """ + Return a single named information item from the lsb_release command output + data source of the current OS distribution. + + Parameters: + + * ``attribute`` (string): Key of the information item. + + Returns: + + * (string): Value of the information item, if the item exists. + The empty string, if the item does not exist. + + See `lsb_release command output`_ for details about these information + items. + """ + return _distro.lsb_release_attr(attribute) + + +def distro_release_attr(attribute): + """ + Return a single named information item from the distro release file + data source of the current OS distribution. + + Parameters: + + * ``attribute`` (string): Key of the information item. + + Returns: + + * (string): Value of the information item, if the item exists. + The empty string, if the item does not exist. + + See `distro release file`_ for details about these information items. + """ + return _distro.distro_release_attr(attribute) + + +def uname_attr(attribute): + """ + Return a single named information item from the distro release file + data source of the current OS distribution. + + Parameters: + + * ``attribute`` (string): Key of the information item. + + Returns: + + * (string): Value of the information item, if the item exists. + The empty string, if the item does not exist. + """ + return _distro.uname_attr(attribute) + + +class cached_property(object): + """A version of @property which caches the value. On access, it calls the + underlying function and sets the value in `__dict__` so future accesses + will not re-call the property. + """ + def __init__(self, f): + self._fname = f.__name__ + self._f = f + + def __get__(self, obj, owner): + assert obj is not None, 'call {} on an instance'.format(self._fname) + ret = obj.__dict__[self._fname] = self._f(obj) + return ret + + +class LinuxDistribution(object): + """ + Provides information about a OS distribution. + + This package creates a private module-global instance of this class with + default initialization arguments, that is used by the + `consolidated accessor functions`_ and `single source accessor functions`_. + By using default initialization arguments, that module-global instance + returns data about the current OS distribution (i.e. the distro this + package runs on). + + Normally, it is not necessary to create additional instances of this class. + However, in situations where control is needed over the exact data sources + that are used, instances of this class can be created with a specific + distro release file, or a specific os-release file, or without invoking the + lsb_release command. + """ + + def __init__(self, + include_lsb=True, + os_release_file='', + distro_release_file='', + include_uname=True): + """ + The initialization method of this class gathers information from the + available data sources, and stores that in private instance attributes. + Subsequent access to the information items uses these private instance + attributes, so that the data sources are read only once. + + Parameters: + + * ``include_lsb`` (bool): Controls whether the + `lsb_release command output`_ is included as a data source. + + If the lsb_release command is not available in the program execution + path, the data source for the lsb_release command will be empty. + + * ``os_release_file`` (string): The path name of the + `os-release file`_ that is to be used as a data source. + + An empty string (the default) will cause the default path name to + be used (see `os-release file`_ for details). + + If the specified or defaulted os-release file does not exist, the + data source for the os-release file will be empty. + + * ``distro_release_file`` (string): The path name of the + `distro release file`_ that is to be used as a data source. + + An empty string (the default) will cause a default search algorithm + to be used (see `distro release file`_ for details). + + If the specified distro release file does not exist, or if no default + distro release file can be found, the data source for the distro + release file will be empty. + + * ``include_name`` (bool): Controls whether uname command output is + included as a data source. If the uname command is not available in + the program execution path the data source for the uname command will + be empty. + + Public instance attributes: + + * ``os_release_file`` (string): The path name of the + `os-release file`_ that is actually used as a data source. The + empty string if no distro release file is used as a data source. + + * ``distro_release_file`` (string): The path name of the + `distro release file`_ that is actually used as a data source. The + empty string if no distro release file is used as a data source. + + * ``include_lsb`` (bool): The result of the ``include_lsb`` parameter. + This controls whether the lsb information will be loaded. + + * ``include_uname`` (bool): The result of the ``include_uname`` + parameter. This controls whether the uname information will + be loaded. + + Raises: + + * :py:exc:`IOError`: Some I/O issue with an os-release file or distro + release file. + + * :py:exc:`subprocess.CalledProcessError`: The lsb_release command had + some issue (other than not being available in the program execution + path). + + * :py:exc:`UnicodeError`: A data source has unexpected characters or + uses an unexpected encoding. + """ + self.os_release_file = os_release_file or \ + os.path.join(_UNIXCONFDIR, _OS_RELEASE_BASENAME) + self.distro_release_file = distro_release_file or '' # updated later + self.include_lsb = include_lsb + self.include_uname = include_uname + + def __repr__(self): + """Return repr of all info + """ + return \ + "LinuxDistribution(" \ + "os_release_file={self.os_release_file!r}, " \ + "distro_release_file={self.distro_release_file!r}, " \ + "include_lsb={self.include_lsb!r}, " \ + "include_uname={self.include_uname!r}, " \ + "_os_release_info={self._os_release_info!r}, " \ + "_lsb_release_info={self._lsb_release_info!r}, " \ + "_distro_release_info={self._distro_release_info!r}, " \ + "_uname_info={self._uname_info!r})".format( + self=self) + + def linux_distribution(self, full_distribution_name=True): + """ + Return information about the OS distribution that is compatible + with Python's :func:`platform.linux_distribution`, supporting a subset + of its parameters. + + For details, see :func:`distro.linux_distribution`. + """ + return ( + self.name() if full_distribution_name else self.id(), + self.version(), + self.codename() + ) + + def id(self): + """Return the distro ID of the OS distribution, as a string. + + For details, see :func:`distro.id`. + """ + def normalize(distro_id, table): + distro_id = distro_id.lower().replace(' ', '_') + return table.get(distro_id, distro_id) + + distro_id = self.os_release_attr('id') + if distro_id: + return normalize(distro_id, NORMALIZED_OS_ID) + + distro_id = self.lsb_release_attr('distributor_id') + if distro_id: + return normalize(distro_id, NORMALIZED_LSB_ID) + + distro_id = self.distro_release_attr('id') + if distro_id: + return normalize(distro_id, NORMALIZED_DISTRO_ID) + + distro_id = self.uname_attr('id') + if distro_id: + return normalize(distro_id, NORMALIZED_DISTRO_ID) + + return '' + + def name(self, pretty=False): + """ + Return the name of the OS distribution, as a string. + + For details, see :func:`distro.name`. + """ + name = self.os_release_attr('name') \ + or self.lsb_release_attr('distributor_id') \ + or self.distro_release_attr('name') \ + or self.uname_attr('name') + if pretty: + name = self.os_release_attr('pretty_name') \ + or self.lsb_release_attr('description') + if not name: + name = self.distro_release_attr('name') \ + or self.uname_attr('name') + version = self.version(pretty=True) + if version: + name = name + ' ' + version + return name or '' + + def version(self, pretty=False, best=False): + """ + Return the version of the OS distribution, as a string. + + For details, see :func:`distro.version`. + """ + versions = [ + self.os_release_attr('version_id'), + self.lsb_release_attr('release'), + self.distro_release_attr('version_id'), + self._parse_distro_release_content( + self.os_release_attr('pretty_name')).get('version_id', ''), + self._parse_distro_release_content( + self.lsb_release_attr('description')).get('version_id', ''), + self.uname_attr('release') + ] + version = '' + if best: + # This algorithm uses the last version in priority order that has + # the best precision. If the versions are not in conflict, that + # does not matter; otherwise, using the last one instead of the + # first one might be considered a surprise. + for v in versions: + if v.count(".") > version.count(".") or version == '': + version = v + else: + for v in versions: + if v != '': + version = v + break + if pretty and version and self.codename(): + version = u'{0} ({1})'.format(version, self.codename()) + return version + + def version_parts(self, best=False): + """ + Return the version of the OS distribution, as a tuple of version + numbers. + + For details, see :func:`distro.version_parts`. + """ + version_str = self.version(best=best) + if version_str: + version_regex = re.compile(r'(\d+)\.?(\d+)?\.?(\d+)?') + matches = version_regex.match(version_str) + if matches: + major, minor, build_number = matches.groups() + return major, minor or '', build_number or '' + return '', '', '' + + def major_version(self, best=False): + """ + Return the major version number of the current distribution. + + For details, see :func:`distro.major_version`. + """ + return self.version_parts(best)[0] + + def minor_version(self, best=False): + """ + Return the minor version number of the current distribution. + + For details, see :func:`distro.minor_version`. + """ + return self.version_parts(best)[1] + + def build_number(self, best=False): + """ + Return the build number of the current distribution. + + For details, see :func:`distro.build_number`. + """ + return self.version_parts(best)[2] + + def like(self): + """ + Return the IDs of distributions that are like the OS distribution. + + For details, see :func:`distro.like`. + """ + return self.os_release_attr('id_like') or '' + + def codename(self): + """ + Return the codename of the OS distribution. + + For details, see :func:`distro.codename`. + """ + try: + # Handle os_release specially since distros might purposefully set + # this to empty string to have no codename + return self._os_release_info['codename'] + except KeyError: + return self.lsb_release_attr('codename') \ + or self.distro_release_attr('codename') \ + or '' + + def info(self, pretty=False, best=False): + """ + Return certain machine-readable information about the OS + distribution. + + For details, see :func:`distro.info`. + """ + return dict( + id=self.id(), + version=self.version(pretty, best), + version_parts=dict( + major=self.major_version(best), + minor=self.minor_version(best), + build_number=self.build_number(best) + ), + like=self.like(), + codename=self.codename(), + ) + + def os_release_info(self): + """ + Return a dictionary containing key-value pairs for the information + items from the os-release file data source of the OS distribution. + + For details, see :func:`distro.os_release_info`. + """ + return self._os_release_info + + def lsb_release_info(self): + """ + Return a dictionary containing key-value pairs for the information + items from the lsb_release command data source of the OS + distribution. + + For details, see :func:`distro.lsb_release_info`. + """ + return self._lsb_release_info + + def distro_release_info(self): + """ + Return a dictionary containing key-value pairs for the information + items from the distro release file data source of the OS + distribution. + + For details, see :func:`distro.distro_release_info`. + """ + return self._distro_release_info + + def uname_info(self): + """ + Return a dictionary containing key-value pairs for the information + items from the uname command data source of the OS distribution. + + For details, see :func:`distro.uname_info`. + """ + return self._uname_info + + def os_release_attr(self, attribute): + """ + Return a single named information item from the os-release file data + source of the OS distribution. + + For details, see :func:`distro.os_release_attr`. + """ + return self._os_release_info.get(attribute, '') + + def lsb_release_attr(self, attribute): + """ + Return a single named information item from the lsb_release command + output data source of the OS distribution. + + For details, see :func:`distro.lsb_release_attr`. + """ + return self._lsb_release_info.get(attribute, '') + + def distro_release_attr(self, attribute): + """ + Return a single named information item from the distro release file + data source of the OS distribution. + + For details, see :func:`distro.distro_release_attr`. + """ + return self._distro_release_info.get(attribute, '') + + def uname_attr(self, attribute): + """ + Return a single named information item from the uname command + output data source of the OS distribution. + + For details, see :func:`distro.uname_release_attr`. + """ + return self._uname_info.get(attribute, '') + + @cached_property + def _os_release_info(self): + """ + Get the information items from the specified os-release file. + + Returns: + A dictionary containing all information items. + """ + if os.path.isfile(self.os_release_file): + with open(self.os_release_file) as release_file: + return self._parse_os_release_content(release_file) + return {} + + @staticmethod + def _parse_os_release_content(lines): + """ + Parse the lines of an os-release file. + + Parameters: + + * lines: Iterable through the lines in the os-release file. + Each line must be a unicode string or a UTF-8 encoded byte + string. + + Returns: + A dictionary containing all information items. + """ + props = {} + lexer = shlex.shlex(lines, posix=True) + lexer.whitespace_split = True + + # The shlex module defines its `wordchars` variable using literals, + # making it dependent on the encoding of the Python source file. + # In Python 2.6 and 2.7, the shlex source file is encoded in + # 'iso-8859-1', and the `wordchars` variable is defined as a byte + # string. This causes a UnicodeDecodeError to be raised when the + # parsed content is a unicode object. The following fix resolves that + # (... but it should be fixed in shlex...): + if sys.version_info[0] == 2 and isinstance(lexer.wordchars, bytes): + lexer.wordchars = lexer.wordchars.decode('iso-8859-1') + + tokens = list(lexer) + for token in tokens: + # At this point, all shell-like parsing has been done (i.e. + # comments processed, quotes and backslash escape sequences + # processed, multi-line values assembled, trailing newlines + # stripped, etc.), so the tokens are now either: + # * variable assignments: var=value + # * commands or their arguments (not allowed in os-release) + if '=' in token: + k, v = token.split('=', 1) + if isinstance(v, bytes): + v = v.decode('utf-8') + props[k.lower()] = v + else: + # Ignore any tokens that are not variable assignments + pass + + if 'version_codename' in props: + # os-release added a version_codename field. Use that in + # preference to anything else Note that some distros purposefully + # do not have code names. They should be setting + # version_codename="" + props['codename'] = props['version_codename'] + elif 'ubuntu_codename' in props: + # Same as above but a non-standard field name used on older Ubuntus + props['codename'] = props['ubuntu_codename'] + elif 'version' in props: + # If there is no version_codename, parse it from the version + codename = re.search(r'(\(\D+\))|,(\s+)?\D+', props['version']) + if codename: + codename = codename.group() + codename = codename.strip('()') + codename = codename.strip(',') + codename = codename.strip() + # codename appears within paranthese. + props['codename'] = codename + + return props + + @cached_property + def _lsb_release_info(self): + """ + Get the information items from the lsb_release command output. + + Returns: + A dictionary containing all information items. + """ + if not self.include_lsb: + return {} + with open(os.devnull, 'w') as devnull: + try: + cmd = ('lsb_release', '-a') + stdout = subprocess.check_output(cmd, stderr=devnull) + except OSError: # Command not found + return {} + content = stdout.decode(sys.getfilesystemencoding()).splitlines() + return self._parse_lsb_release_content(content) + + @staticmethod + def _parse_lsb_release_content(lines): + """ + Parse the output of the lsb_release command. + + Parameters: + + * lines: Iterable through the lines of the lsb_release output. + Each line must be a unicode string or a UTF-8 encoded byte + string. + + Returns: + A dictionary containing all information items. + """ + props = {} + for line in lines: + kv = line.strip('\n').split(':', 1) + if len(kv) != 2: + # Ignore lines without colon. + continue + k, v = kv + props.update({k.replace(' ', '_').lower(): v.strip()}) + return props + + @cached_property + def _uname_info(self): + with open(os.devnull, 'w') as devnull: + try: + cmd = ('uname', '-rs') + stdout = subprocess.check_output(cmd, stderr=devnull) + except OSError: + return {} + content = stdout.decode(sys.getfilesystemencoding()).splitlines() + return self._parse_uname_content(content) + + @staticmethod + def _parse_uname_content(lines): + props = {} + match = re.search(r'^([^\s]+)\s+([\d\.]+)', lines[0].strip()) + if match: + name, version = match.groups() + + # This is to prevent the Linux kernel version from + # appearing as the 'best' version on otherwise + # identifiable distributions. + if name == 'Linux': + return {} + props['id'] = name.lower() + props['name'] = name + props['release'] = version + return props + + @cached_property + def _distro_release_info(self): + """ + Get the information items from the specified distro release file. + + Returns: + A dictionary containing all information items. + """ + if self.distro_release_file: + # If it was specified, we use it and parse what we can, even if + # its file name or content does not match the expected pattern. + distro_info = self._parse_distro_release_file( + self.distro_release_file) + basename = os.path.basename(self.distro_release_file) + # The file name pattern for user-specified distro release files + # is somewhat more tolerant (compared to when searching for the + # file), because we want to use what was specified as best as + # possible. + match = _DISTRO_RELEASE_BASENAME_PATTERN.match(basename) + if 'name' in distro_info \ + and 'cloudlinux' in distro_info['name'].lower(): + distro_info['id'] = 'cloudlinux' + elif match: + distro_info['id'] = match.group(1) + return distro_info + else: + try: + basenames = os.listdir(_UNIXCONFDIR) + # We sort for repeatability in cases where there are multiple + # distro specific files; e.g. CentOS, Oracle, Enterprise all + # containing `redhat-release` on top of their own. + basenames.sort() + except OSError: + # This may occur when /etc is not readable but we can't be + # sure about the *-release files. Check common entries of + # /etc for information. If they turn out to not be there the + # error is handled in `_parse_distro_release_file()`. + basenames = ['SuSE-release', + 'arch-release', + 'base-release', + 'centos-release', + 'fedora-release', + 'gentoo-release', + 'mageia-release', + 'mandrake-release', + 'mandriva-release', + 'mandrivalinux-release', + 'manjaro-release', + 'oracle-release', + 'redhat-release', + 'sl-release', + 'slackware-version'] + for basename in basenames: + if basename in _DISTRO_RELEASE_IGNORE_BASENAMES: + continue + match = _DISTRO_RELEASE_BASENAME_PATTERN.match(basename) + if match: + filepath = os.path.join(_UNIXCONFDIR, basename) + distro_info = self._parse_distro_release_file(filepath) + if 'name' in distro_info: + # The name is always present if the pattern matches + self.distro_release_file = filepath + distro_info['id'] = match.group(1) + if 'cloudlinux' in distro_info['name'].lower(): + distro_info['id'] = 'cloudlinux' + return distro_info + return {} + + def _parse_distro_release_file(self, filepath): + """ + Parse a distro release file. + + Parameters: + + * filepath: Path name of the distro release file. + + Returns: + A dictionary containing all information items. + """ + try: + with open(filepath) as fp: + # Only parse the first line. For instance, on SLES there + # are multiple lines. We don't want them... + return self._parse_distro_release_content(fp.readline()) + except (OSError, IOError): + # Ignore not being able to read a specific, seemingly version + # related file. + # See https://github.com/nir0s/distro/issues/162 + return {} + + @staticmethod + def _parse_distro_release_content(line): + """ + Parse a line from a distro release file. + + Parameters: + * line: Line from the distro release file. Must be a unicode string + or a UTF-8 encoded byte string. + + Returns: + A dictionary containing all information items. + """ + if isinstance(line, bytes): + line = line.decode('utf-8') + matches = _DISTRO_RELEASE_CONTENT_REVERSED_PATTERN.match( + line.strip()[::-1]) + distro_info = {} + if matches: + # regexp ensures non-None + distro_info['name'] = matches.group(3)[::-1] + if matches.group(2): + distro_info['version_id'] = matches.group(2)[::-1] + if matches.group(1): + distro_info['codename'] = matches.group(1)[::-1] + elif line: + distro_info['name'] = line.strip() + return distro_info + + +_distro = LinuxDistribution() + + +def main(): + logger = logging.getLogger(__name__) + logger.setLevel(logging.DEBUG) + logger.addHandler(logging.StreamHandler(sys.stdout)) + + parser = argparse.ArgumentParser(description="OS distro info tool") + parser.add_argument( + '--json', + '-j', + help="Output in machine readable format", + action="store_true") + args = parser.parse_args() + + if args.json: + logger.info(json.dumps(info(), indent=4, sort_keys=True)) + else: + logger.info('Name: %s', name(pretty=True)) + distribution_version = version(pretty=True) + logger.info('Version: %s', distribution_version) + distribution_codename = codename() + logger.info('Codename: %s', distribution_codename) + + +if __name__ == '__main__': + main() diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distro.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/distro.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d25084ee14df9b697908d4c9a32da877a9329259 GIT binary patch literal 42875 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 literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/__init__ 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/__init__ 2.py new file mode 100644 index 0000000..0491234 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/__init__ 2.py @@ -0,0 +1,35 @@ +""" +HTML parsing library based on the `WHATWG HTML specification +`_. The parser is designed to be compatible with +existing HTML found in the wild and implements well-defined error recovery that +is largely compatible with modern desktop web browsers. + +Example usage:: + + from pip._vendor import html5lib + with open("my_document.html", "rb") as f: + tree = html5lib.parse(f) + +For convenience, this module re-exports the following names: + +* :func:`~.html5parser.parse` +* :func:`~.html5parser.parseFragment` +* :class:`~.html5parser.HTMLParser` +* :func:`~.treebuilders.getTreeBuilder` +* :func:`~.treewalkers.getTreeWalker` +* :func:`~.serializer.serialize` +""" + +from __future__ import absolute_import, division, unicode_literals + +from .html5parser import HTMLParser, parse, parseFragment +from .treebuilders import getTreeBuilder +from .treewalkers import getTreeWalker +from .serializer import serialize + +__all__ = ["HTMLParser", "parse", "parseFragment", "getTreeBuilder", + "getTreeWalker", "serialize"] + +# this has to be at the top level, see how setup.py parses this +#: Distribution version number. +__version__ = "1.0.1" diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/__init__ 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/__init__ 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ee69ae6bfddcdd1f5419f9c9b3fed83539ee70bd GIT binary patch literal 1495 zcmaJ>&5qkP5FY=mcUSBE>7lnAh&?$)R@y}x6flyYDVj8gwg_Ao3+Paq5-FJpC8{K4 zuXE@#^g;R%z4m$f0v%G06K8>Hv186?INvva8vJ`2{qy&;-*VVKBmDh#(Fgk{9ymaX zvIo2mss~jc(mqrJNC!|2Ass@G4}cFr9Y8gLbOhBQq=!%)L3-4^I{mrSclsfyQ>e}$JwyEn_%ZMZ_zCba@KY!;=s9qFeF6L&ewkb#srIivK=gY4(~qQK z#>%=RN@j+c4at}loamakr67yj*DvO`Kak*Q8m_sRGS;R{ zmabCI7c?ewyz2uCL!>2KSXtH>)oGFmlIyC$7?~1eE!{E_chWjfA)pkxtvQh${#q(d znAfXDiAvPYlC@Ckii<+}h{70ch!MG72_)~3ON5AunNq0D=TM~5T$tJudgpY5p)!&g zy+)okj-r=$%)^k@vQkW^QAF@5jIKx{o0zUd%@GW#Xyb^_^$8X&IQcw?ZbUt~tTvSE zy!BjT?{oQxT$=3iAz_vj)8OsHIwJ&mwu=&nYE6oVQS=Hia$O^u6m>2hVN#e8GH;QZ z5m(~QC|K!4J8p$otG-?y&}D?RJrl`CfL=Rtgb z-h{61Me?a+Eq2ORu@r8O`gfgv&u`7tyHDJ1gSzL1y^u`F_rk=x<06uNwI%};?i>Zn ztX8cPv}=YtLK~MWX>l@L81P!=*lVh!6NV`(d%OD)o<3&c4p0q6a;G0oA1X2Nm)seO z{j55>ci-B(G&=J!ns>z8eXw>1*4_ha@8blgJ&1Ncx({~~U&l8;PrksTJ48YK_)+RS zGNnc9S|cc(p$0Rb&kQ#o+zE;>!QFh!d}U`tFMLcl_TrPa&ip4WT=Ld!6K5VS;Oz1> zGvA3V52h6I@JJMQ2fs49rgVZTd=$1pHEE1oF(;B0GYO8gAEcyg68`(!^8MGv&2@J3 zc(Yl#x6Zk59^@rPjD@-WNjTHUA_4JrG4|OH--Q0wuVoVU(`Ikt*`jHv+AM_veF8p7A+#3)71Nk$q%>V!Z literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/__init__.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/__init__.py new file mode 100644 index 0000000..0491234 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/__init__.py @@ -0,0 +1,35 @@ +""" +HTML parsing library based on the `WHATWG HTML specification +`_. The parser is designed to be compatible with +existing HTML found in the wild and implements well-defined error recovery that +is largely compatible with modern desktop web browsers. + +Example usage:: + + from pip._vendor import html5lib + with open("my_document.html", "rb") as f: + tree = html5lib.parse(f) + +For convenience, this module re-exports the following names: + +* :func:`~.html5parser.parse` +* :func:`~.html5parser.parseFragment` +* :class:`~.html5parser.HTMLParser` +* :func:`~.treebuilders.getTreeBuilder` +* :func:`~.treewalkers.getTreeWalker` +* :func:`~.serializer.serialize` +""" + +from __future__ import absolute_import, division, unicode_literals + +from .html5parser import HTMLParser, parse, parseFragment +from .treebuilders import getTreeBuilder +from .treewalkers import getTreeWalker +from .serializer import serialize + +__all__ = ["HTMLParser", "parse", "parseFragment", "getTreeBuilder", + "getTreeWalker", "serialize"] + +# this has to be at the top level, see how setup.py parses this +#: Distribution version number. +__version__ = "1.0.1" diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/__init__.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..84ffa0e8c9c14d7155cc9de15bae8cef72a63b81 GIT binary patch literal 1495 zcmaJ>&5qkP5FY=mcUSBE=^?iqh&?$)R@!Zv1~8JKEzmTFHYi*J3+Paq5-FJpB`PFk zuXE@#^g;R(eWt!Zhm_;QS)f|%m@^vA_syRM|DHyhe_s5N!}b~B@Ar#7*uU_=0aBDb z;C)a%sQQrhp&CFsfNBWo5PEz7dPNtjfk(hkfRBNnLWx1of#d57;OFrBcZOUZn zD)n+fV=~9PKCm!ETEc~uWsOmtCYd0)t{RMyDM8lKEhBL!t@9KDN}=1D6WQUfrQ(En zy=s)GMC~kD3#G2OD5Q@ljM0V|k?WN}@(#H~h^Uw;h1z@xMJmmOsXd{0PB$1TBbm`_ z|p2tI|;6=`G>)0L<>f*}=c9Pzn6#i9i#p9j&6s3(`zhH{;^ zo@?xVE+3OilU+U{%#vanynR?_gdi_=QQ}aoN%1I(ULi)VYebWx&c$O)3Nu3HEmAY$ zO5AyT8~RgdrS#g@u4a|6Ncn3rE!sMtF8&PYPrEL3;TQk=_LX6!XC1t9#jO1@i0{vD zp{sk5d@5Oso$^&Ig`1=PW2fKqTQl|UGq>BI?s;J^BvbN(F!AoVh@@Yw$pD2rN5L|y zRqF)pn&FPn#^p*{oJBrN@N=*DEcZOm= ztIqD-xArcL&U}pK9r1P_tlfdN_rTiwIKgQTqTP?~!`;N!@y(mbS9o-XD5xJlN}Wfh zv}j#x1f?_7VCM6g;pT%oK@ldnn~#~V>}=?TkLkuP|D=UW-nwn#%)k#Scn`hs>NoU>^{= item[0] + rv = [] + i = 0 + while i < len(charList): + j = 1 + rv.append(charList[i]) + while i + j < len(charList) and charList[i + j][0] <= rv[-1][1] + 1: + rv[-1][1] = charList[i + j][1] + j += 1 + i += j + return rv + +# We don't really support characters above the BMP :( +max_unicode = int("FFFF", 16) + + +def missingRanges(charList): + rv = [] + if charList[0] != 0: + rv.append([0, charList[0][0] - 1]) + for i, item in enumerate(charList[:-1]): + rv.append([item[1] + 1, charList[i + 1][0] - 1]) + if charList[-1][1] != max_unicode: + rv.append([charList[-1][1] + 1, max_unicode]) + return rv + + +def listToRegexpStr(charList): + rv = [] + for item in charList: + if item[0] == item[1]: + rv.append(escapeRegexp(chr(item[0]))) + else: + rv.append(escapeRegexp(chr(item[0])) + "-" + + escapeRegexp(chr(item[1]))) + return "[%s]" % "".join(rv) + + +def hexToInt(hex_str): + return int(hex_str, 16) + + +def escapeRegexp(string): + specialCharacters = (".", "^", "$", "*", "+", "?", "{", "}", + "[", "]", "|", "(", ")", "-") + for char in specialCharacters: + string = string.replace(char, "\\" + char) + + return string + +# output from the above +nonXmlNameBMPRegexp = re.compile('[\x00-,/:-@\\[-\\^`\\{-\xb6\xb8-\xbf\xd7\xf7\u0132-\u0133\u013f-\u0140\u0149\u017f\u01c4-\u01cc\u01f1-\u01f3\u01f6-\u01f9\u0218-\u024f\u02a9-\u02ba\u02c2-\u02cf\u02d2-\u02ff\u0346-\u035f\u0362-\u0385\u038b\u038d\u03a2\u03cf\u03d7-\u03d9\u03db\u03dd\u03df\u03e1\u03f4-\u0400\u040d\u0450\u045d\u0482\u0487-\u048f\u04c5-\u04c6\u04c9-\u04ca\u04cd-\u04cf\u04ec-\u04ed\u04f6-\u04f7\u04fa-\u0530\u0557-\u0558\u055a-\u0560\u0587-\u0590\u05a2\u05ba\u05be\u05c0\u05c3\u05c5-\u05cf\u05eb-\u05ef\u05f3-\u0620\u063b-\u063f\u0653-\u065f\u066a-\u066f\u06b8-\u06b9\u06bf\u06cf\u06d4\u06e9\u06ee-\u06ef\u06fa-\u0900\u0904\u093a-\u093b\u094e-\u0950\u0955-\u0957\u0964-\u0965\u0970-\u0980\u0984\u098d-\u098e\u0991-\u0992\u09a9\u09b1\u09b3-\u09b5\u09ba-\u09bb\u09bd\u09c5-\u09c6\u09c9-\u09ca\u09ce-\u09d6\u09d8-\u09db\u09de\u09e4-\u09e5\u09f2-\u0a01\u0a03-\u0a04\u0a0b-\u0a0e\u0a11-\u0a12\u0a29\u0a31\u0a34\u0a37\u0a3a-\u0a3b\u0a3d\u0a43-\u0a46\u0a49-\u0a4a\u0a4e-\u0a58\u0a5d\u0a5f-\u0a65\u0a75-\u0a80\u0a84\u0a8c\u0a8e\u0a92\u0aa9\u0ab1\u0ab4\u0aba-\u0abb\u0ac6\u0aca\u0ace-\u0adf\u0ae1-\u0ae5\u0af0-\u0b00\u0b04\u0b0d-\u0b0e\u0b11-\u0b12\u0b29\u0b31\u0b34-\u0b35\u0b3a-\u0b3b\u0b44-\u0b46\u0b49-\u0b4a\u0b4e-\u0b55\u0b58-\u0b5b\u0b5e\u0b62-\u0b65\u0b70-\u0b81\u0b84\u0b8b-\u0b8d\u0b91\u0b96-\u0b98\u0b9b\u0b9d\u0ba0-\u0ba2\u0ba5-\u0ba7\u0bab-\u0bad\u0bb6\u0bba-\u0bbd\u0bc3-\u0bc5\u0bc9\u0bce-\u0bd6\u0bd8-\u0be6\u0bf0-\u0c00\u0c04\u0c0d\u0c11\u0c29\u0c34\u0c3a-\u0c3d\u0c45\u0c49\u0c4e-\u0c54\u0c57-\u0c5f\u0c62-\u0c65\u0c70-\u0c81\u0c84\u0c8d\u0c91\u0ca9\u0cb4\u0cba-\u0cbd\u0cc5\u0cc9\u0cce-\u0cd4\u0cd7-\u0cdd\u0cdf\u0ce2-\u0ce5\u0cf0-\u0d01\u0d04\u0d0d\u0d11\u0d29\u0d3a-\u0d3d\u0d44-\u0d45\u0d49\u0d4e-\u0d56\u0d58-\u0d5f\u0d62-\u0d65\u0d70-\u0e00\u0e2f\u0e3b-\u0e3f\u0e4f\u0e5a-\u0e80\u0e83\u0e85-\u0e86\u0e89\u0e8b-\u0e8c\u0e8e-\u0e93\u0e98\u0ea0\u0ea4\u0ea6\u0ea8-\u0ea9\u0eac\u0eaf\u0eba\u0ebe-\u0ebf\u0ec5\u0ec7\u0ece-\u0ecf\u0eda-\u0f17\u0f1a-\u0f1f\u0f2a-\u0f34\u0f36\u0f38\u0f3a-\u0f3d\u0f48\u0f6a-\u0f70\u0f85\u0f8c-\u0f8f\u0f96\u0f98\u0fae-\u0fb0\u0fb8\u0fba-\u109f\u10c6-\u10cf\u10f7-\u10ff\u1101\u1104\u1108\u110a\u110d\u1113-\u113b\u113d\u113f\u1141-\u114b\u114d\u114f\u1151-\u1153\u1156-\u1158\u115a-\u115e\u1162\u1164\u1166\u1168\u116a-\u116c\u116f-\u1171\u1174\u1176-\u119d\u119f-\u11a7\u11a9-\u11aa\u11ac-\u11ad\u11b0-\u11b6\u11b9\u11bb\u11c3-\u11ea\u11ec-\u11ef\u11f1-\u11f8\u11fa-\u1dff\u1e9c-\u1e9f\u1efa-\u1eff\u1f16-\u1f17\u1f1e-\u1f1f\u1f46-\u1f47\u1f4e-\u1f4f\u1f58\u1f5a\u1f5c\u1f5e\u1f7e-\u1f7f\u1fb5\u1fbd\u1fbf-\u1fc1\u1fc5\u1fcd-\u1fcf\u1fd4-\u1fd5\u1fdc-\u1fdf\u1fed-\u1ff1\u1ff5\u1ffd-\u20cf\u20dd-\u20e0\u20e2-\u2125\u2127-\u2129\u212c-\u212d\u212f-\u217f\u2183-\u3004\u3006\u3008-\u3020\u3030\u3036-\u3040\u3095-\u3098\u309b-\u309c\u309f-\u30a0\u30fb\u30ff-\u3104\u312d-\u4dff\u9fa6-\uabff\ud7a4-\uffff]') # noqa + +nonXmlNameFirstBMPRegexp = re.compile('[\x00-@\\[-\\^`\\{-\xbf\xd7\xf7\u0132-\u0133\u013f-\u0140\u0149\u017f\u01c4-\u01cc\u01f1-\u01f3\u01f6-\u01f9\u0218-\u024f\u02a9-\u02ba\u02c2-\u0385\u0387\u038b\u038d\u03a2\u03cf\u03d7-\u03d9\u03db\u03dd\u03df\u03e1\u03f4-\u0400\u040d\u0450\u045d\u0482-\u048f\u04c5-\u04c6\u04c9-\u04ca\u04cd-\u04cf\u04ec-\u04ed\u04f6-\u04f7\u04fa-\u0530\u0557-\u0558\u055a-\u0560\u0587-\u05cf\u05eb-\u05ef\u05f3-\u0620\u063b-\u0640\u064b-\u0670\u06b8-\u06b9\u06bf\u06cf\u06d4\u06d6-\u06e4\u06e7-\u0904\u093a-\u093c\u093e-\u0957\u0962-\u0984\u098d-\u098e\u0991-\u0992\u09a9\u09b1\u09b3-\u09b5\u09ba-\u09db\u09de\u09e2-\u09ef\u09f2-\u0a04\u0a0b-\u0a0e\u0a11-\u0a12\u0a29\u0a31\u0a34\u0a37\u0a3a-\u0a58\u0a5d\u0a5f-\u0a71\u0a75-\u0a84\u0a8c\u0a8e\u0a92\u0aa9\u0ab1\u0ab4\u0aba-\u0abc\u0abe-\u0adf\u0ae1-\u0b04\u0b0d-\u0b0e\u0b11-\u0b12\u0b29\u0b31\u0b34-\u0b35\u0b3a-\u0b3c\u0b3e-\u0b5b\u0b5e\u0b62-\u0b84\u0b8b-\u0b8d\u0b91\u0b96-\u0b98\u0b9b\u0b9d\u0ba0-\u0ba2\u0ba5-\u0ba7\u0bab-\u0bad\u0bb6\u0bba-\u0c04\u0c0d\u0c11\u0c29\u0c34\u0c3a-\u0c5f\u0c62-\u0c84\u0c8d\u0c91\u0ca9\u0cb4\u0cba-\u0cdd\u0cdf\u0ce2-\u0d04\u0d0d\u0d11\u0d29\u0d3a-\u0d5f\u0d62-\u0e00\u0e2f\u0e31\u0e34-\u0e3f\u0e46-\u0e80\u0e83\u0e85-\u0e86\u0e89\u0e8b-\u0e8c\u0e8e-\u0e93\u0e98\u0ea0\u0ea4\u0ea6\u0ea8-\u0ea9\u0eac\u0eaf\u0eb1\u0eb4-\u0ebc\u0ebe-\u0ebf\u0ec5-\u0f3f\u0f48\u0f6a-\u109f\u10c6-\u10cf\u10f7-\u10ff\u1101\u1104\u1108\u110a\u110d\u1113-\u113b\u113d\u113f\u1141-\u114b\u114d\u114f\u1151-\u1153\u1156-\u1158\u115a-\u115e\u1162\u1164\u1166\u1168\u116a-\u116c\u116f-\u1171\u1174\u1176-\u119d\u119f-\u11a7\u11a9-\u11aa\u11ac-\u11ad\u11b0-\u11b6\u11b9\u11bb\u11c3-\u11ea\u11ec-\u11ef\u11f1-\u11f8\u11fa-\u1dff\u1e9c-\u1e9f\u1efa-\u1eff\u1f16-\u1f17\u1f1e-\u1f1f\u1f46-\u1f47\u1f4e-\u1f4f\u1f58\u1f5a\u1f5c\u1f5e\u1f7e-\u1f7f\u1fb5\u1fbd\u1fbf-\u1fc1\u1fc5\u1fcd-\u1fcf\u1fd4-\u1fd5\u1fdc-\u1fdf\u1fed-\u1ff1\u1ff5\u1ffd-\u2125\u2127-\u2129\u212c-\u212d\u212f-\u217f\u2183-\u3006\u3008-\u3020\u302a-\u3040\u3095-\u30a0\u30fb-\u3104\u312d-\u4dff\u9fa6-\uabff\ud7a4-\uffff]') # noqa + +# Simpler things +nonPubidCharRegexp = re.compile("[^\x20\x0D\x0Aa-zA-Z0-9\\-'()+,./:=?;!*#@$_%]") + + +class InfosetFilter(object): + replacementRegexp = re.compile(r"U[\dA-F]{5,5}") + + def __init__(self, + dropXmlnsLocalName=False, + dropXmlnsAttrNs=False, + preventDoubleDashComments=False, + preventDashAtCommentEnd=False, + replaceFormFeedCharacters=True, + preventSingleQuotePubid=False): + + self.dropXmlnsLocalName = dropXmlnsLocalName + self.dropXmlnsAttrNs = dropXmlnsAttrNs + + self.preventDoubleDashComments = preventDoubleDashComments + self.preventDashAtCommentEnd = preventDashAtCommentEnd + + self.replaceFormFeedCharacters = replaceFormFeedCharacters + + self.preventSingleQuotePubid = preventSingleQuotePubid + + self.replaceCache = {} + + def coerceAttribute(self, name, namespace=None): + if self.dropXmlnsLocalName and name.startswith("xmlns:"): + warnings.warn("Attributes cannot begin with xmlns", DataLossWarning) + return None + elif (self.dropXmlnsAttrNs and + namespace == "http://www.w3.org/2000/xmlns/"): + warnings.warn("Attributes cannot be in the xml namespace", DataLossWarning) + return None + else: + return self.toXmlName(name) + + def coerceElement(self, name): + return self.toXmlName(name) + + def coerceComment(self, data): + if self.preventDoubleDashComments: + while "--" in data: + warnings.warn("Comments cannot contain adjacent dashes", DataLossWarning) + data = data.replace("--", "- -") + if data.endswith("-"): + warnings.warn("Comments cannot end in a dash", DataLossWarning) + data += " " + return data + + def coerceCharacters(self, data): + if self.replaceFormFeedCharacters: + for _ in range(data.count("\x0C")): + warnings.warn("Text cannot contain U+000C", DataLossWarning) + data = data.replace("\x0C", " ") + # Other non-xml characters + return data + + def coercePubid(self, data): + dataOutput = data + for char in nonPubidCharRegexp.findall(data): + warnings.warn("Coercing non-XML pubid", DataLossWarning) + replacement = self.getReplacementCharacter(char) + dataOutput = dataOutput.replace(char, replacement) + if self.preventSingleQuotePubid and dataOutput.find("'") >= 0: + warnings.warn("Pubid cannot contain single quote", DataLossWarning) + dataOutput = dataOutput.replace("'", self.getReplacementCharacter("'")) + return dataOutput + + def toXmlName(self, name): + nameFirst = name[0] + nameRest = name[1:] + m = nonXmlNameFirstBMPRegexp.match(nameFirst) + if m: + warnings.warn("Coercing non-XML name", DataLossWarning) + nameFirstOutput = self.getReplacementCharacter(nameFirst) + else: + nameFirstOutput = nameFirst + + nameRestOutput = nameRest + replaceChars = set(nonXmlNameBMPRegexp.findall(nameRest)) + for char in replaceChars: + warnings.warn("Coercing non-XML name", DataLossWarning) + replacement = self.getReplacementCharacter(char) + nameRestOutput = nameRestOutput.replace(char, replacement) + return nameFirstOutput + nameRestOutput + + def getReplacementCharacter(self, char): + if char in self.replaceCache: + replacement = self.replaceCache[char] + else: + replacement = self.escapeChar(char) + return replacement + + def fromXmlName(self, name): + for item in set(self.replacementRegexp.findall(name)): + name = name.replace(item, self.unescapeChar(item)) + return name + + def escapeChar(self, char): + replacement = "U%05X" % ord(char) + self.replaceCache[char] = replacement + return replacement + + def unescapeChar(self, charcode): + return chr(int(charcode[1:], 16)) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/_ihatexml 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/_ihatexml 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..64d1545c3fac140dab1aa2fa148614fd146222fb GIT binary patch literal 16440 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 literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/_ihatexml.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/_ihatexml.py new file mode 100644 index 0000000..4c77717 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/_ihatexml.py @@ -0,0 +1,288 @@ +from __future__ import absolute_import, division, unicode_literals + +import re +import warnings + +from .constants import DataLossWarning + +baseChar = """ +[#x0041-#x005A] | [#x0061-#x007A] | [#x00C0-#x00D6] | [#x00D8-#x00F6] | +[#x00F8-#x00FF] | [#x0100-#x0131] | [#x0134-#x013E] | [#x0141-#x0148] | +[#x014A-#x017E] | [#x0180-#x01C3] | [#x01CD-#x01F0] | [#x01F4-#x01F5] | +[#x01FA-#x0217] | [#x0250-#x02A8] | [#x02BB-#x02C1] | #x0386 | +[#x0388-#x038A] | #x038C | [#x038E-#x03A1] | [#x03A3-#x03CE] | +[#x03D0-#x03D6] | #x03DA | #x03DC | #x03DE | #x03E0 | [#x03E2-#x03F3] | +[#x0401-#x040C] | [#x040E-#x044F] | [#x0451-#x045C] | [#x045E-#x0481] | +[#x0490-#x04C4] | [#x04C7-#x04C8] | [#x04CB-#x04CC] | [#x04D0-#x04EB] | +[#x04EE-#x04F5] | [#x04F8-#x04F9] | [#x0531-#x0556] | #x0559 | +[#x0561-#x0586] | [#x05D0-#x05EA] | [#x05F0-#x05F2] | [#x0621-#x063A] | +[#x0641-#x064A] | [#x0671-#x06B7] | [#x06BA-#x06BE] | [#x06C0-#x06CE] | +[#x06D0-#x06D3] | #x06D5 | [#x06E5-#x06E6] | [#x0905-#x0939] | #x093D | +[#x0958-#x0961] | [#x0985-#x098C] | [#x098F-#x0990] | [#x0993-#x09A8] | +[#x09AA-#x09B0] | #x09B2 | [#x09B6-#x09B9] | [#x09DC-#x09DD] | +[#x09DF-#x09E1] | [#x09F0-#x09F1] | [#x0A05-#x0A0A] | [#x0A0F-#x0A10] | +[#x0A13-#x0A28] | [#x0A2A-#x0A30] | [#x0A32-#x0A33] | [#x0A35-#x0A36] | +[#x0A38-#x0A39] | [#x0A59-#x0A5C] | #x0A5E | [#x0A72-#x0A74] | +[#x0A85-#x0A8B] | #x0A8D | [#x0A8F-#x0A91] | [#x0A93-#x0AA8] | +[#x0AAA-#x0AB0] | [#x0AB2-#x0AB3] | [#x0AB5-#x0AB9] | #x0ABD | #x0AE0 | +[#x0B05-#x0B0C] | [#x0B0F-#x0B10] | [#x0B13-#x0B28] | [#x0B2A-#x0B30] | +[#x0B32-#x0B33] | [#x0B36-#x0B39] | #x0B3D | [#x0B5C-#x0B5D] | +[#x0B5F-#x0B61] | [#x0B85-#x0B8A] | [#x0B8E-#x0B90] | [#x0B92-#x0B95] | +[#x0B99-#x0B9A] | #x0B9C | [#x0B9E-#x0B9F] | [#x0BA3-#x0BA4] | +[#x0BA8-#x0BAA] | [#x0BAE-#x0BB5] | [#x0BB7-#x0BB9] | [#x0C05-#x0C0C] | +[#x0C0E-#x0C10] | [#x0C12-#x0C28] | [#x0C2A-#x0C33] | [#x0C35-#x0C39] | +[#x0C60-#x0C61] | [#x0C85-#x0C8C] | [#x0C8E-#x0C90] | [#x0C92-#x0CA8] | +[#x0CAA-#x0CB3] | [#x0CB5-#x0CB9] | #x0CDE | [#x0CE0-#x0CE1] | +[#x0D05-#x0D0C] | [#x0D0E-#x0D10] | [#x0D12-#x0D28] | [#x0D2A-#x0D39] | +[#x0D60-#x0D61] | [#x0E01-#x0E2E] | #x0E30 | [#x0E32-#x0E33] | +[#x0E40-#x0E45] | [#x0E81-#x0E82] | #x0E84 | [#x0E87-#x0E88] | #x0E8A | +#x0E8D | [#x0E94-#x0E97] | [#x0E99-#x0E9F] | [#x0EA1-#x0EA3] | #x0EA5 | +#x0EA7 | [#x0EAA-#x0EAB] | [#x0EAD-#x0EAE] | #x0EB0 | [#x0EB2-#x0EB3] | +#x0EBD | [#x0EC0-#x0EC4] | [#x0F40-#x0F47] | [#x0F49-#x0F69] | +[#x10A0-#x10C5] | [#x10D0-#x10F6] | #x1100 | [#x1102-#x1103] | +[#x1105-#x1107] | #x1109 | [#x110B-#x110C] | [#x110E-#x1112] | #x113C | +#x113E | #x1140 | #x114C | #x114E | #x1150 | [#x1154-#x1155] | #x1159 | +[#x115F-#x1161] | #x1163 | #x1165 | #x1167 | #x1169 | [#x116D-#x116E] | +[#x1172-#x1173] | #x1175 | #x119E | #x11A8 | #x11AB | [#x11AE-#x11AF] | +[#x11B7-#x11B8] | #x11BA | [#x11BC-#x11C2] | #x11EB | #x11F0 | #x11F9 | +[#x1E00-#x1E9B] | [#x1EA0-#x1EF9] | [#x1F00-#x1F15] | [#x1F18-#x1F1D] | +[#x1F20-#x1F45] | [#x1F48-#x1F4D] | [#x1F50-#x1F57] | #x1F59 | #x1F5B | +#x1F5D | [#x1F5F-#x1F7D] | [#x1F80-#x1FB4] | [#x1FB6-#x1FBC] | #x1FBE | +[#x1FC2-#x1FC4] | [#x1FC6-#x1FCC] | [#x1FD0-#x1FD3] | [#x1FD6-#x1FDB] | +[#x1FE0-#x1FEC] | [#x1FF2-#x1FF4] | [#x1FF6-#x1FFC] | #x2126 | +[#x212A-#x212B] | #x212E | [#x2180-#x2182] | [#x3041-#x3094] | +[#x30A1-#x30FA] | [#x3105-#x312C] | [#xAC00-#xD7A3]""" + +ideographic = """[#x4E00-#x9FA5] | #x3007 | [#x3021-#x3029]""" + +combiningCharacter = """ +[#x0300-#x0345] | [#x0360-#x0361] | [#x0483-#x0486] | [#x0591-#x05A1] | +[#x05A3-#x05B9] | [#x05BB-#x05BD] | #x05BF | [#x05C1-#x05C2] | #x05C4 | +[#x064B-#x0652] | #x0670 | [#x06D6-#x06DC] | [#x06DD-#x06DF] | +[#x06E0-#x06E4] | [#x06E7-#x06E8] | [#x06EA-#x06ED] | [#x0901-#x0903] | +#x093C | [#x093E-#x094C] | #x094D | [#x0951-#x0954] | [#x0962-#x0963] | +[#x0981-#x0983] | #x09BC | #x09BE | #x09BF | [#x09C0-#x09C4] | +[#x09C7-#x09C8] | [#x09CB-#x09CD] | #x09D7 | [#x09E2-#x09E3] | #x0A02 | +#x0A3C | #x0A3E | #x0A3F | [#x0A40-#x0A42] | [#x0A47-#x0A48] | +[#x0A4B-#x0A4D] | [#x0A70-#x0A71] | [#x0A81-#x0A83] | #x0ABC | +[#x0ABE-#x0AC5] | [#x0AC7-#x0AC9] | [#x0ACB-#x0ACD] | [#x0B01-#x0B03] | +#x0B3C | [#x0B3E-#x0B43] | [#x0B47-#x0B48] | [#x0B4B-#x0B4D] | +[#x0B56-#x0B57] | [#x0B82-#x0B83] | [#x0BBE-#x0BC2] | [#x0BC6-#x0BC8] | +[#x0BCA-#x0BCD] | #x0BD7 | [#x0C01-#x0C03] | [#x0C3E-#x0C44] | +[#x0C46-#x0C48] | [#x0C4A-#x0C4D] | [#x0C55-#x0C56] | [#x0C82-#x0C83] | +[#x0CBE-#x0CC4] | [#x0CC6-#x0CC8] | [#x0CCA-#x0CCD] | [#x0CD5-#x0CD6] | +[#x0D02-#x0D03] | [#x0D3E-#x0D43] | [#x0D46-#x0D48] | [#x0D4A-#x0D4D] | +#x0D57 | #x0E31 | [#x0E34-#x0E3A] | [#x0E47-#x0E4E] | #x0EB1 | +[#x0EB4-#x0EB9] | [#x0EBB-#x0EBC] | [#x0EC8-#x0ECD] | [#x0F18-#x0F19] | +#x0F35 | #x0F37 | #x0F39 | #x0F3E | #x0F3F | [#x0F71-#x0F84] | +[#x0F86-#x0F8B] | [#x0F90-#x0F95] | #x0F97 | [#x0F99-#x0FAD] | +[#x0FB1-#x0FB7] | #x0FB9 | [#x20D0-#x20DC] | #x20E1 | [#x302A-#x302F] | +#x3099 | #x309A""" + +digit = """ +[#x0030-#x0039] | [#x0660-#x0669] | [#x06F0-#x06F9] | [#x0966-#x096F] | +[#x09E6-#x09EF] | [#x0A66-#x0A6F] | [#x0AE6-#x0AEF] | [#x0B66-#x0B6F] | +[#x0BE7-#x0BEF] | [#x0C66-#x0C6F] | [#x0CE6-#x0CEF] | [#x0D66-#x0D6F] | +[#x0E50-#x0E59] | [#x0ED0-#x0ED9] | [#x0F20-#x0F29]""" + +extender = """ +#x00B7 | #x02D0 | #x02D1 | #x0387 | #x0640 | #x0E46 | #x0EC6 | #x3005 | +#[#x3031-#x3035] | [#x309D-#x309E] | [#x30FC-#x30FE]""" + +letter = " | ".join([baseChar, ideographic]) + +# Without the +name = " | ".join([letter, digit, ".", "-", "_", combiningCharacter, + extender]) +nameFirst = " | ".join([letter, "_"]) + +reChar = re.compile(r"#x([\d|A-F]{4,4})") +reCharRange = re.compile(r"\[#x([\d|A-F]{4,4})-#x([\d|A-F]{4,4})\]") + + +def charStringToList(chars): + charRanges = [item.strip() for item in chars.split(" | ")] + rv = [] + for item in charRanges: + foundMatch = False + for regexp in (reChar, reCharRange): + match = regexp.match(item) + if match is not None: + rv.append([hexToInt(item) for item in match.groups()]) + if len(rv[-1]) == 1: + rv[-1] = rv[-1] * 2 + foundMatch = True + break + if not foundMatch: + assert len(item) == 1 + + rv.append([ord(item)] * 2) + rv = normaliseCharList(rv) + return rv + + +def normaliseCharList(charList): + charList = sorted(charList) + for item in charList: + assert item[1] >= item[0] + rv = [] + i = 0 + while i < len(charList): + j = 1 + rv.append(charList[i]) + while i + j < len(charList) and charList[i + j][0] <= rv[-1][1] + 1: + rv[-1][1] = charList[i + j][1] + j += 1 + i += j + return rv + +# We don't really support characters above the BMP :( +max_unicode = int("FFFF", 16) + + +def missingRanges(charList): + rv = [] + if charList[0] != 0: + rv.append([0, charList[0][0] - 1]) + for i, item in enumerate(charList[:-1]): + rv.append([item[1] + 1, charList[i + 1][0] - 1]) + if charList[-1][1] != max_unicode: + rv.append([charList[-1][1] + 1, max_unicode]) + return rv + + +def listToRegexpStr(charList): + rv = [] + for item in charList: + if item[0] == item[1]: + rv.append(escapeRegexp(chr(item[0]))) + else: + rv.append(escapeRegexp(chr(item[0])) + "-" + + escapeRegexp(chr(item[1]))) + return "[%s]" % "".join(rv) + + +def hexToInt(hex_str): + return int(hex_str, 16) + + +def escapeRegexp(string): + specialCharacters = (".", "^", "$", "*", "+", "?", "{", "}", + "[", "]", "|", "(", ")", "-") + for char in specialCharacters: + string = string.replace(char, "\\" + char) + + return string + +# output from the above +nonXmlNameBMPRegexp = re.compile('[\x00-,/:-@\\[-\\^`\\{-\xb6\xb8-\xbf\xd7\xf7\u0132-\u0133\u013f-\u0140\u0149\u017f\u01c4-\u01cc\u01f1-\u01f3\u01f6-\u01f9\u0218-\u024f\u02a9-\u02ba\u02c2-\u02cf\u02d2-\u02ff\u0346-\u035f\u0362-\u0385\u038b\u038d\u03a2\u03cf\u03d7-\u03d9\u03db\u03dd\u03df\u03e1\u03f4-\u0400\u040d\u0450\u045d\u0482\u0487-\u048f\u04c5-\u04c6\u04c9-\u04ca\u04cd-\u04cf\u04ec-\u04ed\u04f6-\u04f7\u04fa-\u0530\u0557-\u0558\u055a-\u0560\u0587-\u0590\u05a2\u05ba\u05be\u05c0\u05c3\u05c5-\u05cf\u05eb-\u05ef\u05f3-\u0620\u063b-\u063f\u0653-\u065f\u066a-\u066f\u06b8-\u06b9\u06bf\u06cf\u06d4\u06e9\u06ee-\u06ef\u06fa-\u0900\u0904\u093a-\u093b\u094e-\u0950\u0955-\u0957\u0964-\u0965\u0970-\u0980\u0984\u098d-\u098e\u0991-\u0992\u09a9\u09b1\u09b3-\u09b5\u09ba-\u09bb\u09bd\u09c5-\u09c6\u09c9-\u09ca\u09ce-\u09d6\u09d8-\u09db\u09de\u09e4-\u09e5\u09f2-\u0a01\u0a03-\u0a04\u0a0b-\u0a0e\u0a11-\u0a12\u0a29\u0a31\u0a34\u0a37\u0a3a-\u0a3b\u0a3d\u0a43-\u0a46\u0a49-\u0a4a\u0a4e-\u0a58\u0a5d\u0a5f-\u0a65\u0a75-\u0a80\u0a84\u0a8c\u0a8e\u0a92\u0aa9\u0ab1\u0ab4\u0aba-\u0abb\u0ac6\u0aca\u0ace-\u0adf\u0ae1-\u0ae5\u0af0-\u0b00\u0b04\u0b0d-\u0b0e\u0b11-\u0b12\u0b29\u0b31\u0b34-\u0b35\u0b3a-\u0b3b\u0b44-\u0b46\u0b49-\u0b4a\u0b4e-\u0b55\u0b58-\u0b5b\u0b5e\u0b62-\u0b65\u0b70-\u0b81\u0b84\u0b8b-\u0b8d\u0b91\u0b96-\u0b98\u0b9b\u0b9d\u0ba0-\u0ba2\u0ba5-\u0ba7\u0bab-\u0bad\u0bb6\u0bba-\u0bbd\u0bc3-\u0bc5\u0bc9\u0bce-\u0bd6\u0bd8-\u0be6\u0bf0-\u0c00\u0c04\u0c0d\u0c11\u0c29\u0c34\u0c3a-\u0c3d\u0c45\u0c49\u0c4e-\u0c54\u0c57-\u0c5f\u0c62-\u0c65\u0c70-\u0c81\u0c84\u0c8d\u0c91\u0ca9\u0cb4\u0cba-\u0cbd\u0cc5\u0cc9\u0cce-\u0cd4\u0cd7-\u0cdd\u0cdf\u0ce2-\u0ce5\u0cf0-\u0d01\u0d04\u0d0d\u0d11\u0d29\u0d3a-\u0d3d\u0d44-\u0d45\u0d49\u0d4e-\u0d56\u0d58-\u0d5f\u0d62-\u0d65\u0d70-\u0e00\u0e2f\u0e3b-\u0e3f\u0e4f\u0e5a-\u0e80\u0e83\u0e85-\u0e86\u0e89\u0e8b-\u0e8c\u0e8e-\u0e93\u0e98\u0ea0\u0ea4\u0ea6\u0ea8-\u0ea9\u0eac\u0eaf\u0eba\u0ebe-\u0ebf\u0ec5\u0ec7\u0ece-\u0ecf\u0eda-\u0f17\u0f1a-\u0f1f\u0f2a-\u0f34\u0f36\u0f38\u0f3a-\u0f3d\u0f48\u0f6a-\u0f70\u0f85\u0f8c-\u0f8f\u0f96\u0f98\u0fae-\u0fb0\u0fb8\u0fba-\u109f\u10c6-\u10cf\u10f7-\u10ff\u1101\u1104\u1108\u110a\u110d\u1113-\u113b\u113d\u113f\u1141-\u114b\u114d\u114f\u1151-\u1153\u1156-\u1158\u115a-\u115e\u1162\u1164\u1166\u1168\u116a-\u116c\u116f-\u1171\u1174\u1176-\u119d\u119f-\u11a7\u11a9-\u11aa\u11ac-\u11ad\u11b0-\u11b6\u11b9\u11bb\u11c3-\u11ea\u11ec-\u11ef\u11f1-\u11f8\u11fa-\u1dff\u1e9c-\u1e9f\u1efa-\u1eff\u1f16-\u1f17\u1f1e-\u1f1f\u1f46-\u1f47\u1f4e-\u1f4f\u1f58\u1f5a\u1f5c\u1f5e\u1f7e-\u1f7f\u1fb5\u1fbd\u1fbf-\u1fc1\u1fc5\u1fcd-\u1fcf\u1fd4-\u1fd5\u1fdc-\u1fdf\u1fed-\u1ff1\u1ff5\u1ffd-\u20cf\u20dd-\u20e0\u20e2-\u2125\u2127-\u2129\u212c-\u212d\u212f-\u217f\u2183-\u3004\u3006\u3008-\u3020\u3030\u3036-\u3040\u3095-\u3098\u309b-\u309c\u309f-\u30a0\u30fb\u30ff-\u3104\u312d-\u4dff\u9fa6-\uabff\ud7a4-\uffff]') # noqa + +nonXmlNameFirstBMPRegexp = re.compile('[\x00-@\\[-\\^`\\{-\xbf\xd7\xf7\u0132-\u0133\u013f-\u0140\u0149\u017f\u01c4-\u01cc\u01f1-\u01f3\u01f6-\u01f9\u0218-\u024f\u02a9-\u02ba\u02c2-\u0385\u0387\u038b\u038d\u03a2\u03cf\u03d7-\u03d9\u03db\u03dd\u03df\u03e1\u03f4-\u0400\u040d\u0450\u045d\u0482-\u048f\u04c5-\u04c6\u04c9-\u04ca\u04cd-\u04cf\u04ec-\u04ed\u04f6-\u04f7\u04fa-\u0530\u0557-\u0558\u055a-\u0560\u0587-\u05cf\u05eb-\u05ef\u05f3-\u0620\u063b-\u0640\u064b-\u0670\u06b8-\u06b9\u06bf\u06cf\u06d4\u06d6-\u06e4\u06e7-\u0904\u093a-\u093c\u093e-\u0957\u0962-\u0984\u098d-\u098e\u0991-\u0992\u09a9\u09b1\u09b3-\u09b5\u09ba-\u09db\u09de\u09e2-\u09ef\u09f2-\u0a04\u0a0b-\u0a0e\u0a11-\u0a12\u0a29\u0a31\u0a34\u0a37\u0a3a-\u0a58\u0a5d\u0a5f-\u0a71\u0a75-\u0a84\u0a8c\u0a8e\u0a92\u0aa9\u0ab1\u0ab4\u0aba-\u0abc\u0abe-\u0adf\u0ae1-\u0b04\u0b0d-\u0b0e\u0b11-\u0b12\u0b29\u0b31\u0b34-\u0b35\u0b3a-\u0b3c\u0b3e-\u0b5b\u0b5e\u0b62-\u0b84\u0b8b-\u0b8d\u0b91\u0b96-\u0b98\u0b9b\u0b9d\u0ba0-\u0ba2\u0ba5-\u0ba7\u0bab-\u0bad\u0bb6\u0bba-\u0c04\u0c0d\u0c11\u0c29\u0c34\u0c3a-\u0c5f\u0c62-\u0c84\u0c8d\u0c91\u0ca9\u0cb4\u0cba-\u0cdd\u0cdf\u0ce2-\u0d04\u0d0d\u0d11\u0d29\u0d3a-\u0d5f\u0d62-\u0e00\u0e2f\u0e31\u0e34-\u0e3f\u0e46-\u0e80\u0e83\u0e85-\u0e86\u0e89\u0e8b-\u0e8c\u0e8e-\u0e93\u0e98\u0ea0\u0ea4\u0ea6\u0ea8-\u0ea9\u0eac\u0eaf\u0eb1\u0eb4-\u0ebc\u0ebe-\u0ebf\u0ec5-\u0f3f\u0f48\u0f6a-\u109f\u10c6-\u10cf\u10f7-\u10ff\u1101\u1104\u1108\u110a\u110d\u1113-\u113b\u113d\u113f\u1141-\u114b\u114d\u114f\u1151-\u1153\u1156-\u1158\u115a-\u115e\u1162\u1164\u1166\u1168\u116a-\u116c\u116f-\u1171\u1174\u1176-\u119d\u119f-\u11a7\u11a9-\u11aa\u11ac-\u11ad\u11b0-\u11b6\u11b9\u11bb\u11c3-\u11ea\u11ec-\u11ef\u11f1-\u11f8\u11fa-\u1dff\u1e9c-\u1e9f\u1efa-\u1eff\u1f16-\u1f17\u1f1e-\u1f1f\u1f46-\u1f47\u1f4e-\u1f4f\u1f58\u1f5a\u1f5c\u1f5e\u1f7e-\u1f7f\u1fb5\u1fbd\u1fbf-\u1fc1\u1fc5\u1fcd-\u1fcf\u1fd4-\u1fd5\u1fdc-\u1fdf\u1fed-\u1ff1\u1ff5\u1ffd-\u2125\u2127-\u2129\u212c-\u212d\u212f-\u217f\u2183-\u3006\u3008-\u3020\u302a-\u3040\u3095-\u30a0\u30fb-\u3104\u312d-\u4dff\u9fa6-\uabff\ud7a4-\uffff]') # noqa + +# Simpler things +nonPubidCharRegexp = re.compile("[^\x20\x0D\x0Aa-zA-Z0-9\\-'()+,./:=?;!*#@$_%]") + + +class InfosetFilter(object): + replacementRegexp = re.compile(r"U[\dA-F]{5,5}") + + def __init__(self, + dropXmlnsLocalName=False, + dropXmlnsAttrNs=False, + preventDoubleDashComments=False, + preventDashAtCommentEnd=False, + replaceFormFeedCharacters=True, + preventSingleQuotePubid=False): + + self.dropXmlnsLocalName = dropXmlnsLocalName + self.dropXmlnsAttrNs = dropXmlnsAttrNs + + self.preventDoubleDashComments = preventDoubleDashComments + self.preventDashAtCommentEnd = preventDashAtCommentEnd + + self.replaceFormFeedCharacters = replaceFormFeedCharacters + + self.preventSingleQuotePubid = preventSingleQuotePubid + + self.replaceCache = {} + + def coerceAttribute(self, name, namespace=None): + if self.dropXmlnsLocalName and name.startswith("xmlns:"): + warnings.warn("Attributes cannot begin with xmlns", DataLossWarning) + return None + elif (self.dropXmlnsAttrNs and + namespace == "http://www.w3.org/2000/xmlns/"): + warnings.warn("Attributes cannot be in the xml namespace", DataLossWarning) + return None + else: + return self.toXmlName(name) + + def coerceElement(self, name): + return self.toXmlName(name) + + def coerceComment(self, data): + if self.preventDoubleDashComments: + while "--" in data: + warnings.warn("Comments cannot contain adjacent dashes", DataLossWarning) + data = data.replace("--", "- -") + if data.endswith("-"): + warnings.warn("Comments cannot end in a dash", DataLossWarning) + data += " " + return data + + def coerceCharacters(self, data): + if self.replaceFormFeedCharacters: + for _ in range(data.count("\x0C")): + warnings.warn("Text cannot contain U+000C", DataLossWarning) + data = data.replace("\x0C", " ") + # Other non-xml characters + return data + + def coercePubid(self, data): + dataOutput = data + for char in nonPubidCharRegexp.findall(data): + warnings.warn("Coercing non-XML pubid", DataLossWarning) + replacement = self.getReplacementCharacter(char) + dataOutput = dataOutput.replace(char, replacement) + if self.preventSingleQuotePubid and dataOutput.find("'") >= 0: + warnings.warn("Pubid cannot contain single quote", DataLossWarning) + dataOutput = dataOutput.replace("'", self.getReplacementCharacter("'")) + return dataOutput + + def toXmlName(self, name): + nameFirst = name[0] + nameRest = name[1:] + m = nonXmlNameFirstBMPRegexp.match(nameFirst) + if m: + warnings.warn("Coercing non-XML name", DataLossWarning) + nameFirstOutput = self.getReplacementCharacter(nameFirst) + else: + nameFirstOutput = nameFirst + + nameRestOutput = nameRest + replaceChars = set(nonXmlNameBMPRegexp.findall(nameRest)) + for char in replaceChars: + warnings.warn("Coercing non-XML name", DataLossWarning) + replacement = self.getReplacementCharacter(char) + nameRestOutput = nameRestOutput.replace(char, replacement) + return nameFirstOutput + nameRestOutput + + def getReplacementCharacter(self, char): + if char in self.replaceCache: + replacement = self.replaceCache[char] + else: + replacement = self.escapeChar(char) + return replacement + + def fromXmlName(self, name): + for item in set(self.replacementRegexp.findall(name)): + name = name.replace(item, self.unescapeChar(item)) + return name + + def escapeChar(self, char): + replacement = "U%05X" % ord(char) + self.replaceCache[char] = replacement + return replacement + + def unescapeChar(self, charcode): + return chr(int(charcode[1:], 16)) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/_ihatexml.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/_ihatexml.pyc new file mode 100644 index 0000000000000000000000000000000000000000..85ce92e35bfdd7d85c96b40ea8fbecb6d62466d9 GIT binary patch literal 16440 zcmeHOYj9jecJ7gE*)ldZ55HJgi&r7Q7tLrM(y*}Xy?5?S$bzyNLm+;jl{I5|j5Lzx z0b)99nD^9Q-TPRpaQ@6i{*7-}i2Uk+5Gni% zh;|`50s_w+6=HRT=%^H{D@B0bRfzUkV)ZO;hw^N(dbUVaiqtI8UL`u_h}Cn@4z+Vd zs!FV`7AaKC6REjk^%WvjEmqGLsd-}40+F68($%7^LiA#sE8WT~MHTqjaXx$qU2<}#*vz5BSFA8&9Uuj9wBiWJ(f5E}v_bve*O1s&)!qO(XGrF?l}HK;k+iJOceWP`>E=vFS7)wJAXTI?Ph|3$&TL^39*Wsa zYiBCm+@2|YAIm?iIzgk1D*N&BQ3dXCfingY`zfl*4*433`Rm4Wl?=y z&6XOjiK&_fzs3x5n?%fOlW61`n`#st+o`eLHlZN*3WY;nO*lfmLSf6RQKN?*J&)CX}w_(oqCfwL@C@D zbEXq+#jBA%QhQPn2uw~4AYjl`j%6K8%RX2hdoHqclR)00NT zWNAc9pN^VE#4yNA15#8C5w$$9 zMQvs^YS+62WA#ih7N#~lotT16EaLTwHK;a*r|y`+0EihLkYWnPF<(tFHF_+;&;qNm zMAXqm%!-nHVwT5hJjgZiFwYe4;^BnDPdv(KiN`!h#2Z!PMo*aWMw&$c9;5O9SsCW2@8!_%~cyf*>Os+{JT(QIxY6#0`LkTl(do{Y6g&y=orw6&0 z9-={+4L!t+>Gd8q^m=AY4|~k(VaBQ+_Ex1H<|*r8&nD<$7K^SVMz%$d#))TLVURct63>Wu_HS~7Yg1g;t@Vd`;zUP_p{FHBttQ&+;|Aq+Ky;qz=Lo|RN- z2!n>80B~*b!zAyehgjpGH3|Jyur4`@Udzt8Ja9ZmWHY9nCZ*V3^A*wFGEww(DWr{ zDvX&dF-0fF=EC&FVk)ti{?ap*SWI6mrV@+kqs3HcF@0>93LB<}4Kv|l)wI;0ywI49 zgqmQ&2T4LrFyT)yp(dE{CzwzZO!(7DsOcp9=~!wDuxaDtTwwkgX@i??2 zjBq>%^NX4{Ig?XzL4Ube$VeW>2?X;Gq09GSD9qC{H8SoI;E4l>v23afKLI2d;=e>lj? zJRG!L%O6(jA{?rB`O!_*PND&(pm+z)9-tjjT8-Pf1LSZp=vaktkUcwO@pZ+a+0Kas z@4;p;>}f9;Rz@-G8^uT?dnl2M9LYEvp(uOhBz2rP(#aA${tbSY>A&e0xD?++LiTB%h#L+NRvIts+2-dOP%Z>sT_Ys`XiwIReC zU27dTlo5insTMs7u2|yA+{PKXERDE2H^lvOLtLF3;-)Lrc*3>%adn`HTkcqT5dJJ# zbe*Te1!qt_><+3ci>^mpFb4GqOHB8ViMmpX?k(t`-oSF!8+?~g%~bbhs?$t)7P`SQ z)V&QMsH=JDrsrSlYF@gU7fIewN-;d87@krLr4%E=Gv&sLXM=fW#TklcgL!5)j40#B zP)3M*HL|`8#WU9^Rt<$ru3_U5G*|_Sj>-5jJQWz83QWbb$viU~ref8MxGOtoMwkuL zXVp}vaMKsB8D&q|RHr&(!&I!A%qp{CDppO;&IL`ys_CP}RIHl5RLz8<%x7h$li(c~ zTeK(4gyK2ji#MToPWU`06we7IUND%5syz@MQ^;96mWn`Fe3WEqSV~P+#CJo`nAxxl z<@@*s#8L*tQZ}B1V43U=TmE#^b`-Qj?0uk#9aftv3JyPZSZy_^almhT;J4L5)^7B) zV>hyPY;_ExL2Y%Kx7n%3mW2v;#o5X`vvpdGJPX@k%Vw*SF*PQaU~`m4D+H3`X{`YvehwmzF5LBbq0-jdw4J&;~B+co{@}O zs>Y%k?xm|XI=4|Zs*UcqF;pAFr(-D7YWQtT)yDMcn2L_+w@Iir37?LoVntTevj&z5 z6<7(cMtK=Qn>Mel*z3rw1r0~V^$F$O1nUzdQoIT`IVMn&s6)98*YDJ3p-NmWKX>;)^)ZE-%yJl@_i>}%0 zz8hH?*?N2NHq@>KkxS}9?~spEC9Oq|J0QhFqvT4;kTc8&CE<|lrsgTQbamhvu zH(jX0+g#e**pdUEZZX-CZA){bj+R2}MhFmtbY@lSmaeXJHpLy=a-GGlJco)mrn?{N zygyrjyoG2_XSvTqxndd|3!&%p>0AMkWGk0LaGBb4=28X1O|~=F(bAsDGY=1B@`YN$ z0T12^uJTL>A?FUrObDuC?()zu*nNU)H*^-WsRx-=HJ`S0cUQ6+4QlaINq#d*bzQm4 z6D@^w-4iXjx(%J}sdO%1*Va{++PtalJCO~c;QCPbsi&SOY$_BA4dEv@2JxpYTlY|1 zSEftLWb=iV_I9nlA=b1yNmcx7egfj?%++lybhJm?GwbV`GaE5PcSrkOT~Bf3oS0q( zxo6uR>ZBP0uOfdFaTcfzR0S5`cTHenV18g_U`b#xp624Wtl~!0w9>*L4U!6YVf+&c z1zs400wKCg68A1MgAI52oSP1Un3r&by7iZXtlga_<<178H65( zEX#D=0;pmYZ34P5MkT{L(7m3DKl(yb zfP?X&xw+hl7jWP-ndLIlv&UmN5^ZR82OF zuccU_u)RX0v&9bFITg}uqdHo;o1M!jMnm!|Xu=v!UQZ=b_~q6wOgQc>GxKnYyHm0QOm4}lTEbitUmCKW90!2V zxaQXUx*~F+)IsYI+ZoiBZ*A#HC(~q&+2*%y%&|G&)S1aD75l3DQfQ4fOzcI4hdLG4 zu-dPqDo^%>^tJ#RtEsplaJ|wR85GhSYmGEs;6)8B;YxQ^Z3SwYc;TvBQfivX7Ssc2 z8=GcxzL2}zU`-P1gZSl%W8ou`rpy2gYDV}10TGoeK7OWe(k4wfBKI0 zVc&<(e7Nhwcg_r)c}+X>muKEMv**m-Gv7aRO#4~S&vyO%`JeCk#r9w9(0(y+wog0T ze|D#K_UW^`w6g{n6{%M{j?;L;LvokKg%t^5fH= z^nB9$NuTz~z$XW_PsTqvs{QiqUruSiocZ)6?bE%Vj%c5be|A#)?7h!s&JCP<`P}fi zL)y9VbCa6f*CY3pllyz*{*v6k3#I4e{uhwF zDEAM`{S$KkQ9K-%`$1s;l-xfphx#-*)Gvp2B70g6f#T4sa%eZQH{{S;atK6+2IbHZ zO&-`L5A-4{$pghocd9+U+-6@Zv-_e)lQS>{yM;_fPkD}|*L3tEik8P93O7hq)dF%ywY*-#czhl$# zI7D&0PafYXkE8GLSLJaqd3>)tj*iC%<#BX8*&|Pm%ac-2g<$gBAY3fwv|hza_M{J($nSAu5#%mtz4Qam!`|5 znR4GYt=#uaxo=mwZ=l@w0v=u}_q~d2ce(F%WN(%G-YNI(EBEa$_Z=wrji73@+&7MF zqTF|^+;>7N_wOn9??pCL?jJ@rQtlr`HdgLGjO;|Y|GjemRC!0QR^BmE-ho#;#>+b< zkew{=0JrbXlqcWR%9DG`Q+S%1DWAgVr(P?cdJEa!@-${Ly`wz+9I}D(^zQQX>*eV; z%hPX_r%$75rhNK%`Sf)8^o&-X*;bzEE6?mgX`npwGO}07Gax;)w>&e3Y@$4KygW0l zo$nnu-@6Cd+vj`V(ax6!&zFXf4WBQKA{#qj8rRPE&7AM=)h_guF7)(Y==mN>Z(ry+ ze4*!rc41r3h3&6s7q;)du>B2WZ(i8G7unkvdZ#Y*&S)1(r3*;3+u*UL5=Pzp#3z5NQt8q&S3wFJaTO zFZx$SWgJCH`1o}Wf5uuNO8CMRAHr7B_n`DG>?|(eBiGqnz^ATNTv$LK%TgPB4m+0% z_~x~m3ybLES9*m{U9aH6)grm7mW~ibN*+cOn1jI4mC>!O#54WqV8JH|69pU~a6V|} zfC3db?nwolVG({p0mn`RX;Hur`giFF|C-M1$y~(`-bF7 z6p|VxcTrMDNstmcb6xI}1V_@En={!=p}Bb)45^dw-0DDe1^+6lD_XIa@hO;c*6{`u zpeh6&aw|#M2-nk*7~#N`6sJH?0g)gC0&rZU54l%S+bWTJm?Ib}mj1BYaMq;_=MY8E zT17pb@Hd^z5O2-q?=IeiA}Kqw9^W$OYg${f+0H`E`gB_+Tk~Y5u(5{Q6>mVZjfFzj z-F09(<6SD zb-Ki`ny%HJCQI@6sBl9i?$kW+Z^lap{2ijZo{*1uJ`Q}}OL4eO979DkjKEK8gM;9( z$P_z4n0`KDC#Z$x#`?gD>2N#ErmHNc6RdOtHSQ2u3`RjzvawA?Vn);W;>|T`?h0td zSNtu2ZcAzt@R}{uq+sFFdA>Q)YE(o;<7IJaPuy-0=3BT2hg)hm7O3o13_~UxC}B+B zh7w~Qy?6om%49UB@Sg;}L<)80`VZjRL2orKViw^VhSEg=MlVf_%r&DoiGrivCef{N z1YK#BtrAq0Shs{?W6&1q7KPcYw#_S)X0d<49J=~;^+)tosBC_bZUi1mcNZ>I-NSdn zJeiILNa4Is@J(6HyRd7;RahbUIa=|}O7iRI3n*eUz3i&sTMafP{%-m!aOOm=su5|u zHn3P(5d^P%J$xSzKt2TB{l^q`#U6u47JmcXZ#nx60^@3*A)UdcfZV-1E;tr^=R_+H z7rRS1YKa@*+#cG9a03kGp*3`ci!@X^B)uJp8bO6*>tQq)$XRe?Mn(Bal3Hz&kS znAniXrf^Al2?E%)!If@O#WTr>dGb!unq_Z;S11u+zLf=Ltk6zHEB8-}g|1>Dc?TYy z+hPun61mHcB)WA_R+`1~?|96UoGAFY1WS1#(yt=_s#?@EC2vumzyr{Og}I#WSx~AF zD+ojiR}2HX7@Z|@-*jQX-xaVuR>)F~W{WIf1wb*@@PPrYDhqQ6ObU90zB!`%KCxvE z-?wd@``hT@0|d0imk0P50VxPn^Bz$pHs^s<(616pf8+M7xENFU4XlytP)jo|EJFh1 zIIf1BLDbrK@LLK$d|`eGaFRClA`6J~Na31a>+N^6P|q;pLHw=T^ILcz-WQ0KWIA79 z`_sWrI#qE41uy@9K)G z3cAi+;DFEDOK6woy`&xmfQ`%tzCnS9u)-;$l7N`St%^b*TQ-6w85OeJO=@2y3hZ&J zt2SEG7uk7Qr(X^s5sIz^-}$*H2-;jL7W$hjSxFX%fkOA!oLe+lbT~^81=a!nCDz@@ zS5Byf)mBCqOOlrz8C|$T%Xx=&1w>Sn4>w$}wD$A0#6BsnQk!1NTQSk8qbq`~y0MgQ&fvfG(I2Qw>Z+QhC1G}V$ZcFyNyEt{L!5HvS;bf${!^hgbJ zY3x3#F3P;A9d%{+g;Pu&}Z+;QpO|<@_tEE34;K&#k_q`s(UA)w8Q-*V3YJ#I&JU zDCQuhB&tLbf)z;y!Wt^YknrY(V-pVZ2oCY_hQ+X4+!6Mrtm z@Jz0t#~Mm*p@a^nNt#yjK}x", b"<"]) + + +invalid_unicode_no_surrogate = "[\u0001-\u0008\u000B\u000E-\u001F\u007F-\u009F\uFDD0-\uFDEF\uFFFE\uFFFF\U0001FFFE\U0001FFFF\U0002FFFE\U0002FFFF\U0003FFFE\U0003FFFF\U0004FFFE\U0004FFFF\U0005FFFE\U0005FFFF\U0006FFFE\U0006FFFF\U0007FFFE\U0007FFFF\U0008FFFE\U0008FFFF\U0009FFFE\U0009FFFF\U000AFFFE\U000AFFFF\U000BFFFE\U000BFFFF\U000CFFFE\U000CFFFF\U000DFFFE\U000DFFFF\U000EFFFE\U000EFFFF\U000FFFFE\U000FFFFF\U0010FFFE\U0010FFFF]" # noqa + +if _utils.supports_lone_surrogates: + # Use one extra step of indirection and create surrogates with + # eval. Not using this indirection would introduce an illegal + # unicode literal on platforms not supporting such lone + # surrogates. + assert invalid_unicode_no_surrogate[-1] == "]" and invalid_unicode_no_surrogate.count("]") == 1 + invalid_unicode_re = re.compile(invalid_unicode_no_surrogate[:-1] + + eval('"\\uD800-\\uDFFF"') + # pylint:disable=eval-used + "]") +else: + invalid_unicode_re = re.compile(invalid_unicode_no_surrogate) + +non_bmp_invalid_codepoints = set([0x1FFFE, 0x1FFFF, 0x2FFFE, 0x2FFFF, 0x3FFFE, + 0x3FFFF, 0x4FFFE, 0x4FFFF, 0x5FFFE, 0x5FFFF, + 0x6FFFE, 0x6FFFF, 0x7FFFE, 0x7FFFF, 0x8FFFE, + 0x8FFFF, 0x9FFFE, 0x9FFFF, 0xAFFFE, 0xAFFFF, + 0xBFFFE, 0xBFFFF, 0xCFFFE, 0xCFFFF, 0xDFFFE, + 0xDFFFF, 0xEFFFE, 0xEFFFF, 0xFFFFE, 0xFFFFF, + 0x10FFFE, 0x10FFFF]) + +ascii_punctuation_re = re.compile("[\u0009-\u000D\u0020-\u002F\u003A-\u0040\u005C\u005B-\u0060\u007B-\u007E]") + +# Cache for charsUntil() +charsUntilRegEx = {} + + +class BufferedStream(object): + """Buffering for streams that do not have buffering of their own + + The buffer is implemented as a list of chunks on the assumption that + joining many strings will be slow since it is O(n**2) + """ + + def __init__(self, stream): + self.stream = stream + self.buffer = [] + self.position = [-1, 0] # chunk number, offset + + def tell(self): + pos = 0 + for chunk in self.buffer[:self.position[0]]: + pos += len(chunk) + pos += self.position[1] + return pos + + def seek(self, pos): + assert pos <= self._bufferedBytes() + offset = pos + i = 0 + while len(self.buffer[i]) < offset: + offset -= len(self.buffer[i]) + i += 1 + self.position = [i, offset] + + def read(self, bytes): + if not self.buffer: + return self._readStream(bytes) + elif (self.position[0] == len(self.buffer) and + self.position[1] == len(self.buffer[-1])): + return self._readStream(bytes) + else: + return self._readFromBuffer(bytes) + + def _bufferedBytes(self): + return sum([len(item) for item in self.buffer]) + + def _readStream(self, bytes): + data = self.stream.read(bytes) + self.buffer.append(data) + self.position[0] += 1 + self.position[1] = len(data) + return data + + def _readFromBuffer(self, bytes): + remainingBytes = bytes + rv = [] + bufferIndex = self.position[0] + bufferOffset = self.position[1] + while bufferIndex < len(self.buffer) and remainingBytes != 0: + assert remainingBytes > 0 + bufferedData = self.buffer[bufferIndex] + + if remainingBytes <= len(bufferedData) - bufferOffset: + bytesToRead = remainingBytes + self.position = [bufferIndex, bufferOffset + bytesToRead] + else: + bytesToRead = len(bufferedData) - bufferOffset + self.position = [bufferIndex, len(bufferedData)] + bufferIndex += 1 + rv.append(bufferedData[bufferOffset:bufferOffset + bytesToRead]) + remainingBytes -= bytesToRead + + bufferOffset = 0 + + if remainingBytes: + rv.append(self._readStream(remainingBytes)) + + return b"".join(rv) + + +def HTMLInputStream(source, **kwargs): + # Work around Python bug #20007: read(0) closes the connection. + # http://bugs.python.org/issue20007 + if (isinstance(source, http_client.HTTPResponse) or + # Also check for addinfourl wrapping HTTPResponse + (isinstance(source, urllib.response.addbase) and + isinstance(source.fp, http_client.HTTPResponse))): + isUnicode = False + elif hasattr(source, "read"): + isUnicode = isinstance(source.read(0), text_type) + else: + isUnicode = isinstance(source, text_type) + + if isUnicode: + encodings = [x for x in kwargs if x.endswith("_encoding")] + if encodings: + raise TypeError("Cannot set an encoding with a unicode input, set %r" % encodings) + + return HTMLUnicodeInputStream(source, **kwargs) + else: + return HTMLBinaryInputStream(source, **kwargs) + + +class HTMLUnicodeInputStream(object): + """Provides a unicode stream of characters to the HTMLTokenizer. + + This class takes care of character encoding and removing or replacing + incorrect byte-sequences and also provides column and line tracking. + + """ + + _defaultChunkSize = 10240 + + def __init__(self, source): + """Initialises the HTMLInputStream. + + HTMLInputStream(source, [encoding]) -> Normalized stream from source + for use by html5lib. + + source can be either a file-object, local filename or a string. + + 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) + + """ + + if not _utils.supports_lone_surrogates: + # Such platforms will have already checked for such + # surrogate errors, so no need to do this checking. + self.reportCharacterErrors = None + elif len("\U0010FFFF") == 1: + self.reportCharacterErrors = self.characterErrorsUCS4 + else: + self.reportCharacterErrors = self.characterErrorsUCS2 + + # List of where new lines occur + self.newLines = [0] + + self.charEncoding = (lookupEncoding("utf-8"), "certain") + self.dataStream = self.openStream(source) + + self.reset() + + def reset(self): + self.chunk = "" + self.chunkSize = 0 + self.chunkOffset = 0 + self.errors = [] + + # number of (complete) lines in previous chunks + self.prevNumLines = 0 + # number of columns in the last line of the previous chunk + self.prevNumCols = 0 + + # Deal with CR LF and surrogates split over chunk boundaries + self._bufferedCharacter = None + + def openStream(self, source): + """Produces a file object from source. + + source can be either a file object, local filename or a string. + + """ + # Already a file object + if hasattr(source, 'read'): + stream = source + else: + stream = StringIO(source) + + return stream + + def _position(self, offset): + chunk = self.chunk + nLines = chunk.count('\n', 0, offset) + positionLine = self.prevNumLines + nLines + lastLinePos = chunk.rfind('\n', 0, offset) + if lastLinePos == -1: + positionColumn = self.prevNumCols + offset + else: + positionColumn = offset - (lastLinePos + 1) + return (positionLine, positionColumn) + + def position(self): + """Returns (line, col) of the current position in the stream.""" + line, col = self._position(self.chunkOffset) + return (line + 1, col) + + def char(self): + """ Read one character from the stream or queue if available. Return + EOF when EOF is reached. + """ + # Read a new chunk from the input stream if necessary + if self.chunkOffset >= self.chunkSize: + if not self.readChunk(): + return EOF + + chunkOffset = self.chunkOffset + char = self.chunk[chunkOffset] + self.chunkOffset = chunkOffset + 1 + + return char + + def readChunk(self, chunkSize=None): + if chunkSize is None: + chunkSize = self._defaultChunkSize + + self.prevNumLines, self.prevNumCols = self._position(self.chunkSize) + + self.chunk = "" + self.chunkSize = 0 + self.chunkOffset = 0 + + data = self.dataStream.read(chunkSize) + + # Deal with CR LF and surrogates broken across chunks + if self._bufferedCharacter: + data = self._bufferedCharacter + data + self._bufferedCharacter = None + elif not data: + # We have no more data, bye-bye stream + return False + + if len(data) > 1: + lastv = ord(data[-1]) + if lastv == 0x0D or 0xD800 <= lastv <= 0xDBFF: + self._bufferedCharacter = data[-1] + data = data[:-1] + + if self.reportCharacterErrors: + self.reportCharacterErrors(data) + + # Replace invalid characters + data = data.replace("\r\n", "\n") + data = data.replace("\r", "\n") + + self.chunk = data + self.chunkSize = len(data) + + return True + + def characterErrorsUCS4(self, data): + for _ in range(len(invalid_unicode_re.findall(data))): + self.errors.append("invalid-codepoint") + + def characterErrorsUCS2(self, data): + # Someone picked the wrong compile option + # You lose + skip = False + for match in invalid_unicode_re.finditer(data): + if skip: + continue + codepoint = ord(match.group()) + pos = match.start() + # Pretty sure there should be endianness issues here + if _utils.isSurrogatePair(data[pos:pos + 2]): + # We have a surrogate pair! + char_val = _utils.surrogatePairToCodepoint(data[pos:pos + 2]) + if char_val in non_bmp_invalid_codepoints: + self.errors.append("invalid-codepoint") + skip = True + elif (codepoint >= 0xD800 and codepoint <= 0xDFFF and + pos == len(data) - 1): + self.errors.append("invalid-codepoint") + else: + skip = False + self.errors.append("invalid-codepoint") + + def charsUntil(self, characters, opposite=False): + """ Returns a string of characters from the stream up to but not + including any character in 'characters' or EOF. 'characters' must be + a container that supports the 'in' method and iteration over its + characters. + """ + + # Use a cache of regexps to find the required characters + try: + chars = charsUntilRegEx[(characters, opposite)] + except KeyError: + if __debug__: + for c in characters: + assert(ord(c) < 128) + regex = "".join(["\\x%02x" % ord(c) for c in characters]) + if not opposite: + regex = "^%s" % regex + chars = charsUntilRegEx[(characters, opposite)] = re.compile("[%s]+" % regex) + + rv = [] + + while True: + # Find the longest matching prefix + m = chars.match(self.chunk, self.chunkOffset) + if m is None: + # If nothing matched, and it wasn't because we ran out of chunk, + # then stop + if self.chunkOffset != self.chunkSize: + break + else: + end = m.end() + # If not the whole chunk matched, return everything + # up to the part that didn't match + if end != self.chunkSize: + rv.append(self.chunk[self.chunkOffset:end]) + self.chunkOffset = end + break + # If the whole remainder of the chunk matched, + # use it all and read the next chunk + rv.append(self.chunk[self.chunkOffset:]) + if not self.readChunk(): + # Reached EOF + break + + r = "".join(rv) + return r + + def unget(self, char): + # Only one character is allowed to be ungotten at once - it must + # be consumed again before any further call to unget + if char is not None: + if self.chunkOffset == 0: + # unget is called quite rarely, so it's a good idea to do + # more work here if it saves a bit of work in the frequently + # called char and charsUntil. + # So, just prepend the ungotten character onto the current + # chunk: + self.chunk = char + self.chunk + self.chunkSize += 1 + else: + self.chunkOffset -= 1 + assert self.chunk[self.chunkOffset] == char + + +class HTMLBinaryInputStream(HTMLUnicodeInputStream): + """Provides a unicode stream of characters to the HTMLTokenizer. + + This class takes care of character encoding and removing or replacing + incorrect byte-sequences and also provides column and line tracking. + + """ + + def __init__(self, source, override_encoding=None, transport_encoding=None, + same_origin_parent_encoding=None, likely_encoding=None, + default_encoding="windows-1252", useChardet=True): + """Initialises the HTMLInputStream. + + HTMLInputStream(source, [encoding]) -> Normalized stream from source + for use by html5lib. + + source can be either a file-object, local filename or a string. + + 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) + + """ + # Raw Stream - for unicode objects this will encode to utf-8 and set + # self.charEncoding as appropriate + self.rawStream = self.openStream(source) + + HTMLUnicodeInputStream.__init__(self, self.rawStream) + + # Encoding Information + # Number of bytes to use when looking for a meta element with + # encoding information + self.numBytesMeta = 1024 + # Number of bytes to use when using detecting encoding using chardet + self.numBytesChardet = 100 + # Things from args + self.override_encoding = override_encoding + self.transport_encoding = transport_encoding + self.same_origin_parent_encoding = same_origin_parent_encoding + self.likely_encoding = likely_encoding + self.default_encoding = default_encoding + + # Determine encoding + self.charEncoding = self.determineEncoding(useChardet) + assert self.charEncoding[0] is not None + + # Call superclass + self.reset() + + def reset(self): + self.dataStream = self.charEncoding[0].codec_info.streamreader(self.rawStream, 'replace') + HTMLUnicodeInputStream.reset(self) + + def openStream(self, source): + """Produces a file object from source. + + source can be either a file object, local filename or a string. + + """ + # Already a file object + if hasattr(source, 'read'): + stream = source + else: + stream = BytesIO(source) + + try: + stream.seek(stream.tell()) + except: # pylint:disable=bare-except + stream = BufferedStream(stream) + + return stream + + def determineEncoding(self, chardet=True): + # BOMs take precedence over everything + # This will also read past the BOM if present + charEncoding = self.detectBOM(), "certain" + if charEncoding[0] is not None: + return charEncoding + + # If we've been overriden, we've been overriden + charEncoding = lookupEncoding(self.override_encoding), "certain" + if charEncoding[0] is not None: + return charEncoding + + # Now check the transport layer + charEncoding = lookupEncoding(self.transport_encoding), "certain" + if charEncoding[0] is not None: + return charEncoding + + # Look for meta elements with encoding information + charEncoding = self.detectEncodingMeta(), "tentative" + if charEncoding[0] is not None: + return charEncoding + + # Parent document encoding + charEncoding = lookupEncoding(self.same_origin_parent_encoding), "tentative" + if charEncoding[0] is not None and not charEncoding[0].name.startswith("utf-16"): + return charEncoding + + # "likely" encoding + charEncoding = lookupEncoding(self.likely_encoding), "tentative" + if charEncoding[0] is not None: + return charEncoding + + # Guess with chardet, if available + if chardet: + try: + from pip._vendor.chardet.universaldetector import UniversalDetector + except ImportError: + pass + else: + buffers = [] + detector = UniversalDetector() + while not detector.done: + buffer = self.rawStream.read(self.numBytesChardet) + assert isinstance(buffer, bytes) + if not buffer: + break + buffers.append(buffer) + detector.feed(buffer) + detector.close() + encoding = lookupEncoding(detector.result['encoding']) + self.rawStream.seek(0) + if encoding is not None: + return encoding, "tentative" + + # Try the default encoding + charEncoding = lookupEncoding(self.default_encoding), "tentative" + if charEncoding[0] is not None: + return charEncoding + + # Fallback to html5lib's default if even that hasn't worked + return lookupEncoding("windows-1252"), "tentative" + + def changeEncoding(self, newEncoding): + assert self.charEncoding[1] != "certain" + newEncoding = lookupEncoding(newEncoding) + if newEncoding is None: + return + if newEncoding.name in ("utf-16be", "utf-16le"): + newEncoding = lookupEncoding("utf-8") + assert newEncoding is not None + elif newEncoding == self.charEncoding[0]: + self.charEncoding = (self.charEncoding[0], "certain") + else: + self.rawStream.seek(0) + self.charEncoding = (newEncoding, "certain") + self.reset() + raise _ReparseException("Encoding changed from %s to %s" % (self.charEncoding[0], newEncoding)) + + def detectBOM(self): + """Attempts to detect at BOM at the start of the stream. If + an encoding can be determined from the BOM return the name of the + encoding otherwise return None""" + bomDict = { + codecs.BOM_UTF8: 'utf-8', + codecs.BOM_UTF16_LE: 'utf-16le', codecs.BOM_UTF16_BE: 'utf-16be', + codecs.BOM_UTF32_LE: 'utf-32le', codecs.BOM_UTF32_BE: 'utf-32be' + } + + # Go to beginning of file and read in 4 bytes + string = self.rawStream.read(4) + assert isinstance(string, bytes) + + # Try detecting the BOM using bytes from the string + encoding = bomDict.get(string[:3]) # UTF-8 + seek = 3 + if not encoding: + # Need to detect UTF-32 before UTF-16 + encoding = bomDict.get(string) # UTF-32 + seek = 4 + if not encoding: + encoding = bomDict.get(string[:2]) # UTF-16 + seek = 2 + + # Set the read position past the BOM if one was found, otherwise + # set it to the start of the stream + if encoding: + self.rawStream.seek(seek) + return lookupEncoding(encoding) + else: + self.rawStream.seek(0) + return None + + def detectEncodingMeta(self): + """Report the encoding declared by the meta element + """ + buffer = self.rawStream.read(self.numBytesMeta) + assert isinstance(buffer, bytes) + parser = EncodingParser(buffer) + self.rawStream.seek(0) + encoding = parser.getEncoding() + + if encoding is not None and encoding.name in ("utf-16be", "utf-16le"): + encoding = lookupEncoding("utf-8") + + return encoding + + +class EncodingBytes(bytes): + """String-like object with an associated position and various extra methods + If the position is ever greater than the string length then an exception is + raised""" + def __new__(self, value): + assert isinstance(value, bytes) + return bytes.__new__(self, value.lower()) + + def __init__(self, value): + # pylint:disable=unused-argument + self._position = -1 + + def __iter__(self): + return self + + def __next__(self): + p = self._position = self._position + 1 + if p >= len(self): + raise StopIteration + elif p < 0: + raise TypeError + return self[p:p + 1] + + def next(self): + # Py2 compat + return self.__next__() + + def previous(self): + p = self._position + if p >= len(self): + raise StopIteration + elif p < 0: + raise TypeError + self._position = p = p - 1 + return self[p:p + 1] + + def setPosition(self, position): + if self._position >= len(self): + raise StopIteration + self._position = position + + def getPosition(self): + if self._position >= len(self): + raise StopIteration + if self._position >= 0: + return self._position + else: + return None + + position = property(getPosition, setPosition) + + def getCurrentByte(self): + return self[self.position:self.position + 1] + + currentByte = property(getCurrentByte) + + def skip(self, chars=spaceCharactersBytes): + """Skip past a list of characters""" + p = self.position # use property for the error-checking + while p < len(self): + c = self[p:p + 1] + if c not in chars: + self._position = p + return c + p += 1 + self._position = p + return None + + def skipUntil(self, chars): + p = self.position + while p < len(self): + c = self[p:p + 1] + if c in chars: + self._position = p + return c + p += 1 + self._position = p + return None + + def matchBytes(self, bytes): + """Look for a sequence of bytes at the start of a string. If the bytes + are found return True and advance the position to the byte after the + match. Otherwise return False and leave the position alone""" + p = self.position + data = self[p:p + len(bytes)] + rv = data.startswith(bytes) + if rv: + self.position += len(bytes) + return rv + + def jumpTo(self, bytes): + """Look for the next sequence of bytes matching a given sequence. If + a match is found advance the position to the last byte of the match""" + newPosition = self[self.position:].find(bytes) + if newPosition > -1: + # XXX: This is ugly, but I can't see a nicer way to fix this. + if self._position == -1: + self._position = 0 + self._position += (newPosition + len(bytes) - 1) + return True + else: + raise StopIteration + + +class EncodingParser(object): + """Mini parser for detecting character encoding from meta elements""" + + def __init__(self, data): + """string - the data to work on for encoding detection""" + self.data = EncodingBytes(data) + self.encoding = None + + def getEncoding(self): + methodDispatch = ( + (b"") + + def handleMeta(self): + if self.data.currentByte not in spaceCharactersBytes: + # if we have ") + + def getAttribute(self): + """Return a name,value pair for the next attribute in the stream, + if one is found, or None""" + data = self.data + # Step 1 (skip chars) + c = data.skip(spaceCharactersBytes | frozenset([b"/"])) + assert c is None or len(c) == 1 + # Step 2 + if c in (b">", None): + return None + # Step 3 + attrName = [] + attrValue = [] + # Step 4 attribute name + while True: + if c == b"=" and attrName: + break + elif c in spaceCharactersBytes: + # Step 6! + c = data.skip() + break + elif c in (b"/", b">"): + return b"".join(attrName), b"" + elif c in asciiUppercaseBytes: + attrName.append(c.lower()) + elif c is None: + return None + else: + attrName.append(c) + # Step 5 + c = next(data) + # Step 7 + if c != b"=": + data.previous() + return b"".join(attrName), b"" + # Step 8 + next(data) + # Step 9 + c = data.skip() + # Step 10 + if c in (b"'", b'"'): + # 10.1 + quoteChar = c + while True: + # 10.2 + c = next(data) + # 10.3 + if c == quoteChar: + next(data) + return b"".join(attrName), b"".join(attrValue) + # 10.4 + elif c in asciiUppercaseBytes: + attrValue.append(c.lower()) + # 10.5 + else: + attrValue.append(c) + elif c == b">": + return b"".join(attrName), b"" + elif c in asciiUppercaseBytes: + attrValue.append(c.lower()) + elif c is None: + return None + else: + attrValue.append(c) + # Step 11 + while True: + c = next(data) + if c in spacesAngleBrackets: + return b"".join(attrName), b"".join(attrValue) + elif c in asciiUppercaseBytes: + attrValue.append(c.lower()) + elif c is None: + return None + else: + attrValue.append(c) + + +class ContentAttrParser(object): + def __init__(self, data): + assert isinstance(data, bytes) + self.data = data + + def parse(self): + try: + # Check if the attr name is charset + # otherwise return + self.data.jumpTo(b"charset") + self.data.position += 1 + self.data.skip() + if not self.data.currentByte == b"=": + # If there is no = sign keep looking for attrs + return None + self.data.position += 1 + self.data.skip() + # Look for an encoding between matching quote marks + if self.data.currentByte in (b'"', b"'"): + quoteMark = self.data.currentByte + self.data.position += 1 + oldPosition = self.data.position + if self.data.jumpTo(quoteMark): + return self.data[oldPosition:self.data.position] + else: + return None + else: + # Unquoted value + oldPosition = self.data.position + try: + self.data.skipUntil(spaceCharactersBytes) + return self.data[oldPosition:self.data.position] + except StopIteration: + # Return the whole remaining value + return self.data[oldPosition:] + except StopIteration: + return None + + +def lookupEncoding(encoding): + """Return the python codec name corresponding to an encoding or None if the + string doesn't correspond to a valid encoding.""" + if isinstance(encoding, binary_type): + try: + encoding = encoding.decode("ascii") + except UnicodeDecodeError: + return None + + if encoding is not None: + try: + return webencodings.lookup(encoding) + except AttributeError: + return None + else: + return None diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/_inputstream.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/_inputstream.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9f3dd7332d5a257c8e0484ac605ae2b43c371936 GIT binary patch literal 30522 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 literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/_tokenizer 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/_tokenizer 2.py new file mode 100644 index 0000000..178f6e7 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/_tokenizer 2.py @@ -0,0 +1,1721 @@ +from __future__ import absolute_import, division, unicode_literals + +from pip._vendor.six import unichr as chr + +from collections import deque + +from .constants import spaceCharacters +from .constants import entities +from .constants import asciiLetters, asciiUpper2Lower +from .constants import digits, hexDigits, EOF +from .constants import tokenTypes, tagTokenTypes +from .constants import replacementCharacters + +from ._inputstream import HTMLInputStream + +from ._trie import Trie + +entitiesTrie = Trie(entities) + + +class HTMLTokenizer(object): + """ This class takes care of tokenizing HTML. + + * self.currentToken + Holds the token that is currently being processed. + + * self.state + Holds a reference to the method to be invoked... XXX + + * self.stream + Points to HTMLInputStream object. + """ + + def __init__(self, stream, parser=None, **kwargs): + + self.stream = HTMLInputStream(stream, **kwargs) + self.parser = parser + + # Setup the initial tokenizer state + self.escapeFlag = False + self.lastFourChars = [] + self.state = self.dataState + self.escape = False + + # The current token being created + self.currentToken = None + super(HTMLTokenizer, self).__init__() + + def __iter__(self): + """ This is where the magic happens. + + We do our usually processing through the states and when we have a token + to return we yield the token which pauses processing until the next token + is requested. + """ + self.tokenQueue = deque([]) + # Start processing. When EOF is reached self.state will return False + # instead of True and the loop will terminate. + while self.state(): + while self.stream.errors: + yield {"type": tokenTypes["ParseError"], "data": self.stream.errors.pop(0)} + while self.tokenQueue: + yield self.tokenQueue.popleft() + + def consumeNumberEntity(self, isHex): + """This function returns either U+FFFD or the character based on the + decimal or hexadecimal representation. It also discards ";" if present. + If not present self.tokenQueue.append({"type": tokenTypes["ParseError"]}) is invoked. + """ + + allowed = digits + radix = 10 + if isHex: + allowed = hexDigits + radix = 16 + + charStack = [] + + # Consume all the characters that are in range while making sure we + # don't hit an EOF. + c = self.stream.char() + while c in allowed and c is not EOF: + charStack.append(c) + c = self.stream.char() + + # Convert the set of characters consumed to an int. + charAsInt = int("".join(charStack), radix) + + # Certain characters get replaced with others + if charAsInt in replacementCharacters: + char = replacementCharacters[charAsInt] + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "illegal-codepoint-for-numeric-entity", + "datavars": {"charAsInt": charAsInt}}) + elif ((0xD800 <= charAsInt <= 0xDFFF) or + (charAsInt > 0x10FFFF)): + char = "\uFFFD" + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "illegal-codepoint-for-numeric-entity", + "datavars": {"charAsInt": charAsInt}}) + else: + # Should speed up this check somehow (e.g. move the set to a constant) + if ((0x0001 <= charAsInt <= 0x0008) or + (0x000E <= charAsInt <= 0x001F) or + (0x007F <= charAsInt <= 0x009F) or + (0xFDD0 <= charAsInt <= 0xFDEF) or + charAsInt in frozenset([0x000B, 0xFFFE, 0xFFFF, 0x1FFFE, + 0x1FFFF, 0x2FFFE, 0x2FFFF, 0x3FFFE, + 0x3FFFF, 0x4FFFE, 0x4FFFF, 0x5FFFE, + 0x5FFFF, 0x6FFFE, 0x6FFFF, 0x7FFFE, + 0x7FFFF, 0x8FFFE, 0x8FFFF, 0x9FFFE, + 0x9FFFF, 0xAFFFE, 0xAFFFF, 0xBFFFE, + 0xBFFFF, 0xCFFFE, 0xCFFFF, 0xDFFFE, + 0xDFFFF, 0xEFFFE, 0xEFFFF, 0xFFFFE, + 0xFFFFF, 0x10FFFE, 0x10FFFF])): + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": + "illegal-codepoint-for-numeric-entity", + "datavars": {"charAsInt": charAsInt}}) + try: + # Try/except needed as UCS-2 Python builds' unichar only works + # within the BMP. + char = chr(charAsInt) + except ValueError: + v = charAsInt - 0x10000 + char = chr(0xD800 | (v >> 10)) + chr(0xDC00 | (v & 0x3FF)) + + # Discard the ; if present. Otherwise, put it back on the queue and + # invoke parseError on parser. + if c != ";": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "numeric-entity-without-semicolon"}) + self.stream.unget(c) + + return char + + def consumeEntity(self, allowedChar=None, fromAttribute=False): + # Initialise to the default output for when no entity is matched + output = "&" + + charStack = [self.stream.char()] + if (charStack[0] in spaceCharacters or charStack[0] in (EOF, "<", "&") or + (allowedChar is not None and allowedChar == charStack[0])): + self.stream.unget(charStack[0]) + + elif charStack[0] == "#": + # Read the next character to see if it's hex or decimal + hex = False + charStack.append(self.stream.char()) + if charStack[-1] in ("x", "X"): + hex = True + charStack.append(self.stream.char()) + + # charStack[-1] should be the first digit + if (hex and charStack[-1] in hexDigits) \ + or (not hex and charStack[-1] in digits): + # At least one digit found, so consume the whole number + self.stream.unget(charStack[-1]) + output = self.consumeNumberEntity(hex) + else: + # No digits found + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "expected-numeric-entity"}) + self.stream.unget(charStack.pop()) + output = "&" + "".join(charStack) + + else: + # At this point in the process might have named entity. Entities + # are stored in the global variable "entities". + # + # Consume characters and compare to these to a substring of the + # entity names in the list until the substring no longer matches. + while (charStack[-1] is not EOF): + if not entitiesTrie.has_keys_with_prefix("".join(charStack)): + break + charStack.append(self.stream.char()) + + # At this point we have a string that starts with some characters + # that may match an entity + # Try to find the longest entity the string will match to take care + # of ¬i for instance. + try: + entityName = entitiesTrie.longest_prefix("".join(charStack[:-1])) + entityLength = len(entityName) + except KeyError: + entityName = None + + if entityName is not None: + if entityName[-1] != ";": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "named-entity-without-semicolon"}) + if (entityName[-1] != ";" and fromAttribute and + (charStack[entityLength] in asciiLetters or + charStack[entityLength] in digits or + charStack[entityLength] == "=")): + self.stream.unget(charStack.pop()) + output = "&" + "".join(charStack) + else: + output = entities[entityName] + self.stream.unget(charStack.pop()) + output += "".join(charStack[entityLength:]) + else: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-named-entity"}) + self.stream.unget(charStack.pop()) + output = "&" + "".join(charStack) + + if fromAttribute: + self.currentToken["data"][-1][1] += output + else: + if output in spaceCharacters: + tokenType = "SpaceCharacters" + else: + tokenType = "Characters" + self.tokenQueue.append({"type": tokenTypes[tokenType], "data": output}) + + def processEntityInAttribute(self, allowedChar): + """This method replaces the need for "entityInAttributeValueState". + """ + self.consumeEntity(allowedChar=allowedChar, fromAttribute=True) + + def emitCurrentToken(self): + """This method is a generic handler for emitting the tags. It also sets + the state to "data" because that's what's needed after a token has been + emitted. + """ + token = self.currentToken + # Add token to the queue to be yielded + if (token["type"] in tagTokenTypes): + token["name"] = token["name"].translate(asciiUpper2Lower) + if token["type"] == tokenTypes["EndTag"]: + if token["data"]: + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "attributes-in-end-tag"}) + if token["selfClosing"]: + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "self-closing-flag-on-end-tag"}) + self.tokenQueue.append(token) + self.state = self.dataState + + # Below are the various tokenizer states worked out. + def dataState(self): + data = self.stream.char() + if data == "&": + self.state = self.entityDataState + elif data == "<": + self.state = self.tagOpenState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\u0000"}) + elif data is EOF: + # Tokenization ends. + return False + elif data in spaceCharacters: + # Directly after emitting a token you switch back to the "data + # state". At that point spaceCharacters are important so they are + # emitted separately. + self.tokenQueue.append({"type": tokenTypes["SpaceCharacters"], "data": + data + self.stream.charsUntil(spaceCharacters, True)}) + # No need to update lastFourChars here, since the first space will + # have already been appended to lastFourChars and will have broken + # any sequences + else: + chars = self.stream.charsUntil(("&", "<", "\u0000")) + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": + data + chars}) + return True + + def entityDataState(self): + self.consumeEntity() + self.state = self.dataState + return True + + def rcdataState(self): + data = self.stream.char() + if data == "&": + self.state = self.characterReferenceInRcdata + elif data == "<": + self.state = self.rcdataLessThanSignState + elif data == EOF: + # Tokenization ends. + return False + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\uFFFD"}) + elif data in spaceCharacters: + # Directly after emitting a token you switch back to the "data + # state". At that point spaceCharacters are important so they are + # emitted separately. + self.tokenQueue.append({"type": tokenTypes["SpaceCharacters"], "data": + data + self.stream.charsUntil(spaceCharacters, True)}) + # No need to update lastFourChars here, since the first space will + # have already been appended to lastFourChars and will have broken + # any sequences + else: + chars = self.stream.charsUntil(("&", "<", "\u0000")) + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": + data + chars}) + return True + + def characterReferenceInRcdata(self): + self.consumeEntity() + self.state = self.rcdataState + return True + + def rawtextState(self): + data = self.stream.char() + if data == "<": + self.state = self.rawtextLessThanSignState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\uFFFD"}) + elif data == EOF: + # Tokenization ends. + return False + else: + chars = self.stream.charsUntil(("<", "\u0000")) + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": + data + chars}) + return True + + def scriptDataState(self): + data = self.stream.char() + if data == "<": + self.state = self.scriptDataLessThanSignState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\uFFFD"}) + elif data == EOF: + # Tokenization ends. + return False + else: + chars = self.stream.charsUntil(("<", "\u0000")) + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": + data + chars}) + return True + + def plaintextState(self): + data = self.stream.char() + if data == EOF: + # Tokenization ends. + return False + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\uFFFD"}) + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": + data + self.stream.charsUntil("\u0000")}) + return True + + def tagOpenState(self): + data = self.stream.char() + if data == "!": + self.state = self.markupDeclarationOpenState + elif data == "/": + self.state = self.closeTagOpenState + elif data in asciiLetters: + self.currentToken = {"type": tokenTypes["StartTag"], + "name": data, "data": [], + "selfClosing": False, + "selfClosingAcknowledged": False} + self.state = self.tagNameState + elif data == ">": + # XXX In theory it could be something besides a tag name. But + # do we really care? + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-tag-name-but-got-right-bracket"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<>"}) + self.state = self.dataState + elif data == "?": + # XXX In theory it could be something besides a tag name. But + # do we really care? + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-tag-name-but-got-question-mark"}) + self.stream.unget(data) + self.state = self.bogusCommentState + else: + # XXX + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-tag-name"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) + self.stream.unget(data) + self.state = self.dataState + return True + + def closeTagOpenState(self): + data = self.stream.char() + if data in asciiLetters: + self.currentToken = {"type": tokenTypes["EndTag"], "name": data, + "data": [], "selfClosing": False} + self.state = self.tagNameState + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-closing-tag-but-got-right-bracket"}) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-closing-tag-but-got-eof"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "": + self.emitCurrentToken() + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-tag-name"}) + self.state = self.dataState + elif data == "/": + self.state = self.selfClosingStartTagState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["name"] += "\uFFFD" + else: + self.currentToken["name"] += data + # (Don't use charsUntil here, because tag names are + # very short and it's faster to not do anything fancy) + return True + + def rcdataLessThanSignState(self): + data = self.stream.char() + if data == "/": + self.temporaryBuffer = "" + self.state = self.rcdataEndTagOpenState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) + self.stream.unget(data) + self.state = self.rcdataState + return True + + def rcdataEndTagOpenState(self): + data = self.stream.char() + if data in asciiLetters: + self.temporaryBuffer += data + self.state = self.rcdataEndTagNameState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "" and appropriate: + self.currentToken = {"type": tokenTypes["EndTag"], + "name": self.temporaryBuffer, + "data": [], "selfClosing": False} + self.emitCurrentToken() + self.state = self.dataState + elif data in asciiLetters: + self.temporaryBuffer += data + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "" and appropriate: + self.currentToken = {"type": tokenTypes["EndTag"], + "name": self.temporaryBuffer, + "data": [], "selfClosing": False} + self.emitCurrentToken() + self.state = self.dataState + elif data in asciiLetters: + self.temporaryBuffer += data + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "" and appropriate: + self.currentToken = {"type": tokenTypes["EndTag"], + "name": self.temporaryBuffer, + "data": [], "selfClosing": False} + self.emitCurrentToken() + self.state = self.dataState + elif data in asciiLetters: + self.temporaryBuffer += data + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": ">"}) + self.state = self.scriptDataState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\uFFFD"}) + self.state = self.scriptDataEscapedState + elif data == EOF: + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) + self.state = self.scriptDataEscapedState + return True + + def scriptDataEscapedLessThanSignState(self): + data = self.stream.char() + if data == "/": + self.temporaryBuffer = "" + self.state = self.scriptDataEscapedEndTagOpenState + elif data in asciiLetters: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<" + data}) + self.temporaryBuffer = data + self.state = self.scriptDataDoubleEscapeStartState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) + self.stream.unget(data) + self.state = self.scriptDataEscapedState + return True + + def scriptDataEscapedEndTagOpenState(self): + data = self.stream.char() + if data in asciiLetters: + self.temporaryBuffer = data + self.state = self.scriptDataEscapedEndTagNameState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "" and appropriate: + self.currentToken = {"type": tokenTypes["EndTag"], + "name": self.temporaryBuffer, + "data": [], "selfClosing": False} + self.emitCurrentToken() + self.state = self.dataState + elif data in asciiLetters: + self.temporaryBuffer += data + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": ""))): + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) + if self.temporaryBuffer.lower() == "script": + self.state = self.scriptDataDoubleEscapedState + else: + self.state = self.scriptDataEscapedState + elif data in asciiLetters: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) + self.temporaryBuffer += data + else: + self.stream.unget(data) + self.state = self.scriptDataEscapedState + return True + + def scriptDataDoubleEscapedState(self): + data = self.stream.char() + if data == "-": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"}) + self.state = self.scriptDataDoubleEscapedDashState + elif data == "<": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) + self.state = self.scriptDataDoubleEscapedLessThanSignState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\uFFFD"}) + elif data == EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-script-in-script"}) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) + return True + + def scriptDataDoubleEscapedDashState(self): + data = self.stream.char() + if data == "-": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"}) + self.state = self.scriptDataDoubleEscapedDashDashState + elif data == "<": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) + self.state = self.scriptDataDoubleEscapedLessThanSignState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\uFFFD"}) + self.state = self.scriptDataDoubleEscapedState + elif data == EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-script-in-script"}) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) + self.state = self.scriptDataDoubleEscapedState + return True + + def scriptDataDoubleEscapedDashDashState(self): + data = self.stream.char() + if data == "-": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"}) + elif data == "<": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) + self.state = self.scriptDataDoubleEscapedLessThanSignState + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": ">"}) + self.state = self.scriptDataState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\uFFFD"}) + self.state = self.scriptDataDoubleEscapedState + elif data == EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-script-in-script"}) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) + self.state = self.scriptDataDoubleEscapedState + return True + + def scriptDataDoubleEscapedLessThanSignState(self): + data = self.stream.char() + if data == "/": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "/"}) + self.temporaryBuffer = "" + self.state = self.scriptDataDoubleEscapeEndState + else: + self.stream.unget(data) + self.state = self.scriptDataDoubleEscapedState + return True + + def scriptDataDoubleEscapeEndState(self): + data = self.stream.char() + if data in (spaceCharacters | frozenset(("/", ">"))): + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) + if self.temporaryBuffer.lower() == "script": + self.state = self.scriptDataEscapedState + else: + self.state = self.scriptDataDoubleEscapedState + elif data in asciiLetters: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) + self.temporaryBuffer += data + else: + self.stream.unget(data) + self.state = self.scriptDataDoubleEscapedState + return True + + def beforeAttributeNameState(self): + data = self.stream.char() + if data in spaceCharacters: + self.stream.charsUntil(spaceCharacters, True) + elif data in asciiLetters: + self.currentToken["data"].append([data, ""]) + self.state = self.attributeNameState + elif data == ">": + self.emitCurrentToken() + elif data == "/": + self.state = self.selfClosingStartTagState + elif data in ("'", '"', "=", "<"): + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "invalid-character-in-attribute-name"}) + self.currentToken["data"].append([data, ""]) + self.state = self.attributeNameState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"].append(["\uFFFD", ""]) + self.state = self.attributeNameState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-attribute-name-but-got-eof"}) + self.state = self.dataState + else: + self.currentToken["data"].append([data, ""]) + self.state = self.attributeNameState + return True + + def attributeNameState(self): + data = self.stream.char() + leavingThisState = True + emitToken = False + if data == "=": + self.state = self.beforeAttributeValueState + elif data in asciiLetters: + self.currentToken["data"][-1][0] += data +\ + self.stream.charsUntil(asciiLetters, True) + leavingThisState = False + elif data == ">": + # XXX If we emit here the attributes are converted to a dict + # without being checked and when the code below runs we error + # because data is a dict not a list + emitToken = True + elif data in spaceCharacters: + self.state = self.afterAttributeNameState + elif data == "/": + self.state = self.selfClosingStartTagState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"][-1][0] += "\uFFFD" + leavingThisState = False + elif data in ("'", '"', "<"): + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": + "invalid-character-in-attribute-name"}) + self.currentToken["data"][-1][0] += data + leavingThisState = False + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "eof-in-attribute-name"}) + self.state = self.dataState + else: + self.currentToken["data"][-1][0] += data + leavingThisState = False + + if leavingThisState: + # Attributes are not dropped at this stage. That happens when the + # start tag token is emitted so values can still be safely appended + # to attributes, but we do want to report the parse error in time. + self.currentToken["data"][-1][0] = ( + self.currentToken["data"][-1][0].translate(asciiUpper2Lower)) + for name, _ in self.currentToken["data"][:-1]: + if self.currentToken["data"][-1][0] == name: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "duplicate-attribute"}) + break + # XXX Fix for above XXX + if emitToken: + self.emitCurrentToken() + return True + + def afterAttributeNameState(self): + data = self.stream.char() + if data in spaceCharacters: + self.stream.charsUntil(spaceCharacters, True) + elif data == "=": + self.state = self.beforeAttributeValueState + elif data == ">": + self.emitCurrentToken() + elif data in asciiLetters: + self.currentToken["data"].append([data, ""]) + self.state = self.attributeNameState + elif data == "/": + self.state = self.selfClosingStartTagState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"].append(["\uFFFD", ""]) + self.state = self.attributeNameState + elif data in ("'", '"', "<"): + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "invalid-character-after-attribute-name"}) + self.currentToken["data"].append([data, ""]) + self.state = self.attributeNameState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-end-of-tag-but-got-eof"}) + self.state = self.dataState + else: + self.currentToken["data"].append([data, ""]) + self.state = self.attributeNameState + return True + + def beforeAttributeValueState(self): + data = self.stream.char() + if data in spaceCharacters: + self.stream.charsUntil(spaceCharacters, True) + elif data == "\"": + self.state = self.attributeValueDoubleQuotedState + elif data == "&": + self.state = self.attributeValueUnQuotedState + self.stream.unget(data) + elif data == "'": + self.state = self.attributeValueSingleQuotedState + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-attribute-value-but-got-right-bracket"}) + self.emitCurrentToken() + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"][-1][1] += "\uFFFD" + self.state = self.attributeValueUnQuotedState + elif data in ("=", "<", "`"): + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "equals-in-unquoted-attribute-value"}) + self.currentToken["data"][-1][1] += data + self.state = self.attributeValueUnQuotedState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-attribute-value-but-got-eof"}) + self.state = self.dataState + else: + self.currentToken["data"][-1][1] += data + self.state = self.attributeValueUnQuotedState + return True + + def attributeValueDoubleQuotedState(self): + data = self.stream.char() + if data == "\"": + self.state = self.afterAttributeValueState + elif data == "&": + self.processEntityInAttribute('"') + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"][-1][1] += "\uFFFD" + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-attribute-value-double-quote"}) + self.state = self.dataState + else: + self.currentToken["data"][-1][1] += data +\ + self.stream.charsUntil(("\"", "&", "\u0000")) + return True + + def attributeValueSingleQuotedState(self): + data = self.stream.char() + if data == "'": + self.state = self.afterAttributeValueState + elif data == "&": + self.processEntityInAttribute("'") + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"][-1][1] += "\uFFFD" + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-attribute-value-single-quote"}) + self.state = self.dataState + else: + self.currentToken["data"][-1][1] += data +\ + self.stream.charsUntil(("'", "&", "\u0000")) + return True + + def attributeValueUnQuotedState(self): + data = self.stream.char() + if data in spaceCharacters: + self.state = self.beforeAttributeNameState + elif data == "&": + self.processEntityInAttribute(">") + elif data == ">": + self.emitCurrentToken() + elif data in ('"', "'", "=", "<", "`"): + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-character-in-unquoted-attribute-value"}) + self.currentToken["data"][-1][1] += data + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"][-1][1] += "\uFFFD" + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-attribute-value-no-quotes"}) + self.state = self.dataState + else: + self.currentToken["data"][-1][1] += data + self.stream.charsUntil( + frozenset(("&", ">", '"', "'", "=", "<", "`", "\u0000")) | spaceCharacters) + return True + + def afterAttributeValueState(self): + data = self.stream.char() + if data in spaceCharacters: + self.state = self.beforeAttributeNameState + elif data == ">": + self.emitCurrentToken() + elif data == "/": + self.state = self.selfClosingStartTagState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-EOF-after-attribute-value"}) + self.stream.unget(data) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-character-after-attribute-value"}) + self.stream.unget(data) + self.state = self.beforeAttributeNameState + return True + + def selfClosingStartTagState(self): + data = self.stream.char() + if data == ">": + self.currentToken["selfClosing"] = True + self.emitCurrentToken() + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": + "unexpected-EOF-after-solidus-in-tag"}) + self.stream.unget(data) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-character-after-solidus-in-tag"}) + self.stream.unget(data) + self.state = self.beforeAttributeNameState + return True + + def bogusCommentState(self): + # Make a new comment token and give it as value all the characters + # until the first > or EOF (charsUntil checks for EOF automatically) + # and emit it. + data = self.stream.charsUntil(">") + data = data.replace("\u0000", "\uFFFD") + self.tokenQueue.append( + {"type": tokenTypes["Comment"], "data": data}) + + # Eat the character directly after the bogus comment which is either a + # ">" or an EOF. + self.stream.char() + self.state = self.dataState + return True + + def markupDeclarationOpenState(self): + charStack = [self.stream.char()] + if charStack[-1] == "-": + charStack.append(self.stream.char()) + if charStack[-1] == "-": + self.currentToken = {"type": tokenTypes["Comment"], "data": ""} + self.state = self.commentStartState + return True + elif charStack[-1] in ('d', 'D'): + matched = True + for expected in (('o', 'O'), ('c', 'C'), ('t', 'T'), + ('y', 'Y'), ('p', 'P'), ('e', 'E')): + charStack.append(self.stream.char()) + if charStack[-1] not in expected: + matched = False + break + if matched: + self.currentToken = {"type": tokenTypes["Doctype"], + "name": "", + "publicId": None, "systemId": None, + "correct": True} + self.state = self.doctypeState + return True + elif (charStack[-1] == "[" and + self.parser is not None and + self.parser.tree.openElements and + self.parser.tree.openElements[-1].namespace != self.parser.tree.defaultNamespace): + matched = True + for expected in ["C", "D", "A", "T", "A", "["]: + charStack.append(self.stream.char()) + if charStack[-1] != expected: + matched = False + break + if matched: + self.state = self.cdataSectionState + return True + + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-dashes-or-doctype"}) + + while charStack: + self.stream.unget(charStack.pop()) + self.state = self.bogusCommentState + return True + + def commentStartState(self): + data = self.stream.char() + if data == "-": + self.state = self.commentStartDashState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"] += "\uFFFD" + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "incorrect-comment"}) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-comment"}) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["data"] += data + self.state = self.commentState + return True + + def commentStartDashState(self): + data = self.stream.char() + if data == "-": + self.state = self.commentEndState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"] += "-\uFFFD" + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "incorrect-comment"}) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-comment"}) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["data"] += "-" + data + self.state = self.commentState + return True + + def commentState(self): + data = self.stream.char() + if data == "-": + self.state = self.commentEndDashState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"] += "\uFFFD" + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "eof-in-comment"}) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["data"] += data + \ + self.stream.charsUntil(("-", "\u0000")) + return True + + def commentEndDashState(self): + data = self.stream.char() + if data == "-": + self.state = self.commentEndState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"] += "-\uFFFD" + self.state = self.commentState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-comment-end-dash"}) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["data"] += "-" + data + self.state = self.commentState + return True + + def commentEndState(self): + data = self.stream.char() + if data == ">": + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"] += "--\uFFFD" + self.state = self.commentState + elif data == "!": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-bang-after-double-dash-in-comment"}) + self.state = self.commentEndBangState + elif data == "-": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-dash-after-double-dash-in-comment"}) + self.currentToken["data"] += data + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-comment-double-dash"}) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + # XXX + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-comment"}) + self.currentToken["data"] += "--" + data + self.state = self.commentState + return True + + def commentEndBangState(self): + data = self.stream.char() + if data == ">": + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data == "-": + self.currentToken["data"] += "--!" + self.state = self.commentEndDashState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"] += "--!\uFFFD" + self.state = self.commentState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-comment-end-bang-state"}) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["data"] += "--!" + data + self.state = self.commentState + return True + + def doctypeState(self): + data = self.stream.char() + if data in spaceCharacters: + self.state = self.beforeDoctypeNameState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-doctype-name-but-got-eof"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "need-space-after-doctype"}) + self.stream.unget(data) + self.state = self.beforeDoctypeNameState + return True + + def beforeDoctypeNameState(self): + data = self.stream.char() + if data in spaceCharacters: + pass + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-doctype-name-but-got-right-bracket"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["name"] = "\uFFFD" + self.state = self.doctypeNameState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-doctype-name-but-got-eof"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["name"] = data + self.state = self.doctypeNameState + return True + + def doctypeNameState(self): + data = self.stream.char() + if data in spaceCharacters: + self.currentToken["name"] = self.currentToken["name"].translate(asciiUpper2Lower) + self.state = self.afterDoctypeNameState + elif data == ">": + self.currentToken["name"] = self.currentToken["name"].translate(asciiUpper2Lower) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["name"] += "\uFFFD" + self.state = self.doctypeNameState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype-name"}) + self.currentToken["correct"] = False + self.currentToken["name"] = self.currentToken["name"].translate(asciiUpper2Lower) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["name"] += data + return True + + def afterDoctypeNameState(self): + data = self.stream.char() + if data in spaceCharacters: + pass + elif data == ">": + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.currentToken["correct"] = False + self.stream.unget(data) + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + if data in ("p", "P"): + matched = True + for expected in (("u", "U"), ("b", "B"), ("l", "L"), + ("i", "I"), ("c", "C")): + data = self.stream.char() + if data not in expected: + matched = False + break + if matched: + self.state = self.afterDoctypePublicKeywordState + return True + elif data in ("s", "S"): + matched = True + for expected in (("y", "Y"), ("s", "S"), ("t", "T"), + ("e", "E"), ("m", "M")): + data = self.stream.char() + if data not in expected: + matched = False + break + if matched: + self.state = self.afterDoctypeSystemKeywordState + return True + + # All the characters read before the current 'data' will be + # [a-zA-Z], so they're garbage in the bogus doctype and can be + # discarded; only the latest character might be '>' or EOF + # and needs to be ungetted + self.stream.unget(data) + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-space-or-right-bracket-in-doctype", "datavars": + {"data": data}}) + self.currentToken["correct"] = False + self.state = self.bogusDoctypeState + + return True + + def afterDoctypePublicKeywordState(self): + data = self.stream.char() + if data in spaceCharacters: + self.state = self.beforeDoctypePublicIdentifierState + elif data in ("'", '"'): + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.stream.unget(data) + self.state = self.beforeDoctypePublicIdentifierState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.stream.unget(data) + self.state = self.beforeDoctypePublicIdentifierState + return True + + def beforeDoctypePublicIdentifierState(self): + data = self.stream.char() + if data in spaceCharacters: + pass + elif data == "\"": + self.currentToken["publicId"] = "" + self.state = self.doctypePublicIdentifierDoubleQuotedState + elif data == "'": + self.currentToken["publicId"] = "" + self.state = self.doctypePublicIdentifierSingleQuotedState + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-end-of-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.currentToken["correct"] = False + self.state = self.bogusDoctypeState + return True + + def doctypePublicIdentifierDoubleQuotedState(self): + data = self.stream.char() + if data == "\"": + self.state = self.afterDoctypePublicIdentifierState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["publicId"] += "\uFFFD" + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-end-of-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["publicId"] += data + return True + + def doctypePublicIdentifierSingleQuotedState(self): + data = self.stream.char() + if data == "'": + self.state = self.afterDoctypePublicIdentifierState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["publicId"] += "\uFFFD" + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-end-of-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["publicId"] += data + return True + + def afterDoctypePublicIdentifierState(self): + data = self.stream.char() + if data in spaceCharacters: + self.state = self.betweenDoctypePublicAndSystemIdentifiersState + elif data == ">": + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data == '"': + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.currentToken["systemId"] = "" + self.state = self.doctypeSystemIdentifierDoubleQuotedState + elif data == "'": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.currentToken["systemId"] = "" + self.state = self.doctypeSystemIdentifierSingleQuotedState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.currentToken["correct"] = False + self.state = self.bogusDoctypeState + return True + + def betweenDoctypePublicAndSystemIdentifiersState(self): + data = self.stream.char() + if data in spaceCharacters: + pass + elif data == ">": + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data == '"': + self.currentToken["systemId"] = "" + self.state = self.doctypeSystemIdentifierDoubleQuotedState + elif data == "'": + self.currentToken["systemId"] = "" + self.state = self.doctypeSystemIdentifierSingleQuotedState + elif data == EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.currentToken["correct"] = False + self.state = self.bogusDoctypeState + return True + + def afterDoctypeSystemKeywordState(self): + data = self.stream.char() + if data in spaceCharacters: + self.state = self.beforeDoctypeSystemIdentifierState + elif data in ("'", '"'): + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.stream.unget(data) + self.state = self.beforeDoctypeSystemIdentifierState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.stream.unget(data) + self.state = self.beforeDoctypeSystemIdentifierState + return True + + def beforeDoctypeSystemIdentifierState(self): + data = self.stream.char() + if data in spaceCharacters: + pass + elif data == "\"": + self.currentToken["systemId"] = "" + self.state = self.doctypeSystemIdentifierDoubleQuotedState + elif data == "'": + self.currentToken["systemId"] = "" + self.state = self.doctypeSystemIdentifierSingleQuotedState + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.currentToken["correct"] = False + self.state = self.bogusDoctypeState + return True + + def doctypeSystemIdentifierDoubleQuotedState(self): + data = self.stream.char() + if data == "\"": + self.state = self.afterDoctypeSystemIdentifierState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["systemId"] += "\uFFFD" + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-end-of-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["systemId"] += data + return True + + def doctypeSystemIdentifierSingleQuotedState(self): + data = self.stream.char() + if data == "'": + self.state = self.afterDoctypeSystemIdentifierState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["systemId"] += "\uFFFD" + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-end-of-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["systemId"] += data + return True + + def afterDoctypeSystemIdentifierState(self): + data = self.stream.char() + if data in spaceCharacters: + pass + elif data == ">": + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.state = self.bogusDoctypeState + return True + + def bogusDoctypeState(self): + data = self.stream.char() + if data == ">": + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + # XXX EMIT + self.stream.unget(data) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + pass + return True + + def cdataSectionState(self): + data = [] + while True: + data.append(self.stream.charsUntil("]")) + data.append(self.stream.charsUntil(">")) + char = self.stream.char() + if char == EOF: + break + else: + assert char == ">" + if data[-1][-2:] == "]]": + data[-1] = data[-1][:-2] + break + else: + data.append(char) + + data = "".join(data) # pylint:disable=redefined-variable-type + # Deal with null here rather than in the parser + nullCount = data.count("\u0000") + if nullCount > 0: + for _ in range(nullCount): + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + data = data.replace("\u0000", "\uFFFD") + if data: + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": data}) + self.state = self.dataState + return True diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/_tokenizer 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/_tokenizer 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c3933cfd4c40be09d533dd7ca2ec2d14cd61fb3e GIT binary patch literal 57395 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¯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 0x10FFFF)): + char = "\uFFFD" + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "illegal-codepoint-for-numeric-entity", + "datavars": {"charAsInt": charAsInt}}) + else: + # Should speed up this check somehow (e.g. move the set to a constant) + if ((0x0001 <= charAsInt <= 0x0008) or + (0x000E <= charAsInt <= 0x001F) or + (0x007F <= charAsInt <= 0x009F) or + (0xFDD0 <= charAsInt <= 0xFDEF) or + charAsInt in frozenset([0x000B, 0xFFFE, 0xFFFF, 0x1FFFE, + 0x1FFFF, 0x2FFFE, 0x2FFFF, 0x3FFFE, + 0x3FFFF, 0x4FFFE, 0x4FFFF, 0x5FFFE, + 0x5FFFF, 0x6FFFE, 0x6FFFF, 0x7FFFE, + 0x7FFFF, 0x8FFFE, 0x8FFFF, 0x9FFFE, + 0x9FFFF, 0xAFFFE, 0xAFFFF, 0xBFFFE, + 0xBFFFF, 0xCFFFE, 0xCFFFF, 0xDFFFE, + 0xDFFFF, 0xEFFFE, 0xEFFFF, 0xFFFFE, + 0xFFFFF, 0x10FFFE, 0x10FFFF])): + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": + "illegal-codepoint-for-numeric-entity", + "datavars": {"charAsInt": charAsInt}}) + try: + # Try/except needed as UCS-2 Python builds' unichar only works + # within the BMP. + char = chr(charAsInt) + except ValueError: + v = charAsInt - 0x10000 + char = chr(0xD800 | (v >> 10)) + chr(0xDC00 | (v & 0x3FF)) + + # Discard the ; if present. Otherwise, put it back on the queue and + # invoke parseError on parser. + if c != ";": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "numeric-entity-without-semicolon"}) + self.stream.unget(c) + + return char + + def consumeEntity(self, allowedChar=None, fromAttribute=False): + # Initialise to the default output for when no entity is matched + output = "&" + + charStack = [self.stream.char()] + if (charStack[0] in spaceCharacters or charStack[0] in (EOF, "<", "&") or + (allowedChar is not None and allowedChar == charStack[0])): + self.stream.unget(charStack[0]) + + elif charStack[0] == "#": + # Read the next character to see if it's hex or decimal + hex = False + charStack.append(self.stream.char()) + if charStack[-1] in ("x", "X"): + hex = True + charStack.append(self.stream.char()) + + # charStack[-1] should be the first digit + if (hex and charStack[-1] in hexDigits) \ + or (not hex and charStack[-1] in digits): + # At least one digit found, so consume the whole number + self.stream.unget(charStack[-1]) + output = self.consumeNumberEntity(hex) + else: + # No digits found + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "expected-numeric-entity"}) + self.stream.unget(charStack.pop()) + output = "&" + "".join(charStack) + + else: + # At this point in the process might have named entity. Entities + # are stored in the global variable "entities". + # + # Consume characters and compare to these to a substring of the + # entity names in the list until the substring no longer matches. + while (charStack[-1] is not EOF): + if not entitiesTrie.has_keys_with_prefix("".join(charStack)): + break + charStack.append(self.stream.char()) + + # At this point we have a string that starts with some characters + # that may match an entity + # Try to find the longest entity the string will match to take care + # of ¬i for instance. + try: + entityName = entitiesTrie.longest_prefix("".join(charStack[:-1])) + entityLength = len(entityName) + except KeyError: + entityName = None + + if entityName is not None: + if entityName[-1] != ";": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "named-entity-without-semicolon"}) + if (entityName[-1] != ";" and fromAttribute and + (charStack[entityLength] in asciiLetters or + charStack[entityLength] in digits or + charStack[entityLength] == "=")): + self.stream.unget(charStack.pop()) + output = "&" + "".join(charStack) + else: + output = entities[entityName] + self.stream.unget(charStack.pop()) + output += "".join(charStack[entityLength:]) + else: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-named-entity"}) + self.stream.unget(charStack.pop()) + output = "&" + "".join(charStack) + + if fromAttribute: + self.currentToken["data"][-1][1] += output + else: + if output in spaceCharacters: + tokenType = "SpaceCharacters" + else: + tokenType = "Characters" + self.tokenQueue.append({"type": tokenTypes[tokenType], "data": output}) + + def processEntityInAttribute(self, allowedChar): + """This method replaces the need for "entityInAttributeValueState". + """ + self.consumeEntity(allowedChar=allowedChar, fromAttribute=True) + + def emitCurrentToken(self): + """This method is a generic handler for emitting the tags. It also sets + the state to "data" because that's what's needed after a token has been + emitted. + """ + token = self.currentToken + # Add token to the queue to be yielded + if (token["type"] in tagTokenTypes): + token["name"] = token["name"].translate(asciiUpper2Lower) + if token["type"] == tokenTypes["EndTag"]: + if token["data"]: + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "attributes-in-end-tag"}) + if token["selfClosing"]: + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "self-closing-flag-on-end-tag"}) + self.tokenQueue.append(token) + self.state = self.dataState + + # Below are the various tokenizer states worked out. + def dataState(self): + data = self.stream.char() + if data == "&": + self.state = self.entityDataState + elif data == "<": + self.state = self.tagOpenState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\u0000"}) + elif data is EOF: + # Tokenization ends. + return False + elif data in spaceCharacters: + # Directly after emitting a token you switch back to the "data + # state". At that point spaceCharacters are important so they are + # emitted separately. + self.tokenQueue.append({"type": tokenTypes["SpaceCharacters"], "data": + data + self.stream.charsUntil(spaceCharacters, True)}) + # No need to update lastFourChars here, since the first space will + # have already been appended to lastFourChars and will have broken + # any sequences + else: + chars = self.stream.charsUntil(("&", "<", "\u0000")) + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": + data + chars}) + return True + + def entityDataState(self): + self.consumeEntity() + self.state = self.dataState + return True + + def rcdataState(self): + data = self.stream.char() + if data == "&": + self.state = self.characterReferenceInRcdata + elif data == "<": + self.state = self.rcdataLessThanSignState + elif data == EOF: + # Tokenization ends. + return False + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\uFFFD"}) + elif data in spaceCharacters: + # Directly after emitting a token you switch back to the "data + # state". At that point spaceCharacters are important so they are + # emitted separately. + self.tokenQueue.append({"type": tokenTypes["SpaceCharacters"], "data": + data + self.stream.charsUntil(spaceCharacters, True)}) + # No need to update lastFourChars here, since the first space will + # have already been appended to lastFourChars and will have broken + # any sequences + else: + chars = self.stream.charsUntil(("&", "<", "\u0000")) + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": + data + chars}) + return True + + def characterReferenceInRcdata(self): + self.consumeEntity() + self.state = self.rcdataState + return True + + def rawtextState(self): + data = self.stream.char() + if data == "<": + self.state = self.rawtextLessThanSignState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\uFFFD"}) + elif data == EOF: + # Tokenization ends. + return False + else: + chars = self.stream.charsUntil(("<", "\u0000")) + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": + data + chars}) + return True + + def scriptDataState(self): + data = self.stream.char() + if data == "<": + self.state = self.scriptDataLessThanSignState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\uFFFD"}) + elif data == EOF: + # Tokenization ends. + return False + else: + chars = self.stream.charsUntil(("<", "\u0000")) + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": + data + chars}) + return True + + def plaintextState(self): + data = self.stream.char() + if data == EOF: + # Tokenization ends. + return False + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\uFFFD"}) + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": + data + self.stream.charsUntil("\u0000")}) + return True + + def tagOpenState(self): + data = self.stream.char() + if data == "!": + self.state = self.markupDeclarationOpenState + elif data == "/": + self.state = self.closeTagOpenState + elif data in asciiLetters: + self.currentToken = {"type": tokenTypes["StartTag"], + "name": data, "data": [], + "selfClosing": False, + "selfClosingAcknowledged": False} + self.state = self.tagNameState + elif data == ">": + # XXX In theory it could be something besides a tag name. But + # do we really care? + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-tag-name-but-got-right-bracket"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<>"}) + self.state = self.dataState + elif data == "?": + # XXX In theory it could be something besides a tag name. But + # do we really care? + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-tag-name-but-got-question-mark"}) + self.stream.unget(data) + self.state = self.bogusCommentState + else: + # XXX + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-tag-name"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) + self.stream.unget(data) + self.state = self.dataState + return True + + def closeTagOpenState(self): + data = self.stream.char() + if data in asciiLetters: + self.currentToken = {"type": tokenTypes["EndTag"], "name": data, + "data": [], "selfClosing": False} + self.state = self.tagNameState + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-closing-tag-but-got-right-bracket"}) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-closing-tag-but-got-eof"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "": + self.emitCurrentToken() + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-tag-name"}) + self.state = self.dataState + elif data == "/": + self.state = self.selfClosingStartTagState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["name"] += "\uFFFD" + else: + self.currentToken["name"] += data + # (Don't use charsUntil here, because tag names are + # very short and it's faster to not do anything fancy) + return True + + def rcdataLessThanSignState(self): + data = self.stream.char() + if data == "/": + self.temporaryBuffer = "" + self.state = self.rcdataEndTagOpenState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) + self.stream.unget(data) + self.state = self.rcdataState + return True + + def rcdataEndTagOpenState(self): + data = self.stream.char() + if data in asciiLetters: + self.temporaryBuffer += data + self.state = self.rcdataEndTagNameState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "" and appropriate: + self.currentToken = {"type": tokenTypes["EndTag"], + "name": self.temporaryBuffer, + "data": [], "selfClosing": False} + self.emitCurrentToken() + self.state = self.dataState + elif data in asciiLetters: + self.temporaryBuffer += data + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "" and appropriate: + self.currentToken = {"type": tokenTypes["EndTag"], + "name": self.temporaryBuffer, + "data": [], "selfClosing": False} + self.emitCurrentToken() + self.state = self.dataState + elif data in asciiLetters: + self.temporaryBuffer += data + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "" and appropriate: + self.currentToken = {"type": tokenTypes["EndTag"], + "name": self.temporaryBuffer, + "data": [], "selfClosing": False} + self.emitCurrentToken() + self.state = self.dataState + elif data in asciiLetters: + self.temporaryBuffer += data + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": ">"}) + self.state = self.scriptDataState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\uFFFD"}) + self.state = self.scriptDataEscapedState + elif data == EOF: + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) + self.state = self.scriptDataEscapedState + return True + + def scriptDataEscapedLessThanSignState(self): + data = self.stream.char() + if data == "/": + self.temporaryBuffer = "" + self.state = self.scriptDataEscapedEndTagOpenState + elif data in asciiLetters: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<" + data}) + self.temporaryBuffer = data + self.state = self.scriptDataDoubleEscapeStartState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) + self.stream.unget(data) + self.state = self.scriptDataEscapedState + return True + + def scriptDataEscapedEndTagOpenState(self): + data = self.stream.char() + if data in asciiLetters: + self.temporaryBuffer = data + self.state = self.scriptDataEscapedEndTagNameState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "" and appropriate: + self.currentToken = {"type": tokenTypes["EndTag"], + "name": self.temporaryBuffer, + "data": [], "selfClosing": False} + self.emitCurrentToken() + self.state = self.dataState + elif data in asciiLetters: + self.temporaryBuffer += data + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": ""))): + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) + if self.temporaryBuffer.lower() == "script": + self.state = self.scriptDataDoubleEscapedState + else: + self.state = self.scriptDataEscapedState + elif data in asciiLetters: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) + self.temporaryBuffer += data + else: + self.stream.unget(data) + self.state = self.scriptDataEscapedState + return True + + def scriptDataDoubleEscapedState(self): + data = self.stream.char() + if data == "-": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"}) + self.state = self.scriptDataDoubleEscapedDashState + elif data == "<": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) + self.state = self.scriptDataDoubleEscapedLessThanSignState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\uFFFD"}) + elif data == EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-script-in-script"}) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) + return True + + def scriptDataDoubleEscapedDashState(self): + data = self.stream.char() + if data == "-": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"}) + self.state = self.scriptDataDoubleEscapedDashDashState + elif data == "<": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) + self.state = self.scriptDataDoubleEscapedLessThanSignState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\uFFFD"}) + self.state = self.scriptDataDoubleEscapedState + elif data == EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-script-in-script"}) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) + self.state = self.scriptDataDoubleEscapedState + return True + + def scriptDataDoubleEscapedDashDashState(self): + data = self.stream.char() + if data == "-": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"}) + elif data == "<": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) + self.state = self.scriptDataDoubleEscapedLessThanSignState + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": ">"}) + self.state = self.scriptDataState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\uFFFD"}) + self.state = self.scriptDataDoubleEscapedState + elif data == EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-script-in-script"}) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) + self.state = self.scriptDataDoubleEscapedState + return True + + def scriptDataDoubleEscapedLessThanSignState(self): + data = self.stream.char() + if data == "/": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "/"}) + self.temporaryBuffer = "" + self.state = self.scriptDataDoubleEscapeEndState + else: + self.stream.unget(data) + self.state = self.scriptDataDoubleEscapedState + return True + + def scriptDataDoubleEscapeEndState(self): + data = self.stream.char() + if data in (spaceCharacters | frozenset(("/", ">"))): + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) + if self.temporaryBuffer.lower() == "script": + self.state = self.scriptDataEscapedState + else: + self.state = self.scriptDataDoubleEscapedState + elif data in asciiLetters: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) + self.temporaryBuffer += data + else: + self.stream.unget(data) + self.state = self.scriptDataDoubleEscapedState + return True + + def beforeAttributeNameState(self): + data = self.stream.char() + if data in spaceCharacters: + self.stream.charsUntil(spaceCharacters, True) + elif data in asciiLetters: + self.currentToken["data"].append([data, ""]) + self.state = self.attributeNameState + elif data == ">": + self.emitCurrentToken() + elif data == "/": + self.state = self.selfClosingStartTagState + elif data in ("'", '"', "=", "<"): + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "invalid-character-in-attribute-name"}) + self.currentToken["data"].append([data, ""]) + self.state = self.attributeNameState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"].append(["\uFFFD", ""]) + self.state = self.attributeNameState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-attribute-name-but-got-eof"}) + self.state = self.dataState + else: + self.currentToken["data"].append([data, ""]) + self.state = self.attributeNameState + return True + + def attributeNameState(self): + data = self.stream.char() + leavingThisState = True + emitToken = False + if data == "=": + self.state = self.beforeAttributeValueState + elif data in asciiLetters: + self.currentToken["data"][-1][0] += data +\ + self.stream.charsUntil(asciiLetters, True) + leavingThisState = False + elif data == ">": + # XXX If we emit here the attributes are converted to a dict + # without being checked and when the code below runs we error + # because data is a dict not a list + emitToken = True + elif data in spaceCharacters: + self.state = self.afterAttributeNameState + elif data == "/": + self.state = self.selfClosingStartTagState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"][-1][0] += "\uFFFD" + leavingThisState = False + elif data in ("'", '"', "<"): + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": + "invalid-character-in-attribute-name"}) + self.currentToken["data"][-1][0] += data + leavingThisState = False + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "eof-in-attribute-name"}) + self.state = self.dataState + else: + self.currentToken["data"][-1][0] += data + leavingThisState = False + + if leavingThisState: + # Attributes are not dropped at this stage. That happens when the + # start tag token is emitted so values can still be safely appended + # to attributes, but we do want to report the parse error in time. + self.currentToken["data"][-1][0] = ( + self.currentToken["data"][-1][0].translate(asciiUpper2Lower)) + for name, _ in self.currentToken["data"][:-1]: + if self.currentToken["data"][-1][0] == name: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "duplicate-attribute"}) + break + # XXX Fix for above XXX + if emitToken: + self.emitCurrentToken() + return True + + def afterAttributeNameState(self): + data = self.stream.char() + if data in spaceCharacters: + self.stream.charsUntil(spaceCharacters, True) + elif data == "=": + self.state = self.beforeAttributeValueState + elif data == ">": + self.emitCurrentToken() + elif data in asciiLetters: + self.currentToken["data"].append([data, ""]) + self.state = self.attributeNameState + elif data == "/": + self.state = self.selfClosingStartTagState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"].append(["\uFFFD", ""]) + self.state = self.attributeNameState + elif data in ("'", '"', "<"): + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "invalid-character-after-attribute-name"}) + self.currentToken["data"].append([data, ""]) + self.state = self.attributeNameState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-end-of-tag-but-got-eof"}) + self.state = self.dataState + else: + self.currentToken["data"].append([data, ""]) + self.state = self.attributeNameState + return True + + def beforeAttributeValueState(self): + data = self.stream.char() + if data in spaceCharacters: + self.stream.charsUntil(spaceCharacters, True) + elif data == "\"": + self.state = self.attributeValueDoubleQuotedState + elif data == "&": + self.state = self.attributeValueUnQuotedState + self.stream.unget(data) + elif data == "'": + self.state = self.attributeValueSingleQuotedState + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-attribute-value-but-got-right-bracket"}) + self.emitCurrentToken() + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"][-1][1] += "\uFFFD" + self.state = self.attributeValueUnQuotedState + elif data in ("=", "<", "`"): + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "equals-in-unquoted-attribute-value"}) + self.currentToken["data"][-1][1] += data + self.state = self.attributeValueUnQuotedState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-attribute-value-but-got-eof"}) + self.state = self.dataState + else: + self.currentToken["data"][-1][1] += data + self.state = self.attributeValueUnQuotedState + return True + + def attributeValueDoubleQuotedState(self): + data = self.stream.char() + if data == "\"": + self.state = self.afterAttributeValueState + elif data == "&": + self.processEntityInAttribute('"') + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"][-1][1] += "\uFFFD" + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-attribute-value-double-quote"}) + self.state = self.dataState + else: + self.currentToken["data"][-1][1] += data +\ + self.stream.charsUntil(("\"", "&", "\u0000")) + return True + + def attributeValueSingleQuotedState(self): + data = self.stream.char() + if data == "'": + self.state = self.afterAttributeValueState + elif data == "&": + self.processEntityInAttribute("'") + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"][-1][1] += "\uFFFD" + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-attribute-value-single-quote"}) + self.state = self.dataState + else: + self.currentToken["data"][-1][1] += data +\ + self.stream.charsUntil(("'", "&", "\u0000")) + return True + + def attributeValueUnQuotedState(self): + data = self.stream.char() + if data in spaceCharacters: + self.state = self.beforeAttributeNameState + elif data == "&": + self.processEntityInAttribute(">") + elif data == ">": + self.emitCurrentToken() + elif data in ('"', "'", "=", "<", "`"): + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-character-in-unquoted-attribute-value"}) + self.currentToken["data"][-1][1] += data + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"][-1][1] += "\uFFFD" + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-attribute-value-no-quotes"}) + self.state = self.dataState + else: + self.currentToken["data"][-1][1] += data + self.stream.charsUntil( + frozenset(("&", ">", '"', "'", "=", "<", "`", "\u0000")) | spaceCharacters) + return True + + def afterAttributeValueState(self): + data = self.stream.char() + if data in spaceCharacters: + self.state = self.beforeAttributeNameState + elif data == ">": + self.emitCurrentToken() + elif data == "/": + self.state = self.selfClosingStartTagState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-EOF-after-attribute-value"}) + self.stream.unget(data) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-character-after-attribute-value"}) + self.stream.unget(data) + self.state = self.beforeAttributeNameState + return True + + def selfClosingStartTagState(self): + data = self.stream.char() + if data == ">": + self.currentToken["selfClosing"] = True + self.emitCurrentToken() + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": + "unexpected-EOF-after-solidus-in-tag"}) + self.stream.unget(data) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-character-after-solidus-in-tag"}) + self.stream.unget(data) + self.state = self.beforeAttributeNameState + return True + + def bogusCommentState(self): + # Make a new comment token and give it as value all the characters + # until the first > or EOF (charsUntil checks for EOF automatically) + # and emit it. + data = self.stream.charsUntil(">") + data = data.replace("\u0000", "\uFFFD") + self.tokenQueue.append( + {"type": tokenTypes["Comment"], "data": data}) + + # Eat the character directly after the bogus comment which is either a + # ">" or an EOF. + self.stream.char() + self.state = self.dataState + return True + + def markupDeclarationOpenState(self): + charStack = [self.stream.char()] + if charStack[-1] == "-": + charStack.append(self.stream.char()) + if charStack[-1] == "-": + self.currentToken = {"type": tokenTypes["Comment"], "data": ""} + self.state = self.commentStartState + return True + elif charStack[-1] in ('d', 'D'): + matched = True + for expected in (('o', 'O'), ('c', 'C'), ('t', 'T'), + ('y', 'Y'), ('p', 'P'), ('e', 'E')): + charStack.append(self.stream.char()) + if charStack[-1] not in expected: + matched = False + break + if matched: + self.currentToken = {"type": tokenTypes["Doctype"], + "name": "", + "publicId": None, "systemId": None, + "correct": True} + self.state = self.doctypeState + return True + elif (charStack[-1] == "[" and + self.parser is not None and + self.parser.tree.openElements and + self.parser.tree.openElements[-1].namespace != self.parser.tree.defaultNamespace): + matched = True + for expected in ["C", "D", "A", "T", "A", "["]: + charStack.append(self.stream.char()) + if charStack[-1] != expected: + matched = False + break + if matched: + self.state = self.cdataSectionState + return True + + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-dashes-or-doctype"}) + + while charStack: + self.stream.unget(charStack.pop()) + self.state = self.bogusCommentState + return True + + def commentStartState(self): + data = self.stream.char() + if data == "-": + self.state = self.commentStartDashState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"] += "\uFFFD" + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "incorrect-comment"}) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-comment"}) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["data"] += data + self.state = self.commentState + return True + + def commentStartDashState(self): + data = self.stream.char() + if data == "-": + self.state = self.commentEndState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"] += "-\uFFFD" + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "incorrect-comment"}) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-comment"}) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["data"] += "-" + data + self.state = self.commentState + return True + + def commentState(self): + data = self.stream.char() + if data == "-": + self.state = self.commentEndDashState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"] += "\uFFFD" + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "eof-in-comment"}) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["data"] += data + \ + self.stream.charsUntil(("-", "\u0000")) + return True + + def commentEndDashState(self): + data = self.stream.char() + if data == "-": + self.state = self.commentEndState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"] += "-\uFFFD" + self.state = self.commentState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-comment-end-dash"}) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["data"] += "-" + data + self.state = self.commentState + return True + + def commentEndState(self): + data = self.stream.char() + if data == ">": + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"] += "--\uFFFD" + self.state = self.commentState + elif data == "!": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-bang-after-double-dash-in-comment"}) + self.state = self.commentEndBangState + elif data == "-": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-dash-after-double-dash-in-comment"}) + self.currentToken["data"] += data + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-comment-double-dash"}) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + # XXX + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-comment"}) + self.currentToken["data"] += "--" + data + self.state = self.commentState + return True + + def commentEndBangState(self): + data = self.stream.char() + if data == ">": + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data == "-": + self.currentToken["data"] += "--!" + self.state = self.commentEndDashState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"] += "--!\uFFFD" + self.state = self.commentState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-comment-end-bang-state"}) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["data"] += "--!" + data + self.state = self.commentState + return True + + def doctypeState(self): + data = self.stream.char() + if data in spaceCharacters: + self.state = self.beforeDoctypeNameState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-doctype-name-but-got-eof"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "need-space-after-doctype"}) + self.stream.unget(data) + self.state = self.beforeDoctypeNameState + return True + + def beforeDoctypeNameState(self): + data = self.stream.char() + if data in spaceCharacters: + pass + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-doctype-name-but-got-right-bracket"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["name"] = "\uFFFD" + self.state = self.doctypeNameState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-doctype-name-but-got-eof"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["name"] = data + self.state = self.doctypeNameState + return True + + def doctypeNameState(self): + data = self.stream.char() + if data in spaceCharacters: + self.currentToken["name"] = self.currentToken["name"].translate(asciiUpper2Lower) + self.state = self.afterDoctypeNameState + elif data == ">": + self.currentToken["name"] = self.currentToken["name"].translate(asciiUpper2Lower) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["name"] += "\uFFFD" + self.state = self.doctypeNameState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype-name"}) + self.currentToken["correct"] = False + self.currentToken["name"] = self.currentToken["name"].translate(asciiUpper2Lower) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["name"] += data + return True + + def afterDoctypeNameState(self): + data = self.stream.char() + if data in spaceCharacters: + pass + elif data == ">": + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.currentToken["correct"] = False + self.stream.unget(data) + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + if data in ("p", "P"): + matched = True + for expected in (("u", "U"), ("b", "B"), ("l", "L"), + ("i", "I"), ("c", "C")): + data = self.stream.char() + if data not in expected: + matched = False + break + if matched: + self.state = self.afterDoctypePublicKeywordState + return True + elif data in ("s", "S"): + matched = True + for expected in (("y", "Y"), ("s", "S"), ("t", "T"), + ("e", "E"), ("m", "M")): + data = self.stream.char() + if data not in expected: + matched = False + break + if matched: + self.state = self.afterDoctypeSystemKeywordState + return True + + # All the characters read before the current 'data' will be + # [a-zA-Z], so they're garbage in the bogus doctype and can be + # discarded; only the latest character might be '>' or EOF + # and needs to be ungetted + self.stream.unget(data) + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-space-or-right-bracket-in-doctype", "datavars": + {"data": data}}) + self.currentToken["correct"] = False + self.state = self.bogusDoctypeState + + return True + + def afterDoctypePublicKeywordState(self): + data = self.stream.char() + if data in spaceCharacters: + self.state = self.beforeDoctypePublicIdentifierState + elif data in ("'", '"'): + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.stream.unget(data) + self.state = self.beforeDoctypePublicIdentifierState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.stream.unget(data) + self.state = self.beforeDoctypePublicIdentifierState + return True + + def beforeDoctypePublicIdentifierState(self): + data = self.stream.char() + if data in spaceCharacters: + pass + elif data == "\"": + self.currentToken["publicId"] = "" + self.state = self.doctypePublicIdentifierDoubleQuotedState + elif data == "'": + self.currentToken["publicId"] = "" + self.state = self.doctypePublicIdentifierSingleQuotedState + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-end-of-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.currentToken["correct"] = False + self.state = self.bogusDoctypeState + return True + + def doctypePublicIdentifierDoubleQuotedState(self): + data = self.stream.char() + if data == "\"": + self.state = self.afterDoctypePublicIdentifierState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["publicId"] += "\uFFFD" + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-end-of-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["publicId"] += data + return True + + def doctypePublicIdentifierSingleQuotedState(self): + data = self.stream.char() + if data == "'": + self.state = self.afterDoctypePublicIdentifierState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["publicId"] += "\uFFFD" + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-end-of-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["publicId"] += data + return True + + def afterDoctypePublicIdentifierState(self): + data = self.stream.char() + if data in spaceCharacters: + self.state = self.betweenDoctypePublicAndSystemIdentifiersState + elif data == ">": + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data == '"': + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.currentToken["systemId"] = "" + self.state = self.doctypeSystemIdentifierDoubleQuotedState + elif data == "'": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.currentToken["systemId"] = "" + self.state = self.doctypeSystemIdentifierSingleQuotedState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.currentToken["correct"] = False + self.state = self.bogusDoctypeState + return True + + def betweenDoctypePublicAndSystemIdentifiersState(self): + data = self.stream.char() + if data in spaceCharacters: + pass + elif data == ">": + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data == '"': + self.currentToken["systemId"] = "" + self.state = self.doctypeSystemIdentifierDoubleQuotedState + elif data == "'": + self.currentToken["systemId"] = "" + self.state = self.doctypeSystemIdentifierSingleQuotedState + elif data == EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.currentToken["correct"] = False + self.state = self.bogusDoctypeState + return True + + def afterDoctypeSystemKeywordState(self): + data = self.stream.char() + if data in spaceCharacters: + self.state = self.beforeDoctypeSystemIdentifierState + elif data in ("'", '"'): + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.stream.unget(data) + self.state = self.beforeDoctypeSystemIdentifierState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.stream.unget(data) + self.state = self.beforeDoctypeSystemIdentifierState + return True + + def beforeDoctypeSystemIdentifierState(self): + data = self.stream.char() + if data in spaceCharacters: + pass + elif data == "\"": + self.currentToken["systemId"] = "" + self.state = self.doctypeSystemIdentifierDoubleQuotedState + elif data == "'": + self.currentToken["systemId"] = "" + self.state = self.doctypeSystemIdentifierSingleQuotedState + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.currentToken["correct"] = False + self.state = self.bogusDoctypeState + return True + + def doctypeSystemIdentifierDoubleQuotedState(self): + data = self.stream.char() + if data == "\"": + self.state = self.afterDoctypeSystemIdentifierState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["systemId"] += "\uFFFD" + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-end-of-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["systemId"] += data + return True + + def doctypeSystemIdentifierSingleQuotedState(self): + data = self.stream.char() + if data == "'": + self.state = self.afterDoctypeSystemIdentifierState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["systemId"] += "\uFFFD" + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-end-of-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["systemId"] += data + return True + + def afterDoctypeSystemIdentifierState(self): + data = self.stream.char() + if data in spaceCharacters: + pass + elif data == ">": + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.state = self.bogusDoctypeState + return True + + def bogusDoctypeState(self): + data = self.stream.char() + if data == ">": + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + # XXX EMIT + self.stream.unget(data) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + pass + return True + + def cdataSectionState(self): + data = [] + while True: + data.append(self.stream.charsUntil("]")) + data.append(self.stream.charsUntil(">")) + char = self.stream.char() + if char == EOF: + break + else: + assert char == ">" + if data[-1][-2:] == "]]": + data[-1] = data[-1][:-2] + break + else: + data.append(char) + + data = "".join(data) # pylint:disable=redefined-variable-type + # Deal with null here rather than in the parser + nullCount = data.count("\u0000") + if nullCount > 0: + for _ in range(nullCount): + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + data = data.replace("\u0000", "\uFFFD") + if data: + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": data}) + self.state = self.dataState + return True diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/_tokenizer.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/_tokenizer.pyc new file mode 100644 index 0000000000000000000000000000000000000000..441346452b1a23270ddcb26d557b6a30359977d7 GIT binary patch literal 57395 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 iU0{G;rO+fj>fD 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 literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/_trie/_base 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/_trie/_base 2.py new file mode 100644 index 0000000..6b71975 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/_trie/_base 2.py @@ -0,0 +1,40 @@ +from __future__ import absolute_import, division, unicode_literals + +try: + from collections.abc import Mapping +except ImportError: # Python 2.7 + from collections import Mapping + + +class Trie(Mapping): + """Abstract base class for tries""" + + def keys(self, prefix=None): + # pylint:disable=arguments-differ + keys = super(Trie, self).keys() + + if prefix is None: + return set(keys) + + return {x for x in keys if x.startswith(prefix)} + + def has_keys_with_prefix(self, prefix): + for key in self.keys(): + if key.startswith(prefix): + return True + + return False + + def longest_prefix(self, prefix): + if prefix in self: + return prefix + + for i in range(1, len(prefix) + 1): + if prefix[:-i] in self: + return prefix[:-i] + + raise KeyError(prefix) + + def longest_prefix_item(self, prefix): + lprefix = self.longest_prefix(prefix) + return (lprefix, self[lprefix]) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/_trie/_base 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/_trie/_base 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e95709c54a12a2818734b31cf14700b6e6fbcb7e GIT binary patch literal 2348 zcmd5-+l~`Q5Un0x);4P{+9e5sNX`Sq0ff)QM6~`i@c->ok4z3D z##c~ElnELM$~+o*l+|cdBeB|ck3CB3lr?D7An`c=jOwaMhaJ*G5<>8PEZF#OK`!W* zxJIf$6G3sEUK0I5^y{caaf62aCaz34j(!b;J%=G2n<8CUC6lZyw6!hx;$)eaq{!`g zOcr?(6|s_OVwDb4(-*vT1H+GDStj|^)?x4KMEwuZgW~~1yaPiKBSWA-h9Cg}*jOD#wl@xq>P2a2Om9-?p2dYG;+q(X`|*w6U}EtV z^c>JVntM#Z3y=PGWFNLj-ylT%9DYH=zsM0K=ucwT9{c)y=pbU4Y%#hmKKd$*8I}

    `P1^)}$A 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 V9c()G4JT#?AfE@j!EQKw@GtX4*}DJ$ literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/alphabeticalattributes.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/alphabeticalattributes.py new file mode 100644 index 0000000..5ba926e --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/alphabeticalattributes.py @@ -0,0 +1,29 @@ +from __future__ import absolute_import, division, unicode_literals + +from . import base + +from collections import OrderedDict + + +def _attr_key(attr): + """Return an appropriate key for an attribute for sorting + + Attributes have a namespace that can be either ``None`` or a string. We + can't compare the two because they're different types, so we convert + ``None`` to an empty string first. + + """ + return (attr[0][0] or ''), attr[0][1] + + +class Filter(base.Filter): + """Alphabetizes attributes for elements""" + def __iter__(self): + for token in base.Filter.__iter__(self): + if token["type"] in ("StartTag", "EmptyTag"): + attrs = OrderedDict() + for name, value in sorted(token["data"].items(), + key=_attr_key): + attrs[name] = value + token["data"] = attrs + yield token diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/alphabeticalattributes.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/alphabeticalattributes.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cd4b3dba0152bdec0886401adfaaaf9d13473c3c GIT binary patch literal 1876 zcmd5+OK;mo5S|q+S#prpg^?5jde}pO=+Kx+lQtKpXj->N2cUx*6`Im3aw)C6e3-kG zqrg77=>O_(>Z!MWv$E?`?yZVunlvrGbB*#c}+sAoaxac87w%Ppy zl4#$xl~j0}rmdUSD6i$2Udy6xgV_7l%n*7II0SF1`Oc2S^X7KT$%R^Jsbr-}?HZM7 z=@-h&3}$CqYU3BWm8Yjib)`>FB^#CwW~=$WJkh}xRG;8LT{f!a)A%lG9L`kd0>6F& zd2WgVnO9!=b)(%^($(@p<5;!Qtq+F&^Wtj`Uzd$v-#C+nX`SES1RomIp#roiHLvdK zt&rLzh?uxPL1NTqh2q33)y73_(E=CGn>asT&Og2^o>cz$48J>9+ zzl$5wJT;Z`%G#%2zxwuQny@H*=}K35-Np-F+Hb6x#f7oxzl)V^7HX!w$&}?-LI>P_ zv-S+Gltn3;#4vI_5E}Xc=+EJJ#sYpA7e6p2KF2}>xj-u@P%Z+HBT9}Ze7yS-Jnvl0d9RL^Ov#dYb-uok|$aUS_Y(D3p#wipesR_a0m=yT+Rm6uE<9` zC|5oD@RD)O+gmhV_F0PILJrqL9KL@{zxC)UqARH2h0%x(&fn4rFTfnC_-p$VduvYoz{s7n}ik2n#& zt4NH+t{92OVo!V`9*S_A+!ThBNmIWAtu!s`ytB-5<d+M({`}lHZ?vW zqpxkzXrr7((`C-%E;&D0N7e?LAlDgVdrFD{hC~SIa6&~mS&4ygu`+>l8jdd_`uSeY zIr@McHv(<|RG>IbIPpbT!?C{UyTT+KgcDl4ab?O%Lb6^wk|x{E4jCFbWSuMxR+8M<0$mDvWqj|i1g zBT%K-94Uv3G&Y>kDuw&u=c>`YBQxbol5&w!4*Sa{X#Z_SQ*KeXIE-&s?8STWMZ)@s ozwEK^7(cln4b#WH374IQz8}6u;IB#1^a^kQwSY`O9YGdB9YYp_ z&=Hs!R04DiKLIuXci92x87z_m3bmXs;cWPfmb~z-8_+0QcWsY&L_Tdt>uuZMb25g; zmaR6*Su}m_JRXwsvvp+cunBT~WNa@|(5u(_j2D2e7uz(!DCwlsINxYAo%ypeLU zJt9cpl;SaYB*?f~c%}kD9-AFOYUn2Vm*W%KUmDC2Cz>1`Xojvfd2RNA?^8mh)C5#1 zHYdvAB25ivv`XPg__=QN;K)q*lB8Uul*9hA3EF>~(Ue;hE)L^66vy##JWp7k@K*y4 kJ>w@Aq+$BFH{tTN#mbZzQtS(#(1N$yqQ7Ufp+7I;KVWJ>UjP6A literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/inject_meta_charset 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/inject_meta_charset 2.py new file mode 100644 index 0000000..aefb5c8 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/inject_meta_charset 2.py @@ -0,0 +1,73 @@ +from __future__ import absolute_import, division, unicode_literals + +from . import base + + +class Filter(base.Filter): + """Injects ```` tag into head of document""" + def __init__(self, source, encoding): + """Creates a Filter + + :arg source: the source token stream + + :arg encoding: the encoding to set + + """ + base.Filter.__init__(self, source) + self.encoding = encoding + + def __iter__(self): + state = "pre_head" + meta_found = (self.encoding is None) + pending = [] + + for token in base.Filter.__iter__(self): + type = token["type"] + if type == "StartTag": + if token["name"].lower() == "head": + state = "in_head" + + elif type == "EmptyTag": + if token["name"].lower() == "meta": + # replace charset with actual encoding + has_http_equiv_content_type = False + for (namespace, name), value in token["data"].items(): + if namespace is not None: + continue + elif name.lower() == 'charset': + token["data"][(namespace, name)] = self.encoding + meta_found = True + break + elif name == 'http-equiv' and value.lower() == 'content-type': + has_http_equiv_content_type = True + else: + if has_http_equiv_content_type and (None, "content") in token["data"]: + token["data"][(None, "content")] = 'text/html; charset=%s' % self.encoding + meta_found = True + + elif token["name"].lower() == "head" and not meta_found: + # insert meta into empty head + yield {"type": "StartTag", "name": "head", + "data": token["data"]} + yield {"type": "EmptyTag", "name": "meta", + "data": {(None, "charset"): self.encoding}} + yield {"type": "EndTag", "name": "head"} + meta_found = True + continue + + elif type == "EndTag": + if token["name"].lower() == "head" and pending: + # insert meta into head (if necessary) and flush pending queue + yield pending.pop(0) + if not meta_found: + yield {"type": "EmptyTag", "name": "meta", + "data": {(None, "charset"): self.encoding}} + while pending: + yield pending.pop(0) + meta_found = True + state = "post_head" + + if state == "in_head": + pending.append(token) + else: + yield token diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/inject_meta_charset 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/inject_meta_charset 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..aeb3ddc3161634225186901b0dc3c73a596127eb GIT binary patch literal 2648 zcmd5;Pj4GV6o0d}H?f;ENkak=1+9dTd`aD^5Tw#p&?ZH_n93 zbrWQB2{$er`2u_ouKf;`_z+w<@Oy99Z7C|}+TQV-H@|uF{?AtaT5df5cZ|qa;p^Sp?4yCP5a&ky*tgkAiOOYc~vxPQ5S- z6qrpOOcleimuX{zxEF)~ytIG;ch~|4geF!Tc0h5M0N~jKFL=3_Bdy^9tK;vKKq7b%!Ylfa?ZPU|d%w^Q}e97?bI+ zCq6GU>ahEpc#0uA2h~c_U;<-W6EAJ`;?UP=*6JrMe?08}_*w7T)#Gc|&(0=hXpH&d z`m@1ReEL!AVJiue?I6mG7lzwk@9t#}zGId=?nFm^oVEsL6n-8C$E}`(JZl9KG?xSB zmI1qxoONo@gVQNvooR7hbvY>-cv#^s$LBZr9x<3H4$e?g{bZ457WIi{6*`?*#-d?` zhE)cfE82Z>Y|SvKa{6q|YBa5J0i0NrhQh7V*09D&kL+h|Y$5X@e;iv;#bWe=@c&dS z;}v>QxK9=QI|J%yBPf!3$a7};;kV4#nx8RJOxsW>T94KCekrwUvi?WK+FT?a6cm)Op zy;5Kb2?wgMZhS>t{;LFNMGShYG8GQf6j82|zsgZQ;0n#|h<rtVMzcx<+X#vOxPK{p#-(ZL0Oa+ZW9q|7nM0UTqi7ajBoWV(|U2ZlxXRv0}T@+DqE z8%Ar}mQw{=F!Bv78hvV{9KU?oC_l||uCBev$8pl@^E&29oEcF^x?Q_CwUG4xoTC4} zjwv}8AXPe#Tm$Vm(*JE@xDe39xDSN!Go1=`4|j+b3Kz;Klid%~T$_rhnMh;vk_5e` z$^PiD(Sk=)GH9KcN~h_?dE^^jWh^?afTSafQ1+Pl5X%EEbJ?q|c-1XE>dHF%hC`Pn zURTRDo{6N17v}mMY^&^mbv)Vk7)aS_McLMtYN#c(sg^8^maRU)%vP7w`xvY0W3_B; zstv4uWUZ-XwWikbwN)MH%hp9uYuH-{-WCa~R+EE<;vsTf_6Wkr=eq7F_VbXZ?0DD3 z)$6*_={vms%3VUeGglGUEtf^cgUyy-Xv^DBX;m*bIcnVPV3|66O?CLKfL{t;yPMxp U>m*D!i@@Aw-Q~i)Y^_%Q0ZEKrm;e9( literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/inject_meta_charset.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/inject_meta_charset.py new file mode 100644 index 0000000..aefb5c8 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/inject_meta_charset.py @@ -0,0 +1,73 @@ +from __future__ import absolute_import, division, unicode_literals + +from . import base + + +class Filter(base.Filter): + """Injects ```` tag into head of document""" + def __init__(self, source, encoding): + """Creates a Filter + + :arg source: the source token stream + + :arg encoding: the encoding to set + + """ + base.Filter.__init__(self, source) + self.encoding = encoding + + def __iter__(self): + state = "pre_head" + meta_found = (self.encoding is None) + pending = [] + + for token in base.Filter.__iter__(self): + type = token["type"] + if type == "StartTag": + if token["name"].lower() == "head": + state = "in_head" + + elif type == "EmptyTag": + if token["name"].lower() == "meta": + # replace charset with actual encoding + has_http_equiv_content_type = False + for (namespace, name), value in token["data"].items(): + if namespace is not None: + continue + elif name.lower() == 'charset': + token["data"][(namespace, name)] = self.encoding + meta_found = True + break + elif name == 'http-equiv' and value.lower() == 'content-type': + has_http_equiv_content_type = True + else: + if has_http_equiv_content_type and (None, "content") in token["data"]: + token["data"][(None, "content")] = 'text/html; charset=%s' % self.encoding + meta_found = True + + elif token["name"].lower() == "head" and not meta_found: + # insert meta into empty head + yield {"type": "StartTag", "name": "head", + "data": token["data"]} + yield {"type": "EmptyTag", "name": "meta", + "data": {(None, "charset"): self.encoding}} + yield {"type": "EndTag", "name": "head"} + meta_found = True + continue + + elif type == "EndTag": + if token["name"].lower() == "head" and pending: + # insert meta into head (if necessary) and flush pending queue + yield pending.pop(0) + if not meta_found: + yield {"type": "EmptyTag", "name": "meta", + "data": {(None, "charset"): self.encoding}} + while pending: + yield pending.pop(0) + meta_found = True + state = "post_head" + + if state == "in_head": + pending.append(token) + else: + yield token diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/inject_meta_charset.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/inject_meta_charset.pyc new file mode 100644 index 0000000000000000000000000000000000000000..059ed95b945b7718f61a905a9aea44fe4d313f95 GIT binary patch literal 2648 zcmd5;Pj4GV6o0d}H?f;GNkan_1+9dTd`aC>NTt$NsBMaRG03SBh}v#8-m$&T{`2mv zn;@G@xN+gg7vO_%d>P65eOeYMIlk7=s;0q(Sb!#jSgz0e2e@Vg>{M=bkM-OPP##3n+A&f2K_{IM)duG zO}t41ZEO$^gAjn17BJu*Ti}4u#EQcXC=OGg6?BK{Ow_5jE9w+?fP55>b>HO9 z;o#(Tr%O=*%KDlZgu*6ue?#R{<2=&$MTB?s!gVOsnNopIcrwbn>Lg`udh*M!KRM zlN{^V$qhC}Z=iJyw*~RA#4l#p;lQ3(*lwG>*ki4GOi2J-H;4n{x-wa8En~)*T!#bk zd8tv4-QUJj4*40VPMQT%7}J@0S!a-hzRvQ_Fzxu0@$iSw2iLD1UB7X9IyGZs%*`9m zN7wKf#+}EVG)T9CI5%DxZhdxhyL-@MmOSoM$9|G^MkWfs2!o@}Kti5(0tuSS0duQ> zT}@AW4d}t?l(WvXyrKG>6fHcgaG&GzD}0X_%oPV`EUA9HOmmBdMDrS*Of6&4xJKhT z1I`pZczR^bF{yL**5Cp-wkQjQTc^w81}8nTpSg*J%!m9*V#PI!(M!VrQ?ZO! z=w;zPQ}FBDrjs36ZbH}+3w!YNM|xuMZ@xrxXxOCL5-0R=ld?Z(@*DqV%TyiR5@CN= zM)5(AgbhFpEV_-b!o+XOE&e$HV|#P4eWl_s&aQ;-&uq$GDF32Z3312e{6cleW_60c zv5-G`p zW3prIm&*9-ixiL+fQ;bO_*w8Rb|}tN&=}Mn|L-HRyX{S6X}91EPBZOtvne=}&1tHI zyKB76JobjdjlD<_n+KT|l``1nPSr7+Mug!L>0mCf(ALBA6B{yo5H4 z*0v?53btevm#}E`iIH;r@@1p^G%vWic48mLNv|)On5Ri@L>=jN-SX5@(*JYH{`)$n z;+%t2={#}`bdy;Bw~66GKojFW5GK!cCe%aRAzCP0C{ZrEA7_O&HBmE_#^$9ddQF@C z(PN_pkEUeMIx&?_Gf0ZqH@wPNbXoyPM;4*%G4mmoM_%r-S6%U{TY1!#b@mO1E>FF_ zmTf!}NmDN@^gGyA*#R4P^6xN^vel}xt;?#VR@A0iu`pV;`UEpuT~zO5tgDaJd23T$ z!s;5iS>!y}Z27saybV=W4GL4B#@!y4smIq;kKYRTrQo%@`5m=R S!gRX~%w5)9F5D~DTJ0ahd0iy{ literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/lint 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/lint 2.py new file mode 100644 index 0000000..fcc07ee --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/lint 2.py @@ -0,0 +1,93 @@ +from __future__ import absolute_import, division, unicode_literals + +from pip._vendor.six import text_type + +from . import base +from ..constants import namespaces, voidElements + +from ..constants import spaceCharacters +spaceCharacters = "".join(spaceCharacters) + + +class Filter(base.Filter): + """Lints the token stream for errors + + If it finds any errors, it'll raise an ``AssertionError``. + + """ + def __init__(self, source, require_matching_tags=True): + """Creates a Filter + + :arg source: the source token stream + + :arg require_matching_tags: whether or not to require matching tags + + """ + super(Filter, self).__init__(source) + self.require_matching_tags = require_matching_tags + + def __iter__(self): + open_elements = [] + for token in base.Filter.__iter__(self): + type = token["type"] + if type in ("StartTag", "EmptyTag"): + namespace = token["namespace"] + name = token["name"] + assert namespace is None or isinstance(namespace, text_type) + assert namespace != "" + assert isinstance(name, text_type) + assert name != "" + assert isinstance(token["data"], dict) + if (not namespace or namespace == namespaces["html"]) and name in voidElements: + assert type == "EmptyTag" + else: + assert type == "StartTag" + if type == "StartTag" and self.require_matching_tags: + open_elements.append((namespace, name)) + for (namespace, name), value in token["data"].items(): + assert namespace is None or isinstance(namespace, text_type) + assert namespace != "" + assert isinstance(name, text_type) + assert name != "" + assert isinstance(value, text_type) + + elif type == "EndTag": + namespace = token["namespace"] + name = token["name"] + assert namespace is None or isinstance(namespace, text_type) + assert namespace != "" + assert isinstance(name, text_type) + assert name != "" + if (not namespace or namespace == namespaces["html"]) and name in voidElements: + assert False, "Void element reported as EndTag token: %(tag)s" % {"tag": name} + elif self.require_matching_tags: + start = open_elements.pop() + assert start == (namespace, name) + + elif type == "Comment": + data = token["data"] + assert isinstance(data, text_type) + + elif type in ("Characters", "SpaceCharacters"): + data = token["data"] + assert isinstance(data, text_type) + assert data != "" + if type == "SpaceCharacters": + assert data.strip(spaceCharacters) == "" + + elif type == "Doctype": + name = token["name"] + assert name is None or isinstance(name, text_type) + assert token["publicId"] is None or isinstance(name, text_type) + assert token["systemId"] is None or isinstance(name, text_type) + + elif type == "Entity": + assert isinstance(token["name"], text_type) + + elif type == "SerializerError": + assert isinstance(token["data"], text_type) + + else: + assert False, "Unknown token type: %(type)s" % {"type": type} + + yield token diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/lint 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/lint 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..52af763c04ae18ae75a38b7509ca36d0cd776010 GIT binary patch literal 3500 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 literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/optionaltags 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/optionaltags 2.py new file mode 100644 index 0000000..4a86501 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/optionaltags 2.py @@ -0,0 +1,207 @@ +from __future__ import absolute_import, division, unicode_literals + +from . import base + + +class Filter(base.Filter): + """Removes optional tags from the token stream""" + def slider(self): + previous1 = previous2 = None + for token in self.source: + if previous1 is not None: + yield previous2, previous1, token + previous2 = previous1 + previous1 = token + if previous1 is not None: + yield previous2, previous1, None + + def __iter__(self): + for previous, token, next in self.slider(): + type = token["type"] + if type == "StartTag": + if (token["data"] or + not self.is_optional_start(token["name"], previous, next)): + yield token + elif type == "EndTag": + if not self.is_optional_end(token["name"], next): + yield token + else: + yield token + + def is_optional_start(self, tagname, previous, next): + type = next and next["type"] or None + if tagname in 'html': + # An html element's start tag may be omitted if the first thing + # inside the html element is not a space character or a comment. + return type not in ("Comment", "SpaceCharacters") + elif tagname == 'head': + # A head element's start tag may be omitted if the first thing + # inside the head element is an element. + # XXX: we also omit the start tag if the head element is empty + if type in ("StartTag", "EmptyTag"): + return True + elif type == "EndTag": + return next["name"] == "head" + elif tagname == 'body': + # A body element's start tag may be omitted if the first thing + # inside the body element is not a space character or a comment, + # except if the first thing inside the body element is a script + # or style element and the node immediately preceding the body + # element is a head element whose end tag has been omitted. + if type in ("Comment", "SpaceCharacters"): + return False + elif type == "StartTag": + # XXX: we do not look at the preceding event, so we never omit + # the body element's start tag if it's followed by a script or + # a style element. + return next["name"] not in ('script', 'style') + else: + return True + elif tagname == 'colgroup': + # A colgroup element's start tag may be omitted if the first thing + # inside the colgroup element is a col element, and if the element + # is not immediately preceded by another colgroup element whose + # end tag has been omitted. + if type in ("StartTag", "EmptyTag"): + # XXX: we do not look at the preceding event, so instead we never + # omit the colgroup element's end tag when it is immediately + # followed by another colgroup element. See is_optional_end. + return next["name"] == "col" + else: + return False + elif tagname == 'tbody': + # A tbody element's start tag may be omitted if the first thing + # inside the tbody element is a tr element, and if the element is + # not immediately preceded by a tbody, thead, or tfoot element + # whose end tag has been omitted. + if type == "StartTag": + # omit the thead and tfoot elements' end tag when they are + # immediately followed by a tbody element. See is_optional_end. + if previous and previous['type'] == 'EndTag' and \ + previous['name'] in ('tbody', 'thead', 'tfoot'): + return False + return next["name"] == 'tr' + else: + return False + return False + + def is_optional_end(self, tagname, next): + type = next and next["type"] or None + if tagname in ('html', 'head', 'body'): + # An html element's end tag may be omitted if the html element + # is not immediately followed by a space character or a comment. + return type not in ("Comment", "SpaceCharacters") + elif tagname in ('li', 'optgroup', 'tr'): + # A li element's end tag may be omitted if the li element is + # immediately followed by another li element or if there is + # no more content in the parent element. + # An optgroup element's end tag may be omitted if the optgroup + # element is immediately followed by another optgroup element, + # or if there is no more content in the parent element. + # A tr element's end tag may be omitted if the tr element is + # immediately followed by another tr element, or if there is + # no more content in the parent element. + if type == "StartTag": + return next["name"] == tagname + else: + return type == "EndTag" or type is None + elif tagname in ('dt', 'dd'): + # A dt element's end tag may be omitted if the dt element is + # immediately followed by another dt element or a dd element. + # A dd element's end tag may be omitted if the dd element is + # immediately followed by another dd element or a dt element, + # or if there is no more content in the parent element. + if type == "StartTag": + return next["name"] in ('dt', 'dd') + elif tagname == 'dd': + return type == "EndTag" or type is None + else: + return False + elif tagname == 'p': + # A p element's end tag may be omitted if the p element is + # immediately followed by an address, article, aside, + # blockquote, datagrid, dialog, dir, div, dl, fieldset, + # footer, form, h1, h2, h3, h4, h5, h6, header, hr, menu, + # nav, ol, p, pre, section, table, or ul, element, or if + # there is no more content in the parent element. + if type in ("StartTag", "EmptyTag"): + return next["name"] in ('address', 'article', 'aside', + 'blockquote', 'datagrid', 'dialog', + 'dir', 'div', 'dl', 'fieldset', 'footer', + 'form', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', + 'header', 'hr', 'menu', 'nav', 'ol', + 'p', 'pre', 'section', 'table', 'ul') + else: + return type == "EndTag" or type is None + elif tagname == 'option': + # An option element's end tag may be omitted if the option + # element is immediately followed by another option element, + # or if it is immediately followed by an optgroup + # element, or if there is no more content in the parent + # element. + if type == "StartTag": + return next["name"] in ('option', 'optgroup') + else: + return type == "EndTag" or type is None + elif tagname in ('rt', 'rp'): + # An rt element's end tag may be omitted if the rt element is + # immediately followed by an rt or rp element, or if there is + # no more content in the parent element. + # An rp element's end tag may be omitted if the rp element is + # immediately followed by an rt or rp element, or if there is + # no more content in the parent element. + if type == "StartTag": + return next["name"] in ('rt', 'rp') + else: + return type == "EndTag" or type is None + elif tagname == 'colgroup': + # A colgroup element's end tag may be omitted if the colgroup + # element is not immediately followed by a space character or + # a comment. + if type in ("Comment", "SpaceCharacters"): + return False + elif type == "StartTag": + # XXX: we also look for an immediately following colgroup + # element. See is_optional_start. + return next["name"] != 'colgroup' + else: + return True + elif tagname in ('thead', 'tbody'): + # A thead element's end tag may be omitted if the thead element + # is immediately followed by a tbody or tfoot element. + # A tbody element's end tag may be omitted if the tbody element + # is immediately followed by a tbody or tfoot element, or if + # there is no more content in the parent element. + # A tfoot element's end tag may be omitted if the tfoot element + # is immediately followed by a tbody element, or if there is no + # more content in the parent element. + # XXX: we never omit the end tag when the following element is + # a tbody. See is_optional_start. + if type == "StartTag": + return next["name"] in ['tbody', 'tfoot'] + elif tagname == 'tbody': + return type == "EndTag" or type is None + else: + return False + elif tagname == 'tfoot': + # A tfoot element's end tag may be omitted if the tfoot element + # is immediately followed by a tbody element, or if there is no + # more content in the parent element. + # XXX: we never omit the end tag when the following element is + # a tbody. See is_optional_start. + if type == "StartTag": + return next["name"] == 'tbody' + else: + return type == "EndTag" or type is None + elif tagname in ('td', 'th'): + # A td element's end tag may be omitted if the td element is + # immediately followed by a td or th element, or if there is + # no more content in the parent element. + # A th element's end tag may be omitted if the th element is + # immediately followed by a td or th element, or if there is + # no more content in the parent element. + if type == "StartTag": + return next["name"] in ('td', 'th') + else: + return type == "EndTag" or type is None + return False diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/optionaltags 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/optionaltags 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2281e49d3264cf038e320ad494a5d76d6ab99661 GIT binary patch literal 4754 zcmds5OK;p%6h0o$OqyiUCT$4>6*Vg~K+7~~`lRoq72QP0DJ?{_#ugC2R!FGqx?|4hv!_s?I(T|s!<-K zptr6yukyP=Qa%5$kDyCv`(~a(A@0`ZJ4wUomK`ZK1J&}8LpdDGwG%gl8l&z zCzyBjAl>Q{yB%T{+$HAj0(>%G&heJ;%zPAT&m>VASG}?*hK0lnYHE;2t=Mb(QJPF` z8ci#)9d?zuLue9KoGPu@Z#&AXw4Jz8ivrh+lS;i+aaWh?@6FVvjx9|cUt4RdWu?@q z<98d!_@^FLZd6)+>!=?l$_av_m*=h~Z@ei}cX?twaF% zFtL%Rbh?nFl*98aMD|b(Din=rp}lsIP`DFQR^|VIHe7Zv4dV zy31xSa~Vl#WoOyRNNGz-5JlDvzBME>qC)81Q|KtxWjBRh++y2O|F*rK`^iCW$T)nk8GbH%(o|OW8nM;yuC?1uTOMjwuKnhX<&c(+8FH(F25j;RE1GFHs zI+h-04}#)#QU=NW zJ_Pd!2z~ib5a}YUZK%b8C z`}<-!1z37{g8i1sM{%PRW-3`T8#S9=s8UI-g_cwGW*biIR5>aMQncYY?&b`ZxLs|w z)S9GoKY9BJE%KKlcMXe4HTGL7mGC8MEzs3aje>d{rL9yB3?5)vfky}#fq7H(YEh(8 zfL{y@+(~Cmw5j5<`u+;J8^IY0G=R2jX&(#yicP?$t^^?8QK84v8%<5{jz fmm(ATlGH`3 z4l1IRJzRFU@&vyZB6`hkNC3QoBcC|E&jw7+L3=` z^nfGZhq!4FUdf1iDJMxGra(w0tQSDl@x(>2Ux7CFGwh8X`>fWc7l(~3I|C2{czKRf z@=2&E=?Z|74lrvc92NWue4r>F=odxBqOoE405624ibaurw#qUy?O8YvCHas#Qyz6*$UeJ6zh?C7gnpd_w|I`Z#r%dA!pBdFO+!a-%IAT= z0$*idP~uhPj;?XlSz^o?R z`sq#&90J>iTnmx)URbxC+Ws6nBrf=0hF+)m(optgroup + # element, or if there is no more content in the parent + # element. + if type == "StartTag": + return next["name"] in ('option', 'optgroup') + else: + return type == "EndTag" or type is None + elif tagname in ('rt', 'rp'): + # An rt element's end tag may be omitted if the rt element is + # immediately followed by an rt or rp element, or if there is + # no more content in the parent element. + # An rp element's end tag may be omitted if the rp element is + # immediately followed by an rt or rp element, or if there is + # no more content in the parent element. + if type == "StartTag": + return next["name"] in ('rt', 'rp') + else: + return type == "EndTag" or type is None + elif tagname == 'colgroup': + # A colgroup element's end tag may be omitted if the colgroup + # element is not immediately followed by a space character or + # a comment. + if type in ("Comment", "SpaceCharacters"): + return False + elif type == "StartTag": + # XXX: we also look for an immediately following colgroup + # element. See is_optional_start. + return next["name"] != 'colgroup' + else: + return True + elif tagname in ('thead', 'tbody'): + # A thead element's end tag may be omitted if the thead element + # is immediately followed by a tbody or tfoot element. + # A tbody element's end tag may be omitted if the tbody element + # is immediately followed by a tbody or tfoot element, or if + # there is no more content in the parent element. + # A tfoot element's end tag may be omitted if the tfoot element + # is immediately followed by a tbody element, or if there is no + # more content in the parent element. + # XXX: we never omit the end tag when the following element is + # a tbody. See is_optional_start. + if type == "StartTag": + return next["name"] in ['tbody', 'tfoot'] + elif tagname == 'tbody': + return type == "EndTag" or type is None + else: + return False + elif tagname == 'tfoot': + # A tfoot element's end tag may be omitted if the tfoot element + # is immediately followed by a tbody element, or if there is no + # more content in the parent element. + # XXX: we never omit the end tag when the following element is + # a tbody. See is_optional_start. + if type == "StartTag": + return next["name"] == 'tbody' + else: + return type == "EndTag" or type is None + elif tagname in ('td', 'th'): + # A td element's end tag may be omitted if the td element is + # immediately followed by a td or th element, or if there is + # no more content in the parent element. + # A th element's end tag may be omitted if the th element is + # immediately followed by a td or th element, or if there is + # no more content in the parent element. + if type == "StartTag": + return next["name"] in ('td', 'th') + else: + return type == "EndTag" or type is None + return False diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/optionaltags.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/optionaltags.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5a7133b2a5ff422e6c6dca62171e7ef88e018f6a GIT binary patch literal 4754 zcmds5OLG)e6h1vYGa-`+B!JOaSY&053JwW@0P>OmC7Ucd6lh9lJJUTgo%D21x^EA} zO01$l%av6Y?%26^qpsYs(v9WbmH)wVVd=tizB`XjBnDTeOwzaSdjCAZi)3WKb(dOF3$pv}BUu=EyZE$WyC8O9dY1$t%!G zk?IDy1$spEkm$XoBDqCctPHUGe&TU)sAAN_VJwScl^YULN&&N zH1unc>)C;?yx0j6-{8rLG%C-{vXgkK$ertczyy5@gy4!;FvA^>L~*u*6=zdeE7qM= zmrh;`kWPWzJUT_P7Apm2OW)we@>)^HOQxc>VwId=N;!>WsvbwJDb@6*RJ7`aQ;CW_ zr&W_p^WCQ=n>Tsj^4z9Dn>o6Fjy8x^47z%!N}DEaK&RDVisxt}C&LYs>L%SXLXr`) z@C5U&9j4m@Vz*1of_uc=U4%~-DmmT~o>_=O?U^J>rvo(aZ+uxtM1xL{uXz? z*>vCgGmoL z3APf0ZU^HPAXb4hXy#beTP=})!~NkK}$x%fEXMT(Chf`@2zh!$m5 z$I`>>VNkq7%HTClk$s5stAfVrExSJ(m4mg2-_L`gD~) zI1tMzz|t#|?6*uliW{XcQ^}h7sMYd9l}c(Yww;$va4Bk-r?d>sU-`vENpygfCI+fv$#H6g1)}ZKrZz@BqsSJVM9_%$uTDk0O-< z{9<6>ZaQnCEfts5_g}~m%eE`On{+YfpKZ}44%5U1S8L{(aBM-gCm7%JhRoK) zW8#Qc_(5rZ%)yqN=hD_W-z{x@uAV}^b7^y~pYE6T9A;NBtE<%l_XyBkicILsQWxz8 zsEAhgaoJ7e1R2hN{kshN=RJ1!tgHb)P_6Mdpwgng&WJ+Ee{YC5UB$m+@f<||(iiuZ z7T4G2w~UDJQ?MTc2%G^HX=4BaE*s;X-^M-*s;)6Nzq81m9;is^~Eu**~PCPfnS%wVCKZzn)v5F@!NWD_Rlo7_!C=bNB)t~ z1CIO%;$}d2B_r;&oFs*q0wI~OUIbOw6PLh#1=>8wus8ec^IDsJ95%D;3_uLvm8+bR z&q7T}R{)fBfLXiYsNh%N14a2j*T|al!vG^g6|#CjqqE z$V~$oN)T<^jcT@yPbf=1p>RX7MBl-+3BCXP%hwWg!5vfVDDt=NaA|mS`0RqVR2x@M mRT{H#7L$-Am0=-+Fhur/ + (?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/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/sanitizer.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/sanitizer.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6a7f89620332b577482a107af0807f8c23f3e0b0 GIT binary patch literal 27270 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 Yc*!+sX#}I}1jVWB>pF literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/whitespace 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/whitespace 2.py new file mode 100644 index 0000000..0d12584 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/whitespace 2.py @@ -0,0 +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) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/whitespace 2.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/whitespace 2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e81f80ef6ab575795825cfc835f916b2e737480b GIT binary patch literal 1941 zcmd5-&5j#I5Uw73$3JT)5i1fI1<99479>of1%*REEE~gZwHhyfj>0gWZhOb+`N?#T zv%A_og=gRicnVHjx#R_S3|@fx+FmSpfna&cHC5HsRbPGGZv55n{_*=~KPI&KH2C+6 zpFA?Zup;>@NE2m(rh+n$rXFPtnl?zl=aFvGv`Ml-vPpV}GM}bC`*ukBq+67=Y1*c& zL(>jhTeR$w>d)*;oT9eZb*6!MRr{zSKGV}=31{K z3EH>f<$%7E#O&GS{*D}dYV>T+%QYesM$VqZ3un#aOgVAi z@&2pRhx}RO!AVf2<%2XgHrD#V!PBuh{st!ZL@Slcq6$uJra#f?ESNjqn_x@MkIM6~ z#oOcfnfF+b@WnuMMUQ3QdxxL*y}q|6?sy|dNr)%{^b8M>jH0ZNwZ z;XXQA(`$V(9}!!C%c?ujkzox5Z6wuQ3?>4KLQidjJ3c literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/whitespace.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/whitespace.py new file mode 100644 index 0000000..0d12584 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/whitespace.py @@ -0,0 +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) diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/whitespace.pyc b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/whitespace.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e03af10de930806eb3dbd621f9409f8ba7498396 GIT binary patch literal 1941 zcmd5-U5*|L9RFi@xB@IfNr1mItDR9}hM~O?SMOmAIHf0?O zI&5vxvP-fF2~&>}wz{yqB5qW~@83V7*Cl53t+<4leLSyDjpkBP6JwusAN1ib^f@@bxJ-VM`gx zvsjj9nC8Q>l6Qwjo|&kU(cNK`Cqo@qDLdu1gBoaYSPgKlB4Z$cJ@CXR^iNi}vP(f{ zZ^;lX1uY%A;8_Uz=Ed)H$uABHA6z!*g1czYONXlGbRkGjtglG}j$g9F-8z^NN1QR& zc7Ayf%KX^8JkCGbM836=T^q^OHm`!Y)~iT@ z_PuyDpdS)q_Uve5nIR#ea@O!R_Q7-(pyE9H!oDe)b$pnm%Lgo&L7Pm+@C!-T(4JVX^c5K ze0_SKKa1Qu@yfKkm*(0;O5J;S^w}ivVX{xSl6g{8-l@sdrz)L!bIW_}?a28_x%OMU zJ&vFLfCULx3`AG-SoWRw`1#Q3I|t&HGqRL~2tz>6@Bqm$%!;H|ctxTxOp2KG4(s!( zIG4GW#x|`|ZG3d^BZuA9w!aha8VJlE_m+m@G7z^Nd-OmX5abv~4@hlJ93McOINWx) zk0u*>ZSE$dnLd4TJf4RB_`C6s2J3Y_+g)Zj-2b1}F|Io(5uK12;TUblJFiV$@pyfB zd|=_*>ldPu3yqQ^bfEMIQ!Uo2ZYt$F%j(1 beY~OdmuOhyujaPXb8d*6;<|It7!3Xfw3@;Q literal 0 HcmV?d00001 diff --git a/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/html5parser 2.py b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/html5parser 2.py new file mode 100644 index 0000000..ae41a13 --- /dev/null +++ b/Application Code/Hackathon/myenv/lib/python2.7/site-packages/pip/_vendor/html5lib/html5parser 2.py @@ -0,0 +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